Skip to content
Snippets Groups Projects
conftest.py 5.57 KiB
Newer Older
import ast
import json
import netifaces
import os
import re
import tempfile
import pytest
import inventory_provider
from inventory_provider import config

TEST_DATA_DIRNAME = os.path.realpath(os.path.join(
    inventory_provider.__path__[0],
    "..",
    "test",
    "data"))


def data_config_filename(tmp_dir_name):
    config = {
        "alarms-db": {
            "hostname": "xxxxxxx.yyyyy.zzz",
            "dbname": "xxxxxx",
            "username": "xxxxxx",
            "password": "xxxxxxxx"
        },
        "ops-db": {
            "hostname": "xxxxxxx.yyyyy.zzz",
            "dbname": "xxxxxx",
            "username": "xxxxxx",
            "password": "xxxxxxxx"
        },
        "oid_list.conf": os.path.join(
            tmp_dir_name,
            "oid_list.conf"),
        "ssh": {
            "username": "uSeR-NaMe",
            "private-key": "private-key-filename",
            "known-hosts": "known-hosts=filename"
        },
        "redis": {
            "hostname": "xxxxxx",
            "port": 6379
        "junosspace": {
            "api": "bogus-url",
            "username": "bogus-username",
            "password": "bogus-password"
        },
        "infinera-dna": [
            {"name": "name1", "address": "123.456.789.0"},
            {"name": "name2", "address": "012.345.678.9"},
            {"name": "name3", "address": "111.222.333.000"}
        ],
        "coriant-tnms": [
            {"name": "name1", "address": "123.456.789.0"},
            {"name": "name2", "address": "012.345.678.9"},
            {"name": "name3", "address": "111.222.333.000"}
    shutil.copyfile(
        os.path.join(TEST_DATA_DIRNAME, 'oid_list.conf'),
        config['oid_list.conf']
    )

    filename = os.path.join(tmp_dir_name, "config.json")
    with open(filename, "w") as f:
        f.write(json.dumps(config))

    return filename


def _tmp_data_config():
    with tempfile.TemporaryDirectory() as tmpdir:
        with open(data_config_filename(tmpdir)) as f:
            return config.load(f)


TEST_DATA_DIRNAME = os.path.realpath(os.path.join(
    inventory_provider.__path__[0],
    "..",
    "test",
    "data"))

Erik Reid's avatar
Erik Reid committed

class MockedRedis(object):

    db = None

    def __init__(self, *args, **kwargs):
        if MockedRedis.db is None:
            test_data_filename = os.path.join(
                TEST_DATA_DIRNAME,
                "router-info.json")
            with open(test_data_filename) as f:
                MockedRedis.db = json.loads(f.read())

    def set(self, name, value):
        MockedRedis.db[name] = value

    def get(self, name):
        value = MockedRedis.db.get(name, None)
        if value is None:
            return None
        return value.encode('utf-8')

    def keys(self, glob=None):
        if not glob:
            return list([k.encode("utf-8") for k in MockedRedis.db.keys()])
Erik Reid's avatar
Erik Reid committed
        m = re.match(r'^([^*]+)\*$', glob)
        assert m  # all expected global are like this
        return list([
            k.encode("utf-8") for k in MockedRedis.db.keys()
            if k.startswith(m.group(1))])

Erik Reid's avatar
Erik Reid committed
    def flushdb(self):
        # only called from testing routes (hopefully)
        pass

@pytest.fixture
def data_config():
    return _tmp_data_config()


@pytest.fixture
def cached_test_data():
    filename = os.path.join(TEST_DATA_DIRNAME, "router-info.json")
    with open(filename) as f:
        return json.loads(f.read())


@pytest.fixture
def app_config():
    with tempfile.TemporaryDirectory() as tmpdir:

        app_config_filename = os.path.join(tmpdir, "app.config")
        with open(app_config_filename, "w") as f:
            f.write("%s = '%s'\n" % (
                "INVENTORY_PROVIDER_CONFIG_FILENAME",
                data_config_filename(tmpdir)))
            f.write('ENABLE_TESTING_ROUTES = True\n')

        yield app_config_filename


@pytest.fixture
def client(app_config, mocker):

    mocker.patch(
        'inventory_provider.routes.common.redis.StrictRedis',
        MockedRedis)

    os.environ["SETTINGS_FILENAME"] = app_config
    with inventory_provider.create_app().test_client() as c:
        yield c


@pytest.fixture
def client_with_mocked_data(client, mocker):

    mocker.patch(
        'inventory_provider.routes.common.redis.StrictRedis',
        MockedRedis)
    return client
Erik Reid's avatar
Erik Reid committed


@pytest.fixture
def mocked_redis(mocker):
    mocker.patch(
        'inventory_provider.routes.common.redis.StrictRedis',
        MockedRedis)


NETIFACES_TEST_DATA_STRING = """{
    'lo0':  {{AF_INET}: [{'addr': '127.0.0.1', 'netmask': '255.0.0.0', 'peer': '127.0.0.1'}],
             {AF_INET6}: [{'addr': '::1', 'netmask': 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128', 'peer': '::1', 'flags': 0},
                 {'addr': 'fe80::1%lo0', 'netmask': 'ffff:ffff:ffff:ffff::/64', 'flags': 0}]},
    'eth0': {{AF_LINK}: [{'addr': '78:4f:43:76:73:ba'}],
             {AF_INET}: [{'addr': '83.97.92.239', 'netmask': '255.255.252.0', 'broadcast': '83.97.95.255'}],
             {AF_INET6}: [{'addr': 'fe80::250:56ff:fea1:8340', 'netmask': 'ffff:ffff:ffff:ffff::/64', 'flags': 1024},
                 {'addr': '2001:798:3::104', 'netmask': 'ffff:ffff:ffff:ffff::/64', 'flags': 1088}]}
}"""  # noqa E501


@pytest.fixture
def mocked_netifaces(mocker):
    s = NETIFACES_TEST_DATA_STRING
    for k, v in {
                'AF_INET': netifaces.AF_INET,
                'AF_INET6': netifaces.AF_INET6,
                'AF_LINK': netifaces.AF_LINK
            }.items():
        s = s.replace('{%s}' % k, str(v))
    data = ast.literal_eval(s)
    mocker.patch('netifaces.interfaces', lambda: data.keys())
    mocker.patch('netifaces.ifaddresses', lambda n: data[n])