Allow showing/deleting by name as well as uuid

Partial-bug: #1294505
Change-Id: I543b17160882c8a6c39fdf871377d348605e8505
This commit is contained in:
Angus Salkeld
2014-05-09 07:24:58 +10:00
parent 08b70c3e74
commit ed897d398f
5 changed files with 97 additions and 33 deletions

View File

@@ -79,16 +79,17 @@ class AppCommands(cli_utils.CommandsBase):
def delete(self): def delete(self):
"""Delete an application.""" """Delete an application."""
self.parser.add_argument('plan_uuid', 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() 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): def show(self):
"""Show an application's resource.""" """Show an application's resource."""
self.parser.add_argument('plan_uuid', self.parser.add_argument('plan_uuid',
help="Plan uuid") help="Plan uuid or name")
args = self.parser.parse_args() 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'] fields = ['uuid', 'name', 'description', 'uri']
data = dict([(f, getattr(response, f, '')) data = dict([(f, getattr(response, f, ''))
for f in fields]) for f in fields])
@@ -122,9 +123,9 @@ class AssemblyCommands(cli_utils.CommandsBase):
def delete(self): def delete(self):
"""Delete an assembly.""" """Delete an assembly."""
self.parser.add_argument('assembly_uuid', self.parser.add_argument('assembly_uuid',
help="Assembly uuid") help="Assembly uuid or name")
args = self.parser.parse_args() 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): def list(self):
"""List all assemblies.""" """List all assemblies."""
@@ -135,9 +136,9 @@ class AssemblyCommands(cli_utils.CommandsBase):
def show(self): def show(self):
"""Show an assembly's resource.""" """Show an assembly's resource."""
self.parser.add_argument('assembly_uuid', self.parser.add_argument('assembly_uuid',
help="Assembly uuid") help="Assembly uuid or name")
args = self.parser.parse_args() 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', fields = ['uuid', 'name', 'description', 'status', 'application_uri',
'trigger_uri'] 'trigger_uri']
data = dict([(f, getattr(response, f, '')) data = dict([(f, getattr(response, f, ''))

View File

@@ -15,6 +15,7 @@
import json import json
import re import re
import sys import sys
import uuid
import fixtures import fixtures
import mock import mock
@@ -111,29 +112,40 @@ class TestSolum(base.TestCase):
@mock.patch.object(assembly.AssemblyManager, "create") @mock.patch.object(assembly.AssemblyManager, "create")
def test_assembly_create(self, mock_assembly_create): def test_assembly_create(self, mock_assembly_create):
self.make_env() self.make_env()
self.shell("assembly create fake-plan-uri --assembly=test") self.shell("assembly create http://example.com/a.yaml --assembly=test")
mock_assembly_create.assert_called_once_with(name='test', mock_assembly_create.assert_called_once_with(
plan_uri='fake-plan-uri') name='test',
plan_uri='http://example.com/a.yaml')
@mock.patch.object(assembly.AssemblyManager, "create") @mock.patch.object(assembly.AssemblyManager, "create")
def test_assembly_create_without_name(self, mock_assembly_create): def test_assembly_create_without_name(self, mock_assembly_create):
self.make_env() self.make_env()
self.shell("assembly create fake-plan-uri") self.shell("assembly create http://example.com/a.yaml")
mock_assembly_create.assert_called_once_with(name=None, mock_assembly_create.assert_called_once_with(
plan_uri='fake-plan-uri') name=None,
plan_uri='http://example.com/a.yaml')
@mock.patch.object(assembly.AssemblyManager, "delete") @mock.patch.object(assembly.AssemblyManager, "find")
def test_assembly_delete(self, mock_assembly_delete): def test_assembly_delete(self, mock_assembly_find):
self.make_env() self.make_env()
self.shell("assembly delete fake-assembly-id") the_id = str(uuid.uuid4())
mock_assembly_delete.assert_called_once_with( self.shell("assembly delete %s" % the_id)
assembly_id='fake-assembly-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") @mock.patch.object(assembly.AssemblyManager, "find")
def test_assembly_get(self, mock_assembly_get): def test_assembly_get(self, mock_assembly_find):
self.make_env() self.make_env()
self.shell("assembly show test_uuid_1") the_id = str(uuid.uuid4())
mock_assembly_get.assert_called_once_with(assembly_id='test_uuid_1') 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 # # Plan Tests #
@mock.patch.object(plan.PlanManager, "create") @mock.patch.object(plan.PlanManager, "create")
@@ -148,17 +160,20 @@ class TestSolum(base.TestCase):
self.shell("app list") self.shell("app list")
mock_app_list.assert_called_once_with() mock_app_list.assert_called_once_with()
@mock.patch.object(plan.PlanManager, "delete") @mock.patch.object(plan.PlanManager, "find")
def test_app_delete(self, mock_app_delete): def test_app_delete(self, mock_app_find):
self.make_env() self.make_env()
self.shell("app delete fake-id") the_id = str(uuid.uuid4())
mock_app_delete.assert_called_once_with(plan_id='fake-id') 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") @mock.patch.object(plan.PlanManager, "find")
def test_app_get(self, mock_app_get): def test_app_get(self, mock_app_find):
self.make_env() self.make_env()
self.shell("app show fake-id") the_id = str(uuid.uuid4())
mock_app_get.assert_called_once_with(plan_id='fake-id') self.shell("app show %s" % the_id)
mock_app_find.assert_called_once_with(name_or_id=the_id)
# LanguagePack Tests # # LanguagePack Tests #
@mock.patch.object(languagepack.LanguagePackManager, "list") @mock.patch.object(languagepack.LanguagePackManager, "list")

View File

@@ -12,6 +12,7 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
from solumclient.openstack.common.apiclient import exceptions
from solumclient.openstack.common.apiclient import fake_client from solumclient.openstack.common.apiclient import fake_client
from solumclient.tests import base from solumclient.tests import base
from solumclient.v1 import assembly 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[0]['uri'], assemblies[0].uri)
self.assertEqual(assembly_list[1]['uri'], assemblies[1].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): def test_create(self):
fake_http_client = fake_client.FakeHTTPClient(fixtures=fixtures_create) fake_http_client = fake_client.FakeHTTPClient(fixtures=fixtures_create)
api_client = sclient.Client(fake_http_client) api_client = sclient.Client(fake_http_client)

View File

@@ -14,6 +14,7 @@
from solumclient.common import base as solum_base from solumclient.common import base as solum_base
from solumclient.openstack.common.apiclient import base as apiclient_base from solumclient.openstack.common.apiclient import base as apiclient_base
from solumclient.openstack.common import uuidutils
class Assembly(apiclient_base.Resource): class Assembly(apiclient_base.Resource):
@@ -21,7 +22,7 @@ class Assembly(apiclient_base.Resource):
return "<Assembly %s>" % self._info return "<Assembly %s>" % self._info
class AssemblyManager(solum_base.CrudManager): class AssemblyManager(solum_base.CrudManager, solum_base.FindMixin):
resource_class = Assembly resource_class = Assembly
collection_key = 'assemblies' collection_key = 'assemblies'
key = 'assembly' key = 'assembly'
@@ -40,3 +41,15 @@ class AssemblyManager(solum_base.CrudManager):
def delete(self, **kwargs): def delete(self, **kwargs):
return super(AssemblyManager, self).delete(base_url="/v1", **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)

View File

@@ -16,6 +16,7 @@ import six
from solumclient.common import base as solum_base from solumclient.common import base as solum_base
from solumclient.openstack.common.apiclient import base as apiclient_base from solumclient.openstack.common.apiclient import base as apiclient_base
from solumclient.openstack.common import uuidutils
class Requirement(apiclient_base.Resource): class Requirement(apiclient_base.Resource):
@@ -74,7 +75,7 @@ class Plan(apiclient_base.Resource):
pass pass
class PlanManager(solum_base.CrudManager): class PlanManager(solum_base.CrudManager, solum_base.FindMixin):
resource_class = Plan resource_class = Plan
collection_key = 'plans' collection_key = 'plans'
key = 'plan' key = 'plan'
@@ -94,6 +95,17 @@ class PlanManager(solum_base.CrudManager):
def get(self, **kwargs): def get(self, **kwargs):
return super(PlanManager, self).get(base_url="/v1", **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): def put(self, plan, **kwargs):
kwargs = self._filter_kwargs(kwargs) kwargs = self._filter_kwargs(kwargs)
kwargs['data'] = plan kwargs['data'] = plan