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

Finished feature add-ix-public-peer-group.

parents d6d79ce3 5fb25738
Branches
Tags
No related merge requests found
......@@ -376,10 +376,10 @@ Any non-empty responses are JSON formatted messages.
then information about the interface is returned, otherwise
404 is returned.
The resp onse will be formatted according to the following syntax:
The response will be formatted according to the following syntax:
```json
{
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
......@@ -402,7 +402,6 @@ Any non-empty responses are JSON formatted messages.
"required": ["name", "description"],
"additionalProperties": False
},
"ix-public-peer": {
"type": "object",
"properties": {
......@@ -421,17 +420,24 @@ Any non-empty responses are JSON formatted messages.
},
"required": ["name", "description", "as"],
"additionalProperties": False
}
},
"ix-public-peer-group": {
"type": "array",
"items": {"$ref": "#/definitions/ip-address"}
},
},
"type": "object",
"properties": {
"ix-public-peer-info": {"$ref": "#/definitions/ix-public-peer"},
"ix-public-peer-group": {
"$ref": "#/definitions/ix-public-peer-group"},
"vpn-rr-peer-info": {"$ref": "#/definitions/vpn-rr-peer"}
},
"additionalProperties": False
}
```
}
```
* /poller/interfaces/*`hostname`*
......
import ipaddress
import json
from flask import Blueprint, Response, jsonify
......@@ -49,6 +50,35 @@ def get_trap_metadata(source_equipment, interface):
@common.require_accepts_json
def peer_info(address):
def _related_ix_peers(ix_public_peer_info):
"""
TODO: this is probably the least efficient way of doing this
(if it's a problem, pre-compute these lists)
:param ix_public_peer_info: ix public peer info loaded for address
:return:
"""
protocol = type(ipaddress.ip_address(address)).__name__
description = ix_public_peer_info['description']
assert description is not None # sanity: at least empty string
keyword = description.split(' ')[0] # regex needed??? (e.g. tabs???)
r = common.get_redis()
for k in r.keys('ix_public_peer:*'):
peer = r.get(k.decode('utf-8')).decode('utf-8')
peer = json.loads(peer)
assert peer['description'] is not None # sanity: as above...
if not peer['description'].startswith(keyword):
continue
if peer['name'] == address:
continue # skip self
peer_address = ipaddress.ip_address(peer['name'])
if protocol == type(peer_address).__name__:
yield peer['name']
r = common.get_redis()
result = {}
......@@ -57,6 +87,8 @@ def peer_info(address):
if info:
info = info.decode('utf-8')
result['ix-public-peer-info'] = json.loads(info)
result['ix-public-peer-group'] = list(
_related_ix_peers(result['ix-public-peer-info']))
info = r.get('vpn_rr_peer:%s' % address)
if info:
......
......@@ -22,14 +22,19 @@ def test_trap_metadata(client_with_mocked_data):
jsonschema.validate(response_data, response_schema)
@pytest.mark.parametrize("peer_address,peer_type", [
('109.105.110.54', 'vpn-rr-peer-info'),
('2001:07f8:001c:024a:0000:0000:316e:0001', 'ix-public-peer-info'),
('2001:07f8:000b:0100:01d1:a5d1:0310:0029', 'ix-public-peer-info'),
('195.66.224.238', 'ix-public-peer-info'),
VPN_RR_PEER_INFO_KEYS = {'vpn-rr-peer-info'}
IX_PUBLIC_PEER_INFO_KEYS = {'ix-public-peer-info', 'ix-public-peer-group'}
@pytest.mark.parametrize("peer_address,expected_response_keys", [
('109.105.110.54', VPN_RR_PEER_INFO_KEYS),
('2001:07f8:001c:024a:0000:0000:316e:0001', IX_PUBLIC_PEER_INFO_KEYS),
('2001:07f8:000b:0100:01d1:a5d1:0310:0029', IX_PUBLIC_PEER_INFO_KEYS),
('195.66.224.238', IX_PUBLIC_PEER_INFO_KEYS),
]
)
def test_peer_info(client_with_mocked_data, peer_address, peer_type):
def test_peer_info(
client_with_mocked_data, peer_address, expected_response_keys):
response_schema = {
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
......@@ -53,7 +58,6 @@ def test_peer_info(client_with_mocked_data, peer_address, peer_type):
"required": ["name", "description"],
"additionalProperties": False
},
"ix-public-peer": {
"type": "object",
"properties": {
......@@ -72,12 +76,19 @@ def test_peer_info(client_with_mocked_data, peer_address, peer_type):
},
"required": ["name", "description", "as"],
"additionalProperties": False
}
},
"ix-public-peer-group": {
"type": "array",
"items": {"$ref": "#/definitions/ip-address"}
},
},
"type": "object",
"properties": {
"ix-public-peer-info": {"$ref": "#/definitions/ix-public-peer"},
"ix-public-peer-group": {
"$ref": "#/definitions/ix-public-peer-group"},
"vpn-rr-peer-info": {"$ref": "#/definitions/vpn-rr-peer"}
},
"additionalProperties": False
......@@ -91,10 +102,7 @@ def test_peer_info(client_with_mocked_data, peer_address, peer_type):
response_data = json.loads(rv.data.decode('utf-8'))
jsonschema.validate(response_data, response_schema)
assert len(response_data) == 1, \
"peer should be only vpn-rr or ix-public, not both"
assert peer_type in response_data
assert set(response_data.keys()) == expected_response_keys
def test_peer_not_found(client_with_mocked_data):
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment