Containerfile | ●●●●● patch | view | raw | blame | history | |
cookie-crd.yaml | ●●●●● patch | view | raw | blame | history | |
cookie-operator-deployment.yaml | ●●●●● patch | view | raw | blame | history | |
cookie-rbac.yaml | ●●●●● patch | view | raw | blame | history | |
cookieprocessor-sa.yaml | ●●●●● patch | view | raw | blame | history | |
oaty-hazelnut-cookies.yaml | ●●●●● patch | view | raw | blame | history | |
receipt-processor.ksh | ●●●●● patch | view | raw | blame | history | |
recipe-processor.ksh | ●●●●● patch | view | raw | blame | history | |
sample-cookie.yaml | ●●●●● patch | view | raw | blame | history |
Containerfile
@@ -1,11 +1,11 @@ FROM docker.eenfach.de/olbohlen/kshbase:latest LABEL author="Olaf Bohlen <olbohlen@eenfach.de>" COPY receipt-processor.ksh /usr/local/bin/receipt-processor.ksh RUN chmod 755 /usr/local/bin/receipt-processor.ksh && \ COPY recipe-processor.ksh /usr/local/bin/recipe-processor.ksh RUN chmod 755 /usr/local/bin/recipe-processor.ksh && \ useradd cookie && \ dnf install -y jq USER cookie ENTRYPOINT ["/usr/local/bin/receipt-processor.ksh"] ENTRYPOINT ["/usr/local/bin/recipe-processor.ksh"] cookie-crd.yaml
@@ -1,13 +1,13 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: name: cookiereceipts.de.eenfach.olbohlen name: cookierecipes.de.eenfach.olbohlen spec: group: de.eenfach.olbohlen names: kind: CookieReceipt plural: cookiereceipts singular: cookiereceipt kind: CookieRecipe plural: cookierecipes singular: cookierecipe scope: Namespaced versions: - name: v1 @@ -15,7 +15,7 @@ storage: true schema: openAPIV3Schema: description: "The CookieReceipt CRD is a k8s demo for enhancing functionality, it will not (unfortunately) provide you real cookies in the end..." description: "The CookieRecipe CRD is a k8s demo for enhancing functionality, it will not (unfortunately) provide you real cookies in the end..." type: object properties: apiVersion: @@ -40,7 +40,7 @@ type: string description: where does this come from? (grandma, mum, the internet...) ingredients: description: this list provides required ingredients for this receipt description: this list provides required ingredients for this recipe type: array x-kubernetes-list-type: atomic items: cookie-operator-deployment.yaml
@@ -3,19 +3,19 @@ metadata: creationTimestamp: null labels: app: receipt-processor name: receipt-processor app: recipe-processor name: recipe-processor spec: replicas: 1 selector: matchLabels: app: receipt-processor app: recipe-processor strategy: {} template: metadata: creationTimestamp: null labels: app: receipt-processor app: recipe-processor spec: serviceAccountName: cookieprocessor containers: cookie-rbac.yaml
@@ -2,12 +2,12 @@ apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: cookiereceipt-edit name: cookierecipe-edit rules: - apiGroups: - de.eenfach.olbohlen resources: - cookiereceipts - cookierecipes verbs: - create - get @@ -19,12 +19,12 @@ apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: cookiereceipt-view name: cookierecipe-view rules: - apiGroups: - de.eenfach.olbohlen resources: - cookiereceipts - cookierecipes verbs: - get - list @@ -32,11 +32,11 @@ apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: cookiereceipt-edit name: cookierecipe-edit roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cookiereceipt-edit name: cookierecipe-edit subjects: - apiGroup: rbac.authorization.k8s.io kind: Group cookieprocessor-sa.yaml
@@ -8,11 +8,11 @@ apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: cookiereceipt-view name: cookierecipe-view roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cookiereceipt-view name: cookierecipe-view subjects: - kind: ServiceAccount name: cookieprocessor oaty-hazelnut-cookies.yaml
@@ -1,5 +1,5 @@ apiVersion: de.eenfach.olbohlen/v1 kind: CookieReceipt kind: CookieRecipe metadata: name: oaty-hazelnut spec: receipt-processor.ksh
File was deleted recipe-processor.ksh
New file @@ -0,0 +1,126 @@ #!/usr/bin/ksh # by Olaf Bohlen <olbohlen@eenfach.de> # licensed under BSD3 license APIURL="https://${KUBERNETES_SERVICE_HOST}:${KUBERNETES_SERVICE_PORT_HTTPS}" NAMESPACE=$(</run/secrets/kubernetes.io/serviceaccount/namespace) TOKEN=$(</run/secrets/kubernetes.io/serviceaccount/token) CACRT="/run/secrets/kubernetes.io/serviceaccount/ca.crt" # some associate arrays we need typeset -A recipename typeset -A recipeversion CURLOPTS="-s --cacert ${CACRT} -H 'Accept: application/json' -H 'User-Agent: ksh93 recipe processor 0.1' -H 'Authorization: Bearer ${TOKEN}'" while sleep 5; do # MAIN loop # we will later store here modified recipe uids, so we clear it for every run updatedrecipes="" # get a CookieRecipeList item from the API and store the json in a variable respjson=$(eval curl -XGET ${CURLOPTS} "${APIURL}/apis/de.eenfach.olbohlen/v1/namespaces/${NAMESPACE}/cookierecipes?limit=500") # check if we got the expected resource: kind=$(echo "${respjson}" | jq .kind) if [ x${kind} != 'x"CookieRecipeList"' ]; then printf "Error: unexpected Result from API\n" break ## jump out of this loop iteration fi # how many recipes are there? numrecipes=$(echo "${respjson}" | jq .items\[\].metadata.name | wc -l) # populate the in memory arrays with json metadata, we need # - the name # - the uid # - the resourceVersion # for every recipe to figure out if we need to process them i=0 while [ ${i} -lt ${numrecipes} ]; do recipeuid=$(echo "${respjson}" | jq -r .items[${i}].metadata.uid) recipename[${recipeuid}]=$(echo "${respjson}" | jq -r .items[${i}].metadata.name) # check if we already have processed this version of the recipe, if not # store the uid of that recipe in the updatedrecipes var newversion=$(echo "${respjson}" | jq -r .items[${i}].metadata.resourceVersion) if [ "x${newversion}" != "x${recipeversion[${recipeuid}]}" ]; then # we have an update! updatedrecipes="${updatedrecipes} ${recipeuid}" recipeversion[${recipeuid}]="${newversion}" fi i=$(( ${i} + 1 )) done # now that we have a list of updated recipes, we are going to process them for r in ${updatedrecipes}; do printf "\n\nNew recipe found: %s\n" "${recipename[${r}]}" printf "--------------------------------------------------------------------------\n\n" # get the name for the UID and fetch only that object recipe=$(eval curl -XGET ${CURLOPTS} '${APIURL}/apis/de.eenfach.olbohlen/v1/namespaces/${NAMESPACE}/cookierecipes/${recipename[${r}]}' ) # recipe contains now the json for one recipe, now we parse that # we set scale to Fahrenheit if sanescale is false, else scale will use Celsius scale_b=$( echo "${recipe}" | jq -r .spec.sanescale ) if [ "x${sanescale}" == "xfalse" ]; then scale=Fahrenheit fi temperature=$( echo "${recipe}" | jq -r .spec.temperature ) preheat_b=$( echo "${recipe}" | jq -r .spec.preheat ) if [ "x${preheat_b}" == "xtrue" ]; then printf "Pre: we heat up the oven to %s degrees %s\n\n" "${temperature}" "${scale:-Celsius}" fi # how many ingredients do we have? num_in=$(echo "${recipe}" | jq .spec.ingredients\[\].name | wc -l) # list up that we fetch needed ingredients printf "Fetching ingredients from recipe:\n" printf "----------------------------------\n" i=0 while [ ${i} -lt ${num_in} ]; do in_name=$( echo "${recipe}" | jq -r .spec.ingredients[${i}].name ) in_amount=$( echo "${recipe}" | jq -r .spec.ingredients[${i}].amount ) in_unit=$( echo "${recipe}" | jq -r .spec.ingredients[${i}].unit ) in_remarks=$( echo "${recipe}" | jq -r .spec.ingredients[${i}].remarks ) printf "Fetching %s%s of %s" "${in_amount}" "${in_unit}" "${in_name}" if [ "x${in_remarks}" != "xnull" ]; then printf " (%s)" "${in_remarks}" fi printf "\n\n" sleep 1 i=$(( ${i} + 1 )) done # now we need to (unfortunately just!) simulate the processing # the order of the steps is important, but lists are not ordered, so we have # an "order" attribute in each list item, and we select on that. # first again, we need the amount of instructions... num_steps=$(echo "${recipe}" | jq .spec.steps\[\].order | wc -l) # now let's iterate over that printf "\n\nProcessing the instructions:\n" printf "----------------------------\n" i=1 while [ ${i} -le ${num_steps} ]; do instruction=$( echo "${recipe}" | jq '.spec.steps[] | select(.order == '${i}') | { instruction } | join (" ")' ) printf "Step %i/%i: %s..." ${i} ${num_steps} "${instruction}" sleep $(( ${RANDOM} % 6 + 1 )) printf "done\n\n" sleep 1 i=$(( ${i} + 1 )) done printf "\nDone with this recipe." printf "\n=======================\n\n" done done sample-cookie.yaml
@@ -1,5 +1,5 @@ apiVersion: de.eenfach.olbohlen/v1 kind: CookieReceipt kind: CookieRecipe metadata: name: vintage-chocolate-chip spec: @@ -62,7 +62,7 @@ instruction: Leave on the tray for a couple of mins to set and then lift onto a cooling rack. --- apiVersion: de.eenfach.olbohlen/v1 kind: CookieReceipt kind: CookieRecipe metadata: name: double-dipped-shortbread spec: