test_juniper_data.py 4.13 KiB
import os
import jsonschema
from lxml import etree
import pytest
from inventory_provider import juniper
import inventory_provider
TEST_DATA_DIRNAME = os.path.realpath(os.path.join(
inventory_provider.__path__[0],
"..",
"test",
"data"))
class MockedJunosRpc(object):
def __init__(self, hostname):
filename = os.path.join(TEST_DATA_DIRNAME, "%s-netconf.xml" % hostname)
self.config = etree.parse(filename)
def get_config(self):
return self.config
class MockedJunosDevice(object):
def __init__(self, **kwargs):
self.rpc = MockedJunosRpc(kwargs['host'])
def open(self):
pass
@pytest.fixture
def netconf_doc(mocker, router, data_config):
mocker.patch(
'inventory_provider.juniper.Device',
MockedJunosDevice)
return juniper.load_config(router, data_config['ssh'])
def test_interface_list(netconf_doc):
schema = {
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {"type": "string"},
"description": {"type": "string"},
"ipv4": {
"type": "array",
"items": {"type": "string"}
},
"ipv6": {
"type": "array",
"items": {"type": "string"}
}
},
"required": ["name", "description", "ipv4", "ipv6"],
"additionalProperties": False
}
}
interfaces = list(juniper.list_interfaces(netconf_doc))
jsonschema.validate(interfaces, schema)
assert interfaces # at least shouldn't be empty
def test_bgp_list(netconf_doc):
schema = {
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {"type": "string"},
"description": {"type": "string"},
"as": {
"type": "object",
"properties": {
"local": {"type": "integer"},
"peer": {"type": "integer"},
},
"required": ["local", "peer"],
"additionalProperties": False
}
},
"required": ["name", "description", "as"],
"additionalProperties": False
}
}
routes = list(juniper.list_bgp_routes(netconf_doc))
jsonschema.validate(routes, schema)
def test_snmp_community_string(mocked_netifaces, netconf_doc):
assert juniper.snmp_community_string(netconf_doc) == '0pBiFbD'
def test_interface_addresses_list(netconf_doc):
schema = {
"$schema": "http://json-schema.org/draft-07/schema#",
"definitions": {
"v4a": {
"type": "string",
"pattern": r'^(\d+\.){3}\d+$'
},
"v6a": {
"type": "string",
"pattern": r'^([a-f\d]{4}:){7}[a-f\d]{4}$'
},
"v4i": {
"type": "string",
"pattern": r'^(\d+\.){3}\d+/\d+$'
},
"v6i": {
"type": "string",
"pattern": r'^[a-f\d:]+/\d+$'
}
},
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"oneOf": [
{"$ref": "#/definitions/v4a"},
{"$ref": "#/definitions/v6a"}
]
},
"interface address": {
"oneOf": [
{"$ref": "#/definitions/v4i"},
{"$ref": "#/definitions/v6i"}
]
},
"interface name": {"type": "string"},
},
"required": ["name", "interface address", "interface name"],
"additionalProperties": False
}
}
addresses = list(juniper.interface_addresses(netconf_doc))
jsonschema.validate(addresses, schema)