def test_load_config(self): config = {'group1': {'a': 'b'}} mock_component_1 = mock.Mock() mock_component_1.config = { 'group1': { 'a': 'c', 'k': 'v' }, 'group2': { '1': '2' } } n = Nulecule('some-id', '0.0.2', {}, [], 'some/path') n.components = [mock_component_1] n.load_config(config) self.assertEqual(n.config, { 'group1': { 'a': 'b', 'k': 'v' }, 'group2': { '1': '2' } })
def unpack(self, update=False, dryrun=False, nodeps=False, config=None): """ Unpacks a Nulecule application from a Nulecule image to a path or load a Nulecule that already exists locally. Args: update (bool): Update existing Nulecule application in app_path, if True dryrun (bool): Do not make any change to the host system nodeps (bool): Do not unpack external dependencies config (dict): Config data, if any, to use for unpacking Returns: A Nulecule instance. """ logger.debug("Request to unpack to %s to %s" % (self.image, self.app_path)) # If the user provided an image then unpack it and return the # resulting Nulecule. Else, load from existing path if self.image: return Nulecule.unpack( self.image, self.app_path, config=config, nodeps=nodeps, dryrun=dryrun, update=update ) else: return Nulecule.load_from_path(self.app_path, dryrun=dryrun, config=config)
def test_load_components(self, MockNuleculeComponent): graph = [ { 'name': 'app1', 'source': 'docker://somecontainer', 'params': [] }, { 'name': 'app2', 'artifacts': [ {'a': 'b'} ] } ] config = Config(answers={}) n = Nulecule('some-id', '0.0.2', graph, 'some/path', config=config) n.load_components() MockNuleculeComponent.assert_any_call( graph[0]['name'], n.basepath, 'somecontainer', graph[0]['params'], None, config) MockNuleculeComponent.assert_any_call( graph[1]['name'], n.basepath, None, graph[1].get('params'), graph[1].get('artifacts'), config)
def unpack(self, update=False, dryrun=False, nodeps=False, config=None): """ Unpacks a Nulecule application from a Nulecule image to a path or load a Nulecule that already exists locally. Args: update (bool): Update existing Nulecule application in app_path, if True dryrun (bool): Do not make any change to the host system nodeps (bool): Do not unpack external dependencies config (dict): Config data, if any, to use for unpacking Returns: A Nulecule instance. """ logger.debug('Request to unpack to %s to %s' % (self.image, self.app_path)) # If the user provided an image then unpack it and return the # resulting Nulecule. Else, load from existing path if self.image: return Nulecule.unpack(self.image, self.app_path, config=config, nodeps=nodeps, dryrun=dryrun, update=update) else: return Nulecule.load_from_path(self.app_path, dryrun=dryrun, config=config)
def test_load_config_without_default_provider(self): """ Test Nulecule load_config without specifying a default provider. """ config = Config() params = [ { "name": "key1", "default": "val1", }, { "name": "key3", "default": "val3" } ] graph = [ { "name": "component1", "params": [ { "name": "key1", }, { "name": "key2", "default": "val2" } ], "artifacts": [] } ] n = Nulecule(id='some-id', specversion='0.0.2', metadata={}, graph=graph, params=params, basepath='some/path', config=config) n.load_components() n.load_config() self.assertEqual(n.config.runtime_answers(), { 'general': { 'namespace': 'default', 'provider': 'kubernetes', 'key1': 'val1', 'key3': 'val3' }, 'component1': { 'key2': 'val2' } }) self.assertEqual( n.components[0].config.context(n.components[0].namespace), {'key3': 'val3', 'key2': 'val2', 'key1': 'val1', 'namespace': 'default', 'provider': 'kubernetes'} )
def test_stop(self): provider = "docker" dryrun = False mock_component_1 = mock.Mock() mock_component_2 = mock.Mock() n = Nulecule("some-id", "0.0.2", {}, [], "some/path") n.components = [mock_component_1, mock_component_2] n.stop(provider) mock_component_1.stop.assert_called_once_with(provider, dryrun) mock_component_2.stop.assert_called_once_with(provider, dryrun)
def test_run(self): provider = 'docker' dryrun = False mock_component_1 = mock.Mock() mock_component_2 = mock.Mock() n = Nulecule('some-id', '0.0.2', {}, [], 'some/path') n.components = [mock_component_1, mock_component_2] n.run(provider) mock_component_1.run.assert_called_once_with(provider, dryrun) mock_component_2.run.assert_called_once_with(provider, dryrun)
def test_stop(self): provider = 'docker' dryrun = False mock_component_1 = mock.Mock() mock_component_2 = mock.Mock() n = Nulecule('some-id', '0.0.2', {}, [], 'some/path') n.components = [mock_component_1, mock_component_2] n.stop(provider) mock_component_1.stop.assert_called_once_with(provider, dryrun) mock_component_2.stop.assert_called_once_with(provider, dryrun)
def test_render(self): mock_component_1 = mock.Mock() mock_component_2 = mock.Mock() provider_key = "foo" dryrun = True n = Nulecule("some-id", "0.0.2", {}, [], "some/path") n.components = [mock_component_1, mock_component_2] n.render(provider_key, dryrun) mock_component_1.render.assert_called_once_with(provider_key=provider_key, dryrun=dryrun) mock_component_2.render.assert_called_once_with(provider_key=provider_key, dryrun=dryrun)
def test_run(self): provider = 'docker' dryrun = False mock_component_1 = mock.Mock() mock_component_2 = mock.Mock() config = Config(answers={}) n = Nulecule('some-id', '0.0.2', [{}], 'some/path', {}, config=config) n.components = [mock_component_1, mock_component_2] n.run(provider) mock_component_1.run.assert_called_once_with(provider, dryrun) mock_component_2.run.assert_called_once_with(provider, dryrun)
def test_render(self): mock_component_1 = mock.Mock() mock_component_2 = mock.Mock() provider_key = 'foo' dryrun = True n = Nulecule('some-id', '0.0.2', {}, [], 'some/path') n.components = [mock_component_1, mock_component_2] n.render(provider_key, dryrun) mock_component_1.render.assert_called_once_with( provider_key=provider_key, dryrun=dryrun) mock_component_2.render.assert_called_once_with( provider_key=provider_key, dryrun=dryrun)
def test_load_config_with_defaultprovider_overridden_by_provider_in_answers( self): """ Test Nulecule load_config with default provider specified in global params in Nulecule spec, but overridden in answers config. """ config = { 'general': { 'provider': 'new-provider' }, 'group1': { 'a': 'b' } } mock_component_1 = mock.Mock() mock_component_1.config = { 'group1': { 'a': 'c', 'k': 'v' }, 'group2': { '1': '2' } } n = Nulecule(id='some-id', specversion='0.0.2', metadata={}, graph=[], basepath='some/path', params=[{ 'name': 'provider', 'default': 'some-provider' }]) n.components = [mock_component_1] n.load_config(config) self.assertEqual( n.config, { 'general': { 'provider': 'new-provider' }, 'group1': { 'a': 'b', 'k': 'v' }, 'group2': { '1': '2' } })
def test_stop(self): provider = 'docker' dryrun = False mock_component_1 = mock.Mock() mock_component_2 = mock.Mock() config = Config(answers={}) n = Nulecule('some-id', '0.0.2', {}, [], 'some/path', config=config) n.components = [mock_component_1, mock_component_2] n.stop(provider) mock_component_1.stop.assert_called_once_with(provider, dryrun) mock_component_2.stop.assert_called_once_with(provider, dryrun)
def test_load_config_without_specified_provider(self): """ Test Nulecule load_config without specifying a provider. """ config = {"general": {}, "group1": {"a": "b"}} mock_component_1 = mock.Mock() mock_component_1.config = {"group1": {"a": "c", "k": "v"}, "group2": {"1": "2"}} n = Nulecule(id="some-id", specversion="0.0.2", metadata={}, graph=[], basepath="some/path") n.components = [mock_component_1] n.load_config(config) self.assertEqual( n.config, {"general": {"provider": "kubernetes"}, "group1": {"a": "b", "k": "v"}, "group2": {"1": "2"}} )
def test_load_components(self, MockNuleculeComponent): graph = [ {"name": "app1", "source": "docker://somecontainer", "params": []}, {"name": "app2", "artifacts": [{"a": "b"}]}, ] n = Nulecule("some-id", "0.0.2", graph, "some/path", {}) n.load_components() MockNuleculeComponent.assert_any_call( graph[0]["name"], n.basepath, "somecontainer", graph[0]["params"], None, {} ) MockNuleculeComponent.assert_any_call( graph[1]["name"], n.basepath, None, graph[1].get("params"), graph[1].get("artifacts"), {} )
def test_load_config(self): config = {'group1': {'a': 'b'}} mock_component_1 = mock.Mock() mock_component_1.config = { 'group1': {'a': 'c', 'k': 'v'}, 'group2': {'1': '2'} } n = Nulecule('some-id', '0.0.2', {}, [], 'some/path') n.components = [mock_component_1] n.load_config(config) self.assertEqual(n.config, { 'group1': {'a': 'b', 'k': 'v'}, 'group2': {'1': '2'} })
def test_load_config_external_app(self): """Test load config for external app""" params = [{ 'name': 'key1', 'description': 'key1' }, { 'name': 'key2', 'description': 'key2' }] initial_config = { 'general': { 'a': 'b', 'key2': 'val2' }, 'some-app': { 'key1': 'val1' } } config = Config(answers=initial_config) mock_nulecule = mock.Mock(name='nulecule', spec=Nulecule('some-id', '0.0.2', config, [], 'some/path')) nc = NuleculeComponent('some-app', 'some/path', params=params) nc._app = mock_nulecule nc.config = config nc.load_config() mock_nulecule.load_config.assert_called_once_with(config=config, ask=False, skip_asking=False)
def test_load_config_external_app(self, mock_merge_config): """Test load config for external app""" mock_nulecule = mock.Mock(name='nulecule', spec=Nulecule('some-id', '0.0.2', {}, [], 'some/path')) params = [{'name': 'key1'}, {'name': 'key2'}] initial_config = { 'general': { 'a': 'b', 'key2': 'val2' }, 'some-app': { 'key1': 'val1' } } nc = NuleculeComponent('some-app', 'some/path', params=params) nc._app = mock_nulecule nc.load_config(config=copy.deepcopy(initial_config)) mock_nulecule.load_config.assert_called_once_with(config={ 'general': { 'a': 'b', 'key2': 'val2' }, 'some-app': { 'key1': 'val1', 'key2': 'val2' } }, ask=False, skip_asking=False) mock_merge_config.assert_called_once_with(nc.config, mock_nulecule.config)
def test_load_config_without_specified_provider(self): """ Test Nulecule load_config without specifying a provider. """ config = {'general': {}, 'group1': {'a': 'b'}} mock_component_1 = mock.Mock() mock_component_1.config = { 'group1': {'a': 'c', 'k': 'v'}, 'group2': {'1': '2'} } n = Nulecule(id='some-id', specversion='0.0.2', metadata={}, graph=[], basepath='some/path') n.components = [mock_component_1] n.load_config(config) self.assertEqual(n.config, { 'general': {'provider': 'kubernetes'}, 'group1': {'a': 'b', 'k': 'v'}, 'group2': {'1': '2'} })
def test_load_components(self, MockNuleculeComponent): graph = [{ 'name': 'app1', 'source': 'docker://somecontainer', 'params': [] }, { 'name': 'app2', 'artifacts': [{ 'a': 'b' }] }] n = Nulecule('some-id', '0.0.2', graph, 'some/path', {}) n.load_components() MockNuleculeComponent.assert_any_call(graph[0]['name'], n.basepath, 'somecontainer', graph[0]['params'], None, {}) MockNuleculeComponent.assert_any_call(graph[1]['name'], n.basepath, None, graph[1].get('params'), graph[1].get('artifacts'), {})
def test_load_config_with_default_provider(self): """ Test Nulecule load_config with a default provider. """ config = Config(answers={}) params = [{ "name": "key1", "default": "val1", }, { "name": "key3", "default": "val3" }, { "name": "provider", "default": "docker" }] graph = [{ "name": "component1", "params": [{ "name": "key1", }, { "name": "key2", "default": "val2" }], "artifacts": [] }] n = Nulecule(id='some-id', specversion='0.0.2', metadata={}, graph=graph, params=params, basepath='some/path', config=config) n.load_components() n.load_config(config) self.assertEqual( n.config.runtime_answers(), { 'general': { 'namespace': 'default', 'provider': 'docker', 'key1': 'val1', 'key3': 'val3' }, 'component1': { 'key2': 'val2' } }) self.assertEqual( n.components[0].config.context(scope=n.components[0].namespace), { 'key3': 'val3', 'key2': 'val2', 'key1': 'val1', 'provider': 'docker', 'namespace': 'default' })
def test_load_config_with_defaultprovider(self): """ Test Nulecule load_config with default provider specified in global params in Nulecule spec. """ config = {'general': {}, 'group1': {'a': 'b'}} mock_component_1 = mock.Mock() mock_component_1.config = { 'group1': {'a': 'c', 'k': 'v'}, 'group2': {'1': '2'} } n = Nulecule(id='some-id', specversion='0.0.2', metadata={}, graph=[], basepath='some/path', params=[{'name': 'provider', 'default': 'some-provider'}]) n.components = [mock_component_1] n.load_config(config) self.assertEqual(n.config, { 'general': {'provider': 'some-provider'}, 'group1': {'a': 'b', 'k': 'v'}, 'group2': {'1': '2'} })
def test_load_config_with_defaultprovider_overridden_by_provider_in_answers(self): """ Test Nulecule load_config with default provider specified in global params in Nulecule spec, but overridden in answers config. """ config = {"general": {"provider": "new-provider"}, "group1": {"a": "b"}} mock_component_1 = mock.Mock() mock_component_1.config = {"group1": {"a": "c", "k": "v"}, "group2": {"1": "2"}} n = Nulecule( id="some-id", specversion="0.0.2", metadata={}, graph=[], basepath="some/path", params=[{"name": "provider", "default": "some-provider"}], ) n.components = [mock_component_1] n.load_config(config) self.assertEqual( n.config, {"general": {"provider": "new-provider"}, "group1": {"a": "b", "k": "v"}, "group2": {"1": "2"}} )
def test_load_config_without_specified_provider(self): """ Test Nulecule load_config without specifying a provider. """ config = {'general': {}, 'group1': {'a': 'b'}} mock_component_1 = mock.Mock() mock_component_1.config = { 'group1': { 'a': 'c', 'k': 'v' }, 'group2': { '1': '2' } } n = Nulecule(id='some-id', specversion='0.0.2', metadata={}, graph=[], basepath='some/path') n.components = [mock_component_1] n.load_config(config) self.assertEqual( n.config, { 'general': { 'provider': 'kubernetes' }, 'group1': { 'a': 'b', 'k': 'v' }, 'group2': { '1': '2' } })
def stop(self, **kwargs): """ Stops a running Nulecule application. Args: kwargs (dict): Extra keyword arguments """ # For stop we use the generated answer file from the run self.answers_file = os.path.join(self.app_path, ANSWERS_RUNTIME_FILE) self._process_answers() dryrun = kwargs.get("dryrun") or False self.nulecule = Nulecule.load_from_path(self.app_path, config=self.config, dryrun=dryrun) self.nulecule.load_config() self.nulecule.render(self.nulecule.config.get("provider"), dryrun=dryrun) self.nulecule.stop(self.nulecule.config.get("provider"), dryrun)
def stop(self, cli_provider, **kwargs): """ Stops a running Nulecule application. Args: cli_provider (str): Provider running the Nulecule application kwargs (dict): Extra keyword arguments """ # For stop we use the generated answer file from the run self.answers = Utils.loadAnswers(os.path.join(self.app_path, ANSWERS_RUNTIME_FILE)) dryrun = kwargs.get("dryrun") or False self.nulecule = Nulecule.load_from_path(self.app_path, config=self.answers, dryrun=dryrun) self.nulecule.load_config(config=self.answers) self.nulecule.render(cli_provider, dryrun=dryrun) self.nulecule.stop(cli_provider, dryrun)
def stop(self, cli_provider, **kwargs): """ Stops a running Nulecule application. Args: cli_provider (str): Provider running the Nulecule application kwargs (dict): Extra keyword arguments """ self.answers = Utils.loadAnswers( os.path.join(self.app_path, ANSWERS_RUNTIME_FILE)) dryrun = kwargs.get('dryrun') or False self.nulecule = Nulecule.load_from_path(self.app_path, config=self.answers, dryrun=dryrun) self.nulecule.load_config(config=self.answers) self.nulecule.render(cli_provider, dryrun=dryrun) self.nulecule.stop(cli_provider, dryrun)
def stop(self, cli_provider, **kwargs): """ Stops a running Nulecule application. Args: cli_provider (str): Provider running the Nulecule application kwargs (dict): Extra keyword arguments """ # For stop we use the generated answer file from the run self.answers_file = os.path.join(self.app_path, ANSWERS_RUNTIME_FILE) self._process_answers() dryrun = kwargs.get('dryrun') or False self.nulecule = Nulecule.load_from_path( self.app_path, config=self.answers, dryrun=dryrun) self.nulecule.load_config(config=self.answers) self.nulecule.render(cli_provider, dryrun=dryrun) self.nulecule.stop(cli_provider, dryrun)
def test_load_config_with_default_provider_overridden_by_answers(self): """ Test Nulecule load_config with default provider overridden by provider in answers. """ config = Config(answers={ 'general': { 'provider': 'openshift' } }) params = [ { "name": "key1", "default": "val1", }, { "name": "key3", "default": "val3" }, { "name": "provider", "default": "docker" } ] graph = [ { "name": "component1", "params": [ { "name": "key1", }, { "name": "key2", "default": "val2" } ], "artifacts": [] } ] n = Nulecule(id='some-id', specversion='0.0.2', metadata={}, graph=graph, params=params, basepath='some/path', config=config) n.load_components() n.load_config(config) self.assertEqual(n.config.runtime_answers(), { 'general': { 'namespace': 'default', 'provider': 'openshift', 'key1': 'val1', 'key3': 'val3' }, 'component1': { 'key2': 'val2' } }) self.assertEqual( n.components[0].config.context(n.components[0].namespace), {'key3': 'val3', 'key2': 'val2', 'key1': 'val1', 'namespace': 'default', 'provider': 'openshift'} )
def test_invalid_nulecule_format(self): n = Nulecule('some-id', '0.0.2', {}, [], 'some/path') with pytest.raises(NuleculeException): n.load_from_path(src=os.path.dirname(__file__) + '/invalid_nulecule/')
def test_missing_nulecule(self): n = Nulecule('some-id', '0.0.2', {}, [], 'some/path') with pytest.raises(NuleculeException): n.load_from_path(src='foo/bar')
def test_missing_nulecule(self): n = Nulecule("some-id", "0.0.2", {}, [], "some/path") with pytest.raises(NuleculeException): n.load_from_path(src="foo/bar")
def get_answers(nulecule_path): nulecule = Nulecule.load_from_path(nulecule_path) nulecule.config = Config() nulecule.load_config(skip_asking=True) return nulecule.config.runtime_answers()
def test_invalid_nulecule_format(self): n = Nulecule("some-id", "0.0.2", {}, [], "some/path") with pytest.raises(NuleculeException): n.load_from_path(src=os.path.dirname(__file__) + "/invalid_nulecule/")