From b0da7a5cc81820cea0840141cf62863ddb6e47eb Mon Sep 17 00:00:00 2001 From: Gabriel Date: Fri, 24 Jul 2026 09:29:24 -0400 Subject: [PATCH 1/6] Added validation for low RTC battery fault F2421 (#351) Block upgrades when an active F2421 reports the exact RTC battery voltage low reason, while ignoring stale and unrelated fault instances. Include issue-derived coverage and validation guidance. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- aci-preupgrade-validation-script.py | 54 +++++++++++++ docs/docs/validations.md | 13 +++- .../rtc_battery_voltage_low_check/f2421.json | 37 +++++++++ .../test_rtc_battery_voltage_low_check.py | 78 +++++++++++++++++++ 4 files changed, 179 insertions(+), 3 deletions(-) create mode 100644 tests/checks/rtc_battery_voltage_low_check/f2421.json create mode 100644 tests/checks/rtc_battery_voltage_low_check/test_rtc_battery_voltage_low_check.py diff --git a/aci-preupgrade-validation-script.py b/aci-preupgrade-validation-script.py index 5e79f56e..64bf2aa5 100644 --- a/aci-preupgrade-validation-script.py +++ b/aci-preupgrade-validation-script.py @@ -6404,6 +6404,59 @@ def apic_storage_inode_check(**kwargs): return Result(result=result, headers=headers, data=data, unformatted_headers=unformatted_headers, unformatted_data=unformatted_data, recommended_action=recommended_action, doc_url=doc_url) +@check_wrapper(check_title="Switch RTC Battery Voltage (F2421 equipment-diags-failed)") +def rtc_battery_voltage_low_check(**kwargs): + result = FAIL_UF + headers = ['Fault', 'Pod', 'Node', 'Supervisor', 'Severity', 'Lifecycle'] + data = [] + unformatted_headers = ['Fault', 'Fault DN', 'Description', 'Severity', 'Lifecycle'] + unformatted_data = [] + recommended_action = 'Contact Cisco TAC to replace the RTC battery before upgrading or power cycling the affected switch' + doc_url = 'https://datacenter.github.io/ACI-Pre-Upgrade-Validation-Script/validations/#switch-rtc-battery-voltage' + dn_regex = node_regex + r'/.+/supslot-(?P\d+)/sup\]/fault-F2421$' + fault_reason = 'The RTC battery voltage is low' + fault_api = 'faultInst.json?query-target-filter=and(eq(faultInst.code,"F2421"),wcard(faultInst.descr,"reason:The RTC battery voltage is low"))' + + faultInsts = icurl('class', fault_api) + for faultInst in faultInsts: + attributes = faultInst['faultInst']['attributes'] + lc = attributes['lc'] + if lc not in ['raised', 'soaking']: + continue + description = attributes['descr'] + if 'reason:' not in description or description.split('reason:', 1)[1] != fault_reason: + continue + dn = re.search(dn_regex, attributes['dn']) + if dn: + data.append([ + attributes['code'], + dn.group('pod'), + dn.group('node'), + dn.group('slot'), + attributes['severity'], + lc, + ]) + else: + unformatted_data.append([ + attributes['code'], + attributes['dn'], + description, + attributes['severity'], + lc, + ]) + if not data and not unformatted_data: + result = PASS + return Result( + result=result, + headers=headers, + data=data, + unformatted_headers=unformatted_headers, + unformatted_data=unformatted_data, + recommended_action=recommended_action, + doc_url=doc_url, + ) + + # Connection Based Check @check_wrapper(check_title="Multi-Pod Modular Spine Bootscript File") def multipod_modular_spine_bootscript_check(tversion, fabric_nodes, username, password, **kwargs): @@ -6816,6 +6869,7 @@ class CheckManager: equipment_disk_limits_exceeded, apic_vmm_inventory_sync_faults_check, apic_storage_inode_check, + rtc_battery_voltage_low_check, # Configurations vpc_paired_switches_check, diff --git a/docs/docs/validations.md b/docs/docs/validations.md index f7886811..e2b3ab4d 100644 --- a/docs/docs/validations.md +++ b/docs/docs/validations.md @@ -87,6 +87,7 @@ Items | Faults | This Script [Equipment Disk Limits][f20] | F1820: 80% -minor
F1821: -major
F1822: -critical | :white_check_mark: | :no_entry_sign: [VMM Inventory Partially Synced][f21] | F0132: comp-ctrlr-operational-issues | :white_check_mark: | :no_entry_sign: [APIC Storage Inode Usage][f22] | F4388: 75% - 85% -warning
F4389: 85% - 90% -major
F4390: 90% or more -critical | :white_check_mark: | :no_entry_sign: +[Switch RTC Battery Voltage][f23] | F2421: RTC battery voltage is low | :white_check_mark: | :no_entry_sign: [f1]: #apic-disk-space-usage [f2]: #standby-apic-disk-space-usage @@ -110,6 +111,7 @@ Items | Faults | This Script [f20]: #equipment-disk-limits [f21]: #vmm-inventory-partially-synced [f22]: #apic-storage-inode-usage +[f23]: #switch-rtc-battery-voltage ### Configuration Checks @@ -1638,8 +1640,14 @@ To recover from this fault, try the following action subject : equipment-full type : operational ``` - - + +### Switch RTC Battery Voltage + +This check detects active F2421 equipment diagnostic faults whose reason is `The RTC battery voltage is low`. The RTC battery maintains the switch system clock while the switch is powered off. If the battery voltage is low, a power cycle during an upgrade can reset the clock and prevent certificate validation, which can stop the switch from rejoining the fabric. + +The RTC battery should be replaced before upgrading or power cycling an affected switch. Contact Cisco TAC to coordinate replacement and confirm that the fault has cleared. + + ## Configuration Check Details ### VPC-paired Leaf switches @@ -2923,4 +2931,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/rtc_battery_voltage_low_check/f2421.json b/tests/checks/rtc_battery_voltage_low_check/f2421.json new file mode 100644 index 00000000..defb7c0b --- /dev/null +++ b/tests/checks/rtc_battery_voltage_low_check/f2421.json @@ -0,0 +1,37 @@ +{ + "totalCount": "1", + "imdata": [ + { + "faultInst": { + "attributes": { + "ack": "no", + "alert": "no", + "cause": "equipment-diags-failed", + "changeSet": "operStQual:The RTC battery voltage is low", + "childAction": "", + "code": "F2421", + "created": "2026-02-09T16:27:10.975+00:00", + "delegated": "no", + "descr": "Diagnostics test failed. reason:The RTC battery voltage is low", + "dn": "topology/pod-1/node-122/sys/diag/rule-rtc-test-trig-forever/subj-[topology/pod-1/node-122/sys/ch/supslot-1/sup]/fault-F2421", + "domain": "infra", + "extMngdBy": "", + "highestSeverity": "minor", + "lastTransition": "2026-02-09T16:27:10.975+00:00", + "lc": "raised", + "modTs": "never", + "occur": "1", + "origSeverity": "minor", + "prevSeverity": "cleared", + "rn": "fault-F2421", + "rule": "diag-rtctest-failed", + "severity": "minor", + "status": "", + "subject": "equipment-diags-failed", + "title": "", + "type": "operational" + } + } + } + ] +} diff --git a/tests/checks/rtc_battery_voltage_low_check/test_rtc_battery_voltage_low_check.py b/tests/checks/rtc_battery_voltage_low_check/test_rtc_battery_voltage_low_check.py new file mode 100644 index 00000000..17a44766 --- /dev/null +++ b/tests/checks/rtc_battery_voltage_low_check/test_rtc_battery_voltage_low_check.py @@ -0,0 +1,78 @@ +import copy +import importlib +import logging +import os + +import pytest + +from helpers.utils import read_data + + +script = importlib.import_module("aci-preupgrade-validation-script") + +log = logging.getLogger(__name__) +dir = os.path.dirname(os.path.abspath(__file__)) +test_function = "rtc_battery_voltage_low_check" +faultInst_api = ( + 'faultInst.json?query-target-filter=and(eq(faultInst.code,"F2421"),' + 'wcard(faultInst.descr,"reason:The RTC battery voltage is low"))' +) +active_faults = read_data(dir, "f2421.json")["imdata"] +retaining_faults = copy.deepcopy(active_faults) +retaining_faults[0]["faultInst"]["attributes"]["lc"] = "retaining" +malformed_faults = copy.deepcopy(active_faults) +malformed_faults[0]["faultInst"]["attributes"]["dn"] = ( + "topology/pod-1/node-122/sys/diag/rule-rtc-test-trig-forever/" + "subj-[topology/pod-1/node-122/sys/ch/supslot-1/sup-bad]/fault-F2421" +) +non_exact_reason_faults = [] +for reason in [ + "The RTC battery voltage is low or unavailable", + "Warning: The RTC battery voltage is low", + "Power-on self-test failed", +]: + fault = copy.deepcopy(active_faults[0]) + fault["faultInst"]["attributes"]["descr"] = ( + "Diagnostics test failed. reason:" + reason + ) + non_exact_reason_faults.append(fault) + + +@pytest.mark.parametrize( + "icurl_outputs, expected_result, expected_data, expected_unformatted_data", + [ + ( + {faultInst_api: active_faults}, + script.FAIL_UF, + [["F2421", "1", "122", "1", "minor", "raised"]], + [], + ), + ({faultInst_api: []}, script.PASS, [], []), + ({faultInst_api: retaining_faults}, script.PASS, [], []), + ({faultInst_api: non_exact_reason_faults}, script.PASS, [], []), + ( + {faultInst_api: active_faults + malformed_faults}, + script.FAIL_UF, + [["F2421", "1", "122", "1", "minor", "raised"]], + [[ + "F2421", + "topology/pod-1/node-122/sys/diag/rule-rtc-test-trig-forever/" + "subj-[topology/pod-1/node-122/sys/ch/supslot-1/sup-bad]/fault-F2421", + "Diagnostics test failed. reason:The RTC battery voltage is low", + "minor", + "raised", + ]], + ), + ], +) +def test_logic( + run_check, + mock_icurl, + expected_result, + expected_data, + expected_unformatted_data, +): + result = run_check() + assert result.result == expected_result + assert result.data == expected_data + assert result.unformatted_data == expected_unformatted_data From 1b413bf2bad493d37be114ad312330db6e214409 Mon Sep 17 00:00:00 2001 From: Gabriel Date: Mon, 3 Aug 2026 14:42:47 -0400 Subject: [PATCH 2/6] fix: classify low RTC battery as outage risk Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .gitlab-ci.yml | 2 ++ aci-preupgrade-validation-script.py | 2 +- .../test_rtc_battery_voltage_low_check.py | 4 ++-- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index de14fdea..7c123ea8 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -82,8 +82,10 @@ test:integration: - python3 runner.py -f ../aci-preupgrade-validation-script.py -i test_fabrics.yaml -k $decode_key artifacts: when: always + expire_in: 7 days paths: - $CI_PROJECT_DIR/tests/*.log + - $CI_PROJECT_DIR/tests/*.tgz cache: key: files: diff --git a/aci-preupgrade-validation-script.py b/aci-preupgrade-validation-script.py index 64bf2aa5..2cd88694 100644 --- a/aci-preupgrade-validation-script.py +++ b/aci-preupgrade-validation-script.py @@ -6406,7 +6406,7 @@ def apic_storage_inode_check(**kwargs): @check_wrapper(check_title="Switch RTC Battery Voltage (F2421 equipment-diags-failed)") def rtc_battery_voltage_low_check(**kwargs): - result = FAIL_UF + result = FAIL_O headers = ['Fault', 'Pod', 'Node', 'Supervisor', 'Severity', 'Lifecycle'] data = [] unformatted_headers = ['Fault', 'Fault DN', 'Description', 'Severity', 'Lifecycle'] diff --git a/tests/checks/rtc_battery_voltage_low_check/test_rtc_battery_voltage_low_check.py b/tests/checks/rtc_battery_voltage_low_check/test_rtc_battery_voltage_low_check.py index 17a44766..c468d61b 100644 --- a/tests/checks/rtc_battery_voltage_low_check/test_rtc_battery_voltage_low_check.py +++ b/tests/checks/rtc_battery_voltage_low_check/test_rtc_battery_voltage_low_check.py @@ -43,7 +43,7 @@ [ ( {faultInst_api: active_faults}, - script.FAIL_UF, + script.FAIL_O, [["F2421", "1", "122", "1", "minor", "raised"]], [], ), @@ -52,7 +52,7 @@ ({faultInst_api: non_exact_reason_faults}, script.PASS, [], []), ( {faultInst_api: active_faults + malformed_faults}, - script.FAIL_UF, + script.FAIL_O, [["F2421", "1", "122", "1", "minor", "raised"]], [[ "F2421", From f93f5ffaa44507ce94e72c30e9aa0e54be3e97d0 Mon Sep 17 00:00:00 2001 From: Gabriel Date: Mon, 3 Aug 2026 14:53:05 -0400 Subject: [PATCH 3/6] fix: make RTC battery query APIC-compatible Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- aci-preupgrade-validation-script.py | 2 +- .../test_rtc_battery_voltage_low_check.py | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/aci-preupgrade-validation-script.py b/aci-preupgrade-validation-script.py index 2cd88694..b5f8c83c 100644 --- a/aci-preupgrade-validation-script.py +++ b/aci-preupgrade-validation-script.py @@ -6415,7 +6415,7 @@ def rtc_battery_voltage_low_check(**kwargs): doc_url = 'https://datacenter.github.io/ACI-Pre-Upgrade-Validation-Script/validations/#switch-rtc-battery-voltage' dn_regex = node_regex + r'/.+/supslot-(?P\d+)/sup\]/fault-F2421$' fault_reason = 'The RTC battery voltage is low' - fault_api = 'faultInst.json?query-target-filter=and(eq(faultInst.code,"F2421"),wcard(faultInst.descr,"reason:The RTC battery voltage is low"))' + fault_api = 'faultInst.json?query-target-filter=eq(faultInst.code,"F2421")' faultInsts = icurl('class', fault_api) for faultInst in faultInsts: diff --git a/tests/checks/rtc_battery_voltage_low_check/test_rtc_battery_voltage_low_check.py b/tests/checks/rtc_battery_voltage_low_check/test_rtc_battery_voltage_low_check.py index c468d61b..10da9961 100644 --- a/tests/checks/rtc_battery_voltage_low_check/test_rtc_battery_voltage_low_check.py +++ b/tests/checks/rtc_battery_voltage_low_check/test_rtc_battery_voltage_low_check.py @@ -13,10 +13,7 @@ log = logging.getLogger(__name__) dir = os.path.dirname(os.path.abspath(__file__)) test_function = "rtc_battery_voltage_low_check" -faultInst_api = ( - 'faultInst.json?query-target-filter=and(eq(faultInst.code,"F2421"),' - 'wcard(faultInst.descr,"reason:The RTC battery voltage is low"))' -) +faultInst_api = 'faultInst.json?query-target-filter=eq(faultInst.code,"F2421")' active_faults = read_data(dir, "f2421.json")["imdata"] retaining_faults = copy.deepcopy(active_faults) retaining_faults[0]["faultInst"]["attributes"]["lc"] = "retaining" From 74dca5d389f160eede38ff6cfc6bb338453d4909 Mon Sep 17 00:00:00 2001 From: Gabriel Date: Fri, 7 Aug 2026 15:45:42 -0400 Subject: [PATCH 4/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 7c123ea8..b4e01a44 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 expire_in: 7 days @@ -93,3 +94,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 de0c2ed06df76a5660d5a9fb6835910e5a82bcbd Mon Sep 17 00:00:00 2001 From: Gabriel Date: Fri, 7 Aug 2026 19:18:12 -0400 Subject: [PATCH 5/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 b4e01a44..e62312e8 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -108,7 +108,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" @@ -121,7 +120,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" @@ -131,7 +129,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" @@ -144,7 +141,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" @@ -154,7 +150,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" @@ -167,6 +162,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 d1819c2b682e83e2c72f4cd7dbf41ec1acee9273 Mon Sep 17 00:00:00 2001 From: Gabriel Date: Mon, 10 Aug 2026 08:47:02 -0400 Subject: [PATCH 6/6] fix(ci): harden integration test coverage --- .gitlab-ci.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e62312e8..50a64999 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 @@ -99,6 +100,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 # =============================================================================