diff --git a/inventory_provider/opsdb.py b/inventory_provider/opsdb.py index 0dfc532b9501df85d0ceeb80cea0792e144e891f..c400b432b6eb8147360d2137bddc8e060fbabd77 100644 --- a/inventory_provider/opsdb.py +++ b/inventory_provider/opsdb.py @@ -2,104 +2,171 @@ import contextlib import mysql.connector -equipment_location_query = "SELECT " \ - " e.absid, " \ - " e.name AS equipment_name, " \ - " p.name AS pop_name, " \ - " p.abbreviation AS pop_abbreviation, " \ - " p.site_id AS pop_site_id, " \ - " p.country, " \ - " g.longitude, " \ - " g.latitude " \ - "FROM " \ - " equipment e " \ - "INNER JOIN pop p " \ - " ON p.absid = e.PTR_pop " \ - "INNER JOIN geocoding g " \ - " ON g.absid = p.PTR_geocoding " \ - "WHERE " \ - " e.status != 'terminated' " \ - " AND e.status != 'disposed'" - - -circuit_hierarchy_query = "SELECT " \ - " pc.name AS parent_circuit, " \ - " pc.absid AS parent_circuit_id, " \ - " pc.status AS parent_circuit_status, " \ - " cc.name AS child_circuit, " \ - " cc.absid AS child_circuit_id, " \ - " cc.status AS child_circuit_status, " \ - " cg.segment_group AS segment_group " \ - "FROM circuit_glue cg " \ - "INNER JOIN circuit pc ON pc.absid = cg.PTR_circuit " \ - "INNER JOIN circuit cc ON cc.absid = cg.PTR_component" - - -retrieve_services_query_template = "SELECT " \ - " c.absid AS id, " \ - " c.name, " \ - " c.status, " \ - " c.circuit_type, " \ - " c.service_type, " \ - " events.short_descr AS project, " \ - " e.name AS equipment, " \ - " cc.{} AS port, " \ - " cc.{} AS logical_unit, " \ - " LOWER(o.name) AS manufacturer, " \ - " LOWER(ec.card_id) AS card_id, " \ - " LOWER(IF(pp.interface_name IS NULL," \ - " ''," \ - " pp.interface_name))" \ - " AS interface_name " \ - "FROM circuit c " \ - "INNER JOIN circuit_connections cc " \ - " ON cc.circ_absid = c.absid " \ - "INNER JOIN equipment e " \ - " ON e.absid = cc.{} " \ - "LEFT JOIN events " \ - " ON events.absid = cc.PTR_project " \ - "INNER JOIN equipment_card ec " \ - " ON ec.absid = cc.{} " \ - "LEFT JOIN organisation o " \ - " ON o.absid = ec.manufacturer " \ - "LEFT JOIN port_plugin pp " \ - " ON pp.PTR_card = cc.{} " \ - " AND pp.port = cc.{} " \ - "WHERE " \ - " c.status != 'terminated' " \ - " AND is_circuit = 1 " - -order_services_outer_query = "SELECT * FROM ({}) AS inner_query " \ - " ORDER BY FIELD(status, 'spare', 'planned'," \ - " 'ordered', 'installed', 'operational')" - - -connection_variants = [ - ['port_a', - 'int_LU_a', - 'PTR_equip_a', - 'PTR_card_a', - 'PTR_card_a', - 'port_a'], - ['port_b', - 'int_LU_b', - 'PTR_equip_b', - 'PTR_card_b', - 'PTR_card_b', - 'port_b'], - ['port_a_OUT', - 'int_LU_a', - 'PTR_equip_a', - 'PTR_card_a_OUT', - 'PTR_card_a_OUT', - 'port_a_OUT'], - ['port_b_OUT', - 'int_LU_b', - 'PTR_equip_b', - 'PTR_card_b_OUT', - 'PTR_card_b_OUT', - 'port_b_OUT'] -] +equipment_location_query = """SELECT + e.absid, + e.name AS equipment_name, + p.name AS pop_name, + p.abbreviation AS pop_abbreviation, + p.site_id AS pop_site_id, + p.country, + g.longitude, + g.latitude + FROM + equipment e + INNER JOIN pop p + ON p.absid = e.PTR_pop + INNER JOIN geocoding g + ON g.absid = p.PTR_geocoding + WHERE + e.status != 'terminated' + AND e.status != 'disposed'""" + + +circuit_hierarchy_query = """SELECT + pc.name AS parent_circuit, + pc.absid AS parent_circuit_id, + pc.status AS parent_circuit_status, + cc.name AS child_circuit, + cc.absid AS child_circuit_id, + cc.status AS child_circuit_status, + cg.segment_group AS segment_group + FROM circuit_glue cg + INNER JOIN circuit pc ON pc.absid = cg.PTR_circuit + INNER JOIN circuit cc ON cc.absid = cg.PTR_component""" + + +retrieve_services_query = """SELECT * + FROM (SELECT + c.absid AS id, + c.name, + c.status, + c.circuit_type, + c.service_type, + events.short_descr AS project, + e.name AS equipment, + cc.port_a AS port, + cc.int_LU_a AS logical_unit, + LOWER(o.name) AS manufacturer, + LOWER(ec.card_id) AS card_id, + LOWER( + IF(pp.interface_name IS NULL, + '', pp.interface_name)) AS interface_name + FROM circuit c + INNER JOIN circuit_connections cc + ON cc.circ_absid = c.absid + INNER JOIN equipment e + ON e.absid = cc.PTR_equip_a + LEFT JOIN events + ON events.absid = cc.PTR_project + INNER JOIN equipment_card ec + ON ec.absid = cc.PTR_card_a + LEFT JOIN organisation o + ON o.absid = ec.manufacturer + LEFT JOIN port_plugin pp + ON pp.PTR_card = cc.PTR_card_a AND pp.port = cc.port_a + WHERE c.status != 'terminated' AND is_circuit = 1 + UNION + SELECT + c.absid AS id, + c.name, + c.status, + c.circuit_type, + c.service_type, + events.short_descr AS project, + e.name AS equipment, + cc.port_b AS port, + cc.int_LU_b AS logical_unit, + LOWER(o.name) AS manufacturer, + LOWER(ec.card_id) AS card_id, + LOWER( + IF(pp.interface_name IS NULL, + '', pp.interface_name)) AS interface_name + FROM circuit c + INNER JOIN circuit_connections cc + ON cc.circ_absid = c.absid + INNER JOIN equipment e + ON e.absid = cc.PTR_equip_b + LEFT JOIN events + ON events.absid = cc.PTR_project + INNER JOIN equipment_card ec + ON ec.absid = cc.PTR_card_b + LEFT JOIN organisation o + ON o.absid = ec.manufacturer + LEFT JOIN port_plugin pp + ON pp.PTR_card = cc.PTR_card_b AND pp.port = cc.port_b + WHERE c.status != 'terminated' AND is_circuit = 1 + UNION + SELECT + c.absid AS id, + c.name, + c.status, + c.circuit_type, + c.service_type, + events.short_descr AS project, + e.name AS equipment, + cc.port_a_OUT AS port, + cc.int_LU_a AS logical_unit, + LOWER(o.name) AS manufacturer, + LOWER(ec.card_id) AS card_id, + LOWER( + IF(pp.interface_name IS NULL, + '', pp.interface_name)) AS interface_name + FROM circuit c + INNER JOIN circuit_connections cc + ON cc.circ_absid = c.absid + INNER JOIN equipment e + ON e.absid = cc.PTR_equip_a + LEFT JOIN events + ON events.absid = cc.PTR_project + INNER JOIN equipment_card ec + ON ec.absid = cc.PTR_card_a_OUT + LEFT JOIN organisation o + ON o.absid = ec.manufacturer + LEFT JOIN port_plugin pp + ON pp.PTR_card = cc.PTR_card_a_OUT + AND pp.port = cc.port_a_OUT + WHERE c.status != 'terminated' AND is_circuit = 1 + UNION + SELECT + c.absid AS id, + c.name, + c.status, + c.circuit_type, + c.service_type, + events.short_descr AS project, + e.name AS equipment, + cc.port_b_OUT AS port, + cc.int_LU_b AS logical_unit, + LOWER(o.name) AS manufacturer, + LOWER(ec.card_id) AS card_id, + LOWER( + IF(pp.interface_name IS NULL, + '', pp.interface_name)) AS interface_name + FROM circuit c + INNER JOIN circuit_connections cc + ON cc.circ_absid = c.absid + INNER JOIN equipment e + ON e.absid = cc.PTR_equip_b + LEFT JOIN events + ON events.absid = cc.PTR_project + INNER JOIN equipment_card ec + ON ec.absid = cc.PTR_card_b_OUT + LEFT JOIN organisation o + ON o.absid = ec.manufacturer + LEFT JOIN port_plugin pp + ON pp.PTR_card = cc.PTR_card_b_OUT + AND pp.port = cc.port_b_OUT + WHERE + c.status != 'terminated' + AND is_circuit = 1) + AS inner_query + ORDER BY + FIELD(status, + 'spare', + 'planned', + 'ordered', + 'installed', + 'operational')""" @contextlib.contextmanager @@ -136,14 +203,19 @@ def _convert_to_dict(crs): def _infinera_field_update(record): equipment_parts = record["equipment"].rsplit("-", 1) card_parts = record["card_id"].split("-", 1) + record["interface_name"] = "" + record["equipment"] = equipment_parts[0] try: - record["equipment"] = equipment_parts[0] - record["interface_name"] = equipment_parts[1] + "-" + card_parts[1] + record["interface_name"] = equipment_parts[1] + "-" except IndexError: pass # Nothing to see here + try: + record["interface_name"] += card_parts[1] + except IndexError: + record["interface_name"] += card_parts[0] if record["port"] is not None and record["port"] != "": record["interface_name"] += "-" + record["port"] - record["interface_name"] = record["interface_name"]\ + record["interface_name"] = record["interface_name"] \ .replace("--", "-").upper() return record @@ -153,7 +225,7 @@ def _juniper_field_update(record): record["interface_name"] = record["card_id"] if record["port"] is not None and record["port"] != "": separator = "/" if "-" in record["interface_name"] else "" - record["interface_name"] += separator + record["port"] + record["interface_name"] += separator + str(record["port"]) if record["logical_unit"] is not None and record["logical_unit"] != "": record["interface_name"] += "." + str(record["logical_unit"]) return record @@ -165,7 +237,6 @@ def _update_fields(r): def get_circuits(db): - retrieve_services_query = _generate_get_circuits_sql() with cursor(db) as crs: crs.execute(retrieve_services_query) r = _convert_to_dict(crs) @@ -173,15 +244,6 @@ def get_circuits(db): return r -def _generate_get_circuits_sql(): - retrieve_services_inner_query = " UNION ".join( - map(lambda e: retrieve_services_query_template.format(*e), - connection_variants)) - retrieve_services_query = order_services_outer_query.\ - format(retrieve_services_inner_query) - return retrieve_services_query - - def get_circuit_hierarchy(db): with cursor(db) as crs: crs.execute(circuit_hierarchy_query)