From f3ac3dd46e78eb3d16fa2710baf936677574f7f0 Mon Sep 17 00:00:00 2001 From: Yaqiang Zhu Date: Fri, 26 May 2023 23:49:26 +0800 Subject: [PATCH] [202205][minigraph] Add rack_mgmt_rack parse support in minigraph.py (#15064) (#15177) Why I did it We need to store information of power shelf in config_db for SONiC MX switch. Current minigraph parser cannot parse rack_mgmt_map field. Work item tracking Microsoft ADO (number only): 22179645 How I did it Add support for parsing rack_mgmt_map. --- src/sonic-config-engine/minigraph.py | 11 +++++++++-- .../tests/simple-sample-graph-case.xml | 5 +++++ src/sonic-config-engine/tests/test_minigraph_case.py | 5 +++++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index 6458aad179..9a7902928e 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -985,6 +985,7 @@ def parse_meta(meta, hname): redundancy_type = None downstream_redundancy_types = None qos_profile = None + rack_mgmt_map = None device_metas = meta.find(str(QName(ns, "Devices"))) for device in device_metas.findall(str(QName(ns1, "DeviceMetadata"))): @@ -1034,7 +1035,9 @@ def parse_meta(meta, hname): downstream_redundancy_types = value elif name == "SonicQosProfile": qos_profile = value - return syslog_servers, dhcp_servers, dhcpv6_servers, ntp_servers, tacacs_servers, mgmt_routes, erspan_dst, deployment_id, region, cloudtype, resource_type, downstream_subrole, switch_id, switch_type, max_cores, kube_data, macsec_profile, downstream_redundancy_types, redundancy_type, qos_profile + elif name == "RackMgmtMap": + rack_mgmt_map = value + return syslog_servers, dhcp_servers, dhcpv6_servers, ntp_servers, tacacs_servers, mgmt_routes, erspan_dst, deployment_id, region, cloudtype, resource_type, downstream_subrole, switch_id, switch_type, max_cores, kube_data, macsec_profile, downstream_redundancy_types, redundancy_type, qos_profile, rack_mgmt_map def parse_linkmeta(meta, hname): @@ -1460,6 +1463,7 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None, hw downstream_redundancy_types = None redundancy_type = None qos_profile = None + rack_mgmt_map = None hwsku_qn = QName(ns, "HwSku") hostname_qn = QName(ns, "Hostname") @@ -1492,7 +1496,7 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None, hw elif child.tag == str(QName(ns, "UngDec")): (u_neighbors, u_devices, _, _, _, _, _, _) = parse_png(child, hostname, None) elif child.tag == str(QName(ns, "MetadataDeclaration")): - (syslog_servers, dhcp_servers, dhcpv6_servers, ntp_servers, tacacs_servers, mgmt_routes, erspan_dst, deployment_id, region, cloudtype, resource_type, downstream_subrole, switch_id, switch_type, max_cores, kube_data, macsec_profile, downstream_redundancy_types, redundancy_type, qos_profile) = parse_meta(child, hostname) + (syslog_servers, dhcp_servers, dhcpv6_servers, ntp_servers, tacacs_servers, mgmt_routes, erspan_dst, deployment_id, region, cloudtype, resource_type, downstream_subrole, switch_id, switch_type, max_cores, kube_data, macsec_profile, downstream_redundancy_types, redundancy_type, qos_profile, rack_mgmt_map) = parse_meta(child, hostname) elif child.tag == str(QName(ns, "LinkMetadataDeclaration")): linkmetas = parse_linkmeta(child, hostname) elif child.tag == str(QName(ns, "DeviceInfos")): @@ -1536,6 +1540,9 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None, hw if deployment_id is not None: results['DEVICE_METADATA']['localhost']['deployment_id'] = deployment_id + if rack_mgmt_map is not None: + results['DEVICE_METADATA']['localhost']['rack_mgmt_map'] = rack_mgmt_map + cluster = [devices[key] for key in devices if key.lower() == hostname.lower()][0].get('cluster', "") if cluster: results['DEVICE_METADATA']['localhost']['cluster'] = cluster diff --git a/src/sonic-config-engine/tests/simple-sample-graph-case.xml b/src/sonic-config-engine/tests/simple-sample-graph-case.xml index 89b0ca9e0d..aaade89d5d 100644 --- a/src/sonic-config-engine/tests/simple-sample-graph-case.xml +++ b/src/sonic-config-engine/tests/simple-sample-graph-case.xml @@ -537,6 +537,11 @@ Mixed + + RackMgmtMap + + dummy_value + diff --git a/src/sonic-config-engine/tests/test_minigraph_case.py b/src/sonic-config-engine/tests/test_minigraph_case.py index d265be199c..23d2b0cac8 100644 --- a/src/sonic-config-engine/tests/test_minigraph_case.py +++ b/src/sonic-config-engine/tests/test_minigraph_case.py @@ -194,6 +194,11 @@ class TestCfgGenCaseInsensitive(TestCase): output = self.run_script(argument) self.assertEqual(output.strip(), "1") + def test_minigraph_rack_mgmt_map(self): + argument = '-m "' + self.sample_graph + '" -p "' + self.port_config + '" -v "DEVICE_METADATA[\'localhost\'][\'rack_mgmt_map\']"' + output = self.run_script(argument) + self.assertEqual(output.strip(), "dummy_value") + def test_minigraph_cluster(self): argument = '-m "' + self.sample_graph + '" -p "' + self.port_config + '" -v "DEVICE_METADATA[\'localhost\'][\'cluster\']"' output = self.run_script(argument)