Update minigraph.py to parse kubernetes config from minigraph.xml (#6633)
Update minigraph parser to retrieve kubernetes server info from minigraph.xml and update "KUBERNETES_MASTER|SERVER" in running config. Update minigraph parser to include clusterName from minigraph.xml into "DEVICE_METADATA|localhost"
This commit is contained in:
parent
3f2a39d583
commit
890545f317
@ -84,6 +84,7 @@ def parse_device(device):
|
|||||||
hwsku = None
|
hwsku = None
|
||||||
name = None
|
name = None
|
||||||
deployment_id = None
|
deployment_id = None
|
||||||
|
cluster = None
|
||||||
|
|
||||||
for node in device:
|
for node in device:
|
||||||
if node.tag == str(QName(ns, "Address")):
|
if node.tag == str(QName(ns, "Address")):
|
||||||
@ -100,11 +101,13 @@ def parse_device(device):
|
|||||||
deployment_id = node.text
|
deployment_id = node.text
|
||||||
elif node.tag == str(QName(ns, "ElementType")):
|
elif node.tag == str(QName(ns, "ElementType")):
|
||||||
d_type = node.text
|
d_type = node.text
|
||||||
|
elif node.tag == str(QName(ns, "ClusterName")):
|
||||||
|
cluster = node.text
|
||||||
|
|
||||||
if d_type is None and str(QName(ns3, "type")) in device.attrib:
|
if d_type is None and str(QName(ns3, "type")) in device.attrib:
|
||||||
d_type = device.attrib[str(QName(ns3, "type"))]
|
d_type = device.attrib[str(QName(ns3, "type"))]
|
||||||
|
|
||||||
return (lo_prefix, lo_prefix_v6, mgmt_prefix, name, hwsku, d_type, deployment_id)
|
return (lo_prefix, lo_prefix_v6, mgmt_prefix, name, hwsku, d_type, deployment_id, cluster)
|
||||||
|
|
||||||
def calculate_lcm_for_ecmp (nhdevices_bank_map, nhip_bank_map):
|
def calculate_lcm_for_ecmp (nhdevices_bank_map, nhip_bank_map):
|
||||||
banks_enumerated = {}
|
banks_enumerated = {}
|
||||||
@ -244,8 +247,10 @@ def parse_png(png, hname, dpg_ecmp_content = None):
|
|||||||
|
|
||||||
if child.tag == str(QName(ns, "Devices")):
|
if child.tag == str(QName(ns, "Devices")):
|
||||||
for device in child.findall(str(QName(ns, "Device"))):
|
for device in child.findall(str(QName(ns, "Device"))):
|
||||||
(lo_prefix, lo_prefix_v6, mgmt_prefix, name, hwsku, d_type, deployment_id) = parse_device(device)
|
(lo_prefix, lo_prefix_v6, mgmt_prefix, 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 }
|
device_data = {'lo_addr': lo_prefix, 'type': d_type, 'mgmt_addr': mgmt_prefix, 'hwsku': hwsku }
|
||||||
|
if cluster:
|
||||||
|
device_data['cluster'] = cluster
|
||||||
if deployment_id:
|
if deployment_id:
|
||||||
device_data['deployment_id'] = deployment_id
|
device_data['deployment_id'] = deployment_id
|
||||||
if lo_prefix_v6:
|
if lo_prefix_v6:
|
||||||
@ -253,9 +258,7 @@ def parse_png(png, hname, dpg_ecmp_content = None):
|
|||||||
devices[name] = device_data
|
devices[name] = device_data
|
||||||
|
|
||||||
if name == hname:
|
if name == hname:
|
||||||
cluster = device.find(str(QName(ns, "ClusterName")))
|
if cluster and "str" in cluster.lower():
|
||||||
|
|
||||||
if cluster != None and cluster.text != None and "str" in cluster.text.lower():
|
|
||||||
is_storage_device = True
|
is_storage_device = True
|
||||||
|
|
||||||
if child.tag == str(QName(ns, "DeviceInterfaceLinks")):
|
if child.tag == str(QName(ns, "DeviceInterfaceLinks")):
|
||||||
@ -380,8 +383,10 @@ def parse_asic_png(png, asic_name, hostname):
|
|||||||
|
|
||||||
if child.tag == str(QName(ns, "Devices")):
|
if child.tag == str(QName(ns, "Devices")):
|
||||||
for device in child.findall(str(QName(ns, "Device"))):
|
for device in child.findall(str(QName(ns, "Device"))):
|
||||||
(lo_prefix, lo_prefix_v6, mgmt_prefix, name, hwsku, d_type, deployment_id) = parse_device(device)
|
(lo_prefix, lo_prefix_v6, mgmt_prefix, 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 }
|
device_data = {'lo_addr': lo_prefix, 'type': d_type, 'mgmt_addr': mgmt_prefix, 'hwsku': hwsku }
|
||||||
|
if cluster:
|
||||||
|
device_data['cluster'] = cluster
|
||||||
if deployment_id:
|
if deployment_id:
|
||||||
device_data['deployment_id'] = deployment_id
|
device_data['deployment_id'] = deployment_id
|
||||||
if lo_prefix_v6:
|
if lo_prefix_v6:
|
||||||
@ -780,6 +785,7 @@ def parse_meta(meta, hname):
|
|||||||
region = None
|
region = None
|
||||||
cloudtype = None
|
cloudtype = None
|
||||||
resource_type = None
|
resource_type = None
|
||||||
|
kube_data = {}
|
||||||
device_metas = meta.find(str(QName(ns, "Devices")))
|
device_metas = meta.find(str(QName(ns, "Devices")))
|
||||||
for device in device_metas.findall(str(QName(ns1, "DeviceMetadata"))):
|
for device in device_metas.findall(str(QName(ns1, "DeviceMetadata"))):
|
||||||
if device.find(str(QName(ns1, "Name"))).text.lower() == hname.lower():
|
if device.find(str(QName(ns1, "Name"))).text.lower() == hname.lower():
|
||||||
@ -808,7 +814,11 @@ def parse_meta(meta, hname):
|
|||||||
cloudtype = value
|
cloudtype = value
|
||||||
elif name == "ResourceType":
|
elif name == "ResourceType":
|
||||||
resource_type = value
|
resource_type = value
|
||||||
return syslog_servers, dhcp_servers, ntp_servers, tacacs_servers, mgmt_routes, erspan_dst, deployment_id, region, cloudtype, resource_type
|
elif name == "KubernetesEnabled":
|
||||||
|
kube_data["enable"] = value
|
||||||
|
elif name == "KubernetesServerIp":
|
||||||
|
kube_data["ip"] = value
|
||||||
|
return syslog_servers, dhcp_servers, ntp_servers, tacacs_servers, mgmt_routes, erspan_dst, deployment_id, region, cloudtype, resource_type, kube_data
|
||||||
|
|
||||||
|
|
||||||
def parse_linkmeta(meta, hname):
|
def parse_linkmeta(meta, hname):
|
||||||
@ -1097,6 +1107,7 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None, hw
|
|||||||
host_lo_intfs = None
|
host_lo_intfs = None
|
||||||
is_storage_device = False
|
is_storage_device = False
|
||||||
local_devices = []
|
local_devices = []
|
||||||
|
kube_data = {}
|
||||||
|
|
||||||
# hostname is the asic_name, get the asic_id from the asic_name
|
# hostname is the asic_name, get the asic_id from the asic_name
|
||||||
if asic_name is not None:
|
if asic_name is not None:
|
||||||
@ -1133,7 +1144,7 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None, hw
|
|||||||
elif child.tag == str(QName(ns, "UngDec")):
|
elif child.tag == str(QName(ns, "UngDec")):
|
||||||
(u_neighbors, u_devices, _, _, _, _, _, _) = parse_png(child, hostname, None)
|
(u_neighbors, u_devices, _, _, _, _, _, _) = parse_png(child, hostname, None)
|
||||||
elif child.tag == str(QName(ns, "MetadataDeclaration")):
|
elif child.tag == str(QName(ns, "MetadataDeclaration")):
|
||||||
(syslog_servers, dhcp_servers, ntp_servers, tacacs_servers, mgmt_routes, erspan_dst, deployment_id, region, cloudtype, resource_type) = parse_meta(child, hostname)
|
(syslog_servers, dhcp_servers, ntp_servers, tacacs_servers, mgmt_routes, erspan_dst, deployment_id, region, cloudtype, resource_type, kube_data) = parse_meta(child, hostname)
|
||||||
elif child.tag == str(QName(ns, "LinkMetadataDeclaration")):
|
elif child.tag == str(QName(ns, "LinkMetadataDeclaration")):
|
||||||
linkmetas = parse_linkmeta(child, hostname)
|
linkmetas = parse_linkmeta(child, hostname)
|
||||||
elif child.tag == str(QName(ns, "DeviceInfos")):
|
elif child.tag == str(QName(ns, "DeviceInfos")):
|
||||||
@ -1174,6 +1185,18 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None, hw
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cluster = [devices[key] for key in devices if key.lower() == hostname.lower()][0].get('cluster', "")
|
||||||
|
if cluster:
|
||||||
|
results['DEVICE_METADATA']['localhost']['cluster'] = cluster
|
||||||
|
|
||||||
|
if kube_data:
|
||||||
|
results['KUBERNETES_MASTER'] = {
|
||||||
|
'SERVER': {
|
||||||
|
'disable': str(kube_data.get('enable', '0') == '0'),
|
||||||
|
'ip': kube_data.get('ip', '')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
results['PEER_SWITCH'] = get_peer_switch_info(linkmetas, devices)
|
results['PEER_SWITCH'] = get_peer_switch_info(linkmetas, devices)
|
||||||
|
|
||||||
if bool(results['PEER_SWITCH']):
|
if bool(results['PEER_SWITCH']):
|
||||||
@ -1524,7 +1547,7 @@ def get_mux_cable_entries(mux_cable_ports, neighbors, devices):
|
|||||||
|
|
||||||
def parse_device_desc_xml(filename):
|
def parse_device_desc_xml(filename):
|
||||||
root = ET.parse(filename).getroot()
|
root = ET.parse(filename).getroot()
|
||||||
(lo_prefix, lo_prefix_v6, mgmt_prefix, hostname, hwsku, d_type, _) = parse_device(root)
|
(lo_prefix, lo_prefix_v6, mgmt_prefix, hostname, hwsku, d_type, _, _) = parse_device(root)
|
||||||
|
|
||||||
results = {}
|
results = {}
|
||||||
results['DEVICE_METADATA'] = {'localhost': {
|
results['DEVICE_METADATA'] = {'localhost': {
|
||||||
|
@ -390,6 +390,16 @@
|
|||||||
<a:Reference i:nil="true"/>
|
<a:Reference i:nil="true"/>
|
||||||
<a:Value>10.0.10.7;10.0.10.8</a:Value>
|
<a:Value>10.0.10.7;10.0.10.8</a:Value>
|
||||||
</a:DeviceProperty>
|
</a:DeviceProperty>
|
||||||
|
<a:DeviceProperty>
|
||||||
|
<a:Name>KubernetesEnabled</a:Name>
|
||||||
|
<a:Reference i:nil="true"/>
|
||||||
|
<a:Value>0</a:Value>
|
||||||
|
</a:DeviceProperty>
|
||||||
|
<a:DeviceProperty>
|
||||||
|
<a:Name>KubernetesServerIp</a:Name>
|
||||||
|
<a:Reference i:nil="true"/>
|
||||||
|
<a:Value>10.10.10.10</a:Value>
|
||||||
|
</a:DeviceProperty>
|
||||||
</a:Properties>
|
</a:Properties>
|
||||||
</a:DeviceMetadata>
|
</a:DeviceMetadata>
|
||||||
</Devices>
|
</Devices>
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
import json
|
||||||
import os
|
import os
|
||||||
import subprocess
|
import subprocess
|
||||||
|
|
||||||
@ -145,6 +146,11 @@ class TestCfgGenCaseInsensitive(TestCase):
|
|||||||
output = self.run_script(argument)
|
output = self.run_script(argument)
|
||||||
self.assertEqual(output.strip(), "1")
|
self.assertEqual(output.strip(), "1")
|
||||||
|
|
||||||
|
def test_minigraph_cluster(self):
|
||||||
|
argument = '-m "' + self.sample_graph + '" -p "' + self.port_config + '" -v "DEVICE_METADATA[\'localhost\'][\'cluster\']"'
|
||||||
|
output = self.run_script(argument)
|
||||||
|
self.assertEqual(output.strip(), "AAA00PrdStr00")
|
||||||
|
|
||||||
def test_minigraph_neighbor_metadata(self):
|
def test_minigraph_neighbor_metadata(self):
|
||||||
argument = '-m "' + self.sample_graph + '" -p "' + self.port_config + '" -v "DEVICE_NEIGHBOR_METADATA"'
|
argument = '-m "' + self.sample_graph + '" -p "' + self.port_config + '" -v "DEVICE_NEIGHBOR_METADATA"'
|
||||||
|
|
||||||
@ -195,6 +201,12 @@ class TestCfgGenCaseInsensitive(TestCase):
|
|||||||
output = self.run_script(argument)
|
output = self.run_script(argument)
|
||||||
self.assertEqual(output.strip(), "{'10.0.10.7': {'priority': '1', 'tcp_port': '49'}, '10.0.10.8': {'priority': '1', 'tcp_port': '49'}}")
|
self.assertEqual(output.strip(), "{'10.0.10.7': {'priority': '1', 'tcp_port': '49'}, '10.0.10.8': {'priority': '1', 'tcp_port': '49'}}")
|
||||||
|
|
||||||
|
def test_metadata_kube(self):
|
||||||
|
argument = '-m "' + self.sample_graph + '" -p "' + self.port_config + '" -v "KUBERNETES_MASTER[\'SERVER\']"'
|
||||||
|
output = self.run_script(argument)
|
||||||
|
self.assertEqual(json.loads(output.strip().replace("'", "\"")),
|
||||||
|
json.loads('{"ip": "10.10.10.10", "disable": "True"}'))
|
||||||
|
|
||||||
def test_minigraph_mgmt_port(self):
|
def test_minigraph_mgmt_port(self):
|
||||||
argument = '-m "' + self.sample_graph + '" -p "' + self.port_config + '" -v "MGMT_PORT"'
|
argument = '-m "' + self.sample_graph + '" -p "' + self.port_config + '" -v "MGMT_PORT"'
|
||||||
output = self.run_script(argument)
|
output = self.run_script(argument)
|
||||||
@ -289,4 +301,3 @@ class TestCfgGenCaseInsensitive(TestCase):
|
|||||||
utils.to_dict(output.strip()),
|
utils.to_dict(output.strip()),
|
||||||
expected_table
|
expected_table
|
||||||
)
|
)
|
||||||
|
|
Reference in New Issue
Block a user