diff --git a/novaclient/tests/v1_1/test_servers.py b/novaclient/tests/v1_1/test_servers.py index a48204c19..b70964a50 100644 --- a/novaclient/tests/v1_1/test_servers.py +++ b/novaclient/tests/v1_1/test_servers.py @@ -582,6 +582,32 @@ class ServersTest(utils.TestCase): s.interface_list() cs.assert_called('GET', '/servers/1234/os-interface') + def test_interface_list_result_string_representable(self): + """Test for bugs.launchpad.net/python-novaclient/+bug/1280453.""" + # According to https://github.com/openstack/nova/blob/master/ + # nova/api/openstack/compute/contrib/attach_interfaces.py#L33, + # the attach_interface extension get method will return a json + # object partly like this: + interface_list = [{ + 'net_id': 'd7745cf5-63f9-4883-b0ae-983f061e4f23', + 'port_id': 'f35079da-36d5-4513-8ec1-0298d703f70e', + 'mac_addr': 'fa:16:3e:4c:37:c8', + 'port_state': 'ACTIVE', + 'fixed_ips': [{ + 'subnet_id': 'f1ad93ad-2967-46ba-b403-e8cbbe65f7fa', + 'ip_address': '10.2.0.96' + }] + }] + # If server is not string representable, it will raise an exception, + # because attribute named 'name' cannot be found. + # Parameter 'loaded' must be True or it will try to get attribute + # 'id' then fails (lazy load detail), this is exactly same as + # novaclient.base.Manager._list() + s = servers.Server(servers.ServerManager, interface_list[0], + loaded=True) + # Trigger the __repr__ magic method + self.assertEqual('<Server: unknown-name>', '%r' % s) + def test_interface_attach(self): s = cs.servers.get(1234) s.interface_attach(None, None, None) diff --git a/novaclient/v1_1/servers.py b/novaclient/v1_1/servers.py index cf284d94b..d4ac6a794 100644 --- a/novaclient/v1_1/servers.py +++ b/novaclient/v1_1/servers.py @@ -36,7 +36,7 @@ class Server(base.Resource): HUMAN_ID = True def __repr__(self): - return "<Server: %s>" % self.name + return '<Server: %s>' % getattr(self, 'name', 'unknown-name') def delete(self): """