From 5d1066f232b153a2ccdcd65241784a766ec9aae0 Mon Sep 17 00:00:00 2001 From: John Dewey Date: Fri, 6 Jan 2017 14:20:02 -0800 Subject: [PATCH] Add state management to destroy, create, converge The destroy, create, and converge sub commands are logging their state to the state file. We will then make decisions off of that data later. --- molecule/command/converge.py | 2 ++ molecule/command/create.py | 2 ++ molecule/command/destroy.py | 2 ++ molecule/state.py | 14 ++++++++++++-- test/unit/command/test_converge.py | 2 ++ test/unit/command/test_create.py | 2 ++ test/unit/command/test_destroy.py | 3 +++ test/unit/test_state.py | 29 +++++++++++++++++------------ 8 files changed, 42 insertions(+), 14 deletions(-) diff --git a/molecule/command/converge.py b/molecule/command/converge.py index 2b4c87500..3b2e1bf8b 100644 --- a/molecule/command/converge.py +++ b/molecule/command/converge.py @@ -57,6 +57,8 @@ def execute(self): self._config.provisioner.inventory_file, self._config.scenario.converge) + self._config.state.change_state('converged', True) + @click.command() @click.pass_context diff --git a/molecule/command/create.py b/molecule/command/create.py index 2c9aab1ee..4690d6a7b 100644 --- a/molecule/command/create.py +++ b/molecule/command/create.py @@ -56,6 +56,8 @@ def execute(self): self._config.provisioner.inventory_file, self._config.scenario.setup) + self._config.state.change_state('created', True) + @click.command() @click.pass_context diff --git a/molecule/command/destroy.py b/molecule/command/destroy.py index d7083cbe0..e0e8feea3 100644 --- a/molecule/command/destroy.py +++ b/molecule/command/destroy.py @@ -56,6 +56,8 @@ def execute(self): self._config.provisioner.inventory_file, self._config.scenario.teardown) + self._config.state.reset() + @click.command() @click.pass_context diff --git a/molecule/state.py b/molecule/state.py index cbf6d7f7d..d768bc1b0 100644 --- a/molecule/state.py +++ b/molecule/state.py @@ -24,7 +24,10 @@ from molecule import util -VALID_KEYS = ['created', ] +VALID_KEYS = [ + 'created', + 'converged', +] class InvalidState(Exception): @@ -66,6 +69,10 @@ def wrapper(self, *args, **kwargs): def state_file(self): return self._state_file + @property + def converged(self): + return self._data.get('converged') + @property def created(self): return self._data.get('created') @@ -96,7 +103,10 @@ def _get_data(self): return self._default_data() def _default_data(self): - return {"created": None, } + return { + 'converged': None, + 'created': None, + } def _load_file(self): with open(self.state_file) as stream: diff --git a/test/unit/command/test_converge.py b/test/unit/command/test_converge.py index 6b0b7e756..f2b9e1cd2 100644 --- a/test/unit/command/test_converge.py +++ b/test/unit/command/test_converge.py @@ -36,3 +36,5 @@ def test_execute(mocker, patched_print_info, patched_ansible_converge, patched_ansible_converge.assert_called_once_with( config_instance.provisioner.inventory_file, config_instance.scenario.converge) + + assert config_instance.state.converged diff --git a/test/unit/command/test_create.py b/test/unit/command/test_create.py index 2f625d5cb..61e1d48cf 100644 --- a/test/unit/command/test_create.py +++ b/test/unit/command/test_create.py @@ -36,3 +36,5 @@ def test_execute(mocker, patched_print_info, patched_ansible_converge, patched_ansible_converge.assert_called_once_with( config_instance.provisioner.inventory_file, config_instance.scenario.setup) + + assert config_instance.state.created diff --git a/test/unit/command/test_destroy.py b/test/unit/command/test_destroy.py index 4a457041d..091f1251d 100644 --- a/test/unit/command/test_destroy.py +++ b/test/unit/command/test_destroy.py @@ -36,3 +36,6 @@ def test_execute(mocker, patched_print_info, patched_ansible_converge, patched_ansible_converge.assert_called_once_with( config_instance.provisioner.inventory_file, config_instance.scenario.teardown) + + assert not config_instance.state.converged + assert not config_instance.state.created diff --git a/test/unit/test_state.py b/test/unit/test_state.py index 8ef256970..749aa9837 100644 --- a/test/unit/test_state.py +++ b/test/unit/test_state.py @@ -41,39 +41,43 @@ def test_state_file_property(state_instance): assert x == state_instance.state_file +def test_converged(state_instance): + assert not state_instance.converged + + def test_created(state_instance): assert not state_instance.created def test_reset(state_instance): - assert not state_instance.created + assert not state_instance.converged - state_instance.change_state('created', True) - assert state_instance.created + state_instance.change_state('converged', True) + assert state_instance.converged state_instance.reset() - assert not state_instance.created + assert not state_instance.converged def test_reset_persists(state_instance): - assert not state_instance.created + assert not state_instance.converged - state_instance.change_state('created', True) - assert state_instance.created + state_instance.change_state('converged', True) + assert state_instance.converged state_instance.reset() - assert not state_instance.created + assert not state_instance.converged with open(state_instance.state_file) as stream: d = yaml.safe_load(stream) - assert not d.get('created') + assert not d.get('converged') def test_change_state(state_instance): - state_instance.change_state('created', True) + state_instance.change_state('converged', True) - assert state_instance.created + assert state_instance.converged def test_change_state_raises(state_instance): @@ -91,10 +95,11 @@ def test_get_data_loads_existing_state_file(temp_dir): os.makedirs(ephemeral_directory) - data = {'created': True} + data = {'converged': False, 'created': True} util.write_file(state_file, yaml.safe_dump(data)) c = config.Config(molecule_file) s = state.State(c) + assert not s.converged assert s.created