diff --git a/magnumclient/tests/test_shell_args.py b/magnumclient/tests/test_shell_args.py index e4df568b..29dca312 100644 --- a/magnumclient/tests/test_shell_args.py +++ b/magnumclient/tests/test_shell_args.py @@ -640,13 +640,13 @@ class TestCommandLineArgument(utils.TestCase): @mock.patch('magnumclient.v1.services.ServiceManager.delete') def test_coe_service_delete_success(self, mock_delete): - self._test_arg_success('coe-service-delete xxx') + self._test_arg_success('coe-service-delete xxx zzz') self.assertTrue(mock_delete.called) self.assertEqual(1, mock_delete.call_count) @mock.patch('magnumclient.v1.services.ServiceManager.delete') def test_coe_service_delete_multiple_id_success(self, mock_delete): - self._test_arg_success('coe-service-delete xxx xyz') + self._test_arg_success('coe-service-delete xxx xyz zzz') self.assertTrue(mock_delete.called) self.assertEqual(2, mock_delete.call_count) @@ -657,7 +657,7 @@ class TestCommandLineArgument(utils.TestCase): @mock.patch('magnumclient.v1.services.ServiceManager.get') def test_coe_service_show_success(self, mock_show): - self._test_arg_success('coe-service-show xxx') + self._test_arg_success('coe-service-show xxx zzz') self.assertTrue(mock_show.called) @mock.patch('magnumclient.v1.services.ServiceManager.get') @@ -667,7 +667,7 @@ class TestCommandLineArgument(utils.TestCase): @mock.patch('magnumclient.v1.services.ServiceManager.update') def test_coe_service_update_success(self, mock_update): - self._test_arg_success('coe-service-update xxx replace xxx=xxx') + self._test_arg_success('coe-service-update xxx zzz replace xxx=xxx') self.assertTrue(mock_update.called) self.assertEqual(1, mock_update.call_count) diff --git a/magnumclient/tests/v1/test_services.py b/magnumclient/tests/v1/test_services.py index 4afe18d9..5a392154 100644 --- a/magnumclient/tests/v1/test_services.py +++ b/magnumclient/tests/v1/test_services.py @@ -57,7 +57,7 @@ fake_responses = { CREATE_SVC, ), }, - '/v1/services/%s' % SERVICE1['id']: + '/v1/services/%s/%s' % (SERVICE1['id'], SERVICE1['bay_uuid']): { 'GET': ( {}, @@ -72,7 +72,7 @@ fake_responses = { UPDATED_SVC, ), }, - '/v1/services/%s' % SERVICE1['name']: + '/v1/services/%s/%s' % (SERVICE1['name'], SERVICE1['bay_uuid']): { 'GET': ( {}, @@ -106,21 +106,25 @@ class ServiceManagerTest(testtools.TestCase): self.assertThat(services, matchers.HasLength(2)) def test_coe_service_show_by_id(self): - service = self.mgr.get(SERVICE1['id']) + service = self.mgr.get(SERVICE1['id'], SERVICE1['bay_uuid']) expect = [ - ('GET', '/v1/services/%s' % SERVICE1['id'], {}, None) + ('GET', '/v1/services/%s/%s' % (SERVICE1['id'], + SERVICE1['bay_uuid']), {}, None) ] self.assertEqual(expect, self.api.calls) self.assertEqual(SERVICE1['name'], service.name) + self.assertEqual(SERVICE1['bay_uuid'], service.bay_uuid) self.assertEqual(SERVICE1['ip'], service.ip) def test_coe_service_show_by_name(self): - service = self.mgr.get(SERVICE1['name']) + service = self.mgr.get(SERVICE1['name'], SERVICE1['bay_uuid']) expect = [ - ('GET', '/v1/services/%s' % SERVICE1['name'], {}, None) + ('GET', '/v1/services/%s/%s' % (SERVICE1['name'], + SERVICE1['bay_uuid']), {}, None) ] self.assertEqual(expect, self.api.calls) self.assertEqual(SERVICE1['name'], service.name) + self.assertEqual(SERVICE1['bay_uuid'], service.bay_uuid) self.assertEqual(SERVICE1['ip'], service.ip) def test_coe_service_create(self): @@ -141,17 +145,23 @@ class ServiceManagerTest(testtools.TestCase): self.assertEqual([], self.api.calls) def test_coe_service_delete_by_id(self): - service = self.mgr.delete(SERVICE1['id']) + service = self.mgr.delete(SERVICE1['id'], SERVICE1['bay_uuid']) expect = [ - ('DELETE', '/v1/services/%s' % SERVICE1['id'], {}, None), + ('DELETE', '/v1/services/%s/%s' % (SERVICE1['id'], + SERVICE1['bay_uuid']), + {}, + None), ] self.assertEqual(expect, self.api.calls) self.assertIsNone(service) def test_coe_service_delete_by_name(self): - service = self.mgr.delete(SERVICE1['name']) + service = self.mgr.delete(SERVICE1['name'], SERVICE1['bay_uuid']) expect = [ - ('DELETE', '/v1/services/%s' % SERVICE1['name'], {}, None), + ('DELETE', '/v1/services/%s/%s' % (SERVICE1['name'], + SERVICE1['bay_uuid']), + {}, + None), ] self.assertEqual(expect, self.api.calls) self.assertIsNone(service) @@ -160,9 +170,14 @@ class ServiceManagerTest(testtools.TestCase): patch = {'op': 'replace', 'value': NEW_SELECTOR, 'path': '/selector'} - service = self.mgr.update(service_id=SERVICE1['id'], patch=patch) + service = self.mgr.update(service_id=SERVICE1['id'], + bay_uuid=SERVICE1['bay_uuid'], + patch=patch) expect = [ - ('PATCH', '/v1/services/%s' % SERVICE1['id'], {}, patch), + ('PATCH', '/v1/services/%s/%s' % (SERVICE1['id'], + SERVICE1['bay_uuid']), + {}, + patch), ] self.assertEqual(expect, self.api.calls) self.assertEqual(NEW_SELECTOR, service.selector) diff --git a/magnumclient/tests/v1/test_shell.py b/magnumclient/tests/v1/test_shell.py index 92a3d150..c446f93b 100644 --- a/magnumclient/tests/v1/test_shell.py +++ b/magnumclient/tests/v1/test_shell.py @@ -606,6 +606,8 @@ class ShellTest(base.TestCase): args = mock.MagicMock() service_id = 'id' args.service = service_id + bay_uuid = 'uuid' + args.bay = bay_uuid op = 'replace' args.op = op attributes = 'manifest={}' @@ -615,25 +617,33 @@ class ShellTest(base.TestCase): shell.magnum_utils.args_array_to_patch.return_value = patch shell.do_coe_service_update(client_mock, args) - client_mock.services.update.assert_called_once_with(service_id, patch) + client_mock.services.update.assert_called_once_with(service_id, + bay_uuid, + patch) def test_do_coe_service_delete(self): client_mock = mock.MagicMock() args = mock.MagicMock() service_id = 'id' + bay_uuid = 'uuid' args.services = [service_id] + args.bay = bay_uuid shell.do_coe_service_delete(client_mock, args) - client_mock.services.delete.assert_called_once_with(service_id) + client_mock.services.delete.assert_called_once_with(service_id, + bay_uuid) def test_do_coe_service_show(self): client_mock = mock.MagicMock() args = mock.MagicMock() service_id = 'id' + bay_uuid = 'uuid' args.service = service_id + args.bay = bay_uuid shell.do_coe_service_show(client_mock, args) - client_mock.services.get.assert_called_once_with(service_id) + client_mock.services.get.assert_called_once_with(service_id, + bay_uuid) def test_do_container_create(self): client_mock = mock.MagicMock() diff --git a/magnumclient/v1/services.py b/magnumclient/v1/services.py index 0a2673b9..45244512 100644 --- a/magnumclient/v1/services.py +++ b/magnumclient/v1/services.py @@ -28,8 +28,11 @@ class ServiceManager(base.Manager): resource_class = Service @staticmethod - def _path(id=None): - return '/v1/services/%s' % id if id else '/v1/services' + def _path(id=None, bay_uuid=None): + if id and bay_uuid: + return '/v1/services/%s/%s' % (id, bay_uuid) + else: + return '/v1/services' def list(self, marker=None, limit=None, sort_key=None, sort_dir=None, detail=False): @@ -75,9 +78,9 @@ class ServiceManager(base.Manager): return self._list_pagination(self._path(path), "services", limit=limit) - def get(self, service_id): + def get(self, service_id, bay_uuid): try: - return self._list(self._path(service_id))[0] + return self._list(self._path(service_id, bay_uuid))[0] except IndexError: return None @@ -91,8 +94,8 @@ class ServiceManager(base.Manager): "Key must be in %s" % ",".join(CREATION_ATTRIBUTES)) return self._create(self._path(), new) - def delete(self, service_id): - return self._delete(self._path(service_id)) + def delete(self, service_id, bay_uuid): + return self._delete(self._path(service_id, bay_uuid)) - def update(self, service_id, patch): - return self._update(self._path(service_id), patch) + def update(self, service_id, bay_uuid, patch): + return self._update(self._path(service_id, bay_uuid), patch) diff --git a/magnumclient/v1/shell.py b/magnumclient/v1/shell.py index 2d8f31a5..1659ed13 100644 --- a/magnumclient/v1/shell.py +++ b/magnumclient/v1/shell.py @@ -606,6 +606,7 @@ def do_coe_service_create(cs, args): @utils.arg('service', metavar='', help="UUID or name of service") +@utils.arg('bay', metavar='', help="UUID of Bay") @utils.arg( 'op', metavar='', @@ -627,7 +628,7 @@ def do_coe_service_update(cs, args): with open(p['value'], 'r') as f: p['value'] = f.read() - service = cs.services.update(args.service, patch) + service = cs.services.update(args.service, args.bay, patch) _show_coe_service(service) @@ -635,11 +636,12 @@ def do_coe_service_update(cs, args): metavar='', nargs='+', help='ID or name of the (service)s to delete.') +@utils.arg('bay', metavar='', help="UUID of Bay") def do_coe_service_delete(cs, args): """Delete specified coe service(s).""" for service in args.services: try: - cs.services.delete(service) + cs.services.delete(service, args.bay) except Exception as e: print("Delete for service %(service)s failed: %(e)s" % {'service': service, 'e': e}) @@ -648,9 +650,10 @@ def do_coe_service_delete(cs, args): @utils.arg('service', metavar='', help='ID or name of the service to show.') +@utils.arg('bay', metavar='', help="UUID of Bay") def do_coe_service_show(cs, args): """Show details about the given coe service.""" - service = cs.services.get(args.service) + service = cs.services.get(args.service, args.bay) _show_coe_service(service)