From 4af1db83fdaae0d646e4ff69757e8281cd119fae Mon Sep 17 00:00:00 2001 From: Erik Reid <erik.reid@geant.org> Date: Fri, 28 May 2021 15:24:27 +0200 Subject: [PATCH] added an end-to-end cli flash test, bugfixes --- brian_polling_manager/cli.py | 16 +++++++++------- test/conftest.py | 10 +++++++++- test/test_e2e.py | 22 ++++++++++++++++++++++ 3 files changed, 40 insertions(+), 8 deletions(-) create mode 100644 test/test_e2e.py diff --git a/brian_polling_manager/cli.py b/brian_polling_manager/cli.py index e9015a3..a3a1912 100644 --- a/brian_polling_manager/cli.py +++ b/brian_polling_manager/cli.py @@ -1,6 +1,7 @@ import json import logging import os +from typing import Union import click import jsonschema @@ -131,10 +132,13 @@ class State(object): return state['last'] if state else -1 @last.setter - def last(self, new_last: float): - state = {'last': new_last} - with open(self.filenames['state'], 'w') as f: - f.write(json.dumps(state)) + def last(self, new_last: Union[float, None]): + if not new_last or new_last < 0: + os.unlink(self.filenames['state']) + else: + state = {'last': new_last} + with open(self.filenames['state'], 'w') as f: + f.write(json.dumps(state)) @property def interfaces(self) -> list: @@ -178,8 +182,6 @@ def _validate_config(ctx, param, value): return config - - @click.command() @click.option( '--config', @@ -195,7 +197,7 @@ def main(config, force): state = State(config['statedir']) last = inventory.last_update_timestamp(config['inventory']) - if force or last != state.last: + if force or not last or last != state.last: state.last = last state.interfaces = inventory.load_interfaces(config['inventory']) diff --git a/test/conftest.py b/test/conftest.py index 16af34e..ea94ef8 100644 --- a/test/conftest.py +++ b/test/conftest.py @@ -1,5 +1,6 @@ import json import os +import random import re import tempfile @@ -87,7 +88,7 @@ def mocked_sensu(): responses.add( method=responses.GET, url=re.compile(r'.*sensu.+/api/core/v2/namespaces/[^\/]+/checks$'), - body=json.dumps(list(saved_sensu_checks.items())) + json=list(saved_sensu_checks.values()) ) def new_check_callback(request): @@ -138,6 +139,7 @@ def mocked_sensu(): yield saved_sensu_checks + @pytest.fixture def mocked_inventory(): @@ -147,3 +149,9 @@ def mocked_inventory(): url=re.compile(r'.*inventory.+/poller/interfaces.*'), body=_load_test_data('interfaces.json')) + bogus_version = {'latch': {'timestamp': 10000 * random.random()}} + # mocked api for returning all checks + responses.add( + method=responses.GET, + url=re.compile(r'.*inventory.+/version.*'), + body=json.dumps(bogus_version)) diff --git a/test/test_e2e.py b/test/test_e2e.py new file mode 100644 index 0000000..61d4837 --- /dev/null +++ b/test/test_e2e.py @@ -0,0 +1,22 @@ +import json +import tempfile + +from click.testing import CliRunner +import responses + +from brian_polling_manager import cli + + +@responses.activate +def test_run_flashtest(config, mocked_sensu, mocked_inventory): + + with tempfile.NamedTemporaryFile(mode='w') as f: + f.write(json.dumps(config)) + f.flush() + + runner = CliRunner() + result = runner.invoke( + cli.main, + ['--config', f.name, '--force'] + ) + assert result.exit_code == 0 -- GitLab