diff --git a/novaclient/tests/fixture_data/servers.py b/novaclient/tests/fixture_data/servers.py new file mode 100644 index 000000000..e862b4f69 --- /dev/null +++ b/novaclient/tests/fixture_data/servers.py @@ -0,0 +1,610 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import httpretty + +from novaclient.openstack.common import jsonutils +from novaclient.tests import fakes +from novaclient.tests.fixture_data import base + + +class Base(base.Fixture): + + base_url = 'servers' + + def setUp(self): + super(Base, self).setUp() + + get_servers = { + "servers": [ + {'id': 1234, 'name': 'sample-server'}, + {'id': 5678, 'name': 'sample-server2'} + ] + } + + httpretty.register_uri(httpretty.GET, self.url(), + body=jsonutils.dumps(get_servers), + content_type='application/json') + + self.server_1234 = { + "id": 1234, + "name": "sample-server", + "image": { + "id": 2, + "name": "sample image", + }, + "flavor": { + "id": 1, + "name": "256 MB Server", + }, + "hostId": "e4d909c290d0fb1ca068ffaddf22cbd0", + "status": "BUILD", + "progress": 60, + "addresses": { + "public": [{ + "version": 4, + "addr": "1.2.3.4", + }, + { + "version": 4, + "addr": "5.6.7.8", + }], + "private": [{ + "version": 4, + "addr": "10.11.12.13", + }], + }, + "metadata": { + "Server Label": "Web Head 1", + "Image Version": "2.1" + }, + "OS-EXT-SRV-ATTR:host": "computenode1", + "security_groups": [{ + 'id': 1, 'name': 'securitygroup1', + 'description': 'FAKE_SECURITY_GROUP', + 'tenant_id': '4ffc664c198e435e9853f2538fbcd7a7' + }], + "OS-EXT-MOD:some_thing": "mod_some_thing_value", + } + + self.server_5678 = { + "id": 5678, + "name": "sample-server2", + "image": { + "id": 2, + "name": "sample image", + }, + "flavor": { + "id": 1, + "name": "256 MB Server", + }, + "hostId": "9e107d9d372bb6826bd81d3542a419d6", + "status": "ACTIVE", + "addresses": { + "public": [{ + "version": 4, + "addr": "4.5.6.7", + }, + { + "version": 4, + "addr": "5.6.9.8", + }], + "private": [{ + "version": 4, + "addr": "10.13.12.13", + }], + }, + "metadata": { + "Server Label": "DB 1" + }, + "OS-EXT-SRV-ATTR:host": "computenode2", + "security_groups": [{ + 'id': 1, 'name': 'securitygroup1', + 'description': 'FAKE_SECURITY_GROUP', + 'tenant_id': '4ffc664c198e435e9853f2538fbcd7a7' + }, + { + 'id': 2, 'name': 'securitygroup2', + 'description': 'ANOTHER_FAKE_SECURITY_GROUP', + 'tenant_id': '4ffc664c198e435e9853f2538fbcd7a7' + }], + } + + self.server_9012 = { + "id": 9012, + "name": "sample-server3", + "image": "", + "flavor": { + "id": 1, + "name": "256 MB Server", + }, + "hostId": "9e107d9d372bb6826bd81d3542a419d6", + "status": "ACTIVE", + "addresses": { + "public": [{ + "version": 4, + "addr": "4.5.6.7", + }, + { + "version": 4, + "addr": "5.6.9.8", + }], + "private": [{ + "version": 4, + "addr": "10.13.12.13", + }], + }, + "metadata": { + "Server Label": "DB 1" + } + } + + servers = [self.server_1234, self.server_5678, self.server_9012] + get_servers_detail = {"servers": servers} + + httpretty.register_uri(httpretty.GET, self.url('detail'), + body=jsonutils.dumps(get_servers_detail), + content_type='application/json') + + self.server_1235 = self.server_1234.copy() + self.server_1235['id'] = 1235 + self.server_1235['status'] = 'error' + self.server_1235['fault'] = {'message': 'something went wrong!'} + servers.append(self.server_1235) + + for s in servers: + httpretty.register_uri(httpretty.GET, self.url(s['id']), + body=jsonutils.dumps({'server': s}), + content_type='application/json') + + for s in (1234, 5678): + httpretty.register_uri(httpretty.DELETE, self.url(s), status=202) + + for k in ('test_key', 'key1', 'key2'): + httpretty.register_uri(httpretty.DELETE, + self.url(1234, 'metadata', k), + status=204) + + metadata1 = jsonutils.dumps({'metadata': {'test_key': 'test_value'}}) + httpretty.register_uri(httpretty.POST, self.url(1234, 'metadata'), + body=metadata1, status=200, + content_type='application/json') + httpretty.register_uri(httpretty.PUT, + self.url(1234, 'metadata', 'test_key'), + body=metadata1, status=200, + content_type='application/json') + + self.diagnostic = jsonutils.dumps({'data': 'Fake diagnostics'}) + + metadata2 = jsonutils.dumps({'metadata': {'key1': 'val1'}}) + for u in ('uuid1', 'uuid2', 'uuid3', 'uuid4'): + httpretty.register_uri(httpretty.POST, self.url(u, 'metadata'), + body=metadata2, status=204) + httpretty.register_uri(httpretty.DELETE, + self.url(u, 'metadata', 'key1'), + body=self.diagnostic, + content_type='application/json') + + get_security_groups = { + "security_groups": [{ + 'id': 1, + 'name': 'securitygroup1', + 'description': 'FAKE_SECURITY_GROUP', + 'tenant_id': '4ffc664c198e435e9853f2538fbcd7a7', + 'rules': []}] + } + + httpretty.register_uri(httpretty.GET, + self.url('1234', 'os-security-groups'), + body=jsonutils.dumps(get_security_groups), + status=200) + + httpretty.register_uri(httpretty.POST, self.url(), + body=self.post_servers, + content_type='application/json') + + httpretty.register_uri(httpretty.POST, self.url('1234', 'action'), + body=self.post_servers_1234_action, + content_type='application/json') + + get_os_interface = { + "interfaceAttachments": [ + { + "port_state": "ACTIVE", + "net_id": "net-id-1", + "port_id": "port-id-1", + "mac_address": "aa:bb:cc:dd:ee:ff", + "fixed_ips": [{"ip_address": "1.2.3.4"}], + }, + { + "port_state": "ACTIVE", + "net_id": "net-id-1", + "port_id": "port-id-1", + "mac_address": "aa:bb:cc:dd:ee:ff", + "fixed_ips": [{"ip_address": "1.2.3.4"}], + } + ] + } + + httpretty.register_uri(httpretty.GET, + self.url('1234', 'os-interface'), + body=jsonutils.dumps(get_os_interface), + content_type='application/json') + + interface_data = {'interfaceAttachment': {}} + httpretty.register_uri(httpretty.POST, + self.url('1234', 'os-interface'), + body=jsonutils.dumps(interface_data), + content_type='application/json') + + def put_servers_1234(request, url, headers): + body = jsonutils.loads(request.body.decode('utf-8')) + assert list(body) == ['server'] + fakes.assert_has_keys(body['server'], + optional=['name', 'adminPass']) + return 204, headers, request.body + + httpretty.register_uri(httpretty.PUT, self.url(1234), + body=put_servers_1234, + content_type='application/json') + + def post_os_volumes_boot(request, url, headers): + body = jsonutils.loads(request.body.decode('utf-8')) + assert (set(body.keys()) <= + set(['server', 'os:scheduler_hints'])) + + fakes.assert_has_keys(body['server'], + required=['name', 'flavorRef'], + optional=['imageRef']) + + data = body['server'] + + # Require one, and only one, of the keys for bdm + if 'block_device_mapping' not in data: + if 'block_device_mapping_v2' not in data: + msg = "missing required keys: 'block_device_mapping'" + raise AssertionError(msg) + elif 'block_device_mapping_v2' in data: + msg = "found extra keys: 'block_device_mapping'" + raise AssertionError(msg) + + return 202, headers, jsonutils.dumps({'server': self.server_9012}) + + # NOTE(jamielennox): hack to make os_volumes mock go to the right place + base_url = self.base_url + self.base_url = None + httpretty.register_uri(httpretty.POST, self.url('os-volumes_boot'), + body=post_os_volumes_boot, + content_type='application/json') + self.base_url = base_url + + # + # Server password + # + + httpretty.register_uri(httpretty.DELETE, + self.url(1234, 'os-server-password'), + status=202) + + +class V1(Base): + + def setUp(self): + super(V1, self).setUp() + + # + # Server Addresses + # + + add = self.server_1234['addresses'] + httpretty.register_uri(httpretty.GET, self.url(1234, 'ips'), + jsonutils.dumps({'addresses': add}), + content_type='application/json') + + httpretty.register_uri(httpretty.GET, self.url(1234, 'ips', 'public'), + jsonutils.dumps({'public': add['public']}), + content_type='application/json') + + httpretty.register_uri(httpretty.GET, self.url(1234, 'ips', 'private'), + jsonutils.dumps({'private': add['private']}), + content_type='application/json') + + httpretty.register_uri(httpretty.DELETE, + self.url(1234, 'ips', 'public', '1.2.3.4'), + status=202) + + httpretty.register_uri(httpretty.GET, + self.url('1234', 'diagnostics'), + body=self.diagnostic, + status=200) + + httpretty.register_uri(httpretty.DELETE, + self.url('1234', 'os-interface', 'port-id')) + + # Testing with the following password and key + # + # Clear password: FooBar123 + # + # RSA Private Key: novaclient/tests/idfake.pem + # + # Encrypted password + # OIuEuQttO8Rk93BcKlwHQsziDAnkAm/V6V8VPToA8ZeUaUBWwS0gwo2K6Y61Z96r + # qG447iRz0uTEEYq3RAYJk1mh3mMIRVl27t8MtIecR5ggVVbz1S9AwXJQypDKl0ho + # QFvhCBcMWPohyGewDJOhDbtuN1IoFI9G55ZvFwCm5y7m7B2aVcoLeIsJZE4PLsIw + # /y5a6Z3/AoJZYGG7IH5WN88UROU3B9JZGFB2qtPLQTOvDMZLUhoPRIJeHiVSlo1N + # tI2/++UsXVg3ow6ItqCJGgdNuGG5JB+bslDHWPxROpesEIHdczk46HCpHQN8f1sk + # Hi/fmZZNQQqj1Ijq0caOIw== + + get_server_password = {'password': + 'OIuEuQttO8Rk93BcKlwHQsziDAnkAm/V6V8VPToA8ZeUaUBWwS0gwo2K6Y61Z96r' + 'qG447iRz0uTEEYq3RAYJk1mh3mMIRVl27t8MtIecR5ggVVbz1S9AwXJQypDKl0ho' + 'QFvhCBcMWPohyGewDJOhDbtuN1IoFI9G55ZvFwCm5y7m7B2aVcoLeIsJZE4PLsIw' + '/y5a6Z3/AoJZYGG7IH5WN88UROU3B9JZGFB2qtPLQTOvDMZLUhoPRIJeHiVSlo1N' + 'tI2/++UsXVg3ow6ItqCJGgdNuGG5JB+bslDHWPxROpesEIHdczk46HCpHQN8f1sk' + 'Hi/fmZZNQQqj1Ijq0caOIw=='} + httpretty.register_uri(httpretty.GET, + self.url(1234, 'os-server-password'), + jsonutils.dumps(get_server_password)) + + def post_servers(self, request, url, headers): + body = jsonutils.loads(request.body.decode('utf-8')) + assert (set(body.keys()) <= + set(['server', 'os:scheduler_hints'])) + fakes.assert_has_keys(body['server'], + required=['name', 'imageRef', 'flavorRef'], + optional=['metadata', 'personality']) + if 'personality' in body['server']: + for pfile in body['server']['personality']: + fakes.assert_has_keys(pfile, required=['path', 'contents']) + if body['server']['name'] == 'some-bad-server': + body = self.server_1235 + else: + body = self.server_1234 + + return 202, headers, jsonutils.dumps({'server': body}) + + def post_servers_1234_action(self, request, url, headers): + _body = '' + body = jsonutils.loads(request.body.decode('utf-8')) + resp = 202 + assert len(body.keys()) == 1 + action = list(body)[0] + if action == 'reboot': + assert list(body[action]) == ['type'] + assert body[action]['type'] in ['HARD', 'SOFT'] + elif action == 'rebuild': + body = body[action] + adminPass = body.get('adminPass', 'randompassword') + assert 'imageRef' in body + _body = self.server_1234.copy() + _body['adminPass'] = adminPass + elif action == 'resize': + keys = body[action].keys() + assert 'flavorRef' in keys + elif action == 'confirmResize': + assert body[action] is None + # This one method returns a different response code + return 204, headers, '' + elif action == 'revertResize': + assert body[action] is None + elif action == 'migrate': + assert body[action] is None + elif action == 'os-stop': + assert body[action] is None + elif action == 'os-start': + assert body[action] is None + elif action == 'forceDelete': + assert body[action] is None + elif action == 'restore': + assert body[action] is None + elif action == 'pause': + assert body[action] is None + elif action == 'unpause': + assert body[action] is None + elif action == 'lock': + assert body[action] is None + elif action == 'unlock': + assert body[action] is None + elif action == 'rescue': + assert body[action] is None + _body = {'Password': 'RescuePassword'} + elif action == 'unrescue': + assert body[action] is None + elif action == 'resume': + assert body[action] is None + elif action == 'suspend': + assert body[action] is None + elif action == 'lock': + assert body[action] is None + elif action == 'unlock': + assert body[action] is None + elif action == 'shelve': + assert body[action] is None + elif action == 'shelveOffload': + assert body[action] is None + elif action == 'unshelve': + assert body[action] is None + elif action == 'addFixedIp': + assert list(body[action]) == ['networkId'] + elif action == 'removeFixedIp': + assert list(body[action]) == ['address'] + elif action == 'addFloatingIp': + assert (list(body[action]) == ['address'] or + sorted(list(body[action])) == ['address', + 'fixed_address']) + elif action == 'removeFloatingIp': + assert list(body[action]) == ['address'] + elif action == 'createImage': + assert set(body[action].keys()) == set(['name', 'metadata']) + headers['location'] = "http://blah/images/456" + elif action == 'changePassword': + assert list(body[action]) == ['adminPass'] + elif action == 'os-getConsoleOutput': + assert list(body[action]) == ['length'] + return 202, headers, jsonutils.dumps({'output': 'foo'}) + elif action == 'os-getVNCConsole': + assert list(body[action]) == ['type'] + elif action == 'os-getSPICEConsole': + assert list(body[action]) == ['type'] + elif action == 'os-getRDPConsole': + assert list(body[action]) == ['type'] + elif action == 'os-migrateLive': + assert set(body[action].keys()) == set(['host', + 'block_migration', + 'disk_over_commit']) + elif action == 'os-resetState': + assert list(body[action]) == ['state'] + elif action == 'resetNetwork': + assert body[action] is None + elif action == 'addSecurityGroup': + assert list(body[action]) == ['name'] + elif action == 'removeSecurityGroup': + assert list(body[action]) == ['name'] + elif action == 'createBackup': + assert set(body[action]) == set(['name', + 'backup_type', + 'rotation']) + elif action == 'evacuate': + keys = list(body[action]) + if 'adminPass' in keys: + keys.remove('adminPass') + assert set(keys) == set(['host', 'onSharedStorage']) + else: + raise AssertionError("Unexpected server action: %s" % action) + return resp, headers, jsonutils.dumps({'server': _body}) + + +class V3(Base): + + def setUp(self): + super(V3, self).setUp() + + get_interfaces = { + "interface_attachments": [ + { + "port_state": "ACTIVE", + "net_id": "net-id-1", + "port_id": "port-id-1", + "mac_address": "aa:bb:cc:dd:ee:ff", + "fixed_ips": [{"ip_address": "1.2.3.4"}], + }, + { + "port_state": "ACTIVE", + "net_id": "net-id-1", + "port_id": "port-id-1", + "mac_address": "aa:bb:cc:dd:ee:ff", + "fixed_ips": [{"ip_address": "1.2.3.4"}], + } + ] + } + + httpretty.register_uri(httpretty.GET, + self.url('1234', 'os-attach-interfaces'), + body=jsonutils.dumps(get_interfaces), + content_type='application/json') + + attach_body = {'interface_attachment': {}} + httpretty.register_uri(httpretty.POST, + self.url('1234', 'os-attach-interfaces'), + body=jsonutils.dumps(attach_body), + content_type='application/json') + + httpretty.register_uri(httpretty.GET, + self.url('1234', 'os-server-diagnostics'), + body=self.diagnostic, + status=200) + + httpretty.register_uri(httpretty.DELETE, + self.url('1234', 'os-attach-interfaces', + 'port-id')) + + httpretty.register_uri(httpretty.GET, + self.url(1234, 'os-server-password'), + jsonutils.dumps({'password': ''})) + + def post_servers(self, request, url, headers): + body = jsonutils.loads(request.body.decode('utf-8')) + assert set(body.keys()) <= set(['server']) + fakes.assert_has_keys(body['server'], + required=['name', 'image_ref', 'flavor_ref'], + optional=['metadata', 'personality', + 'os-scheduler-hints:scheduler_hints']) + if body['server']['name'] == 'some-bad-server': + body = self.server_1235 + else: + body = self.server_1234 + + return 202, headers, jsonutils.dumps({'server': body}) + + def post_servers_1234_action(self, request, url, headers): + resp = 202 + body_is_none_list = [ + 'revert_resize', 'migrate', 'stop', 'start', 'force_delete', + 'restore', 'pause', 'unpause', 'lock', 'unlock', 'unrescue', + 'resume', 'suspend', 'lock', 'unlock', 'shelve', 'shelve_offload', + 'unshelve', 'reset_network', 'rescue', 'confirm_resize'] + body_return_map = { + 'rescue': {'admin_password': 'RescuePassword'}, + 'get_console_output': {'output': 'foo'}, + 'rebuild': {'server': self.server_1234}, + } + body_param_check_exists = { + 'rebuild': 'image_ref', + 'resize': 'flavor_ref'} + body_params_check_exact = { + 'reboot': ['type'], + 'add_fixed_ip': ['network_id'], + 'evacuate': ['host', 'on_shared_storage'], + 'remove_fixed_ip': ['address'], + 'change_password': ['admin_password'], + 'get_console_output': ['length'], + 'get_vnc_console': ['type'], + 'get_spice_console': ['type'], + 'reset_state': ['state'], + 'create_image': ['name', 'metadata'], + 'migrate_live': ['host', 'block_migration', 'disk_over_commit'], + 'create_backup': ['name', 'backup_type', 'rotation'], + 'attach': ['volume_id', 'device'], + 'detach': ['volume_id'], + 'swap_volume_attachment': ['old_volume_id', 'new_volume_id']} + + body = jsonutils.loads(request.body.decode('utf-8')) + assert len(body.keys()) == 1 + action = list(body)[0] + _body = body_return_map.get(action, '') + + if action in body_is_none_list: + assert body[action] is None + + if action in body_param_check_exists: + assert body_param_check_exists[action] in body[action] + + if action == 'evacuate': + body[action].pop('admin_password', None) + + if action in body_params_check_exact: + assert set(body[action]) == set(body_params_check_exact[action]) + + if action == 'reboot': + assert body[action]['type'] in ['HARD', 'SOFT'] + elif action == 'confirm_resize': + # This one method returns a different response code + resp = 204 + elif action == 'create_image': + headers['location'] = "http://blah/images/456" + + if action not in set.union(set(body_is_none_list), + set(body_params_check_exact.keys()), + set(body_param_check_exists.keys())): + raise AssertionError("Unexpected server action: %s" % action) + + return resp, headers, jsonutils.dumps(_body) diff --git a/novaclient/tests/v1_1/test_servers.py b/novaclient/tests/v1_1/test_servers.py index 728732474..e7c38ddd6 100644 --- a/novaclient/tests/v1_1/test_servers.py +++ b/novaclient/tests/v1_1/test_servers.py @@ -12,52 +12,59 @@ # License for the specific language governing permissions and limitations # under the License. +import httpretty import mock import six from novaclient import exceptions +from novaclient.tests.fixture_data import client +from novaclient.tests.fixture_data import floatingips +from novaclient.tests.fixture_data import servers as data from novaclient.tests import utils -from novaclient.tests.v1_1 import fakes from novaclient.v1_1 import servers -cs = fakes.FakeClient() +class ServersTest(utils.FixturedTestCase): + client_fixture_class = client.V1 + data_fixture_class = data.V1 -class ServersTest(utils.TestCase): + def setUp(self): + super(ServersTest, self).setUp() + self.useFixture(floatingips.FloatingFixture()) def test_list_servers(self): - sl = cs.servers.list() - cs.assert_called('GET', '/servers/detail') + sl = self.cs.servers.list() + self.assert_called('GET', '/servers/detail') [self.assertIsInstance(s, servers.Server) for s in sl] def test_list_servers_undetailed(self): - sl = cs.servers.list(detailed=False) - cs.assert_called('GET', '/servers') + sl = self.cs.servers.list(detailed=False) + self.assert_called('GET', '/servers') [self.assertIsInstance(s, servers.Server) for s in sl] def test_list_servers_with_marker_limit(self): - sl = cs.servers.list(marker=1234, limit=2) - cs.assert_called('GET', '/servers/detail?limit=2&marker=1234') + sl = self.cs.servers.list(marker=1234, limit=2) + self.assert_called('GET', '/servers/detail?limit=2&marker=1234') for s in sl: self.assertIsInstance(s, servers.Server) def test_get_server_details(self): - s = cs.servers.get(1234) - cs.assert_called('GET', '/servers/1234') + s = self.cs.servers.get(1234) + self.assert_called('GET', '/servers/1234') self.assertIsInstance(s, servers.Server) self.assertEqual(s.id, 1234) self.assertEqual(s.status, 'BUILD') def test_get_server_promote_details(self): - s1 = cs.servers.list(detailed=False)[0] - s2 = cs.servers.list(detailed=True)[0] + s1 = self.cs.servers.list(detailed=False)[0] + s2 = self.cs.servers.list(detailed=True)[0] self.assertNotEqual(s1._info, s2._info) s1.get() self.assertEqual(s1._info, s2._info) def test_create_server(self): - s = cs.servers.create( + s = self.cs.servers.create( name="My server", image=1, flavor=1, @@ -69,11 +76,11 @@ class ServersTest(utils.TestCase): '/tmp/foo.txt': six.StringIO('data'), # a stream } ) - cs.assert_called('POST', '/servers') + self.assert_called('POST', '/servers') self.assertIsInstance(s, servers.Server) def test_create_server_boot_from_volume_with_nics(self): - old_boot = cs.servers._boot + old_boot = self.cs.servers._boot nics = [{'net-id': '11111111-1111-1111-1111-111111111111', 'v4-fixed-ip': '10.0.0.7'}] @@ -87,9 +94,9 @@ class ServersTest(utils.TestCase): self.assertEqual(boot_kwargs['nics'], nics) return old_boot(url, key, *boot_args, **boot_kwargs) - @mock.patch.object(cs.servers, '_boot', wrapped_boot) + @mock.patch.object(self.cs.servers, '_boot', wrapped_boot) def test_create_server_from_volume(): - s = cs.servers.create( + s = self.cs.servers.create( name="My server", image=1, flavor=1, @@ -99,13 +106,13 @@ class ServersTest(utils.TestCase): block_device_mapping=bdm, nics=nics ) - cs.assert_called('POST', '/os-volumes_boot') + self.assert_called('POST', '/os-volumes_boot') self.assertIsInstance(s, servers.Server) test_create_server_from_volume() def test_create_server_boot_with_nics_ipv6(self): - old_boot = cs.servers._boot + old_boot = self.cs.servers._boot nics = [{'net-id': '11111111-1111-1111-1111-111111111111', 'v6-fixed-ip': '2001:db9:0:1::10'}] @@ -113,8 +120,8 @@ class ServersTest(utils.TestCase): self.assertEqual(boot_kwargs['nics'], nics) return old_boot(url, key, *boot_args, **boot_kwargs) - with mock.patch.object(cs.servers, '_boot', wrapped_boot): - s = cs.servers.create( + with mock.patch.object(self.cs.servers, '_boot', wrapped_boot): + s = self.cs.servers.create( name="My server", image=1, flavor=1, @@ -123,11 +130,11 @@ class ServersTest(utils.TestCase): key_name="fakekey", nics=nics ) - cs.assert_called('POST', '/servers') + self.assert_called('POST', '/servers') self.assertIsInstance(s, servers.Server) def test_create_server_userdata_file_object(self): - s = cs.servers.create( + s = self.cs.servers.create( name="My server", image=1, flavor=1, @@ -138,11 +145,11 @@ class ServersTest(utils.TestCase): '/tmp/foo.txt': six.StringIO('data'), # a stream }, ) - cs.assert_called('POST', '/servers') + self.assert_called('POST', '/servers') self.assertIsInstance(s, servers.Server) def test_create_server_userdata_unicode(self): - s = cs.servers.create( + s = self.cs.servers.create( name="My server", image=1, flavor=1, @@ -154,11 +161,11 @@ class ServersTest(utils.TestCase): '/tmp/foo.txt': six.StringIO('data'), # a stream }, ) - cs.assert_called('POST', '/servers') + self.assert_called('POST', '/servers') self.assertIsInstance(s, servers.Server) def test_create_server_userdata_utf8(self): - s = cs.servers.create( + s = self.cs.servers.create( name="My server", image=1, flavor=1, @@ -170,22 +177,21 @@ class ServersTest(utils.TestCase): '/tmp/foo.txt': six.StringIO('data'), # a stream }, ) - cs.assert_called('POST', '/servers') + self.assert_called('POST', '/servers') self.assertIsInstance(s, servers.Server) def _create_disk_config(self, disk_config): - s = cs.servers.create( + s = self.cs.servers.create( name="My server", image=1, flavor=1, disk_config=disk_config ) - cs.assert_called('POST', '/servers') + self.assert_called('POST', '/servers') self.assertIsInstance(s, servers.Server) # verify disk config param was used in the request: - last_request = cs.client.callstack[-1] - body = last_request[-1] + body = httpretty.last_request().parsed_body server = body['server'] self.assertTrue('OS-DCF:diskConfig' in server) self.assertEqual(disk_config, server['OS-DCF:diskConfig']) @@ -197,86 +203,84 @@ class ServersTest(utils.TestCase): self._create_disk_config('MANUAL') def test_update_server(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) # Update via instance s.update(name='hi') - cs.assert_called('PUT', '/servers/1234') + self.assert_called('PUT', '/servers/1234') s.update(name='hi') - cs.assert_called('PUT', '/servers/1234') + self.assert_called('PUT', '/servers/1234') # Silly, but not an error s.update() # Update via manager - cs.servers.update(s, name='hi') - cs.assert_called('PUT', '/servers/1234') + self.cs.servers.update(s, name='hi') + self.assert_called('PUT', '/servers/1234') def test_delete_server(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.delete() - cs.assert_called('DELETE', '/servers/1234') - cs.servers.delete(1234) - cs.assert_called('DELETE', '/servers/1234') - cs.servers.delete(s) - cs.assert_called('DELETE', '/servers/1234') + self.assert_called('DELETE', '/servers/1234') + self.cs.servers.delete(1234) + self.assert_called('DELETE', '/servers/1234') + self.cs.servers.delete(s) + self.assert_called('DELETE', '/servers/1234') def test_delete_server_meta(self): - cs.servers.delete_meta(1234, ['test_key']) - cs.assert_called('DELETE', '/servers/1234/metadata/test_key') + self.cs.servers.delete_meta(1234, ['test_key']) + self.assert_called('DELETE', '/servers/1234/metadata/test_key') def test_set_server_meta(self): - cs.servers.set_meta(1234, {'test_key': 'test_value'}) - cs.assert_called('POST', '/servers/1234/metadata', - {'metadata': {'test_key': 'test_value'}}) + self.cs.servers.set_meta(1234, {'test_key': 'test_value'}) + self.assert_called('POST', '/servers/1234/metadata', + {'metadata': {'test_key': 'test_value'}}) def test_set_server_meta_item(self): - cs.servers.set_meta_item(1234, 'test_key', 'test_value') - cs.assert_called('PUT', '/servers/1234/metadata/test_key', - {'meta': {'test_key': 'test_value'}}) + self.cs.servers.set_meta_item(1234, 'test_key', 'test_value') + self.assert_called('PUT', '/servers/1234/metadata/test_key', + {'meta': {'test_key': 'test_value'}}) def test_find(self): - server = cs.servers.find(name='sample-server') - cs.assert_called('GET', '/servers', pos=-2) - cs.assert_called('GET', '/servers/1234', pos=-1) + server = self.cs.servers.find(name='sample-server') + self.assert_called('GET', '/servers/1234') self.assertEqual(server.name, 'sample-server') - self.assertRaises(exceptions.NoUniqueMatch, cs.servers.find, + self.assertRaises(exceptions.NoUniqueMatch, self.cs.servers.find, flavor={"id": 1, "name": "256 MB Server"}) - sl = cs.servers.findall(flavor={"id": 1, "name": "256 MB Server"}) + sl = self.cs.servers.findall(flavor={"id": 1, "name": "256 MB Server"}) self.assertEqual([s.id for s in sl], [1234, 5678, 9012]) def test_reboot_server(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.reboot() - cs.assert_called('POST', '/servers/1234/action') - cs.servers.reboot(s, reboot_type='HARD') - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') + self.cs.servers.reboot(s, reboot_type='HARD') + self.assert_called('POST', '/servers/1234/action') def test_rebuild_server(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.rebuild(image=1) - cs.assert_called('POST', '/servers/1234/action') - cs.servers.rebuild(s, image=1) - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') + self.cs.servers.rebuild(s, image=1) + self.assert_called('POST', '/servers/1234/action') s.rebuild(image=1, password='5678') - cs.assert_called('POST', '/servers/1234/action') - cs.servers.rebuild(s, image=1, password='5678') - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') + self.cs.servers.rebuild(s, image=1, password='5678') + self.assert_called('POST', '/servers/1234/action') def _rebuild_resize_disk_config(self, disk_config, operation="rebuild"): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) if operation == "rebuild": s.rebuild(image=1, disk_config=disk_config) elif operation == "resize": s.resize(flavor=1, disk_config=disk_config) - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') # verify disk config param was used in the request: - last_request = cs.client.callstack[-1] - body = last_request[-1] + body = httpretty.last_request().parsed_body d = body[operation] self.assertTrue('OS-DCF:diskConfig' in d) @@ -289,20 +293,20 @@ class ServersTest(utils.TestCase): self._rebuild_resize_disk_config('MANUAL') def test_rebuild_server_preserve_ephemeral(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.rebuild(image=1, preserve_ephemeral=True) - cs.assert_called('POST', '/servers/1234/action') - body = cs.client.callstack[-1][-1] + self.assert_called('POST', '/servers/1234/action') + body = httpretty.last_request().parsed_body d = body['rebuild'] self.assertIn('preserve_ephemeral', d) self.assertEqual(d['preserve_ephemeral'], True) def test_resize_server(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.resize(flavor=1) - cs.assert_called('POST', '/servers/1234/action') - cs.servers.resize(s, flavor=1) - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') + self.cs.servers.resize(s, flavor=1) + self.assert_called('POST', '/servers/1234/action') def test_resize_server_disk_config_auto(self): self._rebuild_resize_disk_config('AUTO', 'resize') @@ -311,162 +315,163 @@ class ServersTest(utils.TestCase): self._rebuild_resize_disk_config('MANUAL', 'resize') def test_confirm_resized_server(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.confirm_resize() - cs.assert_called('POST', '/servers/1234/action') - cs.servers.confirm_resize(s) - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') + self.cs.servers.confirm_resize(s) + self.assert_called('POST', '/servers/1234/action') def test_revert_resized_server(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.revert_resize() - cs.assert_called('POST', '/servers/1234/action') - cs.servers.revert_resize(s) - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') + self.cs.servers.revert_resize(s) + self.assert_called('POST', '/servers/1234/action') def test_migrate_server(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.migrate() - cs.assert_called('POST', '/servers/1234/action') - cs.servers.migrate(s) - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') + self.cs.servers.migrate(s) + self.assert_called('POST', '/servers/1234/action') def test_add_fixed_ip(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.add_fixed_ip(1) - cs.assert_called('POST', '/servers/1234/action') - cs.servers.add_fixed_ip(s, 1) - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') + self.cs.servers.add_fixed_ip(s, 1) + self.assert_called('POST', '/servers/1234/action') def test_remove_fixed_ip(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.remove_fixed_ip('10.0.0.1') - cs.assert_called('POST', '/servers/1234/action') - cs.servers.remove_fixed_ip(s, '10.0.0.1') - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') + self.cs.servers.remove_fixed_ip(s, '10.0.0.1') + self.assert_called('POST', '/servers/1234/action') def test_add_floating_ip(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.add_floating_ip('11.0.0.1') - cs.assert_called('POST', '/servers/1234/action') - cs.servers.add_floating_ip(s, '11.0.0.1') - cs.assert_called('POST', '/servers/1234/action') - f = cs.floating_ips.list()[0] - cs.servers.add_floating_ip(s, f) - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') + self.cs.servers.add_floating_ip(s, '11.0.0.1') + self.assert_called('POST', '/servers/1234/action') + f = self.cs.floating_ips.list()[0] + self.cs.servers.add_floating_ip(s, f) + self.assert_called('POST', '/servers/1234/action') s.add_floating_ip(f) - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') def test_add_floating_ip_to_fixed(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.add_floating_ip('11.0.0.1', fixed_address='12.0.0.1') - cs.assert_called('POST', '/servers/1234/action') - cs.servers.add_floating_ip(s, '11.0.0.1', + self.assert_called('POST', '/servers/1234/action') + self.cs.servers.add_floating_ip(s, '11.0.0.1', fixed_address='12.0.0.1') - cs.assert_called('POST', '/servers/1234/action') - f = cs.floating_ips.list()[0] - cs.servers.add_floating_ip(s, f) - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') + f = self.cs.floating_ips.list()[0] + self.cs.servers.add_floating_ip(s, f) + self.assert_called('POST', '/servers/1234/action') s.add_floating_ip(f) - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') def test_remove_floating_ip(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.remove_floating_ip('11.0.0.1') - cs.assert_called('POST', '/servers/1234/action') - cs.servers.remove_floating_ip(s, '11.0.0.1') - cs.assert_called('POST', '/servers/1234/action') - f = cs.floating_ips.list()[0] - cs.servers.remove_floating_ip(s, f) - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') + self.cs.servers.remove_floating_ip(s, '11.0.0.1') + self.assert_called('POST', '/servers/1234/action') + f = self.cs.floating_ips.list()[0] + self.cs.servers.remove_floating_ip(s, f) + self.assert_called('POST', '/servers/1234/action') s.remove_floating_ip(f) - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') def test_stop(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.stop() - cs.assert_called('POST', '/servers/1234/action') - cs.servers.stop(s) - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') + self.cs.servers.stop(s) + self.assert_called('POST', '/servers/1234/action') def test_force_delete(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.force_delete() - cs.assert_called('POST', '/servers/1234/action') - cs.servers.force_delete(s) - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') + self.cs.servers.force_delete(s) + self.assert_called('POST', '/servers/1234/action') def test_restore(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.restore() - cs.assert_called('POST', '/servers/1234/action') - cs.servers.restore(s) - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') + self.cs.servers.restore(s) + self.assert_called('POST', '/servers/1234/action') def test_start(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.start() - cs.assert_called('POST', '/servers/1234/action') - cs.servers.start(s) - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') + self.cs.servers.start(s) + self.assert_called('POST', '/servers/1234/action') def test_rescue(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.rescue() - cs.assert_called('POST', '/servers/1234/action') - cs.servers.rescue(s) - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') + self.cs.servers.rescue(s) + self.assert_called('POST', '/servers/1234/action') def test_unrescue(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.unrescue() - cs.assert_called('POST', '/servers/1234/action') - cs.servers.unrescue(s) - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') + self.cs.servers.unrescue(s) + self.assert_called('POST', '/servers/1234/action') def test_lock(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.lock() - cs.assert_called('POST', '/servers/1234/action') - cs.servers.lock(s) - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') + self.cs.servers.lock(s) + self.assert_called('POST', '/servers/1234/action') def test_unlock(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.unlock() - cs.assert_called('POST', '/servers/1234/action') - cs.servers.unlock(s) - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') + self.cs.servers.unlock(s) + self.assert_called('POST', '/servers/1234/action') def test_backup(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.backup('back1', 'daily', 1) - cs.assert_called('POST', '/servers/1234/action') - cs.servers.backup(s, 'back1', 'daily', 2) - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') + self.cs.servers.backup(s, 'back1', 'daily', 2) + self.assert_called('POST', '/servers/1234/action') def test_get_console_output_without_length(self): success = 'foo' - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.get_console_output() self.assertEqual(s.get_console_output(), success) - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') - cs.servers.get_console_output(s) - self.assertEqual(cs.servers.get_console_output(s), success) - cs.assert_called('POST', '/servers/1234/action') + self.cs.servers.get_console_output(s) + self.assertEqual(self.cs.servers.get_console_output(s), success) + self.assert_called('POST', '/servers/1234/action') def test_get_console_output_with_length(self): success = 'foo' - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.get_console_output(length=50) self.assertEqual(s.get_console_output(length=50), success) - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') - cs.servers.get_console_output(s, length=50) - self.assertEqual(cs.servers.get_console_output(s, length=50), success) - cs.assert_called('POST', '/servers/1234/action') + self.cs.servers.get_console_output(s, length=50) + self.assertEqual(self.cs.servers.get_console_output(s, length=50), + success) + self.assert_called('POST', '/servers/1234/action') # Testing password methods with the following password and key # @@ -483,13 +488,13 @@ class ServersTest(utils.TestCase): # Hi/fmZZNQQqj1Ijq0caOIw== def test_get_password(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) self.assertEqual(s.get_password('novaclient/tests/idfake.pem'), b'FooBar123') - cs.assert_called('GET', '/servers/1234/os-server-password') + self.assert_called('GET', '/servers/1234/os-server-password') def test_get_password_without_key(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) self.assertEqual(s.get_password(), 'OIuEuQttO8Rk93BcKlwHQsziDAnkAm/V6V8VPToA8ZeUaUBWwS0gwo2K6Y61Z96r' 'qG447iRz0uTEEYq3RAYJk1mh3mMIRVl27t8MtIecR5ggVVbz1S9AwXJQypDKl0ho' @@ -497,112 +502,113 @@ class ServersTest(utils.TestCase): '/y5a6Z3/AoJZYGG7IH5WN88UROU3B9JZGFB2qtPLQTOvDMZLUhoPRIJeHiVSlo1N' 'tI2/++UsXVg3ow6ItqCJGgdNuGG5JB+bslDHWPxROpesEIHdczk46HCpHQN8f1sk' 'Hi/fmZZNQQqj1Ijq0caOIw==') - cs.assert_called('GET', '/servers/1234/os-server-password') + self.assert_called('GET', '/servers/1234/os-server-password') def test_clear_password(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.clear_password() - cs.assert_called('DELETE', '/servers/1234/os-server-password') + self.assert_called('DELETE', '/servers/1234/os-server-password') def test_get_server_diagnostics(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) diagnostics = s.diagnostics() self.assertTrue(diagnostics is not None) - cs.assert_called('GET', '/servers/1234/diagnostics') + self.assert_called('GET', '/servers/1234/diagnostics') - diagnostics_from_manager = cs.servers.diagnostics(1234) + diagnostics_from_manager = self.cs.servers.diagnostics(1234) self.assertTrue(diagnostics_from_manager is not None) - cs.assert_called('GET', '/servers/1234/diagnostics') + self.assert_called('GET', '/servers/1234/diagnostics') - self.assertEqual(diagnostics, diagnostics_from_manager) + self.assertEqual(diagnostics[1], diagnostics_from_manager[1]) def test_get_vnc_console(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.get_vnc_console('fake') - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') - cs.servers.get_vnc_console(s, 'fake') - cs.assert_called('POST', '/servers/1234/action') + self.cs.servers.get_vnc_console(s, 'fake') + self.assert_called('POST', '/servers/1234/action') def test_get_spice_console(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.get_spice_console('fake') - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') - cs.servers.get_spice_console(s, 'fake') - cs.assert_called('POST', '/servers/1234/action') + self.cs.servers.get_spice_console(s, 'fake') + self.assert_called('POST', '/servers/1234/action') def test_get_rdp_console(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.get_rdp_console('fake') - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') - cs.servers.get_rdp_console(s, 'fake') - cs.assert_called('POST', '/servers/1234/action') + self.cs.servers.get_rdp_console(s, 'fake') + self.assert_called('POST', '/servers/1234/action') def test_create_image(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.create_image('123') - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') s.create_image('123', {}) - cs.assert_called('POST', '/servers/1234/action') - cs.servers.create_image(s, '123') - cs.assert_called('POST', '/servers/1234/action') - cs.servers.create_image(s, '123', {}) + self.assert_called('POST', '/servers/1234/action') + self.cs.servers.create_image(s, '123') + self.assert_called('POST', '/servers/1234/action') + self.cs.servers.create_image(s, '123', {}) def test_live_migrate_server(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.live_migrate(host='hostname', block_migration=False, disk_over_commit=False) - cs.assert_called('POST', '/servers/1234/action') - cs.servers.live_migrate(s, host='hostname', block_migration=False, + self.assert_called('POST', '/servers/1234/action') + self.cs.servers.live_migrate(s, host='hostname', block_migration=False, disk_over_commit=False) - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') def test_reset_state(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.reset_state('newstate') - cs.assert_called('POST', '/servers/1234/action') - cs.servers.reset_state(s, 'newstate') - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') + self.cs.servers.reset_state(s, 'newstate') + self.assert_called('POST', '/servers/1234/action') def test_reset_network(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.reset_network() - cs.assert_called('POST', '/servers/1234/action') - cs.servers.reset_network(s) - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') + self.cs.servers.reset_network(s) + self.assert_called('POST', '/servers/1234/action') def test_add_security_group(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.add_security_group('newsg') - cs.assert_called('POST', '/servers/1234/action') - cs.servers.add_security_group(s, 'newsg') - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') + self.cs.servers.add_security_group(s, 'newsg') + self.assert_called('POST', '/servers/1234/action') def test_remove_security_group(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.remove_security_group('oldsg') - cs.assert_called('POST', '/servers/1234/action') - cs.servers.remove_security_group(s, 'oldsg') - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') + self.cs.servers.remove_security_group(s, 'oldsg') + self.assert_called('POST', '/servers/1234/action') def test_list_security_group(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.list_security_group() - cs.assert_called('GET', '/servers/1234/os-security-groups') + self.assert_called('GET', '/servers/1234/os-security-groups') def test_evacuate(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.evacuate('fake_target_host', 'True') - cs.assert_called('POST', '/servers/1234/action') - cs.servers.evacuate(s, 'fake_target_host', 'False', 'NewAdminPassword') - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') + self.cs.servers.evacuate(s, 'fake_target_host', + 'False', 'NewAdminPassword') + self.assert_called('POST', '/servers/1234/action') def test_interface_list(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.interface_list() - cs.assert_called('GET', '/servers/1234/os-interface') + self.assert_called('GET', '/servers/1234/os-interface') def test_interface_list_result_string_representable(self): """Test for bugs.launchpad.net/python-novaclient/+bug/1280453.""" @@ -631,11 +637,11 @@ class ServersTest(utils.TestCase): self.assertEqual('', '%r' % s) def test_interface_attach(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.interface_attach(None, None, None) - cs.assert_called('POST', '/servers/1234/os-interface') + self.assert_called('POST', '/servers/1234/os-interface') def test_interface_detach(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.interface_detach('port-id') - cs.assert_called('DELETE', '/servers/1234/os-interface/port-id') + self.assert_called('DELETE', '/servers/1234/os-interface/port-id') diff --git a/novaclient/tests/v3/test_servers.py b/novaclient/tests/v3/test_servers.py index e03fc5f40..98df862b1 100644 --- a/novaclient/tests/v3/test_servers.py +++ b/novaclient/tests/v3/test_servers.py @@ -17,50 +17,51 @@ import mock import six from novaclient import exceptions +from novaclient.tests.fixture_data import client +from novaclient.tests.fixture_data import servers as data from novaclient.tests import utils -from novaclient.tests.v3 import fakes from novaclient.v3 import servers -cs = fakes.FakeClient() +class ServersTest(utils.FixturedTestCase): - -class ServersTest(utils.TestCase): + client_fixture_class = client.V3 + data_fixture_class = data.V3 def test_list_servers(self): - sl = cs.servers.list() - cs.assert_called('GET', '/servers/detail') + sl = self.cs.servers.list() + self.assert_called('GET', '/servers/detail') for s in sl: self.assertIsInstance(s, servers.Server) def test_list_servers_undetailed(self): - sl = cs.servers.list(detailed=False) - cs.assert_called('GET', '/servers') + sl = self.cs.servers.list(detailed=False) + self.assert_called('GET', '/servers') for s in sl: self.assertIsInstance(s, servers.Server) def test_list_servers_with_marker_limit(self): - sl = cs.servers.list(marker=1234, limit=2) - cs.assert_called('GET', '/servers/detail?limit=2&marker=1234') + sl = self.cs.servers.list(marker=1234, limit=2) + self.assert_called('GET', '/servers/detail?limit=2&marker=1234') for s in sl: self.assertIsInstance(s, servers.Server) def test_get_server_details(self): - s = cs.servers.get(1234) - cs.assert_called('GET', '/servers/1234') + s = self.cs.servers.get(1234) + self.assert_called('GET', '/servers/1234') self.assertIsInstance(s, servers.Server) self.assertEqual(s.id, 1234) self.assertEqual(s.status, 'BUILD') def test_get_server_promote_details(self): - s1 = cs.servers.list(detailed=False)[0] - s2 = cs.servers.list(detailed=True)[0] + s1 = self.cs.servers.list(detailed=False)[0] + s2 = self.cs.servers.list(detailed=True)[0] self.assertNotEqual(s1._info, s2._info) s1.get() self.assertEqual(s1._info, s2._info) def test_create_server(self): - s = cs.servers.create( + s = self.cs.servers.create( name="My server", image=1, flavor=1, @@ -72,11 +73,11 @@ class ServersTest(utils.TestCase): '/tmp/foo.txt': six.StringIO('data'), # a stream } ) - cs.assert_called('POST', '/servers') + self.assert_called('POST', '/servers') self.assertIsInstance(s, servers.Server) def test_create_server_boot_with_nics_ipv4(self): - old_boot = cs.servers._boot + old_boot = self.cs.servers._boot nics = [{'net-id': '11111111-1111-1111-1111-111111111111', 'v4-fixed-ip': '10.10.0.7'}] @@ -84,8 +85,8 @@ class ServersTest(utils.TestCase): self.assertEqual(boot_kwargs['nics'], nics) return old_boot(url, key, *boot_args, **boot_kwargs) - with mock.patch.object(cs.servers, '_boot', wrapped_boot): - s = cs.servers.create( + with mock.patch.object(self.cs.servers, '_boot', wrapped_boot): + s = self.cs.servers.create( name="My server", image=1, flavor=1, @@ -94,11 +95,11 @@ class ServersTest(utils.TestCase): key_name="fakekey", nics=nics ) - cs.assert_called('POST', '/servers') + self.assert_called('POST', '/servers') self.assertIsInstance(s, servers.Server) def test_create_server_boot_with_nics_ipv6(self): - old_boot = cs.servers._boot + old_boot = self.cs.servers._boot nics = [{'net-id': '11111111-1111-1111-1111-111111111111', 'v6-fixed-ip': '2001:db9:0:1::10'}] @@ -106,8 +107,8 @@ class ServersTest(utils.TestCase): self.assertEqual(boot_kwargs['nics'], nics) return old_boot(url, key, *boot_args, **boot_kwargs) - with mock.patch.object(cs.servers, '_boot', wrapped_boot): - s = cs.servers.create( + with mock.patch.object(self.cs.servers, '_boot', wrapped_boot): + s = self.cs.servers.create( name="My server", image=1, flavor=1, @@ -116,11 +117,11 @@ class ServersTest(utils.TestCase): key_name="fakekey", nics=nics ) - cs.assert_called('POST', '/servers') + self.assert_called('POST', '/servers') self.assertIsInstance(s, servers.Server) def test_create_server_userdata_file_object(self): - s = cs.servers.create( + s = self.cs.servers.create( name="My server", image=1, flavor=1, @@ -131,11 +132,11 @@ class ServersTest(utils.TestCase): '/tmp/foo.txt': six.StringIO('data'), # a stream }, ) - cs.assert_called('POST', '/servers') + self.assert_called('POST', '/servers') self.assertIsInstance(s, servers.Server) def test_create_server_userdata_unicode(self): - s = cs.servers.create( + s = self.cs.servers.create( name="My server", image=1, flavor=1, @@ -147,11 +148,11 @@ class ServersTest(utils.TestCase): '/tmp/foo.txt': six.StringIO('data'), # a stream }, ) - cs.assert_called('POST', '/servers') + self.assert_called('POST', '/servers') self.assertIsInstance(s, servers.Server) def test_create_server_userdata_utf8(self): - s = cs.servers.create( + s = self.cs.servers.create( name="My server", image=1, flavor=1, @@ -163,11 +164,11 @@ class ServersTest(utils.TestCase): '/tmp/foo.txt': six.StringIO('data'), # a stream }, ) - cs.assert_called('POST', '/servers') + self.assert_called('POST', '/servers') self.assertIsInstance(s, servers.Server) def test_create_server_return_reservation_id(self): - s = cs.servers.create( + s = self.cs.servers.create( name="My server", image=1, flavor=1, @@ -183,294 +184,295 @@ class ServersTest(utils.TestCase): 'os-multiple-create:return_reservation_id': True, } } - cs.assert_called('POST', '/servers', expected_body) + self.assert_called('POST', '/servers', expected_body) self.assertIsInstance(s, servers.Server) def test_update_server(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) # Update via instance s.update(name='hi') - cs.assert_called('PUT', '/servers/1234') + self.assert_called('PUT', '/servers/1234') s.update(name='hi') - cs.assert_called('PUT', '/servers/1234') + self.assert_called('PUT', '/servers/1234') # Silly, but not an error s.update() # Update via manager - cs.servers.update(s, name='hi') - cs.assert_called('PUT', '/servers/1234') + self.cs.servers.update(s, name='hi') + self.assert_called('PUT', '/servers/1234') def test_delete_server(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.delete() - cs.assert_called('DELETE', '/servers/1234') - cs.servers.delete(1234) - cs.assert_called('DELETE', '/servers/1234') - cs.servers.delete(s) - cs.assert_called('DELETE', '/servers/1234') + self.assert_called('DELETE', '/servers/1234') + self.cs.servers.delete(1234) + self.assert_called('DELETE', '/servers/1234') + self.cs.servers.delete(s) + self.assert_called('DELETE', '/servers/1234') def test_delete_server_meta(self): - cs.servers.delete_meta(1234, ['test_key']) - cs.assert_called('DELETE', '/servers/1234/metadata/test_key') + self.cs.servers.delete_meta(1234, ['test_key']) + self.assert_called('DELETE', '/servers/1234/metadata/test_key') def test_set_server_meta(self): - cs.servers.set_meta(1234, {'test_key': 'test_value'}) - cs.assert_called('POST', '/servers/1234/metadata', - {'metadata': {'test_key': 'test_value'}}) + self.cs.servers.set_meta(1234, {'test_key': 'test_value'}) + self.assert_called('POST', '/servers/1234/metadata', + {'metadata': {'test_key': 'test_value'}}) def test_find(self): - server = cs.servers.find(name='sample-server') - cs.assert_called('GET', '/servers', pos=-2) - cs.assert_called('GET', '/servers/1234', pos=-1) + server = self.cs.servers.find(name='sample-server') + self.assert_called('GET', '/servers/1234') self.assertEqual(server.name, 'sample-server') - self.assertRaises(exceptions.NoUniqueMatch, cs.servers.find, + self.assertRaises(exceptions.NoUniqueMatch, self.cs.servers.find, flavor={"id": 1, "name": "256 MB Server"}) - sl = cs.servers.findall(flavor={"id": 1, "name": "256 MB Server"}) + sl = self.cs.servers.findall(flavor={"id": 1, "name": "256 MB Server"}) self.assertEqual([s.id for s in sl], [1234, 5678, 9012]) def test_reboot_server(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.reboot() - cs.assert_called('POST', '/servers/1234/action') - cs.servers.reboot(s, reboot_type='HARD') - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') + self.cs.servers.reboot(s, reboot_type='HARD') + self.assert_called('POST', '/servers/1234/action') def test_rebuild_server(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.rebuild(image=1) - cs.assert_called('POST', '/servers/1234/action') - cs.servers.rebuild(s, image=1) - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') + self.cs.servers.rebuild(s, image=1) + self.assert_called('POST', '/servers/1234/action') s.rebuild(image=1, password='5678') - cs.assert_called('POST', '/servers/1234/action') - cs.servers.rebuild(s, image=1, password='5678') - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') + self.cs.servers.rebuild(s, image=1, password='5678') + self.assert_called('POST', '/servers/1234/action') def test_resize_server(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.resize(flavor=1) - cs.assert_called('POST', '/servers/1234/action') - cs.servers.resize(s, flavor=1) - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') + self.cs.servers.resize(s, flavor=1) + self.assert_called('POST', '/servers/1234/action') def test_confirm_resized_server(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.confirm_resize() - cs.assert_called('POST', '/servers/1234/action') - cs.servers.confirm_resize(s) - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') + self.cs.servers.confirm_resize(s) + self.assert_called('POST', '/servers/1234/action') def test_revert_resized_server(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.revert_resize() - cs.assert_called('POST', '/servers/1234/action') - cs.servers.revert_resize(s) - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') + self.cs.servers.revert_resize(s) + self.assert_called('POST', '/servers/1234/action') def test_migrate_server(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.migrate() - cs.assert_called('POST', '/servers/1234/action') - cs.servers.migrate(s) - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') + self.cs.servers.migrate(s) + self.assert_called('POST', '/servers/1234/action') def test_add_fixed_ip(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.add_fixed_ip(1) - cs.assert_called('POST', '/servers/1234/action') - cs.servers.add_fixed_ip(s, 1) - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') + self.cs.servers.add_fixed_ip(s, 1) + self.assert_called('POST', '/servers/1234/action') def test_remove_fixed_ip(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.remove_fixed_ip('10.0.0.1') - cs.assert_called('POST', '/servers/1234/action') - cs.servers.remove_fixed_ip(s, '10.0.0.1') - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') + self.cs.servers.remove_fixed_ip(s, '10.0.0.1') + self.assert_called('POST', '/servers/1234/action') def test_stop(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.stop() - cs.assert_called('POST', '/servers/1234/action') - cs.servers.stop(s) - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') + self.cs.servers.stop(s) + self.assert_called('POST', '/servers/1234/action') def test_force_delete(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.force_delete() - cs.assert_called('POST', '/servers/1234/action') - cs.servers.force_delete(s) - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') + self.cs.servers.force_delete(s) + self.assert_called('POST', '/servers/1234/action') def test_restore(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.restore() - cs.assert_called('POST', '/servers/1234/action') - cs.servers.restore(s) - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') + self.cs.servers.restore(s) + self.assert_called('POST', '/servers/1234/action') def test_start(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.start() - cs.assert_called('POST', '/servers/1234/action') - cs.servers.start(s) - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') + self.cs.servers.start(s) + self.assert_called('POST', '/servers/1234/action') def test_rescue(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.rescue() - cs.assert_called('POST', '/servers/1234/action') - cs.servers.rescue(s) - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') + self.cs.servers.rescue(s) + self.assert_called('POST', '/servers/1234/action') def test_unrescue(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.unrescue() - cs.assert_called('POST', '/servers/1234/action') - cs.servers.unrescue(s) - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') + self.cs.servers.unrescue(s) + self.assert_called('POST', '/servers/1234/action') def test_lock(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.lock() - cs.assert_called('POST', '/servers/1234/action') - cs.servers.lock(s) - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') + self.cs.servers.lock(s) + self.assert_called('POST', '/servers/1234/action') def test_unlock(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.unlock() - cs.assert_called('POST', '/servers/1234/action') - cs.servers.unlock(s) - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') + self.cs.servers.unlock(s) + self.assert_called('POST', '/servers/1234/action') def test_backup(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.backup('back1', 'daily', 1) - cs.assert_called('POST', '/servers/1234/action') - cs.servers.backup(s, 'back1', 'daily', 2) - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') + self.cs.servers.backup(s, 'back1', 'daily', 2) + self.assert_called('POST', '/servers/1234/action') def test_get_console_output_without_length(self): success = 'foo' - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.get_console_output() self.assertEqual(s.get_console_output(), success) - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') - cs.servers.get_console_output(s) - self.assertEqual(cs.servers.get_console_output(s), success) - cs.assert_called('POST', '/servers/1234/action', - {'get_console_output': {'length': -1}}) + self.cs.servers.get_console_output(s) + self.assertEqual(self.cs.servers.get_console_output(s), success) + self.assert_called('POST', '/servers/1234/action', + {'get_console_output': {'length': -1}}) def test_get_console_output_with_length(self): success = 'foo' - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.get_console_output(length=50) self.assertEqual(s.get_console_output(length=50), success) - cs.assert_called('POST', '/servers/1234/action', - {'get_console_output': {'length': 50}}) + self.assert_called('POST', '/servers/1234/action', + {'get_console_output': {'length': 50}}) - cs.servers.get_console_output(s, length=50) - self.assertEqual(cs.servers.get_console_output(s, length=50), success) - cs.assert_called('POST', '/servers/1234/action', - {'get_console_output': {'length': 50}}) + self.cs.servers.get_console_output(s, length=50) + self.assertEqual(self.cs.servers.get_console_output(s, length=50), + success) + self.assert_called('POST', '/servers/1234/action', + {'get_console_output': {'length': 50}}) def test_get_password(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) self.assertEqual(s.get_password('/foo/id_rsa'), '') - cs.assert_called('GET', '/servers/1234/os-server-password') + self.assert_called('GET', '/servers/1234/os-server-password') def test_clear_password(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.clear_password() - cs.assert_called('DELETE', '/servers/1234/os-server-password') + self.assert_called('DELETE', '/servers/1234/os-server-password') def test_get_server_diagnostics(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) diagnostics = s.diagnostics() self.assertTrue(diagnostics is not None) - cs.assert_called('GET', '/servers/1234/os-server-diagnostics') + self.assert_called('GET', '/servers/1234/os-server-diagnostics') - diagnostics_from_manager = cs.servers.diagnostics(1234) + diagnostics_from_manager = self.cs.servers.diagnostics(1234) self.assertTrue(diagnostics_from_manager is not None) - cs.assert_called('GET', '/servers/1234/os-server-diagnostics') + self.assert_called('GET', '/servers/1234/os-server-diagnostics') - self.assertEqual(diagnostics, diagnostics_from_manager) + self.assertEqual(diagnostics[1], diagnostics_from_manager[1]) def test_get_vnc_console(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.get_vnc_console('fake') - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') - cs.servers.get_vnc_console(s, 'fake') - cs.assert_called('POST', '/servers/1234/action') + self.cs.servers.get_vnc_console(s, 'fake') + self.assert_called('POST', '/servers/1234/action') def test_get_spice_console(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.get_spice_console('fake') - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') - cs.servers.get_spice_console(s, 'fake') - cs.assert_called('POST', '/servers/1234/action') + self.cs.servers.get_spice_console(s, 'fake') + self.assert_called('POST', '/servers/1234/action') def test_create_image(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.create_image('123') - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') s.create_image('123', {}) - cs.assert_called('POST', '/servers/1234/action') - cs.servers.create_image(s, '123') - cs.assert_called('POST', '/servers/1234/action') - cs.servers.create_image(s, '123', {}) + self.assert_called('POST', '/servers/1234/action') + self.cs.servers.create_image(s, '123') + self.assert_called('POST', '/servers/1234/action') + self.cs.servers.create_image(s, '123', {}) def test_live_migrate_server(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.live_migrate(host='hostname', block_migration=False, disk_over_commit=False) - cs.assert_called('POST', '/servers/1234/action') - cs.servers.live_migrate(s, host='hostname', block_migration=False, - disk_over_commit=False) - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') + self.cs.servers.live_migrate(s, host='hostname', block_migration=False, + disk_over_commit=False) + self.assert_called('POST', '/servers/1234/action') def test_reset_state(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.reset_state('newstate') - cs.assert_called('POST', '/servers/1234/action') - cs.servers.reset_state(s, 'newstate') - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') + self.cs.servers.reset_state(s, 'newstate') + self.assert_called('POST', '/servers/1234/action') def test_reset_network(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.reset_network() - cs.assert_called('POST', '/servers/1234/action') - cs.servers.reset_network(s) - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') + self.cs.servers.reset_network(s) + self.assert_called('POST', '/servers/1234/action') def test_evacuate(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.evacuate('fake_target_host', 'True') - cs.assert_called('POST', '/servers/1234/action') - cs.servers.evacuate(s, 'fake_target_host', 'False', 'NewAdminPassword') - cs.assert_called('POST', '/servers/1234/action') + self.assert_called('POST', '/servers/1234/action') + self.cs.servers.evacuate(s, 'fake_target_host', + 'False', 'NewAdminPassword') + self.assert_called('POST', '/servers/1234/action') def test_interface_list(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.interface_list() - cs.assert_called('GET', '/servers/1234/os-attach-interfaces') + self.assert_called('GET', '/servers/1234/os-attach-interfaces') def test_interface_attach(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.interface_attach(None, None, None) - cs.assert_called('POST', '/servers/1234/os-attach-interfaces') + self.assert_called('POST', '/servers/1234/os-attach-interfaces') def test_interface_detach(self): - s = cs.servers.get(1234) + s = self.cs.servers.get(1234) s.interface_detach('port-id') - cs.assert_called('DELETE', - '/servers/1234/os-attach-interfaces/port-id') + self.assert_called('DELETE', + '/servers/1234/os-attach-interfaces/port-id')