diff --git a/inventory_provider/db/ims_data.py b/inventory_provider/db/ims_data.py index f6d856c845b328aa7a0cf65a7afa7af10adad29d..0283754bf0f3367fdb6a1bf9911dcf3ecb88970d 100644 --- a/inventory_provider/db/ims_data.py +++ b/inventory_provider/db/ims_data.py @@ -2,7 +2,8 @@ import logging import re from collections import OrderedDict, defaultdict from copy import copy -from itertools import chain +from itertools import chain, groupby +from operator import itemgetter from inventory_provider import environment from inventory_provider.db import ims @@ -75,6 +76,18 @@ def get_customer_service_emails(ds: IMS): yield k, sorted(list(v)) +def get_circuit_related_customer_ids(ds: IMS): + relations = sorted( + list( + ds.get_filtered_entities( + 'CircuitCustomerRelation', + 'circuit.inventoryStatusId== 3') + ), key=itemgetter('circuitid')) + + return {k: [c['customerid'] for c in v] for k, v in + groupby(relations, key=itemgetter('circuitid'))} + + def get_port_id_services(ds: IMS): circuit_nav_props = [ ims.CIRCUIT_PROPERTIES['Ports'], diff --git a/inventory_provider/routes/classifier.py b/inventory_provider/routes/classifier.py index 6d27c8a081c398aec98ade4aac42647ef0dd00fe..d2b46d342a1793562e52aa5cd04ca265c88a480c 100644 --- a/inventory_provider/routes/classifier.py +++ b/inventory_provider/routes/classifier.py @@ -185,12 +185,12 @@ def get_interface_services_and_loc(ims_source_equipment, ims_interface, redis): for s in json.loads(raw_services.decode('utf-8')): related_services.update( {r['id']: r for r in s['related-services']}) + contacts.update(set(s.pop('contacts', set()))) if s['circuit_type'] == 'service': - contacts.update(set(s.pop('contacts', set()))) _format_service(s) result['services'].append(s) - result['related-services'] = list(related_services.values()) result['contacts'] = sorted(list(contacts)) + result['related-services'] = list(related_services.values()) if not result['services']: result.pop('services', None) diff --git a/inventory_provider/tasks/worker.py b/inventory_provider/tasks/worker.py index 4d7e33c506390db0a5b76b129dabe06d02156ffd..544e10c098db1343ae249718c6011d50102b629b 100644 --- a/inventory_provider/tasks/worker.py +++ b/inventory_provider/tasks/worker.py @@ -574,6 +574,8 @@ def update_circuit_hierarchy_and_port_id_services(self, use_current=False): {k: v for k, v in ims_data.get_customer_service_emails(ds1)} circuit_ids_to_monitor = \ list(ims_data.get_monitored_circuit_ids(ds1)) + additional_circuit_customer_ids = \ + ims_data.get_circuit_related_customer_ids(ds1) hierarchy = None port_id_details = defaultdict(list) @@ -613,12 +615,18 @@ def update_circuit_hierarchy_and_port_id_services(self, use_current=False): else: return 0 + def _get_circuit_contacts(c): + customer_ids = {c['customerid']} + customer_ids.update(additional_circuit_customer_ids.get(c['id'], [])) + return set().union( + *[customer_contacts.get(cid, []) for cid in customer_ids]) + def _populate_hierarchy(): nonlocal hierarchy hierarchy = {} for d in ims_data.get_circuit_hierarchy(ds1): - d['contacts'] = customer_contacts.get(d['customerid'], []) hierarchy[d['id']] = d + d['contacts'] = sorted(list(_get_circuit_contacts(d))) logger.debug("hierarchy complete") def _populate_port_id_details(): @@ -672,7 +680,7 @@ def update_circuit_hierarchy_and_port_id_services(self, use_current=False): 'circuit_type': c['circuit-type'], 'service_type': c['product'], 'project': c['project'], - 'contacts': sorted(list(c['contacts'])) + 'contacts': c['contacts'] } if c['id'] in circuit_ids_to_monitor: rs[c['id']]['status'] = c['status'] @@ -737,13 +745,7 @@ def update_circuit_hierarchy_and_port_id_services(self, use_current=False): circuits = port_id_services.get(details['port_id'], []) for circ in circuits: - contacts = set() - contacts.update( - customer_contacts.get( - circ['customerid'], - [] - ) - ) + contacts = _get_circuit_contacts(circ) circ['fibre-routes'] = [] for x in set(_get_fibre_routes(circ['id'])): c = {