Merge "Convert server tests to httpretty"

This commit is contained in:
Jenkins 2014-07-15 21:03:49 +00:00 committed by Gerrit Code Review
commit e551cb0a34
3 changed files with 1032 additions and 414 deletions

View File

@ -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)

View File

@ -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('<Server: unknown-name>', '%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')

View File

@ -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')