Olaf Bohlen
2023-02-15 267308dc0c2acb42d8ffaf871337a70122f54a42
fixed language issues...;)
1 files deleted
1 files added
7 files modified
300 ■■■■ changed files
Containerfile 6 ●●●● patch | view | raw | blame | history
cookie-crd.yaml 12 ●●●● patch | view | raw | blame | history
cookie-operator-deployment.yaml 8 ●●●● patch | view | raw | blame | history
cookie-rbac.yaml 12 ●●●● patch | view | raw | blame | history
cookieprocessor-sa.yaml 4 ●●●● patch | view | raw | blame | history
oaty-hazelnut-cookies.yaml 2 ●●● patch | view | raw | blame | history
receipt-processor.ksh 126 ●●●●● patch | view | raw | blame | history
recipe-processor.ksh 126 ●●●●● patch | view | raw | blame | history
sample-cookie.yaml 4 ●●●● 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: