aboutsummaryrefslogtreecommitdiffstats
path: root/app/discover/fetchers/db/db_fetch_vedges_ovs.py
diff options
context:
space:
mode:
Diffstat (limited to 'app/discover/fetchers/db/db_fetch_vedges_ovs.py')
-rw-r--r--app/discover/fetchers/db/db_fetch_vedges_ovs.py63
1 files changed, 40 insertions, 23 deletions
diff --git a/app/discover/fetchers/db/db_fetch_vedges_ovs.py b/app/discover/fetchers/db/db_fetch_vedges_ovs.py
index 838ccb9..f516d10 100644
--- a/app/discover/fetchers/db/db_fetch_vedges_ovs.py
+++ b/app/discover/fetchers/db/db_fetch_vedges_ovs.py
@@ -24,8 +24,8 @@ class DbFetchVedgesOvs(DbAccess, CliAccess, metaclass=Singleton):
self.port_re = re.compile("^\s*port (\d+): ([^(]+)( \(internal\))?$")
self.port_line_header_prefix = " " * 8 + "Port "
- def get(self, id):
- host_id = id[:id.rindex('-')]
+ def get(self, parent_id):
+ host_id = parent_id[:parent_id.rindex('-')]
results = self.get_objects_list_for_id(
"""
SELECT *
@@ -66,11 +66,11 @@ class DbFetchVedgesOvs(DbAccess, CliAccess, metaclass=Singleton):
if not port_matches:
continue
port = {}
- id = port_matches.group(1)
+ port_id = port_matches.group(1)
name = port_matches.group(2)
is_internal = port_matches.group(3) == " (internal)"
port["internal"] = is_internal
- port["id"] = id
+ port["id"] = port_id
port["name"] = name
ports[name] = port
return ports
@@ -106,7 +106,7 @@ class DbFetchVedgesOvs(DbAccess, CliAccess, metaclass=Singleton):
if "tunneling_ip" not in doc["configurations"]:
return {}
if not doc["configurations"]["tunneling_ip"]:
- self.get_bridge_pnic(doc)
+ self.get_pnics(doc)
return {}
# read the 'br-tun' interface ports
@@ -148,31 +148,48 @@ class DbFetchVedgesOvs(DbAccess, CliAccess, metaclass=Singleton):
tunnel_ports[port["name"]] = port
return tunnel_ports
- def get_bridge_pnic(self, doc):
- conf = doc["configurations"]
- if "bridge_mappings" not in conf or not conf["bridge_mappings"]:
- return
- for v in conf["bridge_mappings"].values(): br = v
- ifaces_list_lines = self.run_fetch_lines("ovs-vsctl list-ifaces " + br,
- doc["host"])
- br_pnic_postfix = br + "--br-"
- interface = ""
+ def get_pnics(self, vedge) -> dict:
+ bridges = vedge["configurations"].get("bridge_mappings", {})
+ pnics = {}
+ for bridge in bridges.values():
+ self.get_bridge_pnic(pnics, vedge, bridge)
+ return pnics
+
+ MIRANTIS_DIST = "Mirantis"
+
+ def get_bridge_pnic(self, pnics: dict, vedge: dict, bridge: dict):
+ cmd = "ovs-vsctl list-ifaces {}".format(bridge)
+ ifaces_list_lines = self.run_fetch_lines(cmd, vedge["host"])
+ env_config = self.configuration.get_env_config()
+ distribution = env_config.get("distribution")
+ dist_version = env_config.get("distribution_version")
+ use_br_postfix = distribution == self.MIRANTIS_DIST and \
+ dist_version in ["6.0", "7.0", "8.0"]
for l in ifaces_list_lines:
- if l.startswith(br_pnic_postfix):
- interface = l[len(br_pnic_postfix):]
- break
- if not interface:
- return
- doc["pnic"] = interface
+ if use_br_postfix:
+ br_pnic_postfix = "{}--br-".format(bridge)
+ interface = l[len(br_pnic_postfix):] \
+ if l.startswith(br_pnic_postfix) \
+ else ""
+ else:
+ interface = l
+ if interface:
+ pnic = self.find_pnic_for_interface(vedge, interface)
+ if pnic:
+ pnics[pnic["name"]] = pnic
+
+ def find_pnic_for_interface(self, vedge, interface):
# add port ID to pNIC
pnic = self.inv.find_items({
"environment": self.get_env(),
"type": "host_pnic",
- "host": doc["host"],
+ "host": vedge["host"],
"name": interface
}, get_single=True)
if not pnic:
return
- port = doc["ports"][interface]
- pnic["port_id"] = port["id"]
+ vedge["pnic"] = interface
+ port = vedge["ports"].get(interface, {})
+ pnic["port_id"] = port.get("id", "")
self.inv.set(pnic)
+ return pnic