diff --git a/inventory_provider/db/ims.py b/inventory_provider/db/ims.py index e339780df8aa71bd5d35b3e4e2bb344759712f1d..da9de8681630e2be979a0346e7d88a9cc14c1890 100644 --- a/inventory_provider/db/ims.py +++ b/inventory_provider/db/ims.py @@ -12,7 +12,11 @@ from requests import HTTPError logger = logging.getLogger(__name__) - +# http://149.210.162.190:81/ImsVersions/21.9/html/50e6a1b1-3910-2091-63d5-e13777b2194e.htm # noqa +CIRCUIT_CUSTOMER_RELATION = { + "Circuit": 2, + "Customer": 4 +} # http://149.210.162.190:81/ImsVersions/20.1/html/86d07a57-fa45-835e-d4a2-a789c4acbc96.htm # noqa CIRCUIT_PROPERTIES = { 'Site': 8, @@ -29,6 +33,10 @@ CIRCUIT_PROPERTIES = { 'PortA': 34359738368, 'PortB': 68719476736 } +# http://149.210.162.190:81/ImsVersions/4.19.9/html/347cb410-8c05-47bd-ceb0-d1dd05bf98a4.htm # noqa +CITY_PROPERTIES = { + 'Country': 8 +} # http://149.210.162.190:81/ImsVersions/4.19.9/html/dbc969d0-e735-132e-6281-f724c6d7da64.htm # noqa CONTACT_PROPERTIES = { 'SiteRelatedContacts': 8, @@ -46,10 +54,6 @@ CUSTOMER_RELATED_CONTACT_PROPERTIES = { 'Customer': 8, 'Contact': 16 } -# http://149.210.162.190:81/ImsVersions/4.19.9/html/347cb410-8c05-47bd-ceb0-d1dd05bf98a4.htm # noqa -CITY_PROPERTIES = { - 'Country': 8 -} # http://149.210.162.190:81/ImsVersions/4.19.9/html/a8dc6266-d934-8162-4a55-9e1648187f2c.htm # noqa EQUIP_DEF_PROPERTIES = { 'Nodes': 4096 diff --git a/inventory_provider/db/ims_data.py b/inventory_provider/db/ims_data.py index e918835c2ee01fb560d92e84a2f9fa89d97ca174..c644d13c5d63fe88709b7f8630affdd8baffb496 100644 --- a/inventory_provider/db/ims_data.py +++ b/inventory_provider/db/ims_data.py @@ -119,15 +119,20 @@ def get_customer_service_emails(ds: IMS): yield k, sorted(list(v)) -def get_circuit_related_customer_ids(ds: IMS): +def get_circuit_related_customers(ds: IMS): relations = sorted( list( ds.get_filtered_entities( 'CircuitCustomerRelation', - 'circuit.inventoryStatusId== 3') + 'circuit.inventoryStatusId== 3', + ims.CIRCUIT_CUSTOMER_RELATION['Customer'] + ) ), key=itemgetter('circuitid')) - return {k: [c['customerid'] for c in v] for k, v in + return {k: [{ + 'id': c['customer']['id'], + 'name': c['customer']['name'] + } for c in v] for k, v in groupby(relations, key=itemgetter('circuitid'))} diff --git a/inventory_provider/tasks/worker.py b/inventory_provider/tasks/worker.py index afa0ddbd3600ce438e0377d2faeafeb2ef4a0d33..e06c7feb7a5b8ad1701d7e64416044ff8ef9db46 100644 --- a/inventory_provider/tasks/worker.py +++ b/inventory_provider/tasks/worker.py @@ -733,7 +733,7 @@ def extract_ims_data(): customer_contacts = {} circuit_ids_to_monitor = [] circuit_ids_and_sids = {} - additional_circuit_customer_ids = {} + additional_circuit_customers = {} hierarchy = {} port_id_details = defaultdict(list) @@ -773,10 +773,10 @@ def extract_ims_data(): {cid: sid for cid, sid in ims_data.get_ids_and_sids(ds=_ds())} @log_task_entry_and_exit - def _populate_additional_circuit_customer_ids(): - nonlocal additional_circuit_customer_ids - additional_circuit_customer_ids = \ - ims_data.get_circuit_related_customer_ids(ds=_ds()) + def _populate_additional_circuit_customers(): + nonlocal additional_circuit_customers + additional_circuit_customers = \ + ims_data.get_circuit_related_customers(ds=_ds()) exceptions = {} with concurrent.futures.ThreadPoolExecutor() as executor: @@ -788,8 +788,8 @@ def extract_ims_data(): executor.submit(_populate_circuit_ids_to_monitor): 'circuit_ids_to_monitor', executor.submit(_populate_sids): 'sids', - executor.submit(_populate_additional_circuit_customer_ids): - 'additional_circuit_customer_ids' + executor.submit(_populate_additional_circuit_customers): + 'additional_circuit_customers' } for future in concurrent.futures.as_completed(futures): @@ -840,7 +840,7 @@ def extract_ims_data(): 'customer_contacts': customer_contacts, 'circuit_ids_to_monitor': circuit_ids_to_monitor, 'circuit_ids_sids': circuit_ids_and_sids, - 'additional_circuit_customer_ids': additional_circuit_customer_ids, + 'additional_circuit_customers': additional_circuit_customers, 'hierarchy': hierarchy, 'port_id_details': port_id_details, 'port_id_services': port_id_services, @@ -852,7 +852,7 @@ def transform_ims_data(data): locations = data['locations'] customer_contacts = data['customer_contacts'] circuit_ids_to_monitor = data['circuit_ids_to_monitor'] - additional_circuit_customer_ids = data['additional_circuit_customer_ids'] + additional_circuit_customers = data['additional_circuit_customers'] hierarchy = data['hierarchy'] port_id_details = data['port_id_details'] port_id_services = data['port_id_services'] @@ -863,7 +863,9 @@ def transform_ims_data(data): def _get_circuit_contacts(c): customer_ids = {c['customerid']} - customer_ids.update(additional_circuit_customer_ids.get(c['id'], [])) + customer_ids.update( + [ac['id'] for ac in additional_circuit_customers.get(c['id'], [])] + ) return set().union( *[customer_contacts.get(cid, []) for cid in customer_ids]) @@ -942,6 +944,8 @@ def transform_ims_data(data): return list(rs.values()) def _format_service(s): + s['additional_customers'] = \ + additional_circuit_customers.get(s['id'], []) s['original_status'] = s['status'] s['monitored'] = True if s['circuit_type'] == 'service' \ diff --git a/test/test_worker.py b/test/test_worker.py index 9e6044c463e74b45c23f1c594936a1ce28377f25..032768c53599c125efb946f019a4e7b5c7201d03 100644 --- a/test/test_worker.py +++ b/test/test_worker.py @@ -30,8 +30,16 @@ def test_extract_ims_data(mocker): ) mocker.patch( 'inventory_provider.tasks.worker.ims_data.' - 'get_circuit_related_customer_ids', - return_value=[{'id a': ['A', 'A2']}, {'id b': ['B']}] + 'get_circuit_related_customers', + return_value=[ + { + 'id a': [ + {'id': 'A', 'name': 'customer a'}, + {'A2'} + ] + }, + {'id b': [{'id': 'B', 'name': 'customer b'}]} + ] ) mocker.patch( 'inventory_provider.tasks.worker.ims_data.get_circuit_hierarchy', @@ -73,8 +81,16 @@ def test_extract_ims_data(mocker): assert res['lg_routers'] == ['lg router 1', 'lg router 2'] assert res['customer_contacts'] == {'123': 'CON A', '456': 'CON B'} assert res['circuit_ids_to_monitor'] == [123, 456, 789] - assert res['additional_circuit_customer_ids'] == \ - [{'id a': ['A', 'A2']}, {'id b': ['B']}] + assert res['additional_circuit_customers'] == \ + [ + { + 'id a': [ + {'id': 'A', 'name': 'customer a'}, + {'A2'} + ] + }, + {'id b': [{'id': 'B', 'name': 'customer b'}]} + ] assert res['hierarchy'] == { '1': {'id': '1', 'value': 'A'}, '2': {'id': '2', 'value': 'B'} @@ -123,7 +139,9 @@ def test_transform_ims_data(): } additional_circuit_customer_ids = { - "circ_id_1": "cu_1_1" + "circ_id_1": [ + {"id": "cu_1_1", "name": "customer_1"} + ] } customer_contacts = { @@ -300,7 +318,7 @@ def test_transform_ims_data(): "locations": locations, "customer_contacts": customer_contacts, "circuit_ids_to_monitor": ["sub_circuit_2"], - "additional_circuit_customer_ids": additional_circuit_customer_ids, + "additional_circuit_customers": additional_circuit_customer_ids, "hierarchy": hierarchy, "port_id_details": port_id_details, "port_id_services": port_id_services,