diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py
index 6c829858379..abdc0747453 100644
--- a/src/sonic-config-engine/minigraph.py
+++ b/src/sonic-config-engine/minigraph.py
@@ -60,6 +60,7 @@ def default(self, obj):
def parse_device(device):
lo_prefix = None
mgmt_prefix = None
+ mgmt_prefix_v6 = None
d_type = None # don't shadow type()
hwsku = None
name = None
@@ -70,6 +71,8 @@ def parse_device(device):
lo_prefix = node.find(str(QName(ns2, "IPPrefix"))).text
elif node.tag == str(QName(ns, "ManagementAddress")):
mgmt_prefix = node.find(str(QName(ns2, "IPPrefix"))).text
+ elif node.tag == str(QName(ns, "ManagementAddressV6")):
+ mgmt_prefix_v6 = node.find(str(QName(ns2, "IPPrefix"))).text
elif node.tag == str(QName(ns, "Hostname")):
name = node.text
elif node.tag == str(QName(ns, "HwSku")):
@@ -82,7 +85,8 @@ def parse_device(device):
if d_type is None and str(QName(ns3, "type")) in device.attrib:
d_type = device.attrib[str(QName(ns3, "type"))]
- return (lo_prefix, mgmt_prefix, name, hwsku, d_type, deployment_id)
+ return (lo_prefix, mgmt_prefix, mgmt_prefix_v6, name, hwsku, d_type, deployment_id)
+
def parse_png(png, hname):
neighbors = {}
@@ -145,7 +149,7 @@ def parse_png(png, hname):
if child.tag == str(QName(ns, "Devices")):
for device in child.findall(str(QName(ns, "Device"))):
- (lo_prefix, mgmt_prefix, name, hwsku, d_type, deployment_id) = parse_device(device)
+ (lo_prefix, mgmt_prefix, mgmt_prefix_v6, name, hwsku, d_type, deployment_id) = parse_device(device)
device_data = {'lo_addr': lo_prefix, 'type': d_type, 'mgmt_addr': mgmt_prefix, 'hwsku': hwsku }
if deployment_id:
device_data['deployment_id'] = deployment_id
@@ -257,7 +261,7 @@ 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, mgmt_prefix, name, hwsku, d_type, deployment_id) = parse_device(device)
+ (lo_prefix, mgmt_prefix, mgmt_prefix_v6, name, hwsku, d_type, deployment_id) = parse_device(device)
device_data = {'lo_addr': lo_prefix, 'type': d_type, 'mgmt_addr': mgmt_prefix, 'hwsku': hwsku }
if deployment_id:
device_data['deployment_id'] = deployment_id
@@ -1292,7 +1296,7 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None):
def parse_device_desc_xml(filename):
root = ET.parse(filename).getroot()
- (lo_prefix, mgmt_prefix, hostname, hwsku, d_type, _) = parse_device(root)
+ (lo_prefix, mgmt_prefix, mgmt_prefix_v6, hostname, hwsku, d_type, _) = parse_device(root)
results = {}
results['DEVICE_METADATA'] = {'localhost': {
@@ -1302,10 +1306,18 @@ def parse_device_desc_xml(filename):
results['LOOPBACK_INTERFACE'] = {('lo', lo_prefix): {}}
- mgmt_intf = {}
- mgmtipn = ipaddress.IPNetwork(mgmt_prefix)
- gwaddr = ipaddress.IPAddress(int(mgmtipn.network) + 1)
- results['MGMT_INTERFACE'] = {('eth0', mgmt_prefix): {'gwaddr': gwaddr}}
+ results['MGMT_INTERFACE'] = {}
+ if mgmt_prefix:
+ mgmtipn = ipaddress.IPNetwork(mgmt_prefix)
+ if mgmtipn != ipaddress.IPNetwork('0.0.0.0/0'):
+ gwaddr = ipaddress.IPAddress(int(mgmtipn.network) + 1)
+ results['MGMT_INTERFACE'].update({('eth0', mgmt_prefix): {'gwaddr': gwaddr}})
+
+ if mgmt_prefix_v6:
+ mgmtipn_v6 = ipaddress.IPNetwork(mgmt_prefix_v6)
+ if mgmtipn != ipaddress.IPNetwork('::/0'):
+ gwaddr_v6 = ipaddress.IPAddress(int(mgmtipn_v6.network) + 1)
+ results['MGMT_INTERFACE'].update({('eth0', mgmt_prefix_v6): {'gwaddr': gwaddr_v6}})
return results
diff --git a/src/sonic-config-engine/tests/simple-sample-device-desc-ipv6-only.xml b/src/sonic-config-engine/tests/simple-sample-device-desc-ipv6-only.xml
new file mode 100644
index 00000000000..c35d2354a90
--- /dev/null
+++ b/src/sonic-config-engine/tests/simple-sample-device-desc-ipv6-only.xml
@@ -0,0 +1,11 @@
+
+ switch-t0
+ Force10-S6000
+ AAA00PrdStr00
+
+ 0.0.0.0/0
+
+
+ FC00:1::32/64
+
+
diff --git a/src/sonic-config-engine/tests/simple-sample-device-desc.xml b/src/sonic-config-engine/tests/simple-sample-device-desc.xml
new file mode 100644
index 00000000000..72941dfcd9b
--- /dev/null
+++ b/src/sonic-config-engine/tests/simple-sample-device-desc.xml
@@ -0,0 +1,11 @@
+
+ switch-t0
+ Force10-S6000
+ AAA00PrdStr00
+
+ 10.0.0.100/24
+
+
+ FC00:1::32/64
+
+
diff --git a/src/sonic-config-engine/tests/test_minigraph_case.py b/src/sonic-config-engine/tests/test_minigraph_case.py
index 300f4e3f280..3d0552fc235 100644
--- a/src/sonic-config-engine/tests/test_minigraph_case.py
+++ b/src/sonic-config-engine/tests/test_minigraph_case.py
@@ -1,5 +1,6 @@
import os
import subprocess
+import ipaddr as ipaddress
import tests.common_utils as utils
@@ -12,6 +13,10 @@ def setUp(self):
self.test_dir = os.path.dirname(os.path.realpath(__file__))
self.script_file = os.path.join(self.test_dir, '..', 'sonic-cfggen')
self.sample_graph = os.path.join(self.test_dir, 'simple-sample-graph-case.xml')
+ self.sample_resource_graph = os.path.join(self.test_dir, 'sample-graph-resource-type.xml')
+ self.sample_subintf_graph = os.path.join(self.test_dir, 'sample-graph-subintf.xml')
+ self.sample_simple_device_desc = os.path.join(self.test_dir, 'simple-sample-device-desc.xml')
+ self.sample_simple_device_desc_ipv6_only = os.path.join(self.test_dir, 'simple-sample-device-desc-ipv6-only.xml')
self.port_config = os.path.join(self.test_dir, 't0-sample-port-config.ini')
def run_script(self, argument, check_stderr=False):
@@ -169,3 +174,19 @@ def test_minigraph_mirror_dscp(self):
expected_ports.sort()
)
+ def test_parse_device_desc_xml_mgmt_interface(self):
+ # Regular device_desc.xml with both IPv4 and IPv6 mgmt address
+ result = minigraph.parse_device_desc_xml(self.sample_simple_device_desc)
+ mgmt_intf = result['MGMT_INTERFACE']
+ self.assertEqual(len(mgmt_intf.keys()), 2)
+ self.assertTrue(('eth0', '10.0.0.100/24') in mgmt_intf.keys())
+ self.assertTrue(('eth0', 'FC00:1::32/64') in mgmt_intf.keys())
+ self.assertTrue(ipaddress.IPAddress('10.0.0.1') == mgmt_intf[('eth0', '10.0.0.100/24')]['gwaddr'])
+ self.assertTrue(ipaddress.IPAddress('fc00:1::1') == mgmt_intf[('eth0', 'FC00:1::32/64')]['gwaddr'])
+
+ # Special device_desc.xml with IPv6 mgmt address only
+ result = minigraph.parse_device_desc_xml(self.sample_simple_device_desc_ipv6_only)
+ mgmt_intf = result['MGMT_INTERFACE']
+ self.assertEqual(len(mgmt_intf.keys()), 1)
+ self.assertTrue(('eth0', 'FC00:1::32/64') in mgmt_intf.keys())
+ self.assertTrue(ipaddress.IPAddress('fc00:1::1') == mgmt_intf[('eth0', 'FC00:1::32/64')]['gwaddr'])