From a9913b2d6d3ea21b1e49b56c74c6d3166b9e4e51 Mon Sep 17 00:00:00 2001 From: simontesar Date: Tue, 20 Oct 2026 15:54:46 +0300 Subject: [PATCH 01/10] feat: skeleton for new firmware tests --- Makefile | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 1c1aa13..5525f61 100644 --- a/Makefile +++ b/Makefile @@ -20,7 +20,9 @@ TESTS := \ 10-bmcversion \ 12-force-power-off \ 11-bmcuser \ - 13-event-subscriptions + 13-event-subscriptions \ + 14-biosversion-upgrade \ + 15-bmcversion-upgrade .PHONY: help help: ## Show available targets @@ -45,6 +47,8 @@ help: ## Show available targets @echo " test/12-force-power-off (forced power off after a graceful shutdown is ignored)" @echo " test/11-bmcuser (BMCUser, BMC account create/rotate/delete)" @echo " test/13-event-subscriptions (Redfish event subscriptions via metal-maintenance-operator telemetry)" + @echo " test/14-biosversion-upgrade (BIOSVersion, BIOS firmware upgrade and downgrade)" + @echo " test/15-bmcversion-upgrade (BMCVersion, BMC firmware upgrade and downgrade)" @echo "" .PHONY: require-values From fcf3c23c9030ab84dc84a97d2f3b0138f949e8a0 Mon Sep 17 00:00:00 2001 From: simontesar Date: Wed, 21 Oct 2026 07:48:36 +0300 Subject: [PATCH 02/10] feat: add 14-biosversion-upgrade --- Makefile | 3 +- tests/14-biosversion-upgrade/biosversion.yaml | 18 ++ .../14-biosversion-upgrade/chainsaw-test.yaml | 233 ++++++++++++++++++ 3 files changed, 252 insertions(+), 2 deletions(-) create mode 100644 tests/14-biosversion-upgrade/biosversion.yaml create mode 100644 tests/14-biosversion-upgrade/chainsaw-test.yaml diff --git a/Makefile b/Makefile index 5525f61..2aa9d7c 100644 --- a/Makefile +++ b/Makefile @@ -21,8 +21,7 @@ TESTS := \ 12-force-power-off \ 11-bmcuser \ 13-event-subscriptions \ - 14-biosversion-upgrade \ - 15-bmcversion-upgrade + 14-biosversion-upgrade .PHONY: help help: ## Show available targets diff --git a/tests/14-biosversion-upgrade/biosversion.yaml b/tests/14-biosversion-upgrade/biosversion.yaml new file mode 100644 index 0000000..4d5524e --- /dev/null +++ b/tests/14-biosversion-upgrade/biosversion.yaml @@ -0,0 +1,18 @@ +apiVersion: system.metal.ironcore.dev/v1alpha1 +kind: BIOSVersion +metadata: + name: (join('-', [$bmcName, $role])) + annotations: + # Set so chainsaw can delete the resoruce when a ServerMaintenance is still + # active, after a potential failed upgrade. + metal.ironcore.dev/operation: allow-in-progress-delete +spec: + serverRef: + name: ($serverName) + version: ($version) + image: + URI: ($imageURI) + transferProtocol: ($values."14-biosversion-upgrade".transferProtocol) + serverMaintenancePolicy: Enforced + retryPolicy: + maxAttempts: 0 diff --git a/tests/14-biosversion-upgrade/chainsaw-test.yaml b/tests/14-biosversion-upgrade/chainsaw-test.yaml new file mode 100644 index 0000000..4195fed --- /dev/null +++ b/tests/14-biosversion-upgrade/chainsaw-test.yaml @@ -0,0 +1,233 @@ +# The test runs through three BIOSVersion resources: +# 1. Ensuring the baseline version as configured in biosVersion is installed. `14-biosversion-upgrade..baselineImageURI` must provide this version. +# 2. Installing 14-biosversion-upgrade.version +# 3. Restoring the baseline version +# This is necessary so that the server is kept in a clean state but also potentially deals with an earlier, interrupted test. +apiVersion: chainsaw.kyverno.io/v1alpha1 +kind: Test +metadata: + name: 14-biosversion-upgrade +spec: + concurrent: false + bindings: + - name: bmcName + value: (join('-', ['compatibility', $namespace])) + - name: serverName + value: (join('-', [$bmcName, 'system-0'])) + steps: + - name: register-bmc + try: + - apply: + file: ../shared/bmcsecret.yaml + - apply: + file: ../shared/bmc.yaml + cleanup: + - sleep: + duration: 10s + - delete: + timeout: 2m + ref: + apiVersion: metal.ironcore.dev/v1alpha1 + kind: Server + labels: + metal-operator-test-framework/namespace: ($namespace) + - name: assert-bmc-enabled + try: + - assert: + resource: + apiVersion: metal.ironcore.dev/v1alpha1 + kind: BMC + metadata: + name: ($bmcName) + status: + state: Enabled + - name: assert-server-available + try: + - assert: + resource: + apiVersion: metal.ironcore.dev/v1alpha1 + kind: Server + metadata: + name: ($serverName) + status: + state: Available + # Ensure the version expected as baseline, potentially a no-op. + - name: prepare-baseline + try: + - apply: + bindings: + - name: role + value: baseline + - name: version + value: ($values.biosVersion) + - name: imageURI + value: ($values."14-biosversion-upgrade".baselineImageURI) + file: biosversion.yaml + # Fail fast on Failed instead of waiting for the assert timeout + - assert: + timeout: 20m + resource: + apiVersion: system.metal.ironcore.dev/v1alpha1 + kind: BIOSVersion + metadata: + name: (join('-', [$bmcName, 'baseline'])) + status: + (state == 'Completed' || state == 'Failed'): true + - assert: + timeout: 5s + resource: + apiVersion: system.metal.ironcore.dev/v1alpha1 + kind: BIOSVersion + metadata: + name: (join('-', [$bmcName, 'baseline'])) + status: + state: Completed + - assert: + timeout: 15m + resource: + apiVersion: metal.ironcore.dev/v1alpha1 + kind: Server + metadata: + name: ($serverName) + (annotations."metal.ironcore.dev/operation" == null): true + status: + state: Available + biosVersion: ($values.biosVersion) + - delete: + timeout: 2m + ref: + apiVersion: system.metal.ironcore.dev/v1alpha1 + kind: BIOSVersion + name: (join('-', [$bmcName, 'baseline'])) + catch: + - describe: + apiVersion: system.metal.ironcore.dev/v1alpha1 + kind: BIOSVersion + - podLogs: + namespace: metal-maintenance-operator-system + selector: control-plane=controller-manager + tail: 200 + - name: upgrade + try: + - apply: + bindings: + - name: role + value: upgrade + - name: version + value: ($values."14-biosversion-upgrade".version) + - name: imageURI + value: ($values."14-biosversion-upgrade".imageURI) + file: biosversion.yaml + - assert: + timeout: 20m + resource: + apiVersion: system.metal.ironcore.dev/v1alpha1 + kind: BIOSVersion + metadata: + name: (join('-', [$bmcName, 'upgrade'])) + status: + (state == 'Completed' || state == 'Failed'): true + - assert: + timeout: 5s + resource: + apiVersion: system.metal.ironcore.dev/v1alpha1 + kind: BIOSVersion + metadata: + name: (join('-', [$bmcName, 'upgrade'])) + status: + state: Completed + (conditions[?type == 'VersionUpgradeIssued'] | [0].status): "True" + (conditions[?type == 'VersionUpgradeCompleted'] | [0].status): "True" + (conditions[?type == 'VersionUpgradeCompleted'] | [0].reason): UpgradeTaskCompleted + (conditions[?type == 'VersionUpgradeRebootIssued'] | [0].status): "True" + (conditions[?type == 'VersionUpgradePowerOn'] | [0].status): "True" + (conditions[?type == 'VersionUpgradeVerification'] | [0].status): "True" + upgradeTask: + (URI != ''): true + catch: + - describe: + apiVersion: system.metal.ironcore.dev/v1alpha1 + kind: BIOSVersion + - describe: + apiVersion: maintenance.metal.ironcore.dev/v1alpha1 + kind: ServerMaintenance + namespace: metal-maintenance-operator-system + - podLogs: + namespace: metal-maintenance-operator-system + selector: control-plane=controller-manager + tail: 200 + - name: assert-upgraded + try: + - assert: + timeout: 15m + resource: + apiVersion: metal.ironcore.dev/v1alpha1 + kind: Server + metadata: + name: ($serverName) + (annotations."metal.ironcore.dev/operation" == null): true + status: + state: Available + biosVersion: ($values."14-biosversion-upgrade".version) + - name: restore-baseline + try: + - delete: + timeout: 2m + ref: + apiVersion: system.metal.ironcore.dev/v1alpha1 + kind: BIOSVersion + name: (join('-', [$bmcName, 'upgrade'])) + - apply: + bindings: + - name: role + value: baseline + - name: version + value: ($values.biosVersion) + - name: imageURI + value: ($values."14-biosversion-upgrade".baselineImageURI) + file: biosversion.yaml + - assert: + timeout: 20m + resource: + apiVersion: system.metal.ironcore.dev/v1alpha1 + kind: BIOSVersion + metadata: + name: (join('-', [$bmcName, 'baseline'])) + status: + (state == 'Completed' || state == 'Failed'): true + - assert: + timeout: 5s + resource: + apiVersion: system.metal.ironcore.dev/v1alpha1 + kind: BIOSVersion + metadata: + name: (join('-', [$bmcName, 'baseline'])) + status: + state: Completed + (conditions[?type == 'VersionUpgradeIssued'] | [0].status): "True" + (conditions[?type == 'VersionUpgradeVerification'] | [0].status): "True" + - assert: + timeout: 15m + resource: + apiVersion: metal.ironcore.dev/v1alpha1 + kind: Server + metadata: + name: ($serverName) + (annotations."metal.ironcore.dev/operation" == null): true + status: + state: Available + biosVersion: ($values.biosVersion) + - delete: + timeout: 2m + ref: + apiVersion: system.metal.ironcore.dev/v1alpha1 + kind: BIOSVersion + name: (join('-', [$bmcName, 'baseline'])) + catch: + - describe: + apiVersion: system.metal.ironcore.dev/v1alpha1 + kind: BIOSVersion + - podLogs: + namespace: metal-maintenance-operator-system + selector: control-plane=controller-manager + tail: 200 From 9c538de25f6063f158bbc4cb0e718e7bf72b06df Mon Sep 17 00:00:00 2001 From: simontesar Date: Wed, 21 Oct 2026 10:17:31 +0300 Subject: [PATCH 03/10] ci: update to containerlab v0.81.1 --- .github/workflows/pr.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index fa2d0d5..d0ed108 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -44,7 +44,7 @@ jobs: chmod +x ./kind sudo mv ./kind /usr/local/bin/kind - name: Install containerlab - run: bash -c "$(curl -sL https://get.containerlab.dev)" -- -v 0.78.2 + run: bash -c "$(curl -sL https://get.containerlab.dev)" -- -v 0.81.1 - name: Install chainsaw uses: kyverno/action-install-chainsaw@v0.2.12 From 6863b0250515217909cf32dd30519d478b56f17f Mon Sep 17 00:00:00 2001 From: simontesar Date: Thu, 22 Oct 2026 09:00:01 +0300 Subject: [PATCH 04/10] feat: 15: wire test --- Makefile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 2aa9d7c..5525f61 100644 --- a/Makefile +++ b/Makefile @@ -21,7 +21,8 @@ TESTS := \ 12-force-power-off \ 11-bmcuser \ 13-event-subscriptions \ - 14-biosversion-upgrade + 14-biosversion-upgrade \ + 15-bmcversion-upgrade .PHONY: help help: ## Show available targets From bc19df4d37510a57841848bc30b99caf2088c49e Mon Sep 17 00:00:00 2001 From: simontesar Date: Thu, 22 Oct 2026 09:00:15 +0300 Subject: [PATCH 05/10] feat: 15: add first version of BMCVersion upgrade test --- tests/15-bmcversion-upgrade/bmcversion.yaml | 21 ++ .../15-bmcversion-upgrade/chainsaw-test.yaml | 265 ++++++++++++++++++ 2 files changed, 286 insertions(+) create mode 100644 tests/15-bmcversion-upgrade/bmcversion.yaml create mode 100644 tests/15-bmcversion-upgrade/chainsaw-test.yaml diff --git a/tests/15-bmcversion-upgrade/bmcversion.yaml b/tests/15-bmcversion-upgrade/bmcversion.yaml new file mode 100644 index 0000000..c094959 --- /dev/null +++ b/tests/15-bmcversion-upgrade/bmcversion.yaml @@ -0,0 +1,21 @@ +# One BMCVersion template for the baseline, upgrade and restore steps; each +# apply binds $role, $version and $imageURI. +apiVersion: baseboard.metal.ironcore.dev/v1alpha1 +kind: BMCVersion +metadata: + name: (join('-', [$bmcName, $role])) + annotations: + # Lets chainsaw's cleanup delete the resource while its ServerMaintenances + # are still active, e.g. after a failed upgrade. + metal.ironcore.dev/operation: allow-in-progress-delete +spec: + bmcRef: + name: ($bmcName) + version: ($version) + image: + URI: ($imageURI) + transferProtocol: ($values."15-bmcversion-upgrade".transferProtocol) + serverMaintenancePolicy: Enforced + # Surface a failed upgrade instead of retrying it + retryPolicy: + maxAttempts: 0 diff --git a/tests/15-bmcversion-upgrade/chainsaw-test.yaml b/tests/15-bmcversion-upgrade/chainsaw-test.yaml new file mode 100644 index 0000000..ff3b243 --- /dev/null +++ b/tests/15-bmcversion-upgrade/chainsaw-test.yaml @@ -0,0 +1,265 @@ +# Upgrades the BMC firmware through a BMCVersion and downgrades it again to +# restore the baseline. The metal-maintenance-operator puts the BMC's servers +# into maintenance, resets the BMC, checks the FirmwareInventory for staged BMC +# updates, issues UpdateService.SimpleUpdate, polls the returned task, resets +# the BMC to activate the firmware and verifies Manager.FirmwareVersion. +apiVersion: chainsaw.kyverno.io/v1alpha1 +kind: Test +metadata: + name: 15-bmcversion-upgrade +spec: + concurrent: false + bindings: + - name: bmcName + value: (join('-', ['compatibility', $namespace])) + - name: serverName + value: (join('-', [$bmcName, 'system-0'])) + steps: + - name: register-bmc + try: + - apply: + file: ../shared/bmcsecret.yaml + - apply: + file: ../shared/bmc.yaml + cleanup: + - sleep: + duration: 10s + - delete: + timeout: 2m + ref: + apiVersion: metal.ironcore.dev/v1alpha1 + kind: Server + labels: + metal-operator-test-framework/namespace: ($namespace) + - name: assert-bmc-enabled + try: + - assert: + resource: + apiVersion: metal.ironcore.dev/v1alpha1 + kind: BMC + metadata: + name: ($bmcName) + status: + state: Enabled + - name: assert-server-available + try: + - assert: + resource: + apiVersion: metal.ironcore.dev/v1alpha1 + kind: Server + metadata: + name: ($serverName) + status: + state: Available + # Ensure the BMC runs the baseline version so that a run after an aborted + # earlier run still upgrades. Usually a no-op, otherwise a downgrade. + - name: prepare-baseline + try: + - apply: + bindings: + - name: role + value: baseline + - name: version + value: ($values.firmwareVersion) + - name: imageURI + value: ($values."15-bmcversion-upgrade".baselineImageURI) + file: bmcversion.yaml + # Fail fast on Failed instead of waiting for the assert timeout + - assert: + timeout: 20m + resource: + apiVersion: baseboard.metal.ironcore.dev/v1alpha1 + kind: BMCVersion + metadata: + name: (join('-', [$bmcName, 'baseline'])) + status: + (state == 'Completed' || state == 'Failed'): true + - assert: + timeout: 5s + resource: + apiVersion: baseboard.metal.ironcore.dev/v1alpha1 + kind: BMCVersion + metadata: + name: (join('-', [$bmcName, 'baseline'])) + status: + state: Completed + - assert: + timeout: 5m + resource: + apiVersion: metal.ironcore.dev/v1alpha1 + kind: BMC + metadata: + name: ($bmcName) + status: + state: Enabled + firmwareVersion: ($values.firmwareVersion) + - assert: + timeout: 15m + resource: + apiVersion: metal.ironcore.dev/v1alpha1 + kind: Server + metadata: + name: ($serverName) + (annotations."metal.ironcore.dev/operation" == null): true + status: + state: Available + - delete: + timeout: 2m + ref: + apiVersion: baseboard.metal.ironcore.dev/v1alpha1 + kind: BMCVersion + name: (join('-', [$bmcName, 'baseline'])) + catch: + - describe: + apiVersion: baseboard.metal.ironcore.dev/v1alpha1 + kind: BMCVersion + - podLogs: + namespace: metal-maintenance-operator-system + selector: control-plane=controller-manager + tail: 200 + - name: upgrade + try: + - apply: + bindings: + - name: role + value: upgrade + - name: version + value: ($values."15-bmcversion-upgrade".version) + - name: imageURI + value: ($values."15-bmcversion-upgrade".imageURI) + file: bmcversion.yaml + - assert: + timeout: 20m + resource: + apiVersion: baseboard.metal.ironcore.dev/v1alpha1 + kind: BMCVersion + metadata: + name: (join('-', [$bmcName, 'upgrade'])) + status: + (state == 'Completed' || state == 'Failed'): true + - assert: + timeout: 5s + resource: + apiVersion: baseboard.metal.ironcore.dev/v1alpha1 + kind: BMCVersion + metadata: + name: (join('-', [$bmcName, 'upgrade'])) + status: + state: Completed + # The upgrade was issued after the pending check, the task + # completed, the BMC was reset and FirmwareVersion changed. The + # activating reset clears status.upgradeTask. + (conditions[?type == 'ResetIssued'] | [0].status): "True" + (conditions[?type == 'VersionUpgradeIssued'] | [0].status): "True" + (conditions[?type == 'VersionUpgradeCompleted'] | [0].status): "True" + (conditions[?type == 'VersionUpgradeCompleted'] | [0].reason): UpgradeTaskCompleted + (conditions[?type == 'VersionUpgradeReboot'] | [0].status): "True" + (conditions[?type == 'VersionUpgradeVerification'] | [0].status): "True" + catch: + - describe: + apiVersion: baseboard.metal.ironcore.dev/v1alpha1 + kind: BMCVersion + - describe: + apiVersion: maintenance.metal.ironcore.dev/v1alpha1 + kind: ServerMaintenance + namespace: metal-maintenance-operator-system + - podLogs: + namespace: metal-maintenance-operator-system + selector: control-plane=controller-manager + tail: 200 + - name: assert-upgraded + try: + - assert: + timeout: 5m + resource: + apiVersion: metal.ironcore.dev/v1alpha1 + kind: BMC + metadata: + name: ($bmcName) + status: + state: Enabled + firmwareVersion: ($values."15-bmcversion-upgrade".version) + - assert: + timeout: 15m + resource: + apiVersion: metal.ironcore.dev/v1alpha1 + kind: Server + metadata: + name: ($serverName) + (annotations."metal.ironcore.dev/operation" == null): true + status: + state: Available + # Downgrades to the baseline so other tests keep finding the BMC firmware + # version they expect. + - name: restore-baseline + try: + - delete: + timeout: 2m + ref: + apiVersion: baseboard.metal.ironcore.dev/v1alpha1 + kind: BMCVersion + name: (join('-', [$bmcName, 'upgrade'])) + - apply: + bindings: + - name: role + value: baseline + - name: version + value: ($values.firmwareVersion) + - name: imageURI + value: ($values."15-bmcversion-upgrade".baselineImageURI) + file: bmcversion.yaml + - assert: + timeout: 20m + resource: + apiVersion: baseboard.metal.ironcore.dev/v1alpha1 + kind: BMCVersion + metadata: + name: (join('-', [$bmcName, 'baseline'])) + status: + (state == 'Completed' || state == 'Failed'): true + - assert: + timeout: 5s + resource: + apiVersion: baseboard.metal.ironcore.dev/v1alpha1 + kind: BMCVersion + metadata: + name: (join('-', [$bmcName, 'baseline'])) + status: + state: Completed + # A real downgrade ran, not a no-op + (conditions[?type == 'VersionUpgradeIssued'] | [0].status): "True" + (conditions[?type == 'VersionUpgradeVerification'] | [0].status): "True" + - assert: + timeout: 5m + resource: + apiVersion: metal.ironcore.dev/v1alpha1 + kind: BMC + metadata: + name: ($bmcName) + status: + state: Enabled + firmwareVersion: ($values.firmwareVersion) + - assert: + timeout: 15m + resource: + apiVersion: metal.ironcore.dev/v1alpha1 + kind: Server + metadata: + name: ($serverName) + (annotations."metal.ironcore.dev/operation" == null): true + status: + state: Available + - delete: + timeout: 2m + ref: + apiVersion: baseboard.metal.ironcore.dev/v1alpha1 + kind: BMCVersion + name: (join('-', [$bmcName, 'baseline'])) + catch: + - describe: + apiVersion: baseboard.metal.ironcore.dev/v1alpha1 + kind: BMCVersion + - podLogs: + namespace: metal-maintenance-operator-system + selector: control-plane=controller-manager + tail: 200 From 8a294d1cb6d47a39602f91b41699e1543de15af5 Mon Sep 17 00:00:00 2001 From: simontesar Date: Thu, 22 Oct 2026 12:46:21 +0300 Subject: [PATCH 06/10] fix: 14: typo in comment --- tests/14-biosversion-upgrade/chainsaw-test.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/14-biosversion-upgrade/chainsaw-test.yaml b/tests/14-biosversion-upgrade/chainsaw-test.yaml index 4195fed..5729a3d 100644 --- a/tests/14-biosversion-upgrade/chainsaw-test.yaml +++ b/tests/14-biosversion-upgrade/chainsaw-test.yaml @@ -1,5 +1,5 @@ # The test runs through three BIOSVersion resources: -# 1. Ensuring the baseline version as configured in biosVersion is installed. `14-biosversion-upgrade..baselineImageURI` must provide this version. +# 1. Ensuring the baseline version as configured in biosVersion is installed. `14-biosversion-upgrade.baselineImageURI` must provide this version. # 2. Installing 14-biosversion-upgrade.version # 3. Restoring the baseline version # This is necessary so that the server is kept in a clean state but also potentially deals with an earlier, interrupted test. From da009c8bfc7b1f272f4c400c333ee1f2a0801e65 Mon Sep 17 00:00:00 2001 From: simontesar Date: Thu, 22 Oct 2026 12:46:36 +0300 Subject: [PATCH 07/10] doc: 15: update comments --- tests/15-bmcversion-upgrade/bmcversion.yaml | 7 ++----- .../15-bmcversion-upgrade/chainsaw-test.yaml | 19 ++++++------------- 2 files changed, 8 insertions(+), 18 deletions(-) diff --git a/tests/15-bmcversion-upgrade/bmcversion.yaml b/tests/15-bmcversion-upgrade/bmcversion.yaml index c094959..2e16fc7 100644 --- a/tests/15-bmcversion-upgrade/bmcversion.yaml +++ b/tests/15-bmcversion-upgrade/bmcversion.yaml @@ -1,12 +1,10 @@ -# One BMCVersion template for the baseline, upgrade and restore steps; each -# apply binds $role, $version and $imageURI. apiVersion: baseboard.metal.ironcore.dev/v1alpha1 kind: BMCVersion metadata: name: (join('-', [$bmcName, $role])) annotations: - # Lets chainsaw's cleanup delete the resource while its ServerMaintenances - # are still active, e.g. after a failed upgrade. + # Set so chainsaw can delete the resoruce when a ServerMaintenance is still + # active, after a potential failed upgrade. metal.ironcore.dev/operation: allow-in-progress-delete spec: bmcRef: @@ -16,6 +14,5 @@ spec: URI: ($imageURI) transferProtocol: ($values."15-bmcversion-upgrade".transferProtocol) serverMaintenancePolicy: Enforced - # Surface a failed upgrade instead of retrying it retryPolicy: maxAttempts: 0 diff --git a/tests/15-bmcversion-upgrade/chainsaw-test.yaml b/tests/15-bmcversion-upgrade/chainsaw-test.yaml index ff3b243..79a2c83 100644 --- a/tests/15-bmcversion-upgrade/chainsaw-test.yaml +++ b/tests/15-bmcversion-upgrade/chainsaw-test.yaml @@ -1,8 +1,8 @@ -# Upgrades the BMC firmware through a BMCVersion and downgrades it again to -# restore the baseline. The metal-maintenance-operator puts the BMC's servers -# into maintenance, resets the BMC, checks the FirmwareInventory for staged BMC -# updates, issues UpdateService.SimpleUpdate, polls the returned task, resets -# the BMC to activate the firmware and verifies Manager.FirmwareVersion. +# The test runs through three BMCVersion resources: +# 1. Ensuring the baseline version as configured in bmcVersion is installed. `15-bmcversion-upgrade.baselineImageURI` must provide this version. +# 2. Installing 15-bmcversion-upgrade.version +# 3. Restoring the baseline version +# This is necessary so that the server is kept in a clean state but also potentially deals with an earlier, interrupted test. apiVersion: chainsaw.kyverno.io/v1alpha1 kind: Test metadata: @@ -51,8 +51,7 @@ spec: name: ($serverName) status: state: Available - # Ensure the BMC runs the baseline version so that a run after an aborted - # earlier run still upgrades. Usually a no-op, otherwise a downgrade. + # Ensure the version expected as baseline, potentially a no-op. - name: prepare-baseline try: - apply: @@ -146,9 +145,6 @@ spec: name: (join('-', [$bmcName, 'upgrade'])) status: state: Completed - # The upgrade was issued after the pending check, the task - # completed, the BMC was reset and FirmwareVersion changed. The - # activating reset clears status.upgradeTask. (conditions[?type == 'ResetIssued'] | [0].status): "True" (conditions[?type == 'VersionUpgradeIssued'] | [0].status): "True" (conditions[?type == 'VersionUpgradeCompleted'] | [0].status): "True" @@ -189,8 +185,6 @@ spec: (annotations."metal.ironcore.dev/operation" == null): true status: state: Available - # Downgrades to the baseline so other tests keep finding the BMC firmware - # version they expect. - name: restore-baseline try: - delete: @@ -226,7 +220,6 @@ spec: name: (join('-', [$bmcName, 'baseline'])) status: state: Completed - # A real downgrade ran, not a no-op (conditions[?type == 'VersionUpgradeIssued'] | [0].status): "True" (conditions[?type == 'VersionUpgradeVerification'] | [0].status): "True" - assert: From ff0616c46f8962640f02911be4e8d0c3512e550f Mon Sep 17 00:00:00 2001 From: simontesar Date: Fri, 23 Oct 2026 06:16:09 +0300 Subject: [PATCH 08/10] feat: update docs for 14 and 15 --- README.md | 10 ++++++++++ capability-matrix.md | 4 ++-- coverage.md | 18 ++++++++++-------- 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index dbd1bb0..6479161 100644 --- a/README.md +++ b/README.md @@ -57,6 +57,16 @@ biosVersion: "1.0.0" testMessageId: "TestEventId" # a MessageId your BMC accepts in SubmitTestEvent, e.g. "SYS1000" on Dell iDRAC testSeverity: "OK" testOriginOfCondition: "/redfish/v1/Managers/1" +14-biosversion-upgrade: + transferProtocol: HTTP + baselineImageURI: "http://repo.example.com/bios-1.0.0.bin" # installs biosVersion, restored after the test + version: "1.1.0" + imageURI: "http://repo.example.com/bios-1.1.0.bin" +15-bmcversion-upgrade: + transferProtocol: HTTP + baselineImageURI: "http://repo.example.com/bmc-1.0.0.bin" # installs firmwareVersion, restored after the test + version: "1.1.0" + imageURI: "http://repo.example.com/bmc-1.1.0.bin" ``` Adjust the credentials and expectations to your respective values and point the tests to it: diff --git a/capability-matrix.md b/capability-matrix.md index b80c7af..9578e07 100644 --- a/capability-matrix.md +++ b/capability-matrix.md @@ -76,9 +76,9 @@ Which Chainsaw tests cover each capability is tracked in the [coverage document] | Capability id | `BMC` method | Level | Redfish API | Redfish request body | |--------------------------|-----------------------------------|:--------:|-----------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------| -| `firmware.bios.upgrade` | `UpgradeBiosVersion` | OPTIONAL | `POST` `#UpdateService.SimpleUpdate` | `{"ImageURI": "", "TransferProtocol": "", "Targets": [""], "@Redfish.OperationApplyTime": "Immediate"}` | +| `firmware.bios.upgrade` | `UpgradeBiosVersion` | OPTIONAL | `POST` `#UpdateService.SimpleUpdate` | `{"ImageURI": "", "TransferProtocol": ""}` - see below | | `firmware.bios.task` | `GetBiosUpgradeTask` | OPTIONAL | `GET` task monitor / `TaskService` `Task` (`TaskState`, `TaskStatus`) | - | -| `firmware.bmc.upgrade` | `UpgradeBMCVersion` | OPTIONAL | `POST` `#UpdateService.SimpleUpdate` | `{"ImageURI": "", "TransferProtocol": "", "Targets": [""], "@Redfish.OperationApplyTime": "Immediate"}` | +| `firmware.bmc.upgrade` | `UpgradeBMCVersion` | OPTIONAL | `POST` `#UpdateService.SimpleUpdate` | `{"ImageURI": "", "TransferProtocol": ""}` - see below | | `firmware.bmc.task` | `GetBMCUpgradeTask` | OPTIONAL | `GET` task monitor / `Task` | - | | `firmware.pending-check` | `CheckBMCPendingComponentUpgrade` | OPTIONAL | `GET` `UpdateService/FirmwareInventory` | - | diff --git a/coverage.md b/coverage.md index 6c676da..bac4cb4 100644 --- a/coverage.md +++ b/coverage.md @@ -34,6 +34,8 @@ These rows/capabilities include the following placeholders in their `test` field | `tests/11-bmcuser` | `BMC Registration`, `account.service`, `account.list`, `account.create-update`, `account.delete` | | `tests/12-force-power-off` | `BMC Registration`, `Discovery`, `power.on`, `power.off-graceful`, `power.off-force`, `power.wait-state`, `boot.override-pxe` | | `tests/13-event-subscriptions` | `BMC Registration`, `events.subscribe`, `events.unsubscribe`, `events.list`, `events.test-event`, `events.delivery` | +| `tests/14-biosversion-upgrade` | `BMC Registration`, `Discovery`, `bios.version`, `manager.reset`, `firmware.pending-check`, `firmware.bios.upgrade`, `firmware.bios.task` | +| `tests/15-bmcversion-upgrade` | `BMC Registration`, `Discovery`, `bmc.version`, `manager.reset`, `firmware.pending-check`, `firmware.bmc.upgrade`, `firmware.bmc.task` | ## Coverage by capability @@ -51,24 +53,24 @@ These rows/capabilities include the following placeholders in their `test` field | `inventory.system-info` | `BMC Registration` | yes | | `inventory.processors` | `Discovery` | yes | | `inventory.storages` | `Discovery` | no | -| `bios.version` | `Discovery`, `tests/06-biossettings-noreboot`, `tests/07-biossettings-reboot` | yes | +| `bios.version` | `Discovery`, `tests/06-biossettings-noreboot`, `tests/07-biossettings-reboot`, `tests/14-biosversion-upgrade` | yes | | `bios.attr-get` | `tests/06-biossettings-noreboot`, `tests/07-biossettings-reboot` | yes | | `bios.attr-pending` | `tests/06-biossettings-noreboot`, `tests/07-biossettings-reboot` | yes | | `bios.attr-set-on-reset` | `tests/06-biossettings-noreboot`, `tests/07-biossettings-reboot` | yes | | `bios.attr-check` | `tests/06-biossettings-noreboot`, `tests/07-biossettings-reboot` | yes | -| `bmc.version` | `tests/10-bmcversion` | yes | +| `bmc.version` | `tests/10-bmcversion`, `tests/15-bmcversion-upgrade` | yes | | `bmc-settings.attr-get` | `tests/08-bmcsettings` | yes | | `bmc-settings.attr-pending` | `tests/08-bmcsettings` | no | | `bmc-settings.set-immediate` | `tests/08-bmcsettings` | yes | | `bmc-settings.attr-check` | `tests/08-bmcsettings` | no | -| `firmware.bios.upgrade` | uncovered | - | -| `firmware.bios.task` | uncovered | - | -| `firmware.bmc.upgrade` | uncovered | - | -| `firmware.bmc.task` | uncovered | - | -| `firmware.pending-check` | uncovered | - | +| `firmware.bios.upgrade` | `tests/14-biosversion-upgrade` | yes | +| `firmware.bios.task` | `tests/14-biosversion-upgrade` See **[2]** | no | +| `firmware.bmc.upgrade` | `tests/15-bmcversion-upgrade` | yes | +| `firmware.bmc.task` | `tests/15-bmcversion-upgrade` See **[2]** | no | +| `firmware.pending-check` | `tests/14-biosversion-upgrade`, `tests/15-bmcversion-upgrade` See **[1]** | no | | `manager.get` | `BMC Registration` | yes | | `manager.discover` | uncovered | - | -| `manager.reset` | `tests/04-bmc-reset` | no | +| `manager.reset` | `tests/04-bmc-reset`, `tests/14-biosversion-upgrade`, `tests/15-bmcversion-upgrade` | no | | `account.create-update` | `tests/11-bmcuser` | yes | | `account.delete` | `tests/11-bmcuser` | yes | | `account.list` | `tests/11-bmcuser` | yes | From 9da44a07a09f717aba7067968c0e88663ea8b2d9 Mon Sep 17 00:00:00 2001 From: simontesar Date: Mon, 26 Oct 2026 07:43:06 +0200 Subject: [PATCH 09/10] doc: remove unused footnotes and align tables --- coverage.md | 82 ++++++++++++++++++++++++++--------------------------- 1 file changed, 41 insertions(+), 41 deletions(-) diff --git a/coverage.md b/coverage.md index bac4cb4..0631d8e 100644 --- a/coverage.md +++ b/coverage.md @@ -39,48 +39,48 @@ These rows/capabilities include the following placeholders in their `test` field ## Coverage by capability -| Capability ID | Covered by | Verified | -|------------------------------|-------------------------------------------------------------------------------|:--------:| -| `power.on` | `Discovery` | yes | -| `power.off-graceful` | `Discovery` | yes | -| `power.off-force` | `tests/12-force-power-off`, `tests/03-power-annotation` See **[0]** | yes | -| `power.reset` | `tests/03-power-annotation` | no | -| `power.wait-state` | `Discovery` | yes | -| `boot.override-pxe` | `Discovery` | yes | -| `boot.order-get` | `tests/09-persistent-boot-order` | yes | -| `boot.order-set` | `tests/09-persistent-boot-order` | yes | -| `inventory.systems` | `BMC Registration` | yes | -| `inventory.system-info` | `BMC Registration` | yes | -| `inventory.processors` | `Discovery` | yes | -| `inventory.storages` | `Discovery` | no | +| Capability ID | Covered by | Verified | +|------------------------------|---------------------------------------------------------------------------------------------------------------|:--------:| +| `power.on` | `Discovery` | yes | +| `power.off-graceful` | `Discovery` | yes | +| `power.off-force` | `tests/12-force-power-off`, `tests/03-power-annotation` See **[0]** | yes | +| `power.reset` | `tests/03-power-annotation` | no | +| `power.wait-state` | `Discovery` | yes | +| `boot.override-pxe` | `Discovery` | yes | +| `boot.order-get` | `tests/09-persistent-boot-order` | yes | +| `boot.order-set` | `tests/09-persistent-boot-order` | yes | +| `inventory.systems` | `BMC Registration` | yes | +| `inventory.system-info` | `BMC Registration` | yes | +| `inventory.processors` | `Discovery` | yes | +| `inventory.storages` | `Discovery` | no | | `bios.version` | `Discovery`, `tests/06-biossettings-noreboot`, `tests/07-biossettings-reboot`, `tests/14-biosversion-upgrade` | yes | -| `bios.attr-get` | `tests/06-biossettings-noreboot`, `tests/07-biossettings-reboot` | yes | -| `bios.attr-pending` | `tests/06-biossettings-noreboot`, `tests/07-biossettings-reboot` | yes | -| `bios.attr-set-on-reset` | `tests/06-biossettings-noreboot`, `tests/07-biossettings-reboot` | yes | -| `bios.attr-check` | `tests/06-biossettings-noreboot`, `tests/07-biossettings-reboot` | yes | -| `bmc.version` | `tests/10-bmcversion`, `tests/15-bmcversion-upgrade` | yes | -| `bmc-settings.attr-get` | `tests/08-bmcsettings` | yes | -| `bmc-settings.attr-pending` | `tests/08-bmcsettings` | no | -| `bmc-settings.set-immediate` | `tests/08-bmcsettings` | yes | -| `bmc-settings.attr-check` | `tests/08-bmcsettings` | no | -| `firmware.bios.upgrade` | `tests/14-biosversion-upgrade` | yes | -| `firmware.bios.task` | `tests/14-biosversion-upgrade` See **[2]** | no | -| `firmware.bmc.upgrade` | `tests/15-bmcversion-upgrade` | yes | -| `firmware.bmc.task` | `tests/15-bmcversion-upgrade` See **[2]** | no | -| `firmware.pending-check` | `tests/14-biosversion-upgrade`, `tests/15-bmcversion-upgrade` See **[1]** | no | -| `manager.get` | `BMC Registration` | yes | -| `manager.discover` | uncovered | - | -| `manager.reset` | `tests/04-bmc-reset`, `tests/14-biosversion-upgrade`, `tests/15-bmcversion-upgrade` | no | -| `account.create-update` | `tests/11-bmcuser` | yes | -| `account.delete` | `tests/11-bmcuser` | yes | -| `account.list` | `tests/11-bmcuser` | yes | -| `account.service` | `tests/11-bmcuser` | yes | -| `indicator.set-led` | `tests/05-indicator-led` | yes | -| `events.subscribe` | `tests/13-event-subscriptions` | yes | -| `events.unsubscribe` | `tests/13-event-subscriptions` | yes | -| `events.list` | `tests/13-event-subscriptions` | yes | -| `events.test-event` | `tests/13-event-subscriptions` | yes | -| `events.delivery` | `tests/13-event-subscriptions` | yes | +| `bios.attr-get` | `tests/06-biossettings-noreboot`, `tests/07-biossettings-reboot` | yes | +| `bios.attr-pending` | `tests/06-biossettings-noreboot`, `tests/07-biossettings-reboot` | yes | +| `bios.attr-set-on-reset` | `tests/06-biossettings-noreboot`, `tests/07-biossettings-reboot` | yes | +| `bios.attr-check` | `tests/06-biossettings-noreboot`, `tests/07-biossettings-reboot` | yes | +| `bmc.version` | `tests/10-bmcversion`, `tests/15-bmcversion-upgrade` | yes | +| `bmc-settings.attr-get` | `tests/08-bmcsettings` | yes | +| `bmc-settings.attr-pending` | `tests/08-bmcsettings` | no | +| `bmc-settings.set-immediate` | `tests/08-bmcsettings` | yes | +| `bmc-settings.attr-check` | `tests/08-bmcsettings` | no | +| `firmware.bios.upgrade` | `tests/14-biosversion-upgrade` | yes | +| `firmware.bios.task` | `tests/14-biosversion-upgrade` | no | +| `firmware.bmc.upgrade` | `tests/15-bmcversion-upgrade` | yes | +| `firmware.bmc.task` | `tests/15-bmcversion-upgrade` | no | +| `firmware.pending-check` | `tests/14-biosversion-upgrade`, `tests/15-bmcversion-upgrade` | no | +| `manager.get` | `BMC Registration` | yes | +| `manager.discover` | uncovered | - | +| `manager.reset` | `tests/04-bmc-reset`, `tests/14-biosversion-upgrade`, `tests/15-bmcversion-upgrade` | no | +| `account.create-update` | `tests/11-bmcuser` | yes | +| `account.delete` | `tests/11-bmcuser` | yes | +| `account.list` | `tests/11-bmcuser` | yes | +| `account.service` | `tests/11-bmcuser` | yes | +| `indicator.set-led` | `tests/05-indicator-led` | yes | +| `events.subscribe` | `tests/13-event-subscriptions` | yes | +| `events.unsubscribe` | `tests/13-event-subscriptions` | yes | +| `events.list` | `tests/13-event-subscriptions` | yes | +| `events.test-event` | `tests/13-event-subscriptions` | yes | +| `events.delivery` | `tests/13-event-subscriptions` | yes | #### Footnotes **[0]**: The test is using the `Reset`-method of the `BMC` interface, but the result is the same capability being tested as using the `ForcePowerOff`-method. From a28dd8fb36a3ad5b64d57049ded36ecdb1f6790a Mon Sep 17 00:00:00 2001 From: simontesar Date: Mon, 26 Oct 2026 07:46:24 +0200 Subject: [PATCH 10/10] doc: clarify firmware/bios URL --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 6479161..9c72b0c 100644 --- a/README.md +++ b/README.md @@ -59,14 +59,14 @@ biosVersion: "1.0.0" testOriginOfCondition: "/redfish/v1/Managers/1" 14-biosversion-upgrade: transferProtocol: HTTP - baselineImageURI: "http://repo.example.com/bios-1.0.0.bin" # installs biosVersion, restored after the test + baselineImageURI: "http://repo.example.com/bios-1.0.0.bin" # The URL to the current BIOS image. Will be flashed at least once during the test version: "1.1.0" - imageURI: "http://repo.example.com/bios-1.1.0.bin" + imageURI: "http://repo.example.com/bios-1.1.0.bin" # The URL to the new BIOS version that will be flashed during the test 15-bmcversion-upgrade: transferProtocol: HTTP - baselineImageURI: "http://repo.example.com/bmc-1.0.0.bin" # installs firmwareVersion, restored after the test + baselineImageURI: "http://repo.example.com/bmc-1.0.0.bin" # The URL to the current BMC firmware image. Will be flashed at least once during the test version: "1.1.0" - imageURI: "http://repo.example.com/bmc-1.1.0.bin" + imageURI: "http://repo.example.com/bmc-1.1.0.bin" # The URL to the new BMC firmware image ``` Adjust the credentials and expectations to your respective values and point the tests to it: