--- title: CNOE Showtime weight: 6 description: CNOE hands on --- ## Summary CNOE is a 'Platform Engineering Framework' (Danger: Our wording!) - it is open source and locally runnable. It consists of the orchestrator 'idpbuilder' and both of some predefined building blocks and also some predefined platform configurations. ## Orchestrator 'idpbuilder', initial run The orchestrator in CNOE is called 'idpbuilder'. It is [locally installable binary](https://cnoe.io/docs/reference-implementation/installations/idpbuilder/quick-start) A typipcal first setup ist described here: https://cnoe.io/docs/reference-implementation/technology ```bash # this is a local linux shell # check local installation type idpbuilder idpbuilder is /usr/local/bin/idpbuilder # check version idpbuilder version idpbuilder 0.8.0-nightly.20240914 go1.22.7 linux/amd64 # do some completion and aliasing source <(idpbuilder completion bash) alias ib=idpbuilder complete -F __start_idpbuilder ib # check and remove all existing kind clusters kind delete clusters --all kind get clusters # sth. like 'No kind clusters found.' # run $ib create --use-path-routing --log-level debug --package-dir https://github.com/cnoe-io/stacks//ref-implementation ``` You get output like ```bash stl@ubuntu-vpn:~/git/mms/ipceicis-developerframework$ idpbuilder create Oct 1 10:09:18 INFO Creating kind cluster logger=setup Oct 1 10:09:18 INFO Runtime detected logger=setup provider=docker ########################### Our kind config ############################ # Kind kubernetes release images https://github.com/kubernetes-sigs/kind/releases kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 nodes: - role: control-plane image: "kindest/node:v1.30.0" labels: ingress-ready: "true" extraPortMappings: - containerPort: 443 hostPort: 8443 protocol: TCP containerdConfigPatches: - |- [plugins."io.containerd.grpc.v1.cri".registry.mirrors."gitea.cnoe.localtest.me:8443"] endpoint = ["https://gitea.cnoe.localtest.me"] [plugins."io.containerd.grpc.v1.cri".registry.configs."gitea.cnoe.localtest.me".tls] insecure_skip_verify = true ######################### config end ############################ ``` ## Show time steps > Goto https://cnoe.io/docs/reference-implementation/installations/idpbuilder/usage, and follow the flow ### Prepare a k8s cluster with kind You may have seen: when starting `idpbuilder` without an existing cluster named `localdev` it first creates this cluster by calling `kind`with an internally defined config. It's an important feature of idpbuilder that it will set up on an existing cluster `localdev` when called several times in a row e.g. to append new packages to the cluster. That's why we here first create the kind cluster `localdev`itself: ```bash cat << EOF | kind create cluster --name localdev --config=- # Kind kubernetes release images https://github.com/kubernetes-sigs/kind/releases kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 nodes: - role: control-plane image: "kindest/node:v1.30.0" labels: ingress-ready: "true" extraPortMappings: - containerPort: 443 hostPort: 8443 protocol: TCP containerdConfigPatches: - |- [plugins."io.containerd.grpc.v1.cri".registry.mirrors."gitea.cnoe.localtest.me:8443"] endpoint = ["https://gitea.cnoe.localtest.me"] [plugins."io.containerd.grpc.v1.cri".registry.configs."gitea.cnoe.localtest.me".tls] insecure_skip_verify = true ``` ```bash # alternatively, if you have the kind config as file: kind create cluster --name localdev --config kind-config.yaml ``` #### Output A typical raw kind setup kubernetes cluster would look like this with respect to running pods: > be sure all pods are in status 'running' ```bash stl@ubuntu-vpn:~/git/mms/idpbuilder$ k get pods -A NAMESPACE NAME READY STATUS RESTARTS AGE kube-system coredns-76f75df574-lb7jz 1/1 Running 0 15s kube-system coredns-76f75df574-zm2wp 1/1 Running 0 15s kube-system etcd-localdev-control-plane 1/1 Running 0 27s kube-system kindnet-8qhd5 1/1 Running 0 13s kube-system kindnet-r4d6n 1/1 Running 0 15s kube-system kube-apiserver-localdev-control-plane 1/1 Running 0 27s kube-system kube-controller-manager-localdev-control-plane 1/1 Running 0 27s kube-system kube-proxy-vrh64 1/1 Running 0 15s kube-system kube-proxy-w8ks9 1/1 Running 0 13s kube-system kube-scheduler-localdev-control-plane 1/1 Running 0 27s local-path-storage local-path-provisioner-6f8956fb48-6fvt2 1/1 Running 0 15s ``` ### First run: Start with core applications, 'core package' Now we run idpbuilder the first time: ``` # now idpbuilder reuses the already existing cluster # pls apply '--use-path-routing' otherwise as we discovered currently the service resolving inside the cluster won't work ib create --use-path-routing ``` #### Output ##### idpbuilder log ```bash stl@ubuntu-vpn:~/git/mms/idpbuilder$ ib create --use-path-routing Oct 1 10:32:50 INFO Creating kind cluster logger=setup Oct 1 10:32:50 INFO Runtime detected logger=setup provider=docker Oct 1 10:32:50 INFO Cluster already exists logger=setup cluster=localdev Oct 1 10:32:50 INFO Adding CRDs to the cluster logger=setup Oct 1 10:32:51 INFO Setting up CoreDNS logger=setup Oct 1 10:32:51 INFO Setting up TLS certificate logger=setup Oct 1 10:32:51 INFO Creating localbuild resource logger=setup Oct 1 10:32:51 INFO Starting EventSource controller=gitrepository controllerGroup=idpbuilder.cnoe.io controllerKind=GitRepository source=kind source: *v1alpha1.GitRepository Oct 1 10:32:51 INFO Starting Controller controller=gitrepository controllerGroup=idpbuilder.cnoe.io controllerKind=GitRepository Oct 1 10:32:51 INFO Starting EventSource controller=localbuild controllerGroup=idpbuilder.cnoe.io controllerKind=Localbuild source=kind source: *v1alpha1.Localbuild Oct 1 10:32:51 INFO Starting Controller controller=localbuild controllerGroup=idpbuilder.cnoe.io controllerKind=Localbuild Oct 1 10:32:51 INFO Starting EventSource controller=custompackage controllerGroup=idpbuilder.cnoe.io controllerKind=CustomPackage source=kind source: *v1alpha1.CustomPackage Oct 1 10:32:51 INFO Starting Controller controller=custompackage controllerGroup=idpbuilder.cnoe.io controllerKind=CustomPackage Oct 1 10:32:51 INFO Starting workers controller=localbuild controllerGroup=idpbuilder.cnoe.io controllerKind=Localbuild worker count=1 Oct 1 10:32:51 INFO Starting workers controller=custompackage controllerGroup=idpbuilder.cnoe.io controllerKind=CustomPackage worker count=1 Oct 1 10:32:51 INFO Starting workers controller=gitrepository controllerGroup=idpbuilder.cnoe.io controllerKind=GitRepository worker count=1 Oct 1 10:32:54 INFO Waiting for Deployment my-gitea to become ready controller=localbuild controllerGroup=idpbuilder.cnoe.io controllerKind=Localbuild name=localdev name=localdev reconcileID=6fc396d4-e0d5-4c80-aaee-20c1bbffea54 Oct 1 10:32:54 INFO Waiting for Deployment ingress-nginx-controller to become ready controller=localbuild controllerGroup=idpbuilder.cnoe.io controllerKind=Localbuild name=localdev name=localdev reconcileID=6fc396d4-e0d5-4c80-aaee-20c1bbffea54 Oct 1 10:33:24 INFO Waiting for Deployment my-gitea to become ready controller=localbuild controllerGroup=idpbuilder.cnoe.io controllerKind=Localbuild name=localdev name=localdev reconcileID=6fc396d4-e0d5-4c80-aaee-20c1bbffea54 Oct 1 10:33:24 INFO Waiting for Deployment ingress-nginx-controller to become ready controller=localbuild controllerGroup=idpbuilder.cnoe.io controllerKind=Localbuild name=localdev name=localdev reconcileID=6fc396d4-e0d5-4c80-aaee-20c1bbffea54 Oct 1 10:33:54 INFO Waiting for Deployment my-gitea to become ready controller=localbuild controllerGroup=idpbuilder.cnoe.io controllerKind=Localbuild name=localdev name=localdev reconcileID=6fc396d4-e0d5-4c80-aaee-20c1bbffea54 Oct 1 10:34:24 INFO installing bootstrap apps to ArgoCD controller=localbuild controllerGroup=idpbuilder.cnoe.io controllerKind=Localbuild name=localdev name=localdev reconcileID=6fc396d4-e0d5-4c80-aaee-20c1bbffea54 Oct 1 10:34:24 INFO expected annotation, cnoe.io/last-observed-cli-start-time, not found controller=localbuild controllerGroup=idpbuilder.cnoe.io controllerKind=Localbuild name=localdev name=localdev reconcileID=6fc396d4-e0d5-4c80-aaee-20c1bbffea54 Oct 1 10:34:24 INFO Checking if we should shutdown controller=localbuild controllerGroup=idpbuilder.cnoe.io controllerKind=Localbuild name=localdev name=localdev reconcileID=6fc396d4-e0d5-4c80-aaee-20c1bbffea54 Oct 1 10:34:25 INFO installing bootstrap apps to ArgoCD controller=localbuild controllerGroup=idpbuilder.cnoe.io controllerKind=Localbuild name=localdev name=localdev reconcileID=0667fa85-af1c-403f-bcd9-16ff8f2fad7e Oct 1 10:34:25 INFO expected annotation, cnoe.io/last-observed-cli-start-time, not found controller=localbuild controllerGroup=idpbuilder.cnoe.io controllerKind=Localbuild name=localdev name=localdev reconcileID=0667fa85-af1c-403f-bcd9-16ff8f2fad7e Oct 1 10:34:25 INFO Checking if we should shutdown controller=localbuild controllerGroup=idpbuilder.cnoe.io controllerKind=Localbuild name=localdev name=localdev reconcileID=0667fa85-af1c-403f-bcd9-16ff8f2fad7e Oct 1 10:34:40 INFO installing bootstrap apps to ArgoCD controller=localbuild controllerGroup=idpbuilder.cnoe.io controllerKind=Localbuild name=localdev name=localdev reconcileID=ec720aeb-02cd-4974-a991-cf2f19ce8536 Oct 1 10:34:40 INFO Checking if we should shutdown controller=localbuild controllerGroup=idpbuilder.cnoe.io controllerKind=Localbuild name=localdev name=localdev reconcileID=ec720aeb-02cd-4974-a991-cf2f19ce8536 Oct 1 10:34:40 INFO Shutting Down controller=localbuild controllerGroup=idpbuilder.cnoe.io controllerKind=Localbuild name=localdev name=localdev reconcileID=ec720aeb-02cd-4974-a991-cf2f19ce8536 Oct 1 10:34:40 INFO Stopping and waiting for non leader election runnables Oct 1 10:34:40 INFO Stopping and waiting for leader election runnables Oct 1 10:34:40 INFO Shutdown signal received, waiting for all workers to finish controller=gitrepository controllerGroup=idpbuilder.cnoe.io controllerKind=GitRepository Oct 1 10:34:40 INFO Shutdown signal received, waiting for all workers to finish controller=custompackage controllerGroup=idpbuilder.cnoe.io controllerKind=CustomPackage Oct 1 10:34:40 INFO All workers finished controller=custompackage controllerGroup=idpbuilder.cnoe.io controllerKind=CustomPackage Oct 1 10:34:40 INFO Shutdown signal received, waiting for all workers to finish controller=localbuild controllerGroup=idpbuilder.cnoe.io controllerKind=Localbuild Oct 1 10:34:40 INFO All workers finished controller=localbuild controllerGroup=idpbuilder.cnoe.io controllerKind=Localbuild Oct 1 10:34:40 INFO All workers finished controller=gitrepository controllerGroup=idpbuilder.cnoe.io controllerKind=GitRepository Oct 1 10:34:40 INFO Stopping and waiting for caches Oct 1 10:34:40 INFO Stopping and waiting for webhooks Oct 1 10:34:40 INFO Stopping and waiting for HTTP servers Oct 1 10:34:40 INFO Wait completed, proceeding to shutdown the manager ########################### Finished Creating IDP Successfully! ############################ Can Access ArgoCD at https://cnoe.localtest.me:8443/argocd Username: admin Password can be retrieved by running: idpbuilder get secrets -p argocd ``` ##### ArgoCD applications When running idpbuilder 'barely' (without package option) you get the 'core applications' deployed in your cluster: ```bash stl@ubuntu-vpn:~/git/mms/ipceicis-developerframework$ k get applications -A NAMESPACE NAME SYNC STATUS HEALTH STATUS argocd argocd Synced Healthy argocd gitea Synced Healthy argocd nginx Synced Healthy ``` ##### ArgoCD UI Open ArgoCD locally: https://cnoe.localtest.me:8443/argocd ![alt text](image.png) Next find the provided credentials for ArgoCD (here: argocd-initial-admin-secret): ```bash stl@ubuntu-vpn:~/git/mms/idpbuilder$ ib get secrets --------------------------- Name: argocd-initial-admin-secret Namespace: argocd Data: password : 2MoMeW30wSC9EraF username : admin --------------------------- Name: gitea-credential Namespace: gitea Data: password : LI$T?o>N{-<|{^dm$eTg*gni1(2:Y0@q344yqQIS username : giteaAdmin ``` In ArgoCD you will see the deployed three applications of the core package: ![alt text](image-1.png) ### Second run: Append 'package1' from the CNOE-stacks repo CNOE provides example packages in `https://github.com/cnoe-io/stacks.git`. Having cloned this repo you can locally refer to theses packages: ```bash stl@ubuntu-vpn:~/git/mms/cnoe-stacks$ git remote -v origin https://github.com/cnoe-io/stacks.git (fetch) origin https://github.com/cnoe-io/stacks.git (push) ``` ```bash stl@ubuntu-vpn:~/git/mms/cnoe-stacks$ ls -al total 64 drwxr-xr-x 12 stl stl 4096 Sep 28 13:55 . drwxr-xr-x 26 stl stl 4096 Sep 30 11:53 .. drwxr-xr-x 8 stl stl 4096 Sep 28 13:56 .git drwxr-xr-x 4 stl stl 4096 Jul 29 10:57 .github -rw-r--r-- 1 stl stl 11341 Sep 28 09:12 LICENSE -rw-r--r-- 1 stl stl 1079 Sep 28 13:55 README.md drwxr-xr-x 4 stl stl 4096 Jul 29 10:57 basic drwxr-xr-x 4 stl stl 4096 Sep 14 15:54 crossplane-integrations drwxr-xr-x 3 stl stl 4096 Aug 13 14:52 dapr-integration drwxr-xr-x 3 stl stl 4096 Sep 14 15:54 jupyterhub drwxr-xr-x 6 stl stl 4096 Aug 16 14:36 local-backup drwxr-xr-x 3 stl stl 4096 Aug 16 14:36 localstack-integration drwxr-xr-x 8 stl stl 4096 Sep 28 13:02 ref-implementation drwxr-xr-x 2 stl stl 4096 Aug 16 14:36 terraform-integrations stl@ubuntu-vpn:~/git/mms/cnoe-stacks$ ls -al basic/ total 20 drwxr-xr-x 4 stl stl 4096 Jul 29 10:57 . drwxr-xr-x 12 stl stl 4096 Sep 28 13:55 .. -rw-r--r-- 1 stl stl 632 Jul 29 10:57 README.md drwxr-xr-x 3 stl stl 4096 Jul 29 10:57 package1 drwxr-xr-x 2 stl stl 4096 Jul 29 10:57 package2 stl@ubuntu-vpn:~/git/mms/cnoe-stacks$ ls -al basic/package1 total 16 drwxr-xr-x 3 stl stl 4096 Jul 29 10:57 . drwxr-xr-x 4 stl stl 4096 Jul 29 10:57 .. -rw-r--r-- 1 stl stl 655 Jul 29 10:57 app.yaml drwxr-xr-x 2 stl stl 4096 Jul 29 10:57 manifests stl@ubuntu-vpn:~/git/mms/cnoe-stacks$ ls -al basic/package2 total 16 drwxr-xr-x 2 stl stl 4096 Jul 29 10:57 . drwxr-xr-x 4 stl stl 4096 Jul 29 10:57 .. -rw-r--r-- 1 stl stl 498 Jul 29 10:57 app.yaml -rw-r--r-- 1 stl stl 500 Jul 29 10:57 app2.yaml ``` #### Output Now we run idpbuilder the second time with `-p basic/package1` ##### idpbuilder log ```bash stl@ubuntu-vpn:~/git/mms/cnoe-stacks$ ib create --use-path-routing -p basic/package1 Oct 1 12:09:27 INFO Creating kind cluster logger=setup Oct 1 12:09:27 INFO Runtime detected logger=setup provider=docker Oct 1 12:09:27 INFO Cluster already exists logger=setup cluster=localdev Oct 1 12:09:28 INFO Adding CRDs to the cluster logger=setup Oct 1 12:09:28 INFO Setting up CoreDNS logger=setup Oct 1 12:09:28 INFO Setting up TLS certificate logger=setup Oct 1 12:09:28 INFO Creating localbuild resource logger=setup Oct 1 12:09:28 INFO Starting EventSource controller=localbuild controllerGroup=idpbuilder.cnoe.io controllerKind=Localbuild source=kind source: *v1alpha1.Localbuild Oct 1 12:09:28 INFO Starting Controller controller=localbuild controllerGroup=idpbuilder.cnoe.io controllerKind=Localbuild Oct 1 12:09:28 INFO Starting EventSource controller=custompackage controllerGroup=idpbuilder.cnoe.io controllerKind=CustomPackage source=kind source: *v1alpha1.CustomPackage Oct 1 12:09:28 INFO Starting Controller controller=custompackage controllerGroup=idpbuilder.cnoe.io controllerKind=CustomPackage Oct 1 12:09:28 INFO Starting EventSource controller=gitrepository controllerGroup=idpbuilder.cnoe.io controllerKind=GitRepository source=kind source: *v1alpha1.GitRepository Oct 1 12:09:28 INFO Starting Controller controller=gitrepository controllerGroup=idpbuilder.cnoe.io controllerKind=GitRepository Oct 1 12:09:28 INFO Starting workers controller=localbuild controllerGroup=idpbuilder.cnoe.io controllerKind=Localbuild worker count=1 Oct 1 12:09:28 INFO Starting workers controller=gitrepository controllerGroup=idpbuilder.cnoe.io controllerKind=GitRepository worker count=1 Oct 1 12:09:28 INFO Starting workers controller=custompackage controllerGroup=idpbuilder.cnoe.io controllerKind=CustomPackage worker count=1 Oct 1 12:09:29 INFO installing bootstrap apps to ArgoCD controller=localbuild controllerGroup=idpbuilder.cnoe.io controllerKind=Localbuild name=localdev name=localdev reconcileID=0ed7ccc2-dec7-4ab8-909c-791a7d1b67a8 Oct 1 12:09:29 INFO unknown field "status.history[0].initiatedBy" logger=KubeAPIWarningLogger Oct 1 12:09:29 INFO Checking if we should shutdown controller=localbuild controllerGroup=idpbuilder.cnoe.io controllerKind=Localbuild name=localdev name=localdev reconcileID=0ed7ccc2-dec7-4ab8-909c-791a7d1b67a8 Oct 1 12:09:29 ERROR failed updating repo status controller=custompackage controllerGroup=idpbuilder.cnoe.io controllerKind=CustomPackage name=app-my-app namespace=idpbuilder-localdev namespace=idpbuilder-localdev name=app-my-app reconcileID=f9873560-5dcd-4e59-b6f7-ce5d1029ef3d err=Operation cannot be fulfilled on custompackages.idpbuilder.cnoe.io "app-my-app": the object has been modified; please apply your changes to the latest version and try again Oct 1 12:09:29 ERROR Reconciler error controller=custompackage controllerGroup=idpbuilder.cnoe.io controllerKind=CustomPackage name=app-my-app namespace=idpbuilder-localdev namespace=idpbuilder-localdev name=app-my-app reconcileID=f9873560-5dcd-4e59-b6f7-ce5d1029ef3d err=updating argocd application object my-app: Operation cannot be fulfilled on applications.argoproj.io "my-app": the object has been modified; please apply your changes to the latest version and try again Oct 1 12:09:31 INFO installing bootstrap apps to ArgoCD controller=localbuild controllerGroup=idpbuilder.cnoe.io controllerKind=Localbuild name=localdev name=localdev reconcileID=531cc2d4-6250-493a-aca8-fecf048a608d Oct 1 12:09:31 INFO Checking if we should shutdown controller=localbuild controllerGroup=idpbuilder.cnoe.io controllerKind=Localbuild name=localdev name=localdev reconcileID=531cc2d4-6250-493a-aca8-fecf048a608d Oct 1 12:09:44 INFO installing bootstrap apps to ArgoCD controller=localbuild controllerGroup=idpbuilder.cnoe.io controllerKind=Localbuild name=localdev name=localdev reconcileID=022b9813-8708-4f4e-90d7-38f1e114c46f Oct 1 12:09:44 INFO Checking if we should shutdown controller=localbuild controllerGroup=idpbuilder.cnoe.io controllerKind=Localbuild name=localdev name=localdev reconcileID=022b9813-8708-4f4e-90d7-38f1e114c46f Oct 1 12:10:00 INFO installing bootstrap apps to ArgoCD controller=localbuild controllerGroup=idpbuilder.cnoe.io controllerKind=Localbuild name=localdev name=localdev reconcileID=79a85c21-42c1-41ec-ad03-2bb77aeae027 Oct 1 12:10:00 INFO Checking if we should shutdown controller=localbuild controllerGroup=idpbuilder.cnoe.io controllerKind=Localbuild name=localdev name=localdev reconcileID=79a85c21-42c1-41ec-ad03-2bb77aeae027 Oct 1 12:10:00 INFO Shutting Down controller=localbuild controllerGroup=idpbuilder.cnoe.io controllerKind=Localbuild name=localdev name=localdev reconcileID=79a85c21-42c1-41ec-ad03-2bb77aeae027 Oct 1 12:10:00 INFO Stopping and waiting for non leader election runnables Oct 1 12:10:00 INFO Stopping and waiting for leader election runnables Oct 1 12:10:00 INFO Shutdown signal received, waiting for all workers to finish controller=custompackage controllerGroup=idpbuilder.cnoe.io controllerKind=CustomPackage Oct 1 12:10:00 INFO Shutdown signal received, waiting for all workers to finish controller=gitrepository controllerGroup=idpbuilder.cnoe.io controllerKind=GitRepository Oct 1 12:10:00 INFO All workers finished controller=custompackage controllerGroup=idpbuilder.cnoe.io controllerKind=CustomPackage Oct 1 12:10:00 INFO Shutdown signal received, waiting for all workers to finish controller=localbuild controllerGroup=idpbuilder.cnoe.io controllerKind=Localbuild Oct 1 12:10:00 INFO All workers finished controller=localbuild controllerGroup=idpbuilder.cnoe.io controllerKind=Localbuild Oct 1 12:10:00 INFO All workers finished controller=gitrepository controllerGroup=idpbuilder.cnoe.io controllerKind=GitRepository Oct 1 12:10:00 INFO Stopping and waiting for caches Oct 1 12:10:00 INFO Stopping and waiting for webhooks Oct 1 12:10:00 INFO Stopping and waiting for HTTP servers Oct 1 12:10:00 INFO Wait completed, proceeding to shutdown the manager ########################### Finished Creating IDP Successfully! ############################ Can Access ArgoCD at https://cnoe.localtest.me:8443/argocd Username: admin Password can be retrieved by running: idpbuilder get secrets -p argocd ``` ##### ArgoCD applications Now we have additionally the 'my-app' deployed in the cluster: ```bash stl@ubuntu-vpn:~$ k get applications -A NAMESPACE NAME SYNC STATUS HEALTH STATUS argocd argocd Synced Healthy argocd gitea Synced Healthy argocd my-app Synced Healthy argocd nginx Synced Healthy ``` ##### ArgoCD UI ![alt text](image-2.png) ### Third run: Finally we append 'ref-implementation' from the CNOE-stacks repo We finally append the so called ['reference-implementation'](https://cnoe.io/docs/reference-implementation/integrations/reference-impl), which provides a real basic IDP: ```bash stl@ubuntu-vpn:~/git/mms/cnoe-stacks$ ib create --use-path-routing -p ref-implementation ``` ##### ArgoCD applications ```bash stl@ubuntu-vpn:~$ k get applications -A NAMESPACE NAME SYNC STATUS HEALTH STATUS argocd argo-workflows Synced Healthy argocd argocd Synced Healthy argocd backstage Synced Healthy argocd included-backstage-templates Synced Healthy argocd external-secrets Synced Healthy argocd gitea Synced Healthy argocd keycloak Synced Healthy argocd metric-server Synced Healthy argocd my-app Synced Healthy argocd nginx Synced Healthy argocd spark-operator Synced Healthy ``` ##### ArgoCD UI ArgoCD shows all provissioned applications: ![alt text](image-3.png) ##### Keycloak UI In our cluster there is also keycloak as IAM provisioned. Login into Keycloak with 'cnoe-admin' and the KEYCLOAK_ADMIN_PASSWORD. These credentails are defined in the package: ```bash stl@ubuntu-vpn:~/git/mms/cnoe-stacks$ cat ref-implementation/keycloak/manifests/keycloak-config.yaml | grep -i admin group-admin-payload.json: | {"name":"admin"} "/admin" ADMIN_PASSWORD=$(cat /var/secrets/KEYCLOAK_ADMIN_PASSWORD) --data-urlencode "username=cnoe-admin" \ --data-urlencode "password=${ADMIN_PASSWORD}" \ ``` ```bash stl@ubuntu-vpn:~/git/mms/cnoe-stacks$ ib get secrets --------------------------- Name: argocd-initial-admin-secret Namespace: argocd Data: password : 2MoMeW30wSC9EraF username : admin --------------------------- Name: gitea-credential Namespace: gitea Data: password : LI$T?o>N{-<|{^dm$eTg*gni1(2:Y0@q344yqQIS username : giteaAdmin --------------------------- Name: keycloak-config Namespace: keycloak Data: KC_DB_PASSWORD : k3-1kgxxd/X2Cw//pX-uKMsmgWogEz5YGnb5 KC_DB_USERNAME : keycloak KEYCLOAK_ADMIN_PASSWORD : zMSjv5eA0l/+0-MDAaaNe+rHRMrB2q0NssP- POSTGRES_DB : keycloak POSTGRES_PASSWORD : k3-1kgxxd/X2Cw//pX-uKMsmgWogEz5YGnb5 POSTGRES_USER : keycloak USER_PASSWORD : Kd+0+/BqPRAvnLPZO-L2o/6DoBrzUeMsr29U ``` ![alt text](image-4.png) ##### Backstage UI As Backstage login you either can use the 'user1' with `USER_PASSWORD : Kd+0+/BqPRAvnLPZO-L2o/6DoBrzUeMsr29U` or you create a new user in keycloak ![](image-6.png) We create user 'ipcei' and also set a password (in tab 'Credentials'): ![alt text](image-7.png) Now we can log into backstage (rember: you could have already existing usr 'user1'): ![alt text](image-8.png) and see the basic setup of the Backstage portal: ![alt text](image-9.png) ### Use a Golden Path: 'Basic Deployment' Now we want to use the Backstage portal as a developer. We create in Backstage our own platform based activity by using the golden path template 'Basic Deployment: ![alt text](image-10.png) When we run it, we see 'golden path activities' ![alt text](image-11.png) which finally result in a new catalogue entry: ![alt text](image-12.png) #### Software development lifecycle When we follow the 'view source' link we are directly linked to the git repo of our newly created application: ![alt text](image-13.png) Check it out by cloning into a local git repo (watch the GIT_SSL_NO_VERIFY=true env setting): ```bash stl@ubuntu-vpn:~/git/mms/idp-temporary$ GIT_SSL_NO_VERIFY=true git clone https://cnoe.localtest.me:8443/gitea/giteaAdmin/basicdeployment.git Cloning into 'basicdeployment'... remote: Enumerating objects: 10, done. remote: Counting objects: 100% (10/10), done. remote: Compressing objects: 100% (8/8), done. remote: Total 10 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0) Receiving objects: 100% (10/10), 47.62 KiB | 23.81 MiB/s, done. stl@ubuntu-vpn:~/git/mms/idp-temporary$ cd basicdeployment/ stl@ubuntu-vpn:~/git/mms/idp-temporary/basicdeployment$ ll total 24 drwxr-xr-x 5 stl stl 4096 Oct 1 13:00 ./ drwxr-xr-x 4 stl stl 4096 Oct 1 13:00 ../ drwxr-xr-x 8 stl stl 4096 Oct 1 13:00 .git/ -rw-r--r-- 1 stl stl 928 Oct 1 13:00 catalog-info.yaml drwxr-xr-x 3 stl stl 4096 Oct 1 13:00 docs/ drwxr-xr-x 2 stl stl 4096 Oct 1 13:00 manifests/ ``` #### Edit and change Change some things, like the decription and the replicas: ![alt text](image-16.png) #### Push Push your changes, use the giteaAdmin user to authenticate: ```bash stl@ubuntu-vpn:~/git/mms/idp-temporary/basicdeployment$ ib get secrets --------------------------- Name: argocd-initial-admin-secret Namespace: argocd Data: password : 2MoMeW30wSC9EraF username : admin --------------------------- Name: gitea-credential Namespace: gitea Data: password : LI$T?o>N{-<|{^dm$eTg*gni1(2:Y0@q344yqQIS username : giteaAdmin --------------------------- Name: keycloak-config Namespace: keycloak Data: KC_DB_PASSWORD : k3-1kgxxd/X2Cw//pX-uKMsmgWogEz5YGnb5 KC_DB_USERNAME : keycloak KEYCLOAK_ADMIN_PASSWORD : zMSjv5eA0l/+0-MDAaaNe+rHRMrB2q0NssP- POSTGRES_DB : keycloak POSTGRES_PASSWORD : k3-1kgxxd/X2Cw//pX-uKMsmgWogEz5YGnb5 POSTGRES_USER : keycloak USER_PASSWORD : Kd+0+/BqPRAvnLPZO-L2o/6DoBrzUeMsr29U stl@ubuntu-vpn:~/git/mms/idp-temporary/basicdeployment$ GIT_SSL_NO_VERIFY=true git push Username for 'https://cnoe.localtest.me:8443': giteaAdmin Password for 'https://giteaAdmin@cnoe.localtest.me:8443': Enumerating objects: 5, done. Counting objects: 100% (5/5), done. Delta compression using up to 8 threads Compressing objects: 100% (3/3), done. Writing objects: 100% (3/3), 382 bytes | 382.00 KiB/s, done. Total 3 (delta 1), reused 0 (delta 0), pack-reused 0 remote: . Processing 1 references remote: Processed 1 references in total To https://cnoe.localtest.me:8443/gitea/giteaAdmin/basicdeployment.git 69244d6..1269617 main -> main ``` #### Wait for gitops magic: deployment into the 'production' cluster Next wait a bit until Gitops does its magic and our 'wanted' state in the repo gets automatically deployed to the 'production' cluster: ![alt text](image-14.png) ![alt text](image-15.png) {{% pageinfo color="info" %}} ### What comes next? The showtime of CNOE high level behaviour and usage scenarios is now finished. We setup an initial IDP and used a backstage golden path to init and deploy a simple application. [Last not least](../conclusio/) we want to sum up the whole way from Devops to 'Frameworking' (is this the correct wording???) {{% /pageinfo %}}