The following paragraphs describe how to setup and run a demo that shows how to develop this operator within Che.
The demo can be preceded by a short Che presentation (slides)
WARNING: the resulting image is > 4GB!! The build clones the operator source code and does a build of it. During the build all the go dependencies are downloaded. That saves a lot of time during the demo but makes the image uge.
WARNING: this should be done the day before the demo or the same day so that the image has all the operator dependencies already downloaded.
docker build -t mariolet/operator-sdk:0.11.0 -f build/Dockerfile.dev ./build
docker push mariolet/operator-sdk:0.11.0
Once you have build and push it you should replace the image reference in the devfile.yaml
Something that may be useful is to pull the image locally:
SHA256=<the image digest>
eval $(minikube docker-env)
docker pull mariolet/operator-sdk@sha256:${SHA256}
# Start minikube
mk
# Start che
chectl server:start --platform=minikube --installer=helm
# Change the run as user
kubens che
# Update the default uid: the default is 1724, set it to zero instead
k patch cm/che -p '{"data":{"CHE_INFRA_KUBERNETES_POD_SECURITY__CONTEXT_FS__GROUP":"0", "CHE_INFRA_KUBERNETES_POD_SECURITY__CONTEXT_RUN__AS__USER":"0"}}'
# Every user should have his own namespace
k patch cm/che -p '{"data":{"CHE_INFRA_KUBERNETES_NAMESPACE_DEFAULT":"che-<username>"}}'
k create namespace che-${USERNAME}
# Restart Che
k rollout restart deploy/che
# Start the operator-hello-world workspace
DEVFILE=/Users/mloriedo/github/operator-hello-world/devfile.yaml
chectl workspace:start --devfile=${DEVFILE}
chectl workspace:inject -k -n <worksapce namespace>
{
"workbench.appearance.colorTheme": "light",
"terminal.integrated.copyOnSelection": true,
"git.user.name": "l0rd",
"git.user.email": "mario.loriedo@gmail.com"
}
# Deploy the service account and setup RBAC
kubectl create -f deploy/service_account.yaml
kubectl create -f deploy/role.yaml
kubectl create -f deploy/role_binding.yaml
# Setup the CRD and deploy the podset-operator
kubectl create -f deploy/crds/app.example.com_podsets_crd.yaml
kubectl create -f deploy/operator.yaml
# Look for the podset api
kubectl api-resources
# Get the podsets (there should be no podset)
kubectl get podset
# Create a podSet
echo "apiVersion: app.example.com/v1alpha1
kind: PodSet
metadata:
name: example-podset
spec:
replicas: 3" | kubectl create -f -
# Get the podset again (there should be one)
kubectl get podset
# Get the pods (there should be a lot)
kubectl get pod
# Delete the podset
kubectl delete podset example-podset
# Scaled down the operator deployment
kubectl scale --replicas=0 deploy podset-operator
https://github.com/l0rd/operator-hello-world
Switch to the local workspace because che.openshift.io takes time to load and doesn't have enough resources
- Show the source code
- Build and run the operator using the corresponding task
- Change the code
- Rebuild and run and verify that the changes to the controller have been taken into account
# Using the operator SDK
operator-sdk build --image-builder buildah mariolet/podset-operator
# Using buildah
buildah bud --format=docker --isolation=chroot -f build/Dockerfile -t mariolet/podset-operator .
buildah bud --format=docker -f build/Dockerfile -t mariolet/podset-operator .
buildah bud --security-opt label=disable --security-opt seccomp=unconfined --format=docker --isolation=chroot -f build/Dockerfile -t mariolet/podset-operator .
go build -o /projects/src/github.com/l0rd/operator-hello-world/build/_output/bin/operator-hello-world \
-gcflags all=-trimpath=/projects/src/github.com/l0rd \
-asmflags all=-trimpath=/projects/src/github.com/l0rd \
github.com/l0rd/operator-hello-world/cmd/manager
- Investigate why the build of the operator image with buildah doesn't work in a Che container
- fix issue described in issue1.md
- run on CRW
- We should write down instructions to set imagePullStrategy to never for all workspaces components
- We should have a script to pre pull all needed images
- Setup the powershell PS1
- upgrade operator-sdk to latest