Skip to content
Snippets Groups Projects
Commit 49a7ade4 authored by Erik Reid's avatar Erik Reid
Browse files

added related services & made test validation schema stricter

parent 8d9f89c9
Branches
Tags
No related merge requests found
import ipaddress
import json
import re
from flask import Blueprint, Response
......@@ -33,6 +34,22 @@ def handle_request_error(error):
status=error.status_code)
def base_interface_name(interface):
m = re.match(r'(.*?)(\.\d+)?$', interface)
assert m # sanity: anything should match
return m.group(1)
def related_interfaces(hostname, interface):
r = common.get_redis()
prefix = 'netconf-interfaces:%s:' % hostname
for k in r.keys(prefix + base_interface_name(interface) + '*'):
k = k.decode('utf-8')
assert k.startswith(prefix) # sanity
assert len(k) > len(prefix) # sanity (contains at least an interface)
yield k[len(prefix):]
@routes.route("/trap-metadata/<source_equipment>/<path:interface>",
methods=['GET', 'POST'])
@common.require_accepts_json
......@@ -57,6 +74,17 @@ def get_trap_metadata(source_equipment, interface):
if ifc_info:
result['interface'] = json.loads(ifc_info.decode('utf-8'))
def _related_services():
for related in related_interfaces(source_equipment, interface):
s = r.get('opsdb:interface_services:%s:%s'
% (source_equipment, related))
if s:
yield json.loads(s.decode('utf-8'))
related_services = list(_related_services())
if related_services:
result['related-services'] = related_services
if not result:
return Response(
response="no available info for {} {}".format(
......
......@@ -7,6 +7,57 @@ DEFAULT_REQUEST_HEADERS = {
"Accept": ["application/json"]
}
JUNIPER_LINK_METADATA = {
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"definitions": {
"ip-address": {
"type": "string",
"oneOf": [
{"pattern": r'^(\d+\.){3}\d+$'},
{"pattern": r'^([a-f\d]{4}:){7}[a-f\d]{4}$'}
]
},
"ipv4-interface-address": {
"type": "string",
"pattern": r'^(\d+\.){3}\d+/\d+$'
},
"ipv6-interface-address": {
"type": "string",
"pattern": r'^[a-f\d:]+/\d+$'
},
"interface-info": {
"type": "object",
"properties": {
"name": {"type": "string"},
"description": {"type": "string"},
"ipv4": {"$ref": "#/definitions/ipv4-interface-addres"},
"ipv4": {"$ref": "#/definitions/ipv6-interface-addres"},
},
"required": ["name", "description", "ipv4", "ipv6"],
"additionalProperties": False
},
"service-info": {
"type": "object"
}
},
"type": "object",
"properties": {
"services": {
"type": "array",
"items": {"$ref": "#/definitions/service-info"}
},
"interface": {"$ref": "#/definitions/interface-info"},
"related-services": {
"type": "array",
"items": {"$ref": "#/definitions/service-info"}
}
},
"additionalProperties": False
}
def test_trap_metadata(client_with_mocked_data):
response_schema = {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment