From 11b1841f62397d5d2b66100f768f7da96b039137 Mon Sep 17 00:00:00 2001 From: Erik Reid <erik.reid@geant.org> Date: Thu, 16 Jan 2020 11:27:49 +0100 Subject: [PATCH] refactor how schema defs are written --- test/test_classifier_routes.py | 418 +++++++++++++++++---------------- 1 file changed, 212 insertions(+), 206 deletions(-) diff --git a/test/test_classifier_routes.py b/test/test_classifier_routes.py index 7723dfab..c0c92c13 100644 --- a/test/test_classifier_routes.py +++ b/test/test_classifier_routes.py @@ -8,129 +8,139 @@ DEFAULT_REQUEST_HEADERS = { "Accept": ["application/json"] } -LOCATION_END_DEFINITION = { - "type": "object", - "properties": { - "equipment": {"type": "string"}, - "name": {"type": "string"}, - "abbreviation": {"type": "string"} +LOCATIONS_DEFINITIONS = { + "location-endpoint": { + "type": "object", + "properties": { + "equipment": {"type": "string"}, + "name": {"type": "string"}, + "abbreviation": {"type": "string"} + }, + "required": ["equipment", "name", "abbreviation"], + "additionalProperties": False }, - "required": ["equipment", "name", "abbreviation"], - "additionalProperties": False + "location": { + "type": "object", + "properties": { + "a": {"$ref": "#/definitions/location-endpoint"}, + "b": {"$ref": "#/definitions/location-endpoint"} + }, + "required": ["a"], + "additionalProperties": False + }, + "locations-list": { + "type": "array", + "items": {"$ref": "#/definitions/location"} + } } -LOCATION_DEFINITION = { - "type": "object", - "properties": { - "a": LOCATION_END_DEFINITION, - "b": LOCATION_END_DEFINITION + +JUNIPER_LINK_METADATA_DEFINITIONS = { + "ip-address": { + "type": "string", + "oneOf": [ + {"pattern": r'^(\d+\.){3}\d+$'}, + {"pattern": r'^([a-f\d]{4}:){7}[a-f\d]{4}$'} + ] }, - "required": ["a"], - "additionalProperties": False + "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": { + "type": "array", + "items": {"$ref": "#/definitions/ipv4-interface-address"} + }, + "ipv6": { + "type": "array", + "items": {"$ref": "#/definitions/ipv6-interface-address"} + }, + + # TODO: check what's changed: added to make tests pass + 'bundle': {"type": "array"} + }, + "required": ["name", "description", "ipv4", "ipv6"], + "additionalProperties": False + }, + "service-info": { + "type": "object", + "properties": { + "id": {"type": "integer"}, + "name": {"type": "string"}, + "status": { + "type": "string", + "enum": ["operational", "installed", "planned", "ordered"] + }, + "circuit_type": { + "type": "string", + "enum": ["path", "service", "l2circuit"] + }, + "service_type": {"type": "string"}, + "project": {"type": "string"}, + "equipment": {"type": "string"}, + "pop": {"type": "string"}, + "pop_abbreviation": {"type": "string"}, + + "other_end_pop": {"type": "string"}, + "other_end_pop_abbreviation": {"type": "string"}, + "other_end_equipment": {"type": "string"}, + "port": {"type": "string"}, + "other_end_port": {"type": "string"}, + "logical_unit": { + "oneOf": [ + {"type": "integer"}, + {"type": "string", "maxLength": 0} + ] + }, + "other_end_logical_unit": { + "oneOf": [ + {"type": "integer"}, + {"type": "string", "maxLength": 0} + ] + }, + "manufacturer": { + "type": "string", + "enum": ["juniper", "coriant", "infinera", + "cisco", "hewlett packard", + "corsa", "graham smith uk ltd", + "unknown", ""] + }, + "card_id": {"type": "string"}, + "other_end_card_id": {"type": "string"}, + "interface_name": {"type": "string"}, + "other_end_interface_name": {"type": "string"}, + + # TODO: check what's changed: added to make tests pass + 'other_end_pop_name': {"type": "string"}, + 'pop_name': {"type": "string"} + }, + # TODO: modify service-info so that "" entries are just omitted + # (... rather than requiring 'oneOf') + # TODO: put 'other_end_*' params in a sub dictionary + # "required": [ + # "id", "name", "status", + # "circuit_type", "service_type", + # "project", "port", "manufacturer", + # "equipment", "logical_unit", "card_id", "interface_name" + # ], + "additionalProperties": False + } } + JUNIPER_LINK_METADATA = { "$schema": "http://json-schema.org/draft-07/schema#", "type": "object", "definitions": { - "location": LOCATION_DEFINITION, - "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": { - "type": "array", - "items": {"$ref": "#/definitions/ipv4-interface-address"} - }, - "ipv6": { - "type": "array", - "items": {"$ref": "#/definitions/ipv6-interface-address"} - }, - - # TODO: check what's changed: added to make tests pass - 'bundle': {"type": "array"} - }, - "required": ["name", "description", "ipv4", "ipv6"], - "additionalProperties": False - }, - "service-info": { - "type": "object", - "properties": { - "id": {"type": "integer"}, - "name": {"type": "string"}, - "status": { - "type": "string", - "enum": ["operational", "installed", "planned", "ordered"] - }, - "circuit_type": { - "type": "string", - "enum": ["path", "service", "l2circuit"] - }, - "service_type": {"type": "string"}, - "project": {"type": "string"}, - "equipment": {"type": "string"}, - "pop": {"type": "string"}, - "pop_abbreviation": {"type": "string"}, - - "other_end_pop": {"type": "string"}, - "other_end_pop_abbreviation": {"type": "string"}, - "other_end_equipment": {"type": "string"}, - "port": {"type": "string"}, - "other_end_port": {"type": "string"}, - "logical_unit": { - "oneOf": [ - {"type": "integer"}, - {"type": "string", "maxLength": 0} - ] - }, - "other_end_logical_unit": { - "oneOf": [ - {"type": "integer"}, - {"type": "string", "maxLength": 0} - ] - }, - "manufacturer": { - "type": "string", - "enum": ["juniper", "coriant", "infinera", - "cisco", "hewlett packard", - "corsa", "graham smith uk ltd", - "unknown", ""] - }, - "card_id": {"type": "string"}, - "other_end_card_id": {"type": "string"}, - "interface_name": {"type": "string"}, - "other_end_interface_name": {"type": "string"}, - - # TODO: check what's changed: added to make tests pass - 'other_end_pop_name': {"type": "string"}, - 'pop_name': {"type": "string"} - }, - # TODO: modify service-info so that "" entries are just omitted - # (... rather than requiring 'oneOf') - # TODO: put 'other_end_*' params in a sub dictionary - # "required": [ - # "id", "name", "status", - # "circuit_type", "service_type", - # "project", "port", "manufacturer", - # "equipment", "logical_unit", "card_id", "interface_name" - # ], - "additionalProperties": False - } + **JUNIPER_LINK_METADATA_DEFINITIONS, **LOCATIONS_DEFINITIONS }, "type": "object", @@ -144,10 +154,7 @@ JUNIPER_LINK_METADATA = { "type": "array", "items": {"$ref": "#/definitions/service-info"} }, - "locations": { - "type": "array", - "items": {"$ref": "#/definitions/location"} - } + "locations": {"$ref": "#/definitions/locations-list"} }, # "required": ["interface"], "additionalProperties": False @@ -203,96 +210,98 @@ IX_PUBLIC_PEER_INFO_KEYS = {'ix-public-peer-info', 'interfaces', 'locations'} ) def test_peer_info( client, peer_address, expected_response_keys): - response_schema = { - "$schema": "http://json-schema.org/draft-07/schema#", - "type": "object", - - "definitions": { - "location": LOCATION_DEFINITION, - "ip-address": { - "type": "string", - "oneOf": [ - {"pattern": r'^(\d+\.){3}\d+$'}, - {"pattern": r'^([a-f\d]{4}:){7}[a-f\d]{4}$'} - ] - }, - "interface-address": { - "type": "string", - "oneOf": [ - {"pattern": r'^(\d+\.){3}\d+/\d+$'}, - {"pattern": r'^[a-f\d:]+/\d+$'} - ] - }, - "vpn-rr-peer": { - "type": "object", - "properties": { - "name": {"$ref": "#/definitions/ip-address"}, - "description": {"type": "string"}, - "peer-as": {"type": "integer"}, - "router": {"type": "string"} - }, - "required": ["name", "description"], - "additionalProperties": False - }, - "ix-public-peer": { - "type": "object", - "properties": { - "name": {"$ref": "#/definitions/ip-address"}, - "description": {"type": "string"}, - "router": {"type": "string"}, - "as": { - "type": "object", - "properties": { - "local": {"type": "integer"}, - "peer": {"type": "integer"}, - }, - "required": ["local", "peer"], - "additionalProperties": False - } - }, - "required": ["name", "description", "as"], - "additionalProperties": False - }, - "ix-public-peer-list": { - "type": "array", - "items": {"$ref": "#/definitions/ip-address"} + response_schema_definitions = { + "ip-address": { + "type": "string", + "oneOf": [ + {"pattern": r'^(\d+\.){3}\d+$'}, + {"pattern": r'^([a-f\d]{4}:){7}[a-f\d]{4}$'} + ] + }, + "interface-address": { + "type": "string", + "oneOf": [ + {"pattern": r'^(\d+\.){3}\d+/\d+$'}, + {"pattern": r'^[a-f\d:]+/\d+$'} + ] + }, + "vpn-rr-peer": { + "type": "object", + "properties": { + "name": {"$ref": "#/definitions/ip-address"}, + "description": {"type": "string"}, + "peer-as": {"type": "integer"}, + "router": {"type": "string"} }, - "ix-public-peer-info": { - "type": "object", - "properties": { - "peer": {"$ref": "#/definitions/ix-public-peer"}, - "group": {"$ref": "#/definitions/ix-public-peer-list"}, - "router": {"$ref": "#/definitions/ix-public-peer-list"} - }, - "required": ["peer", "group", "router"], - "additionalProperties": False + "required": ["name", "description"], + "additionalProperties": False + }, + "ix-public-peer": { + "type": "object", + "properties": { + "name": {"$ref": "#/definitions/ip-address"}, + "description": {"type": "string"}, + "router": {"type": "string"}, + "as": { + "type": "object", + "properties": { + "local": {"type": "integer"}, + "peer": {"type": "integer"}, + }, + "required": ["local", "peer"], + "additionalProperties": False + } }, - "interface-info": { - "type": "object", - "properties": { - "name": {"$ref": "#/definitions/ip-address"}, - "interface address": { - "$ref": "#/definitions/interface-address"}, - "interface name": {"type": "string"}, - "router": {"type": "string"} - }, - "required": [ - "name", "interface address", "interface name", "router"], - "additionalProperties": False + "required": ["name", "description", "as"], + "additionalProperties": False + }, + "ix-public-peer-list": { + "type": "array", + "items": {"$ref": "#/definitions/ip-address"} + }, + "ix-public-peer-info": { + "type": "object", + "properties": { + "peer": {"$ref": "#/definitions/ix-public-peer"}, + "group": {"$ref": "#/definitions/ix-public-peer-list"}, + "router": {"$ref": "#/definitions/ix-public-peer-list"} }, - "service-info": { - "type": "object" + "required": ["peer", "group", "router"], + "additionalProperties": False + }, + "interface-info": { + "type": "object", + "properties": { + "name": {"$ref": "#/definitions/ip-address"}, + "interface address": { + "$ref": "#/definitions/interface-address"}, + "interface name": {"type": "string"}, + "router": {"type": "string"} }, - "interface-lookup-info": { - "type": "object", - "properties": { - "interface": {"$ref": "#/definitions/interface-info"}, - "services": { - "type": "array", - "items": {"$ref": "#/definitions/service-info"} - } + "required": [ + "name", "interface address", "interface name", "router"], + "additionalProperties": False + }, + "service-info": { + "type": "object" + }, + "interface-lookup-info": { + "type": "object", + "properties": { + "interface": {"$ref": "#/definitions/interface-info"}, + "services": { + "type": "array", + "items": {"$ref": "#/definitions/service-info"} } } + } + } + response_schema = { + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + + "definitions": { + **response_schema_definitions, **LOCATIONS_DEFINITIONS }, "type": "object", @@ -304,10 +313,7 @@ def test_peer_info( "type": "array", "items": {"$ref": "#/definitions/interface-lookup-info"} }, - "locations": { - "type": "array", - "items": {"$ref": "#/definitions/location"} - } + "locations": {"$ref": "#/definitions/locations-list"} }, "additionalProperties": False } -- GitLab