diff --git a/openstackclient/identity/v3/endpoint.py b/openstackclient/identity/v3/endpoint.py index 5b8104e514..52db5ace59 100644 --- a/openstackclient/identity/v3/endpoint.py +++ b/openstackclient/identity/v3/endpoint.py @@ -27,6 +27,13 @@ from openstackclient.common import utils from openstackclient.identity import common +def get_service_name(service): + if hasattr(service, 'name'): + return service.name + else: + return '' + + class CreateEndpoint(show.ShowOne): """Create new endpoint""" @@ -87,7 +94,7 @@ class CreateEndpoint(show.ShowOne): info = {} endpoint._info.pop('links') info.update(endpoint._info) - info['service_name'] = service.name + info['service_name'] = get_service_name(service) info['service_type'] = service.type return zip(*sorted(six.iteritems(info))) @@ -157,7 +164,7 @@ class ListEndpoint(lister.Lister): for ep in data: service = common.find_service(identity_client, ep.service_id) - ep.service_name = service.name + ep.service_name = get_service_name(service) ep.service_type = service.type return (columns, (utils.get_item_properties( @@ -274,6 +281,6 @@ class ShowEndpoint(show.ShowOne): info = {} endpoint._info.pop('links') info.update(endpoint._info) - info['service_name'] = service.name + info['service_name'] = get_service_name(service) info['service_type'] = service.type return zip(*sorted(six.iteritems(info))) diff --git a/openstackclient/tests/identity/v3/fakes.py b/openstackclient/tests/identity/v3/fakes.py index 3afb0cd90d..68e67519dc 100644 --- a/openstackclient/tests/identity/v3/fakes.py +++ b/openstackclient/tests/identity/v3/fakes.py @@ -158,6 +158,14 @@ SERVICE = { 'links': base_url + 'services/' + service_id, } +SERVICE_WITHOUT_NAME = { + 'id': service_id, + 'type': service_type, + 'description': service_description, + 'enabled': True, + 'links': base_url + 'services/' + service_id, +} + endpoint_id = 'e-123' endpoint_url = 'http://127.0.0.1:35357' endpoint_region = 'RegionOne' diff --git a/openstackclient/tests/identity/v3/test_endpoint.py b/openstackclient/tests/identity/v3/test_endpoint.py index ea05326e20..ecfa71ab3c 100644 --- a/openstackclient/tests/identity/v3/test_endpoint.py +++ b/openstackclient/tests/identity/v3/test_endpoint.py @@ -31,6 +31,9 @@ class TestEndpoint(identity_fakes.TestIdentityv3): self.services_mock = self.app.client_manager.identity.services self.services_mock.reset_mock() + def get_fake_service_name(self): + return identity_fakes.service_name + class TestEndpointCreate(TestEndpoint): @@ -92,7 +95,7 @@ class TestEndpointCreate(TestEndpoint): identity_fakes.endpoint_interface, identity_fakes.endpoint_region, identity_fakes.service_id, - identity_fakes.service_name, + self.get_fake_service_name(), identity_fakes.service_type, identity_fakes.endpoint_url, ) @@ -139,7 +142,7 @@ class TestEndpointCreate(TestEndpoint): identity_fakes.endpoint_interface, identity_fakes.endpoint_region, identity_fakes.service_id, - identity_fakes.service_name, + self.get_fake_service_name(), identity_fakes.service_type, identity_fakes.endpoint_url, ) @@ -185,7 +188,7 @@ class TestEndpointCreate(TestEndpoint): identity_fakes.endpoint_interface, identity_fakes.endpoint_region, identity_fakes.service_id, - identity_fakes.service_name, + self.get_fake_service_name(), identity_fakes.service_type, identity_fakes.endpoint_url, ) @@ -231,7 +234,7 @@ class TestEndpointCreate(TestEndpoint): identity_fakes.endpoint_interface, identity_fakes.endpoint_region, identity_fakes.service_id, - identity_fakes.service_name, + self.get_fake_service_name(), identity_fakes.service_type, identity_fakes.endpoint_url, ) @@ -309,7 +312,7 @@ class TestEndpointList(TestEndpoint): datalist = (( identity_fakes.endpoint_id, identity_fakes.endpoint_region, - identity_fakes.service_name, + self.get_fake_service_name(), identity_fakes.service_type, True, identity_fakes.endpoint_interface, @@ -319,10 +322,10 @@ class TestEndpointList(TestEndpoint): def test_endpoint_list_service(self): arglist = [ - '--service', identity_fakes.service_name, + '--service', identity_fakes.service_id, ] verifylist = [ - ('service', identity_fakes.service_name), + ('service', identity_fakes.service_id), ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) @@ -341,7 +344,7 @@ class TestEndpointList(TestEndpoint): datalist = (( identity_fakes.endpoint_id, identity_fakes.endpoint_region, - identity_fakes.service_name, + self.get_fake_service_name(), identity_fakes.service_type, True, identity_fakes.endpoint_interface, @@ -373,7 +376,7 @@ class TestEndpointList(TestEndpoint): datalist = (( identity_fakes.endpoint_id, identity_fakes.endpoint_region, - identity_fakes.service_name, + self.get_fake_service_name(), identity_fakes.service_type, True, identity_fakes.endpoint_interface, @@ -405,7 +408,7 @@ class TestEndpointList(TestEndpoint): datalist = (( identity_fakes.endpoint_id, identity_fakes.endpoint_region, - identity_fakes.service_name, + self.get_fake_service_name(), identity_fakes.service_type, True, identity_fakes.endpoint_interface, @@ -664,8 +667,85 @@ class TestEndpointShow(TestEndpoint): identity_fakes.endpoint_interface, identity_fakes.endpoint_region, identity_fakes.service_id, - identity_fakes.service_name, + self.get_fake_service_name(), identity_fakes.service_type, identity_fakes.endpoint_url, ) self.assertEqual(datalist, data) + + +class TestEndpointCreateServiceWithoutName(TestEndpointCreate): + + def setUp(self): + super(TestEndpointCreate, self).setUp() + + self.endpoints_mock.create.return_value = fakes.FakeResource( + None, + copy.deepcopy(identity_fakes.ENDPOINT), + loaded=True, + ) + + # This is the return value for common.find_resource(service) + self.services_mock.get.return_value = fakes.FakeResource( + None, + copy.deepcopy(identity_fakes.SERVICE_WITHOUT_NAME), + loaded=True, + ) + + # Get the command object to test + self.cmd = endpoint.CreateEndpoint(self.app, None) + + def get_fake_service_name(self): + return '' + + +class TestEndpointListServiceWithoutName(TestEndpointList): + + def setUp(self): + super(TestEndpointList, self).setUp() + + self.endpoints_mock.list.return_value = [ + fakes.FakeResource( + None, + copy.deepcopy(identity_fakes.ENDPOINT), + loaded=True, + ), + ] + + # This is the return value for common.find_resource(service) + self.services_mock.get.return_value = fakes.FakeResource( + None, + copy.deepcopy(identity_fakes.SERVICE_WITHOUT_NAME), + loaded=True, + ) + + # Get the command object to test + self.cmd = endpoint.ListEndpoint(self.app, None) + + def get_fake_service_name(self): + return '' + + +class TestEndpointShowServiceWithoutName(TestEndpointShow): + + def setUp(self): + super(TestEndpointShow, self).setUp() + + self.endpoints_mock.get.return_value = fakes.FakeResource( + None, + copy.deepcopy(identity_fakes.ENDPOINT), + loaded=True, + ) + + # This is the return value for common.find_resource(service) + self.services_mock.get.return_value = fakes.FakeResource( + None, + copy.deepcopy(identity_fakes.SERVICE_WITHOUT_NAME), + loaded=True, + ) + + # Get the command object to test + self.cmd = endpoint.ShowEndpoint(self.app, None) + + def get_fake_service_name(self): + return ''