From f304682907c49445413a3093fec10dc349dedb1e Mon Sep 17 00:00:00 2001 From: jcaiMR Date: Fri, 2 Sep 2022 07:28:42 +0000 Subject: [PATCH 1/3] yang mode support for neighbor metadata --- src/sonic-config-engine/minigraph.py | 40 +++++-- .../tests/test_minigraph_case.py | 39 +++---- .../tests/test_multinpu_cfggen.py | 12 +- src/sonic-yang-models/setup.py | 2 + .../tests/files/sample_config_db.json | 20 ++++ .../tests/device_neighbor_metadata.json | 15 +++ .../device_neighbor_metadata.json | 107 ++++++++++++++++++ .../sonic-device_neighbor_metadata.yang | 91 +++++++++++++++ 8 files changed, 292 insertions(+), 34 deletions(-) create mode 100644 src/sonic-yang-models/tests/yang_model_tests/tests/device_neighbor_metadata.json create mode 100644 src/sonic-yang-models/tests/yang_model_tests/tests_config/device_neighbor_metadata.json create mode 100644 src/sonic-yang-models/yang-models/sonic-device_neighbor_metadata.yang diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index 9518678bb5b7..85d9a91030ca 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -260,14 +260,24 @@ def parse_png(png, hname, dpg_ecmp_content = None): if child.tag == str(QName(ns, "Devices")): for device in child.findall(str(QName(ns, "Device"))): (lo_prefix, lo_prefix_v6, mgmt_prefix, mgmt_prefix_v6, name, hwsku, d_type, deployment_id, cluster, d_subtype) = parse_device(device) - device_data = {'lo_addr': lo_prefix, 'type': d_type, 'mgmt_addr': mgmt_prefix, 'hwsku': hwsku} - if cluster: + device_data = {} + if hwsku != None: + device_data['hwsku'] = hwsku + if cluster != None: device_data['cluster'] = cluster - if deployment_id: + if deployment_id != None: device_data['deployment_id'] = deployment_id - if lo_prefix_v6: + if lo_prefix != None: + device_data['lo_addr'] = lo_prefix + if lo_prefix_v6 != None: device_data['lo_addr_v6'] = lo_prefix_v6 - if d_subtype: + if mgmt_prefix != None: + device_data['mgmt_addr'] = mgmt_prefix + if mgmt_prefix_v6 != None: + device_data['mgmt_addr_v6'] = mgmt_prefix_v6 + if d_type != None: + device_data['type'] = d_type + if d_subtype != None: device_data['subtype'] = d_subtype devices[name] = device_data @@ -393,13 +403,23 @@ def parse_asic_png(png, asic_name, hostname): if child.tag == str(QName(ns, "Devices")): for device in child.findall(str(QName(ns, "Device"))): (lo_prefix, lo_prefix_v6, mgmt_prefix, mgmt_prefix_v6, name, hwsku, d_type, deployment_id, cluster, _) = parse_device(device) - device_data = {'lo_addr': lo_prefix, 'type': d_type, 'mgmt_addr': mgmt_prefix, 'hwsku': hwsku } - if cluster: + device_data = {} + if hwsku != None: + device_data['hwsku'] = hwsku + if cluster != None: device_data['cluster'] = cluster - if deployment_id: + if deployment_id != None: device_data['deployment_id'] = deployment_id - if lo_prefix_v6: - device_data['lo_addr_v6']= lo_prefix_v6 + if lo_prefix != None: + device_data['lo_addr'] = lo_prefix + if lo_prefix_v6 != None: + device_data['lo_addr_v6'] = lo_prefix_v6 + if mgmt_prefix != None: + device_data['mgmt_addr'] = mgmt_prefix + if mgmt_prefix_v6 != None: + device_data['mgmt_addr_v6'] = mgmt_prefix_v6 + if d_type != None: + device_data['type'] = d_type devices[name] = device_data return (neighbors, devices, port_speeds) diff --git a/src/sonic-config-engine/tests/test_minigraph_case.py b/src/sonic-config-engine/tests/test_minigraph_case.py index 2aa78944163b..9ee8a49db6ae 100644 --- a/src/sonic-config-engine/tests/test_minigraph_case.py +++ b/src/sonic-config-engine/tests/test_minigraph_case.py @@ -203,39 +203,40 @@ def test_minigraph_neighbor_metadata(self): argument = '-m "' + self.sample_graph + '" -p "' + self.port_config + '" -v "DEVICE_NEIGHBOR_METADATA"' expected_table = { - 'switch-01t1': { - 'lo_addr': '10.1.0.186/32', - 'mgmt_addr': '10.7.0.196/26', - 'hwsku': 'Force10-S6000', - 'type': 'LeafRouter', - 'deployment_id': '2' - }, 'switch2-t0': { - 'hwsku': 'Force10-S6000', 'lo_addr': '25.1.1.10/32', 'mgmt_addr': '10.7.0.196/26', + 'hwsku': 'Force10-S6000', 'type': 'ToRRouter' }, - 'server1': { + 'server2': { + 'lo_addr_v6': 'fe80::0002/128', + 'lo_addr': '10.10.10.2/32', + 'mgmt_addr': '10.0.0.2/32', 'hwsku': 'server-sku', - 'lo_addr': '10.10.10.1/32', - 'lo_addr_v6': 'fe80::0001/80', - 'mgmt_addr': '10.0.0.1/32', 'type': 'Server' }, - 'server2': { + 'server1': { + 'lo_addr_v6': 'fe80::0001/80', + 'lo_addr': '10.10.10.1/32', + 'mgmt_addr': '10.0.0.1/32', 'hwsku': 'server-sku', - 'lo_addr': '10.10.10.2/32', - 'lo_addr_v6': 'fe80::0002/128', - 'mgmt_addr': '10.0.0.2/32', 'type': 'Server' }, + 'switch-01t1': { + 'lo_addr': '10.1.0.186/32', + 'deployment_id': '2', + 'hwsku': 'Force10-S6000', + 'type': 'LeafRouter', + 'mgmt_addr': '10.7.0.196/26' + }, 'server1-SC': { - 'hwsku': 'smartcable-sku', - 'lo_addr': '0.0.0.0/0', 'lo_addr_v6': '::/0', 'mgmt_addr': '0.0.0.0/0', - 'type': 'SmartCable' + 'hwsku': 'smartcable-sku', + 'lo_addr': '0.0.0.0/0', + 'type': 'SmartCable', + 'mgmt_addr_v6': '::/0', } } output = self.run_script(argument) diff --git a/src/sonic-config-engine/tests/test_multinpu_cfggen.py b/src/sonic-config-engine/tests/test_multinpu_cfggen.py index a34b0b6cfd78..2bfb879a1ad2 100644 --- a/src/sonic-config-engine/tests/test_multinpu_cfggen.py +++ b/src/sonic-config-engine/tests/test_multinpu_cfggen.py @@ -250,10 +250,11 @@ def test_frontend_asic_device_neigh(self): def test_frontend_asic_device_neigh_metadata(self): argument = "-m {} -p {} -n asic0 --var-json \"DEVICE_NEIGHBOR_METADATA\"".format(self.sample_graph, self.port_config[0]) output = json.loads(self.run_script(argument)) + print(output) self.assertDictEqual(output, \ - {'01T2': {'lo_addr': None, 'mgmt_addr': '89.139.132.40', 'hwsku': 'VM', 'type': 'SpineRouter'}, - 'ASIC3': {'lo_addr': '0.0.0.0/0', 'lo_addr_v6': '::/0', 'mgmt_addr': '0.0.0.0/0', 'hwsku': 'multi-npu-asic', 'type': 'Asic'}, - 'ASIC2': {'lo_addr': '0.0.0.0/0', 'lo_addr_v6': '::/0', 'mgmt_addr': '0.0.0.0/0', 'hwsku': 'multi-npu-asic', 'type': 'Asic'}}) + {'01T2': {'mgmt_addr': '89.139.132.40', 'hwsku': 'VM', 'type': 'SpineRouter'}, + 'ASIC3': {'lo_addr_v6': '::/0', 'mgmt_addr': '0.0.0.0/0', 'hwsku': 'multi-npu-asic', 'lo_addr': '0.0.0.0/0', 'type': 'Asic', 'mgmt_addr_v6': '::/0'}, + 'ASIC2': {'lo_addr_v6': '::/0', 'mgmt_addr': '0.0.0.0/0', 'hwsku': 'multi-npu-asic', 'lo_addr': '0.0.0.0/0', 'type': 'Asic', 'mgmt_addr_v6': '::/0'}}) def test_backend_asic_device_neigh(self): argument = "-m {} -p {} -n asic3 --var-json \"DEVICE_NEIGHBOR\"".format(self.sample_graph, self.port_config[3]) @@ -267,9 +268,10 @@ def test_backend_asic_device_neigh(self): def test_backend_device_neigh_metadata(self): argument = "-m {} -p {} -n asic3 --var-json \"DEVICE_NEIGHBOR_METADATA\"".format(self.sample_graph, self.port_config[3]) output = json.loads(self.run_script(argument)) + print(output) self.assertDictEqual(output, \ - {'ASIC1': {'lo_addr': '0.0.0.0/0', 'lo_addr_v6': '::/0', 'mgmt_addr': '0.0.0.0/0', 'hwsku': 'multi-npu-asic', 'type': 'Asic'}, - 'ASIC0': {'lo_addr': '0.0.0.0/0', 'lo_addr_v6': '::/0', 'mgmt_addr': '0.0.0.0/0', 'hwsku': 'multi-npu-asic', 'type': 'Asic'}}) + {'ASIC1': {'lo_addr_v6': '::/0', 'mgmt_addr': '0.0.0.0/0', 'hwsku': 'multi-npu-asic', 'lo_addr': '0.0.0.0/0', 'type': 'Asic', 'mgmt_addr_v6': '::/0'}, + 'ASIC0': {'lo_addr_v6': '::/0', 'mgmt_addr': '0.0.0.0/0', 'hwsku': 'multi-npu-asic', 'lo_addr': '0.0.0.0/0', 'type': 'Asic', 'mgmt_addr_v6': '::/0'}}) def test_frontend_bgp_neighbor(self): argument = "-m {} -p {} -n asic0 --var-json \"BGP_NEIGHBOR\"".format(self.sample_graph, self.port_config[0]) diff --git a/src/sonic-yang-models/setup.py b/src/sonic-yang-models/setup.py index f5ff5b5fe5f2..cc014c6b4071 100644 --- a/src/sonic-yang-models/setup.py +++ b/src/sonic-yang-models/setup.py @@ -102,6 +102,7 @@ def run(self): './yang-models/sonic-default-lossless-buffer-parameter.yang', './yang-models/sonic-device_metadata.yang', './yang-models/sonic-device_neighbor.yang', + './yang-models/sonic-device_neighbor_metadata.yang', './yang-models/sonic-dhcpv6-relay.yang', './yang-models/sonic-extension.yang', './yang-models/sonic-flex_counter.yang', @@ -170,6 +171,7 @@ def run(self): './cvlyang-models/sonic-crm.yang', './cvlyang-models/sonic-device_metadata.yang', './cvlyang-models/sonic-device_neighbor.yang', + './cvlyang-models/sonic-device_neighbor_metadata.yang', './cvlyang-models/sonic-extension.yang', './cvlyang-models/sonic-flex_counter.yang', './cvlyang-models/sonic-feature.yang', diff --git a/src/sonic-yang-models/tests/files/sample_config_db.json b/src/sonic-yang-models/tests/files/sample_config_db.json index c7d199fa9f24..6a9ff7b9e915 100644 --- a/src/sonic-yang-models/tests/files/sample_config_db.json +++ b/src/sonic-yang-models/tests/files/sample_config_db.json @@ -391,6 +391,26 @@ "port": "Eth18" } }, + "DEVICE_NEIGHBOR_METADATA": { + "dccsw01.nw": { + "lo_addr": "0.0.0.0/0", + "mgmt_addr": "10.184.228.211/32", + "hwsku": "Arista", + "type": "LeafRouter", + "deployment_id": "1" + }, + "dccsw02.nw": { + "mgmt_addr_v6": "2a04:5555:40:a709::2/128", + "hwsku": "Arista", + "type": "LeafRouter", + "deployment_id": "1" + }, + "dccsw03.nw": { + "hwsku": "Arista", + "type": "LeafRouter", + "deployment_id": "1" + } + }, "MGMT_PORT": { "eth0": { "alias": "eth0", diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/device_neighbor_metadata.json b/src/sonic-yang-models/tests/yang_model_tests/tests/device_neighbor_metadata.json new file mode 100644 index 000000000000..2943a53d1b91 --- /dev/null +++ b/src/sonic-yang-models/tests/yang_model_tests/tests/device_neighbor_metadata.json @@ -0,0 +1,15 @@ +{ + "DEVICE_NEIGHBOR_METADATA_TABLE": { + "desc": "DEVICE_NEIGHBOR_METADATA_TABLE config pattern." + }, + "DEVICE_NEIGHBOR_METADATA_TYPE_INCORRECT_PATTERN": { + "desc": "DEVICE_NEIGHBOR_METADATA_TYPE_INCORRECT_PATTERN pattern failure.", + "eStrKey" : "Pattern" + }, + "DEVICE_NEIGHBOR_METADATA_TYPE_CORRECT_PATTERN": { + "desc": "DEVICE_NEIGHBOR_METADATA correct value for Type field" + }, + "DEVICE_NEIGHBOR_METADATA_TYPE_NOT_PROVISIONED_PATTERN": { + "desc": "DEVICE_NEIGHBOR_METADATA value as not-provisioned for Type field" + } +} \ No newline at end of file diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/device_neighbor_metadata.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/device_neighbor_metadata.json new file mode 100644 index 000000000000..ecc0c35d2208 --- /dev/null +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/device_neighbor_metadata.json @@ -0,0 +1,107 @@ +{ + "DEVICE_NEIGHBOR_METADATA_TYPE_INCORRECT_PATTERN": { + "sonic-device_neighbor_metadata:sonic-device_neighbor_metadata": { + "sonic-device_neighbor_metadata:DEVICE_NEIGHBOR_METADATA": { + "DEVICE_NEIGHBOR_METADATA_LIST": [ + { + "name": "Ethernet116", + "hwsku": "Arista", + "type": "ToRrouter" + } + ] + } + } + }, + "DEVICE_NEIGHBOR_METADATA_TYPE_CORRECT_PATTERN": { + "sonic-device_neighbor_metadata:sonic-device_neighbor_metadata": { + "sonic-device_neighbor_metadata:DEVICE_NEIGHBOR_METADATA": { + "DEVICE_NEIGHBOR_METADATA_LIST": [ + { + "name": "Ethernet116", + "hwsku": "Arista", + "type": "BackEndToRRouter" + } + ] + } + } + }, + "DEVICE_NEIGHBOR_METADATA_TYPE_NOT_PROVISIONED_PATTERN": { + "sonic-device_neighbor_metadata:sonic-device_neighbor_metadata": { + "sonic-device_neighbor_metadata:DEVICE_NEIGHBOR_METADATA": { + "DEVICE_NEIGHBOR_METADATA_LIST": [ + { + "name": "Ethernet116", + "hwsku": "Arista", + "type": "not-provisioned" + } + ] + } + } + }, + "DEVICE_NEIGHBOR_METADATA_TABLE": { + "sonic-device_neighbor_metadata:sonic-device_neighbor_metadata": { + "sonic-device_neighbor_metadata:DEVICE_NEIGHBOR_METADATA": { + "DEVICE_NEIGHBOR_METADATA_LIST": [ + { + "lo_addr": "25.77.193.11/32", + "mgmt_addr": "0.0.0.0/0", + "name": "dccsw01.nw", + "hwsku": "Arista", + "type": "ToRRouter", + "deployment_id": "1" + }, + { + "lo_addr": "0.0.0.0/0", + "mgmt_addr": "10.11.150.46/26", + "name": "dccsw02.nw", + "hwsku": "Arista", + "type": "LeafRouter", + "deployment_id": "1" + }, + { + "lo_addr_v6": "2a04:5555:40:a709::2/126", + "mgmt_addr": "10.11.150.47/26", + "name": "dccsw03.nw", + "hwsku": "Arista", + "type": "SpineRouter", + "deployment_id": "1" + }, + { + "name": "dccsw04.nw", + "mgmt_addr_v6": "2a04:5555:40:a708::2/126", + "hwsku": "Arista", + "type": "LeafRouter", + "deployment_id": "1" + }, + { + "name": "dccsw05.nw", + "hwsku": "Arista", + "type": "LeafRouter", + "deployment_id": "1" + }, + { + "lo_addr_v6": "2a04:5555:40:a710::2/126", + "name": "dccsw06.nw", + "hwsku": "Arista", + "type": "LeafRouter", + "deployment_id": "1" + }, + { + "lo_addr": "25.77.193.11/32", + "name": "dccsw07.nw", + "hwsku": "Arista", + "type": "LeafRouter", + "deployment_id": "1" + }, + { + "mgmt_addr": "10.11.150.48/26", + "name": "dccsw08.nw", + "hwsku": "Arista", + "type": "LeafRouter", + "deployment_id": "1" + } + ] + } + } + } +} diff --git a/src/sonic-yang-models/yang-models/sonic-device_neighbor_metadata.yang b/src/sonic-yang-models/yang-models/sonic-device_neighbor_metadata.yang new file mode 100644 index 000000000000..4625eaa7e5db --- /dev/null +++ b/src/sonic-yang-models/yang-models/sonic-device_neighbor_metadata.yang @@ -0,0 +1,91 @@ +module sonic-device_neighbor_metadata { + + yang-version 1.1; + + namespace "http://github.com/Azure/sonic-device_neighbor_metadata"; + prefix device_neighbor_metadata; + + import ietf-yang-types { + prefix yang; + } + + import ietf-inet-types { + prefix inet; + } + + import sonic-types { + prefix stypes; + } + + description "DEVICE_NEIGHBOR_METADATA YANG Module for SONiC OS"; + + revision 2022-08-25 { + description "First Revision"; + } + + container sonic-device_neighbor_metadata { + + container DEVICE_NEIGHBOR_METADATA { + + description "DEVICE_NEIGHBOR_METADATA part of config_db.json"; + + list DEVICE_NEIGHBOR_METADATA_LIST { + + key "name"; + + leaf name { + type string { + length 1..255; + } + } + + leaf hwsku { + type stypes:hwsku; + } + + leaf lo_addr { + type union { + type inet:ipv4-prefix; + type inet:ipv4-address; + } + } + + leaf lo_addr_v6 { + type union { + type inet:ipv6-prefix; + type inet:ipv6-address; + } + } + + leaf mgmt_addr { + type union { + type inet:ipv4-prefix; + type inet:ipv4-address; + } + } + + leaf mgmt_addr_v6 { + type union { + type inet:ipv6-prefix; + type inet:ipv6-address; + } + } + + leaf type { + description "Network element type"; + type string { + pattern "ToRRouter|LeafRouter|SpineChassisFrontendRouter|ChassisBackendRouter|ASIC|Asic|Supervior|MgmtToRRouter|SpineRouter|BackEndToRRouter|BackEndLeafRouter|EPMS|MgmtTsToR|BmcMgmtToRRouter|Server|MiniPower|SmartCable|Ixia|not-provisioned"; + } + } + + leaf deployment_id { + type uint32; + } + } + /* end of list DEVICE_NEIGHBOR_METADATA_LIST */ + } + /* end of container DEVICE_NEIGHBOR_METADATA */ + } + /* end of container sonic-device_neighbor_metadata */ +} +/* end of module sonic-device_neighbor_metadata */ From 70caa02e9997c161772b61d28dd36d6c03032af9 Mon Sep 17 00:00:00 2001 From: jcaiMR Date: Sat, 3 Sep 2022 14:32:42 +0000 Subject: [PATCH 2/3] add description in leaf node --- .../yang-models/sonic-device_neighbor_metadata.yang | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/sonic-yang-models/yang-models/sonic-device_neighbor_metadata.yang b/src/sonic-yang-models/yang-models/sonic-device_neighbor_metadata.yang index 4625eaa7e5db..594e57bb42d9 100644 --- a/src/sonic-yang-models/yang-models/sonic-device_neighbor_metadata.yang +++ b/src/sonic-yang-models/yang-models/sonic-device_neighbor_metadata.yang @@ -34,6 +34,7 @@ module sonic-device_neighbor_metadata { key "name"; leaf name { + description "device name string, max length 255"; type string { length 1..255; } @@ -44,6 +45,8 @@ module sonic-device_neighbor_metadata { } leaf lo_addr { + description "device looback ipv4 address, type of ietf-inet + ipv4-prefix or ipv4-address"; type union { type inet:ipv4-prefix; type inet:ipv4-address; @@ -51,6 +54,8 @@ module sonic-device_neighbor_metadata { } leaf lo_addr_v6 { + description "device looback ipv6 address, type of ietf-inet + ipv6-prefix or ipv6-address"; type union { type inet:ipv6-prefix; type inet:ipv6-address; @@ -58,6 +63,8 @@ module sonic-device_neighbor_metadata { } leaf mgmt_addr { + description "device managerment ipv4 address, type of ietf-inet + ipv4-prefix or ipv4-address"; type union { type inet:ipv4-prefix; type inet:ipv4-address; @@ -65,6 +72,8 @@ module sonic-device_neighbor_metadata { } leaf mgmt_addr_v6 { + description "device managerment ipv6 address, type of ietf-inet + ipv6-prefix or ipv6-address"; type union { type inet:ipv6-prefix; type inet:ipv6-address; From e2ee6ebdfac738901357a0e49b2bc2bb695fcdb0 Mon Sep 17 00:00:00 2001 From: jcaiMR Date: Sat, 3 Sep 2022 14:48:47 +0000 Subject: [PATCH 3/3] modify description --- .../yang-models/sonic-device_neighbor_metadata.yang | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/sonic-yang-models/yang-models/sonic-device_neighbor_metadata.yang b/src/sonic-yang-models/yang-models/sonic-device_neighbor_metadata.yang index 594e57bb42d9..76526f801c92 100644 --- a/src/sonic-yang-models/yang-models/sonic-device_neighbor_metadata.yang +++ b/src/sonic-yang-models/yang-models/sonic-device_neighbor_metadata.yang @@ -34,7 +34,7 @@ module sonic-device_neighbor_metadata { key "name"; leaf name { - description "device name string, max length 255"; + description "Host name string, max length 255"; type string { length 1..255; } @@ -45,7 +45,7 @@ module sonic-device_neighbor_metadata { } leaf lo_addr { - description "device looback ipv4 address, type of ietf-inet + description "Device loopback ipv4 address, type of ietf-inet ipv4-prefix or ipv4-address"; type union { type inet:ipv4-prefix; @@ -54,7 +54,7 @@ module sonic-device_neighbor_metadata { } leaf lo_addr_v6 { - description "device looback ipv6 address, type of ietf-inet + description "Device loopback ipv6 address, type of ietf-inet ipv6-prefix or ipv6-address"; type union { type inet:ipv6-prefix; @@ -63,7 +63,7 @@ module sonic-device_neighbor_metadata { } leaf mgmt_addr { - description "device managerment ipv4 address, type of ietf-inet + description "Device management ipv4 address, type of ietf-inet ipv4-prefix or ipv4-address"; type union { type inet:ipv4-prefix; @@ -72,7 +72,7 @@ module sonic-device_neighbor_metadata { } leaf mgmt_addr_v6 { - description "device managerment ipv6 address, type of ietf-inet + description "Device management ipv6 address, type of ietf-inet ipv6-prefix or ipv6-address"; type union { type inet:ipv6-prefix;