From 338af6c9830daa9b0dd332ce7ba57f3d1b67b213 Mon Sep 17 00:00:00 2001 From: Harinadh Saladi Date: Wed, 25 Feb 2026 13:29:58 +0000 Subject: [PATCH 01/16] Added a new check for the bug 'CSCws82819N9K-C9408 boot loop on 16.1.2f and later with 6 or more LEMs' --- aci-preupgrade-validation-script.py | 50 +++++++ docs/docs/validations.md | 31 +++- .../eqptLC_5_node101.json | 7 + .../eqptLC_6_node101.json | 8 ++ .../eqptLC_7_node101.json | 58 ++++++++ .../c9408_lem_count_check/eqptLC_empty.json | 1 + .../eqptLC_mixed_101_102_201.json | 15 ++ .../fabric_nodes_c9408_101.json | 10 ++ .../fabric_nodes_mixed.json | 26 ++++ .../fabric_nodes_no_c9408.json | 10 ++ .../test_c9408_lem_count_check.py | 136 ++++++++++++++++++ 11 files changed, 351 insertions(+), 1 deletion(-) create mode 100644 tests/checks/c9408_lem_count_check/eqptLC_5_node101.json create mode 100644 tests/checks/c9408_lem_count_check/eqptLC_6_node101.json create mode 100644 tests/checks/c9408_lem_count_check/eqptLC_7_node101.json create mode 100644 tests/checks/c9408_lem_count_check/eqptLC_empty.json create mode 100644 tests/checks/c9408_lem_count_check/eqptLC_mixed_101_102_201.json create mode 100644 tests/checks/c9408_lem_count_check/fabric_nodes_c9408_101.json create mode 100644 tests/checks/c9408_lem_count_check/fabric_nodes_mixed.json create mode 100644 tests/checks/c9408_lem_count_check/fabric_nodes_no_c9408.json create mode 100644 tests/checks/c9408_lem_count_check/test_c9408_lem_count_check.py diff --git a/aci-preupgrade-validation-script.py b/aci-preupgrade-validation-script.py index f29c66b..911b352 100644 --- a/aci-preupgrade-validation-script.py +++ b/aci-preupgrade-validation-script.py @@ -6053,6 +6053,55 @@ def auto_firmware_update_on_switch_check(cversion, tversion, **kwargs): return Result(result=result, headers=headers, data=data, recommended_action=recommended_action, doc_url=doc_url) +@check_wrapper(check_title='N9K-C9408 with 6 or more N9K-X9400-16W LEMs') +def n9k_c9408_model_lem_count_check(tversion, fabric_nodes, **kwargs): + result = PASS + headers = ["Node ID", "Switch Model", "LEM Model", "LEM Count"] + data = [] + recommended_action = ( + "Upgrade from pre-16.1(2f) to 16.1(2f) or later for N9K-C9408 with >= 6(N9K-X9400-16W)LEMs will result in boot loop. Pls Choose a different version." + ) + doc_url = 'https://datacenter.github.io/ACI-Pre-Upgrade-Validation-Script/validations/#n9k-c9408-with-6-n9k-x9400-16w-lems' + + if tversion.older_than("6.1(2f)") or (tversion.newer_than("6.1(5e)") and not tversion.same_as("6.2(1g)")): + return Result(result=NA, msg=VER_NOT_AFFECTED) + + affected_nodes = {} + for node in fabric_nodes: + node_id = node['fabricNode']['attributes']['id'] + model = node['fabricNode']['attributes']['model'] + if model == "N9K-C9408": + affected_nodes[node_id] = "N9K-C9408" + + if not affected_nodes: + return Result(result=NA, msg='No N9K-C9408 nodes found. Skipping.') + + eqptLC_api = 'eqptLC.json?query-target-filter=eq(eqptLC.model,"N9K-X9400-16W")' + try: + eqptLCs = icurl('class', eqptLC_api) + except Exception as e: + return Result(result=ERROR, msg="Failed to query {}: {}".format(eqptLC_api, e)) + + lem_count_per_node = defaultdict(int) + for eqptLC in eqptLCs: + dn = eqptLC['eqptLC']['attributes']['dn'] + dn_match = re.search(node_regex, dn) + if not dn_match: + continue + node_id = dn_match.group("node") + if node_id in affected_nodes: + lem_count_per_node[node_id] += 1 + + for node_id in sorted(affected_nodes, key=int): + lem_count = lem_count_per_node[node_id] + if lem_count > 5: + data.append([node_id, affected_nodes[node_id], "N9K-X9400-16W", lem_count]) + + if data: + result = FAIL_O + + return Result(result=result, headers=headers, data=data, recommended_action=recommended_action, doc_url=doc_url) + # ---- Script Execution ---- @@ -6211,6 +6260,7 @@ class CheckManager: clock_signal_component_failure_check, stale_decomissioned_spine_check, n9408_model_check, + c9408_lem_count_check, pbr_high_scale_check, standby_sup_sync_check, isis_database_byte_check, diff --git a/docs/docs/validations.md b/docs/docs/validations.md index f46e03d..024c8c0 100644 --- a/docs/docs/validations.md +++ b/docs/docs/validations.md @@ -187,6 +187,7 @@ Items | Defect | This Script [Nexus 950X FM or LC Might Fail to boot after reload][d20] | CSCvg26013 | :white_check_mark: | :no_entry_sign: [Stale Decommissioned Spine][d21] | CSCwf58763 | :white_check_mark: | :no_entry_sign: [N9K-C9408 Platform Model][d22] | CSCwk77800 | :white_check_mark: | :no_entry_sign: +[N9K-C9408 with 6+ N9K-X9400-16W LEMs][d29] | CSCws82819 | :white_check_mark: | :no_entry_sign: [PBR High Scale][d23] | CSCwi66348 | :white_check_mark: | :no_entry_sign: [Standby Sup Image Sync][d24] | CSCwi66348 | :white_check_mark: | :no_entry_sign: [Observer Database Size][d25] | CSCvw45531 | :white_check_mark: | :no_entry_sign: @@ -223,7 +224,12 @@ Items | Defect | This Script [d26]: #stale-pconsra-object [d27]: #isis-dteps-byte-size [d28]: #policydist-configpushshardcont-crash +<<<<<<< HEAD [d29]: #auto-firmware-update-on-switch-discovery +======= +[d29]: #n9k-c9408-with-6-n9k-x9400-16w-lems + +>>>>>>> Added a new check for the bug 'CSCws82819N9K-C9408 boot loop on 16.1.2f and later with 6 or more LEMs' ## General Check Details @@ -2586,6 +2592,25 @@ Due to defect [CSCwf58763][42], upgrading to non-fixed versions with `fabricRsDe When an identified switch node is upgraded to a fixed 6.1(3)+ version, the `N9K-C9400-SW-GX2A` fabric membership entry will show up as inactive and must be decomissioned and the new `N9K-C9408` fabric membership entry must be registered. The result is that the node IDs in question will not completely join the fabric post-upgrade until these additional steps are performed on each identified `N9K-C9408` node. +### N9K-C9408 with 6+ N9K-X9400-16W LEMs + +Due to defect [CSCws82819][62], upgrading from pre-16.1(2f) to 16.1(2f) or later can result in a boot loop when a `N9K-C9408` node has 6 or more installed `N9K-X9400-16W` LEMs. + +This check is applicable only when the APIC target version is between 6.1(2f) and 6.2(1g), inclusive. + +The script checks the following conditions: + +1. Target version is in the affected window (6.1(2f) through 6.2(1g)). +2. At least one switch node model is `N9K-C9408`. +3. For each `N9K-C9408` node, the number of `eqptLC` entries with model `N9K-X9400-16W` is counted. + +If any affected node has more than 5 matching LEMs, the check is flagged as `FAIL - OUTAGE WARNING!!` with the node-level count details. + +Recommended action: + +* Do **not** proceed with the upgrade when flagged. +* Reduce the number of `N9K-X9400-16W` LEMs to 5 or fewer on each affected `N9K-C9408` node, or choose a different target version. + ### PBR High Scale Due to [CSCwi66348][46], Leaf Switches with high scale PBR config (classes `vnsAdjacencyDefCont`, `vnsSvcRedirEcmpBucketCons` and `fvAdjDefCons` specifically) can take an unexpectedly long time to complete bootstrap after an upgrade. @@ -2730,5 +2755,9 @@ To avoid this risk, consider disabling Auto Firmware Update before upgrading to [59]: https://bst.cloudapps.cisco.com/bugsearch/bug/CSCwp95515 [60]: https://www.cisco.com/c/en/us/solutions/collateral/data-center-virtualization/application-centric-infrastructure/white-paper-c11-743951.html#Inter [61]: https://www.cisco.com/c/en/us/solutions/collateral/data-center-virtualization/application-centric-infrastructure/white-paper-c11-743951.html#EnablePolicyCompression +<<<<<<< HEAD [62]: https://bst.cloudapps.cisco.com/bugsearch/bug/CSCwe83941 -[63]: https://www.cisco.com/c/en/us/td/docs/dcn/aci/apic/all/apic-installation-aci-upgrade-downgrade/Cisco-APIC-Installation-ACI-Upgrade-Downgrade-Guide/m-auto-firmware-update.html \ No newline at end of file +[63]: https://www.cisco.com/c/en/us/td/docs/dcn/aci/apic/all/apic-installation-aci-upgrade-downgrade/Cisco-APIC-Installation-ACI-Upgrade-Downgrade-Guide/m-auto-firmware-update.html +======= +[62]: https://bst.cloudapps.cisco.com/bugsearch/bug/CSCws82819 +>>>>>>> Added a new check for the bug 'CSCws82819N9K-C9408 boot loop on 16.1.2f and later with 6 or more LEMs' diff --git a/tests/checks/c9408_lem_count_check/eqptLC_5_node101.json b/tests/checks/c9408_lem_count_check/eqptLC_5_node101.json new file mode 100644 index 0000000..22053ec --- /dev/null +++ b/tests/checks/c9408_lem_count_check/eqptLC_5_node101.json @@ -0,0 +1,7 @@ +[ + {"eqptLC": {"attributes": {"dn": "topology/pod-1/node-101/sys/ch/lcslot-1/lc", "model": "N9K-X9400-16W"}}}, + {"eqptLC": {"attributes": {"dn": "topology/pod-1/node-101/sys/ch/lcslot-2/lc", "model": "N9K-X9400-16W"}}}, + {"eqptLC": {"attributes": {"dn": "topology/pod-1/node-101/sys/ch/lcslot-3/lc", "model": "N9K-X9400-16W"}}}, + {"eqptLC": {"attributes": {"dn": "topology/pod-1/node-101/sys/ch/lcslot-4/lc", "model": "N9K-X9400-16W"}}}, + {"eqptLC": {"attributes": {"dn": "topology/pod-1/node-101/sys/ch/lcslot-5/lc", "model": "N9K-X9400-16W"}}} +] diff --git a/tests/checks/c9408_lem_count_check/eqptLC_6_node101.json b/tests/checks/c9408_lem_count_check/eqptLC_6_node101.json new file mode 100644 index 0000000..7bcdc62 --- /dev/null +++ b/tests/checks/c9408_lem_count_check/eqptLC_6_node101.json @@ -0,0 +1,8 @@ +[ + {"eqptLC": {"attributes": {"dn": "topology/pod-1/node-101/sys/ch/lcslot-1/lc", "model": "N9K-X9400-16W"}}}, + {"eqptLC": {"attributes": {"dn": "topology/pod-1/node-101/sys/ch/lcslot-2/lc", "model": "N9K-X9400-16W"}}}, + {"eqptLC": {"attributes": {"dn": "topology/pod-1/node-101/sys/ch/lcslot-3/lc", "model": "N9K-X9400-16W"}}}, + {"eqptLC": {"attributes": {"dn": "topology/pod-1/node-101/sys/ch/lcslot-4/lc", "model": "N9K-X9400-16W"}}}, + {"eqptLC": {"attributes": {"dn": "topology/pod-1/node-101/sys/ch/lcslot-5/lc", "model": "N9K-X9400-16W"}}}, + {"eqptLC": {"attributes": {"dn": "topology/pod-1/node-101/sys/ch/lcslot-6/lc", "model": "N9K-X9400-16W"}}} +] diff --git a/tests/checks/c9408_lem_count_check/eqptLC_7_node101.json b/tests/checks/c9408_lem_count_check/eqptLC_7_node101.json new file mode 100644 index 0000000..8beacdf --- /dev/null +++ b/tests/checks/c9408_lem_count_check/eqptLC_7_node101.json @@ -0,0 +1,58 @@ +[ + { + "eqptLC": { + "attributes": { + "dn": "topology/pod-1/node-101/sys/ch/lcslot-1/lc", + "model": "N9K-X9400-16W" + } + } + }, + { + "eqptLC": { + "attributes": { + "dn": "topology/pod-1/node-101/sys/ch/lcslot-2/lc", + "model": "N9K-X9400-16W" + } + } + }, + { + "eqptLC": { + "attributes": { + "dn": "topology/pod-1/node-101/sys/ch/lcslot-3/lc", + "model": "N9K-X9400-16W" + } + } + }, + { + "eqptLC": { + "attributes": { + "dn": "topology/pod-1/node-101/sys/ch/lcslot-4/lc", + "model": "N9K-X9400-16W" + } + } + }, + { + "eqptLC": { + "attributes": { + "dn": "topology/pod-1/node-101/sys/ch/lcslot-5/lc", + "model": "N9K-X9400-16W" + } + } + }, + { + "eqptLC": { + "attributes": { + "dn": "topology/pod-1/node-101/sys/ch/lcslot-6/lc", + "model": "N9K-X9400-16W" + } + } + }, + { + "eqptLC": { + "attributes": { + "dn": "topology/pod-1/node-101/sys/ch/lcslot-7/lc", + "model": "N9K-X9400-16W" + } + } + } +] diff --git a/tests/checks/c9408_lem_count_check/eqptLC_empty.json b/tests/checks/c9408_lem_count_check/eqptLC_empty.json new file mode 100644 index 0000000..fe51488 --- /dev/null +++ b/tests/checks/c9408_lem_count_check/eqptLC_empty.json @@ -0,0 +1 @@ +[] diff --git a/tests/checks/c9408_lem_count_check/eqptLC_mixed_101_102_201.json b/tests/checks/c9408_lem_count_check/eqptLC_mixed_101_102_201.json new file mode 100644 index 0000000..8058fe1 --- /dev/null +++ b/tests/checks/c9408_lem_count_check/eqptLC_mixed_101_102_201.json @@ -0,0 +1,15 @@ +[ + {"eqptLC": {"attributes": {"dn": "topology/pod-1/node-101/sys/ch/lcslot-1/lc", "model": "N9K-X9400-16W"}}}, + {"eqptLC": {"attributes": {"dn": "topology/pod-1/node-101/sys/ch/lcslot-2/lc", "model": "N9K-X9400-16W"}}}, + {"eqptLC": {"attributes": {"dn": "topology/pod-1/node-101/sys/ch/lcslot-3/lc", "model": "N9K-X9400-16W"}}}, + {"eqptLC": {"attributes": {"dn": "topology/pod-1/node-101/sys/ch/lcslot-4/lc", "model": "N9K-X9400-16W"}}}, + {"eqptLC": {"attributes": {"dn": "topology/pod-1/node-101/sys/ch/lcslot-5/lc", "model": "N9K-X9400-16W"}}}, + {"eqptLC": {"attributes": {"dn": "topology/pod-1/node-101/sys/ch/lcslot-6/lc", "model": "N9K-X9400-16W"}}}, + {"eqptLC": {"attributes": {"dn": "topology/pod-1/node-102/sys/ch/lcslot-1/lc", "model": "N9K-X9400-16W"}}}, + {"eqptLC": {"attributes": {"dn": "topology/pod-1/node-102/sys/ch/lcslot-2/lc", "model": "N9K-X9400-16W"}}}, + {"eqptLC": {"attributes": {"dn": "topology/pod-1/node-102/sys/ch/lcslot-3/lc", "model": "N9K-X9400-16W"}}}, + {"eqptLC": {"attributes": {"dn": "topology/pod-1/node-102/sys/ch/lcslot-4/lc", "model": "N9K-X9400-16W"}}}, + {"eqptLC": {"attributes": {"dn": "topology/pod-1/node-102/sys/ch/lcslot-5/lc", "model": "N9K-X9400-16W"}}}, + {"eqptLC": {"attributes": {"dn": "topology/pod-1/node-102/sys/ch/lcslot-6/lc", "model": "N9K-X9400-16W"}}}, + {"eqptLC": {"attributes": {"dn": "topology/pod-1/node-201/sys/ch/lcslot-1/lc", "model": "N9K-X9400-16W"}}} +] diff --git a/tests/checks/c9408_lem_count_check/fabric_nodes_c9408_101.json b/tests/checks/c9408_lem_count_check/fabric_nodes_c9408_101.json new file mode 100644 index 0000000..2453efc --- /dev/null +++ b/tests/checks/c9408_lem_count_check/fabric_nodes_c9408_101.json @@ -0,0 +1,10 @@ +[ + { + "fabricNode": { + "attributes": { + "id": "101", + "model": "N9K-C9408" + } + } + } +] diff --git a/tests/checks/c9408_lem_count_check/fabric_nodes_mixed.json b/tests/checks/c9408_lem_count_check/fabric_nodes_mixed.json new file mode 100644 index 0000000..15b6982 --- /dev/null +++ b/tests/checks/c9408_lem_count_check/fabric_nodes_mixed.json @@ -0,0 +1,26 @@ +[ + { + "fabricNode": { + "attributes": { + "id": "101", + "model": "N9K-C9408" + } + } + }, + { + "fabricNode": { + "attributes": { + "id": "102", + "model": "N9K-C9408" + } + } + }, + { + "fabricNode": { + "attributes": { + "id": "201", + "model": "N9K-C93180YC-FX" + } + } + } +] diff --git a/tests/checks/c9408_lem_count_check/fabric_nodes_no_c9408.json b/tests/checks/c9408_lem_count_check/fabric_nodes_no_c9408.json new file mode 100644 index 0000000..ae98705 --- /dev/null +++ b/tests/checks/c9408_lem_count_check/fabric_nodes_no_c9408.json @@ -0,0 +1,10 @@ +[ + { + "fabricNode": { + "attributes": { + "id": "101", + "model": "N9K-C93180YC-FX" + } + } + } +] diff --git a/tests/checks/c9408_lem_count_check/test_c9408_lem_count_check.py b/tests/checks/c9408_lem_count_check/test_c9408_lem_count_check.py new file mode 100644 index 0000000..8afb24d --- /dev/null +++ b/tests/checks/c9408_lem_count_check/test_c9408_lem_count_check.py @@ -0,0 +1,136 @@ +import os +import pytest +import logging +import importlib +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 = "c9408_lem_count_check" + + +eqptLC_api = 'eqptLC.json?query-target-filter=eq(eqptLC.model,"N9K-X9400-16W")' + + +@pytest.mark.parametrize( + "icurl_outputs, tversion, fabric_nodes, expected_result, expected_data, expected_msg", + [ + # Version not affected (lower than 6.1(2f)) + ( + {eqptLC_api: read_data(dir, "eqptLC_empty.json")}, + "6.1(2e)", + read_data(dir, "fabric_nodes_c9408_101.json"), + script.NA, + [], + script.VER_NOT_AFFECTED, + ), + # Version not affected (higher than 6.2(1g)) + ( + {eqptLC_api: read_data(dir, "eqptLC_empty.json")}, + "6.2(1h)", + read_data(dir, "fabric_nodes_c9408_101.json"), + script.NA, + [], + script.VER_NOT_AFFECTED, + ), + # Applicable version but no C9408 node + ( + {eqptLC_api: read_data(dir, "eqptLC_6_node101.json")}, + "6.1(2f)", + read_data(dir, "fabric_nodes_no_c9408.json"), + script.NA, + [], + "No N9K-C9408 nodes found. Skipping.", + ), + # Applicable version, C9408 exists, no LEM entries + ( + {eqptLC_api: read_data(dir, "eqptLC_empty.json")}, + "6.1(2f)", + read_data(dir, "fabric_nodes_c9408_101.json"), + script.PASS, + [], + "", + ), + # Applicable version, exactly 5 LEMs -> PASS + ( + {eqptLC_api: read_data(dir, "eqptLC_5_node101.json")}, + "6.2(1g)", + read_data(dir, "fabric_nodes_c9408_101.json"), + script.PASS, + [], + "", + ), + # Applicable mid-train version 6.1(5e), less than 6 LEMs on C9408 -> PASS + ( + {eqptLC_api: read_data(dir, "eqptLC_5_node101.json")}, + "6.1(5e)", + read_data(dir, "fabric_nodes_c9408_101.json"), + script.PASS, + [], + "", + ), + # Applicable mid-train version 6.1(5e), 6 LEMs on C9408 -> FAIL_O + ( + {eqptLC_api: read_data(dir, "eqptLC_6_node101.json")}, + "6.1(5e)", + read_data(dir, "fabric_nodes_c9408_101.json"), + script.FAIL_O, + [["101", "N9K-C9408", "N9K-X9400-16W", 6]], + "", + ), + # Applicable mid-train version 6.1(5e), more than 6 LEMs on C9408 -> FAIL_O + ( + {eqptLC_api: read_data(dir, "eqptLC_7_node101.json")}, + "6.1(5e)", + read_data(dir, "fabric_nodes_c9408_101.json"), + script.FAIL_O, + [["101", "N9K-C9408", "N9K-X9400-16W", 7]], + "", + ), + # Applicable version, 6 LEMs on C9408 -> FAIL_O + ( + {eqptLC_api: read_data(dir, "eqptLC_6_node101.json")}, + "6.1(2f)", + read_data(dir, "fabric_nodes_c9408_101.json"), + script.FAIL_O, + [["101", "N9K-C9408", "N9K-X9400-16W", 6]], + "", + ), + # Applicable version, more than 6 LEMs on C9408 -> FAIL_O + ( + {eqptLC_api: read_data(dir, "eqptLC_7_node101.json")}, + "6.1(2f)", + read_data(dir, "fabric_nodes_c9408_101.json"), + script.FAIL_O, + [["101", "N9K-C9408", "N9K-X9400-16W", 7]], + "", + ), + # Count only C9408 nodes and only matching LEM model + ( + {eqptLC_api: read_data(dir, "eqptLC_mixed_101_102_201.json")}, + "6.1(3a)", + read_data(dir, "fabric_nodes_mixed.json"), + script.FAIL_O, + [ + ["101", "N9K-C9408", "N9K-X9400-16W", 6], + ["102", "N9K-C9408", "N9K-X9400-16W", 6], + ], + "", + ), + ], +) +def test_logic(run_check, mock_icurl, icurl_outputs, tversion, fabric_nodes, expected_result, expected_data, expected_msg): + result = run_check( + tversion=script.AciVersion(tversion), + fabric_nodes=fabric_nodes, + ) + + assert result.result == expected_result + assert result.data == expected_data + assert result.msg == expected_msg + + if expected_result == script.FAIL_O: + assert "boot loop" in result.recommended_action From 1712888c7d911360abc505c7df7c5e1193981420 Mon Sep 17 00:00:00 2001 From: Harinadh Saladi Date: Sat, 28 Feb 2026 03:55:13 +0000 Subject: [PATCH 02/16] Removed if conditio for model check and modified the recommended actions --- aci-preupgrade-validation-script.py | 2 +- docs/docs/validations.md | 32 ++++++++++++----------------- 2 files changed, 14 insertions(+), 20 deletions(-) diff --git a/aci-preupgrade-validation-script.py b/aci-preupgrade-validation-script.py index 911b352..e084099 100644 --- a/aci-preupgrade-validation-script.py +++ b/aci-preupgrade-validation-script.py @@ -6260,7 +6260,7 @@ class CheckManager: clock_signal_component_failure_check, stale_decomissioned_spine_check, n9408_model_check, - c9408_lem_count_check, + n9k_c9408_model_lem_count_check, pbr_high_scale_check, standby_sup_sync_check, isis_database_byte_check, diff --git a/docs/docs/validations.md b/docs/docs/validations.md index 024c8c0..b33c78f 100644 --- a/docs/docs/validations.md +++ b/docs/docs/validations.md @@ -2592,25 +2592,6 @@ Due to defect [CSCwf58763][42], upgrading to non-fixed versions with `fabricRsDe When an identified switch node is upgraded to a fixed 6.1(3)+ version, the `N9K-C9400-SW-GX2A` fabric membership entry will show up as inactive and must be decomissioned and the new `N9K-C9408` fabric membership entry must be registered. The result is that the node IDs in question will not completely join the fabric post-upgrade until these additional steps are performed on each identified `N9K-C9408` node. -### N9K-C9408 with 6+ N9K-X9400-16W LEMs - -Due to defect [CSCws82819][62], upgrading from pre-16.1(2f) to 16.1(2f) or later can result in a boot loop when a `N9K-C9408` node has 6 or more installed `N9K-X9400-16W` LEMs. - -This check is applicable only when the APIC target version is between 6.1(2f) and 6.2(1g), inclusive. - -The script checks the following conditions: - -1. Target version is in the affected window (6.1(2f) through 6.2(1g)). -2. At least one switch node model is `N9K-C9408`. -3. For each `N9K-C9408` node, the number of `eqptLC` entries with model `N9K-X9400-16W` is counted. - -If any affected node has more than 5 matching LEMs, the check is flagged as `FAIL - OUTAGE WARNING!!` with the node-level count details. - -Recommended action: - -* Do **not** proceed with the upgrade when flagged. -* Reduce the number of `N9K-X9400-16W` LEMs to 5 or fewer on each affected `N9K-C9408` node, or choose a different target version. - ### PBR High Scale Due to [CSCwi66348][46], Leaf Switches with high scale PBR config (classes `vnsAdjacencyDefCont`, `vnsSvcRedirEcmpBucketCons` and `fvAdjDefCons` specifically) can take an unexpectedly long time to complete bootstrap after an upgrade. @@ -2673,6 +2654,7 @@ Due to [CSCwp95515][59], upgrading to an affected version while having any `conf If any instances of `configpushShardCont` are flagged by this script, Cisco TAC must be contacted to identify and resolve the underlying issue before performing the upgrade. +<<<<<<< HEAD ### Auto Firmware Update on Switch Discovery [Auto Firmware Update on Switch Discovery][63] automatically upgrades a new switch to the target firmware version before registering it to the ACI fabric. This feature activates in three scenarios: @@ -2691,6 +2673,18 @@ To avoid this risk, consider disabling Auto Firmware Update before upgrading to !!! note This issue occurs because older switch firmware versions are not compatible with switch images 6.0(3) or newer. The APIC version is not a factor. +======= +### N9K-C9408 with 6 or more N9K-X9400-16W LEMs + +Due to defect [CSCws82819][62], upgrading from pre-16.1(2f) to 16.1(2f) or later can result in a boot loop when a `N9K-C9408` node has 6 or more installed N9K-X9400-16W` LEMs. + +Recommended action: + +* Do **not** proceed with the upgrade when flagged. +* Reduce the number of `N9K-X9400-16W` LEMs to 5 or fewer on each affected `N9K-C9408` node, or choose a different target version. +* If reducing LEM count is not operationally feasible, open a TAC case for an upgrade path recommendation. + +>>>>>>> Removed if conditio for model check and modified the recommended actions [0]: https://github.com/datacenter/ACI-Pre-Upgrade-Validation-Script From ae3885998e9dc96d23791b28de27fb95f9bc64a5 Mon Sep 17 00:00:00 2001 From: Harinadh Saladi Date: Wed, 4 Mar 2026 01:51:50 +0000 Subject: [PATCH 03/16] Updated recommended action message, method name and pytest file names --- aci-preupgrade-validation-script.py | 4 +++- docs/docs/validations.md | 5 ++--- .../eqptLC_5_node.json} | 0 .../eqptLC_6_node.json} | 0 .../eqptLC_7_node.json} | 0 .../eqptLC_empty.json | 0 .../eqptLC_mixed.json} | 0 .../fabricNode_mixed.json} | 0 .../fabricNode_n9k_c9408.json} | 0 .../fabricNode_no_n9k_c9408.json} | 0 .../test_n9k_c9408_model_lem_count_check.py} | 0 11 files changed, 5 insertions(+), 4 deletions(-) rename tests/checks/{c9408_lem_count_check/eqptLC_5_node101.json => n9k_c9408_model_lem_count_check/eqptLC_5_node.json} (100%) rename tests/checks/{c9408_lem_count_check/eqptLC_6_node101.json => n9k_c9408_model_lem_count_check/eqptLC_6_node.json} (100%) rename tests/checks/{c9408_lem_count_check/eqptLC_7_node101.json => n9k_c9408_model_lem_count_check/eqptLC_7_node.json} (100%) rename tests/checks/{c9408_lem_count_check => n9k_c9408_model_lem_count_check}/eqptLC_empty.json (100%) rename tests/checks/{c9408_lem_count_check/eqptLC_mixed_101_102_201.json => n9k_c9408_model_lem_count_check/eqptLC_mixed.json} (100%) rename tests/checks/{c9408_lem_count_check/fabric_nodes_mixed.json => n9k_c9408_model_lem_count_check/fabricNode_mixed.json} (100%) rename tests/checks/{c9408_lem_count_check/fabric_nodes_c9408_101.json => n9k_c9408_model_lem_count_check/fabricNode_n9k_c9408.json} (100%) rename tests/checks/{c9408_lem_count_check/fabric_nodes_no_c9408.json => n9k_c9408_model_lem_count_check/fabricNode_no_n9k_c9408.json} (100%) rename tests/checks/{c9408_lem_count_check/test_c9408_lem_count_check.py => n9k_c9408_model_lem_count_check/test_n9k_c9408_model_lem_count_check.py} (100%) diff --git a/aci-preupgrade-validation-script.py b/aci-preupgrade-validation-script.py index e084099..6dda619 100644 --- a/aci-preupgrade-validation-script.py +++ b/aci-preupgrade-validation-script.py @@ -6059,7 +6059,7 @@ def n9k_c9408_model_lem_count_check(tversion, fabric_nodes, **kwargs): headers = ["Node ID", "Switch Model", "LEM Model", "LEM Count"] data = [] recommended_action = ( - "Upgrade from pre-16.1(2f) to 16.1(2f) or later for N9K-C9408 with >= 6(N9K-X9400-16W)LEMs will result in boot loop. Pls Choose a different version." + "Upgrade from pre-16.1(2f) to 16.1(2f) or later on N9K-C9408 with 6 or more N9K-X9400-16W LEMs can result in boot loop. Choose a different version." ) doc_url = 'https://datacenter.github.io/ACI-Pre-Upgrade-Validation-Script/validations/#n9k-c9408-with-6-n9k-x9400-16w-lems' @@ -6266,6 +6266,8 @@ class CheckManager: isis_database_byte_check, configpush_shard_check, auto_firmware_update_on_switch_check, + n9k_c9408_model_lem_count_check, + auto_firmware_update_on_switch_check, ] ssh_checks = [ diff --git a/docs/docs/validations.md b/docs/docs/validations.md index b33c78f..889b8db 100644 --- a/docs/docs/validations.md +++ b/docs/docs/validations.md @@ -2680,9 +2680,8 @@ Due to defect [CSCws82819][62], upgrading from pre-16.1(2f) to 16.1(2f) or later Recommended action: -* Do **not** proceed with the upgrade when flagged. -* Reduce the number of `N9K-X9400-16W` LEMs to 5 or fewer on each affected `N9K-C9408` node, or choose a different target version. -* If reducing LEM count is not operationally feasible, open a TAC case for an upgrade path recommendation. +Please use a different target version. + >>>>>>> Removed if conditio for model check and modified the recommended actions diff --git a/tests/checks/c9408_lem_count_check/eqptLC_5_node101.json b/tests/checks/n9k_c9408_model_lem_count_check/eqptLC_5_node.json similarity index 100% rename from tests/checks/c9408_lem_count_check/eqptLC_5_node101.json rename to tests/checks/n9k_c9408_model_lem_count_check/eqptLC_5_node.json diff --git a/tests/checks/c9408_lem_count_check/eqptLC_6_node101.json b/tests/checks/n9k_c9408_model_lem_count_check/eqptLC_6_node.json similarity index 100% rename from tests/checks/c9408_lem_count_check/eqptLC_6_node101.json rename to tests/checks/n9k_c9408_model_lem_count_check/eqptLC_6_node.json diff --git a/tests/checks/c9408_lem_count_check/eqptLC_7_node101.json b/tests/checks/n9k_c9408_model_lem_count_check/eqptLC_7_node.json similarity index 100% rename from tests/checks/c9408_lem_count_check/eqptLC_7_node101.json rename to tests/checks/n9k_c9408_model_lem_count_check/eqptLC_7_node.json diff --git a/tests/checks/c9408_lem_count_check/eqptLC_empty.json b/tests/checks/n9k_c9408_model_lem_count_check/eqptLC_empty.json similarity index 100% rename from tests/checks/c9408_lem_count_check/eqptLC_empty.json rename to tests/checks/n9k_c9408_model_lem_count_check/eqptLC_empty.json diff --git a/tests/checks/c9408_lem_count_check/eqptLC_mixed_101_102_201.json b/tests/checks/n9k_c9408_model_lem_count_check/eqptLC_mixed.json similarity index 100% rename from tests/checks/c9408_lem_count_check/eqptLC_mixed_101_102_201.json rename to tests/checks/n9k_c9408_model_lem_count_check/eqptLC_mixed.json diff --git a/tests/checks/c9408_lem_count_check/fabric_nodes_mixed.json b/tests/checks/n9k_c9408_model_lem_count_check/fabricNode_mixed.json similarity index 100% rename from tests/checks/c9408_lem_count_check/fabric_nodes_mixed.json rename to tests/checks/n9k_c9408_model_lem_count_check/fabricNode_mixed.json diff --git a/tests/checks/c9408_lem_count_check/fabric_nodes_c9408_101.json b/tests/checks/n9k_c9408_model_lem_count_check/fabricNode_n9k_c9408.json similarity index 100% rename from tests/checks/c9408_lem_count_check/fabric_nodes_c9408_101.json rename to tests/checks/n9k_c9408_model_lem_count_check/fabricNode_n9k_c9408.json diff --git a/tests/checks/c9408_lem_count_check/fabric_nodes_no_c9408.json b/tests/checks/n9k_c9408_model_lem_count_check/fabricNode_no_n9k_c9408.json similarity index 100% rename from tests/checks/c9408_lem_count_check/fabric_nodes_no_c9408.json rename to tests/checks/n9k_c9408_model_lem_count_check/fabricNode_no_n9k_c9408.json diff --git a/tests/checks/c9408_lem_count_check/test_c9408_lem_count_check.py b/tests/checks/n9k_c9408_model_lem_count_check/test_n9k_c9408_model_lem_count_check.py similarity index 100% rename from tests/checks/c9408_lem_count_check/test_c9408_lem_count_check.py rename to tests/checks/n9k_c9408_model_lem_count_check/test_n9k_c9408_model_lem_count_check.py From 7bc42c477d3e52b79b5cb96a2c511c76b381ee5e Mon Sep 17 00:00:00 2001 From: Harinadh Saladi Date: Wed, 4 Mar 2026 03:24:08 +0000 Subject: [PATCH 04/16] Updated pytest file names in python file --- .../test_n9k_c9408_model_lem_count_check.py | 42 +++++++++---------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/tests/checks/n9k_c9408_model_lem_count_check/test_n9k_c9408_model_lem_count_check.py b/tests/checks/n9k_c9408_model_lem_count_check/test_n9k_c9408_model_lem_count_check.py index 8afb24d..9b3b0b6 100644 --- a/tests/checks/n9k_c9408_model_lem_count_check/test_n9k_c9408_model_lem_count_check.py +++ b/tests/checks/n9k_c9408_model_lem_count_check/test_n9k_c9408_model_lem_count_check.py @@ -9,7 +9,7 @@ log = logging.getLogger(__name__) dir = os.path.dirname(os.path.abspath(__file__)) -test_function = "c9408_lem_count_check" +test_function = "n9k_c9408_model_lem_count_check" eqptLC_api = 'eqptLC.json?query-target-filter=eq(eqptLC.model,"N9K-X9400-16W")' @@ -22,7 +22,7 @@ ( {eqptLC_api: read_data(dir, "eqptLC_empty.json")}, "6.1(2e)", - read_data(dir, "fabric_nodes_c9408_101.json"), + read_data(dir, "fabricNode_n9k_c9408.json"), script.NA, [], script.VER_NOT_AFFECTED, @@ -31,16 +31,16 @@ ( {eqptLC_api: read_data(dir, "eqptLC_empty.json")}, "6.2(1h)", - read_data(dir, "fabric_nodes_c9408_101.json"), + read_data(dir, "fabricNode_n9k_c9408.json"), script.NA, [], script.VER_NOT_AFFECTED, ), - # Applicable version but no C9408 node + # Version not affected (higher than 6.2(1g)) ( - {eqptLC_api: read_data(dir, "eqptLC_6_node101.json")}, + {eqptLC_api: read_data(dir, "eqptLC_6_node.json")}, "6.1(2f)", - read_data(dir, "fabric_nodes_no_c9408.json"), + read_data(dir, "fabricNode_no_n9k_c9408.json"), script.NA, [], "No N9K-C9408 nodes found. Skipping.", @@ -49,70 +49,70 @@ ( {eqptLC_api: read_data(dir, "eqptLC_empty.json")}, "6.1(2f)", - read_data(dir, "fabric_nodes_c9408_101.json"), + read_data(dir, "fabricNode_n9k_c9408.json"), script.PASS, [], "", ), # Applicable version, exactly 5 LEMs -> PASS ( - {eqptLC_api: read_data(dir, "eqptLC_5_node101.json")}, + {eqptLC_api: read_data(dir, "eqptLC_5_node.json")}, "6.2(1g)", - read_data(dir, "fabric_nodes_c9408_101.json"), + read_data(dir, "fabricNode_n9k_c9408.json"), script.PASS, [], "", ), # Applicable mid-train version 6.1(5e), less than 6 LEMs on C9408 -> PASS ( - {eqptLC_api: read_data(dir, "eqptLC_5_node101.json")}, + {eqptLC_api: read_data(dir, "eqptLC_5_node.json")}, "6.1(5e)", - read_data(dir, "fabric_nodes_c9408_101.json"), + read_data(dir, "fabricNode_n9k_c9408.json"), script.PASS, [], "", ), # Applicable mid-train version 6.1(5e), 6 LEMs on C9408 -> FAIL_O ( - {eqptLC_api: read_data(dir, "eqptLC_6_node101.json")}, + {eqptLC_api: read_data(dir, "eqptLC_6_node.json")}, "6.1(5e)", - read_data(dir, "fabric_nodes_c9408_101.json"), + read_data(dir, "fabricNode_n9k_c9408.json"), script.FAIL_O, [["101", "N9K-C9408", "N9K-X9400-16W", 6]], "", ), # Applicable mid-train version 6.1(5e), more than 6 LEMs on C9408 -> FAIL_O ( - {eqptLC_api: read_data(dir, "eqptLC_7_node101.json")}, + {eqptLC_api: read_data(dir, "eqptLC_7_node.json")}, "6.1(5e)", - read_data(dir, "fabric_nodes_c9408_101.json"), + read_data(dir, "fabricNode_n9k_c9408.json"), script.FAIL_O, [["101", "N9K-C9408", "N9K-X9400-16W", 7]], "", ), # Applicable version, 6 LEMs on C9408 -> FAIL_O ( - {eqptLC_api: read_data(dir, "eqptLC_6_node101.json")}, + {eqptLC_api: read_data(dir, "eqptLC_6_node.json")}, "6.1(2f)", - read_data(dir, "fabric_nodes_c9408_101.json"), + read_data(dir, "fabricNode_n9k_c9408.json"), script.FAIL_O, [["101", "N9K-C9408", "N9K-X9400-16W", 6]], "", ), # Applicable version, more than 6 LEMs on C9408 -> FAIL_O ( - {eqptLC_api: read_data(dir, "eqptLC_7_node101.json")}, + {eqptLC_api: read_data(dir, "eqptLC_7_node.json")}, "6.1(2f)", - read_data(dir, "fabric_nodes_c9408_101.json"), + read_data(dir, "fabricNode_n9k_c9408.json"), script.FAIL_O, [["101", "N9K-C9408", "N9K-X9400-16W", 7]], "", ), # Count only C9408 nodes and only matching LEM model ( - {eqptLC_api: read_data(dir, "eqptLC_mixed_101_102_201.json")}, + {eqptLC_api: read_data(dir, "eqptLC_mixed.json")}, "6.1(3a)", - read_data(dir, "fabric_nodes_mixed.json"), + read_data(dir, "fabricNode_mixed.json"), script.FAIL_O, [ ["101", "N9K-C9408", "N9K-X9400-16W", 6], From 6f8230809c24edede62a779e3b6caec321d91e19 Mon Sep 17 00:00:00 2001 From: Harinadh Saladi Date: Mon, 9 Mar 2026 08:00:56 +0000 Subject: [PATCH 05/16] Updated the if condition for maintenance release,6.1(5e) and variable name for impacted nodes.Also, updated pytest test cases --- aci-preupgrade-validation-script.py | 4 +-- docs/docs/validations.md | 6 +++- .../test_n9k_c9408_model_lem_count_check.py | 34 +++++++++---------- 3 files changed, 24 insertions(+), 20 deletions(-) diff --git a/aci-preupgrade-validation-script.py b/aci-preupgrade-validation-script.py index 6dda619..3f0867c 100644 --- a/aci-preupgrade-validation-script.py +++ b/aci-preupgrade-validation-script.py @@ -6059,7 +6059,7 @@ def n9k_c9408_model_lem_count_check(tversion, fabric_nodes, **kwargs): headers = ["Node ID", "Switch Model", "LEM Model", "LEM Count"] data = [] recommended_action = ( - "Upgrade from pre-16.1(2f) to 16.1(2f) or later on N9K-C9408 with 6 or more N9K-X9400-16W LEMs can result in boot loop. Choose a different version." + "Upgrade from pre-16.1(2f) to 16.1(2f) or later on N9K-C9408 with 6 or more N9K-X9400-16W LEMs can result in boot loop. Choose a different version." ) doc_url = 'https://datacenter.github.io/ACI-Pre-Upgrade-Validation-Script/validations/#n9k-c9408-with-6-n9k-x9400-16w-lems' @@ -6437,4 +6437,4 @@ def main(_args=None): msg = "Abort due to unexpected error - {}".format(e) prints(msg) log.error(msg, exc_info=True) - sys.exit(1) + sys.exit(1) \ No newline at end of file diff --git a/docs/docs/validations.md b/docs/docs/validations.md index 889b8db..21ccb2c 100644 --- a/docs/docs/validations.md +++ b/docs/docs/validations.md @@ -187,14 +187,18 @@ Items | Defect | This Script [Nexus 950X FM or LC Might Fail to boot after reload][d20] | CSCvg26013 | :white_check_mark: | :no_entry_sign: [Stale Decommissioned Spine][d21] | CSCwf58763 | :white_check_mark: | :no_entry_sign: [N9K-C9408 Platform Model][d22] | CSCwk77800 | :white_check_mark: | :no_entry_sign: -[N9K-C9408 with 6+ N9K-X9400-16W LEMs][d29] | CSCws82819 | :white_check_mark: | :no_entry_sign: [PBR High Scale][d23] | CSCwi66348 | :white_check_mark: | :no_entry_sign: [Standby Sup Image Sync][d24] | CSCwi66348 | :white_check_mark: | :no_entry_sign: [Observer Database Size][d25] | CSCvw45531 | :white_check_mark: | :no_entry_sign: [Stale pconsRA Object][d26] | CSCwp22212 | :warning:{title="Deprecated"} | :no_entry_sign: [ISIS DTEPs Byte Size][d27] | CSCwp15375 | :white_check_mark: | :no_entry_sign: +<<<<<<< HEAD [Policydist configpushShardCont Crash][d28] | CSCwp95515 | :white_check_mark: | :no_entry_sign: [Auto Firmware Update on Switch Discovery][d29] | CSCwe83941 | :white_check_mark: | :no_entry_sign: +======= +[Policydist configpushShardCont Crash][d28] | CSCwp95515 | :white_check_mark: | +[N9K-C9408 with 6+ N9K-X9400-16W LEMs][d29] | CSCws82819 | :white_check_mark: | :no_entry_sign: +>>>>>>> Updated the if condition for maintenance release,6.1(5e) and variable name for impacted nodes.Also, updated pytest test cases [d1]: #ep-announce-compatibility [d2]: #eventmgr-db-size-defect-susceptibility diff --git a/tests/checks/n9k_c9408_model_lem_count_check/test_n9k_c9408_model_lem_count_check.py b/tests/checks/n9k_c9408_model_lem_count_check/test_n9k_c9408_model_lem_count_check.py index 9b3b0b6..c7abfb4 100644 --- a/tests/checks/n9k_c9408_model_lem_count_check/test_n9k_c9408_model_lem_count_check.py +++ b/tests/checks/n9k_c9408_model_lem_count_check/test_n9k_c9408_model_lem_count_check.py @@ -36,7 +36,7 @@ [], script.VER_NOT_AFFECTED, ), - # Version not affected (higher than 6.2(1g)) + # Applicable version but no N9K-C9408 nodes found ( {eqptLC_api: read_data(dir, "eqptLC_6_node.json")}, "6.1(2f)", @@ -54,7 +54,7 @@ [], "", ), - # Applicable version, exactly 5 LEMs -> PASS + # Applicable version, C9408 exists, with <=5 LEMs -> PASS ( {eqptLC_api: read_data(dir, "eqptLC_5_node.json")}, "6.2(1g)", @@ -63,6 +63,15 @@ [], "", ), + # Applicable version with 6 LEMs -> FAIL_O + ( + {eqptLC_api: read_data(dir, "eqptLC_6_node.json")}, + "6.2(1g)", + read_data(dir, "fabricNode_n9k_c9408.json"), + script.FAIL_O, + [["101", "N9K-C9408", "N9K-X9400-16W", 6]], + "", + ), # Applicable mid-train version 6.1(5e), less than 6 LEMs on C9408 -> PASS ( {eqptLC_api: read_data(dir, "eqptLC_5_node.json")}, @@ -81,14 +90,14 @@ [["101", "N9K-C9408", "N9K-X9400-16W", 6]], "", ), - # Applicable mid-train version 6.1(5e), more than 6 LEMs on C9408 -> FAIL_O + # Version not affected (fixed after 6.1(5e)) ( - {eqptLC_api: read_data(dir, "eqptLC_7_node.json")}, - "6.1(5e)", + {eqptLC_api: read_data(dir, "eqptLC_6_node.json")}, + "6.1(5f)", read_data(dir, "fabricNode_n9k_c9408.json"), - script.FAIL_O, - [["101", "N9K-C9408", "N9K-X9400-16W", 7]], - "", + script.NA, + [], + script.VER_NOT_AFFECTED, ), # Applicable version, 6 LEMs on C9408 -> FAIL_O ( @@ -99,15 +108,6 @@ [["101", "N9K-C9408", "N9K-X9400-16W", 6]], "", ), - # Applicable version, more than 6 LEMs on C9408 -> FAIL_O - ( - {eqptLC_api: read_data(dir, "eqptLC_7_node.json")}, - "6.1(2f)", - read_data(dir, "fabricNode_n9k_c9408.json"), - script.FAIL_O, - [["101", "N9K-C9408", "N9K-X9400-16W", 7]], - "", - ), # Count only C9408 nodes and only matching LEM model ( {eqptLC_api: read_data(dir, "eqptLC_mixed.json")}, From 1bea834d025ecc4f03c2a22e3eff6aa4c54893e4 Mon Sep 17 00:00:00 2001 From: Harinadh Saladi Date: Tue, 10 Mar 2026 03:04:39 +0000 Subject: [PATCH 06/16] Addressed comments:recommended message,doc_url and rebased the code with latest changes --- aci-preupgrade-validation-script.py | 4 +-- docs/docs/validations.md | 26 +++++-------------- .../test_n9k_c9408_model_lem_count_check.py | 2 +- 3 files changed, 9 insertions(+), 23 deletions(-) diff --git a/aci-preupgrade-validation-script.py b/aci-preupgrade-validation-script.py index 3f0867c..0d61db5 100644 --- a/aci-preupgrade-validation-script.py +++ b/aci-preupgrade-validation-script.py @@ -6059,7 +6059,7 @@ def n9k_c9408_model_lem_count_check(tversion, fabric_nodes, **kwargs): headers = ["Node ID", "Switch Model", "LEM Model", "LEM Count"] data = [] recommended_action = ( - "Upgrade from pre-16.1(2f) to 16.1(2f) or later on N9K-C9408 with 6 or more N9K-X9400-16W LEMs can result in boot loop. Choose a different version." + "N9K-C9408 switches configured with >5 N9K-X9400-16W LEMs will enter a boot loop if upgraded to 16.1(2f)-16.1(5) or 16.2(1g). Please select a fix version." ) doc_url = 'https://datacenter.github.io/ACI-Pre-Upgrade-Validation-Script/validations/#n9k-c9408-with-6-n9k-x9400-16w-lems' @@ -6260,7 +6260,6 @@ class CheckManager: clock_signal_component_failure_check, stale_decomissioned_spine_check, n9408_model_check, - n9k_c9408_model_lem_count_check, pbr_high_scale_check, standby_sup_sync_check, isis_database_byte_check, @@ -6268,6 +6267,7 @@ class CheckManager: auto_firmware_update_on_switch_check, n9k_c9408_model_lem_count_check, auto_firmware_update_on_switch_check, + n9k_c9408_model_lem_count_check, ] ssh_checks = [ diff --git a/docs/docs/validations.md b/docs/docs/validations.md index 21ccb2c..9cad970 100644 --- a/docs/docs/validations.md +++ b/docs/docs/validations.md @@ -192,13 +192,9 @@ Items | Defect | This Script [Observer Database Size][d25] | CSCvw45531 | :white_check_mark: | :no_entry_sign: [Stale pconsRA Object][d26] | CSCwp22212 | :warning:{title="Deprecated"} | :no_entry_sign: [ISIS DTEPs Byte Size][d27] | CSCwp15375 | :white_check_mark: | :no_entry_sign: -<<<<<<< HEAD [Policydist configpushShardCont Crash][d28] | CSCwp95515 | :white_check_mark: | :no_entry_sign: [Auto Firmware Update on Switch Discovery][d29] | CSCwe83941 | :white_check_mark: | :no_entry_sign: -======= -[Policydist configpushShardCont Crash][d28] | CSCwp95515 | :white_check_mark: | -[N9K-C9408 with 6+ N9K-X9400-16W LEMs][d29] | CSCws82819 | :white_check_mark: | :no_entry_sign: ->>>>>>> Updated the if condition for maintenance release,6.1(5e) and variable name for impacted nodes.Also, updated pytest test cases +[N9K-C9408 with more than 5 N9K-X9400-16W LEMs][d30] | CSCws82819 | :white_check_mark: | :no_entry_sign: [d1]: #ep-announce-compatibility [d2]: #eventmgr-db-size-defect-susceptibility @@ -228,12 +224,9 @@ Items | Defect | This Script [d26]: #stale-pconsra-object [d27]: #isis-dteps-byte-size [d28]: #policydist-configpushshardcont-crash -<<<<<<< HEAD [d29]: #auto-firmware-update-on-switch-discovery -======= -[d29]: #n9k-c9408-with-6-n9k-x9400-16w-lems +[d30]: #n9k-c9408-with-more-than-5-n9k-x9400-16w-lems ->>>>>>> Added a new check for the bug 'CSCws82819N9K-C9408 boot loop on 16.1.2f and later with 6 or more LEMs' ## General Check Details @@ -2658,7 +2651,6 @@ Due to [CSCwp95515][59], upgrading to an affected version while having any `conf If any instances of `configpushShardCont` are flagged by this script, Cisco TAC must be contacted to identify and resolve the underlying issue before performing the upgrade. -<<<<<<< HEAD ### Auto Firmware Update on Switch Discovery [Auto Firmware Update on Switch Discovery][63] automatically upgrades a new switch to the target firmware version before registering it to the ACI fabric. This feature activates in three scenarios: @@ -2677,17 +2669,14 @@ To avoid this risk, consider disabling Auto Firmware Update before upgrading to !!! note This issue occurs because older switch firmware versions are not compatible with switch images 6.0(3) or newer. The APIC version is not a factor. -======= -### N9K-C9408 with 6 or more N9K-X9400-16W LEMs -Due to defect [CSCws82819][62], upgrading from pre-16.1(2f) to 16.1(2f) or later can result in a boot loop when a `N9K-C9408` node has 6 or more installed N9K-X9400-16W` LEMs. +### N9K-C9408 with more than 5 N9K-X9400-16W LEMs -Recommended action: +Due to defect [CSCws82819][64], `N9K-C9408` switch will experience a boot loop with dt_helper process crash if upgraded from pre-16.1(2f) to 16.1(2f)-16.1(5) or 16.2(1g) with more than 5 `N9K-X9400-16W` LEMs installed. -Please use a different target version. +To avoid this issue, please select a fix version. ->>>>>>> Removed if conditio for model check and modified the recommended actions [0]: https://github.com/datacenter/ACI-Pre-Upgrade-Validation-Script @@ -2752,9 +2741,6 @@ Please use a different target version. [59]: https://bst.cloudapps.cisco.com/bugsearch/bug/CSCwp95515 [60]: https://www.cisco.com/c/en/us/solutions/collateral/data-center-virtualization/application-centric-infrastructure/white-paper-c11-743951.html#Inter [61]: https://www.cisco.com/c/en/us/solutions/collateral/data-center-virtualization/application-centric-infrastructure/white-paper-c11-743951.html#EnablePolicyCompression -<<<<<<< HEAD [62]: https://bst.cloudapps.cisco.com/bugsearch/bug/CSCwe83941 [63]: https://www.cisco.com/c/en/us/td/docs/dcn/aci/apic/all/apic-installation-aci-upgrade-downgrade/Cisco-APIC-Installation-ACI-Upgrade-Downgrade-Guide/m-auto-firmware-update.html -======= -[62]: https://bst.cloudapps.cisco.com/bugsearch/bug/CSCws82819 ->>>>>>> Added a new check for the bug 'CSCws82819N9K-C9408 boot loop on 16.1.2f and later with 6 or more LEMs' +[64]: https://bst.cloudapps.cisco.com/bugsearch/bug/CSCws82819 diff --git a/tests/checks/n9k_c9408_model_lem_count_check/test_n9k_c9408_model_lem_count_check.py b/tests/checks/n9k_c9408_model_lem_count_check/test_n9k_c9408_model_lem_count_check.py index c7abfb4..5d2a37e 100644 --- a/tests/checks/n9k_c9408_model_lem_count_check/test_n9k_c9408_model_lem_count_check.py +++ b/tests/checks/n9k_c9408_model_lem_count_check/test_n9k_c9408_model_lem_count_check.py @@ -11,7 +11,7 @@ test_function = "n9k_c9408_model_lem_count_check" - +# icurl queries eqptLC_api = 'eqptLC.json?query-target-filter=eq(eqptLC.model,"N9K-X9400-16W")' From 53902980f3df68eedab53f36e48dee576655bcb9 Mon Sep 17 00:00:00 2001 From: Harinadh Saladi Date: Tue, 10 Mar 2026 06:28:38 +0000 Subject: [PATCH 07/16] Updated bugs section with the checks post rebase --- aci-preupgrade-validation-script.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/aci-preupgrade-validation-script.py b/aci-preupgrade-validation-script.py index 0d61db5..461abda 100644 --- a/aci-preupgrade-validation-script.py +++ b/aci-preupgrade-validation-script.py @@ -6053,7 +6053,7 @@ def auto_firmware_update_on_switch_check(cversion, tversion, **kwargs): return Result(result=result, headers=headers, data=data, recommended_action=recommended_action, doc_url=doc_url) -@check_wrapper(check_title='N9K-C9408 with 6 or more N9K-X9400-16W LEMs') +@check_wrapper(check_title='N9K-C9408 with more than 5 N9K-X9400-16W LEMs') def n9k_c9408_model_lem_count_check(tversion, fabric_nodes, **kwargs): result = PASS headers = ["Node ID", "Switch Model", "LEM Model", "LEM Count"] @@ -6061,7 +6061,7 @@ def n9k_c9408_model_lem_count_check(tversion, fabric_nodes, **kwargs): recommended_action = ( "N9K-C9408 switches configured with >5 N9K-X9400-16W LEMs will enter a boot loop if upgraded to 16.1(2f)-16.1(5) or 16.2(1g). Please select a fix version." ) - doc_url = 'https://datacenter.github.io/ACI-Pre-Upgrade-Validation-Script/validations/#n9k-c9408-with-6-n9k-x9400-16w-lems' + doc_url = 'https://datacenter.github.io/ACI-Pre-Upgrade-Validation-Script/validations/#n9k-c9408-with-more-than-5-n9k-x9400-16w-lems' if tversion.older_than("6.1(2f)") or (tversion.newer_than("6.1(5e)") and not tversion.same_as("6.2(1g)")): return Result(result=NA, msg=VER_NOT_AFFECTED) From 49aabe5f2e758116f1f54691e62d5eebdd5895bc Mon Sep 17 00:00:00 2001 From: Harinadh Saladi Date: Tue, 10 Mar 2026 06:33:08 +0000 Subject: [PATCH 08/16] Removed unwanted additional spaces --- docs/docs/validations.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/docs/docs/validations.md b/docs/docs/validations.md index 9cad970..342af5c 100644 --- a/docs/docs/validations.md +++ b/docs/docs/validations.md @@ -227,7 +227,6 @@ Items | Defect | This Script [d29]: #auto-firmware-update-on-switch-discovery [d30]: #n9k-c9408-with-more-than-5-n9k-x9400-16w-lems - ## General Check Details ### Compatibility (Target ACI Version) @@ -2676,9 +2675,6 @@ Due to defect [CSCws82819][64], `N9K-C9408` switch will experience a boot loop w To avoid this issue, please select a fix version. - - - [0]: https://github.com/datacenter/ACI-Pre-Upgrade-Validation-Script [1]: https://www.cisco.com/c/dam/en/us/td/docs/Website/datacenter/apicmatrix/index.html [2]: https://www.cisco.com/c/en/us/support/switches/nexus-9000-series-switches/products-release-notes-list.html @@ -2743,4 +2739,4 @@ To avoid this issue, please select a fix version. [61]: https://www.cisco.com/c/en/us/solutions/collateral/data-center-virtualization/application-centric-infrastructure/white-paper-c11-743951.html#EnablePolicyCompression [62]: https://bst.cloudapps.cisco.com/bugsearch/bug/CSCwe83941 [63]: https://www.cisco.com/c/en/us/td/docs/dcn/aci/apic/all/apic-installation-aci-upgrade-downgrade/Cisco-APIC-Installation-ACI-Upgrade-Downgrade-Guide/m-auto-firmware-update.html -[64]: https://bst.cloudapps.cisco.com/bugsearch/bug/CSCws82819 +[64]: https://bst.cloudapps.cisco.com/bugsearch/bug/CSCws82819 \ No newline at end of file From 31accd838a56b5ac79db8e71b805232f2d3300c6 Mon Sep 17 00:00:00 2001 From: Harinadh Saladi Date: Tue, 10 Mar 2026 11:40:43 +0000 Subject: [PATCH 09/16] Removed duplicate check entries --- aci-preupgrade-validation-script.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/aci-preupgrade-validation-script.py b/aci-preupgrade-validation-script.py index 461abda..0e2c302 100644 --- a/aci-preupgrade-validation-script.py +++ b/aci-preupgrade-validation-script.py @@ -6266,8 +6266,6 @@ class CheckManager: configpush_shard_check, auto_firmware_update_on_switch_check, n9k_c9408_model_lem_count_check, - auto_firmware_update_on_switch_check, - n9k_c9408_model_lem_count_check, ] ssh_checks = [ From 609d89f1b186b5985884e26b32d8f0a3c16ff86d Mon Sep 17 00:00:00 2001 From: Harinadh-Saladi Date: Tue, 10 Mar 2026 17:15:11 +0530 Subject: [PATCH 10/16] Update aci-preupgrade-validation-script.py Removed unwanted spaces --- aci-preupgrade-validation-script.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/aci-preupgrade-validation-script.py b/aci-preupgrade-validation-script.py index 0e2c302..c039b96 100644 --- a/aci-preupgrade-validation-script.py +++ b/aci-preupgrade-validation-script.py @@ -6435,4 +6435,5 @@ def main(_args=None): msg = "Abort due to unexpected error - {}".format(e) prints(msg) log.error(msg, exc_info=True) - sys.exit(1) \ No newline at end of file + sys.exit(1) + From 029e7354b2a99f90a9285eb60aa315b870f96d87 Mon Sep 17 00:00:00 2001 From: Harinadh-Saladi Date: Tue, 10 Mar 2026 18:59:41 +0530 Subject: [PATCH 11/16] Update validations.md Removed unwanted spaces --- docs/docs/validations.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/validations.md b/docs/docs/validations.md index 342af5c..de6d389 100644 --- a/docs/docs/validations.md +++ b/docs/docs/validations.md @@ -2739,4 +2739,4 @@ To avoid this issue, please select a fix version. [61]: https://www.cisco.com/c/en/us/solutions/collateral/data-center-virtualization/application-centric-infrastructure/white-paper-c11-743951.html#EnablePolicyCompression [62]: https://bst.cloudapps.cisco.com/bugsearch/bug/CSCwe83941 [63]: https://www.cisco.com/c/en/us/td/docs/dcn/aci/apic/all/apic-installation-aci-upgrade-downgrade/Cisco-APIC-Installation-ACI-Upgrade-Downgrade-Guide/m-auto-firmware-update.html -[64]: https://bst.cloudapps.cisco.com/bugsearch/bug/CSCws82819 \ No newline at end of file +[64]: https://bst.cloudapps.cisco.com/bugsearch/bug/CSCws82819 From f3f41ffea9fcb872c2b30b317dfddaea084d60aa Mon Sep 17 00:00:00 2001 From: Harinadh-Saladi Date: Tue, 10 Mar 2026 19:04:46 +0530 Subject: [PATCH 12/16] Updated validations.md file by removing unwanted space From fb8476b11ba71f834f95f97e94a720a183892876 Mon Sep 17 00:00:00 2001 From: Harinadh-Saladi Date: Wed, 11 Mar 2026 14:43:21 +0530 Subject: [PATCH 13/16] Updated validations.md file Updated validations.md file by modifying the impact and recommendation message. --- docs/docs/validations.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/docs/validations.md b/docs/docs/validations.md index de6d389..c322c88 100644 --- a/docs/docs/validations.md +++ b/docs/docs/validations.md @@ -2671,9 +2671,9 @@ To avoid this risk, consider disabling Auto Firmware Update before upgrading to ### N9K-C9408 with more than 5 N9K-X9400-16W LEMs -Due to defect [CSCws82819][64], `N9K-C9408` switch will experience a boot loop with dt_helper process crash if upgraded from pre-16.1(2f) to 16.1(2f)-16.1(5) or 16.2(1g) with more than 5 `N9K-X9400-16W` LEMs installed. +Due to defect [CSCws82819][64], N9K-C9408 switch will experience a boot loop with dt_helper process crash if upgraded to versions 16.1(2f) to 16.1(5) or 16.2(1g) with more than 5 `N9K-X9400-16W` LEMs installed. -To avoid this issue, please select a fix version. +To avoid this issue, please upgrade to fix version. [0]: https://github.com/datacenter/ACI-Pre-Upgrade-Validation-Script [1]: https://www.cisco.com/c/dam/en/us/td/docs/Website/datacenter/apicmatrix/index.html From 2483b356bbfc0669d4138070f5891f391614a246 Mon Sep 17 00:00:00 2001 From: Harinadh-Saladi Date: Wed, 11 Mar 2026 14:45:46 +0530 Subject: [PATCH 14/16] Updated validations.md Removed single quotes in the description. --- docs/docs/validations.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/validations.md b/docs/docs/validations.md index c322c88..6820172 100644 --- a/docs/docs/validations.md +++ b/docs/docs/validations.md @@ -2671,7 +2671,7 @@ To avoid this risk, consider disabling Auto Firmware Update before upgrading to ### N9K-C9408 with more than 5 N9K-X9400-16W LEMs -Due to defect [CSCws82819][64], N9K-C9408 switch will experience a boot loop with dt_helper process crash if upgraded to versions 16.1(2f) to 16.1(5) or 16.2(1g) with more than 5 `N9K-X9400-16W` LEMs installed. +Due to defect [CSCws82819][64], N9K-C9408 switch will experience a boot loop with dt_helper process crash if upgraded to versions 16.1(2f) to 16.1(5) or 16.2(1g) with more than 5 N9K-X9400-16W LEMs installed. To avoid this issue, please upgrade to fix version. From fb7b313b5be14727fbe6192882c20cd033fc42db Mon Sep 17 00:00:00 2001 From: Harinadh-Saladi Date: Thu, 12 Mar 2026 06:08:30 +0530 Subject: [PATCH 15/16] Updated aci-preupgrade-validation-script.py Updated recommended action. --- aci-preupgrade-validation-script.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aci-preupgrade-validation-script.py b/aci-preupgrade-validation-script.py index c039b96..1e2d6e3 100644 --- a/aci-preupgrade-validation-script.py +++ b/aci-preupgrade-validation-script.py @@ -6059,7 +6059,7 @@ def n9k_c9408_model_lem_count_check(tversion, fabric_nodes, **kwargs): headers = ["Node ID", "Switch Model", "LEM Model", "LEM Count"] data = [] recommended_action = ( - "N9K-C9408 switches configured with >5 N9K-X9400-16W LEMs will enter a boot loop if upgraded to 16.1(2f)-16.1(5) or 16.2(1g). Please select a fix version." + "N9K-C9408 switches configured with >5 N9K-X9400-16W LEMs will enter a boot loop if upgraded to impacted release of CSCws82819. Upgrade to Fix version or Use less than 6 LEMS on impacted release" ) doc_url = 'https://datacenter.github.io/ACI-Pre-Upgrade-Validation-Script/validations/#n9k-c9408-with-more-than-5-n9k-x9400-16w-lems' From ef1282f53e61d0ebf8d812056b86b26b4f1f41d5 Mon Sep 17 00:00:00 2001 From: Harinadh-Saladi Date: Thu, 12 Mar 2026 06:14:11 +0530 Subject: [PATCH 16/16] Updated validations.md Updated workaround message. --- docs/docs/validations.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/validations.md b/docs/docs/validations.md index 6820172..32c9465 100644 --- a/docs/docs/validations.md +++ b/docs/docs/validations.md @@ -2673,7 +2673,7 @@ To avoid this risk, consider disabling Auto Firmware Update before upgrading to Due to defect [CSCws82819][64], N9K-C9408 switch will experience a boot loop with dt_helper process crash if upgraded to versions 16.1(2f) to 16.1(5) or 16.2(1g) with more than 5 N9K-X9400-16W LEMs installed. -To avoid this issue, please upgrade to fix version. +To avoid this issue, please upgrade to fix version or use less than 6 N9K-X9400-16W in one spine node. [0]: https://github.com/datacenter/ACI-Pre-Upgrade-Validation-Script [1]: https://www.cisco.com/c/dam/en/us/td/docs/Website/datacenter/apicmatrix/index.html