Skip to content
Snippets Groups Projects
Commit 565d34e7 authored by Sam Roberts's avatar Sam Roberts
Browse files

Merge branch 'develop' into POL1-487-fixes

parents 6504c028 20a2bfdf
Branches
Tags
No related merge requests found
...@@ -2,6 +2,9 @@ ...@@ -2,6 +2,9 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
## [0.81] - 2022-02-17
- POL1-521: handle RPC timeout error properly, and log errors
## [0.80] - 2022-02-16 ## [0.80] - 2022-02-16
- POL1-487: Adjusted filtering for COPERNICUS dashboard (no longer overrides customer names) - POL1-487: Adjusted filtering for COPERNICUS dashboard (no longer overrides customer names)
......
import contextlib
import logging import logging
import re import re
import ipaddress import ipaddress
...@@ -114,6 +115,7 @@ class NetconfHandlingError(Exception): ...@@ -114,6 +115,7 @@ class NetconfHandlingError(Exception):
pass pass
@contextlib.contextmanager
def _rpc(hostname, ssh): def _rpc(hostname, ssh):
dev = Device( dev = Device(
host=hostname, host=hostname,
...@@ -121,9 +123,9 @@ def _rpc(hostname, ssh): ...@@ -121,9 +123,9 @@ def _rpc(hostname, ssh):
ssh_private_key_file=ssh['private-key']) ssh_private_key_file=ssh['private-key'])
try: try:
dev.open() dev.open()
except (EzErrors.ConnectError, EzErrors.RpcError) as e: yield dev.rpc
raise ConnectionError(str(e)) finally:
return dev.rpc dev.close()
def validate_netconf_config(config_doc): def validate_netconf_config(config_doc):
...@@ -166,14 +168,18 @@ def load_config(hostname, ssh_params, validate=True): ...@@ -166,14 +168,18 @@ def load_config(hostname, ssh_params, validate=True):
:param ssh_params: 'ssh' config element(cf. config.py:CONFIG_SCHEMA) :param ssh_params: 'ssh' config element(cf. config.py:CONFIG_SCHEMA)
:param validate: whether or not to validate netconf data (default True) :param validate: whether or not to validate netconf data (default True)
:return: :return:
:raises: NetconfHandlingError from validate_netconf_config :raises: NetconfHandlingError or ConnectionError
""" """
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
logger.info("capturing netconf data for '%s'" % hostname) logger.info("capturing netconf data for '%s'" % hostname)
config = _rpc(hostname, ssh_params).get_config() try:
if validate: with _rpc(hostname, ssh_params) as router:
validate_netconf_config(config) config = router.get_config()
return config if validate:
validate_netconf_config(config)
return config
except (EzErrors.ConnectError, EzErrors.RpcError) as e:
raise ConnectionError(str(e))
def list_interfaces(netconf_config): def list_interfaces(netconf_config):
......
...@@ -562,9 +562,13 @@ def reload_lab_router_config_chorded(self, hostname): ...@@ -562,9 +562,13 @@ def reload_lab_router_config_chorded(self, hostname):
hostname, community, logical_systems, self.log_info) hostname, community, logical_systems, self.log_info)
self.log_info(f'updated configuration for lab {hostname}') self.log_info(f'updated configuration for lab {hostname}')
except Exception as e: except Exception:
logger.error(e) errmsg = f'unhandled exception loading {hostname} info'
logger.exception(errmsg)
update_latch_status(InventoryTask.config, pending=True, failure=True) update_latch_status(InventoryTask.config, pending=True, failure=True)
self.log_error(errmsg)
# TODO: re-raise and handle in some common way for all tasks
# raise
@app.task(base=InventoryTask, bind=True, name='reload_router_config') @app.task(base=InventoryTask, bind=True, name='reload_router_config')
...@@ -598,9 +602,13 @@ def reload_router_config_chorded(self, hostname): ...@@ -598,9 +602,13 @@ def reload_router_config_chorded(self, hostname):
snmp_refresh_peerings_chorded(hostname, community, logical_systems) snmp_refresh_peerings_chorded(hostname, community, logical_systems)
logger.info(f'updated configuration for {hostname}') logger.info(f'updated configuration for {hostname}')
except Exception as e: except Exception:
logger.error(e) errmsg = f'unhandled exception loading {hostname} info'
logger.exception(errmsg)
update_latch_status(InventoryTask.config, pending=True, failure=True) update_latch_status(InventoryTask.config, pending=True, failure=True)
self.log_error(errmsg)
# TODO: re-raise and handle in some common way for all tasks
# raise
def retrieve_and_persist_netconf_config( def retrieve_and_persist_netconf_config(
......
...@@ -2,7 +2,7 @@ from setuptools import setup, find_packages ...@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
setup( setup(
name='inventory-provider', name='inventory-provider',
version="0.81", version="0.82",
author='GEANT', author='GEANT',
author_email='swd@geant.org', author_email='swd@geant.org',
description='Dashboard inventory provider', description='Dashboard inventory provider',
......
...@@ -54,6 +54,9 @@ class MockedJunosDevice(object): ...@@ -54,6 +54,9 @@ class MockedJunosDevice(object):
def open(self): def open(self):
pass pass
def close(self):
pass
@pytest.fixture @pytest.fixture
def netconf_doc(mocker, router, data_config): def netconf_doc(mocker, router, data_config):
......
...@@ -3,6 +3,9 @@ just checks that the worker methods call the right functions ...@@ -3,6 +3,9 @@ just checks that the worker methods call the right functions
and some data ends up in the right place ... otherwise not very detailed and some data ends up in the right place ... otherwise not very detailed
""" """
import re import re
import pytest
from inventory_provider.tasks import worker from inventory_provider.tasks import worker
from inventory_provider.tasks.common import _get_redis from inventory_provider.tasks.common import _get_redis
...@@ -18,6 +21,9 @@ def backend_db(): ...@@ -18,6 +21,9 @@ def backend_db():
def test_netconf_refresh_config(mocked_worker_module, router): def test_netconf_refresh_config(mocked_worker_module, router):
if router in ['qfx.par.fr.geant.net', 'qfx.fra.de.geant.net']:
# expected to fail
pytest.skip(f'test data has no community string for {router}')
del backend_db()['netconf:' + router] del backend_db()['netconf:' + router]
worker.reload_router_config_chorded(router) worker.reload_router_config_chorded(router)
assert backend_db()['netconf:' + router] assert backend_db()['netconf:' + router]
...@@ -94,7 +100,7 @@ def test_reload_router_config(mocked_worker_module, router, mocker): ...@@ -94,7 +100,7 @@ def test_reload_router_config(mocked_worker_module, router, mocker):
_mocked_snmp_refresh_interfaces_chorded) _mocked_snmp_refresh_interfaces_chorded)
def _mocked_snmp_refresh_peerings_chorded(*args, **kwargs): def _mocked_snmp_refresh_peerings_chorded(*args, **kwargs):
assert len(args) == 4 assert len(args) == 3
backend_db().update(saved_peerings) backend_db().update(saved_peerings)
mocker.patch( mocker.patch(
'inventory_provider.tasks.worker.snmp_refresh_peerings_chorded', 'inventory_provider.tasks.worker.snmp_refresh_peerings_chorded',
......
...@@ -17,8 +17,7 @@ commands = ...@@ -17,8 +17,7 @@ commands =
coverage run --source inventory_provider -m py.test {posargs} coverage run --source inventory_provider -m py.test {posargs}
coverage xml coverage xml
coverage html coverage html
coverage report --fail-under 75 coverage report --fail-under 80
# coverage report --fail-under 80
flake8 flake8
sphinx-build -M html docs/source docs/build sphinx-build -M html docs/source docs/build
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment