diff --git a/solumclient/solum.py b/solumclient/solum.py index 145faeb..0bd0cfa 100644 --- a/solumclient/solum.py +++ b/solumclient/solum.py @@ -79,16 +79,17 @@ class AppCommands(cli_utils.CommandsBase): def delete(self): """Delete an application.""" self.parser.add_argument('plan_uuid', - help="Tenant/project-wide unique plan uuid") + help="Tenant/project-wide unique " + "plan uuid or name") args = self.parser.parse_args() - self.client.plans.delete(plan_id=args.plan_uuid) + self.client.plans.find(name_or_id=args.plan_uuid).delete() def show(self): """Show an application's resource.""" self.parser.add_argument('plan_uuid', - help="Plan uuid") + help="Plan uuid or name") args = self.parser.parse_args() - response = self.client.plans.get(plan_id=args.plan_uuid) + response = self.client.plans.find(name_or_id=args.plan_uuid) fields = ['uuid', 'name', 'description', 'uri'] data = dict([(f, getattr(response, f, '')) for f in fields]) @@ -122,9 +123,9 @@ class AssemblyCommands(cli_utils.CommandsBase): def delete(self): """Delete an assembly.""" self.parser.add_argument('assembly_uuid', - help="Assembly uuid") + help="Assembly uuid or name") args = self.parser.parse_args() - self.client.assemblies.delete(assembly_id=args.assembly_uuid) + self.client.assemblies.find(name_or_id=args.assembly_uuid).delete() def list(self): """List all assemblies.""" @@ -135,9 +136,9 @@ class AssemblyCommands(cli_utils.CommandsBase): def show(self): """Show an assembly's resource.""" self.parser.add_argument('assembly_uuid', - help="Assembly uuid") + help="Assembly uuid or name") args = self.parser.parse_args() - response = self.client.assemblies.get(assembly_id=args.assembly_uuid) + response = self.client.assemblies.find(name_or_id=args.assembly_uuid) fields = ['uuid', 'name', 'description', 'status', 'application_uri', 'trigger_uri'] data = dict([(f, getattr(response, f, '')) diff --git a/solumclient/tests/test_solum.py b/solumclient/tests/test_solum.py index 613e217..ae510c6 100644 --- a/solumclient/tests/test_solum.py +++ b/solumclient/tests/test_solum.py @@ -15,6 +15,7 @@ import json import re import sys +import uuid import fixtures import mock @@ -111,29 +112,40 @@ class TestSolum(base.TestCase): @mock.patch.object(assembly.AssemblyManager, "create") def test_assembly_create(self, mock_assembly_create): self.make_env() - self.shell("assembly create fake-plan-uri --assembly=test") - mock_assembly_create.assert_called_once_with(name='test', - plan_uri='fake-plan-uri') + self.shell("assembly create http://example.com/a.yaml --assembly=test") + mock_assembly_create.assert_called_once_with( + name='test', + plan_uri='http://example.com/a.yaml') @mock.patch.object(assembly.AssemblyManager, "create") def test_assembly_create_without_name(self, mock_assembly_create): self.make_env() - self.shell("assembly create fake-plan-uri") - mock_assembly_create.assert_called_once_with(name=None, - plan_uri='fake-plan-uri') + self.shell("assembly create http://example.com/a.yaml") + mock_assembly_create.assert_called_once_with( + name=None, + plan_uri='http://example.com/a.yaml') - @mock.patch.object(assembly.AssemblyManager, "delete") - def test_assembly_delete(self, mock_assembly_delete): + @mock.patch.object(assembly.AssemblyManager, "find") + def test_assembly_delete(self, mock_assembly_find): self.make_env() - self.shell("assembly delete fake-assembly-id") - mock_assembly_delete.assert_called_once_with( - assembly_id='fake-assembly-id') + the_id = str(uuid.uuid4()) + self.shell("assembly delete %s" % the_id) + mock_assembly_find.assert_called_once_with( + name_or_id=the_id) + mock_assembly_find.return_value.delete.assert_called_once_with() - @mock.patch.object(assembly.AssemblyManager, "get") - def test_assembly_get(self, mock_assembly_get): + @mock.patch.object(assembly.AssemblyManager, "find") + def test_assembly_get(self, mock_assembly_find): self.make_env() - self.shell("assembly show test_uuid_1") - mock_assembly_get.assert_called_once_with(assembly_id='test_uuid_1') + the_id = str(uuid.uuid4()) + self.shell("assembly show %s" % the_id) + mock_assembly_find.assert_called_once_with(name_or_id=the_id) + + @mock.patch.object(assembly.AssemblyManager, "find") + def test_assembly_get_by_name(self, mock_assembly_find): + self.make_env() + self.shell("assembly show app2") + mock_assembly_find.assert_called_once_with(name_or_id='app2') # Plan Tests # @mock.patch.object(plan.PlanManager, "create") @@ -148,17 +160,20 @@ class TestSolum(base.TestCase): self.shell("app list") mock_app_list.assert_called_once_with() - @mock.patch.object(plan.PlanManager, "delete") - def test_app_delete(self, mock_app_delete): + @mock.patch.object(plan.PlanManager, "find") + def test_app_delete(self, mock_app_find): self.make_env() - self.shell("app delete fake-id") - mock_app_delete.assert_called_once_with(plan_id='fake-id') + the_id = str(uuid.uuid4()) + self.shell("app delete %s" % the_id) + mock_app_find.assert_called_once_with(name_or_id=the_id) + mock_app_find.return_value.delete.assert_called_once_with() - @mock.patch.object(plan.PlanManager, "get") - def test_app_get(self, mock_app_get): + @mock.patch.object(plan.PlanManager, "find") + def test_app_get(self, mock_app_find): self.make_env() - self.shell("app show fake-id") - mock_app_get.assert_called_once_with(plan_id='fake-id') + the_id = str(uuid.uuid4()) + self.shell("app show %s" % the_id) + mock_app_find.assert_called_once_with(name_or_id=the_id) # LanguagePack Tests # @mock.patch.object(languagepack.LanguagePackManager, "list") diff --git a/solumclient/tests/v1/test_assembly.py b/solumclient/tests/v1/test_assembly.py index 17ae390..1295f45 100644 --- a/solumclient/tests/v1/test_assembly.py +++ b/solumclient/tests/v1/test_assembly.py @@ -12,6 +12,7 @@ # License for the specific language governing permissions and limitations # under the License. +from solumclient.openstack.common.apiclient import exceptions from solumclient.openstack.common.apiclient import fake_client from solumclient.tests import base from solumclient.v1 import assembly @@ -122,6 +123,28 @@ class AssemblyManagerTest(base.TestCase): self.assertEqual(assembly_list[0]['uri'], assemblies[0].uri) self.assertEqual(assembly_list[1]['uri'], assemblies[1].uri) + def test_find_one(self): + fake_http_client = fake_client.FakeHTTPClient(fixtures=fixtures_list) + api_client = sclient.Client(fake_http_client) + mgr = assembly.AssemblyManager(api_client) + assemblies = mgr.findall(name='database') + self.assertEqual(len(assemblies), 1) + self.assertIn('Assembly', repr(assemblies[0])) + self.assertEqual(assembly_list[0]['uri'], assemblies[0].uri) + + def test_find_one_only(self): + fake_http_client = fake_client.FakeHTTPClient(fixtures=fixtures_list) + api_client = sclient.Client(fake_http_client) + mgr = assembly.AssemblyManager(api_client) + result = mgr.find(name_or_id='database') + self.assertEqual(assembly_list[0]['uri'], result.uri) + + def test_find_none(self): + fake_http_client = fake_client.FakeHTTPClient(fixtures=fixtures_list) + api_client = sclient.Client(fake_http_client) + mgr = assembly.AssemblyManager(api_client) + self.assertRaises(exceptions.NotFound, mgr.find, name_or_id='what') + def test_create(self): fake_http_client = fake_client.FakeHTTPClient(fixtures=fixtures_create) api_client = sclient.Client(fake_http_client) diff --git a/solumclient/v1/assembly.py b/solumclient/v1/assembly.py index 97ff1d4..46e8b87 100644 --- a/solumclient/v1/assembly.py +++ b/solumclient/v1/assembly.py @@ -14,6 +14,7 @@ from solumclient.common import base as solum_base from solumclient.openstack.common.apiclient import base as apiclient_base +from solumclient.openstack.common import uuidutils class Assembly(apiclient_base.Resource): @@ -21,7 +22,7 @@ class Assembly(apiclient_base.Resource): return "" % self._info -class AssemblyManager(solum_base.CrudManager): +class AssemblyManager(solum_base.CrudManager, solum_base.FindMixin): resource_class = Assembly collection_key = 'assemblies' key = 'assembly' @@ -40,3 +41,15 @@ class AssemblyManager(solum_base.CrudManager): def delete(self, **kwargs): return super(AssemblyManager, self).delete(base_url="/v1", **kwargs) + + def find(self, **kwargs): + if 'assembly_id' in kwargs: + return super(AssemblyManager, self).get(base_url="/v1", **kwargs) + elif 'name_or_id' in kwargs: + name_or_uuid = kwargs['name_or_id'] + if uuidutils.is_uuid_like(name_or_uuid): + return super(AssemblyManager, self).get( + base_url="/v1", + assembly_id=name_or_uuid) + else: + return super(AssemblyManager, self).findone(name=name_or_uuid) diff --git a/solumclient/v1/plan.py b/solumclient/v1/plan.py index e4e9b90..43b4009 100644 --- a/solumclient/v1/plan.py +++ b/solumclient/v1/plan.py @@ -16,6 +16,7 @@ import six from solumclient.common import base as solum_base from solumclient.openstack.common.apiclient import base as apiclient_base +from solumclient.openstack.common import uuidutils class Requirement(apiclient_base.Resource): @@ -74,7 +75,7 @@ class Plan(apiclient_base.Resource): pass -class PlanManager(solum_base.CrudManager): +class PlanManager(solum_base.CrudManager, solum_base.FindMixin): resource_class = Plan collection_key = 'plans' key = 'plan' @@ -94,6 +95,17 @@ class PlanManager(solum_base.CrudManager): def get(self, **kwargs): return super(PlanManager, self).get(base_url="/v1", **kwargs) + def find(self, **kwargs): + if 'plan_id' in kwargs: + return super(PlanManager, self).get(base_url="/v1", **kwargs) + elif 'name_or_id' in kwargs: + name_or_uuid = kwargs['name_or_id'] + if uuidutils.is_uuid_like(name_or_uuid): + return super(PlanManager, self).get(base_url="/v1", + plan_id=name_or_uuid) + else: + return super(PlanManager, self).findone(name=name_or_uuid) + def put(self, plan, **kwargs): kwargs = self._filter_kwargs(kwargs) kwargs['data'] = plan