Merge "Use UUIDs instead of IDs for OSAPI servers."
This commit is contained in:
commit
022afb9b06
nova
api/openstack
compute
tests
@ -113,21 +113,31 @@ def get_pagination_params(request):
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
params = {}
|
params = {}
|
||||||
for param in ['marker', 'limit']:
|
if 'limit' in request.GET:
|
||||||
if not param in request.GET:
|
params['limit'] = _get_limit_param(request)
|
||||||
continue
|
if 'marker' in request.GET:
|
||||||
try:
|
params['marker'] = _get_marker_param(request)
|
||||||
params[param] = int(request.GET[param])
|
|
||||||
except ValueError:
|
|
||||||
msg = _('%s param must be an integer') % param
|
|
||||||
raise webob.exc.HTTPBadRequest(explanation=msg)
|
|
||||||
if params[param] < 0:
|
|
||||||
msg = _('%s param must be positive') % param
|
|
||||||
raise webob.exc.HTTPBadRequest(explanation=msg)
|
|
||||||
|
|
||||||
return params
|
return params
|
||||||
|
|
||||||
|
|
||||||
|
def _get_limit_param(request):
|
||||||
|
"""Extract integer limit from request or fail"""
|
||||||
|
try:
|
||||||
|
limit = int(request.GET['limit'])
|
||||||
|
except ValueError:
|
||||||
|
msg = _('limit param must be an integer')
|
||||||
|
raise webob.exc.HTTPBadRequest(explanation=msg)
|
||||||
|
if limit < 0:
|
||||||
|
msg = _('limit param must be positive')
|
||||||
|
raise webob.exc.HTTPBadRequest(explanation=msg)
|
||||||
|
return limit
|
||||||
|
|
||||||
|
|
||||||
|
def _get_marker_param(request):
|
||||||
|
"""Extract marker id from request or fail"""
|
||||||
|
return request.GET['marker']
|
||||||
|
|
||||||
|
|
||||||
def limited(items, request, max_limit=FLAGS.osapi_max_limit):
|
def limited(items, request, max_limit=FLAGS.osapi_max_limit):
|
||||||
"""
|
"""
|
||||||
Return a slice of items according to requested offset and limit.
|
Return a slice of items according to requested offset and limit.
|
||||||
@ -178,7 +188,7 @@ def limited_by_marker(items, request, max_limit=FLAGS.osapi_max_limit):
|
|||||||
if marker:
|
if marker:
|
||||||
start_index = -1
|
start_index = -1
|
||||||
for i, item in enumerate(items):
|
for i, item in enumerate(items):
|
||||||
if item['id'] == marker:
|
if item['id'] == marker or item.get('uuid') == marker:
|
||||||
start_index = i + 1
|
start_index = i + 1
|
||||||
break
|
break
|
||||||
if start_index < 0:
|
if start_index < 0:
|
||||||
|
@ -19,6 +19,7 @@ from webob import exc
|
|||||||
import webob
|
import webob
|
||||||
|
|
||||||
from nova import compute
|
from nova import compute
|
||||||
|
from nova import db
|
||||||
from nova import exception
|
from nova import exception
|
||||||
from nova import flags
|
from nova import flags
|
||||||
from nova import log as logging
|
from nova import log as logging
|
||||||
@ -200,8 +201,8 @@ def _translate_attachment_summary_view(_context, vol):
|
|||||||
d['id'] = volume_id
|
d['id'] = volume_id
|
||||||
|
|
||||||
d['volumeId'] = volume_id
|
d['volumeId'] = volume_id
|
||||||
if vol.get('instance_id'):
|
if vol.get('instance'):
|
||||||
d['serverId'] = vol['instance_id']
|
d['serverId'] = vol['instance']['uuid']
|
||||||
if vol.get('mountpoint'):
|
if vol.get('mountpoint'):
|
||||||
d['device'] = vol['mountpoint']
|
d['device'] = vol['mountpoint']
|
||||||
|
|
||||||
@ -245,7 +246,8 @@ class VolumeAttachmentController(object):
|
|||||||
LOG.debug("volume_id not found")
|
LOG.debug("volume_id not found")
|
||||||
return faults.Fault(exc.HTTPNotFound())
|
return faults.Fault(exc.HTTPNotFound())
|
||||||
|
|
||||||
if str(vol['instance_id']) != server_id:
|
instance = vol['instance']
|
||||||
|
if instance is None or str(instance['uuid']) != server_id:
|
||||||
LOG.debug("instance_id != server_id")
|
LOG.debug("instance_id != server_id")
|
||||||
return faults.Fault(exc.HTTPNotFound())
|
return faults.Fault(exc.HTTPNotFound())
|
||||||
|
|
||||||
@ -307,7 +309,8 @@ class VolumeAttachmentController(object):
|
|||||||
except exception.NotFound:
|
except exception.NotFound:
|
||||||
return faults.Fault(exc.HTTPNotFound())
|
return faults.Fault(exc.HTTPNotFound())
|
||||||
|
|
||||||
if str(vol['instance_id']) != server_id:
|
instance = vol['instance']
|
||||||
|
if instance is None or str(instance['uuid']) != server_id:
|
||||||
LOG.debug("instance_id != server_id")
|
LOG.debug("instance_id != server_id")
|
||||||
return faults.Fault(exc.HTTPNotFound())
|
return faults.Fault(exc.HTTPNotFound())
|
||||||
|
|
||||||
|
@ -4,7 +4,6 @@
|
|||||||
<attribute name="userId"> <text/> </attribute>
|
<attribute name="userId"> <text/> </attribute>
|
||||||
<attribute name="tenantId"> <text/> </attribute>
|
<attribute name="tenantId"> <text/> </attribute>
|
||||||
<attribute name="id"> <text/> </attribute>
|
<attribute name="id"> <text/> </attribute>
|
||||||
<attribute name="uuid"> <text/> </attribute>
|
|
||||||
<attribute name="updated"> <text/> </attribute>
|
<attribute name="updated"> <text/> </attribute>
|
||||||
<attribute name="created"> <text/> </attribute>
|
<attribute name="created"> <text/> </attribute>
|
||||||
<attribute name="hostId"> <text/> </attribute>
|
<attribute name="hostId"> <text/> </attribute>
|
||||||
|
@ -204,7 +204,7 @@ class Controller(object):
|
|||||||
return kernel_id, ramdisk_id
|
return kernel_id, ramdisk_id
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _do_get_kernel_ramdisk_from_image(image_meta):
|
def _do_get_kernel_ramdisk_from_image(image_meta):
|
||||||
"""Given an ImageService image_meta, return kernel and ramdisk image
|
"""Given an ImageService image_meta, return kernel and ramdisk image
|
||||||
ids if present.
|
ids if present.
|
||||||
|
|
||||||
@ -585,6 +585,7 @@ class Controller(object):
|
|||||||
rotation factor to be deleted.
|
rotation factor to be deleted.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
context = req.environ["nova.context"]
|
||||||
entity = input_dict["createBackup"]
|
entity = input_dict["createBackup"]
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@ -607,13 +608,10 @@ class Controller(object):
|
|||||||
raise exc.HTTPBadRequest(explanation=msg)
|
raise exc.HTTPBadRequest(explanation=msg)
|
||||||
|
|
||||||
# preserve link to server in image properties
|
# preserve link to server in image properties
|
||||||
server_ref = os.path.join(req.application_url,
|
server_ref = os.path.join(req.application_url, 'servers', instance_id)
|
||||||
'servers',
|
|
||||||
str(instance_id))
|
|
||||||
props = {'instance_ref': server_ref}
|
props = {'instance_ref': server_ref}
|
||||||
|
|
||||||
metadata = entity.get('metadata', {})
|
metadata = entity.get('metadata', {})
|
||||||
context = req.environ["nova.context"]
|
|
||||||
common.check_img_metadata_quota_limit(context, metadata)
|
common.check_img_metadata_quota_limit(context, metadata)
|
||||||
try:
|
try:
|
||||||
props.update(metadata)
|
props.update(metadata)
|
||||||
@ -678,44 +676,6 @@ class Controller(object):
|
|||||||
raise exc.HTTPUnprocessableEntity()
|
raise exc.HTTPUnprocessableEntity()
|
||||||
return webob.Response(status_int=202)
|
return webob.Response(status_int=202)
|
||||||
|
|
||||||
@exception.novaclient_converter
|
|
||||||
@scheduler_api.redirect_handler
|
|
||||||
def get_lock(self, req, id):
|
|
||||||
"""
|
|
||||||
return the boolean state of (instance with id)'s lock
|
|
||||||
|
|
||||||
"""
|
|
||||||
context = req.environ['nova.context']
|
|
||||||
try:
|
|
||||||
self.compute_api.get_lock(context, id)
|
|
||||||
except Exception:
|
|
||||||
readable = traceback.format_exc()
|
|
||||||
LOG.exception(_("Compute.api::get_lock %s"), readable)
|
|
||||||
raise exc.HTTPUnprocessableEntity()
|
|
||||||
return webob.Response(status_int=202)
|
|
||||||
|
|
||||||
@exception.novaclient_converter
|
|
||||||
@scheduler_api.redirect_handler
|
|
||||||
def get_ajax_console(self, req, id):
|
|
||||||
"""Returns a url to an instance's ajaxterm console."""
|
|
||||||
try:
|
|
||||||
self.compute_api.get_ajax_console(req.environ['nova.context'],
|
|
||||||
int(id))
|
|
||||||
except exception.NotFound:
|
|
||||||
raise exc.HTTPNotFound()
|
|
||||||
return webob.Response(status_int=202)
|
|
||||||
|
|
||||||
@exception.novaclient_converter
|
|
||||||
@scheduler_api.redirect_handler
|
|
||||||
def get_vnc_console(self, req, id):
|
|
||||||
"""Returns a url to an instance's ajaxterm console."""
|
|
||||||
try:
|
|
||||||
self.compute_api.get_vnc_console(req.environ['nova.context'],
|
|
||||||
int(id))
|
|
||||||
except exception.NotFound:
|
|
||||||
raise exc.HTTPNotFound()
|
|
||||||
return webob.Response(status_int=202)
|
|
||||||
|
|
||||||
@exception.novaclient_converter
|
@exception.novaclient_converter
|
||||||
@scheduler_api.redirect_handler
|
@scheduler_api.redirect_handler
|
||||||
def diagnostics(self, req, id):
|
def diagnostics(self, req, id):
|
||||||
@ -737,7 +697,7 @@ class Controller(object):
|
|||||||
error=item.error))
|
error=item.error))
|
||||||
return dict(actions=actions)
|
return dict(actions=actions)
|
||||||
|
|
||||||
def resize(self, req, instance_id, flavor_id):
|
def _resize(self, req, instance_id, flavor_id):
|
||||||
"""Begin the resize process with given instance/flavor."""
|
"""Begin the resize process with given instance/flavor."""
|
||||||
context = req.environ["nova.context"]
|
context = req.environ["nova.context"]
|
||||||
|
|
||||||
@ -870,7 +830,7 @@ class Controller(object):
|
|||||||
msg = _("Resize requests require 'flavorRef' attribute.")
|
msg = _("Resize requests require 'flavorRef' attribute.")
|
||||||
raise exc.HTTPBadRequest(explanation=msg)
|
raise exc.HTTPBadRequest(explanation=msg)
|
||||||
|
|
||||||
return self.resize(req, id, flavor_ref)
|
return self._resize(req, id, flavor_ref)
|
||||||
|
|
||||||
def _action_rebuild(self, info, request, instance_id):
|
def _action_rebuild(self, info, request, instance_id):
|
||||||
context = request.environ['nova.context']
|
context = request.environ['nova.context']
|
||||||
@ -915,6 +875,7 @@ class Controller(object):
|
|||||||
@common.check_snapshots_enabled
|
@common.check_snapshots_enabled
|
||||||
def _action_create_image(self, input_dict, req, instance_id):
|
def _action_create_image(self, input_dict, req, instance_id):
|
||||||
"""Snapshot a server instance."""
|
"""Snapshot a server instance."""
|
||||||
|
context = req.environ['nova.context']
|
||||||
entity = input_dict.get("createImage", {})
|
entity = input_dict.get("createImage", {})
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@ -929,13 +890,10 @@ class Controller(object):
|
|||||||
raise exc.HTTPBadRequest(explanation=msg)
|
raise exc.HTTPBadRequest(explanation=msg)
|
||||||
|
|
||||||
# preserve link to server in image properties
|
# preserve link to server in image properties
|
||||||
server_ref = os.path.join(req.application_url,
|
server_ref = os.path.join(req.application_url, 'servers', instance_id)
|
||||||
'servers',
|
|
||||||
str(instance_id))
|
|
||||||
props = {'instance_ref': server_ref}
|
props = {'instance_ref': server_ref}
|
||||||
|
|
||||||
metadata = entity.get('metadata', {})
|
metadata = entity.get('metadata', {})
|
||||||
context = req.environ['nova.context']
|
|
||||||
common.check_img_metadata_quota_limit(context, metadata)
|
common.check_img_metadata_quota_limit(context, metadata)
|
||||||
try:
|
try:
|
||||||
props.update(metadata)
|
props.update(metadata)
|
||||||
@ -998,7 +956,6 @@ def make_server(elem, detailed=False):
|
|||||||
elem.set('id')
|
elem.set('id')
|
||||||
|
|
||||||
if detailed:
|
if detailed:
|
||||||
elem.set('uuid')
|
|
||||||
elem.set('userId', 'user_id')
|
elem.set('userId', 'user_id')
|
||||||
elem.set('tenantId', 'tenant_id')
|
elem.set('tenantId', 'tenant_id')
|
||||||
elem.set('updated')
|
elem.set('updated')
|
||||||
|
@ -52,13 +52,12 @@ class ViewBuilder(object):
|
|||||||
server = self._build_simple(inst)
|
server = self._build_simple(inst)
|
||||||
|
|
||||||
self._build_links(server['server'], inst)
|
self._build_links(server['server'], inst)
|
||||||
server['server']['uuid'] = inst['uuid']
|
|
||||||
|
|
||||||
return server
|
return server
|
||||||
|
|
||||||
def _build_simple(self, inst):
|
def _build_simple(self, inst):
|
||||||
"""Return a simple model of a server."""
|
"""Return a simple model of a server."""
|
||||||
return dict(server=dict(id=inst['id'], name=inst['display_name']))
|
return dict(server=dict(id=inst['uuid'], name=inst['display_name']))
|
||||||
|
|
||||||
def _build_detail(self, inst):
|
def _build_detail(self, inst):
|
||||||
"""Returns a detailed model of a server."""
|
"""Returns a detailed model of a server."""
|
||||||
@ -66,7 +65,7 @@ class ViewBuilder(object):
|
|||||||
task_state = inst.get('task_state')
|
task_state = inst.get('task_state')
|
||||||
|
|
||||||
inst_dict = {
|
inst_dict = {
|
||||||
'id': inst['id'],
|
'id': inst['uuid'],
|
||||||
'name': inst['display_name'],
|
'name': inst['display_name'],
|
||||||
'user_id': inst.get('user_id', ''),
|
'user_id': inst.get('user_id', ''),
|
||||||
'tenant_id': inst.get('project_id', ''),
|
'tenant_id': inst.get('project_id', ''),
|
||||||
@ -137,8 +136,8 @@ class ViewBuilder(object):
|
|||||||
}
|
}
|
||||||
|
|
||||||
def _build_links(self, response, inst):
|
def _build_links(self, response, inst):
|
||||||
href = self.generate_href(inst["id"])
|
href = self.generate_href(inst["uuid"])
|
||||||
bookmark = self.generate_bookmark(inst["id"])
|
bookmark = self.generate_bookmark(inst["uuid"])
|
||||||
|
|
||||||
links = [
|
links = [
|
||||||
{
|
{
|
||||||
|
@ -1481,7 +1481,7 @@ class API(base.Base):
|
|||||||
self.db.queue_get_for(context, FLAGS.compute_topic, host),
|
self.db.queue_get_for(context, FLAGS.compute_topic, host),
|
||||||
{"method": "attach_volume",
|
{"method": "attach_volume",
|
||||||
"args": {"volume_id": volume_id,
|
"args": {"volume_id": volume_id,
|
||||||
"instance_id": instance_id,
|
"instance_id": instance['id'],
|
||||||
"mountpoint": device}})
|
"mountpoint": device}})
|
||||||
|
|
||||||
def detach_volume(self, context, volume_id):
|
def detach_volume(self, context, volume_id):
|
||||||
|
@ -45,7 +45,7 @@ class AdminActionsTest(test.TestCase):
|
|||||||
def test_admin_api_enabled(self):
|
def test_admin_api_enabled(self):
|
||||||
app = fakes.wsgi_app()
|
app = fakes.wsgi_app()
|
||||||
for _action in self._actions:
|
for _action in self._actions:
|
||||||
req = webob.Request.blank('/v1.1/fake/servers/1/action')
|
req = webob.Request.blank('/v1.1/fake/servers/abcd/action')
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.body = json.dumps({_action: None})
|
req.body = json.dumps({_action: None})
|
||||||
req.content_type = 'application/json'
|
req.content_type = 'application/json'
|
||||||
@ -56,7 +56,7 @@ class AdminActionsTest(test.TestCase):
|
|||||||
FLAGS.allow_admin_api = False
|
FLAGS.allow_admin_api = False
|
||||||
app = fakes.wsgi_app()
|
app = fakes.wsgi_app()
|
||||||
for _action in self._actions:
|
for _action in self._actions:
|
||||||
req = webob.Request.blank('/v1.1/fake/servers/1/action')
|
req = webob.Request.blank('/v1.1/fake/servers/abcd/action')
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.body = json.dumps({_action: None})
|
req.body = json.dumps({_action: None})
|
||||||
req.content_type = 'application/json'
|
req.content_type = 'application/json'
|
||||||
|
@ -27,18 +27,23 @@ from nova.tests.api.openstack import fakes
|
|||||||
|
|
||||||
class DiskConfigTest(test.TestCase):
|
class DiskConfigTest(test.TestCase):
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
super(DiskConfigTest, self).setUp()
|
||||||
|
self.uuid = '70f6db34-de8d-4fbd-aafb-4065bdfa6114'
|
||||||
|
self.url = '/v1.1/openstack/servers/%s/os-disk-config' % self.uuid
|
||||||
|
|
||||||
def test_retrieve_disk_config(self):
|
def test_retrieve_disk_config(self):
|
||||||
def fake_compute_get(*args, **kwargs):
|
def fake_compute_get(*args, **kwargs):
|
||||||
return {'managed_disk': True}
|
return {'managed_disk': True}
|
||||||
|
|
||||||
self.stubs.Set(compute.api.API, 'routing_get', fake_compute_get)
|
self.stubs.Set(compute.api.API, 'routing_get', fake_compute_get)
|
||||||
req = webob.Request.blank('/v1.1/openstack/servers/50/os-disk-config')
|
req = webob.Request.blank(self.url)
|
||||||
req.headers['Accept'] = 'application/json'
|
req.headers['Accept'] = 'application/json'
|
||||||
res = req.get_response(fakes.wsgi_app())
|
res = req.get_response(fakes.wsgi_app())
|
||||||
self.assertEqual(res.status_int, 200)
|
self.assertEqual(res.status_int, 200)
|
||||||
body = json.loads(res.body)
|
body = json.loads(res.body)
|
||||||
self.assertEqual(body['server']['managed_disk'], True)
|
self.assertEqual(body['server']['managed_disk'], True)
|
||||||
self.assertEqual(int(body['server']['id']), 50)
|
self.assertEqual(body['server']['id'], self.uuid)
|
||||||
|
|
||||||
def test_set_disk_config(self):
|
def test_set_disk_config(self):
|
||||||
def fake_compute_get(*args, **kwargs):
|
def fake_compute_get(*args, **kwargs):
|
||||||
@ -50,7 +55,7 @@ class DiskConfigTest(test.TestCase):
|
|||||||
self.stubs.Set(compute.api.API, 'update', fake_compute_update)
|
self.stubs.Set(compute.api.API, 'update', fake_compute_update)
|
||||||
self.stubs.Set(compute.api.API, 'routing_get', fake_compute_get)
|
self.stubs.Set(compute.api.API, 'routing_get', fake_compute_get)
|
||||||
|
|
||||||
req = webob.Request.blank('/v1.1/openstack/servers/50/os-disk-config')
|
req = webob.Request.blank(self.url)
|
||||||
req.method = 'PUT'
|
req.method = 'PUT'
|
||||||
req.headers['Accept'] = 'application/json'
|
req.headers['Accept'] = 'application/json'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
@ -60,14 +65,14 @@ class DiskConfigTest(test.TestCase):
|
|||||||
self.assertEqual(res.status_int, 200)
|
self.assertEqual(res.status_int, 200)
|
||||||
body = json.loads(res.body)
|
body = json.loads(res.body)
|
||||||
self.assertEqual(body['server']['managed_disk'], False)
|
self.assertEqual(body['server']['managed_disk'], False)
|
||||||
self.assertEqual(int(body['server']['id']), 50)
|
self.assertEqual(body['server']['id'], self.uuid)
|
||||||
|
|
||||||
def test_retrieve_disk_config_bad_server_fails(self):
|
def test_retrieve_disk_config_bad_server_fails(self):
|
||||||
def fake_compute_get(*args, **kwargs):
|
def fake_compute_get(*args, **kwargs):
|
||||||
raise exception.NotFound()
|
raise exception.NotFound()
|
||||||
|
|
||||||
self.stubs.Set(compute.api.API, 'routing_get', fake_compute_get)
|
self.stubs.Set(compute.api.API, 'routing_get', fake_compute_get)
|
||||||
req = webob.Request.blank('/v1.1/openstack/servers/50/os-disk-config')
|
req = webob.Request.blank(self.url)
|
||||||
req.headers['Accept'] = 'application/json'
|
req.headers['Accept'] = 'application/json'
|
||||||
res = req.get_response(fakes.wsgi_app())
|
res = req.get_response(fakes.wsgi_app())
|
||||||
self.assertEqual(res.status_int, 404)
|
self.assertEqual(res.status_int, 404)
|
||||||
@ -84,7 +89,7 @@ class DiskConfigTest(test.TestCase):
|
|||||||
self.stubs.Set(compute.api.API, 'update', fake_compute_update)
|
self.stubs.Set(compute.api.API, 'update', fake_compute_update)
|
||||||
self.stubs.Set(compute.api.API, 'routing_get', fake_compute_get)
|
self.stubs.Set(compute.api.API, 'routing_get', fake_compute_get)
|
||||||
|
|
||||||
req = webob.Request.blank('/v1.1/openstack/servers/50/os-disk-config')
|
req = webob.Request.blank(self.url)
|
||||||
req.method = 'PUT'
|
req.method = 'PUT'
|
||||||
req.headers['Accept'] = 'application/json'
|
req.headers['Accept'] = 'application/json'
|
||||||
req.headers['Content-Type'] = 'application/json'
|
req.headers['Content-Type'] = 'application/json'
|
||||||
|
@ -42,7 +42,8 @@ class ServerVirtualInterfaceTest(test.TestCase):
|
|||||||
super(ServerVirtualInterfaceTest, self).tearDown()
|
super(ServerVirtualInterfaceTest, self).tearDown()
|
||||||
|
|
||||||
def test_get_virtual_interfaces_list(self):
|
def test_get_virtual_interfaces_list(self):
|
||||||
req = webob.Request.blank('/v1.1/123/servers/1/os-virtual-interfaces')
|
url = '/v1.1/123/servers/abcd/os-virtual-interfaces'
|
||||||
|
req = webob.Request.blank(url)
|
||||||
res = req.get_response(fakes.wsgi_app())
|
res = req.get_response(fakes.wsgi_app())
|
||||||
self.assertEqual(res.status_int, 200)
|
self.assertEqual(res.status_int, 200)
|
||||||
res_dict = json.loads(res.body)
|
res_dict = json.loads(res.body)
|
||||||
|
@ -22,12 +22,14 @@ from nova import flags
|
|||||||
from nova import test
|
from nova import test
|
||||||
from nova.compute import instance_types
|
from nova.compute import instance_types
|
||||||
from nova.tests.api.openstack import fakes
|
from nova.tests.api.openstack import fakes
|
||||||
from nova.tests.api.openstack.test_servers import fake_gen_uuid
|
|
||||||
|
|
||||||
|
|
||||||
FLAGS = flags.FLAGS
|
FLAGS = flags.FLAGS
|
||||||
|
|
||||||
|
|
||||||
|
FAKE_UUID = 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa'
|
||||||
|
|
||||||
|
|
||||||
def fake_compute_api_create(cls, context, instance_type, image_href, **kwargs):
|
def fake_compute_api_create(cls, context, instance_type, image_href, **kwargs):
|
||||||
global _block_device_mapping_seen
|
global _block_device_mapping_seen
|
||||||
_block_device_mapping_seen = kwargs.get('block_device_mapping')
|
_block_device_mapping_seen = kwargs.get('block_device_mapping')
|
||||||
@ -36,7 +38,7 @@ def fake_compute_api_create(cls, context, instance_type, image_href, **kwargs):
|
|||||||
resv_id = None
|
resv_id = None
|
||||||
return ([{'id': 1,
|
return ([{'id': 1,
|
||||||
'display_name': 'test_server',
|
'display_name': 'test_server',
|
||||||
'uuid': fake_gen_uuid(),
|
'uuid': FAKE_UUID,
|
||||||
'instance_type': dict(inst_type),
|
'instance_type': dict(inst_type),
|
||||||
'access_ip_v4': '1.2.3.4',
|
'access_ip_v4': '1.2.3.4',
|
||||||
'access_ip_v6': 'fead::1234',
|
'access_ip_v6': 'fead::1234',
|
||||||
@ -76,7 +78,7 @@ class BootFromVolumeTest(test.TestCase):
|
|||||||
res = req.get_response(fakes.wsgi_app())
|
res = req.get_response(fakes.wsgi_app())
|
||||||
self.assertEqual(res.status_int, 200)
|
self.assertEqual(res.status_int, 200)
|
||||||
server = json.loads(res.body)['server']
|
server = json.loads(res.body)['server']
|
||||||
self.assertEqual(1, server['id'])
|
self.assertEqual(FAKE_UUID, server['id'])
|
||||||
self.assertEqual(2, int(server['flavor']['id']))
|
self.assertEqual(2, int(server['flavor']['id']))
|
||||||
self.assertEqual(u'test_server', server['name'])
|
self.assertEqual(u'test_server', server['name'])
|
||||||
self.assertEqual(3, int(server['image']['id']))
|
self.assertEqual(3, int(server['image']['id']))
|
||||||
|
@ -149,22 +149,34 @@ def stub_out_networking(stubs):
|
|||||||
stubs.Set(nova.flags, '_get_my_ip', get_my_ip)
|
stubs.Set(nova.flags, '_get_my_ip', get_my_ip)
|
||||||
|
|
||||||
|
|
||||||
def stub_out_compute_api_snapshot(stubs):
|
class stub_out_compute_api_snapshot(object):
|
||||||
|
|
||||||
|
def __init__(self, stubs):
|
||||||
|
self.stubs = stubs
|
||||||
|
self.extra_props_last_call = None
|
||||||
|
stubs.Set(nova.compute.API, 'snapshot', self.snapshot)
|
||||||
|
|
||||||
def snapshot(self, context, instance_id, name, extra_properties=None):
|
def snapshot(self, context, instance_id, name, extra_properties=None):
|
||||||
|
self.extra_props_last_call = extra_properties
|
||||||
props = dict(instance_id=instance_id, instance_ref=instance_id)
|
props = dict(instance_id=instance_id, instance_ref=instance_id)
|
||||||
props.update(extra_properties or {})
|
props.update(extra_properties or {})
|
||||||
return dict(id='123', status='ACTIVE', name=name, properties=props)
|
return dict(id='123', status='ACTIVE', name=name, properties=props)
|
||||||
stubs.Set(nova.compute.API, 'snapshot', snapshot)
|
|
||||||
|
|
||||||
|
|
||||||
def stub_out_compute_api_backup(stubs):
|
class stub_out_compute_api_backup(object):
|
||||||
|
|
||||||
|
def __init__(self, stubs):
|
||||||
|
self.stubs = stubs
|
||||||
|
self.extra_props_last_call = None
|
||||||
|
stubs.Set(nova.compute.API, 'backup', self.backup)
|
||||||
|
|
||||||
def backup(self, context, instance_id, name, backup_type, rotation,
|
def backup(self, context, instance_id, name, backup_type, rotation,
|
||||||
extra_properties=None):
|
extra_properties=None):
|
||||||
|
self.extra_props_last_call = extra_properties
|
||||||
props = dict(instance_id=instance_id, instance_ref=instance_id,
|
props = dict(instance_id=instance_id, instance_ref=instance_id,
|
||||||
backup_type=backup_type, rotation=rotation)
|
backup_type=backup_type, rotation=rotation)
|
||||||
props.update(extra_properties or {})
|
props.update(extra_properties or {})
|
||||||
return dict(id='123', status='ACTIVE', name=name, properties=props)
|
return dict(id='123', status='ACTIVE', name=name, properties=props)
|
||||||
stubs.Set(nova.compute.API, 'backup', backup)
|
|
||||||
|
|
||||||
|
|
||||||
def stub_out_nw_api_get_instance_nw_info(stubs, func=None):
|
def stub_out_nw_api_get_instance_nw_info(stubs, func=None):
|
||||||
@ -225,7 +237,8 @@ def _make_image_fixtures():
|
|||||||
image_id += 1
|
image_id += 1
|
||||||
|
|
||||||
# Snapshot for User 1
|
# Snapshot for User 1
|
||||||
server_ref = 'http://localhost/v1.1/servers/42'
|
uuid = 'aa640691-d1a7-4a67-9d3c-d35ee6b3cc74'
|
||||||
|
server_ref = 'http://localhost/v1.1/servers/' + uuid
|
||||||
snapshot_properties = {'instance_ref': server_ref, 'user_id': 'fake'}
|
snapshot_properties = {'instance_ref': server_ref, 'user_id': 'fake'}
|
||||||
for status in ('queued', 'saving', 'active', 'killed',
|
for status in ('queued', 'saving', 'active', 'killed',
|
||||||
'deleted', 'pending_delete'):
|
'deleted', 'pending_delete'):
|
||||||
|
@ -172,14 +172,9 @@ class PaginationParamsTest(test.TestCase):
|
|||||||
|
|
||||||
def test_valid_marker(self):
|
def test_valid_marker(self):
|
||||||
""" Test valid marker param. """
|
""" Test valid marker param. """
|
||||||
req = Request.blank('/?marker=1')
|
req = Request.blank('/?marker=263abb28-1de6-412f-b00b-f0ee0c4333c2')
|
||||||
self.assertEqual(common.get_pagination_params(req), {'marker': 1})
|
self.assertEqual(common.get_pagination_params(req),
|
||||||
|
{'marker': '263abb28-1de6-412f-b00b-f0ee0c4333c2'})
|
||||||
def test_invalid_marker(self):
|
|
||||||
""" Test invalid marker param. """
|
|
||||||
req = Request.blank('/?marker=-2')
|
|
||||||
self.assertRaises(
|
|
||||||
webob.exc.HTTPBadRequest, common.get_pagination_params, req)
|
|
||||||
|
|
||||||
def test_valid_limit(self):
|
def test_valid_limit(self):
|
||||||
""" Test valid limit param. """
|
""" Test valid limit param. """
|
||||||
@ -194,9 +189,10 @@ class PaginationParamsTest(test.TestCase):
|
|||||||
|
|
||||||
def test_valid_limit_and_marker(self):
|
def test_valid_limit_and_marker(self):
|
||||||
""" Test valid limit and marker parameters. """
|
""" Test valid limit and marker parameters. """
|
||||||
req = Request.blank('/?limit=20&marker=40')
|
marker = '263abb28-1de6-412f-b00b-f0ee0c4333c2'
|
||||||
|
req = Request.blank('/?limit=20&marker=%s' % marker)
|
||||||
self.assertEqual(common.get_pagination_params(req),
|
self.assertEqual(common.get_pagination_params(req),
|
||||||
{'marker': 40, 'limit': 20})
|
{'marker': marker, 'limit': 20})
|
||||||
|
|
||||||
|
|
||||||
class MiscFunctionsTest(test.TestCase):
|
class MiscFunctionsTest(test.TestCase):
|
||||||
|
@ -297,7 +297,7 @@ class ActionExtensionTest(ExtensionTestCase):
|
|||||||
|
|
||||||
def test_extended_action(self):
|
def test_extended_action(self):
|
||||||
body = dict(add_tweedle=dict(name="test"))
|
body = dict(add_tweedle=dict(name="test"))
|
||||||
url = "/123/servers/1/action"
|
url = "/123/servers/abcd/action"
|
||||||
response = self._send_server_action_request(url, body)
|
response = self._send_server_action_request(url, body)
|
||||||
self.assertEqual(200, response.status_int)
|
self.assertEqual(200, response.status_int)
|
||||||
self.assertEqual("Tweedle Beetle Added.", response.body)
|
self.assertEqual("Tweedle Beetle Added.", response.body)
|
||||||
@ -309,7 +309,7 @@ class ActionExtensionTest(ExtensionTestCase):
|
|||||||
|
|
||||||
def test_invalid_action_body(self):
|
def test_invalid_action_body(self):
|
||||||
body = dict(blah=dict(name="test")) # Doesn't exist
|
body = dict(blah=dict(name="test")) # Doesn't exist
|
||||||
url = "/123/servers/1/action"
|
url = "/123/servers/abcd/action"
|
||||||
response = self._send_server_action_request(url, body)
|
response = self._send_server_action_request(url, body)
|
||||||
self.assertEqual(400, response.status_int)
|
self.assertEqual(400, response.status_int)
|
||||||
|
|
||||||
|
@ -69,8 +69,9 @@ class ImagesControllerTest(test.TestCase):
|
|||||||
href = "http://localhost/v1.1/fake/images/124"
|
href = "http://localhost/v1.1/fake/images/124"
|
||||||
bookmark = "http://localhost/fake/images/124"
|
bookmark = "http://localhost/fake/images/124"
|
||||||
alternate = "%s/fake/images/124" % utils.generate_glance_url()
|
alternate = "%s/fake/images/124" % utils.generate_glance_url()
|
||||||
server_href = "http://localhost/v1.1/servers/42"
|
server_uuid = "aa640691-d1a7-4a67-9d3c-d35ee6b3cc74"
|
||||||
server_bookmark = "http://localhost/servers/42"
|
server_href = "http://localhost/v1.1/servers/" + server_uuid
|
||||||
|
server_bookmark = "http://localhost/servers/" + server_uuid
|
||||||
|
|
||||||
expected_image = {
|
expected_image = {
|
||||||
"image": {
|
"image": {
|
||||||
@ -83,7 +84,7 @@ class ImagesControllerTest(test.TestCase):
|
|||||||
"minDisk": 0,
|
"minDisk": 0,
|
||||||
"minRam": 0,
|
"minRam": 0,
|
||||||
'server': {
|
'server': {
|
||||||
'id': '42',
|
'id': server_uuid,
|
||||||
"links": [{
|
"links": [{
|
||||||
"rel": "self",
|
"rel": "self",
|
||||||
"href": server_href,
|
"href": server_href,
|
||||||
@ -94,7 +95,7 @@ class ImagesControllerTest(test.TestCase):
|
|||||||
}],
|
}],
|
||||||
},
|
},
|
||||||
"metadata": {
|
"metadata": {
|
||||||
"instance_ref": "http://localhost/v1.1/servers/42",
|
"instance_ref": server_href,
|
||||||
"user_id": "fake",
|
"user_id": "fake",
|
||||||
},
|
},
|
||||||
"links": [{
|
"links": [{
|
||||||
@ -113,7 +114,7 @@ class ImagesControllerTest(test.TestCase):
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
self.assertEqual(expected_image, actual_image)
|
self.assertDictMatch(expected_image, actual_image)
|
||||||
|
|
||||||
def test_get_image_404(self):
|
def test_get_image_404(self):
|
||||||
fake_req = fakes.HTTPRequest.blank('/v1.1/fake/images/unknown')
|
fake_req = fakes.HTTPRequest.blank('/v1.1/fake/images/unknown')
|
||||||
@ -395,8 +396,9 @@ class ImagesControllerTest(test.TestCase):
|
|||||||
response = self.controller.detail(request)
|
response = self.controller.detail(request)
|
||||||
response_list = response["images"]
|
response_list = response["images"]
|
||||||
|
|
||||||
server_href = "http://localhost/v1.1/servers/42"
|
server_uuid = "aa640691-d1a7-4a67-9d3c-d35ee6b3cc74"
|
||||||
server_bookmark = "http://localhost/servers/42"
|
server_href = "http://localhost/v1.1/servers/" + server_uuid
|
||||||
|
server_bookmark = "http://localhost/servers/" + server_uuid
|
||||||
alternate = "%s/fake/images/%s"
|
alternate = "%s/fake/images/%s"
|
||||||
|
|
||||||
expected = [{
|
expected = [{
|
||||||
@ -427,7 +429,7 @@ class ImagesControllerTest(test.TestCase):
|
|||||||
'id': '124',
|
'id': '124',
|
||||||
'name': 'queued snapshot',
|
'name': 'queued snapshot',
|
||||||
'metadata': {
|
'metadata': {
|
||||||
u'instance_ref': u'http://localhost/v1.1/servers/42',
|
u'instance_ref': server_href,
|
||||||
u'user_id': u'fake',
|
u'user_id': u'fake',
|
||||||
},
|
},
|
||||||
'updated': NOW_API_FORMAT,
|
'updated': NOW_API_FORMAT,
|
||||||
@ -437,7 +439,7 @@ class ImagesControllerTest(test.TestCase):
|
|||||||
'minDisk': 0,
|
'minDisk': 0,
|
||||||
'minRam': 0,
|
'minRam': 0,
|
||||||
'server': {
|
'server': {
|
||||||
'id': '42',
|
'id': server_uuid,
|
||||||
"links": [{
|
"links": [{
|
||||||
"rel": "self",
|
"rel": "self",
|
||||||
"href": server_href,
|
"href": server_href,
|
||||||
@ -465,7 +467,7 @@ class ImagesControllerTest(test.TestCase):
|
|||||||
'id': '125',
|
'id': '125',
|
||||||
'name': 'saving snapshot',
|
'name': 'saving snapshot',
|
||||||
'metadata': {
|
'metadata': {
|
||||||
u'instance_ref': u'http://localhost/v1.1/servers/42',
|
u'instance_ref': server_href,
|
||||||
u'user_id': u'fake',
|
u'user_id': u'fake',
|
||||||
},
|
},
|
||||||
'updated': NOW_API_FORMAT,
|
'updated': NOW_API_FORMAT,
|
||||||
@ -475,7 +477,7 @@ class ImagesControllerTest(test.TestCase):
|
|||||||
'minDisk': 0,
|
'minDisk': 0,
|
||||||
'minRam': 0,
|
'minRam': 0,
|
||||||
'server': {
|
'server': {
|
||||||
'id': '42',
|
'id': server_uuid,
|
||||||
"links": [{
|
"links": [{
|
||||||
"rel": "self",
|
"rel": "self",
|
||||||
"href": server_href,
|
"href": server_href,
|
||||||
@ -503,7 +505,7 @@ class ImagesControllerTest(test.TestCase):
|
|||||||
'id': '126',
|
'id': '126',
|
||||||
'name': 'active snapshot',
|
'name': 'active snapshot',
|
||||||
'metadata': {
|
'metadata': {
|
||||||
u'instance_ref': u'http://localhost/v1.1/servers/42',
|
u'instance_ref': server_href,
|
||||||
u'user_id': u'fake',
|
u'user_id': u'fake',
|
||||||
},
|
},
|
||||||
'updated': NOW_API_FORMAT,
|
'updated': NOW_API_FORMAT,
|
||||||
@ -513,7 +515,7 @@ class ImagesControllerTest(test.TestCase):
|
|||||||
'minDisk': 0,
|
'minDisk': 0,
|
||||||
'minRam': 0,
|
'minRam': 0,
|
||||||
'server': {
|
'server': {
|
||||||
'id': '42',
|
'id': server_uuid,
|
||||||
"links": [{
|
"links": [{
|
||||||
"rel": "self",
|
"rel": "self",
|
||||||
"href": server_href,
|
"href": server_href,
|
||||||
@ -541,7 +543,7 @@ class ImagesControllerTest(test.TestCase):
|
|||||||
'id': '127',
|
'id': '127',
|
||||||
'name': 'killed snapshot',
|
'name': 'killed snapshot',
|
||||||
'metadata': {
|
'metadata': {
|
||||||
u'instance_ref': u'http://localhost/v1.1/servers/42',
|
u'instance_ref': server_href,
|
||||||
u'user_id': u'fake',
|
u'user_id': u'fake',
|
||||||
},
|
},
|
||||||
'updated': NOW_API_FORMAT,
|
'updated': NOW_API_FORMAT,
|
||||||
@ -551,7 +553,7 @@ class ImagesControllerTest(test.TestCase):
|
|||||||
'minDisk': 0,
|
'minDisk': 0,
|
||||||
'minRam': 0,
|
'minRam': 0,
|
||||||
'server': {
|
'server': {
|
||||||
'id': '42',
|
'id': server_uuid,
|
||||||
"links": [{
|
"links": [{
|
||||||
"rel": "self",
|
"rel": "self",
|
||||||
"href": server_href,
|
"href": server_href,
|
||||||
@ -579,7 +581,7 @@ class ImagesControllerTest(test.TestCase):
|
|||||||
'id': '128',
|
'id': '128',
|
||||||
'name': 'deleted snapshot',
|
'name': 'deleted snapshot',
|
||||||
'metadata': {
|
'metadata': {
|
||||||
u'instance_ref': u'http://localhost/v1.1/servers/42',
|
u'instance_ref': server_href,
|
||||||
u'user_id': u'fake',
|
u'user_id': u'fake',
|
||||||
},
|
},
|
||||||
'updated': NOW_API_FORMAT,
|
'updated': NOW_API_FORMAT,
|
||||||
@ -589,7 +591,7 @@ class ImagesControllerTest(test.TestCase):
|
|||||||
'minDisk': 0,
|
'minDisk': 0,
|
||||||
'minRam': 0,
|
'minRam': 0,
|
||||||
'server': {
|
'server': {
|
||||||
'id': '42',
|
'id': server_uuid,
|
||||||
"links": [{
|
"links": [{
|
||||||
"rel": "self",
|
"rel": "self",
|
||||||
"href": server_href,
|
"href": server_href,
|
||||||
@ -617,7 +619,7 @@ class ImagesControllerTest(test.TestCase):
|
|||||||
'id': '129',
|
'id': '129',
|
||||||
'name': 'pending_delete snapshot',
|
'name': 'pending_delete snapshot',
|
||||||
'metadata': {
|
'metadata': {
|
||||||
u'instance_ref': u'http://localhost/v1.1/servers/42',
|
u'instance_ref': server_href,
|
||||||
u'user_id': u'fake',
|
u'user_id': u'fake',
|
||||||
},
|
},
|
||||||
'updated': NOW_API_FORMAT,
|
'updated': NOW_API_FORMAT,
|
||||||
@ -627,7 +629,7 @@ class ImagesControllerTest(test.TestCase):
|
|||||||
'minDisk': 0,
|
'minDisk': 0,
|
||||||
'minRam': 0,
|
'minRam': 0,
|
||||||
'server': {
|
'server': {
|
||||||
'id': '42',
|
'id': server_uuid,
|
||||||
"links": [{
|
"links": [{
|
||||||
"rel": "self",
|
"rel": "self",
|
||||||
"href": server_href,
|
"href": server_href,
|
||||||
@ -685,8 +687,9 @@ class ImagesControllerTest(test.TestCase):
|
|||||||
response_list = response["images"]
|
response_list = response["images"]
|
||||||
response_links = response["images_links"]
|
response_links = response["images_links"]
|
||||||
|
|
||||||
server_href = "http://localhost/v1.1/servers/42"
|
server_uuid = "aa640691-d1a7-4a67-9d3c-d35ee6b3cc74"
|
||||||
server_bookmark = "http://localhost/servers/42"
|
server_href = "http://localhost/v1.1/servers/" + server_uuid
|
||||||
|
server_bookmark = "http://localhost/servers/" + server_uuid
|
||||||
alternate = "%s/fake/images/%s"
|
alternate = "%s/fake/images/%s"
|
||||||
|
|
||||||
expected = [{
|
expected = [{
|
||||||
@ -717,7 +720,7 @@ class ImagesControllerTest(test.TestCase):
|
|||||||
'id': '124',
|
'id': '124',
|
||||||
'name': 'queued snapshot',
|
'name': 'queued snapshot',
|
||||||
'metadata': {
|
'metadata': {
|
||||||
u'instance_ref': u'http://localhost/v1.1/servers/42',
|
u'instance_ref': server_href,
|
||||||
u'user_id': u'fake',
|
u'user_id': u'fake',
|
||||||
},
|
},
|
||||||
'updated': NOW_API_FORMAT,
|
'updated': NOW_API_FORMAT,
|
||||||
@ -727,7 +730,7 @@ class ImagesControllerTest(test.TestCase):
|
|||||||
'progress': 25,
|
'progress': 25,
|
||||||
'minRam': 0,
|
'minRam': 0,
|
||||||
'server': {
|
'server': {
|
||||||
'id': '42',
|
'id': server_uuid,
|
||||||
"links": [{
|
"links": [{
|
||||||
"rel": "self",
|
"rel": "self",
|
||||||
"href": server_href,
|
"href": server_href,
|
||||||
@ -817,10 +820,10 @@ class ImagesControllerTest(test.TestCase):
|
|||||||
|
|
||||||
def test_image_filter_server(self):
|
def test_image_filter_server(self):
|
||||||
image_service = self.mox.CreateMockAnything()
|
image_service = self.mox.CreateMockAnything()
|
||||||
# 'server' should be converted to 'property-instance_ref'
|
uuid = 'fa95aaf5-ab3b-4cd8-88c0-2be7dd051aaf'
|
||||||
filters = {'property-instance_ref': 'http://localhost:8774/servers/12'}
|
ref = 'http://localhost:8774/servers/' + uuid
|
||||||
request = fakes.HTTPRequest.blank('/v1.1/images?server='
|
filters = {'property-instance_ref': ref}
|
||||||
'http://localhost:8774/servers/12')
|
request = fakes.HTTPRequest.blank('/v1.1/images?server=' + ref)
|
||||||
context = request.environ['nova.context']
|
context = request.environ['nova.context']
|
||||||
image_service.index(context, filters=filters).AndReturn([])
|
image_service.index(context, filters=filters).AndReturn([])
|
||||||
self.mox.ReplayAll()
|
self.mox.ReplayAll()
|
||||||
@ -912,10 +915,11 @@ class ImagesControllerTest(test.TestCase):
|
|||||||
|
|
||||||
def test_image_detail_filter_server(self):
|
def test_image_detail_filter_server(self):
|
||||||
image_service = self.mox.CreateMockAnything()
|
image_service = self.mox.CreateMockAnything()
|
||||||
# 'server' should be converted to 'property-instance_ref'
|
uuid = 'fa95aaf5-ab3b-4cd8-88c0-2be7dd051aaf'
|
||||||
filters = {'property-instance_ref': 'http://localhost:8774/servers/12'}
|
ref = 'http://localhost:8774/servers/' + uuid
|
||||||
request = fakes.HTTPRequest.blank('/v1.1/fake/images/detail?server='
|
url = '/v1.1/fake/images/detail?server=' + ref
|
||||||
'http://localhost:8774/servers/12')
|
filters = {'property-instance_ref': ref}
|
||||||
|
request = fakes.HTTPRequest.blank(url)
|
||||||
context = request.environ['nova.context']
|
context = request.environ['nova.context']
|
||||||
image_service.index(context, filters=filters).AndReturn([])
|
image_service.index(context, filters=filters).AndReturn([])
|
||||||
self.mox.ReplayAll()
|
self.mox.ReplayAll()
|
||||||
@ -991,8 +995,9 @@ class ImagesControllerTest(test.TestCase):
|
|||||||
class ImageXMLSerializationTest(test.TestCase):
|
class ImageXMLSerializationTest(test.TestCase):
|
||||||
|
|
||||||
TIMESTAMP = "2010-10-11T10:30:22Z"
|
TIMESTAMP = "2010-10-11T10:30:22Z"
|
||||||
SERVER_HREF = 'http://localhost/v1.1/servers/123'
|
SERVER_UUID = 'aa640691-d1a7-4a67-9d3c-d35ee6b3cc74'
|
||||||
SERVER_BOOKMARK = 'http://localhost/servers/123'
|
SERVER_HREF = 'http://localhost/v1.1/servers/' + SERVER_UUID
|
||||||
|
SERVER_BOOKMARK = 'http://localhost/servers/' + SERVER_UUID
|
||||||
IMAGE_HREF = 'http://localhost/v1.1/fake/images/%s'
|
IMAGE_HREF = 'http://localhost/v1.1/fake/images/%s'
|
||||||
IMAGE_NEXT = 'http://localhost/v1.1/fake/images?limit=%s&marker=%s'
|
IMAGE_NEXT = 'http://localhost/v1.1/fake/images?limit=%s&marker=%s'
|
||||||
IMAGE_BOOKMARK = 'http://localhost/fake/images/%s'
|
IMAGE_BOOKMARK = 'http://localhost/fake/images/%s'
|
||||||
@ -1009,7 +1014,7 @@ class ImageXMLSerializationTest(test.TestCase):
|
|||||||
'status': 'ACTIVE',
|
'status': 'ACTIVE',
|
||||||
'progress': 80,
|
'progress': 80,
|
||||||
'server': {
|
'server': {
|
||||||
'id': '1',
|
'id': self.SERVER_UUID,
|
||||||
'links': [
|
'links': [
|
||||||
{
|
{
|
||||||
'href': self.SERVER_HREF,
|
'href': self.SERVER_HREF,
|
||||||
@ -1055,7 +1060,7 @@ class ImageXMLSerializationTest(test.TestCase):
|
|||||||
'minRam': 10,
|
'minRam': 10,
|
||||||
'minDisk': 100,
|
'minDisk': 100,
|
||||||
'server': {
|
'server': {
|
||||||
'id': '1',
|
'id': self.SERVER_UUID,
|
||||||
'links': [
|
'links': [
|
||||||
{
|
{
|
||||||
'href': self.SERVER_HREF,
|
'href': self.SERVER_HREF,
|
||||||
@ -1124,7 +1129,7 @@ class ImageXMLSerializationTest(test.TestCase):
|
|||||||
'updated': self.TIMESTAMP,
|
'updated': self.TIMESTAMP,
|
||||||
'status': 'ACTIVE',
|
'status': 'ACTIVE',
|
||||||
'server': {
|
'server': {
|
||||||
'id': '1',
|
'id': self.SERVER_UUID,
|
||||||
'links': [
|
'links': [
|
||||||
{
|
{
|
||||||
'href': self.SERVER_HREF,
|
'href': self.SERVER_HREF,
|
||||||
@ -1186,7 +1191,7 @@ class ImageXMLSerializationTest(test.TestCase):
|
|||||||
'updated': self.TIMESTAMP,
|
'updated': self.TIMESTAMP,
|
||||||
'status': 'ACTIVE',
|
'status': 'ACTIVE',
|
||||||
'server': {
|
'server': {
|
||||||
'id': '1',
|
'id': self.SERVER_UUID,
|
||||||
'links': [
|
'links': [
|
||||||
{
|
{
|
||||||
'href': self.SERVER_HREF,
|
'href': self.SERVER_HREF,
|
||||||
@ -1300,7 +1305,7 @@ class ImageXMLSerializationTest(test.TestCase):
|
|||||||
'progress': 80,
|
'progress': 80,
|
||||||
'minRam': 256,
|
'minRam': 256,
|
||||||
'server': {
|
'server': {
|
||||||
'id': '1',
|
'id': self.SERVER_UUID,
|
||||||
'links': [
|
'links': [
|
||||||
{
|
{
|
||||||
'href': self.SERVER_HREF,
|
'href': self.SERVER_HREF,
|
||||||
@ -1372,7 +1377,7 @@ class ImageXMLSerializationTest(test.TestCase):
|
|||||||
'progress': 80,
|
'progress': 80,
|
||||||
'minDisk': 5,
|
'minDisk': 5,
|
||||||
'server': {
|
'server': {
|
||||||
'id': '1',
|
'id': self.SERVER_UUID,
|
||||||
'links': [
|
'links': [
|
||||||
{
|
{
|
||||||
'href': self.SERVER_HREF,
|
'href': self.SERVER_HREF,
|
||||||
@ -1574,7 +1579,7 @@ class ImageXMLSerializationTest(test.TestCase):
|
|||||||
'updated': self.TIMESTAMP,
|
'updated': self.TIMESTAMP,
|
||||||
'status': 'ACTIVE',
|
'status': 'ACTIVE',
|
||||||
'server': {
|
'server': {
|
||||||
'id': '1',
|
'id': self.SERVER_UUID,
|
||||||
'links': [
|
'links': [
|
||||||
{
|
{
|
||||||
'href': self.SERVER_HREF,
|
'href': self.SERVER_HREF,
|
||||||
|
@ -19,12 +19,17 @@ from nova.tests.api.openstack import fakes
|
|||||||
|
|
||||||
|
|
||||||
FLAGS = flags.FLAGS
|
FLAGS = flags.FLAGS
|
||||||
|
FAKE_UUID = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
|
||||||
|
|
||||||
|
|
||||||
def return_server_by_id(context, id):
|
def return_server_by_id(context, id):
|
||||||
return stub_instance(id)
|
return stub_instance(id)
|
||||||
|
|
||||||
|
|
||||||
|
def return_server_by_uuid(context, uuid):
|
||||||
|
return stub_instance(1, uuid=uuid)
|
||||||
|
|
||||||
|
|
||||||
def instance_update(context, instance_id, kwargs):
|
def instance_update(context, instance_id, kwargs):
|
||||||
return stub_instance(instance_id)
|
return stub_instance(instance_id)
|
||||||
|
|
||||||
@ -47,12 +52,15 @@ def return_server_with_uuid_and_state(vm_state, task_state=None):
|
|||||||
|
|
||||||
|
|
||||||
def stub_instance(id, metadata=None, image_ref="10", flavor_id="1",
|
def stub_instance(id, metadata=None, image_ref="10", flavor_id="1",
|
||||||
name=None, vm_state=None, task_state=None):
|
name=None, vm_state=None, task_state=None, uuid=None):
|
||||||
if metadata is not None:
|
if metadata is not None:
|
||||||
metadata_items = [{'key':k, 'value':v} for k, v in metadata.items()]
|
metadata_items = [{'key':k, 'value':v} for k, v in metadata.items()]
|
||||||
else:
|
else:
|
||||||
metadata_items = [{'key':'seq', 'value':id}]
|
metadata_items = [{'key':'seq', 'value':id}]
|
||||||
|
|
||||||
|
if uuid is None:
|
||||||
|
uuid = FAKE_UUID
|
||||||
|
|
||||||
inst_type = instance_types.get_instance_type_by_flavor_id(int(flavor_id))
|
inst_type = instance_types.get_instance_type_by_flavor_id(int(flavor_id))
|
||||||
|
|
||||||
instance = {
|
instance = {
|
||||||
@ -89,7 +97,7 @@ def stub_instance(id, metadata=None, image_ref="10", flavor_id="1",
|
|||||||
"metadata": metadata_items,
|
"metadata": metadata_items,
|
||||||
"access_ip_v4": "",
|
"access_ip_v4": "",
|
||||||
"access_ip_v6": "",
|
"access_ip_v6": "",
|
||||||
"uuid": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa",
|
"uuid": uuid,
|
||||||
"virtual_interfaces": [],
|
"virtual_interfaces": [],
|
||||||
"progress": 0,
|
"progress": 0,
|
||||||
}
|
}
|
||||||
@ -121,11 +129,13 @@ class ServerActionsTest(test.TestCase):
|
|||||||
self.stubs = stubout.StubOutForTesting()
|
self.stubs = stubout.StubOutForTesting()
|
||||||
fakes.stub_out_auth(self.stubs)
|
fakes.stub_out_auth(self.stubs)
|
||||||
self.stubs.Set(nova.db.api, 'instance_get', return_server_by_id)
|
self.stubs.Set(nova.db.api, 'instance_get', return_server_by_id)
|
||||||
|
self.stubs.Set(nova.db, 'instance_get_by_uuid', return_server_by_uuid)
|
||||||
self.stubs.Set(nova.db.api, 'instance_update', instance_update)
|
self.stubs.Set(nova.db.api, 'instance_update', instance_update)
|
||||||
|
|
||||||
fakes.stub_out_glance(self.stubs)
|
fakes.stub_out_glance(self.stubs)
|
||||||
fakes.stub_out_nw_api(self.stubs)
|
fakes.stub_out_nw_api(self.stubs)
|
||||||
fakes.stub_out_compute_api_snapshot(self.stubs)
|
self.snapshot = fakes.stub_out_compute_api_snapshot(self.stubs)
|
||||||
|
self.backup = fakes.stub_out_compute_api_backup(self.stubs)
|
||||||
service_class = 'nova.image.glance.GlanceImageService'
|
service_class = 'nova.image.glance.GlanceImageService'
|
||||||
self.service = utils.import_object(service_class)
|
self.service = utils.import_object(service_class)
|
||||||
self.context = context.RequestContext(1, None)
|
self.context = context.RequestContext(1, None)
|
||||||
@ -133,6 +143,8 @@ class ServerActionsTest(test.TestCase):
|
|||||||
self.sent_to_glance = {}
|
self.sent_to_glance = {}
|
||||||
fakes.stub_out_glance_add_image(self.stubs, self.sent_to_glance)
|
fakes.stub_out_glance_add_image(self.stubs, self.sent_to_glance)
|
||||||
self.flags(allow_instance_snapshots=True)
|
self.flags(allow_instance_snapshots=True)
|
||||||
|
self.uuid = FAKE_UUID
|
||||||
|
self.url = '/v1.1/fake/servers/%s/action' % self.uuid
|
||||||
|
|
||||||
def tearDown(self):
|
def tearDown(self):
|
||||||
self.stubs.UnsetAll()
|
self.stubs.UnsetAll()
|
||||||
@ -140,7 +152,7 @@ class ServerActionsTest(test.TestCase):
|
|||||||
|
|
||||||
def test_server_bad_body(self):
|
def test_server_bad_body(self):
|
||||||
body = {}
|
body = {}
|
||||||
req = webob.Request.blank('/v1.1/fake/servers/1/action')
|
req = webob.Request.blank(self.url)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.content_type = 'application/json'
|
req.content_type = 'application/json'
|
||||||
req.body = json.dumps(body)
|
req.body = json.dumps(body)
|
||||||
@ -149,7 +161,7 @@ class ServerActionsTest(test.TestCase):
|
|||||||
|
|
||||||
def test_server_unknown_action(self):
|
def test_server_unknown_action(self):
|
||||||
body = {'sockTheFox': {'fakekey': '1234'}}
|
body = {'sockTheFox': {'fakekey': '1234'}}
|
||||||
req = webob.Request.blank('/v1.1/fake/servers/1/action')
|
req = webob.Request.blank(self.url)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.content_type = 'application/json'
|
req.content_type = 'application/json'
|
||||||
req.body = json.dumps(body)
|
req.body = json.dumps(body)
|
||||||
@ -160,19 +172,19 @@ class ServerActionsTest(test.TestCase):
|
|||||||
mock_method = MockSetAdminPassword()
|
mock_method = MockSetAdminPassword()
|
||||||
self.stubs.Set(nova.compute.api.API, 'set_admin_password', mock_method)
|
self.stubs.Set(nova.compute.api.API, 'set_admin_password', mock_method)
|
||||||
body = {'changePassword': {'adminPass': '1234pass'}}
|
body = {'changePassword': {'adminPass': '1234pass'}}
|
||||||
req = webob.Request.blank('/v1.1/fake/servers/1/action')
|
req = webob.Request.blank(self.url)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.content_type = 'application/json'
|
req.content_type = 'application/json'
|
||||||
req.body = json.dumps(body)
|
req.body = json.dumps(body)
|
||||||
res = req.get_response(fakes.wsgi_app())
|
res = req.get_response(fakes.wsgi_app())
|
||||||
self.assertEqual(res.status_int, 202)
|
self.assertEqual(res.status_int, 202)
|
||||||
self.assertEqual(mock_method.instance_id, '1')
|
self.assertEqual(mock_method.instance_id, self.uuid)
|
||||||
self.assertEqual(mock_method.password, '1234pass')
|
self.assertEqual(mock_method.password, '1234pass')
|
||||||
|
|
||||||
def test_server_change_password_xml(self):
|
def test_server_change_password_xml(self):
|
||||||
mock_method = MockSetAdminPassword()
|
mock_method = MockSetAdminPassword()
|
||||||
self.stubs.Set(nova.compute.api.API, 'set_admin_password', mock_method)
|
self.stubs.Set(nova.compute.api.API, 'set_admin_password', mock_method)
|
||||||
req = webob.Request.blank('/v1.1/fake/servers/1/action')
|
req = webob.Request.blank(self.url)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.content_type = "application/xml"
|
req.content_type = "application/xml"
|
||||||
req.body = """<?xml version="1.0" encoding="UTF-8"?>
|
req.body = """<?xml version="1.0" encoding="UTF-8"?>
|
||||||
@ -181,12 +193,12 @@ class ServerActionsTest(test.TestCase):
|
|||||||
adminPass="1234pass"/>"""
|
adminPass="1234pass"/>"""
|
||||||
res = req.get_response(fakes.wsgi_app())
|
res = req.get_response(fakes.wsgi_app())
|
||||||
self.assertEqual(res.status_int, 202)
|
self.assertEqual(res.status_int, 202)
|
||||||
self.assertEqual(mock_method.instance_id, '1')
|
self.assertEqual(mock_method.instance_id, self.uuid)
|
||||||
self.assertEqual(mock_method.password, '1234pass')
|
self.assertEqual(mock_method.password, '1234pass')
|
||||||
|
|
||||||
def test_server_change_password_not_a_string(self):
|
def test_server_change_password_not_a_string(self):
|
||||||
body = {'changePassword': {'adminPass': 1234}}
|
body = {'changePassword': {'adminPass': 1234}}
|
||||||
req = webob.Request.blank('/v1.1/fake/servers/1/action')
|
req = webob.Request.blank(self.url)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.content_type = 'application/json'
|
req.content_type = 'application/json'
|
||||||
req.body = json.dumps(body)
|
req.body = json.dumps(body)
|
||||||
@ -195,7 +207,7 @@ class ServerActionsTest(test.TestCase):
|
|||||||
|
|
||||||
def test_server_change_password_bad_request(self):
|
def test_server_change_password_bad_request(self):
|
||||||
body = {'changePassword': {'pass': '12345'}}
|
body = {'changePassword': {'pass': '12345'}}
|
||||||
req = webob.Request.blank('/v1.1/fake/servers/1/action')
|
req = webob.Request.blank(self.url)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.content_type = 'application/json'
|
req.content_type = 'application/json'
|
||||||
req.body = json.dumps(body)
|
req.body = json.dumps(body)
|
||||||
@ -204,7 +216,7 @@ class ServerActionsTest(test.TestCase):
|
|||||||
|
|
||||||
def test_server_change_password_empty_string(self):
|
def test_server_change_password_empty_string(self):
|
||||||
body = {'changePassword': {'adminPass': ''}}
|
body = {'changePassword': {'adminPass': ''}}
|
||||||
req = webob.Request.blank('/v1.1/fake/servers/1/action')
|
req = webob.Request.blank(self.url)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.content_type = 'application/json'
|
req.content_type = 'application/json'
|
||||||
req.body = json.dumps(body)
|
req.body = json.dumps(body)
|
||||||
@ -213,7 +225,7 @@ class ServerActionsTest(test.TestCase):
|
|||||||
|
|
||||||
def test_server_change_password_none(self):
|
def test_server_change_password_none(self):
|
||||||
body = {'changePassword': {'adminPass': None}}
|
body = {'changePassword': {'adminPass': None}}
|
||||||
req = webob.Request.blank('/v1.1/fake/servers/1/action')
|
req = webob.Request.blank(self.url)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.content_type = 'application/json'
|
req.content_type = 'application/json'
|
||||||
req.body = json.dumps(body)
|
req.body = json.dumps(body)
|
||||||
@ -222,7 +234,7 @@ class ServerActionsTest(test.TestCase):
|
|||||||
|
|
||||||
def test_server_reboot_hard(self):
|
def test_server_reboot_hard(self):
|
||||||
body = dict(reboot=dict(type="HARD"))
|
body = dict(reboot=dict(type="HARD"))
|
||||||
req = webob.Request.blank('/v1.1/fake/servers/1/action')
|
req = webob.Request.blank(self.url)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.content_type = 'application/json'
|
req.content_type = 'application/json'
|
||||||
req.body = json.dumps(body)
|
req.body = json.dumps(body)
|
||||||
@ -231,7 +243,7 @@ class ServerActionsTest(test.TestCase):
|
|||||||
|
|
||||||
def test_server_reboot_soft(self):
|
def test_server_reboot_soft(self):
|
||||||
body = dict(reboot=dict(type="SOFT"))
|
body = dict(reboot=dict(type="SOFT"))
|
||||||
req = webob.Request.blank('/v1.1/fake/servers/1/action')
|
req = webob.Request.blank(self.url)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.content_type = 'application/json'
|
req.content_type = 'application/json'
|
||||||
req.body = json.dumps(body)
|
req.body = json.dumps(body)
|
||||||
@ -240,7 +252,7 @@ class ServerActionsTest(test.TestCase):
|
|||||||
|
|
||||||
def test_server_reboot_incorrect_type(self):
|
def test_server_reboot_incorrect_type(self):
|
||||||
body = dict(reboot=dict(type="NOT_A_TYPE"))
|
body = dict(reboot=dict(type="NOT_A_TYPE"))
|
||||||
req = webob.Request.blank('/v1.1/fake/servers/1/action')
|
req = webob.Request.blank(self.url)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.content_type = 'application/json'
|
req.content_type = 'application/json'
|
||||||
req.body = json.dumps(body)
|
req.body = json.dumps(body)
|
||||||
@ -249,7 +261,7 @@ class ServerActionsTest(test.TestCase):
|
|||||||
|
|
||||||
def test_server_reboot_missing_type(self):
|
def test_server_reboot_missing_type(self):
|
||||||
body = dict(reboot=dict())
|
body = dict(reboot=dict())
|
||||||
req = webob.Request.blank('/v1.1/fake/servers/1/action')
|
req = webob.Request.blank(self.url)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.content_type = 'application/json'
|
req.content_type = 'application/json'
|
||||||
req.body = json.dumps(body)
|
req.body = json.dumps(body)
|
||||||
@ -266,7 +278,7 @@ class ServerActionsTest(test.TestCase):
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
req = webob.Request.blank('/v1.1/fake/servers/1/action')
|
req = webob.Request.blank(self.url)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.content_type = 'application/json'
|
req.content_type = 'application/json'
|
||||||
req.body = json.dumps(body)
|
req.body = json.dumps(body)
|
||||||
@ -285,13 +297,12 @@ class ServerActionsTest(test.TestCase):
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
state = vm_states.BUILDING
|
def fake_rebuild(*args, **kwargs):
|
||||||
new_return_server = return_server_with_state(state)
|
raise exception.RebuildRequiresActiveInstance
|
||||||
self.stubs.Set(nova.db.api, 'instance_get', new_return_server)
|
|
||||||
self.stubs.Set(nova.db, 'instance_get_by_uuid',
|
|
||||||
return_server_with_uuid_and_state(state))
|
|
||||||
|
|
||||||
req = webob.Request.blank('/v1.1/fake/servers/1/action')
|
self.stubs.Set(nova.compute.api.API, 'rebuild', fake_rebuild)
|
||||||
|
|
||||||
|
req = webob.Request.blank(self.url)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.content_type = 'application/json'
|
req.content_type = 'application/json'
|
||||||
req.body = json.dumps(body)
|
req.body = json.dumps(body)
|
||||||
@ -312,7 +323,7 @@ class ServerActionsTest(test.TestCase):
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
req = webob.Request.blank('/v1.1/fake/servers/1/action')
|
req = webob.Request.blank(self.url)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.content_type = 'application/json'
|
req.content_type = 'application/json'
|
||||||
req.body = json.dumps(body)
|
req.body = json.dumps(body)
|
||||||
@ -330,7 +341,7 @@ class ServerActionsTest(test.TestCase):
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
req = webob.Request.blank('/v1.1/fake/servers/1/action')
|
req = webob.Request.blank(self.url)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.content_type = 'application/json'
|
req.content_type = 'application/json'
|
||||||
req.body = json.dumps(body)
|
req.body = json.dumps(body)
|
||||||
@ -345,7 +356,7 @@ class ServerActionsTest(test.TestCase):
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
req = webob.Request.blank('/v1.1/fake/servers/1/action')
|
req = webob.Request.blank(self.url)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.content_type = 'application/json'
|
req.content_type = 'application/json'
|
||||||
req.body = json.dumps(body)
|
req.body = json.dumps(body)
|
||||||
@ -364,7 +375,7 @@ class ServerActionsTest(test.TestCase):
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
req = webob.Request.blank('/v1.1/fake/servers/1/action')
|
req = webob.Request.blank(self.url)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.content_type = 'application/json'
|
req.content_type = 'application/json'
|
||||||
req.body = json.dumps(body)
|
req.body = json.dumps(body)
|
||||||
@ -383,7 +394,7 @@ class ServerActionsTest(test.TestCase):
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
req = webob.Request.blank('/v1.1/fake/servers/1/action')
|
req = webob.Request.blank(self.url)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.content_type = 'application/json'
|
req.content_type = 'application/json'
|
||||||
req.body = json.dumps(body)
|
req.body = json.dumps(body)
|
||||||
@ -404,7 +415,7 @@ class ServerActionsTest(test.TestCase):
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
req = webob.Request.blank('/v1.1/fake/servers/1/action')
|
req = webob.Request.blank(self.url)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.content_type = 'application/json'
|
req.content_type = 'application/json'
|
||||||
req.body = json.dumps(body)
|
req.body = json.dumps(body)
|
||||||
@ -426,7 +437,7 @@ class ServerActionsTest(test.TestCase):
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
req = webob.Request.blank('/v1.1/fake/servers/1/action')
|
req = webob.Request.blank(self.url)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.content_type = 'application/json'
|
req.content_type = 'application/json'
|
||||||
req.body = json.dumps(body)
|
req.body = json.dumps(body)
|
||||||
@ -436,7 +447,7 @@ class ServerActionsTest(test.TestCase):
|
|||||||
|
|
||||||
def test_resize_server(self):
|
def test_resize_server(self):
|
||||||
|
|
||||||
req = webob.Request.blank('/v1.1/fake/servers/1/action')
|
req = webob.Request.blank(self.url)
|
||||||
req.content_type = 'application/json'
|
req.content_type = 'application/json'
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
body_dict = dict(resize=dict(flavorRef="http://localhost/3"))
|
body_dict = dict(resize=dict(flavorRef="http://localhost/3"))
|
||||||
@ -454,7 +465,7 @@ class ServerActionsTest(test.TestCase):
|
|||||||
self.assertEqual(self.resize_called, True)
|
self.assertEqual(self.resize_called, True)
|
||||||
|
|
||||||
def test_resize_server_no_flavor(self):
|
def test_resize_server_no_flavor(self):
|
||||||
req = webob.Request.blank('/v1.1/fake/servers/1/action')
|
req = webob.Request.blank(self.url)
|
||||||
req.content_type = 'application/json'
|
req.content_type = 'application/json'
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
body_dict = dict(resize=dict())
|
body_dict = dict(resize=dict())
|
||||||
@ -464,7 +475,7 @@ class ServerActionsTest(test.TestCase):
|
|||||||
self.assertEqual(res.status_int, 400)
|
self.assertEqual(res.status_int, 400)
|
||||||
|
|
||||||
def test_resize_server_no_flavor_ref(self):
|
def test_resize_server_no_flavor_ref(self):
|
||||||
req = webob.Request.blank('/v1.1/fake/servers/1/action')
|
req = webob.Request.blank(self.url)
|
||||||
req.content_type = 'application/json'
|
req.content_type = 'application/json'
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
body_dict = dict(resize=dict(flavorRef=None))
|
body_dict = dict(resize=dict(flavorRef=None))
|
||||||
@ -474,7 +485,7 @@ class ServerActionsTest(test.TestCase):
|
|||||||
self.assertEqual(res.status_int, 400)
|
self.assertEqual(res.status_int, 400)
|
||||||
|
|
||||||
def test_confirm_resize_server(self):
|
def test_confirm_resize_server(self):
|
||||||
req = webob.Request.blank('/v1.1/fake/servers/1/action')
|
req = webob.Request.blank(self.url)
|
||||||
req.content_type = 'application/json'
|
req.content_type = 'application/json'
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
body_dict = dict(confirmResize=None)
|
body_dict = dict(confirmResize=None)
|
||||||
@ -492,7 +503,7 @@ class ServerActionsTest(test.TestCase):
|
|||||||
self.assertEqual(self.confirm_resize_called, True)
|
self.assertEqual(self.confirm_resize_called, True)
|
||||||
|
|
||||||
def test_confirm_resize_migration_not_found(self):
|
def test_confirm_resize_migration_not_found(self):
|
||||||
req = webob.Request.blank('/v1.1/fake/servers/1/action')
|
req = webob.Request.blank(self.url)
|
||||||
req.content_type = 'application/json'
|
req.content_type = 'application/json'
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
body_dict = dict(confirmResize=None)
|
body_dict = dict(confirmResize=None)
|
||||||
@ -510,7 +521,7 @@ class ServerActionsTest(test.TestCase):
|
|||||||
self.assertEqual(res.status_int, 400)
|
self.assertEqual(res.status_int, 400)
|
||||||
|
|
||||||
def test_revert_resize_migration_not_found(self):
|
def test_revert_resize_migration_not_found(self):
|
||||||
req = webob.Request.blank('/v1.1/fake/servers/1/action')
|
req = webob.Request.blank(self.url)
|
||||||
req.content_type = 'application/json'
|
req.content_type = 'application/json'
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
body_dict = dict(revertResize=None)
|
body_dict = dict(revertResize=None)
|
||||||
@ -528,7 +539,7 @@ class ServerActionsTest(test.TestCase):
|
|||||||
self.assertEqual(res.status_int, 400)
|
self.assertEqual(res.status_int, 400)
|
||||||
|
|
||||||
def test_revert_resize_server(self):
|
def test_revert_resize_server(self):
|
||||||
req = webob.Request.blank('/v1.1/fake/servers/1/action')
|
req = webob.Request.blank(self.url)
|
||||||
req.content_type = 'application/json'
|
req.content_type = 'application/json'
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
body_dict = dict(revertResize=None)
|
body_dict = dict(revertResize=None)
|
||||||
@ -551,7 +562,7 @@ class ServerActionsTest(test.TestCase):
|
|||||||
'name': 'Snapshot 1',
|
'name': 'Snapshot 1',
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
req = webob.Request.blank('/v1.1/fake/servers/1/action')
|
req = webob.Request.blank(self.url)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.body = json.dumps(body)
|
req.body = json.dumps(body)
|
||||||
req.headers["content-type"] = "application/json"
|
req.headers["content-type"] = "application/json"
|
||||||
@ -559,6 +570,9 @@ class ServerActionsTest(test.TestCase):
|
|||||||
self.assertEqual(202, response.status_int)
|
self.assertEqual(202, response.status_int)
|
||||||
location = response.headers['Location']
|
location = response.headers['Location']
|
||||||
self.assertEqual('http://localhost/v1.1/fake/images/123', location)
|
self.assertEqual('http://localhost/v1.1/fake/images/123', location)
|
||||||
|
server_location = self.snapshot.extra_props_last_call['instance_ref']
|
||||||
|
expected_server_location = 'http://localhost/v1.1/servers/' + self.uuid
|
||||||
|
self.assertEqual(expected_server_location, server_location)
|
||||||
|
|
||||||
def test_create_image_snapshots_disabled(self):
|
def test_create_image_snapshots_disabled(self):
|
||||||
"""Don't permit a snapshot if the allow_instance_snapshots flag is
|
"""Don't permit a snapshot if the allow_instance_snapshots flag is
|
||||||
@ -570,7 +584,7 @@ class ServerActionsTest(test.TestCase):
|
|||||||
'name': 'Snapshot 1',
|
'name': 'Snapshot 1',
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
req = webob.Request.blank('/v1.1/fake/servers/1/action')
|
req = webob.Request.blank(self.url)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.body = json.dumps(body)
|
req.body = json.dumps(body)
|
||||||
req.headers["content-type"] = "application/json"
|
req.headers["content-type"] = "application/json"
|
||||||
@ -584,7 +598,7 @@ class ServerActionsTest(test.TestCase):
|
|||||||
'metadata': {'key': 'asdf'},
|
'metadata': {'key': 'asdf'},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
req = webob.Request.blank('/v1.1/fake/servers/1/action')
|
req = webob.Request.blank(self.url)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.body = json.dumps(body)
|
req.body = json.dumps(body)
|
||||||
req.headers["content-type"] = "application/json"
|
req.headers["content-type"] = "application/json"
|
||||||
@ -602,7 +616,7 @@ class ServerActionsTest(test.TestCase):
|
|||||||
}
|
}
|
||||||
for num in range(FLAGS.quota_metadata_items + 1):
|
for num in range(FLAGS.quota_metadata_items + 1):
|
||||||
body['createImage']['metadata']['foo%i' % num] = "bar"
|
body['createImage']['metadata']['foo%i' % num] = "bar"
|
||||||
req = webob.Request.blank('/v1.1/fake/servers/1/action')
|
req = webob.Request.blank(self.url)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.body = json.dumps(body)
|
req.body = json.dumps(body)
|
||||||
req.headers["content-type"] = "application/json"
|
req.headers["content-type"] = "application/json"
|
||||||
@ -613,7 +627,7 @@ class ServerActionsTest(test.TestCase):
|
|||||||
body = {
|
body = {
|
||||||
'createImage': {},
|
'createImage': {},
|
||||||
}
|
}
|
||||||
req = webob.Request.blank('/v1.1/fake/servers/1/action')
|
req = webob.Request.blank(self.url)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.body = json.dumps(body)
|
req.body = json.dumps(body)
|
||||||
req.headers["content-type"] = "application/json"
|
req.headers["content-type"] = "application/json"
|
||||||
@ -627,7 +641,7 @@ class ServerActionsTest(test.TestCase):
|
|||||||
'metadata': 'henry',
|
'metadata': 'henry',
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
req = webob.Request.blank('/v1.1/fake/servers/1/action')
|
req = webob.Request.blank(self.url)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.body = json.dumps(body)
|
req.body = json.dumps(body)
|
||||||
req.headers["content-type"] = "application/json"
|
req.headers["content-type"] = "application/json"
|
||||||
@ -640,7 +654,7 @@ class ServerActionsTest(test.TestCase):
|
|||||||
raise exception.InstanceSnapshotting
|
raise exception.InstanceSnapshotting
|
||||||
self.stubs.Set(nova.compute.API, 'snapshot', snapshot)
|
self.stubs.Set(nova.compute.API, 'snapshot', snapshot)
|
||||||
|
|
||||||
req = webob.Request.blank('/v1.1/fakes/servers/1/action')
|
req = webob.Request.blank(self.url)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.body = json.dumps({
|
req.body = json.dumps({
|
||||||
"createImage": {
|
"createImage": {
|
||||||
@ -663,13 +677,16 @@ class ServerActionsTest(test.TestCase):
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
req = webob.Request.blank('/v1.1/fake/servers/1/action')
|
req = webob.Request.blank(self.url)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.body = json.dumps(body)
|
req.body = json.dumps(body)
|
||||||
req.headers["content-type"] = "application/json"
|
req.headers["content-type"] = "application/json"
|
||||||
response = req.get_response(fakes.wsgi_app())
|
response = req.get_response(fakes.wsgi_app())
|
||||||
self.assertEqual(202, response.status_int)
|
self.assertEqual(202, response.status_int)
|
||||||
self.assertTrue(response.headers['Location'])
|
self.assertTrue(response.headers['Location'])
|
||||||
|
server_location = self.backup.extra_props_last_call['instance_ref']
|
||||||
|
expected_server_location = 'http://localhost/v1.1/servers/' + self.uuid
|
||||||
|
self.assertEqual(expected_server_location, server_location)
|
||||||
|
|
||||||
def test_create_backup_admin_api_off(self):
|
def test_create_backup_admin_api_off(self):
|
||||||
"""The happy path for creating backups"""
|
"""The happy path for creating backups"""
|
||||||
@ -683,7 +700,7 @@ class ServerActionsTest(test.TestCase):
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
req = webob.Request.blank('/v1.1/fake/servers/1/action')
|
req = webob.Request.blank(self.url)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.body = json.dumps(body)
|
req.body = json.dumps(body)
|
||||||
req.headers["content-type"] = "application/json"
|
req.headers["content-type"] = "application/json"
|
||||||
@ -702,7 +719,7 @@ class ServerActionsTest(test.TestCase):
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
req = webob.Request.blank('/v1.1/fake/servers/1/action')
|
req = webob.Request.blank(self.url)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.body = json.dumps(body)
|
req.body = json.dumps(body)
|
||||||
req.headers["content-type"] = "application/json"
|
req.headers["content-type"] = "application/json"
|
||||||
@ -723,7 +740,7 @@ class ServerActionsTest(test.TestCase):
|
|||||||
}
|
}
|
||||||
for num in range(FLAGS.quota_metadata_items + 1):
|
for num in range(FLAGS.quota_metadata_items + 1):
|
||||||
body['createBackup']['metadata']['foo%i' % num] = "bar"
|
body['createBackup']['metadata']['foo%i' % num] = "bar"
|
||||||
req = webob.Request.blank('/v1.1/fake/servers/1/action')
|
req = webob.Request.blank(self.url)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.body = json.dumps(body)
|
req.body = json.dumps(body)
|
||||||
req.headers["content-type"] = "application/json"
|
req.headers["content-type"] = "application/json"
|
||||||
@ -741,7 +758,7 @@ class ServerActionsTest(test.TestCase):
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
req = webob.Request.blank('/v1.1/fake/servers/1/action')
|
req = webob.Request.blank(self.url)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.body = json.dumps(body)
|
req.body = json.dumps(body)
|
||||||
req.headers["content-type"] = "application/json"
|
req.headers["content-type"] = "application/json"
|
||||||
@ -759,7 +776,7 @@ class ServerActionsTest(test.TestCase):
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
req = webob.Request.blank('/v1.1/fake/servers/1/action')
|
req = webob.Request.blank(self.url)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.body = json.dumps(body)
|
req.body = json.dumps(body)
|
||||||
req.headers["content-type"] = "application/json"
|
req.headers["content-type"] = "application/json"
|
||||||
@ -777,7 +794,7 @@ class ServerActionsTest(test.TestCase):
|
|||||||
'rotation': 1,
|
'rotation': 1,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
req = webob.Request.blank('/v1.1/fake/servers/1/action')
|
req = webob.Request.blank(self.url)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.body = json.dumps(body)
|
req.body = json.dumps(body)
|
||||||
req.headers["content-type"] = "application/json"
|
req.headers["content-type"] = "application/json"
|
||||||
@ -789,7 +806,7 @@ class ServerActionsTest(test.TestCase):
|
|||||||
self.flags(allow_admin_api=True)
|
self.flags(allow_admin_api=True)
|
||||||
|
|
||||||
body = {'createBackup': 'go'}
|
body = {'createBackup': 'go'}
|
||||||
req = webob.Request.blank('/v1.1/fake/servers/1/action')
|
req = webob.Request.blank(self.url)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.body = json.dumps(body)
|
req.body = json.dumps(body)
|
||||||
req.headers["content-type"] = "application/json"
|
req.headers["content-type"] = "application/json"
|
||||||
|
@ -23,6 +23,7 @@ import nova.db.api
|
|||||||
from nova import exception
|
from nova import exception
|
||||||
from nova import flags
|
from nova import flags
|
||||||
from nova import test
|
from nova import test
|
||||||
|
from nova import utils
|
||||||
from nova.tests.api.openstack import fakes
|
from nova.tests.api.openstack import fakes
|
||||||
|
|
||||||
|
|
||||||
@ -79,15 +80,18 @@ class ServerMetaDataTest(test.TestCase):
|
|||||||
super(ServerMetaDataTest, self).setUp()
|
super(ServerMetaDataTest, self).setUp()
|
||||||
fakes.stub_out_key_pair_funcs(self.stubs)
|
fakes.stub_out_key_pair_funcs(self.stubs)
|
||||||
self.stubs.Set(nova.db.api, 'instance_get', return_server)
|
self.stubs.Set(nova.db.api, 'instance_get', return_server)
|
||||||
|
self.stubs.Set(nova.db, 'instance_get_by_uuid', return_server)
|
||||||
|
|
||||||
self.stubs.Set(nova.db.api, 'instance_metadata_get',
|
self.stubs.Set(nova.db.api, 'instance_metadata_get',
|
||||||
return_server_metadata)
|
return_server_metadata)
|
||||||
|
|
||||||
self.controller = server_metadata.Controller()
|
self.controller = server_metadata.Controller()
|
||||||
|
self.uuid = utils.gen_uuid()
|
||||||
|
self.url = '/v1.1/fake/servers/%s/metadata' % self.uuid
|
||||||
|
|
||||||
def test_index(self):
|
def test_index(self):
|
||||||
req = fakes.HTTPRequest.blank('/v1.1/fake/servers/1/metadata')
|
req = fakes.HTTPRequest.blank(self.url)
|
||||||
res_dict = self.controller.index(req, '1')
|
res_dict = self.controller.index(req, self.uuid)
|
||||||
|
|
||||||
expected = {
|
expected = {
|
||||||
'metadata': {
|
'metadata': {
|
||||||
@ -101,75 +105,75 @@ class ServerMetaDataTest(test.TestCase):
|
|||||||
def test_index_nonexistant_server(self):
|
def test_index_nonexistant_server(self):
|
||||||
self.stubs.Set(nova.db.api, 'instance_metadata_get',
|
self.stubs.Set(nova.db.api, 'instance_metadata_get',
|
||||||
return_server_nonexistant)
|
return_server_nonexistant)
|
||||||
req = fakes.HTTPRequest.blank('/v1.1/fake/servers/100/metadata')
|
req = fakes.HTTPRequest.blank(self.url)
|
||||||
self.assertRaises(webob.exc.HTTPNotFound,
|
self.assertRaises(webob.exc.HTTPNotFound,
|
||||||
self.controller.index, req, '100')
|
self.controller.index, req, self.url)
|
||||||
|
|
||||||
def test_index_no_data(self):
|
def test_index_no_data(self):
|
||||||
self.stubs.Set(nova.db.api, 'instance_metadata_get',
|
self.stubs.Set(nova.db.api, 'instance_metadata_get',
|
||||||
return_empty_server_metadata)
|
return_empty_server_metadata)
|
||||||
req = fakes.HTTPRequest.blank('/v1.1/fake/servers/1/metadata')
|
req = fakes.HTTPRequest.blank(self.url)
|
||||||
res_dict = self.controller.index(req, '1')
|
res_dict = self.controller.index(req, self.uuid)
|
||||||
expected = {'metadata': {}}
|
expected = {'metadata': {}}
|
||||||
self.assertEqual(expected, res_dict)
|
self.assertEqual(expected, res_dict)
|
||||||
|
|
||||||
def test_show(self):
|
def test_show(self):
|
||||||
req = fakes.HTTPRequest.blank('/v1.1/fake/servers/1/metadata/key2')
|
req = fakes.HTTPRequest.blank(self.url + '/key2')
|
||||||
res_dict = self.controller.show(req, '1', 'key2')
|
res_dict = self.controller.show(req, self.uuid, 'key2')
|
||||||
expected = {'meta': {'key2': 'value2'}}
|
expected = {'meta': {'key2': 'value2'}}
|
||||||
self.assertEqual(expected, res_dict)
|
self.assertEqual(expected, res_dict)
|
||||||
|
|
||||||
def test_show_nonexistant_server(self):
|
def test_show_nonexistant_server(self):
|
||||||
self.stubs.Set(nova.db.api, 'instance_metadata_get',
|
self.stubs.Set(nova.db.api, 'instance_metadata_get',
|
||||||
return_server_nonexistant)
|
return_server_nonexistant)
|
||||||
req = fakes.HTTPRequest.blank('/v1.1/fake/servers/100/metadata/key2')
|
req = fakes.HTTPRequest.blank(self.url + '/key2')
|
||||||
self.assertRaises(webob.exc.HTTPNotFound,
|
self.assertRaises(webob.exc.HTTPNotFound,
|
||||||
self.controller.show, req, '100', 'key2')
|
self.controller.show, req, self.uuid, 'key2')
|
||||||
|
|
||||||
def test_show_meta_not_found(self):
|
def test_show_meta_not_found(self):
|
||||||
self.stubs.Set(nova.db.api, 'instance_metadata_get',
|
self.stubs.Set(nova.db.api, 'instance_metadata_get',
|
||||||
return_empty_server_metadata)
|
return_empty_server_metadata)
|
||||||
req = fakes.HTTPRequest.blank('/v1.1/fake/servers/1/metadata/key6')
|
req = fakes.HTTPRequest.blank(self.url + '/key6')
|
||||||
self.assertRaises(webob.exc.HTTPNotFound,
|
self.assertRaises(webob.exc.HTTPNotFound,
|
||||||
self.controller.show, req, '1', 'key6')
|
self.controller.show, req, self.uuid, 'key6')
|
||||||
|
|
||||||
def test_delete(self):
|
def test_delete(self):
|
||||||
self.stubs.Set(nova.db.api, 'instance_metadata_get',
|
self.stubs.Set(nova.db.api, 'instance_metadata_get',
|
||||||
return_server_metadata)
|
return_server_metadata)
|
||||||
self.stubs.Set(nova.db.api, 'instance_metadata_delete',
|
self.stubs.Set(nova.db.api, 'instance_metadata_delete',
|
||||||
delete_server_metadata)
|
delete_server_metadata)
|
||||||
req = fakes.HTTPRequest.blank('/v1.1/fake/servers/1/metadata/key2')
|
req = fakes.HTTPRequest.blank(self.url + '/key2')
|
||||||
req.method = 'DELETE'
|
req.method = 'DELETE'
|
||||||
res = self.controller.delete(req, '1', 'key2')
|
res = self.controller.delete(req, self.uuid, 'key2')
|
||||||
|
|
||||||
self.assertEqual(None, res)
|
self.assertEqual(None, res)
|
||||||
|
|
||||||
def test_delete_nonexistant_server(self):
|
def test_delete_nonexistant_server(self):
|
||||||
self.stubs.Set(nova.db.api, 'instance_get', return_server_nonexistant)
|
self.stubs.Set(nova.db.api, 'instance_get', return_server_nonexistant)
|
||||||
req = fakes.HTTPRequest.blank('/v1.1/fake/servers/1/metadata/key1')
|
req = fakes.HTTPRequest.blank(self.url + '/key1')
|
||||||
req.method = 'DELETE'
|
req.method = 'DELETE'
|
||||||
self.assertRaises(webob.exc.HTTPNotFound,
|
self.assertRaises(webob.exc.HTTPNotFound,
|
||||||
self.controller.delete, req, '1', 'key1')
|
self.controller.delete, req, self.uuid, 'key1')
|
||||||
|
|
||||||
def test_delete_meta_not_found(self):
|
def test_delete_meta_not_found(self):
|
||||||
self.stubs.Set(nova.db.api, 'instance_metadata_get',
|
self.stubs.Set(nova.db.api, 'instance_metadata_get',
|
||||||
return_empty_server_metadata)
|
return_empty_server_metadata)
|
||||||
req = fakes.HTTPRequest.blank('/v1.1/fake/servers/1/metadata/key6')
|
req = fakes.HTTPRequest.blank(self.url + '/key6')
|
||||||
req.method = 'DELETE'
|
req.method = 'DELETE'
|
||||||
self.assertRaises(webob.exc.HTTPNotFound,
|
self.assertRaises(webob.exc.HTTPNotFound,
|
||||||
self.controller.delete, req, '1', 'key6')
|
self.controller.delete, req, self.uuid, 'key6')
|
||||||
|
|
||||||
def test_create(self):
|
def test_create(self):
|
||||||
self.stubs.Set(nova.db.api, 'instance_metadata_get',
|
self.stubs.Set(nova.db.api, 'instance_metadata_get',
|
||||||
return_server_metadata)
|
return_server_metadata)
|
||||||
self.stubs.Set(nova.db.api, 'instance_metadata_update',
|
self.stubs.Set(nova.db.api, 'instance_metadata_update',
|
||||||
return_create_instance_metadata)
|
return_create_instance_metadata)
|
||||||
req = fakes.HTTPRequest.blank('/v1.1/fake/servers/1/metadata')
|
req = fakes.HTTPRequest.blank(self.url)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.content_type = "application/json"
|
req.content_type = "application/json"
|
||||||
body = {"metadata": {"key9": "value9"}}
|
body = {"metadata": {"key9": "value9"}}
|
||||||
req.body = json.dumps(body)
|
req.body = json.dumps(body)
|
||||||
res_dict = self.controller.create(req, '1', body)
|
res_dict = self.controller.create(req, self.uuid, body)
|
||||||
|
|
||||||
body['metadata'].update({
|
body['metadata'].update({
|
||||||
"key1": "value1",
|
"key1": "value1",
|
||||||
@ -181,28 +185,28 @@ class ServerMetaDataTest(test.TestCase):
|
|||||||
def test_create_empty_body(self):
|
def test_create_empty_body(self):
|
||||||
self.stubs.Set(nova.db.api, 'instance_metadata_update',
|
self.stubs.Set(nova.db.api, 'instance_metadata_update',
|
||||||
return_create_instance_metadata)
|
return_create_instance_metadata)
|
||||||
req = fakes.HTTPRequest.blank('/v1.1/fake/servers/1/metadata')
|
req = fakes.HTTPRequest.blank(self.url)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.headers["content-type"] = "application/json"
|
req.headers["content-type"] = "application/json"
|
||||||
|
|
||||||
self.assertRaises(webob.exc.HTTPBadRequest,
|
self.assertRaises(webob.exc.HTTPBadRequest,
|
||||||
self.controller.create, req, '1', None)
|
self.controller.create, req, self.uuid, None)
|
||||||
|
|
||||||
def test_create_nonexistant_server(self):
|
def test_create_nonexistant_server(self):
|
||||||
self.stubs.Set(nova.db.api, 'instance_get', return_server_nonexistant)
|
self.stubs.Set(nova.db.api, 'instance_get', return_server_nonexistant)
|
||||||
req = fakes.HTTPRequest.blank('/v1.1/fake/servers/100/metadata')
|
req = fakes.HTTPRequest.blank(self.url)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
body = {"metadata": {"key1": "value1"}}
|
body = {"metadata": {"key1": "value1"}}
|
||||||
req.body = json.dumps(body)
|
req.body = json.dumps(body)
|
||||||
req.headers["content-type"] = "application/json"
|
req.headers["content-type"] = "application/json"
|
||||||
|
|
||||||
self.assertRaises(webob.exc.HTTPNotFound,
|
self.assertRaises(webob.exc.HTTPNotFound,
|
||||||
self.controller.create, req, '100', body)
|
self.controller.create, req, self.uuid, body)
|
||||||
|
|
||||||
def test_update_all(self):
|
def test_update_all(self):
|
||||||
self.stubs.Set(nova.db.api, 'instance_metadata_update',
|
self.stubs.Set(nova.db.api, 'instance_metadata_update',
|
||||||
return_create_instance_metadata)
|
return_create_instance_metadata)
|
||||||
req = fakes.HTTPRequest.blank('/v1.1/fake/servers/1/metadata')
|
req = fakes.HTTPRequest.blank(self.url)
|
||||||
req.method = 'PUT'
|
req.method = 'PUT'
|
||||||
req.content_type = "application/json"
|
req.content_type = "application/json"
|
||||||
expected = {
|
expected = {
|
||||||
@ -212,49 +216,49 @@ class ServerMetaDataTest(test.TestCase):
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
req.body = json.dumps(expected)
|
req.body = json.dumps(expected)
|
||||||
res_dict = self.controller.update_all(req, '1', expected)
|
res_dict = self.controller.update_all(req, self.uuid, expected)
|
||||||
|
|
||||||
self.assertEqual(expected, res_dict)
|
self.assertEqual(expected, res_dict)
|
||||||
|
|
||||||
def test_update_all_empty_container(self):
|
def test_update_all_empty_container(self):
|
||||||
self.stubs.Set(nova.db.api, 'instance_metadata_update',
|
self.stubs.Set(nova.db.api, 'instance_metadata_update',
|
||||||
return_create_instance_metadata)
|
return_create_instance_metadata)
|
||||||
req = fakes.HTTPRequest.blank('/v1.1/fake/servers/1/metadata')
|
req = fakes.HTTPRequest.blank(self.url)
|
||||||
req.method = 'PUT'
|
req.method = 'PUT'
|
||||||
req.content_type = "application/json"
|
req.content_type = "application/json"
|
||||||
expected = {'metadata': {}}
|
expected = {'metadata': {}}
|
||||||
req.body = json.dumps(expected)
|
req.body = json.dumps(expected)
|
||||||
res_dict = self.controller.update_all(req, '1', expected)
|
res_dict = self.controller.update_all(req, self.uuid, expected)
|
||||||
|
|
||||||
self.assertEqual(expected, res_dict)
|
self.assertEqual(expected, res_dict)
|
||||||
|
|
||||||
def test_update_all_malformed_container(self):
|
def test_update_all_malformed_container(self):
|
||||||
self.stubs.Set(nova.db.api, 'instance_metadata_update',
|
self.stubs.Set(nova.db.api, 'instance_metadata_update',
|
||||||
return_create_instance_metadata)
|
return_create_instance_metadata)
|
||||||
req = fakes.HTTPRequest.blank('/v1.1/fake/servers/1/metadata')
|
req = fakes.HTTPRequest.blank(self.url)
|
||||||
req.method = 'PUT'
|
req.method = 'PUT'
|
||||||
req.content_type = "application/json"
|
req.content_type = "application/json"
|
||||||
expected = {'meta': {}}
|
expected = {'meta': {}}
|
||||||
req.body = json.dumps(expected)
|
req.body = json.dumps(expected)
|
||||||
|
|
||||||
self.assertRaises(webob.exc.HTTPBadRequest,
|
self.assertRaises(webob.exc.HTTPBadRequest,
|
||||||
self.controller.update_all, req, '1', expected)
|
self.controller.update_all, req, self.uuid, expected)
|
||||||
|
|
||||||
def test_update_all_malformed_data(self):
|
def test_update_all_malformed_data(self):
|
||||||
self.stubs.Set(nova.db.api, 'instance_metadata_update',
|
self.stubs.Set(nova.db.api, 'instance_metadata_update',
|
||||||
return_create_instance_metadata)
|
return_create_instance_metadata)
|
||||||
req = fakes.HTTPRequest.blank('/v1.1/fake/servers/1/metadata')
|
req = fakes.HTTPRequest.blank(self.url)
|
||||||
req.method = 'PUT'
|
req.method = 'PUT'
|
||||||
req.content_type = "application/json"
|
req.content_type = "application/json"
|
||||||
expected = {'metadata': ['asdf']}
|
expected = {'metadata': ['asdf']}
|
||||||
req.body = json.dumps(expected)
|
req.body = json.dumps(expected)
|
||||||
|
|
||||||
self.assertRaises(webob.exc.HTTPBadRequest,
|
self.assertRaises(webob.exc.HTTPBadRequest,
|
||||||
self.controller.update_all, req, '1', expected)
|
self.controller.update_all, req, self.uuid, expected)
|
||||||
|
|
||||||
def test_update_all_nonexistant_server(self):
|
def test_update_all_nonexistant_server(self):
|
||||||
self.stubs.Set(nova.db.api, 'instance_get', return_server_nonexistant)
|
self.stubs.Set(nova.db.api, 'instance_get', return_server_nonexistant)
|
||||||
req = fakes.HTTPRequest.blank('/v1.1/fake/servers/100/metadata')
|
req = fakes.HTTPRequest.blank(self.url)
|
||||||
req.method = 'PUT'
|
req.method = 'PUT'
|
||||||
req.content_type = "application/json"
|
req.content_type = "application/json"
|
||||||
body = {'metadata': {'key10': 'value10'}}
|
body = {'metadata': {'key10': 'value10'}}
|
||||||
@ -266,12 +270,12 @@ class ServerMetaDataTest(test.TestCase):
|
|||||||
def test_update_item(self):
|
def test_update_item(self):
|
||||||
self.stubs.Set(nova.db.api, 'instance_metadata_update',
|
self.stubs.Set(nova.db.api, 'instance_metadata_update',
|
||||||
return_create_instance_metadata)
|
return_create_instance_metadata)
|
||||||
req = fakes.HTTPRequest.blank('/v1.1/fake/servers/1/metadata/key1')
|
req = fakes.HTTPRequest.blank(self.url + '/key1')
|
||||||
req.method = 'PUT'
|
req.method = 'PUT'
|
||||||
body = {"meta": {"key1": "value1"}}
|
body = {"meta": {"key1": "value1"}}
|
||||||
req.body = json.dumps(body)
|
req.body = json.dumps(body)
|
||||||
req.headers["content-type"] = "application/json"
|
req.headers["content-type"] = "application/json"
|
||||||
res_dict = self.controller.update(req, '1', 'key1', body)
|
res_dict = self.controller.update(req, self.uuid, 'key1', body)
|
||||||
expected = {'meta': {'key1': 'value1'}}
|
expected = {'meta': {'key1': 'value1'}}
|
||||||
self.assertEqual(expected, res_dict)
|
self.assertEqual(expected, res_dict)
|
||||||
|
|
||||||
@ -284,41 +288,41 @@ class ServerMetaDataTest(test.TestCase):
|
|||||||
req.headers["content-type"] = "application/json"
|
req.headers["content-type"] = "application/json"
|
||||||
|
|
||||||
self.assertRaises(webob.exc.HTTPNotFound,
|
self.assertRaises(webob.exc.HTTPNotFound,
|
||||||
self.controller.update, req, '1', 'key1', body)
|
self.controller.update, req, self.uuid, 'key1', body)
|
||||||
|
|
||||||
def test_update_item_empty_body(self):
|
def test_update_item_empty_body(self):
|
||||||
self.stubs.Set(nova.db.api, 'instance_metadata_update',
|
self.stubs.Set(nova.db.api, 'instance_metadata_update',
|
||||||
return_create_instance_metadata)
|
return_create_instance_metadata)
|
||||||
req = fakes.HTTPRequest.blank('/v1.1/fake/servers/1/metadata/key1')
|
req = fakes.HTTPRequest.blank(self.url + '/key1')
|
||||||
req.method = 'PUT'
|
req.method = 'PUT'
|
||||||
req.headers["content-type"] = "application/json"
|
req.headers["content-type"] = "application/json"
|
||||||
|
|
||||||
self.assertRaises(webob.exc.HTTPBadRequest,
|
self.assertRaises(webob.exc.HTTPBadRequest,
|
||||||
self.controller.update, req, '1', 'key1', None)
|
self.controller.update, req, self.uuid, 'key1', None)
|
||||||
|
|
||||||
def test_update_item_too_many_keys(self):
|
def test_update_item_too_many_keys(self):
|
||||||
self.stubs.Set(nova.db.api, 'instance_metadata_update',
|
self.stubs.Set(nova.db.api, 'instance_metadata_update',
|
||||||
return_create_instance_metadata)
|
return_create_instance_metadata)
|
||||||
req = fakes.HTTPRequest.blank('/v1.1/fake/servers/1/metadata/key1')
|
req = fakes.HTTPRequest.blank(self.url + '/key1')
|
||||||
req.method = 'PUT'
|
req.method = 'PUT'
|
||||||
body = {"meta": {"key1": "value1", "key2": "value2"}}
|
body = {"meta": {"key1": "value1", "key2": "value2"}}
|
||||||
req.body = json.dumps(body)
|
req.body = json.dumps(body)
|
||||||
req.headers["content-type"] = "application/json"
|
req.headers["content-type"] = "application/json"
|
||||||
|
|
||||||
self.assertRaises(webob.exc.HTTPBadRequest,
|
self.assertRaises(webob.exc.HTTPBadRequest,
|
||||||
self.controller.update, req, '1', 'key1', body)
|
self.controller.update, req, self.uuid, 'key1', body)
|
||||||
|
|
||||||
def test_update_item_body_uri_mismatch(self):
|
def test_update_item_body_uri_mismatch(self):
|
||||||
self.stubs.Set(nova.db.api, 'instance_metadata_update',
|
self.stubs.Set(nova.db.api, 'instance_metadata_update',
|
||||||
return_create_instance_metadata)
|
return_create_instance_metadata)
|
||||||
req = fakes.HTTPRequest.blank('/v1.1/fake/servers/1/metadata/bad')
|
req = fakes.HTTPRequest.blank(self.url + '/bad')
|
||||||
req.method = 'PUT'
|
req.method = 'PUT'
|
||||||
body = {"meta": {"key1": "value1"}}
|
body = {"meta": {"key1": "value1"}}
|
||||||
req.body = json.dumps(body)
|
req.body = json.dumps(body)
|
||||||
req.headers["content-type"] = "application/json"
|
req.headers["content-type"] = "application/json"
|
||||||
|
|
||||||
self.assertRaises(webob.exc.HTTPBadRequest,
|
self.assertRaises(webob.exc.HTTPBadRequest,
|
||||||
self.controller.update, req, '1', 'bad', body)
|
self.controller.update, req, self.uuid, 'bad', body)
|
||||||
|
|
||||||
def test_too_many_metadata_items_on_create(self):
|
def test_too_many_metadata_items_on_create(self):
|
||||||
self.stubs.Set(nova.db.api, 'instance_metadata_update',
|
self.stubs.Set(nova.db.api, 'instance_metadata_update',
|
||||||
@ -326,13 +330,13 @@ class ServerMetaDataTest(test.TestCase):
|
|||||||
data = {"metadata": {}}
|
data = {"metadata": {}}
|
||||||
for num in range(FLAGS.quota_metadata_items + 1):
|
for num in range(FLAGS.quota_metadata_items + 1):
|
||||||
data['metadata']['key%i' % num] = "blah"
|
data['metadata']['key%i' % num] = "blah"
|
||||||
req = fakes.HTTPRequest.blank('/v1.1/fake/servers/1/metadata')
|
req = fakes.HTTPRequest.blank(self.url)
|
||||||
req.method = 'POST'
|
req.method = 'POST'
|
||||||
req.body = json.dumps(data)
|
req.body = json.dumps(data)
|
||||||
req.headers["content-type"] = "application/json"
|
req.headers["content-type"] = "application/json"
|
||||||
|
|
||||||
self.assertRaises(webob.exc.HTTPRequestEntityTooLarge,
|
self.assertRaises(webob.exc.HTTPRequestEntityTooLarge,
|
||||||
self.controller.create, req, '1', data)
|
self.controller.create, req, self.uuid, data)
|
||||||
|
|
||||||
def test_too_many_metadata_items_on_update_item(self):
|
def test_too_many_metadata_items_on_update_item(self):
|
||||||
self.stubs.Set(nova.db.api, 'instance_metadata_update',
|
self.stubs.Set(nova.db.api, 'instance_metadata_update',
|
||||||
@ -340,10 +344,10 @@ class ServerMetaDataTest(test.TestCase):
|
|||||||
data = {"metadata": {}}
|
data = {"metadata": {}}
|
||||||
for num in range(FLAGS.quota_metadata_items + 1):
|
for num in range(FLAGS.quota_metadata_items + 1):
|
||||||
data['metadata']['key%i' % num] = "blah"
|
data['metadata']['key%i' % num] = "blah"
|
||||||
req = fakes.HTTPRequest.blank('/v1.1/fake/servers/1/metadata')
|
req = fakes.HTTPRequest.blank(self.url)
|
||||||
req.method = 'PUT'
|
req.method = 'PUT'
|
||||||
req.body = json.dumps(data)
|
req.body = json.dumps(data)
|
||||||
req.headers["content-type"] = "application/json"
|
req.headers["content-type"] = "application/json"
|
||||||
|
|
||||||
self.assertRaises(webob.exc.HTTPRequestEntityTooLarge,
|
self.assertRaises(webob.exc.HTTPRequestEntityTooLarge,
|
||||||
self.controller.update_all, req, '1', data)
|
self.controller.update_all, req, self.uuid, data)
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -15,25 +15,29 @@
|
|||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
import feedparser
|
|
||||||
import json
|
import json
|
||||||
|
|
||||||
|
import feedparser
|
||||||
|
from lxml import etree
|
||||||
import stubout
|
import stubout
|
||||||
import webob
|
import webob
|
||||||
from lxml import etree
|
|
||||||
|
|
||||||
from nova import context
|
|
||||||
from nova import test
|
|
||||||
from nova.api.openstack import versions
|
from nova.api.openstack import versions
|
||||||
from nova.api.openstack import views
|
from nova.api.openstack import views
|
||||||
from nova.api.openstack import wsgi
|
from nova.api.openstack import wsgi
|
||||||
from nova.api.openstack import xmlutil
|
from nova.api.openstack import xmlutil
|
||||||
|
from nova import context
|
||||||
|
from nova import test
|
||||||
from nova.tests.api.openstack import common
|
from nova.tests.api.openstack import common
|
||||||
from nova.tests.api.openstack import fakes
|
from nova.tests.api.openstack import fakes
|
||||||
|
from nova import utils
|
||||||
|
|
||||||
|
|
||||||
NS = {
|
NS = {
|
||||||
'atom': 'http://www.w3.org/2005/Atom',
|
'atom': 'http://www.w3.org/2005/Atom',
|
||||||
'ns': 'http://docs.openstack.org/compute/api/v1.1'
|
'ns': 'http://docs.openstack.org/compute/api/v1.1'
|
||||||
}
|
}
|
||||||
|
|
||||||
VERSIONS = {
|
VERSIONS = {
|
||||||
"v1.1": {
|
"v1.1": {
|
||||||
"id": "v1.1",
|
"id": "v1.1",
|
||||||
@ -382,14 +386,15 @@ class VersionsTest(test.TestCase):
|
|||||||
Make sure multi choice responses do not have content-type
|
Make sure multi choice responses do not have content-type
|
||||||
application/atom+xml (should use default of json)
|
application/atom+xml (should use default of json)
|
||||||
"""
|
"""
|
||||||
req = webob.Request.blank('/servers/2')
|
req = webob.Request.blank('/servers')
|
||||||
req.accept = "application/atom+xml"
|
req.accept = "application/atom+xml"
|
||||||
res = req.get_response(fakes.wsgi_app())
|
res = req.get_response(fakes.wsgi_app())
|
||||||
self.assertEqual(res.status_int, 300)
|
self.assertEqual(res.status_int, 300)
|
||||||
self.assertEqual(res.content_type, "application/json")
|
self.assertEqual(res.content_type, "application/json")
|
||||||
|
|
||||||
def test_multi_choice_server(self):
|
def test_multi_choice_server(self):
|
||||||
req = webob.Request.blank('/servers/2')
|
uuid = str(utils.gen_uuid())
|
||||||
|
req = webob.Request.blank('/servers/' + uuid)
|
||||||
req.accept = "application/json"
|
req.accept = "application/json"
|
||||||
res = req.get_response(fakes.wsgi_app())
|
res = req.get_response(fakes.wsgi_app())
|
||||||
self.assertEqual(res.status_int, 300)
|
self.assertEqual(res.status_int, 300)
|
||||||
@ -402,7 +407,7 @@ class VersionsTest(test.TestCase):
|
|||||||
"status": "CURRENT",
|
"status": "CURRENT",
|
||||||
"links": [
|
"links": [
|
||||||
{
|
{
|
||||||
"href": "http://localhost/v1.1/servers/2",
|
"href": "http://localhost/v1.1/servers/" + uuid,
|
||||||
"rel": "self",
|
"rel": "self",
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
@ -285,7 +285,6 @@ class VolumesTest(integrated_helpers._IntegratedTestBase):
|
|||||||
undisco_move = last_days_of_disco_moves[0]
|
undisco_move = last_days_of_disco_moves[0]
|
||||||
self.assertEquals(undisco_move['id'], volume_id)
|
self.assertEquals(undisco_move['id'], volume_id)
|
||||||
self.assertEquals(undisco_move['mountpoint'], device)
|
self.assertEquals(undisco_move['mountpoint'], device)
|
||||||
self.assertEquals(undisco_move['instance_id'], server_id)
|
|
||||||
|
|
||||||
def test_create_volume_with_metadata(self):
|
def test_create_volume_with_metadata(self):
|
||||||
"""Creates and deletes a volume."""
|
"""Creates and deletes a volume."""
|
||||||
|
Loading…
x
Reference in New Issue
Block a user