From 8f43dc4a9ef818a6edc59994d25fcb2ece54492f Mon Sep 17 00:00:00 2001 From: Gabriel Date: Thu, 23 Jul 2026 15:50:39 -0400 Subject: [PATCH 1/6] Allow supported CIMC 4.2(3e) for APIC 6.1(5) (#338) Honor the APIC 6.1(5) release-note support exception for M5/M6 controllers while preserving the CSCwo74485 ordering gate and catalog failures for other versions. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- aci-preupgrade-validation-script.py | 7 +++- docs/docs/validations.md | 3 +- .../compatRsSuppHw_615_M5.json | 10 +++++ .../compatRsSuppHw_615_M6.json | 10 +++++ .../eqptCh_615_supported_423e.json | 42 +++++++++++++++++++ .../eqptCh_615_unsupported_423d.json | 22 ++++++++++ .../test_cimc_compatibilty_check.py | 35 ++++++++++++++++ 7 files changed, 127 insertions(+), 2 deletions(-) create mode 100644 tests/checks/cimc_compatibilty_check/compatRsSuppHw_615_M5.json create mode 100644 tests/checks/cimc_compatibilty_check/compatRsSuppHw_615_M6.json create mode 100644 tests/checks/cimc_compatibilty_check/eqptCh_615_supported_423e.json create mode 100644 tests/checks/cimc_compatibilty_check/eqptCh_615_unsupported_423d.json diff --git a/aci-preupgrade-validation-script.py b/aci-preupgrade-validation-script.py index 5e79f56e..8b5af5cb 100644 --- a/aci-preupgrade-validation-script.py +++ b/aci-preupgrade-validation-script.py @@ -3780,7 +3780,12 @@ def cimc_compatibilty_check(tversion, cversion, **kwargs): if compatMo and recommended_cimc: if not is_firstver_gt_secondver(current_cimc, "3.0(3a)"): warning = "Multi-step Upgrade may be required, check UCS CIMC Matrix." - if not is_firstver_gt_secondver(current_cimc, recommended_cimc): + release_note_supported = ( + tversion.simple_version == "6.1(5)" + and model in ("apicl3", "apicm3", "apicl4", "apicm4") + and current_cimc == "4.2(3e)" + ) + if not release_note_supported and not is_firstver_gt_secondver(current_cimc, recommended_cimc): nodeid = eqptCh['eqptCh']['attributes']['dn'].split('/')[2] data.append([nodeid, apic_model, current_cimc, recommended_cimc, warning]) diff --git a/docs/docs/validations.md b/docs/docs/validations.md index f7886811..e47f6b2e 100644 --- a/docs/docs/validations.md +++ b/docs/docs/validations.md @@ -260,6 +260,8 @@ The script checks the minimum recommended CIMC version for the given APIC model As the `compatRsSuppHw` object recommendation is strictly tied to the target software image, it is possible that the [Release Note Documentation][4] for your model/target version has a different recommendation than what the software recommends. Always check the release note of your Target version and APIC model to ensure you are getting the latest recommendations. +The APIC 6.1(5) release notes explicitly support CIMC 4.2(3e) on UCS C220/C240 M5 (APIC-L3/M3) and UCS C225 M6 (APIC-L4/M4). The check accepts that exact release-note-supported combination even when the image catalog recommends a newer CIMC version. + Due to the defect CSCwo74485, APIC-SERVER-M4/L4 systems will fail to boot correctly after upgrading CIMC firmware to version 4.3.5 or later while on Non-fixed APIC releases 5.3.x/6.0.9d/6.1(3g) and below. Upgrade the APIC software first, then proceed with the CIMC upgrade for the releases 6.0.9e/ 6.1.4h and above, will avoid this issue. Follow the software advisory for this defect [CSCwo74485][73]. !!! note @@ -2923,4 +2925,3 @@ Contact Cisco TAC for next steps. For more details, refer to the workaround in [ [74]: https://bst.cloudapps.cisco.com/bugsearch/bug/CSCwm42741 [75]: https://bst.cloudapps.cisco.com/bugsearch/bug/CSCwt69100 [76]: https://bst.cloudapps.cisco.com/bugsearch/bug/CSCwt38698 - diff --git a/tests/checks/cimc_compatibilty_check/compatRsSuppHw_615_M5.json b/tests/checks/cimc_compatibilty_check/compatRsSuppHw_615_M5.json new file mode 100644 index 00000000..e66e5870 --- /dev/null +++ b/tests/checks/cimc_compatibilty_check/compatRsSuppHw_615_M5.json @@ -0,0 +1,10 @@ +[ + { + "compatRsSuppHw": { + "attributes": { + "cimcVersion": "4.3(2.250016)", + "dn": "uni/fabric/compcat-default/ctlrfw-apic-6.1(5)/rssuppHw-[uni/fabric/compcat-default/ctlrhw-apicm3]" + } + } + } +] diff --git a/tests/checks/cimc_compatibilty_check/compatRsSuppHw_615_M6.json b/tests/checks/cimc_compatibilty_check/compatRsSuppHw_615_M6.json new file mode 100644 index 00000000..74f8a93e --- /dev/null +++ b/tests/checks/cimc_compatibilty_check/compatRsSuppHw_615_M6.json @@ -0,0 +1,10 @@ +[ + { + "compatRsSuppHw": { + "attributes": { + "cimcVersion": "4.3(4.252002)", + "dn": "uni/fabric/compcat-default/ctlrfw-apic-6.1(5)/rssuppHw-[uni/fabric/compcat-default/ctlrhw-apicm4]" + } + } + } +] diff --git a/tests/checks/cimc_compatibilty_check/eqptCh_615_supported_423e.json b/tests/checks/cimc_compatibilty_check/eqptCh_615_supported_423e.json new file mode 100644 index 00000000..ce34bb09 --- /dev/null +++ b/tests/checks/cimc_compatibilty_check/eqptCh_615_supported_423e.json @@ -0,0 +1,42 @@ +[ + { + "eqptCh": { + "attributes": { + "cimcVersion": "4.2(3e)", + "descr": "APIC-SERVER-L3", + "dn": "topology/pod-1/node-1/sys/ch", + "model": "APIC-SERVER-L3" + } + } + }, + { + "eqptCh": { + "attributes": { + "cimcVersion": "4.2(3e)", + "descr": "APIC-SERVER-M3", + "dn": "topology/pod-1/node-2/sys/ch", + "model": "APIC-SERVER-M3" + } + } + }, + { + "eqptCh": { + "attributes": { + "cimcVersion": "4.2(3e)", + "descr": "APIC-SERVER-L4", + "dn": "topology/pod-1/node-3/sys/ch", + "model": "APIC-SERVER-L4" + } + } + }, + { + "eqptCh": { + "attributes": { + "cimcVersion": "4.2(3e)", + "descr": "APIC-SERVER-M4", + "dn": "topology/pod-1/node-4/sys/ch", + "model": "APIC-SERVER-M4" + } + } + } +] diff --git a/tests/checks/cimc_compatibilty_check/eqptCh_615_unsupported_423d.json b/tests/checks/cimc_compatibilty_check/eqptCh_615_unsupported_423d.json new file mode 100644 index 00000000..a7cdf801 --- /dev/null +++ b/tests/checks/cimc_compatibilty_check/eqptCh_615_unsupported_423d.json @@ -0,0 +1,22 @@ +[ + { + "eqptCh": { + "attributes": { + "cimcVersion": "4.2(3d)", + "descr": "APIC-SERVER-M3", + "dn": "topology/pod-1/node-1/sys/ch", + "model": "APIC-SERVER-M3" + } + } + }, + { + "eqptCh": { + "attributes": { + "cimcVersion": "4.2(3d)", + "descr": "APIC-SERVER-M4", + "dn": "topology/pod-1/node-2/sys/ch", + "model": "APIC-SERVER-M4" + } + } + } +] diff --git a/tests/checks/cimc_compatibilty_check/test_cimc_compatibilty_check.py b/tests/checks/cimc_compatibilty_check/test_cimc_compatibilty_check.py index 4db1b7ea..6c8b14f2 100644 --- a/tests/checks/cimc_compatibilty_check/test_cimc_compatibilty_check.py +++ b/tests/checks/cimc_compatibilty_check/test_cimc_compatibilty_check.py @@ -21,10 +21,45 @@ compatRsSuppHwM4_605_api = 'uni/fabric/compcat-default/ctlrfw-apic-6.0(5)/rssuppHw-[uni/fabric/compcat-default/ctlrhw-apicm4].json' compatRsSuppHwL4_api = 'uni/fabric/compcat-default/ctlrfw-apic-6.1(5)/rssuppHw-[uni/fabric/compcat-default/ctlrhw-apicl4].json' compatRsSuppHwM4_api = 'uni/fabric/compcat-default/ctlrfw-apic-6.1(5)/rssuppHw-[uni/fabric/compcat-default/ctlrhw-apicm4].json' +compatRsSuppHwL3_api = 'uni/fabric/compcat-default/ctlrfw-apic-6.1(5)/rssuppHw-[uni/fabric/compcat-default/ctlrhw-apicl3].json' +compatRsSuppHwM3_api = 'uni/fabric/compcat-default/ctlrfw-apic-6.1(5)/rssuppHw-[uni/fabric/compcat-default/ctlrhw-apicm3].json' + +release_note_supported_615_outputs = { + eqptCh_api: read_data(dir, "eqptCh_615_supported_423e.json"), + compatRsSuppHwL3_api: read_data(dir, "compatRsSuppHw_615_M5.json"), + compatRsSuppHwM3_api: read_data(dir, "compatRsSuppHw_615_M5.json"), + compatRsSuppHwL4_api: read_data(dir, "compatRsSuppHw_615_M6.json"), + compatRsSuppHwM4_api: read_data(dir, "compatRsSuppHw_615_M6.json"), +} @pytest.mark.parametrize( "icurl_outputs, tversion, cversion, expected_result", [ + # CIMC 4.2(3e) is explicitly supported for M5/M6 APICs by the 6.1(5) release notes. + ( + release_note_supported_615_outputs, + "6.1(5e)", + "5.2(8g)", + script.PASS, + ), + # The release-note exception must not bypass the CSCwo74485 upgrade ordering check. + ( + release_note_supported_615_outputs, + "6.1(5e)", + "5.3(1d)", + script.FAIL_UF, + ), + # Other CIMC versions below the catalog recommendation remain unsupported. + ( + { + eqptCh_api: read_data(dir, "eqptCh_615_unsupported_423d.json"), + compatRsSuppHwM3_api: read_data(dir, "compatRsSuppHw_615_M5.json"), + compatRsSuppHwM4_api: read_data(dir, "compatRsSuppHw_615_M6.json"), + }, + "6.1(5e)", + "5.2(8g)", + script.FAIL_UF, + ), #m4/l4 model check and targeting affected version and cversion affected and cimc < 4.3.5 ( {eqptCh_api: read_data(dir, "eqptCh_m4l4_model_old_cimc.json"), From 5979f4637cf16a333ebdecc1f74a7ed13bf66c0b Mon Sep 17 00:00:00 2001 From: Gabriel Date: Thu, 13 Aug 2026 10:07:01 -0400 Subject: [PATCH 2/6] Expand APIC 6.1(5) CIMC release-note support --- aci-preupgrade-validation-script.py | 43 +++++++++++++++++-- docs/docs/validations.md | 2 +- .../test_cimc_compatibilty_check.py | 43 +++++++++++++++++++ 3 files changed, 83 insertions(+), 5 deletions(-) diff --git a/aci-preupgrade-validation-script.py b/aci-preupgrade-validation-script.py index 8b5af5cb..936f8e9e 100644 --- a/aci-preupgrade-validation-script.py +++ b/aci-preupgrade-validation-script.py @@ -3736,6 +3736,43 @@ def vpc_paired_switches_check(vpc_node_ids, fabric_nodes, **kwargs): return Result(result=result, headers=headers, data=data, recommended_action=recommended_action, doc_url=doc_url) +# APIC 6.1(5) release notes, verified 2026-08-10. +CIMC_RELEASE_NOTE_SUPPORT_615_M5 = ( + "4.3(2.260007)", + "4.3(2.250016)", + "4.3(2.240077)", + "4.3(2.240009)", + "4.3(2.230207)", + "4.2(3e)", + "4.2(3b)", + "4.2(2a)", + "4.1(3m)", + "4.1(3f)", + "4.1(3d)", + "4.1(3c)", +) + +CIMC_RELEASE_NOTE_SUPPORT_615_M6 = ( + "6.0(2.260044)", + "6.0(1.250192)", + "6.0(1.250131)", + "4.3(6.250053)", + "4.3(4.252002)", + "4.3(4.241063)", + "4.3(2.240009)", + "4.3(2.230207)", + "4.2(3e)", + "4.2(3b)", +) + +CIMC_RELEASE_NOTE_SUPPORT = { + ("6.1(5)", "apicl3"): CIMC_RELEASE_NOTE_SUPPORT_615_M5, + ("6.1(5)", "apicm3"): CIMC_RELEASE_NOTE_SUPPORT_615_M5, + ("6.1(5)", "apicl4"): CIMC_RELEASE_NOTE_SUPPORT_615_M6, + ("6.1(5)", "apicm4"): CIMC_RELEASE_NOTE_SUPPORT_615_M6, +} + + @check_wrapper(check_title="APIC CIMC Compatibility") def cimc_compatibilty_check(tversion, cversion, **kwargs): result = FAIL_UF @@ -3780,10 +3817,8 @@ def cimc_compatibilty_check(tversion, cversion, **kwargs): if compatMo and recommended_cimc: if not is_firstver_gt_secondver(current_cimc, "3.0(3a)"): warning = "Multi-step Upgrade may be required, check UCS CIMC Matrix." - release_note_supported = ( - tversion.simple_version == "6.1(5)" - and model in ("apicl3", "apicm3", "apicl4", "apicm4") - and current_cimc == "4.2(3e)" + release_note_supported = current_cimc in CIMC_RELEASE_NOTE_SUPPORT.get( + (tversion.simple_version, model), () ) if not release_note_supported and not is_firstver_gt_secondver(current_cimc, recommended_cimc): nodeid = eqptCh['eqptCh']['attributes']['dn'].split('/')[2] diff --git a/docs/docs/validations.md b/docs/docs/validations.md index e47f6b2e..ed80300c 100644 --- a/docs/docs/validations.md +++ b/docs/docs/validations.md @@ -260,7 +260,7 @@ The script checks the minimum recommended CIMC version for the given APIC model As the `compatRsSuppHw` object recommendation is strictly tied to the target software image, it is possible that the [Release Note Documentation][4] for your model/target version has a different recommendation than what the software recommends. Always check the release note of your Target version and APIC model to ensure you are getting the latest recommendations. -The APIC 6.1(5) release notes explicitly support CIMC 4.2(3e) on UCS C220/C240 M5 (APIC-L3/M3) and UCS C225 M6 (APIC-L4/M4). The check accepts that exact release-note-supported combination even when the image catalog recommends a newer CIMC version. +The APIC 6.1(5) release notes explicitly support multiple CIMC releases on UCS C220/C240 M5 (APIC-L3/M3) and UCS C225 M6 (APIC-L4/M4) that may be older than the image catalog recommendation. The check uses an embedded, model-specific list for those release-note-supported combinations before applying the image catalog recommendation to other CIMC releases. Due to the defect CSCwo74485, APIC-SERVER-M4/L4 systems will fail to boot correctly after upgrading CIMC firmware to version 4.3.5 or later while on Non-fixed APIC releases 5.3.x/6.0.9d/6.1(3g) and below. Upgrade the APIC software first, then proceed with the CIMC upgrade for the releases 6.0.9e/ 6.1.4h and above, will avoid this issue. Follow the software advisory for this defect [CSCwo74485][73]. diff --git a/tests/checks/cimc_compatibilty_check/test_cimc_compatibilty_check.py b/tests/checks/cimc_compatibilty_check/test_cimc_compatibilty_check.py index 6c8b14f2..1092eca9 100644 --- a/tests/checks/cimc_compatibilty_check/test_cimc_compatibilty_check.py +++ b/tests/checks/cimc_compatibilty_check/test_cimc_compatibilty_check.py @@ -32,6 +32,40 @@ compatRsSuppHwM4_api: read_data(dir, "compatRsSuppHw_615_M6.json"), } +release_note_model_data = { + "apicl3": ("APIC-SERVER-L3", compatRsSuppHwL3_api, "compatRsSuppHw_615_M5.json"), + "apicm3": ("APIC-SERVER-M3", compatRsSuppHwM3_api, "compatRsSuppHw_615_M5.json"), + "apicl4": ("APIC-SERVER-L4", compatRsSuppHwL4_api, "compatRsSuppHw_615_M6.json"), + "apicm4": ("APIC-SERVER-M4", compatRsSuppHwM4_api, "compatRsSuppHw_615_M6.json"), +} + + +def release_note_supported_outputs(model, cimc_version): + apic_model, compat_api, compat_fixture = release_note_model_data[model] + return { + eqptCh_api: [ + { + "eqptCh": { + "attributes": { + "cimcVersion": cimc_version, + "descr": apic_model, + "dn": "topology/pod-1/node-1/sys/ch", + "model": apic_model, + } + } + } + ], + compat_api: read_data(dir, compat_fixture), + } + + +release_note_supported_cases = [ + release_note_supported_outputs(model, cimc_version) + for (target, model), cimc_versions in script.CIMC_RELEASE_NOTE_SUPPORT.items() + if target == "6.1(5)" + for cimc_version in cimc_versions +] + @pytest.mark.parametrize( "icurl_outputs, tversion, cversion, expected_result", [ @@ -137,3 +171,12 @@ def test_logic(run_check, mock_icurl, tversion, cversion, expected_result): result = run_check(tversion=script.AciVersion(tversion), cversion=script.AciVersion(cversion) if cversion is not None else None) assert result.result == expected_result + + +@pytest.mark.parametrize("icurl_outputs", release_note_supported_cases) +def test_release_note_supported_versions(run_check, mock_icurl): + result = run_check( + tversion=script.AciVersion("6.1(5e)"), + cversion=script.AciVersion("5.2(8g)"), + ) + assert result.result == script.PASS From 1028194ee008fbb1f137dc2841ddd78e1ecbf6dc Mon Sep 17 00:00:00 2001 From: Gabriel Date: Fri, 7 Aug 2026 15:45:42 -0400 Subject: [PATCH 3/6] feat(ci): split integration tests with cversion/tversion override - Add resource_group for sequential execution across jobs - Split single integration test into 6 version-specific jobs: - 5.2(4d) -> 5.2(8f): 5.x internal upgrades - 5.2(4d) -> 6.0(2h): 5.x to 6.0.x upgrades - 5.2(6e) -> 6.0(5a): 5.x to 6.0.x upgrades - 5.2(8d) -> 6.1(1f): 5.x to 6.1.x upgrades - 5.3(2d) -> 6.1(4h): 5.x to 6.1.x upgrades - 6.0(2a) -> 6.1(4h): 6.x internal upgrades - Add --cversion and --tversion flags to runner.py invocation - Add timeout (45m) and retry on runner failure - Use YAML template to reduce duplication This enables testing version-dependent check logic across multiple upgrade paths while protecting scale fabrics via resource_group sequential execution. --- .gitlab-ci.yml | 85 +++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 81 insertions(+), 4 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index de14fdea..e377bac1 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -60,9 +60,13 @@ test:py38: - .cache/pip -test:integration: +# ============================================================================= +# Integration Test Template +# ============================================================================= +.integration_template: &integration_template stage: integration_test image: python:3.8.10-slim + resource_group: aci_fabric_tests before_script: - echo 'ACQUIRE {http::proxy "$apt_proxy"}' >> /etc/apt/apt.conf - echo -e "$apt_source" > /etc/apt/sources.list @@ -73,13 +77,10 @@ test:integration: - pip install virtualenv - virtualenv venv38-integration - source venv38-integration/bin/activate - script: - cd tests - 'curl --header "PRIVATE-TOKEN: $integration_repo_token" "$repo_url/requirements.txt/raw?ref=main" -o requirements.txt' - 'curl --header "PRIVATE-TOKEN: $integration_repo_token" "$repo_url/runner.py/raw?ref=main" -o runner.py' - - 'curl --header "PRIVATE-TOKEN: $integration_repo_token" "$repo_url/test_fabrics.yaml/raw?ref=main" -o test_fabrics.yaml' - pip install -r requirements.txt - - python3 runner.py -f ../aci-preupgrade-validation-script.py -i test_fabrics.yaml -k $decode_key artifacts: when: always paths: @@ -91,3 +92,79 @@ test:integration: paths: - venv38-integration/ - .cache/pip + timeout: 45m + retry: + max: 1 + when: runner_system_failure + +# ============================================================================= +# Integration Tests - 5.x Internal Upgrades +# ============================================================================= +test:integration:5.2.4d-to-5.2.8f: + <<: *integration_template + variables: + FABRIC_CVERSION: "5.2(4d)" + FABRIC_TVERSION: "5.2(8f)" + script: + - cd tests + - 'curl --header "PRIVATE-TOKEN: $integration_repo_token" "$repo_url/test_fabrics.yaml/raw?ref=main" -o test_fabrics.yaml' + - python3 runner.py -f ../aci-preupgrade-validation-script.py -i test_fabrics.yaml -k $decode_key --cversion "$FABRIC_CVERSION" --tversion "$FABRIC_TVERSION" + +# ============================================================================= +# Integration Tests - 5.x to 6.0.x Upgrades +# ============================================================================= +test:integration:5.2.4d-to-6.0.2h: + <<: *integration_template + variables: + FABRIC_CVERSION: "5.2(4d)" + FABRIC_TVERSION: "6.0(2h)" + script: + - cd tests + - 'curl --header "PRIVATE-TOKEN: $integration_repo_token" "$repo_url/test_fabrics.yaml/raw?ref=main" -o test_fabrics.yaml' + - python3 runner.py -f ../aci-preupgrade-validation-script.py -i test_fabrics.yaml -k $decode_key --cversion "$FABRIC_CVERSION" --tversion "$FABRIC_TVERSION" + +test:integration:5.2.6e-to-6.0.5a: + <<: *integration_template + variables: + FABRIC_CVERSION: "5.2(6e)" + FABRIC_TVERSION: "6.0(5a)" + script: + - cd tests + - 'curl --header "PRIVATE-TOKEN: $integration_repo_token" "$repo_url/test_fabrics.yaml/raw?ref=main" -o test_fabrics.yaml' + - python3 runner.py -f ../aci-preupgrade-validation-script.py -i test_fabrics.yaml -k $decode_key --cversion "$FABRIC_CVERSION" --tversion "$FABRIC_TVERSION" + +# ============================================================================= +# Integration Tests - 5.x to 6.1.x Upgrades +# ============================================================================= +test:integration:5.2.8d-to-6.1.1f: + <<: *integration_template + variables: + FABRIC_CVERSION: "5.2(8d)" + FABRIC_TVERSION: "6.1(1f)" + script: + - cd tests + - 'curl --header "PRIVATE-TOKEN: $integration_repo_token" "$repo_url/test_fabrics.yaml/raw?ref=main" -o test_fabrics.yaml' + - python3 runner.py -f ../aci-preupgrade-validation-script.py -i test_fabrics.yaml -k $decode_key --cversion "$FABRIC_CVERSION" --tversion "$FABRIC_TVERSION" + +test:integration:5.3.2d-to-6.1.4h: + <<: *integration_template + variables: + FABRIC_CVERSION: "5.3(2d)" + FABRIC_TVERSION: "6.1(4h)" + script: + - cd tests + - 'curl --header "PRIVATE-TOKEN: $integration_repo_token" "$repo_url/test_fabrics.yaml/raw?ref=main" -o test_fabrics.yaml' + - python3 runner.py -f ../aci-preupgrade-validation-script.py -i test_fabrics.yaml -k $decode_key --cversion "$FABRIC_CVERSION" --tversion "$FABRIC_TVERSION" + +# ============================================================================= +# Integration Tests - 6.x Internal Upgrades +# ============================================================================= +test:integration:6.0.2a-to-6.1.4h: + <<: *integration_template + variables: + FABRIC_CVERSION: "6.0(2a)" + FABRIC_TVERSION: "6.1(4h)" + script: + - cd tests + - 'curl --header "PRIVATE-TOKEN: $integration_repo_token" "$repo_url/test_fabrics.yaml/raw?ref=main" -o test_fabrics.yaml' + - python3 runner.py -f ../aci-preupgrade-validation-script.py -i test_fabrics.yaml -k $decode_key --cversion "$FABRIC_CVERSION" --tversion "$FABRIC_TVERSION" From adf97ae15d9160caea09e77c5a7187d24c6dd90e Mon Sep 17 00:00:00 2001 From: Gabriel Date: Fri, 7 Aug 2026 19:18:12 -0400 Subject: [PATCH 4/6] fix(ci): avoid duplicate integration test directory change --- .gitlab-ci.yml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e377bac1..451b79be 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -106,7 +106,6 @@ test:integration:5.2.4d-to-5.2.8f: FABRIC_CVERSION: "5.2(4d)" FABRIC_TVERSION: "5.2(8f)" script: - - cd tests - 'curl --header "PRIVATE-TOKEN: $integration_repo_token" "$repo_url/test_fabrics.yaml/raw?ref=main" -o test_fabrics.yaml' - python3 runner.py -f ../aci-preupgrade-validation-script.py -i test_fabrics.yaml -k $decode_key --cversion "$FABRIC_CVERSION" --tversion "$FABRIC_TVERSION" @@ -119,7 +118,6 @@ test:integration:5.2.4d-to-6.0.2h: FABRIC_CVERSION: "5.2(4d)" FABRIC_TVERSION: "6.0(2h)" script: - - cd tests - 'curl --header "PRIVATE-TOKEN: $integration_repo_token" "$repo_url/test_fabrics.yaml/raw?ref=main" -o test_fabrics.yaml' - python3 runner.py -f ../aci-preupgrade-validation-script.py -i test_fabrics.yaml -k $decode_key --cversion "$FABRIC_CVERSION" --tversion "$FABRIC_TVERSION" @@ -129,7 +127,6 @@ test:integration:5.2.6e-to-6.0.5a: FABRIC_CVERSION: "5.2(6e)" FABRIC_TVERSION: "6.0(5a)" script: - - cd tests - 'curl --header "PRIVATE-TOKEN: $integration_repo_token" "$repo_url/test_fabrics.yaml/raw?ref=main" -o test_fabrics.yaml' - python3 runner.py -f ../aci-preupgrade-validation-script.py -i test_fabrics.yaml -k $decode_key --cversion "$FABRIC_CVERSION" --tversion "$FABRIC_TVERSION" @@ -142,7 +139,6 @@ test:integration:5.2.8d-to-6.1.1f: FABRIC_CVERSION: "5.2(8d)" FABRIC_TVERSION: "6.1(1f)" script: - - cd tests - 'curl --header "PRIVATE-TOKEN: $integration_repo_token" "$repo_url/test_fabrics.yaml/raw?ref=main" -o test_fabrics.yaml' - python3 runner.py -f ../aci-preupgrade-validation-script.py -i test_fabrics.yaml -k $decode_key --cversion "$FABRIC_CVERSION" --tversion "$FABRIC_TVERSION" @@ -152,7 +148,6 @@ test:integration:5.3.2d-to-6.1.4h: FABRIC_CVERSION: "5.3(2d)" FABRIC_TVERSION: "6.1(4h)" script: - - cd tests - 'curl --header "PRIVATE-TOKEN: $integration_repo_token" "$repo_url/test_fabrics.yaml/raw?ref=main" -o test_fabrics.yaml' - python3 runner.py -f ../aci-preupgrade-validation-script.py -i test_fabrics.yaml -k $decode_key --cversion "$FABRIC_CVERSION" --tversion "$FABRIC_TVERSION" @@ -165,6 +160,5 @@ test:integration:6.0.2a-to-6.1.4h: FABRIC_CVERSION: "6.0(2a)" FABRIC_TVERSION: "6.1(4h)" script: - - cd tests - 'curl --header "PRIVATE-TOKEN: $integration_repo_token" "$repo_url/test_fabrics.yaml/raw?ref=main" -o test_fabrics.yaml' - python3 runner.py -f ../aci-preupgrade-validation-script.py -i test_fabrics.yaml -k $decode_key --cversion "$FABRIC_CVERSION" --tversion "$FABRIC_TVERSION" From b43f42e5a6acd7786ac107a90ec21a03f79c80ac Mon Sep 17 00:00:00 2001 From: Gabriel Date: Mon, 10 Aug 2026 08:47:02 -0400 Subject: [PATCH 5/6] fix(ci): harden integration test coverage --- .gitlab-ci.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 451b79be..601ba9c0 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -3,6 +3,7 @@ # since gitlab ci can only cache local items. variables: PIP_CACHE_DIR: "$CI_PROJECT_DIR/.cache/pip" + INTEGRATION_RUN_ID: "$CI_PROJECT_ID-$CI_PIPELINE_ID-$CI_JOB_ID" stages: - unit_test @@ -85,6 +86,7 @@ test:py38: when: always paths: - $CI_PROJECT_DIR/tests/*.log + - $CI_PROJECT_DIR/tests/*.tgz cache: key: files: @@ -97,6 +99,15 @@ test:py38: max: 1 when: runner_system_failure +# ============================================================================= +# Integration Test - Actual Fabric Versions +# ============================================================================= +test:integration:actual-current-version: + <<: *integration_template + script: + - 'curl --header "PRIVATE-TOKEN: $integration_repo_token" "$repo_url/test_fabrics.yaml/raw?ref=main" -o test_fabrics.yaml' + - python3 runner.py -f ../aci-preupgrade-validation-script.py -i test_fabrics.yaml -k $decode_key + # ============================================================================= # Integration Tests - 5.x Internal Upgrades # ============================================================================= From e9a99ea979bab28241177c6f970204fca013ba5c Mon Sep 17 00:00:00 2001 From: Gabriel Date: Thu, 13 Aug 2026 12:08:12 -0400 Subject: [PATCH 6/6] Move CIMC support constants to module configuration --- aci-preupgrade-validation-script.py | 70 ++++++++++++++--------------- 1 file changed, 33 insertions(+), 37 deletions(-) diff --git a/aci-preupgrade-validation-script.py b/aci-preupgrade-validation-script.py index 936f8e9e..30924abd 100644 --- a/aci-preupgrade-validation-script.py +++ b/aci-preupgrade-validation-script.py @@ -52,6 +52,39 @@ # message constants TVER_MISSING = "Target version not supplied. Skipping." VER_NOT_AFFECTED = "Version not affected." +# APIC 6.1(5) release notes, verified 2026-08-10. +CIMC_RELEASE_NOTE_SUPPORT_615_M5 = ( + "4.3(2.260007)", + "4.3(2.250016)", + "4.3(2.240077)", + "4.3(2.240009)", + "4.3(2.230207)", + "4.2(3e)", + "4.2(3b)", + "4.2(2a)", + "4.1(3m)", + "4.1(3f)", + "4.1(3d)", + "4.1(3c)", +) +CIMC_RELEASE_NOTE_SUPPORT_615_M6 = ( + "6.0(2.260044)", + "6.0(1.250192)", + "6.0(1.250131)", + "4.3(6.250053)", + "4.3(4.252002)", + "4.3(4.241063)", + "4.3(2.240009)", + "4.3(2.230207)", + "4.2(3e)", + "4.2(3b)", +) +CIMC_RELEASE_NOTE_SUPPORT = { + ("6.1(5)", "apicl3"): CIMC_RELEASE_NOTE_SUPPORT_615_M5, + ("6.1(5)", "apicm3"): CIMC_RELEASE_NOTE_SUPPORT_615_M5, + ("6.1(5)", "apicl4"): CIMC_RELEASE_NOTE_SUPPORT_615_M6, + ("6.1(5)", "apicm4"): CIMC_RELEASE_NOTE_SUPPORT_615_M6, +} # regex constants node_regex = r'topology/pod-(?P\d+)/node-(?P\d+)' port_regex = node_regex + r'/sys/phys-\[(?P.+)\]' @@ -3736,43 +3769,6 @@ def vpc_paired_switches_check(vpc_node_ids, fabric_nodes, **kwargs): return Result(result=result, headers=headers, data=data, recommended_action=recommended_action, doc_url=doc_url) -# APIC 6.1(5) release notes, verified 2026-08-10. -CIMC_RELEASE_NOTE_SUPPORT_615_M5 = ( - "4.3(2.260007)", - "4.3(2.250016)", - "4.3(2.240077)", - "4.3(2.240009)", - "4.3(2.230207)", - "4.2(3e)", - "4.2(3b)", - "4.2(2a)", - "4.1(3m)", - "4.1(3f)", - "4.1(3d)", - "4.1(3c)", -) - -CIMC_RELEASE_NOTE_SUPPORT_615_M6 = ( - "6.0(2.260044)", - "6.0(1.250192)", - "6.0(1.250131)", - "4.3(6.250053)", - "4.3(4.252002)", - "4.3(4.241063)", - "4.3(2.240009)", - "4.3(2.230207)", - "4.2(3e)", - "4.2(3b)", -) - -CIMC_RELEASE_NOTE_SUPPORT = { - ("6.1(5)", "apicl3"): CIMC_RELEASE_NOTE_SUPPORT_615_M5, - ("6.1(5)", "apicm3"): CIMC_RELEASE_NOTE_SUPPORT_615_M5, - ("6.1(5)", "apicl4"): CIMC_RELEASE_NOTE_SUPPORT_615_M6, - ("6.1(5)", "apicm4"): CIMC_RELEASE_NOTE_SUPPORT_615_M6, -} - - @check_wrapper(check_title="APIC CIMC Compatibility") def cimc_compatibilty_check(tversion, cversion, **kwargs): result = FAIL_UF