Skip to content
Snippets Groups Projects
Commit 3f12be69 authored by Robert Latta's avatar Robert Latta
Browse files

implemented msr/services endpoint

parent e78369b1
No related branches found
No related tags found
No related merge requests found
...@@ -77,6 +77,8 @@ import ipaddress ...@@ -77,6 +77,8 @@ import ipaddress
import logging import logging
import re import re
import threading import threading
from collections import defaultdict
from typing import Dict
from flask import Blueprint, Response, request, current_app from flask import Blueprint, Response, request, current_app
import jsonschema import jsonschema
...@@ -84,7 +86,8 @@ import jsonschema ...@@ -84,7 +86,8 @@ import jsonschema
from inventory_provider.routes import common from inventory_provider.routes import common
from inventory_provider.routes.classifier import \ from inventory_provider.routes.classifier import \
get_ims_equipment_name, get_ims_interface, get_interface_services_and_loc get_ims_equipment_name, get_ims_interface, get_interface_services_and_loc
from inventory_provider.routes.common import _ignore_cache_or_retrieve from inventory_provider.routes.common import _ignore_cache_or_retrieve, \
ims_equipment_to_hostname
from inventory_provider.routes.poller import get_services from inventory_provider.routes.poller import get_services
from inventory_provider.tasks import common as tasks_common from inventory_provider.tasks import common as tasks_common
...@@ -199,7 +202,7 @@ SYSTEM_CORRELATION_SERVICES_LIST_SCHEMA = { ...@@ -199,7 +202,7 @@ SYSTEM_CORRELATION_SERVICES_LIST_SCHEMA = {
'additionalProperties': False 'additionalProperties': False
} }
}, },
'required': ['hostname', 'interface', 'addresses'], 'required': ['hostname', 'interface'],
'additionalProperties': False 'additionalProperties': False
}, },
'optical-endpoint': { 'optical-endpoint': {
...@@ -211,23 +214,16 @@ SYSTEM_CORRELATION_SERVICES_LIST_SCHEMA = { ...@@ -211,23 +214,16 @@ SYSTEM_CORRELATION_SERVICES_LIST_SCHEMA = {
'required': ['equipment', 'port'], 'required': ['equipment', 'port'],
'additionalProperties': False 'additionalProperties': False
}, },
'ip-endpoints': { 'endpoints': {
'type': 'array',
'items': {'$ref': '#/definitions/ip-endpoint'},
'minItems': 1
},
'optical-endpoints': {
'type': 'array', 'type': 'array',
'items': {'$ref': '#/definitions/optical-endpoint'}, 'items': {
'oneOf': [
{'$ref': '#/definitions/ip-endpoint'},
{'$ref': '#/definitions/optical-endpoint'}
]
},
'minItems': 1 'minItems': 1
}, },
'endpoints': {
'oneOf': [
{'$ref': '#/definitions/ip-endpoints'},
{'$ref': '#/definitions/optical-endpoints'}
]
},
'service': { 'service': {
'type': 'object', 'type': 'object',
'properties': { 'properties': {
...@@ -248,7 +244,6 @@ SYSTEM_CORRELATION_SERVICES_LIST_SCHEMA = { ...@@ -248,7 +244,6 @@ SYSTEM_CORRELATION_SERVICES_LIST_SCHEMA = {
'additionalProperties': False 'additionalProperties': False
} }
}, },
'type': 'array', 'type': 'array',
'items': {'$ref': '#/definitions/service'}, 'items': {'$ref': '#/definitions/service'},
'minItems': 1 # otherwise the route should return 404 'minItems': 1 # otherwise the route should return 404
...@@ -758,62 +753,98 @@ def get_system_correlation_services(): ...@@ -758,62 +753,98 @@ def get_system_correlation_services():
:return: :return:
""" """
dummy_data = [ cache_key = 'classifier-cache:msr:services'
{
'circuit_id': 123, r = common.get_current_redis()
'sid': 'AABBCC', response = _ignore_cache_or_retrieve(request, cache_key, r)
'name': 'BOGUS IP #1', if not response:
'speed': 1 << 20, peering_info = defaultdict(defaultdict)
'service_type': 'GEANT IP',
'customer': 'SURF', key_pattern = 'netconf-interfaces:*'
'endpoints': [
{ host_if_extraction_re = re.compile(
'hostname': 'mx1.ams.nl.geant.net', r'^netconf-interfaces:(.+?):')
'interface': 'xe-0/0/1', for doc in common.load_json_docs(
'addresses': { config_params=current_app.config['INVENTORY_PROVIDER_CONFIG'],
'v4': '10.0.0.1/30', key_pattern=key_pattern,
'v6': '2620:0000:1cff:dead:beee:0000:0000:02d9/127' num_threads=20):
} matches = host_if_extraction_re.match(doc['key'])
} if matches:
] peering_info[matches[1]][doc['value']['name']] = doc['value']
},
{ logical_interface_re = re.compile(r'.*\.\d+$')
'circuit_id': 234,
'sid': 'DDEEFF', def _ip_endpoint_extractor(endpoint_details: Dict):
'name': 'BOGUS PLUS SERVICE', if logical_interface_re.match(endpoint_details['port']):
'speed': 1 << 20, hostname = ims_equipment_to_hostname(
'service_type': 'GEANT PLUS', endpoint_details['equipment'])
'customer': 'SOMEBODY', interface = endpoint_details['port'].lower()
'endpoints': [
{ ip_endpoint = {
'hostname': 'mx1.ams.nl.geant.net', 'hostname': hostname,
'interface': 'xe-0/0/2', 'interface': interface,
'addresses': {
'v4': '10.0.1.1/30',
'v6': '2620:0000:1cff:dead:beef:0000:0000:02d9/127'
}
},
{
'hostname': 'mx1.lon.uk.geant.net',
'interface': 'xe-4/3/2',
'addresses': {
'v4': '10.0.1.2/30',
'v6': '2620:0000:1cff:dead:beef:0000:0000:02da/127'
}
} }
] addresses = {}
}, host_info = peering_info.get(hostname, {})
{ interface_info = host_info.get(interface, {})
'circuit_id': 123, ipv4 = interface_info.get('ipv4')
'sid': 'GGHHIIJJ', ipv6 = interface_info.get('ipv6')
'name': 'BOGUS LAMBDA SERVICE', if ipv4:
'speed': 1 << 20, addresses['v4'] = ipv4[0]
'service_type': 'GEANT LAMBDA', if ipv6:
'customer': 'JISC', addresses['v6'] = ipv6[0]
'endpoints': [ if ipv4 or ipv6:
{'equipment': 'LON01-DTNX10-1', 'port': 'B-2-T7-1'} ip_endpoint['addresses'] = addresses
]
} return ip_endpoint
]
def _optical_endpoint_extractor(endpoint_details: Dict):
return {
'equipment': endpoint_details['equipment'],
'port': endpoint_details['port']
}
def _endpoint_extractor(endpoint_details: Dict):
if not endpoint_details['geant_equipment']:
return
potential_hostname = ims_equipment_to_hostname(
endpoint_details['equipment'])
if potential_hostname in peering_info.keys():
return _ip_endpoint_extractor(endpoint_details)
else:
return _optical_endpoint_extractor(endpoint_details)
sid_services = json.loads(r.get('ims:sid_services').decode('utf-8'))
response = []
for sid, details in sid_services.items():
service_info = {'endpoints': []}
for d in details:
if not service_info.get('sid'):
service_info['circuit_id'] = d['circuit_id']
service_info['sid'] = d['sid']
service_info['name'] = d['name']
service_info['speed'] = d['speed']
service_info['service_type'] = d['service_type']
service_info['customer'] = d['customer']
endpoint = _endpoint_extractor(d)
if endpoint:
service_info['endpoints'].append(endpoint)
if service_info.get('endpoints'):
response.append(service_info)
jsonschema.validate(response,
SYSTEM_CORRELATION_SERVICES_LIST_SCHEMA)
return Response(json.dumps(dummy_data), mimetype="application/json") if response:
response = json.dumps(response, indent=2)
r.set(cache_key, response.encode('utf-8'))
if not response:
return Response(
response='no services found',
status=404,
mimetype="text/html")
return Response(response, mimetype="application/json")
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment