diff --git a/Changelog.md b/Changelog.md index 0b78aed3f2a96828a31e568adabf0f8c51dcfafb..b678588d76284b32da5ac7642e4521263a4d45fc 100644 --- a/Changelog.md +++ b/Changelog.md @@ -2,6 +2,10 @@ All notable changes to this project will be documented in this file. +## [0.93] - 2022-09-05 +- POL1-533: Changed services api to include services with SIDs defined on ports +- DBOARD3-663: Updated source for contact list in notifications + ## [0.92] - 2022-08-12 - REPORTING-312: Added NREN asn's to /msr/services response diff --git a/inventory_provider/db/ims_data.py b/inventory_provider/db/ims_data.py index 308ba5a894a35b7e03ec2d539021bb0b91b8fd90..bdc59359251676c4b0dcd6bb4ae8fb9fd45fcec0 100644 --- a/inventory_provider/db/ims_data.py +++ b/inventory_provider/db/ims_data.py @@ -109,18 +109,14 @@ def get_service_types(ds: IMS): def get_customer_service_emails(ds: IMS): customer_contacts = defaultdict(set) + for x in ds.get_filtered_entities( 'customerrelatedcontact', - "contact.plannedworkmail != '' | contact.mail != ''", - CUSTOMER_RELATED_CONTACT_PROPERTIES['Contact'] - ): - customer_contacts[x['customerid']].add(x['contact']['mail']) - for x in ds.get_filtered_entities( - 'customerrelatedcontact', - "contact.troubleticketMail != '' | contact.mail != ''", + "contact.troubleticketMail != ''", CUSTOMER_RELATED_CONTACT_PROPERTIES['Contact'] ): - customer_contacts[x['customerid']].add(x['contact']['mail']) + customer_contacts[x['customerid']].add( + x['contact']['troubleticketmail']) for k, v in customer_contacts.items(): yield k, sorted(list(v)) @@ -129,9 +125,9 @@ def get_circuit_related_customers(ds: IMS): return_value = defaultdict(list) for ccr in ds.get_filtered_entities( - 'CircuitCustomerRelation', - 'circuit.inventoryStatusId== 3', - ims.CIRCUIT_CUSTOMER_RELATION['Customer']): + 'CircuitCustomerRelation', + 'circuit.inventoryStatusId== 3', + ims.CIRCUIT_CUSTOMER_RELATION['Customer']): return_value[ccr['circuitid']].append( { 'id': ccr['customer']['id'], @@ -210,7 +206,7 @@ def get_port_id_services(ds: IMS): 'id': circuit['id'], 'name': circuit['name'], 'status': IMS_OPSDB_STATUS_MAP.get( - InventoryStatus(circuit['inventorystatusid']), 'unknown'), + InventoryStatus(circuit['inventorystatusid']), 'unknown'), 'circuit_type': circuit['circuit_type'], 'service_type': products[circuit['productid']], 'project': customers[circuit['customerid']], @@ -273,6 +269,32 @@ def get_port_id_services(ds: IMS): } +def get_port_sids(ds: IMS): + """ + This function fetches SIDs for external ports that have them defined, + + :param ds: IMS datasource object + :returns: Dict mapping external port IDs to the SID assigned to the port + """ + return { + p['objectid']: p['value'] for p in ds.get_filtered_entities( + 'ExtraFieldValue', 'extrafieldid == 3249 | value <> ""', + step_count=10000)} + + +def get_internal_port_sids(ds: IMS): + """ + This function fetches SIDs for external ports that have them defined, + + :param ds: IMS datasource object + :returns: Dict mapping internal port IDs to the SID assigned to the port + """ + return { + p['objectid']: p['value'] for p in ds.get_filtered_entities( + 'ExtraFieldValue', 'extrafieldid == 3250 | value <> ""', + step_count=10000)} + + def get_port_details(ds: IMS): port_nav_props = [ ims.PORT_PROPERTIES['Node'], @@ -285,6 +307,13 @@ def get_port_details(ds: IMS): # this is here instead of chaining to make debugging easier def _process_ports(ports, p_type): + _port_sids = {} + + if p_type == 'external': + _port_sids = get_port_sids(ds) + else: + _port_sids = get_internal_port_sids(ds) + for p in ports: vendor = None interface_name = None @@ -303,11 +332,16 @@ def get_port_details(ds: IMS): if not interface_name: interface_name = p['name'] + data = { 'port_id': p['id'], 'equipment_name': p['node']['name'], 'interface_name': interface_name } + + if p['id'] in _port_sids: + data['sid'] = _port_sids[p['id']] + yield data yield from _process_ports(ds.get_all_entities( @@ -479,8 +513,8 @@ def lookup_lg_routers(ds: IMS): pass # no alias - ignore silently eq = { - 'equipment name': node['name'], - 'type': + 'equipment name': node['name'], + 'type': 'INTERNAL' if site['name'] in INTERNAL_POP_NAMES else 'CORE', @@ -492,8 +526,8 @@ def lookup_lg_routers(ds: IMS): 'abbreviation': abbreviation, 'longitude': site['longitude'], 'latitude': site['latitude'], - } } + } yield eq diff --git a/inventory_provider/routes/msr.py b/inventory_provider/routes/msr.py index a1828a2082edb8f23454ddb32a72f7ccd564eac1..a3d470576555173ce8de729b55623da774b75f25 100644 --- a/inventory_provider/routes/msr.py +++ b/inventory_provider/routes/msr.py @@ -83,6 +83,11 @@ These endpoints are intended for use by MSR. .. autofunction:: inventory_provider.routes.msr.asn_peers +/msr/ip-services +-------------------------------------------- + +.. autofunction:: inventory_provider.routes.msr.ip_services + helpers ------------------------------------- @@ -135,7 +140,7 @@ PEERING_LIST_SCHEMA = { 'description': {'type': 'string'}, 'logical-system': {'type': 'string'}, 'group': {'type': 'string'}, - 'hostname': {'type': 'string'}, + 'hostname': {'type': 'string', 'format': 'hostname'}, 'remote-asn': {'type': 'integer'}, 'local-asn': {'type': 'integer'}, 'instance': {'type': 'string'} @@ -363,6 +368,63 @@ DOMAIN_TO_POP_MAPPING = { "ams.nl": "Amsterdam" } +IP_SERVICES_LIST_SCHEMA = { + '$schema': 'http://json-schema.org/draft-07/schema#', + 'definitions': { + 'minimal-peering-schema': { + # cf. PEERING_LIST_SCHEMA + 'type': 'object', + 'properties': { + 'address': {'type': 'string'}, + 'group': {'type': 'string'}, + 'hostname': {'type': 'string', 'format': 'hostname'} + }, + 'required': ['address', 'group', 'hostname'], + 'additionalProperties': True + }, + 'service': { + 'type': 'object', + 'properties': { + 'name': {'type': 'string'}, + 'customer': {'type': 'string'}, + 'type': {'type': 'string'}, + 'status': {'type': 'string'}, + 'pop': { + 'type': 'object', + 'properties': { + 'name': {'type': 'string'}, + 'abbrev': {'type': 'string'}, + }, + 'required': ['name', 'abbrev'], + 'additionalProperties': False + } + }, + 'required': ['name', 'customer', 'type', 'pop', 'status'], + 'additionalProperties': False + }, + 'interface-address': { + 'properties': { + 'hostname': {'type': 'string', 'format': 'hostname'}, + 'port': {'type': 'string'}, + 'address': {'type': 'string'}, + 'services': { + 'type': 'array', + 'items': {'$ref': '#/definitions/service'} + }, + 'peerings': { + 'type': 'array', + 'items': {'$ref': '#/definitions/minimal-peering-schema'} + } + }, + 'required': [ + 'hostname', 'port', 'address', 'services', 'peerings'], + 'additionalProperties': False + } + }, + 'type': 'array', + 'items': {'$ref': '#/definitions/interface-address'} +} + # very similar to PEERING_LIST_SCHEMA but # with a field for NREN, which is required ASN_PEER_LIST_SCHEMA = { @@ -1316,10 +1378,11 @@ def asn_peers(asn): This method returns a list of all peers filtered by `group` and `instance`, which can be passed either as URL query parameters or as entries in a POST request with a JSON body that matches this schema: - `{ - "group": "group to filter by", - "instance": "instance to filter by" - }` + `{ + "group": "group to filter by", + "instance": "instance to filter by" + }` + Results are returned where all filters given are true, and exact string matches. @@ -1389,3 +1452,126 @@ def asn_peers(asn): r.set(cache_key, response.encode('utf-8')) return Response(response, mimetype='application/json') + + +def _dedupe(iter_of_objs): + """ + remove duplicates from the input iterable + + the elements of the input iterable must be json-serializable + + :param iter_of_objs: iterable + :return: a new iterable containing unique elements from the original + """ + iter_of_json = (json.dumps(_o, sort_keys=True) for _o in iter_of_objs) + return (json.loads(_s) for _s in set(iter_of_json)) + + +def _load_ip_services(): + """ + yields items that + :return: + """ + + ims_interface_services = {} + equip_port_re = re.compile(r'^ims:interface_services:([^:]+):(.+)') + for doc in common.load_json_docs( + config_params=current_app.config['INVENTORY_PROVIDER_CONFIG'], + key_pattern='ims:interface_services:*', + num_threads=40): + + m = equip_port_re.match(doc['key']) + assert m # sanity + equipment = m.group(1) + port = m.group(2) + assert all([_s['equipment'] == equipment + for _s in doc['value']]) # sanity + assert all([_s['port'] == port + for _s in doc['value']]) # sanity + hostname = ims_equipment_to_hostname(equipment) + ims_interface_services[f'{hostname}:{port.lower()}'] = doc['value'] + + netconf_interfaces = {} + host_if_extraction_re = re.compile(r'^netconf-interfaces:(.+?):') + for doc in common.load_json_docs( + config_params=current_app.config['INVENTORY_PROVIDER_CONFIG'], + key_pattern='netconf-interfaces:*', + num_threads=20): + matches = host_if_extraction_re.match(doc['key']) + if matches: + hostname = matches[1] + doc['value']['hostname'] = hostname + port = doc['value']['name'] + netconf_interfaces[f'{hostname}:{port}'] = doc['value'] + + def _service_info(_s): + return { + 'name': _s['name'], + 'customer': _s['customer'], + 'type': _s['service_type'], + 'status': _s['status'], + 'pop': { + 'name': _s['pop_name'], + 'abbrev': _s['pop_abbreviation'] + } + } + + # pre-compute remote ipaddress objects, and group to avoid duplicates + r = common.get_current_redis() + all_peerings = {} + for _remote in json.loads(r.get('juniper-peerings:all').decode('utf-8')): + remote_info = all_peerings.setdefault(_remote['address'], { + 'address': ipaddress.ip_address(_remote['address']), + 'info': [] + }) + remote_info['info'].append(_remote) + + def _remotes_in_network(ifc_address): + network = ipaddress.ip_interface(ifc_address).network + for _r in all_peerings.values(): + if _r['address'] in network: + yield from _r['info'] + + for key, ifc in netconf_interfaces.items(): + _services = map( + _service_info, + ims_interface_services.get(key, [])) + _services = list(_dedupe(_services)) + + for address in ifc['ipv4'] + ifc['ipv6']: + + yield { + 'hostname': ifc['hostname'], + 'port': ifc['name'], + 'address': address, + 'services': _services, + 'peerings': list(_remotes_in_network(address)) + } + + +@routes.route('/ip-services', methods=['GET', 'POST']) +@common.require_accepts_json +def ip_services(): + """ + This method will return a list of all interface addresses + with any operational services defined for that interface. + + The response will be formatted according to the following schema: + + .. asjson:: + inventory_provider.routes.msr.IP_SERVICES_LIST_SCHEMA + + :return: a json list, formatted as above + """ + + cache_key = 'classifier-cache:msr:ip-services' + + r = common.get_current_redis() + result = _ignore_cache_or_retrieve(request, cache_key, r) + + if not result: + result = list(_load_ip_services()) + result = json.dumps(result) + r.set(cache_key, result.encode('utf-8')) + + return Response(result.encode('utf-8'), mimetype='application/json') diff --git a/inventory_provider/tasks/worker.py b/inventory_provider/tasks/worker.py index dda87815227f1f467aa6d0932f9ab3a863f2d980..eeffb33ae076c204d7a277a4512fc2120f7660b9 100644 --- a/inventory_provider/tasks/worker.py +++ b/inventory_provider/tasks/worker.py @@ -78,8 +78,8 @@ class InventoryTask(Task): with open(os.environ['INVENTORY_PROVIDER_CONFIG_FILENAME']) as f: logging.info( - "Initializing worker with config from: %r" % - os.environ['INVENTORY_PROVIDER_CONFIG_FILENAME']) + "Initializing worker with config from: %r" % + os.environ['INVENTORY_PROVIDER_CONFIG_FILENAME']) InventoryTask.config = config.load(f) logging.debug("loaded config: %r" % InventoryTask.config) @@ -1051,29 +1051,38 @@ def transform_ims_data(data): f"{circ['equipment']}/{circ['other_end_equipment']}" ][circ['id']] = circ + sid = None if circ['id'] in circuit_ids_and_sids: sid = circuit_ids_and_sids[circ['id']] - circ['sid'] = sid - if circ['circuit_type'] == 'circuit': - logger.info(f'SID ({sid}) Circuit ({circ["id"]})' - f' Name ({circ["name"]}) not a service') - else: - sid_info = { - 'circuit_id': circ['id'], - 'sid': sid, - 'status': circ['original_status'], - 'monitored': circ['monitored'], - 'name': circ['name'], - 'speed': circ['calculated-speed'], - 'service_type': circ['service_type'], - 'project': circ['project'], - 'customer': circ['customer'], - 'equipment': circ['equipment'], - 'port': circ['port'], - 'geant_equipment': circ['equipment'] in geant_nodes - } - if sid_info not in sid_services[sid]: - sid_services[sid].append(sid_info) + + elif 'sid' in details: + if len(circuits) > 1: + # we don't know which circuit + # to give the SID in this case, so skip + continue + sid = details['sid'] + + if sid is None: + continue + + circ['sid'] = sid + + sid_info = { + 'circuit_id': circ['id'], + 'sid': sid, + 'status': circ['original_status'], + 'monitored': circ['monitored'], + 'name': circ['name'], + 'speed': circ['calculated-speed'], + 'service_type': circ['service_type'], + 'project': circ['project'], + 'customer': circ['customer'], + 'equipment': circ['equipment'], + 'port': circ['port'], + 'geant_equipment': circ['equipment'] in geant_nodes + } + if sid_info not in sid_services[sid]: + sid_services[sid].append(sid_info) interface_services[k].extend(circuits) diff --git a/setup.py b/setup.py index 7334603bb525aa4215e804b13b20b74e509bff2b..067c794357ae127796fceb4ad5aee812016d199f 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages setup( name='inventory-provider', - version="0.92", + version="0.93", author='GEANT', author_email='swd@geant.org', description='Dashboard inventory provider', diff --git a/test/data/ims_external_ports_sids.json b/test/data/ims_external_ports_sids.json new file mode 100644 index 0000000000000000000000000000000000000000..78cc4169b3c90407b7970c393e35ebb90695624b --- /dev/null +++ b/test/data/ims_external_ports_sids.json @@ -0,0 +1,1051 @@ +{ + "6419379": "GA-01480", + "6417071": "GS-00170", + "6417077": "GS-00372", + "6417079": "GS-00382", + "6417584": "GA-00707", + "6417639": "GS-00080", + "6417649": "GA-01212", + "6417650": "GA-01213", + "6417651": "GA-01214", + "6417652": "GA-01215", + "6417655": "GA-01216", + "6417656": "GA-01217", + "6417658": "GS-00076", + "6417659": "GS-00081", + "6417660": "GA-01220", + "6417662": "GA-01221", + "6417663": "GA-01222", + "6417667": "GA-01223", + "6417668": "GA-01224", + "6417669": "GA-01225", + "6417671": "GA-01226", + "6417672": "GA-01227", + "6417673": "GA-01228", + "6417675": "GA-01229", + "6417676": "GA-01230", + "6417677": "GA-01231", + "6417678": "GA-01232", + "6417683": "GS-00077", + "6417684": "GA-01234", + "6417685": "GA-01235", + "6417686": "GA-01236", + "6417687": "GA-01237", + "6417688": "GA-01238", + "6417689": "GA-01239", + "6417691": "GA-01240", + "6417692": "GA-01241", + "6417693": "GA-01242", + "6417694": "GA-01243", + "6417695": "GA-01244", + "6417697": "GA-01245", + "6417703": "GA-01246", + "6417704": "GA-01247", + "6417726": "GA-01248", + "6417728": "GA-01249", + "6417731": "GA-01250", + "6417732": "GA-01251", + "6417752": "GA-01252", + "6417753": "GA-01253", + "6417754": "GA-01254", + "6417774": "GA-01255", + "6417775": "GA-01256", + "6417776": "GA-01257", + "6417777": "GA-01258", + "6417778": "GA-01259", + "6417779": "GA-01260", + "6417780": "GA-01261", + "6417800": "GA-01262", + "6417801": "GA-01263", + "6417802": "GA-01264", + "6417822": "GA-01265", + "6417823": "GA-01266", + "6417827": "GA-01267", + "6417828": "GA-01268", + "6417848": "GA-01269", + "6417849": "GA-01270", + "6417850": "GA-01271", + "6417870": "GA-01272", + "6417871": "GA-01273", + "6417872": "GA-01274", + "6417873": "GA-01275", + "6417874": "GA-01276", + "6417875": "GA-01277", + "6417876": "GA-01278", + "6417877": "GA-01279", + "6417906": "GA-01280", + "6417907": "GA-01281", + "6417912": "GA-01282", + "6417914": "GA-01283", + "6417923": "GS-00081", + "6417930": "GA-01285", + "6417932": "GA-01286", + "6417941": "GA-01287", + "6417945": "GA-01288", + "6417947": "GS-00080", + "6417963": "GA-01290", + "6417969": "GA-01291", + "6418167": "GA-01292", + "6418174": "GA-01293", + "6418202": "GA-01294", + "6418211": "GA-01295", + "6418214": "GA-01296", + "6418217": "GA-01297", + "6418219": "GA-01298", + "6418228": "GA-01299", + "6418232": "GA-01300", + "6418233": "GA-01301", + "6418236": "GA-01302", + "6418237": "GA-01303", + "6418238": "GA-01304", + "6418240": "GA-01305", + "6418243": "GA-01306", + "6418244": "GA-01307", + "6418246": "GA-01308", + "6418249": "GA-01309", + "6418250": "GA-01310", + "6418286": "GA-01311", + "6418288": "GA-01312", + "6418290": "GA-01313", + "6418291": "GA-01314", + "6418293": "GA-01315", + "6418294": "GA-01316", + "6418295": "GA-01317", + "6418315": "GA-01318", + "6418317": "GA-01320", + "6418318": "GA-01321", + "6418319": "GA-01322", + "6418321": "GA-01323", + "6418325": "GA-01324", + "6418327": "GA-01325", + "6418328": "GA-01326", + "6418329": "GA-01327", + "6418330": "GA-01328", + "6418331": "GA-01329", + "6418332": "GA-01330", + "6418333": "GA-01331", + "6418335": "GA-01332", + "6418337": "GA-01333", + "6418338": "GA-01334", + "6418430": "GA-01335", + "6418431": "GA-01336", + "6418434": "GA-01337", + "6418440": "GA-01338", + "6418441": "GA-01339", + "6418446": "GA-01340", + "6418447": "GA-01341", + "6418451": "GA-01342", + "6418452": "GA-01343", + "6418535": "GA-01345", + "6418536": "GA-01346", + "6418538": "GA-01347", + "6418539": "GA-01348", + "6418540": "GA-01349", + "6418542": "GA-01350", + "6418552": "GA-01351", + "6418555": "GA-01352", + "6418556": "GA-01353", + "6418559": "GA-01354", + "6418560": "GA-01355", + "6418561": "GA-01356", + "6418658": "GA-01357", + "6418681": "GA-01358", + "6418686": "GA-01359", + "6418691": "GA-01360", + "6418693": "GA-01361", + "6418695": "GA-01362", + "6418697": "GA-01363", + "6418768": "GA-01364", + "6418775": "GA-01365", + "6418839": "GA-01366", + "6418840": "GA-01367", + "6418870": "GA-01368", + "6418877": "GA-01369", + "6418906": "GA-01370", + "6418907": "GA-01371", + "6418914": "GA-01372", + "6418915": "GA-01373", + "6418929": "GA-01374", + "6418936": "GA-01375", + "6418938": "GA-01376", + "6418970": "GA-01377", + "6418971": "GA-01378", + "6418973": "GA-01379", + "6418974": "GA-01380", + "6418975": "GA-01381", + "6418976": "GA-01382", + "6418977": "GA-01383", + "6418978": "GA-01384", + "6418980": "GA-01385", + "6418983": "GA-01386", + "6418985": "GA-01387", + "6418987": "GA-01388", + "6418989": "GA-01389", + "6418991": "GA-01390", + "6418992": "GA-01391", + "6418993": "GA-01392", + "6418995": "GA-01393", + "6418996": "GA-01394", + "6418997": "GA-01395", + "6418998": "GA-01396", + "6419001": "GA-01397", + "6419002": "GA-01398", + "6419006": "GA-01399", + "6419021": "GA-01400", + "6419022": "GA-01401", + "6419023": "GA-01402", + "6419024": "GA-01403", + "6419025": "GA-01404", + "6419027": "GA-01405", + "6419030": "GA-01406", + "6419031": "GA-01407", + "6419032": "GA-01408", + "6419033": "GA-01409", + "6419034": "GA-01410", + "6419035": "GA-01411", + "6419036": "GA-01412", + "6419038": "GA-01413", + "6419156": "GA-01414", + "6419157": "GA-01415", + "6419158": "GA-01416", + "6419159": "GA-01417", + "6419165": "GA-01418", + "6419166": "GA-01419", + "6419167": "GA-01420", + "6419169": "GA-01421", + "6419172": "GA-01422", + "6419174": "GA-01423", + "6419175": "GA-01424", + "6419176": "GA-01425", + "6419178": "GA-01426", + "6419179": "GA-01427", + "6419180": "GA-01428", + "6419181": "GA-01429", + "6419183": "GA-01430", + "6419185": "GA-01431", + "6419186": "GA-01432", + "6419187": "GA-01433", + "6419199": "GA-01434", + "6419201": "GA-01435", + "6419204": "GA-01436", + "6419205": "GA-01437", + "6419206": "GA-01438", + "6419208": "GA-01439", + "6419209": "GA-01440", + "6419210": "GA-01441", + "6419211": "GA-01442", + "6419212": "GA-01443", + "6419213": "GA-01444", + "6419214": "GA-01445", + "6419216": "GA-01446", + "6419300": "GA-01447", + "6419302": "GA-01448", + "6419303": "GA-01449", + "6419305": "GA-01450", + "6419311": "GA-01451", + "6419315": "GA-01452", + "6419317": "GA-01453", + "6419321": "GA-01454", + "6419322": "GA-01455", + "6419323": "GA-01456", + "6419326": "GA-01457", + "6419327": "GA-01458", + "6419328": "GS-00789", + "6419330": "GA-01460", + "6419332": "GA-01462", + "6419334": "GA-01463", + "6419335": "GA-01464", + "6419339": "GA-01465", + "6419341": "GA-01466", + "6419342": "GA-01467", + "6419343": "GA-01468", + "6419345": "GA-01469", + "6419347": "GA-01470", + "6419349": "GA-01471", + "6419350": "GA-01472", + "6419351": "GA-01473", + "6419352": "GA-01474", + "6419354": "GA-01475", + "6419356": "GA-01476", + "6419369": "GA-01477", + "6419374": "GA-01478", + "6419375": "GA-01479", + "6419385": "GA-01481", + "6419391": "GA-01482", + "6419622": "GA-01483", + "6419623": "GA-01484", + "6419630": "GA-01485", + "6419632": "GA-01486", + "6419637": "GA-01487", + "6419646": "GA-01488", + "6419647": "GA-01489", + "6419659": "GA-01490", + "6419746": "GA-01491", + "6419750": "GA-01492", + "6419753": "GA-01493", + "6419757": "GA-01494", + "6419768": "GA-01495", + "6419769": "GA-01496", + "6419797": "GA-01497", + "6419808": "GA-01498", + "6419809": "GA-01499", + "6419810": "GA-01500", + "6419811": "GA-01501", + "6419812": "GA-01502", + "6419813": "GA-01503", + "6419814": "GA-01504", + "6419815": "GA-01505", + "6419816": "GA-01506", + "6419817": "GA-01507", + "6419818": "GA-01508", + "6419819": "GA-01509", + "6419820": "GA-01510", + "6419821": "GA-01511", + "6419822": "GA-01512", + "6419823": "GA-01513", + "6419824": "GA-01514", + "6419825": "GA-01515", + "6419826": "GA-01516", + "6419827": "GA-01517", + "6419888": "GA-01518", + "6419889": "GA-01519", + "6419891": "GA-01520", + "6419893": "GA-01521", + "6419896": "GA-01522", + "6419899": "GA-01523", + "6419900": "GA-01524", + "6419901": "GA-01525", + "6419906": "GA-01526", + "6419966": "GA-01527", + "6419992": "GA-01528", + "6419996": "GA-01529", + "6419998": "GA-01530", + "6420013": "GA-01531", + "6420029": "GA-01532", + "6420031": "GA-01533", + "6420032": "GS-00783", + "6424322": "GA-01538", + "6424323": "GA-01539", + "6424329": "GA-01540", + "6424333": "GA-01541", + "6424339": "GA-01542", + "6424340": "GA-01543", + "6424344": "GA-01544", + "6424345": "GA-01545", + "6424346": "GA-01546", + "6424351": "GA-01547", + "6424358": "GA-01548", + "6424361": "GA-01549", + "6424378": "GA-01550", + "6424389": "GA-01551", + "6424390": "GA-01552", + "6424398": "GA-01554", + "6424399": "GA-01555", + "6424404": "GA-01557", + "6424406": "GA-01558", + "6424412": "GA-01559", + "6424414": "GA-01560", + "6424416": "GA-01561", + "6424417": "GA-01562", + "6424428": "GA-01563", + "6424430": "GA-01564", + "6424431": "GA-01565", + "6424438": "GA-01566", + "6424487": "GA-01567", + "6424501": "GA-01568", + "6424504": "GA-01569", + "6424505": "GA-01570", + "6424506": "GA-01571", + "6424509": "GA-01572", + "6424512": "GA-01573", + "6424517": "GA-01574", + "6424523": "GA-01575", + "6424532": "GA-01576", + "6424533": "GA-01577", + "6424534": "GA-01578", + "6424535": "GA-01579", + "6424536": "GA-01580", + "6424537": "GA-01581", + "6424538": "GA-01582", + "6424539": "GA-01583", + "6424540": "GA-01584", + "6424542": "GA-01585", + "6424543": "GA-01586", + "6424545": "GA-01587", + "6424546": "GA-01588", + "6424547": "GA-01589", + "6424549": "GA-01590", + "6424550": "GA-01591", + "6424551": "GA-01592", + "6424556": "GA-01593", + "6424557": "GA-01594", + "6424563": "GA-01595", + "6424578": "GA-01596", + "6424580": "GA-01597", + "6424592": "GA-01598", + "6424605": "GA-01599", + "6424607": "GA-01600", + "6424632": "GA-01601", + "6424633": "GA-01602", + "6424634": "GA-01603", + "6424642": "GA-01604", + "6424651": "GA-01605", + "6424652": "GA-01606", + "6424654": "GA-01607", + "6424662": "GA-01608", + "6424663": "GA-01609", + "6424665": "GA-01610", + "6424666": "GA-01611", + "6424667": "GA-01612", + "6424668": "GA-01613", + "6424712": "GA-01614", + "6424714": "GA-01615", + "6424716": "GA-01616", + "6424717": "GA-01617", + "6424718": "GA-01618", + "6424719": "GA-01619", + "6424720": "GA-01620", + "6424724": "GA-01621", + "6424727": "GA-01622", + "6424728": "GA-01623", + "6424729": "GA-01624", + "6424735": "GA-01625", + "6424740": "GA-01626", + "6424750": "GA-01627", + "6424751": "GA-01628", + "6424752": "GA-01629", + "6424754": "GA-01630", + "6424757": "GA-01631", + "6424758": "GA-01632", + "6424759": "GA-01633", + "6424760": "GA-01634", + "6424761": "GA-01635", + "6424766": "GA-01636", + "6424767": "GA-01637", + "6424768": "GA-01638", + "6424773": "GA-01639", + "6424781": "GA-01640", + "6424795": "GA-01641", + "6424798": "GA-01642", + "6424799": "GA-01643", + "6424800": "GA-01644", + "6424804": "GA-01645", + "6424805": "GS-00376", + "6424807": "GA-01647", + "6424808": "GA-01648", + "6424809": "GA-01649", + "6424840": "GA-01650", + "6424841": "GA-01651", + "6425967": "GA-01652", + "6425968": "GA-01653", + "6425969": "GA-01654", + "6428016": "GA-01655", + "6428017": "GA-01656", + "6428987": "GA-01657", + "6428988": "GA-01658", + "6428989": "GA-01659", + "6434960": "GA-01660", + "6434964": "GA-01661", + "6438316": "GA-01662", + "6438317": "GS-00788", + "6439031": "GA-01664", + "6442673": "GA-01665", + "6443043": "GA-01666", + "6443091": "GA-01667", + "6443161": "GA-01668", + "6444351": "GA-01669", + "6444352": "GA-01670", + "6444631": "GA-01671", + "6419370": "GS-00996", + "6419395": "GS-00972", + "6419397": "GS-00730", + "6419399": "GS-00965", + "6419401": "GS-01053", + "6419402": "GS-00964", + "6419404": "GS-00980", + "6419405": "GS-00727", + "6419406": "GS-00768", + "6419407": "GS-00488", + "6419408": "GS-00961", + "6419409": "GS-00978", + "6419410": "GS-00966", + "6419412": "GS-00235", + "6419419": "GS-00468", + "6419420": "GS-00467", + "6419423": "GS-00138", + "6419425": "GS-00766", + "6419427": "GS-00733", + "6419428": "GS-00967", + "6419429": "GS-00769", + "6419430": "GS-00742", + "6419431": "GS-00972", + "6419432": "GS-00726", + "6419435": "GS-00146", + "6419436": "GS-00971", + "6419439": "GS-00231", + "6419440": "GS-00259", + "6419443": "GS-00228", + "6419450": "GS-00925", + "6419451": "GS-00768", + "6419452": "GS-00973", + "6419455": "GS-00742", + "6419456": "GS-00963", + "6419458": "GS-00729", + "6419459": "GS-00923", + "6419460": "GS-00644", + "6419462": "GS-00766", + "6419465": "GS-00236", + "6419470": "GS-00111", + "6419474": "GS-00815", + "6419475": "GS-00913", + "6419476": "GS-00769", + "6419478": "GS-00744", + "6419479": "GS-00962", + "6419481": "GS-00976", + "6419482": "GS-00975", + "6419483": "GS-00672", + "6419486": "GS-00767", + "6419487": "GS-00720", + "6419488": "GS-00970", + "6419489": "GS-00230", + "6419490": "GS-00232", + "6419491": "GS-00234", + "6419492": "GS-00229", + "6419497": "GS-00968", + "6419498": "GS-00963", + "6419499": "GS-00917", + "6419502": "GS-00842", + "6419503": "GS-00492", + "6419504": "GS-00643", + "6419505": "GS-00645", + "6419506": "GS-00907", + "6419507": "GS-00721", + "6419508": "GS-00981", + "6419509": "GS-00980", + "6419512": "GS-00137", + "6419513": "GS-00139", + "6419520": "GS-00810", + "6419521": "GS-00767", + "6419523": "GS-00720", + "6419524": "GS-00725", + "6419525": "GS-00916", + "6419526": "GS-00915", + "6419528": "GS-00966", + "6419531": "GS-00744", + "6419532": "GS-00743", + "6419533": "GS-00978", + "6419534": "GS-00841", + "6419535": "GS-00737", + "6419536": "GS-00968", + "6419537": "GS-00973", + "6419540": "GS-00233", + "6419545": "GS-00321", + "6419547": "GS-00465", + "6419548": "GS-00743", + "6419549": "GS-00849", + "6419550": "GS-00961", + "6419551": "GS-00821", + "6419552": "GS-00738", + "6419553": "GS-00944", + "6419554": "GS-00965", + "6419555": "GS-00977", + "6419557": "GS-00724", + "6419561": "GS-00974", + "6419562": "GS-00648", + "6419570": "GS-00920", + "6419571": "GS-00967", + "6419572": "GS-00974", + "6419573": "GS-00969", + "6419574": "GS-01092", + "6419575": "GS-00970", + "6419576": "GS-00746", + "6419577": "GS-00964", + "6419578": "GS-00909", + "6419579": "GS-00665", + "6419580": "GS-00666", + "6419581": "GS-00969", + "6419582": "GS-00649", + "6419585": "GS-00142", + "6419589": "GS-00322", + "6420038": "GS-00988", + "6423197": "GS-00735", + "6428289": "GS-00476", + "6428447": "GS-00979", + "6428762": "GS-00722", + "6428889": "GS-00846", + "6428897": "GS-00960", + "6428994": "GS-00725", + "6428995": "GS-00726", + "6428996": "GS-00365", + "6430749": "GS-01158", + "6434482": "GS-01157", + "6434488": "GS-01155", + "6434489": "GS-01153", + "6434508": "GS-01156", + "6434552": "GS-01162", + "6434771": "GS-00731", + "6437057": "GS-00358", + "6437058": "GS-00244", + "6437059": "GS-00320", + "6437060": "GS-00673", + "6437061": "GS-00466", + "6437063": "GS-00144", + "6437064": "GS-00319", + "6437068": "GS-00360", + "6437069": "GS-00359", + "6437070": "GS-00887", + "6437122": "GS-00227", + "6437557": "GS-00908", + "6439033": "GS-00161", + "6439135": "GS-01065", + "6439179": "GS-00806", + "6439180": "GS-00905", + "6441515": "GS-01160", + "6441801": "GS-01163", + "6442916": "GS-00129", + "6442917": "GS-00130", + "6443047": "GS-00719", + "6443191": "GS-00143", + "6443274": "GS-00728", + "6443275": "GS-00688", + "6443276": "GS-00688", + "6428433": "GS-00645", + "6428356": "GS-00663", + "6428432": "GS-00662", + "6425125": "GS-00107", + "6425117": "GS-00652", + "6425065": "GS-00838", + "6425081": "GS-00959", + "6444311": "GS-00630", + "6425067": "GS-00892", + "6425124": "GS-00579", + "6437556": "GS-00627", + "6435011": "GS-00631", + "6425110": "GS-00893", + "6425122": "GS-00900", + "6425133": "GS-00939", + "6425109": "GS-00895", + "6427901": "GS-00898", + "6443311": "GS-00634", + "6438256": "GS-00940", + "6425063": "GS-00839", + "6439574": "GS-00894", + "6425116": "GS-00899", + "6425105": "GS-00654", + "6425185": "GS-00889", + "6425157": "GS-00890", + "6425169": "GS-00835", + "6425057": "GS-00653", + "6437033": "GS-00289", + "6437043": "GS-00891", + "6425181": "GS-00091", + "6425059": "GS-00092", + "6425058": "GS-00207", + "6425180": "GS-00093", + "6425178": "GS-00094", + "6425177": "GS-00095", + "6425091": "GS-00096", + "6425093": "GS-00285", + "6425062": "GS-00287", + "6425085": "GS-00286", + "6425061": "GS-00288", + "6425172": "GS-00097", + "6425068": "GS-00384", + "6425090": "GS-00775", + "6425098": "GS-00660", + "6425176": "GS-00659", + "6425167": "GS-00098", + "6425060": "GS-00113", + "6425099": "GS-00263", + "6425179": "GS-00262", + "6425092": "GS-00226", + "6425069": "GS-00089", + "6425183": "GS-00375", + "6425171": "GS-01186", + "6425182": "GS-00245", + "6437124": "GS-00090", + "6441802": "GS-01163", + "6442855": "GS-00625", + "6437035": "GS-00845", + "6437049": "GS-00283", + "6437019": "GS-00635", + "6437018": "GS-00661", + "6434789": "GS-00625", + "6444060": "GS-00656", + "6441477": "GS-00633", + "6430747": "GS-00655", + "6430716": "GS-00657", + "6437036": "GS-00627", + "6434507": "GS-00626", + "6430717": "GS-00722", + "6437032": "GS-00284", + "6425086": "GS-00888", + "6425079": "GS-00834", + "6425199": "GS-00667", + "6424860": "GS-00364", + "6424855": "GS-00363", + "6424863": "GS-00218", + "6436924": "GS-00295", + "6425035": "GS-00208", + "6425048": "GS-00206", + "6425038": "GS-00293", + "6425046": "GS-00294", + "6425041": "GS-00773", + "6425045": "GS-00219", + "6425039": "GS-00260", + "6425049": "GS-00188", + "6444331": "GS-00106", + "6436927": "GS-00685", + "6436929": "GS-00684", + "6444371": "GS-00686", + "6444372": "GS-00687", + "6434768": "GS-00683", + "6436925": "GS-00292", + "6425195": "GS-00314", + "6425194": "GS-00370", + "6425196": "GS-00246", + "6425192": "GS-00296", + "6424975": "GS-00297", + "6424974": "GS-00690", + "6424903": "GS-00135", + "6436905": "GS-00253", + "6424927": "GS-00173", + "6424878": "GS-00172", + "6424896": "GS-00174", + "6424871": "GS-00175", + "6424928": "GS-00179", + "6424877": "GS-00771", + "6424895": "GS-00176", + "6424870": "GS-00177", + "6437118": "GS-00171", + "6436899": "GS-00086", + "6429551": "GS-00256", + "6429630": "GS-00257", + "6429631": "GS-00178", + "6436896": "GS-00306", + "6436895": "GS-00163", + "6436888": "GS-00164", + "6436892": "GS-00165", + "6424922": "GS-00136", + "6424913": "GS-00134", + "6424892": "GS-00209", + "6424923": "GS-00193", + "6424901": "GS-00300", + "6424914": "GS-00298", + "6424900": "GS-00368", + "6424881": "GS-00220", + "6436889": "GS-00351", + "6436906": "GS-00258", + "6436890": "GS-00695", + "6436897": "GS-00694", + "6436893": "GS-00696", + "6426689": "GS-00432", + "6424906": "GS-00694", + "6424874": "GS-00431", + "6424883": "GS-00433", + "6436902": "GS-00305", + "6436894": "GS-00635", + "6436901": "GS-00684", + "6434787": "GS-00691", + "6444061": "GS-00705", + "6444373": "GS-00706", + "6429109": "GS-00689", + "6439449": "GS-00700", + "6429108": "GS-00745", + "6434527": "GS-00693", + "6424909": "GS-00303", + "6424867": "GS-00304", + "6436900": "GS-00302", + "6436891": "GS-00301", + "6439300": "GS-01120", + "6439136": "GS-01071", + "6424942": "GS-00872", + "6424969": "GS-00873", + "6424968": "GS-00820", + "6437052": "GS-00187", + "6424936": "GS-00210", + "6424955": "GS-00181", + "6424935": "GS-00182", + "6424938": "GS-00194", + "6424959": "GS-00265", + "6424937": "GS-00308", + "6424956": "GS-00309", + "6424953": "GS-00183", + "6424952": "GS-00184", + "6424954": "GS-00185", + "6424948": "GS-00186", + "6424949": "GS-00221", + "6437119": "GS-00180", + "6437051": "GS-00877", + "6417597": "GS-00079", + "6417955": "GS-00079", + "6417620": "GS-00078", + "6417940": "GS-00078", + "6417606": "GS-00076", + "6417599": "GS-00077", + "6424932": "GS-00708", + "6424931": "GS-00709", + "6437050": "GS-00307", + "6439578": "GS-00804", + "6424984": "GS-00310", + "6425000": "GS-00311", + "6424983": "GS-01187", + "6439032": "GS-01173", + "6434790": "GS-00691", + "6435388": "GS-01174", + "6435389": "GS-01177", + "6435391": "GS-01176", + "6430728": "GS-01177", + "6428028": "GS-01174", + "6428290": "GS-01176", + "6419876": "GS-00160", + "6419838": "GS-00242", + "6419866": "GS-00324", + "6419851": "GS-00325", + "6419862": "GS-00385", + "6419873": "GS-00373", + "6419861": "GS-00238", + "6419836": "GS-00239", + "6419872": "GS-00240", + "6419832": "GS-00241", + "6419865": "GS-00112", + "6419843": "GS-00099", + "6437121": "GS-00237", + "6419835": "GS-00326", + "6419849": "GS-00651", + "6419834": "GS-00371", + "6419858": "GS-01188", + "6436919": "GS-00243", + "6436914": "GS-00189", + "6436911": "GS-00191", + "6418391": "GS-00166", + "6418357": "GS-00110", + "6418381": "GS-00202", + "6418390": "GS-00141", + "6418389": "GS-00004", + "6418352": "GS-00005", + "6436922": "GS-00006", + "6430715": "GS-00204", + "6418351": "GS-00388", + "6418350": "GS-00386", + "6418349": "GS-00387", + "6441971": "GS-00120", + "6443278": "GS-00739", + "6443279": "GS-00740", + "6443280": "GS-00741", + "6418370": "GS-00650", + "6443281": "GS-00739", + "6443471": "GS-00740", + "6429112": "GS-00718", + "6436912": "GS-00323", + "6436908": "GS-00361", + "6436907": "GS-00377", + "6428292": "GS-00327", + "6428295": "GS-00732", + "6418626": "GS-00328", + "6418589": "GS-00329", + "6439576": "GS-00804", + "6420007": "GS-00162", + "6420008": "GS-00331", + "6420005": "GS-00332", + "6420006": "GS-00100", + "6436995": "GS-00333", + "6436996": "GS-00330", + "6419953": "GS-00195", + "6419933": "GS-00266", + "6419942": "GS-00335", + "6419922": "GS-00336", + "6419934": "GS-00248", + "6419929": "GS-00249", + "6419928": "GS-00250", + "6419914": "GS-00251", + "6419943": "GS-00261", + "6437123": "GS-00247", + "6436945": "GS-00337", + "6436941": "GS-00334", + "6418522": "GS-00761", + "6418520": "GS-00761", + "6418523": "GS-00519", + "6418515": "GS-00548", + "6436864": "GS-00277", + "6419077": "GS-00255", + "6419113": "GS-00213", + "6419102": "GS-00214", + "6419112": "GS-00212", + "6419058": "GS-00216", + "6419143": "GS-00215", + "6429627": "GS-00254", + "6419075": "GS-00272", + "6419142": "GS-00273", + "6419124": "GS-00274", + "6419101": "GS-00275", + "6419125": "GS-00366", + "6419076": "GS-00267", + "6419114": "GS-00340", + "6419091": "GS-00341", + "6419090": "GS-00140", + "6419088": "GS-00374", + "6419153": "GS-00145", + "6419059": "GS-00133", + "6419087": "GS-00225", + "6429628": "GS-00252", + "6419057": "GS-00747", + "6419141": "GS-00654", + "6429629": "GS-00276", + "6436860": "GS-00342", + "6436873": "GS-00168", + "6436859": "GS-00167", + "6436862": "GS-00169", + "6444062": "GS-00656", + "6444063": "GS-00705", + "6444271": "GS-00369", + "6436868": "GS-01173", + "6428765": "GS-00745", + "6436867": "GS-00338", + "6436876": "GS-00339", + "6419067": "GS-00653", + "6419062": "GS-00879", + "6419115": "GS-00985", + "6418958": "GS-00196", + "6418965": "GS-00268", + "6418964": "GS-00344", + "6418957": "GS-00345", + "6418963": "GS-00772", + "6436855": "GS-00346", + "6418966": "GS-00434", + "6418962": "GS-00556", + "6436853": "GS-00343", + "6436854": "GS-00685", + "6436851": "GS-00661", + "6444391": "GS-00751", + "6419273": "GS-01189", + "6419290": "GS-01190", + "6419272": "GS-01191", + "6436954": "GS-00190", + "6436949": "GS-00350", + "6436948": "GS-00192", + "6419265": "GS-00101", + "6419266": "GS-00211", + "6419269": "GS-00197", + "6419228": "GS-00269", + "6419268": "GS-00348", + "6419251": "GS-00349", + "6419289": "GS-00279", + "6419244": "GS-00280", + "6419249": "GS-00281", + "6419227": "GS-00282", + "6419250": "GS-00222", + "6419281": "GS-00352", + "6437120": "GS-00278", + "6444374": "GS-00687", + "6444375": "GS-00751", + "6436955": "GS-00347", + "6444376": "GS-00706", + "6436953": "GS-00718", + "6443283": "GS-00741", + "6425993": "GS-00367", + "6425995": "GS-00270", + "6425994": "GS-00223", + "6437093": "GS-00353", + "6426000": "GS-00438", + "6426001": "GS-00557", + "6419715": "GS-00198", + "6419696": "GS-00271", + "6419714": "GS-00356", + "6419713": "GS-00357", + "6419727": "GS-00381", + "6419721": "GS-00383", + "6419711": "GS-00224", + "6437109": "GS-00379", + "6437089": "GS-00355", + "6424331": "GS-00780", + "6418779": "GS-00362", + "6418795": "GS-00264", + "6418794": "GS-00290", + "6418785": "GS-00291", + "6418784": "GS-00217", + "6418782": "GS-00669", + "6418783": "GS-00827", + "6418791": "GS-00665", + "6418788": "GS-00666", + "6418793": "GS-01007", + "6418797": "GS-00668", + "6436932": "GS-00083", + "6418727": "GS-00629", + "6418726": "GS-00681", + "6418725": "GS-00671", + "6428022": "GS-00682", + "6418720": "GS-00628", + "6418705": "GS-00674", + "6418742": "GS-00675", + "6418741": "GS-00676", + "6418746": "GS-00677", + "6418740": "GS-00678", + "6418724": "GS-00669", + "6418723": "GS-00672", + "6418719": "GS-00680", + "6418750": "GS-00670", + "6418747": "GS-00679", + "6418756": "GS-00668", + "6437082": "GS-00673", + "6437005": "GS-00316", + "6437008": "GS-00317", + "6437007": "GS-00318", + "6437010": "GS-00315", + "6437013": "GS-00936", + "6436845": "GS-00001", + "6425979": "GS-00003", + "6436842": "GS-00516", + "6436834": "GS-00002", + "6425986": "GS-00448", + "6425987": "GS-00447", + "6425990": "GS-00467", + "6425989": "GS-00465", + "6436832": "GS-00466", + "6425991": "GS-00468", + "6425974": "GS-01194", + "6425973": "GS-01195", + "6418813": "GA-01219", + "6438334": "GS-00789", + "6438332": "GS-00788", + "6438343": "GS-00783", + "6417641": "GA-01207", + "6424565": "GA-01751", + "6424560": "GA-01752", + "6424566": "GA-01753", + "6424493": "GA-02126", + "6424490": "GA-02127", + "6424492": "GA-02128", + "6424606": "GA-02129", + "6424636": "GA-02130", + "6424635": "GA-02131", + "6424640": "GA-02132", + "6424365": "GA-02133", + "6424326": "GA-02134", + "6424386": "GA-02135", + "6418292": "GA-02136", + "6418946": "GA-02137", + "6418949": "GA-02138", + "6418948": "GA-02139", + "6437492": "GA-02140", + "6418521": "GS-00799", + "6418528": "GS-00937", + "6425970": "GS-01744", + "6425972": "GS-01746", + "6425977": "GS-01663", + "6425980": "GS-01745", + "6425981": "GS-01646", + "6425985": "GS-01747", + "6425988": "GS-00449", + "6426004": "GS-00380", + "6445139": "GS-00356", + "6445953": "GS-00925", + "6446571": "GA-01480", + "6424524": "GA-02034", + "6445957": "GS-00815", + "6419638": "GA-02147", + "6437953": "GA-02034", + "6446794": "GS-00786", + "6448119": "GS-02209", + "6424485": "GA-02111" +} \ No newline at end of file diff --git a/test/data/ims_internal_ports_sids.json b/test/data/ims_internal_ports_sids.json new file mode 100644 index 0000000000000000000000000000000000000000..e5cf78a017960be846666fa26aef500b8cf9cc80 --- /dev/null +++ b/test/data/ims_internal_ports_sids.json @@ -0,0 +1,1230 @@ +{ + "223583": "GA-01839", + "222451": "GA-01672", + "222452": "GA-01673", + "222453": "GA-01674", + "222454": "GA-01675", + "222455": "GA-01676", + "222456": "GA-01677", + "222462": "GA-01678", + "222463": "GA-01679", + "222464": "GA-01680", + "222465": "GA-01681", + "222466": "GA-01682", + "222467": "GA-01683", + "222468": "GA-01684", + "222469": "GA-01685", + "222470": "GA-01686", + "222471": "GA-01687", + "222472": "GA-01688", + "222473": "GA-01689", + "222488": "GA-01690", + "222489": "GA-01691", + "222490": "GA-01692", + "222491": "GA-01693", + "222492": "GA-01694", + "222493": "GA-01695", + "222498": "GA-01696", + "222499": "GA-01697", + "222500": "GA-01698", + "222503": "GA-01699", + "222504": "GA-01700", + "222505": "GA-01701", + "222506": "GA-01702", + "222507": "GA-01703", + "222508": "GA-01704", + "222509": "GA-01705", + "222511": "GA-01706", + "222512": "GA-01707", + "222513": "GA-01708", + "222517": "GA-01709", + "222518": "GA-01710", + "222520": "GA-01711", + "222521": "GA-01712", + "222522": "GA-01713", + "222559": "GA-01714", + "222560": "GA-01715", + "222561": "GA-01716", + "222562": "GA-01717", + "222563": "GA-01718", + "222564": "GA-01719", + "222570": "GA-01720", + "222571": "GA-01721", + "222572": "GA-01722", + "222573": "GA-01723", + "222574": "GA-01724", + "222575": "GA-01725", + "222576": "GA-01726", + "222577": "GA-01727", + "222579": "GA-01728", + "222580": "GA-01729", + "222581": "GA-01730", + "222724": "GA-01731", + "222737": "GA-01732", + "222740": "GA-01733", + "222872": "GA-01734", + "222875": "GA-01735", + "222884": "GA-01736", + "222912": "GA-01737", + "223002": "GA-01738", + "223012": "GA-01739", + "223017": "GA-01740", + "223032": "GA-01741", + "223043": "GA-01742", + "223047": "GA-01743", + "223133": "GA-01754", + "223139": "GA-01755", + "223142": "GA-01756", + "223152": "GA-01757", + "223165": "GA-01758", + "223166": "GA-01759", + "223168": "GA-01760", + "223171": "GA-01761", + "223172": "GA-01762", + "223174": "GA-01763", + "223191": "GA-01764", + "223203": "GA-01765", + "223209": "GA-01766", + "223217": "GA-01767", + "223218": "GA-01768", + "223220": "GA-01769", + "223229": "GA-01770", + "223233": "GA-01771", + "223234": "GA-01772", + "223235": "GA-01773", + "223236": "GA-01774", + "223238": "GA-01775", + "223239": "GA-01776", + "223240": "GA-01777", + "223241": "GA-01778", + "223252": "GA-01779", + "223268": "GA-01781", + "223274": "GA-01782", + "223275": "GA-01783", + "223276": "GA-01784", + "223277": "GA-01785", + "223303": "GA-01786", + "223306": "GA-01787", + "223307": "GA-01788", + "223308": "GA-01789", + "223309": "GA-01790", + "223331": "GA-01791", + "223338": "GA-01792", + "223339": "GA-01793", + "223363": "GA-01794", + "223366": "GA-01795", + "223369": "GA-01796", + "223484": "GA-01811", + "223487": "GA-01812", + "223489": "GA-01813", + "223492": "GA-01814", + "223498": "GA-01815", + "223502": "GA-01816", + "223503": "GA-01817", + "223514": "GA-01818", + "223515": "GA-01819", + "223516": "GA-01820", + "223517": "GA-01821", + "223518": "GA-01822", + "223521": "GA-01823", + "223522": "GA-01824", + "223524": "GA-01825", + "223526": "GA-01826", + "223540": "GA-01827", + "223553": "GA-01828", + "223554": "GA-01829", + "223560": "GA-01830", + "223570": "GA-01831", + "223573": "GA-01832", + "223574": "GA-01833", + "223575": "GA-01834", + "223576": "GA-01835", + "223578": "GA-01836", + "223581": "GA-01837", + "223582": "GA-01838", + "223584": "GA-01840", + "223585": "GA-01841", + "223586": "GA-01842", + "223588": "GA-01843", + "223589": "GA-01844", + "223590": "GA-01845", + "223591": "GA-01846", + "223592": "GA-01847", + "223593": "GA-01848", + "223602": "GA-01849", + "223605": "GA-01850", + "223606": "GA-01851", + "223607": "GA-01852", + "223609": "GA-01853", + "223610": "GA-01854", + "223611": "GA-01855", + "223613": "GA-01856", + "223615": "GA-01857", + "223616": "GA-01858", + "223617": "GA-01859", + "223618": "GA-01860", + "223619": "GA-01861", + "223620": "GA-01862", + "223621": "GA-01863", + "223622": "GA-01864", + "223623": "GA-01865", + "223624": "GA-01866", + "223625": "GA-01867", + "223628": "GA-01868", + "223629": "GA-01869", + "223631": "GA-01870", + "223632": "GA-01871", + "223634": "GA-01872", + "224135": "GA-01876", + "224137": "GA-01877", + "224140": "GA-01878", + "224141": "GA-01879", + "224146": "GA-01880", + "224149": "GA-01881", + "224150": "GA-01882", + "224153": "GA-01883", + "224154": "GA-01884", + "224155": "GA-01885", + "224156": "GA-01886", + "224157": "GA-01887", + "224159": "GA-01888", + "224188": "GA-01889", + "224191": "GA-01890", + "224193": "GA-01891", + "224216": "GA-01892", + "224217": "GA-01893", + "224218": "GA-01894", + "224222": "GA-01895", + "224223": "GA-01896", + "224224": "GA-01897", + "224231": "GA-01898", + "224233": "GA-01899", + "224244": "GA-01900", + "224245": "GA-01901", + "224246": "GA-01902", + "224247": "GA-01903", + "224249": "GA-01904", + "224250": "GA-01905", + "224253": "GA-01906", + "224254": "GA-01907", + "224255": "GA-01908", + "224256": "GA-01909", + "224257": "GA-01910", + "224265": "GA-01911", + "224267": "GA-01912", + "224268": "GA-01913", + "224269": "GA-01914", + "224271": "GA-01915", + "224278": "GA-01916", + "224280": "GA-01917", + "224281": "GA-01918", + "224282": "GA-01919", + "224283": "GA-01920", + "224284": "GA-01921", + "224287": "GA-01922", + "224289": "GA-01923", + "224303": "GA-01924", + "224318": "GA-01925", + "224322": "GA-01926", + "224323": "GA-01927", + "224346": "GA-01928", + "224347": "GA-01929", + "224353": "GA-01930", + "224354": "GA-01931", + "224367": "GA-01932", + "224376": "GA-01933", + "224377": "GA-01934", + "224380": "GA-01935", + "224386": "GA-01936", + "224387": "GA-T0005", + "224388": "GA-01938", + "224389": "GA-01939", + "224390": "GA-01940", + "224391": "GA-01941", + "224392": "GA-01942", + "224393": "GA-01943", + "224395": "GA-01944", + "224396": "GA-01945", + "224397": "GA-01946", + "224398": "GA-01947", + "224400": "GA-01948", + "224401": "GA-01949", + "224402": "GA-01950", + "224403": "GA-01951", + "224404": "GA-01952", + "224405": "GA-01953", + "224406": "GA-01954", + "224407": "GA-01955", + "224408": "GA-01956", + "224409": "GA-01957", + "224410": "GA-01958", + "224412": "GA-01959", + "224414": "GA-01960", + "224415": "GA-01961", + "224419": "GA-01962", + "224420": "GA-01963", + "224715": "GA-01964", + "224728": "GA-01965", + "224741": "GA-01966", + "224754": "GA-01967", + "225434": "GA-01968", + "227442": "GA-01969", + "227471": "GA-01970", + "227535": "GA-01971", + "227551": "GS-01094", + "227552": "GS-01093", + "227553": "GS-01096", + "227554": "GS-01097", + "227555": "GS-01098", + "227571": "GS-01099", + "227576": "GS-01100", + "227577": "GS-01103", + "227579": "GS-01105", + "227580": "GS-01106", + "227581": "GS-01107", + "227582": "GS-01111", + "227583": "GS-01109", + "227584": "GS-01110", + "227585": "GS-01112", + "227586": "GS-01114", + "227587": "GS-01115", + "227589": "GS-01117", + "227590": "GS-01118", + "227592": "GS-01119", + "227593": "GS-01121", + "227651": "GA-01994", + "227652": "GA-01995", + "227657": "GA-01996", + "227951": "GA-01997", + "228191": "GS-01108", + "228211": "GA-02000", + "228251": "GA-02001", + "228253": "GA-02002", + "228291": "GA-02003", + "228632": "GA-02004", + "228691": "GA-02005", + "229176": "GA-02006", + "229177": "GA-02007", + "229178": "GA-02008", + "229371": "GA-02009", + "229374": "GA-02010", + "229491": "GA-02011", + "223671": "GS-00560", + "223672": "GS-00441", + "223673": "GS-01000", + "223680": "GS-00426", + "223681": "GS-00552", + "223709": "GS-00480", + "223730": "GS-00469", + "223732": "GS-00074", + "223733": "GS-00824", + "223734": "GS-00547", + "223735": "GS-00911", + "223739": "GS-00371", + "223751": "GS-00462", + "223752": "GS-01005", + "223753": "GS-00825", + "223754": "GS-00570", + "223761": "GS-00497", + "223762": "GS-00540", + "223763": "GS-00428", + "223764": "GS-00554", + "223765": "GS-00551", + "223766": "GS-00423", + "223767": "GS-00424", + "223779": "GS-00499", + "223780": "GS-00582", + "223783": "GS-00614", + "223784": "GS-00949", + "223791": "GS-00459", + "223792": "GS-01003", + "223794": "GS-00527", + "223800": "GS-00435", + "223807": "GS-00471", + "223808": "GS-00530", + "223857": "GS-00495", + "223858": "GS-00844", + "223859": "GS-01055", + "223860": "GS-00494", + "223862": "GS-00539", + "223866": "GS-01058", + "223867": "GS-00505", + "223868": "GS-00503", + "223869": "GS-00583", + "223873": "GS-00515", + "223875": "GS-00590", + "223878": "GS-00853", + "223879": "GS-00854", + "223880": "GS-00884", + "223882": "GS-00831", + "223883": "GS-00823", + "223884": "GS-00847", + "223886": "GS-00881", + "223887": "GS-00882", + "223888": "GS-00885", + "223889": "GS-00878", + "223890": "GS-00809", + "223891": "GS-00886", + "223892": "GS-00859", + "223906": "GS-00456", + "223908": "GS-00883", + "223914": "GS-00508", + "223915": "GS-00586", + "223917": "GS-00075", + "223923": "GS-00109", + "223927": "GS-00085", + "223928": "GS-00864", + "223929": "GS-00313", + "223930": "GS-00354", + "223931": "GS-00865", + "223935": "GS-00813", + "223936": "GS-00563", + "223937": "GS-00444", + "223945": "GS-00479", + "223946": "GS-00832", + "223949": "GS-00574", + "223953": "GS-00513", + "223954": "GS-00588", + "223961": "GS-00904", + "223962": "GS-00805", + "223965": "GS-00912", + "223967": "GS-00867", + "223968": "GS-00924", + "223971": "GS-00436", + "223982": "GS-00477", + "223983": "GS-00532", + "223985": "GS-00910", + "223987": "GS-00199", + "224001": "GS-00427", + "224002": "GS-00553", + "224003": "GS-00440", + "224004": "GS-00559", + "224006": "GS-00422", + "224007": "GS-00550", + "224010": "GS-00490", + "224011": "GS-00537", + "224012": "GS-00482", + "224013": "GS-00576", + "224422": "GS-00509", + "224423": "GS-00857", + "224424": "GS-00544", + "224431": "GS-00452", + "224432": "GS-00816", + "224433": "GS-01001", + "224435": "GS-00566", + "224438": "GS-00947", + "224440": "GS-00875", + "224441": "GS-00565", + "224442": "GS-00088", + "224443": "GS-00087", + "224444": "GS-00429", + "224445": "GS-00430", + "224447": "GS-00507", + "224448": "GS-00585", + "224453": "GS-00478", + "224457": "GS-00470", + "224463": "GS-00518", + "224464": "GS-00592", + "224468": "GS-00073", + "224475": "GS-00108", + "224478": "GS-00533", + "224483": "GS-00084", + "224484": "GS-00861", + "224485": "GS-00312", + "224486": "GS-00299", + "224487": "GS-00862", + "224491": "GS-00811", + "224495": "GS-00855", + "224496": "GS-00856", + "224497": "GS-00463", + "224498": "GS-01006", + "224500": "GS-00826", + "224502": "GS-00571", + "224507": "GS-00506", + "224508": "GS-00504", + "224509": "GS-01059", + "224513": "GS-00562", + "224516": "GS-00946", + "224525": "GS-00442", + "224528": "GS-00474", + "224529": "GS-01009", + "224530": "GS-00573", + "224540": "GS-00453", + "224541": "GS-00817", + "224542": "GS-01002", + "224543": "GS-00567", + "224546": "GS-00493", + "224547": "GS-01054", + "224548": "GS-00843", + "224549": "GS-01056", + "224550": "GS-00496", + "224551": "GS-00580", + "224558": "GS-00481", + "224559": "GS-00575", + "224561": "GS-01010", + "224562": "GS-00517", + "224563": "GS-00591", + "224564": "GS-00564", + "224565": "GS-00445", + "224566": "GS-00491", + "224567": "GS-00538", + "224568": "GS-00425", + "224569": "GS-00997", + "224570": "GS-00522", + "224572": "GS-00956", + "224582": "GS-00955", + "224583": "GS-00437", + "224584": "GS-00998", + "224585": "GS-00524", + "224592": "GS-00512", + "224593": "GS-00837", + "224594": "GS-00860", + "224599": "GS-00587", + "224600": "GS-00622", + "224601": "GS-00897", + "224604": "GS-00896", + "224605": "GS-00836", + "224606": "GS-00902", + "224612": "GS-00901", + "224613": "GS-00840", + "224631": "GS-00473", + "224633": "GS-01008", + "224634": "GS-00572", + "224644": "GS-00472", + "224645": "GS-00531", + "224647": "GS-00451", + "224648": "GS-00526", + "224773": "GS-00489", + "224774": "GS-00536", + "224775": "GS-00814", + "224776": "GS-00876", + "224833": "GS-00523", + "224836": "GS-00808", + "225059": "GS-00863", + "225062": "GS-00866", + "225068": "GS-00807", + "225097": "GS-00475", + "225132": "GS-00584", + "225133": "GS-00874", + "225171": "GS-00833", + "225291": "GS-00201", + "225292": "GS-00205", + "225471": "GS-00118", + "225472": "GS-00153", + "225491": "GS-00510", + "225492": "GS-00858", + "225493": "GS-00545", + "225611": "GS-00443", + "225612": "GS-00561", + "225613": "GS-00599", + "225631": "GS-00812", + "225705": "GS-00203", + "225708": "GS-00450", + "225709": "GS-00525", + "225731": "GS-00514", + "225734": "GS-00589", + "225740": "GS-00124", + "225741": "GS-00157", + "225742": "GS-00121", + "225743": "GS-00154", + "226338": "GS-00455", + "226339": "GS-00819", + "226340": "GS-00569", + "226772": "GS-00123", + "226773": "GS-00156", + "227042": "GS-01070", + "227064": "GS-01072", + "227067": "GS-01064", + "227078": "GS-00461", + "227127": "GS-01062", + "227129": "GS-01061", + "227165": "GS-01060", + "227303": "GS-01095", + "227337": "GS-00941", + "227472": "GS-00830", + "227475": "GS-00922", + "227478": "GS-00919", + "227480": "GS-00822", + "227493": "GS-00914", + "227494": "GS-00918", + "227540": "GS-01063", + "227952": "GS-00439", + "227953": "GS-00999", + "227955": "GS-00558", + "228113": "GS-01012", + "228114": "GS-01013", + "228115": "GS-01014", + "228118": "GS-01015", + "228119": "GS-01052", + "228121": "GS-01051", + "228124": "GS-01050", + "228125": "GS-01016", + "228126": "GS-01049", + "228128": "GS-01047", + "228129": "GS-01048", + "228131": "GS-01046", + "228132": "GS-01019", + "228133": "GS-01020", + "228134": "GS-01045", + "228135": "GS-01021", + "228136": "GS-01044", + "228137": "GS-01022", + "228141": "GS-01042", + "228142": "GS-01043", + "228143": "GS-01023", + "228144": "GS-01024", + "228145": "GS-01040", + "228146": "GS-01041", + "228147": "GS-01025", + "228148": "GS-01028", + "228149": "GS-01039", + "228151": "GS-01036", + "228153": "GS-01037", + "228154": "GS-01035", + "228155": "GS-01034", + "228156": "GS-01033", + "228157": "GS-01032", + "228158": "GS-01029", + "228159": "GS-01030", + "228160": "GS-01031", + "228161": "GS-01017", + "228163": "GS-01026", + "228164": "GS-01027", + "228271": "GS-00555", + "228631": "GS-00903", + "228633": "GS-00850", + "228692": "GS-00921", + "228694": "GS-00828", + "228695": "GS-00829", + "229173": "GS-00868", + "229174": "GS-00869", + "229232": "GS-01066", + "229311": "GS-01067", + "229471": "GS-00927", + "228181": "GS-00117", + "228215": "GS-00126", + "229382": "GS-00114", + "228180": "GS-00151", + "228214": "GS-00159", + "229381": "GS-00149", + "228545": "GS-00848", + "228514": "GS-00115", + "228515": "GS-00147", + "228680": "GS-00119", + "227406": "GS-01086", + "227400": "GS-01080", + "227405": "GS-01085", + "227403": "GS-01083", + "227397": "GS-01076", + "227401": "GS-01081", + "227410": "GS-01087", + "227412": "GS-01089", + "227398": "GS-01078", + "227399": "GS-01079", + "228711": "GS-01090", + "227404": "GS-01084", + "227411": "GS-01088", + "227392": "GS-01073", + "227396": "GS-01077", + "227402": "GS-01082", + "227395": "GS-01075", + "226804": "GS-01074", + "226410": "GS-00950", + "226530": "GS-00951", + "226430": "GS-00952", + "226435": "GS-00953", + "226576": "GS-00954", + "224291": "GA-02013", + "229531": "GA-02014", + "228342": "GA-02015", + "228731": "GA-02016", + "228343": "GA-02017", + "228344": "GA-02018", + "226660": "GA-02019", + "226661": "GA-02020", + "226668": "GA-02021", + "226669": "GA-02022", + "228356": "GA-02023", + "228712": "GA-02024", + "228358": "GA-02025", + "228357": "GA-02026", + "227443": "GA-02027", + "227371": "GA-02028", + "227336": "GA-02029", + "226691": "GA-02030", + "226698": "GA-02031", + "226699": "GA-02032", + "227317": "GA-02033", + "227312": "GA-02034", + "229377": "GA-02035", + "227311": "GA-02036", + "228371": "GA-02037", + "228732": "GA-02038", + "228452": "GA-02039", + "228370": "GA-02040", + "226676": "GA-02041", + "229252": "GA-02042", + "226685": "GA-02043", + "226677": "GA-02044", + "228382": "GA-02045", + "228713": "GA-02046", + "228381": "GA-02047", + "228380": "GA-02048", + "226706": "GA-02049", + "227232": "GA-02050", + "226715": "GA-02051", + "225228": "GA-02052", + "225232": "GA-02053", + "225235": "GA-02054", + "225229": "GA-02055", + "227431": "GA-02056", + "228421": "GA-02057", + "228422": "GA-02058", + "227973": "GA-02059", + "227429": "GA-02060", + "227597": "GA-02061", + "227426": "GA-02062", + "227454": "GA-02063", + "228423": "GA-02064", + "228424": "GA-02065", + "228033": "GA-02066", + "228714": "GS-00871", + "228718": "GS-00870", + "226621": "GS-00818", + "228715": "GS-00594", + "228719": "GS-00593", + "228243": "GS-00577", + "226622": "GS-00568", + "228736": "GS-00543", + "228733": "GS-00542", + "229255": "GS-00535", + "229257": "GS-00534", + "228717": "GS-00521", + "228721": "GS-00520", + "228738": "GS-00502", + "228735": "GS-00501", + "229253": "GS-00487", + "229254": "GS-00486", + "226620": "GS-00454", + "228363": "GS-00152", + "228351": "GS-00150", + "229091": "GS-00132", + "228365": "GS-00131", + "229092": "GS-00128", + "228347": "GS-00127", + "229493": "GS-00601", + "226363": "GS-00604", + "229571": "GS-01192", + "229512": "GS-01193", + "228179": "GA-02067", + "228213": "GA-02068", + "229380": "GA-02069", + "227604": "GA-02070", + "229251": "GA-02071", + "228120": "GA-02072", + "228231": "GA-02073", + "228052": "GA-02074", + "228533": "GA-02075", + "228513": "GA-02076", + "227605": "GA-02077", + "229554": "GA-02078", + "228451": "GA-02079", + "229552": "GA-02080", + "229331": "GA-02081", + "223580": "GA-02082", + "229555": "GA-02083", + "228453": "GA-02084", + "228192": "GA-02085", + "229553": "GA-02086", + "227608": "GA-02087", + "224148": "GA-02088", + "224147": "GA-02089", + "225421": "GA-02090", + "226496": "GS-00007", + "226497": "GS-00938", + "225832": "GS-01130", + "229341": "GS-01134", + "227444": "GS-01138", + "225516": "GS-01132", + "225538": "GS-01133", + "225654": "GS-01136", + "225772": "GS-01137", + "225851": "GS-01131", + "225871": "GS-01139", + "224590": "GS-00638", + "224591": "GS-00629", + "229119": "GS-00645", + "229117": "GS-00663", + "229116": "GS-00632", + "229115": "GS-00958", + "229114": "GS-00662", + "229113": "GS-00644", + "225053": "GS-00639", + "225054": "GS-00658", + "225571": "GS-00626", + "224603": "GS-00643", + "224607": "GS-00646", + "224608": "GS-00647", + "224614": "GS-00650", + "224615": "GS-00651", + "224616": "GS-00957", + "224617": "GS-00649", + "224618": "GS-00648", + "224619": "GS-00640", + "225052": "GS-00637", + "225497": "GS-01143", + "225532": "GS-01159", + "225572": "GS-01156", + "225533": "GS-01133", + "225594": "GS-01162", + "225652": "GS-01136", + "225833": "GS-01130", + "225771": "GS-01137", + "225793": "GS-02151", + "225452": "GS-01144", + "225852": "GS-01131", + "225872": "GS-01139", + "226634": "GS-01147", + "226816": "GS-01148", + "227437": "GS-01138", + "228591": "GS-01160", + "229340": "GS-01134", + "225477": "GS-01166", + "225515": "GS-01158", + "225534": "GS-01157", + "225478": "GS-01167", + "225552": "GS-01155", + "225512": "GS-01132", + "226510": "GS-00010", + "226508": "GS-00008", + "226494": "GS-00009", + "226495": "GS-00011", + "226603": "GS-00013", + "226602": "GS-00015", + "224649": "GS-00667", + "228341": "GS-00022", + "226553": "GS-00021", + "226557": "GS-00024", + "227653": "GS-00023", + "226389": "GS-00018", + "226396": "GS-00027", + "225706": "GS-00683", + "226393": "GS-00068", + "226397": "GS-00065", + "226392": "GS-00025", + "226391": "GS-00026", + "226388": "GS-00021", + "226408": "GS-00030", + "225311": "GS-00689", + "224632": "GS-00632", + "229353": "GS-00630", + "225751": "GS-00631", + "229181": "GS-00031", + "226446": "GS-00030", + "228554": "GS-00633", + "229180": "GS-00032", + "224436": "GS-00703", + "229154": "GS-00634", + "227572": "GS-00692", + "226362": "GS-00934", + "224446": "GS-00696", + "225093": "GS-00704", + "224449": "GS-00699", + "225592": "GS-00698", + "228401": "GS-00702", + "228531": "GS-00701", + "226359": "GS-00034", + "226346": "GS-00932", + "224456": "GS-00449", + "224458": "GS-00695", + "226364": "GS-00069", + "226347": "GS-T0008", + "226370": "GS-00036", + "224469": "GS-00084", + "224470": "GS-00861", + "224471": "GS-00312", + "224472": "GS-00299", + "224473": "GS-00862", + "224474": "GS-00770", + "225064": "GS-00866", + "225332": "GS-00200", + "226360": "GS-00066", + "226348": "GS-00603", + "226351": "GS-00933", + "226361": "GS-00605", + "226344": "GS-00035", + "226345": "GS-00009", + "226352": "GS-00033", + "227654": "GS-00023", + "224492": "GS-00699", + "225591": "GS-00698", + "225714": "GS-01140", + "224499": "GS-00708", + "224501": "GS-00709", + "226818": "GS-01146", + "226635": "GS-01145", + "224506": "GS-00670", + "224510": "GS-00636", + "225067": "GS-00713", + "224511": "GS-00723", + "225066": "GS-00637", + "228701": "GS-00716", + "228700": "GS-00710", + "225794": "GS-01140", + "228842": "GS-00717", + "228846": "GS-00671", + "225733": "GS-00712", + "228834": "GS-00639", + "225735": "GS-00715", + "227615": "GS-00700", + "225736": "GS-00638", + "225738": "GS-00711", + "225739": "GS-00714", + "226521": "GS-00034", + "226511": "GS-00040", + "226513": "GS-00039", + "226512": "GS-00037", + "226524": "GS-00038", + "226608": "GS-00035", + "226610": "GS-00010", + "224544": "GS-00640", + "229175": "GS-00719", + "225511": "GS-01152", + "225539": "GS-01151", + "225556": "GS-01149", + "225557": "GS-01159", + "225574": "GS-01150", + "225596": "GS-01154", + "228593": "GS-01161", + "226609": "GS-00041", + "226548": "GS-00047", + "223947": "GS-00690", + "223948": "GS-00712", + "223951": "GS-00730", + "223952": "GS-00734", + "223956": "GS-00977", + "223958": "GS-00957", + "223959": "GS-00958", + "223960": "GS-00721", + "225206": "GS-00960", + "223963": "GS-00975", + "223964": "GS-00976", + "223966": "GS-00724", + "223969": "GS-00986", + "226527": "GS-00943", + "225831": "GS-01122", + "223972": "GS-01123", + "225873": "GS-01129", + "227440": "GS-01128", + "223974": "GS-01135", + "225517": "GS-01124", + "225541": "GS-01125", + "225651": "GS-01126", + "225773": "GS-01127", + "226531": "GS-00928", + "226540": "GS-00931", + "223986": "GS-00982", + "225151": "GS-00979", + "225707": "GS-00731", + "223988": "GS-00984", + "226539": "GS-00624", + "226528": "GS-00906", + "227484": "GS-00982", + "227476": "GS-00985", + "227495": "GS-00727", + "227492": "GS-00646", + "227483": "GS-00962", + "227474": "GS-00971", + "227473": "GS-00723", + "227481": "GS-00736", + "227477": "GS-00711", + "227482": "GS-00729", + "227485": "GS-00647", + "227479": "GS-00732", + "229151": "GS-00728", + "226536": "GS-00020", + "226542": "GS-00032", + "226535": "GS-00052", + "226534": "GS-00012", + "226526": "GS-00011", + "223714": "GS-00918", + "223715": "GS-00922", + "223731": "GS-00652", + "229179": "GS-00031", + "226371": "GS-00053", + "226373": "GS-00052", + "226334": "GS-00049", + "226328": "GS-00055", + "225481": "GS-01165", + "225482": "GS-01166", + "228532": "GS-00701", + "226329": "GS-00037", + "228252": "GS-00048", + "229375": "GS-00054", + "224117": "GS-00735", + "226819": "GS-01148", + "226631": "GS-01147", + "226424": "GS-00935", + "226433": "GS-00014", + "228112": "GS-01011", + "226432": "GS-00056", + "226421": "GS-00051", + "226423": "GS-00039", + "226429": "GS-00057", + "225056": "GS-00717", + "225057": "GS-00750", + "225475": "GS-00657", + "225704": "GS-00776", + "223870": "GS-00738", + "223871": "GS-00736", + "225096": "GS-00704", + "227616": "GS-00774", + "228849": "GS-00682", + "228838": "GS-00658", + "228844": "GS-00750", + "223876": "GS-00748", + "223877": "GS-00746", + "223881": "GS-00681", + "228702": "GS-00716", + "225495": "GS-00655", + "223885": "GS-00959", + "225392": "GS-00749", + "223893": "GS-00628", + "223894": "GS-00660", + "223895": "GS-00659", + "226311": "GS-00627", + "223896": "GS-00636", + "223897": "GS-00703", + "223898": "GS-00713", + "223899": "GS-00737", + "223900": "GS-00715", + "223904": "GS-00987", + "223907": "GS-00748", + "223909": "GS-00680", + "223910": "GS-00714", + "223911": "GS-00747", + "225391": "GS-00749", + "223913": "GS-00987", + "226308": "GS-00055", + "223918": "GS-00085", + "223919": "GS-00864", + "223920": "GS-00313", + "223921": "GS-00354", + "223922": "GS-00865", + "225061": "GS-00863", + "225331": "GS-00203", + "227453": "GS-00016", + "226309": "GS-00053", + "226310": "GS-00040", + "226307": "GS-00036", + "228404": "GS-00777", + "223861": "GS-00986", + "227658": "GS-00046", + "226302": "GS-00058", + "226304": "GS-00043", + "225671": "GS-00446", + "226445": "GS-00059", + "226434": "GS-00033", + "226595": "GS-00063", + "226599": "GS-00024", + "226574": "GS-00015", + "226572": "GS-00064", + "226577": "GS-00929", + "226566": "GS-00930", + "226578": "GS-00945", + "226587": "GS-00059", + "226568": "GS-00070", + "226567": "GS-00597", + "226571": "GS-00926", + "226570": "GS-00067", + "226569": "GS-00058", + "226575": "GS-00019", + "226565": "GS-00063", + "226579": "GS-00057", + "226573": "GS-00026", + "226546": "GS-00013", + "228696": "GS-00828", + "226547": "GS-00014", + "226399": "GS-00018", + "226401": "GS-00082", + "226400": "GS-00019", + "226560": "GS-00020", + "226561": "GS-00008", + "226487": "GS-00049", + "226483": "GS-00047", + "225455": "GS-01142", + "225496": "GS-01141", + "228704": "GS-00710", + "226636": "GS-00050", + "228254": "GS-00048", + "226456": "GS-00025", + "226454": "GS-00051", + "228406": "GS-00942", + "226489": "GS-00064", + "226492": "GS-00027", + "224763": "GS-00107", + "227606": "GS-00116", + "227607": "GS-00148", + "227656": "GS-00017", + "227660": "GS-00016", + "228352": "GS-00028", + "228348": "GS-00022", + "226728": "GS-00042", + "226727": "GS-00044", + "228364": "GS-00045", + "228361": "GS-00046", + "227450": "GS-00125", + "227451": "GS-00158", + "228123": "GS-00460", + "228871": "GS-01104", + "228212": "GS-01004", + "228795": "GS-01144", + "228796": "GS-01143", + "228122": "GS-00528", + "227449": "GS-00017", + "227448": "GS-00050", + "226734": "GS-00060", + "228334": "GS-00663", + "228239": "GS-00752", + "228245": "GS-00662", + "228247": "GS-00484", + "228242": "GS-00483", + "226737": "GS-00044", + "226336": "GS-00061", + "226337": "GS-00062", + "227433": "GS-00007", + "227313": "GS-01141", + "227314": "GS-01153", + "227315": "GS-01150", + "227316": "GS-01125", + "227325": "GS-01154", + "227324": "GS-01126", + "227321": "GS-01122", + "227329": "GS-01127", + "227319": "GS-02151", + "227332": "GS-01142", + "227326": "GS-01123", + "227318": "GS-01129", + "227327": "GS-01145", + "227320": "GS-01146", + "227434": "GS-01128", + "228592": "GS-01161", + "229338": "GS-01135", + "227323": "GS-01164", + "227334": "GS-01152", + "227322": "GS-01151", + "227333": "GS-01165", + "227331": "GS-01149", + "227330": "GS-01124", + "227435": "GS-00012", + "228377": "GS-00028", + "228375": "GS-00029", + "226732": "GS-00042", + "226731": "GS-00043", + "228385": "GS-00045", + "228387": "GS-00029", + "226719": "GS-00060", + "228054": "GS-00578", + "228055": "GS-00485", + "227262": "GS-00061", + "226626": "GS-00062", + "227537": "GS-00752", + "226624": "GS-00041", + "229594": "GA-02141", + "229591": "GA-02142", + "229791": "GA-02143", + "229853": "GA-01886", + "229895": "GA-02145", + "229782": "GA-02146", + "229781": "GA-01780", + "229783": "GA-02148", + "229633": "GS-00790", + "229634": "GS-00791", + "229642": "GS-01113", + "229643": "GS-01168", + "229641": "GS-01169", + "229651": "GS-01178", + "229592": "GS-01182", + "229792": "GS-01183", + "229931": "GS-02118", + "229639": "GS-02124", + "229640": "GS-02125", + "229796": "GS-T0002", + "229795": "GS-T0003", + "229869": "GS-01185", + "229854": "GS-01185", + "229973": "GS-00519", + "229974": "GS-00548", + "224588": "GS-02150", + "230036": "GS-02150", + "224609": "GS-02151", + "229951": "GA-02157", + "230095": "GS-00733", + "229993": "GA-01800", + "230004": "GS-00498", + "230001": "GS-00581", + "230151": "GA-01970", + "230017": "GS-00511", + "229957": "GS-00546", + "230179": "GS-02161", + "230173": "GS-02161", + "230174": "GS-02152", + "230175": "GS-02152", + "230211": "GS-02162", + "230116": "GA-01804", + "230117": "GS-00038", + "230111": "GA-01878", + "230233": "GS-T0012", + "230234": "GS-T0012", + "229868": "GS-01184", + "229871": "GA-01777", + "230293": "GS-00903", + "230297": "GS-00848", + "230311": "GS-00850", + "223976": "GS-02170", + "230294": "GS-02170", + "230296": "GS-02169", + "230295": "GS-02169", + "229644": "GS-01180", + "230271": "GA-02181", + "230272": "GS-02180", + "230339": "GS-02176", + "230337": "GS-02176", + "230231": "GA-T0010", + "230232": "GA-T0011", + "230398": "GS-02175", + "230397": "GS-02175", + "230399": "GS-02174", + "230400": "GS-02174", + "230434": "GA-02114", + "230455": "GS-00070", + "230433": "GA-02163", + "230432": "GA-02154", + "230451": "GS-02164", + "230452": "GS-02165", + "230435": "GS-02153", + "230107": "GS-02183", + "230493": "GS-02183", + "230514": "GS-02200", + "230515": "GS-02200", + "230513": "GS-02201", + "230516": "GS-02201", + "229856": "GA-01777", + "230093": "GS-00677", + "230100": "GS-00678", + "229972": "GA-01344", + "230334": "GA-02179", + "230338": "GS-02180", + "230114": "GA-02144", + "230115": "GS-02203", + "230118": "GS-02203", + "230113": "GA-02204", + "229855": "GA-02171", + "230053": "GA-02205", + "230054": "GA-02206", + "230112": "GA-02207", + "229857": "GA-01776", + "230671": "GS-02207", + "230672": "GS-02207", + "230720": "GS-02209" +} \ No newline at end of file diff --git a/test/test_ims_data.py b/test/test_ims_data.py index 2a12e0dbb09163b22e805ac2cac7b56111c825ea..a84590d621bcf6272da510c979cc8634aead6c8a 100644 --- a/test/test_ims_data.py +++ b/test/test_ims_data.py @@ -74,10 +74,31 @@ def test_get_port_details(mocker): side_effect=_se ) + def _ports(type): + def func(*args, **kwargs): + _data = _json_test_data(f'ims_{type}_ports_sids.json') + + return {int(k): v for k, v in _data.items()} + return func + + _external = mocker.patch.object( + inventory_provider.db.ims_data, + 'get_port_sids', + side_effect=_ports('external') + ) + + _internal = mocker.patch.object( + inventory_provider.db.ims_data, + 'get_internal_port_sids', + side_effect=_ports('internal') + ) + ds = inventory_provider.db.ims.IMS( 'dummy_base', 'dummy_username', 'dummy_password') res = list(get_port_details(ds)) assert ds.get_all_entities.call_count == 2 + assert _external.call_count == 1 + assert _internal.call_count == 1 predicted = [ { @@ -98,17 +119,20 @@ def test_get_port_details(mocker): { 'port_id': 222451, 'equipment_name': 'QFX.FRA.DE', - 'interface_name': 'AE0' + 'interface_name': 'AE0', + 'sid': 'GA-01672' }, { 'port_id': 222452, 'equipment_name': 'QFX.FRA.DE', - 'interface_name': 'AE1' + 'interface_name': 'AE1', + 'sid': 'GA-01673' }, { 'port_id': 225742, 'equipment_name': 'MX1.MAD.ES', - 'interface_name': 'AE3.103' + 'interface_name': 'AE3.103', + 'sid': 'GS-00121' } ] assert res == predicted diff --git a/test/test_msr_routes.py b/test/test_msr_routes.py index 25bd97f80e88357c737a49998c2312b0858128e1..157dfd28fed90345d5cc5083c08bc016bcfae24c 100644 --- a/test/test_msr_routes.py +++ b/test/test_msr_routes.py @@ -1,3 +1,4 @@ +import ipaddress import json import jsonschema @@ -6,7 +7,8 @@ import pytest from inventory_provider.routes.msr import PEERING_LIST_SCHEMA, \ PEERING_GROUP_LIST_SCHEMA, PEERING_ADDRESS_SERVICES_LIST, \ SYSTEM_CORRELATION_SERVICES_LIST_SCHEMA, _get_services_for_address, \ - MDVPN_LIST_SCHEMA, VPN_PROXY_LIST_SCHEMA, ASN_PEER_LIST_SCHEMA + MDVPN_LIST_SCHEMA, VPN_PROXY_LIST_SCHEMA, ASN_PEER_LIST_SCHEMA, \ + IP_SERVICES_LIST_SCHEMA, _dedupe from inventory_provider.routes.poller import SERVICES_LIST_SCHEMA from inventory_provider.tasks.common import _get_redis @@ -391,3 +393,42 @@ def test_get_asn_peers_post(endpoint_variant, post_body, client, mocked_redis): response_data = json.loads(rv.data.decode('utf-8')) jsonschema.validate(response_data, ASN_PEER_LIST_SCHEMA) assert response_data # test data is non-empty + + +def test_dedupe(): + data = [ + {'a': 1, 'b': {'a': 1, 'b': 2}, 'c': 3}, + {'a': 1, 'b': {'a': 1, 'b': 2}, 'c': 3, 'd': 4}, + {'a': 1, 'b': {'a': 1, 'b': 2}, 'c': 3}, + {'a': 1, 'b': {'a': 1, 'b': 2}, 'c': 3}, + ] + result = list(_dedupe(data)) + assert len(result) == 2 + + +def test_ip_services(client): + + rv = client.get( + '/msr/ip-services', + headers=DEFAULT_REQUEST_HEADERS) + assert rv.status_code == 200 + assert rv.is_json + response_data = json.loads(rv.data.decode('utf-8')) + jsonschema.validate(response_data, IP_SERVICES_LIST_SCHEMA) + + # sanity that there are some non-trivial elements in test data + assert any(len(_x['peerings']) > 0 for _x in response_data) + assert any(len(_x['services']) > 0 for _x in response_data) + + # sanity confirmation that peerings are with the correct host + for _s in response_data: + net = ipaddress.ip_interface(_s['address']).network + for _p in _s['peerings']: + assert ipaddress.ip_address(_p['address']) in net + + # sanity confirmation that no interface addresses are duplicated + ifc_keys = set() + for _s in response_data: + key = f'{_s["hostname"]}:{_s["port"]}:{_s["address"]}' + assert key not in ifc_keys + ifc_keys.add(key) diff --git a/tox.ini b/tox.ini index eb2bec7d2f9b8ba10ead57bbc9cf2591a675e095..564dca2a3096faae4be0ab29bf09d6123251de43 100644 --- a/tox.ini +++ b/tox.ini @@ -2,7 +2,7 @@ envlist = py36 [flake8] -exclude = venv,.tox +exclude = venv,.tox,build [testenv] passenv = TEST_OPSDB_HOSTNAME TEST_OPSDB_DBNAME TEST_OPSDB_USERNAME TEST_OPSDB_PASSWORD