From 1f78242187a54928d1e5ac4acebbc64c25be4a51 Mon Sep 17 00:00:00 2001 From: Yaron Yogev Date: Wed, 9 Aug 2017 17:15:31 +0300 Subject: US2853 ACI data & links added Change-Id: I26d67bd8a03815e816babc5f6bd525bd32efef9c Signed-off-by: Yaron Yogev --- .../fetchers/aci/aci_fetch_leaf_to_spine_pnics.py | 32 +++++++++++++--------- app/discover/fetchers/aci/aci_fetch_switch_pnic.py | 21 ++++++++------ app/discover/fetchers/cli/cli_fetch_host_pnics.py | 3 +- app/discover/find_links_for_pnics.py | 31 ++++++++++++++++++++- 4 files changed, 64 insertions(+), 23 deletions(-) (limited to 'app/discover') diff --git a/app/discover/fetchers/aci/aci_fetch_leaf_to_spine_pnics.py b/app/discover/fetchers/aci/aci_fetch_leaf_to_spine_pnics.py index 48cf243..b9be5cd 100644 --- a/app/discover/fetchers/aci/aci_fetch_leaf_to_spine_pnics.py +++ b/app/discover/fetchers/aci/aci_fetch_leaf_to_spine_pnics.py @@ -28,9 +28,9 @@ class AciFetchLeafToSpinePnics(AciAccess): self.inv = InventoryMgr() def fetch_switches_by_role(self, role_name): - query_filter = "eq(fabricNode.role, \"{}\")".format(role_name) - switches = self.fetch_objects_by_class("fabricNode", - {"query-target-filter": query_filter}) + query_filter = {"query-target-filter": + "eq(fabricNode.role, \"{}\")".format(role_name)} + switches = self.fetch_objects_by_class("fabricNode", query_filter) return [switch["attributes"] for switch in switches] def fetch_adjacent_connections(self, device_id): @@ -61,8 +61,10 @@ class AciFetchLeafToSpinePnics(AciAccess): if connection: try: # Extract pnics from adjacency data - uplink_pnic = re.match(".*\[(.+?)\].*", connection["dn"]).group(1) - downlink_pnic = re.match(".*\[(.+?)\].*", connection["portDesc"]).group(1) + uplink_pnic = re.match(".*\[(.+?)\].*", + connection["dn"]).group(1) + downlink_pnic = re.match(".*\[(.+?)\].*", + connection["portDesc"]).group(1) spines.append({ "device": spine, "downlink_pnic": downlink_pnic, @@ -76,7 +78,8 @@ class AciFetchLeafToSpinePnics(AciAccess): @aci_config_required(default=[]) def get(self, db_leaf_pnic_id): environment = self.get_env() - pnic = self.inv.get_by_id(environment=environment, item_id=db_leaf_pnic_id) + pnic = self.inv.get_by_id(environment=environment, + item_id=db_leaf_pnic_id) # Decode aci leaf switch id from db format aci_leaf_pnic_id = decode_aci_dn(db_leaf_pnic_id) @@ -93,22 +96,23 @@ class AciFetchLeafToSpinePnics(AciAccess): # Add spine switch to db if it's not there yet spine_id_match = re.match("topology/(.+)", spine["dn"]) if not spine_id_match: - raise ValueError("Failed to fetch spine switch id from switch dn: {}" - .format(spine["dn"])) + raise ValueError("Failed to fetch spine switch id " + "from switch dn: {}".format(spine["dn"])) aci_spine_id = spine_id_match.group(1) - db_spine_id = "-".join(("switch", encode_aci_dn(aci_spine_id), spine["role"])) + db_spine_id = "-".join(("switch", encode_aci_dn(aci_spine_id), + spine["role"])) if not self.inv.get_by_id(environment, db_spine_id): spine_json = { "id": db_spine_id, "type": "switch", - "host": db_spine_id, "aci_document": spine } # Region name is the same as region id region_id = get_object_path_part(pnic["name_path"], "Regions") region = self.inv.get_by_id(environment, region_id) - self.inv.save_inventory_object(o=spine_json, parent=region, environment=environment) + self.inv.save_inventory_object(o=spine_json, parent=region, + environment=environment) # Add downlink and uplink pnics to results list, # including their mutual connection data @@ -121,18 +125,20 @@ class AciFetchLeafToSpinePnics(AciAccess): downlink_pnic_json = { "id": db_downlink_pnic_id, "type": "pnic", + "role": "downlink", "pnic_type": "switch", - "host": db_spine_id, "connected_to": db_uplink_pnic_id, + "switch": db_spine_id, "aci_document": {} # TODO: what can we add here? } uplink_pnic_json = { "id": db_uplink_pnic_id, "type": "pnic", + "role": "uplink", "pnic_type": "switch", - "host": pnic["host"], "connected_to": db_downlink_pnic_id, + "switch": db_spine_id, "aci_document": {} # TODO: what can we add here? } diff --git a/app/discover/fetchers/aci/aci_fetch_switch_pnic.py b/app/discover/fetchers/aci/aci_fetch_switch_pnic.py index 965fc79..2b1a21d 100644 --- a/app/discover/fetchers/aci/aci_fetch_switch_pnic.py +++ b/app/discover/fetchers/aci/aci_fetch_switch_pnic.py @@ -30,10 +30,10 @@ class AciFetchSwitchPnic(AciAccess): mac_filter = "eq(epmMacEp.addr,\"{}\")".format(mac_address) # We are only interested in Ethernet interfaces pnic_filter = "wcard(epmMacEp.ifId, \"eth\")" - query_filter = "and({},{})".format(mac_filter, pnic_filter) + query_filter = {"query-target-filter": + "and({},{})".format(mac_filter, pnic_filter)} - pnics = self.fetch_objects_by_class("epmMacEp", - {"query-target-filter": query_filter}) + pnics = self.fetch_objects_by_class("epmMacEp", query_filter) return [pnic["attributes"] for pnic in pnics] @@ -41,7 +41,8 @@ class AciFetchSwitchPnic(AciAccess): dn = "/".join((switch_id, "sys")) response = self.fetch_mo_data(dn) # Unwrap switches - switch_data = self.get_objects_by_field_names(response, "topSystem", "attributes") + switch_data = self.get_objects_by_field_names(response, "topSystem", + "attributes") return switch_data[0] if switch_data else None @aci_config_required(default=[]) @@ -73,7 +74,8 @@ class AciFetchSwitchPnic(AciAccess): .format(leaf_pnic["dn"])) return [] - db_leaf_id = "-".join(("switch", encode_aci_dn(aci_leaf_id), leaf_data["role"])) + db_leaf_id = "-".join(("switch", encode_aci_dn(aci_leaf_id), + leaf_data["role"])) if not self.inv.get_by_id(environment, db_leaf_id): leaf_json = { "id": db_leaf_id, @@ -85,7 +87,8 @@ class AciFetchSwitchPnic(AciAccess): # Region name is the same as region id region_id = get_object_path_part(pnic["name_path"], "Regions") region = self.inv.get_by_id(environment, region_id) - self.inv.save_inventory_object(o=leaf_json, parent=region, environment=environment) + self.inv.save_inventory_object(o=leaf_json, parent=region, + environment=environment) # Prepare pnic json for results list db_pnic_id = "-".join((db_leaf_id, @@ -94,10 +97,12 @@ class AciFetchSwitchPnic(AciAccess): pnic_json = { "id": db_pnic_id, "type": "pnic", + "role": "hostlink", + "parent_id": db_leaf_id, "pnic_type": "switch", "mac_address": mac_address, - "host": db_leaf_id, + "host": pnic["host"], + "switch": db_leaf_id, "aci_document": leaf_pnic } return [pnic_json] - diff --git a/app/discover/fetchers/cli/cli_fetch_host_pnics.py b/app/discover/fetchers/cli/cli_fetch_host_pnics.py index 3516e25..86aa693 100644 --- a/app/discover/fetchers/cli/cli_fetch_host_pnics.py +++ b/app/discover/fetchers/cli/cli_fetch_host_pnics.py @@ -71,7 +71,8 @@ class CliFetchHostPnics(CliAccess): "host": host_id, "name": id, "local_name": interface_name, - "lines": [] + "lines": [], + "pnic_type": "host" } self.handle_line(interface, line_remainder) if ' 1: + self.log.warn("multiple matching switch pNICs found " + "for host pNIC: mac_address={}" + .format(host_pnic["mac_address"])) + switch_pnic = switch_pnics[0] + source = host_pnic["_id"] + source_id = host_pnic["id"] + target = switch_pnic["_id"] + target_id = switch_pnic["id"] + link_name = "{}-{}".format(target_id, source_id) + state = "up" if host_pnic["Link detected"] == "yes" else "down" + link_weight = 0 # TBD + self.create_link(self.get_env(), host_pnic['host'], + source, source_id, target, target_id, + link_type, link_name, state, link_weight) \ No newline at end of file -- cgit 1.2.3-korg