From 0cfaa3d0ade750635c466d40b314e352ce5d48bc Mon Sep 17 00:00:00 2001 From: Andrew Harris Date: Tue, 31 Mar 2026 12:20:02 -0400 Subject: [PATCH] fix: accouting for batched contexts on ironic runbook operator --- .../hooks/create_runbook.sh | 48 +++++++++--------- .../hooks/delete_runbook.sh | 28 ++++++----- .../hooks/update_runbook.sh | 49 ++++++++++--------- 3 files changed, 68 insertions(+), 57 deletions(-) diff --git a/containers/shell-operator-ironic/hooks/create_runbook.sh b/containers/shell-operator-ironic/hooks/create_runbook.sh index 9f17542ad..2fceed2c6 100755 --- a/containers/shell-operator-ironic/hooks/create_runbook.sh +++ b/containers/shell-operator-ironic/hooks/create_runbook.sh @@ -16,32 +16,36 @@ if [[ $1 == "--config" ]] ; then } EOF else - type=$(jq -r '.[0].type' "${BINDING_CONTEXT_PATH}") - if [[ $type == "Synchronization" ]] ; then - echo "Implement any reconciliation logic needed here." - fi + binding_count=$(jq -r 'length' "${BINDING_CONTEXT_PATH}") + for ((i = 0; i < binding_count; i++)); do + type=$(jq -r ".[$i].type" "${BINDING_CONTEXT_PATH}") + if [[ $type == "Synchronization" ]] ; then + echo "Implement any reconciliation logic needed here." + continue + fi - if [[ $type == "Event" ]] ; then - resource_name=$(jq -r '.[0].object.metadata.name' "${BINDING_CONTEXT_PATH}") - kind=$(jq -r '.[0].object.kind' "${BINDING_CONTEXT_PATH}") + if [[ $type == "Event" ]] ; then + resource_name=$(jq -r ".[$i].object.metadata.name" "${BINDING_CONTEXT_PATH}") + kind=$(jq -r ".[$i].object.kind" "${BINDING_CONTEXT_PATH}") - runbook_name=$(jq -r '.[0].object.spec.runbookName' "${BINDING_CONTEXT_PATH}") - public=$(jq -r '.[0].object.spec.public' "${BINDING_CONTEXT_PATH}") - owner=$(jq -r '.[0].object.spec.owner' "${BINDING_CONTEXT_PATH}") - jq -r '.[0].object.spec.steps' "${BINDING_CONTEXT_PATH}" > /tmp/steps.yaml + runbook_name=$(jq -r ".[$i].object.spec.runbookName" "${BINDING_CONTEXT_PATH}") + public=$(jq -r ".[$i].object.spec.public" "${BINDING_CONTEXT_PATH}") + owner=$(jq -r ".[$i].object.spec.owner" "${BINDING_CONTEXT_PATH}") + jq -r ".[$i].object.spec.steps" "${BINDING_CONTEXT_PATH}" > /tmp/steps.yaml - # Ironic's runbook extra field is essentially a dict of dicts, representing a key values. baremetal cli allows you - # to pass in multiple --extra options, adding any you do pass. We would need to make an initial query to determine - # existing extras, and then sync the differences. This work is probably better suited to a full controller implementation. - # extra=$(jq -r '.spec.extra | [to_entries[] | "--extra \(.key)=\(.value | @json | @sh)"] | join(" ")' ${BINDING_CONTEXT_PATH}) + # Ironic's runbook extra field is essentially a dict of dicts, representing a key values. baremetal cli allows you + # to pass in multiple --extra options, adding any you do pass. We would need to make an initial query to determine + # existing extras, and then sync the differences. This work is probably better suited to a full controller implementation. + # extra=$(jq -r '.spec.extra | [to_entries[] | "--extra \(.key)=\(.value | @json | @sh)"] | join(" ")' ${BINDING_CONTEXT_PATH}) - command_args=(baremetal runbook create --name "${runbook_name}" --public "${public}" --steps /tmp/steps.yaml) - if [[ -n "${owner}" && "${owner}" != "null" ]]; then - command_args+=(--owner "${owner}") - fi + command_args=(baremetal runbook create --name "${runbook_name}" --public "${public}" --steps /tmp/steps.yaml) + if [[ -n "${owner}" && "${owner}" != "null" ]]; then + command_args+=(--owner "${owner}") + fi - echo "${kind}/${resource_name} created, running: openstack ${command_args[*]}" + echo "${kind}/${resource_name} created, running: openstack ${command_args[*]}" - openstack "${command_args[@]}" - fi + openstack "${command_args[@]}" + fi + done fi diff --git a/containers/shell-operator-ironic/hooks/delete_runbook.sh b/containers/shell-operator-ironic/hooks/delete_runbook.sh index bc6fc7130..53439d30a 100755 --- a/containers/shell-operator-ironic/hooks/delete_runbook.sh +++ b/containers/shell-operator-ironic/hooks/delete_runbook.sh @@ -16,20 +16,24 @@ if [[ $1 == "--config" ]] ; then } EOF else - type=$(jq -r '.[0].type' "${BINDING_CONTEXT_PATH}") - if [[ $type == "Synchronization" ]] ; then - echo "Implement any reconciliation logic needed here." - fi + binding_count=$(jq -r 'length' "${BINDING_CONTEXT_PATH}") + for ((i = 0; i < binding_count; i++)); do + type=$(jq -r ".[$i].type" "${BINDING_CONTEXT_PATH}") + if [[ $type == "Synchronization" ]] ; then + echo "Implement any reconciliation logic needed here." + continue + fi - if [[ $type == "Event" ]] ; then - resource_name=$(jq -r '.[0].object.metadata.name' "${BINDING_CONTEXT_PATH}") - kind=$(jq -r '.[0].object.kind' "${BINDING_CONTEXT_PATH}") + if [[ $type == "Event" ]] ; then + resource_name=$(jq -r ".[$i].object.metadata.name" "${BINDING_CONTEXT_PATH}") + kind=$(jq -r ".[$i].object.kind" "${BINDING_CONTEXT_PATH}") - runbook_name=$(jq -r '.[0].object.spec.runbookName' "${BINDING_CONTEXT_PATH}") + runbook_name=$(jq -r ".[$i].object.spec.runbookName" "${BINDING_CONTEXT_PATH}") - command_args=(baremetal runbook delete "${runbook_name}") - echo "${kind}/${resource_name} deleted, running: openstack ${command_args[*]}" + command_args=(baremetal runbook delete "${runbook_name}") + echo "${kind}/${resource_name} deleted, running: openstack ${command_args[*]}" - openstack "${command_args[@]}" - fi + openstack "${command_args[@]}" + fi + done fi diff --git a/containers/shell-operator-ironic/hooks/update_runbook.sh b/containers/shell-operator-ironic/hooks/update_runbook.sh index f15d69a00..216ec5c7e 100755 --- a/containers/shell-operator-ironic/hooks/update_runbook.sh +++ b/containers/shell-operator-ironic/hooks/update_runbook.sh @@ -16,33 +16,36 @@ if [[ $1 == "--config" ]] ; then } EOF else - type=$(jq -r '.[0].type' "${BINDING_CONTEXT_PATH}") - if [[ $type == "Synchronization" ]] ; then - echo "Implement any reconciliation logic needed here." - fi - - if [[ $type == "Event" ]] ; then - resource_name=$(jq -r '.[0].object.metadata.name' "${BINDING_CONTEXT_PATH}") - kind=$(jq -r '.[0].object.kind' "${BINDING_CONTEXT_PATH}") + binding_count=$(jq -r 'length' "${BINDING_CONTEXT_PATH}") + for ((i = 0; i < binding_count; i++)); do + type=$(jq -r ".[$i].type" "${BINDING_CONTEXT_PATH}") + if [[ $type == "Synchronization" ]] ; then + echo "Implement any reconciliation logic needed here." + continue + fi - runbook_name=$(jq -r '.[0].object.spec.runbookName' "${BINDING_CONTEXT_PATH}") - public=$(jq -r '.[0].object.spec.public' "${BINDING_CONTEXT_PATH}") - owner=$(jq -r '.[0].object.spec.owner' "${BINDING_CONTEXT_PATH}") - jq -r '.[0].object.spec.steps' "${BINDING_CONTEXT_PATH}" > /tmp/steps.yaml + if [[ $type == "Event" ]] ; then + resource_name=$(jq -r ".[$i].object.metadata.name" "${BINDING_CONTEXT_PATH}") + kind=$(jq -r ".[$i].object.kind" "${BINDING_CONTEXT_PATH}") - # Ironic's runbook extra field is essentially a dict of dicts, representing a key values. baremetal cli allows you - # to pass in multiple --extra options, adding any you do pass. We would need to make an initial query to determine - # existing extras, and then sync the differences. This work is probably better suited to a full controller implementation. - # extra=$(jq -r '.spec.extra | [to_entries[] | "--extra \(.key)=\(.value | @json | @sh)"] | join(" ")' ${BINDING_CONTEXT_PATH}) + runbook_name=$(jq -r ".[$i].object.spec.runbookName" "${BINDING_CONTEXT_PATH}") + public=$(jq -r ".[$i].object.spec.public" "${BINDING_CONTEXT_PATH}") + owner=$(jq -r ".[$i].object.spec.owner" "${BINDING_CONTEXT_PATH}") + jq -r ".[$i].object.spec.steps" "${BINDING_CONTEXT_PATH}" > /tmp/steps.yaml - command_args=(baremetal runbook set "${runbook_name}" --public "${public}" --steps /tmp/steps.yaml) - if [[ -n "${owner}" && "${owner}" != "null" ]]; then - command_args+=(--owner "${owner}") - fi + # Ironic's runbook extra field is essentially a dict of dicts, representing a key values. baremetal cli allows you + # to pass in multiple --extra options, adding any you do pass. We would need to make an initial query to determine + # existing extras, and then sync the differences. This work is probably better suited to a full controller implementation. + # extra=$(jq -r '.spec.extra | [to_entries[] | "--extra \(.key)=\(.value | @json | @sh)"] | join(" ")' ${BINDING_CONTEXT_PATH}) - echo "${kind}/${resource_name} updated, running: openstack ${command_args[*]}" + command_args=(baremetal runbook set "${runbook_name}" --public "${public}" --steps /tmp/steps.yaml) + if [[ -n "${owner}" && "${owner}" != "null" ]]; then + command_args+=(--owner "${owner}") + fi - openstack "${command_args[@]}" + echo "${kind}/${resource_name} updated, running: openstack ${command_args[*]}" - fi + openstack "${command_args[@]}" + fi + done fi