Make instance show and index use objects

This makes compute_api return instance objects for its
get() and get_all() methods. The necessary changes to
nova-api's compute/servers are included, which are
pretty minor. Most of the change in this patch is making
the tests do the right thing after the switch to objects.

Also, make a mostly-unrelated typo fix in
obj_to_primitive() which was missed in a previous review.

Related to blueprint compute-api-objects

Change-Id: I08dddd311f061e3b39df953b1c8f21f778603770
This commit is contained in:
Dan Smith 2013-06-19 13:28:44 -07:00
parent fe0b7be103
commit 2a781f48c2
24 changed files with 265 additions and 131 deletions

View File

@ -30,7 +30,12 @@ class ServerUsageController(wsgi.Controller):
def _extend_server(self, server, instance):
for k in ['launched_at', 'terminated_at']:
key = "%s:%s" % (Server_usage.alias, k)
server[key] = instance[k]
# NOTE(danms): Historically, this timestamp has been generated
# merely by grabbing str(datetime) of a TZ-naive object. The
# only way we can keep that with instance objects is to strip
# the tzinfo from the stamp and str() it.
server[key] = (instance[k].replace(tzinfo=None)
if instance[k] else None)
@wsgi.extends
def show(self, req, resp_obj, id):

View File

@ -483,18 +483,6 @@ class Controller(wsgi.Controller):
raise exc.HTTPBadRequest(explanation=err.format_message())
return servers
def _add_instance_faults(self, ctxt, instances):
faults = self.compute_api.get_instance_faults(ctxt, instances)
if faults is not None:
for instance in instances:
faults_list = faults.get(instance['uuid'], [])
try:
instance['fault'] = faults_list[0]
except IndexError:
pass
return instances
def _get_servers(self, req, is_detail):
"""Returns a list of servers, based on any search options specified."""
@ -551,7 +539,8 @@ class Controller(wsgi.Controller):
instance_list = self.compute_api.get_all(context,
search_opts=search_opts,
limit=limit,
marker=marker)
marker=marker,
want_objects=True)
except exception.MarkerNotFound:
msg = _('marker [%s] not found') % marker
raise exc.HTTPBadRequest(explanation=msg)
@ -561,7 +550,7 @@ class Controller(wsgi.Controller):
instance_list = []
if is_detail:
self._add_instance_faults(context, instance_list)
instance_list.fill_faults()
response = self._view_builder.detail(req, instance_list)
else:
response = self._view_builder.index(req, instance_list)
@ -571,7 +560,8 @@ class Controller(wsgi.Controller):
def _get_server(self, context, req, instance_uuid):
"""Utility function for looking up an instance by uuid."""
try:
instance = self.compute_api.get(context, instance_uuid)
instance = self.compute_api.get(context, instance_uuid,
want_objects=True)
except exception.NotFound:
msg = _("Instance could not be found")
raise exc.HTTPNotFound(explanation=msg)
@ -737,9 +727,9 @@ class Controller(wsgi.Controller):
"""Returns server details by server id."""
try:
context = req.environ['nova.context']
instance = self.compute_api.get(context, id)
instance = self.compute_api.get(context, id,
want_objects=True)
req.cache_db_instance(instance)
self._add_instance_faults(context, [instance])
return self._view_builder.show(req, instance)
except exception.NotFound:
msg = _("Instance could not be found")
@ -976,19 +966,17 @@ class Controller(wsgi.Controller):
if 'accessIPv4' in body['server']:
access_ipv4 = body['server']['accessIPv4']
if access_ipv4 is None:
access_ipv4 = ''
if access_ipv4:
self._validate_access_ipv4(access_ipv4)
update_dict['access_ip_v4'] = access_ipv4.strip()
update_dict['access_ip_v4'] = (
access_ipv4 and access_ipv4.strip() or None)
if 'accessIPv6' in body['server']:
access_ipv6 = body['server']['accessIPv6']
if access_ipv6 is None:
access_ipv6 = ''
if access_ipv6:
self._validate_access_ipv6(access_ipv6)
update_dict['access_ip_v6'] = access_ipv6.strip()
update_dict['access_ip_v6'] = (
access_ipv6 and access_ipv6.strip() or None)
if 'auto_disk_config' in body['server']:
auto_disk_config = strutils.bool_from_string(
@ -1004,16 +992,19 @@ class Controller(wsgi.Controller):
raise exc.HTTPBadRequest(explanation=msg)
try:
instance = self.compute_api.get(ctxt, id)
instance = self.compute_api.get(ctxt, id,
want_objects=True)
req.cache_db_instance(instance)
self.compute_api.update(ctxt, instance, **update_dict)
except exception.NotFound:
msg = _("Instance could not be found")
raise exc.HTTPNotFound(explanation=msg)
# FIXME(danms): Until compute_api.update() is object-aware,
# we need to apply the updates to the instance object so
# that views will return the new data
instance.update(update_dict)
self._add_instance_faults(ctxt, [instance])
return self._view_builder.show(req, instance)
@wsgi.response(202)
@ -1305,7 +1296,6 @@ class Controller(wsgi.Controller):
instance = self._get_server(context, req, id)
self._add_instance_faults(context, [instance])
view = self._view_builder.show(req, instance)
# Add on the adminPass attribute since the view doesn't do it

View File

@ -23,6 +23,7 @@ from nova.api.openstack.compute.views import addresses as views_addresses
from nova.api.openstack.compute.views import flavors as views_flavors
from nova.api.openstack.compute.views import images as views_images
from nova.compute import flavors
from nova.objects import instance as instance_obj
from nova.openstack.common import log as logging
from nova.openstack.common import timeutils
from nova import utils
@ -80,6 +81,8 @@ class ViewBuilder(common.ViewBuilder):
def show(self, request, instance):
"""Detailed view of a single instance."""
ip_v4 = instance.get('access_ip_v4')
ip_v6 = instance.get('access_ip_v6')
server = {
"server": {
"id": instance["uuid"],
@ -94,8 +97,8 @@ class ViewBuilder(common.ViewBuilder):
"created": timeutils.isotime(instance["created_at"]),
"updated": timeutils.isotime(instance["updated_at"]),
"addresses": self._get_addresses(request, instance),
"accessIPv4": instance.get("access_ip_v4") or "",
"accessIPv6": instance.get("access_ip_v6") or "",
"accessIPv4": str(ip_v4) if ip_v4 is not None else '',
"accessIPv6": str(ip_v6) if ip_v6 is not None else '',
"links": self._get_links(request,
instance["uuid"],
self._collection_name),
@ -133,7 +136,12 @@ class ViewBuilder(common.ViewBuilder):
@staticmethod
def _get_metadata(instance):
return utils.instance_meta(instance)
# FIXME(danms): Transitional support for objects
metadata = instance.get('metadata')
if isinstance(instance, instance_obj.Instance):
return metadata or {}
else:
return utils.instance_meta(instance)
@staticmethod
def _get_vm_state(instance):

View File

@ -49,6 +49,8 @@ from nova import network
from nova.network.security_group import openstack_driver
from nova.network.security_group import security_group_base
from nova import notifications
from nova.objects import base as obj_base
from nova.objects import instance as instance_obj
from nova.openstack.common import excutils
from nova.openstack.common import jsonutils
from nova.openstack.common import log as logging
@ -1430,7 +1432,7 @@ class API(base.Base):
"""Get an instance type by instance type id."""
return flavors.get_flavor(instance_type_id)
def get(self, context, instance_id):
def get(self, context, instance_id, want_objects=False):
"""Get a single instance with the given instance_id."""
# NOTE(ameade): we still need to support integer ids for ec2
try:
@ -1445,13 +1447,19 @@ class API(base.Base):
check_policy(context, 'get', instance)
inst = dict(instance.iteritems())
# NOTE(comstud): Doesn't get returned with iteritems
inst['name'] = instance['name']
if want_objects:
inst = instance_obj.Instance._from_db_object(
context, instance_obj.Instance(), instance,
expected_attrs=['metadata', 'system_metadata',
'security_groups', 'info_cache'])
else:
inst = dict(instance.iteritems())
# NOTE(comstud): Doesn't get returned with iteritems
inst['name'] = instance['name']
return inst
def get_all(self, context, search_opts=None, sort_key='created_at',
sort_dir='desc', limit=None, marker=None):
sort_dir='desc', limit=None, marker=None, want_objects=False):
"""Get all instances filtered by one of the given parameters.
If there is no filter and the context is an admin, it will retrieve
@ -1531,14 +1539,13 @@ class API(base.Base):
sort_key, sort_dir,
limit=limit,
marker=marker)
if want_objects:
return inst_models
# Convert the models to dictionaries
instances = []
for inst_model in inst_models:
instance = dict(inst_model.iteritems())
# NOTE(comstud): Doesn't get returned by iteritems
instance['name'] = inst_model['name']
instances.append(instance)
instances.append(obj_base.obj_to_primitive(inst_model))
return instances
@ -1554,9 +1561,11 @@ class API(base.Base):
uuids = set([r['instance_uuid'] for r in res])
filters['uuid'] = uuids
return self.db.instance_get_all_by_filters(context, filters,
sort_key, sort_dir,
limit=limit, marker=marker)
fields = ['metadata', 'system_metadata', 'info_cache',
'security_groups']
return instance_obj.InstanceList.get_by_filters(
context, filters=filters, sort_key=sort_key, sort_dir=sort_dir,
limit=limit, marker=marker, expected_attrs=fields)
@wrap_check_policy
@check_instance_state(vm_state=[vm_states.ACTIVE, vm_states.STOPPED])

View File

@ -475,7 +475,7 @@ class NovaObjectSerializer(nova.openstack.common.rpc.serializer.Serializer):
def obj_to_primitive(obj):
"""Recrusively turn an object into a python primitive.
"""Recursively turn an object into a python primitive.
A NovaObject becomes a dict, and anything that implements ObjectListBase
becomes a list.

View File

@ -21,6 +21,7 @@ import base64
import copy
import datetime
import functools
import iso8601
import os
import string
import tempfile
@ -871,6 +872,8 @@ class CloudTestCase(test.TestCase):
self.stubs.Set(compute_rpcapi.ComputeAPI, 'change_instance_metadata',
fake_change_instance_metadata)
utc = iso8601.iso8601.Utc()
# Create some test images
sys_meta = flavors.save_flavor_info(
{}, flavors.get_flavor(1))
@ -883,7 +886,8 @@ class CloudTestCase(test.TestCase):
'vm_state': 'active',
'launched_at': timeutils.utcnow(),
'hostname': 'server-1111',
'created_at': datetime.datetime(2012, 5, 1, 1, 1, 1),
'created_at': datetime.datetime(2012, 5, 1, 1, 1, 1,
tzinfo=utc),
'system_metadata': sys_meta
}
@ -895,7 +899,8 @@ class CloudTestCase(test.TestCase):
'vm_state': 'active',
'launched_at': timeutils.utcnow(),
'hostname': 'server-1112',
'created_at': datetime.datetime(2012, 5, 1, 1, 1, 2),
'created_at': datetime.datetime(2012, 5, 1, 1, 1, 2,
tzinfo=utc),
'system_metadata': sys_meta
}
@ -939,7 +944,8 @@ class CloudTestCase(test.TestCase):
'ipAddress': '1.2.3.4',
'keyName': 'None (None, host1)',
'launchTime':
datetime.datetime(2012, 5, 1, 1, 1, 1),
datetime.datetime(2012, 5, 1, 1, 1, 1,
tzinfo=utc),
'placement': {
'availabilityZone': 'nova'},
'privateDnsName': u'server-1111',
@ -970,7 +976,8 @@ class CloudTestCase(test.TestCase):
'ipAddress': '1.2.3.4',
'keyName': u'None (None, host2)',
'launchTime':
datetime.datetime(2012, 5, 1, 1, 1, 2),
datetime.datetime(2012, 5, 1, 1, 1, 2,
tzinfo=utc),
'placement': {
'availabilityZone': 'nova'},
'privateDnsName': u'server-1112',
@ -1056,25 +1063,30 @@ class CloudTestCase(test.TestCase):
'system_metadata': sys_meta,
}
utc = iso8601.iso8601.Utc()
inst1_kwargs = {}
inst1_kwargs.update(inst_base)
inst1_kwargs['host'] = 'host1'
inst1_kwargs['hostname'] = 'server-1111'
inst1_kwargs['created_at'] = datetime.datetime(2012, 5, 1, 1, 1, 1)
inst1_kwargs['created_at'] = datetime.datetime(2012, 5, 1, 1, 1, 1,
tzinfo=utc)
inst1 = db.instance_create(self.context, inst1_kwargs)
inst2_kwargs = {}
inst2_kwargs.update(inst_base)
inst2_kwargs['host'] = 'host2'
inst2_kwargs['hostname'] = 'server-2222'
inst2_kwargs['created_at'] = datetime.datetime(2012, 2, 1, 1, 1, 1)
inst2_kwargs['created_at'] = datetime.datetime(2012, 2, 1, 1, 1, 1,
tzinfo=utc)
inst2 = db.instance_create(self.context, inst2_kwargs)
inst3_kwargs = {}
inst3_kwargs.update(inst_base)
inst3_kwargs['host'] = 'host3'
inst3_kwargs['hostname'] = 'server-3333'
inst3_kwargs['created_at'] = datetime.datetime(2012, 2, 5, 1, 1, 1)
inst3_kwargs['created_at'] = datetime.datetime(2012, 2, 5, 1, 1, 1,
tzinfo=utc)
inst3 = db.instance_create(self.context, inst3_kwargs)
comp1 = db.service_create(self.context, {'host': 'host1',

View File

@ -39,6 +39,8 @@ class ConfigDriveTest(test.TestCase):
def test_show(self):
self.stubs.Set(db, 'instance_get',
fakes.fake_instance_get())
self.stubs.Set(db, 'instance_get_by_uuid',
fakes.fake_instance_get())
req = webob.Request.blank('/v2/fake/servers/1')
req.headers['Content-Type'] = 'application/json'
response = req.get_response(fakes.wsgi_app(init_only=('servers',)))

View File

@ -363,6 +363,7 @@ class CreateserverextTest(test.TestCase):
def test_get_server_by_id_verify_security_groups_json(self):
self.stubs.Set(db, 'instance_get', fakes.fake_instance_get())
self.stubs.Set(db, 'instance_get_by_uuid', fakes.fake_instance_get())
req = webob.Request.blank('/v2/fake/os-create-server-ext/1')
req.headers['Content-Type'] = 'application/json'
response = req.get_response(fakes.wsgi_app(
@ -375,6 +376,7 @@ class CreateserverextTest(test.TestCase):
def test_get_server_by_id_verify_security_groups_xml(self):
self.stubs.Set(db, 'instance_get', fakes.fake_instance_get())
self.stubs.Set(db, 'instance_get_by_uuid', fakes.fake_instance_get())
req = webob.Request.blank('/v2/fake/os-create-server-ext/1')
req.headers['Accept'] = 'application/xml'
response = req.get_response(fakes.wsgi_app(

View File

@ -66,7 +66,7 @@ class DiskConfigTestCase(test.TestCase):
self.stubs.Set(nova.db, 'instance_get', fake_instance_get)
def fake_instance_get_by_uuid(context, uuid):
def fake_instance_get_by_uuid(context, uuid, columns_to_get=None):
for instance in FAKE_INSTANCES:
if uuid == instance['uuid']:
return instance

View File

@ -21,6 +21,7 @@ from nova import availability_zones
from nova import compute
from nova.compute import vm_states
from nova import exception
from nova.objects import instance as instance_obj
from nova.openstack.common import jsonutils
from nova import test
from nova.tests.api.openstack import fakes
@ -55,7 +56,11 @@ def fake_compute_get_all(*args, **kwargs):
vm_state=vm_states.ACTIVE)
inst2 = fakes.stub_instance(2, uuid=UUID2, host="all-host",
vm_state=vm_states.ACTIVE)
return [inst1, inst2]
db_list = [inst1, inst2]
fields = instance_obj.INSTANCE_DEFAULT_FIELDS
return instance_obj._make_instance_list(args[1],
instance_obj.InstanceList(),
db_list, fields)
def fake_get_host_availability_zone(context, host):

View File

@ -19,6 +19,7 @@ import webob
from nova.api.openstack.compute.contrib import extended_ips
from nova.api.openstack import xmlutil
from nova import compute
from nova.objects import instance as instance_obj
from nova.openstack.common import jsonutils
from nova import test
from nova.tests.api.openstack import fakes
@ -91,10 +92,14 @@ def fake_compute_get(*args, **kwargs):
def fake_compute_get_all(*args, **kwargs):
return [
db_list = [
fakes.stub_instance(1, uuid=UUID1, nw_cache=NW_CACHE),
fakes.stub_instance(2, uuid=UUID2, nw_cache=NW_CACHE),
]
fields = instance_obj.INSTANCE_DEFAULT_FIELDS
return instance_obj._make_instance_list(args[1],
instance_obj.InstanceList(),
db_list, fields)
class ExtendedIpsTest(test.TestCase):

View File

@ -21,6 +21,7 @@ import webob
from nova.api.openstack.compute.contrib import extended_ips_mac
from nova.api.openstack import xmlutil
from nova import compute
from nova.objects import instance as instance_obj
from nova.openstack.common import jsonutils
from nova import test
from nova.tests.api.openstack import fakes
@ -98,10 +99,14 @@ def fake_compute_get(*args, **kwargs):
def fake_compute_get_all(*args, **kwargs):
return [
db_list = [
fakes.stub_instance(1, uuid=UUID1, nw_cache=NW_CACHE),
fakes.stub_instance(2, uuid=UUID2, nw_cache=NW_CACHE),
]
fields = instance_obj.INSTANCE_DEFAULT_FIELDS
return instance_obj._make_instance_list(args[1],
instance_obj.InstanceList(),
db_list, fields)
class ExtendedIpsMacTest(test.TestCase):

View File

@ -18,26 +18,39 @@ import webob
from nova.api.openstack.compute.contrib import extended_server_attributes
from nova import compute
from nova import db
from nova import exception
from nova.objects import instance as instance_obj
from nova.openstack.common import jsonutils
from nova import test
from nova.tests.api.openstack import fakes
from oslo.config import cfg
NAME_FMT = cfg.CONF.instance_name_template
UUID1 = '00000000-0000-0000-0000-000000000001'
UUID2 = '00000000-0000-0000-0000-000000000002'
UUID3 = '00000000-0000-0000-0000-000000000003'
def fake_compute_get(*args, **kwargs):
return fakes.stub_instance(1, uuid=UUID3, host="host-fake",
node="node-fake")
fields = instance_obj.INSTANCE_DEFAULT_FIELDS
return instance_obj.Instance._from_db_object(
args[1], instance_obj.Instance(),
fakes.stub_instance(1, uuid=UUID3, host="host-fake",
node="node-fake"), fields)
def fake_compute_get_all(*args, **kwargs):
return [
db_list = [
fakes.stub_instance(1, uuid=UUID1, host="host-1", node="node-1"),
fakes.stub_instance(2, uuid=UUID2, host="host-2", node="node-2")
]
fields = instance_obj.INSTANCE_DEFAULT_FIELDS
return instance_obj._make_instance_list(args[1],
instance_obj.InstanceList(),
db_list, fields)
class ExtendedServerAttributesTest(test.TestCase):
@ -49,6 +62,7 @@ class ExtendedServerAttributesTest(test.TestCase):
fakes.stub_out_nw_api(self.stubs)
self.stubs.Set(compute.api.API, 'get', fake_compute_get)
self.stubs.Set(compute.api.API, 'get_all', fake_compute_get_all)
self.stubs.Set(db, 'instance_get_by_uuid', fake_compute_get)
self.flags(
osapi_compute_extension=[
'nova.api.openstack.compute.contrib.select_extensions'],
@ -81,7 +95,7 @@ class ExtendedServerAttributesTest(test.TestCase):
self.assertServerAttributes(self._get_server(res.body),
host='host-fake',
node='node-fake',
instance_name='instance-1')
instance_name=NAME_FMT % 1)
def test_detail(self):
url = '/v2/fake/servers/detail'
@ -92,7 +106,7 @@ class ExtendedServerAttributesTest(test.TestCase):
self.assertServerAttributes(server,
host='host-%s' % (i + 1),
node='node-%s' % (i + 1),
instance_name='instance-%s' % (i + 1))
instance_name=NAME_FMT % (i + 1))
def test_no_instance_passthrough_404(self):

View File

@ -19,6 +19,7 @@ import webob
from nova.api.openstack.compute.contrib import extended_status
from nova import compute
from nova import exception
from nova.objects import instance as instance_obj
from nova.openstack.common import jsonutils
from nova import test
from nova.tests.api.openstack import fakes
@ -30,17 +31,22 @@ UUID3 = '00000000-0000-0000-0000-000000000003'
def fake_compute_get(*args, **kwargs):
return fakes.stub_instance(1, uuid=UUID3, task_state="kayaking",
vm_state="slightly crunchy", power_state="empowered")
vm_state="slightly crunchy", power_state=1)
def fake_compute_get_all(*args, **kwargs):
return [
db_list = [
fakes.stub_instance(1, uuid=UUID1, task_state="task-1",
vm_state="vm-1", power_state="power-1"),
vm_state="vm-1", power_state=1),
fakes.stub_instance(2, uuid=UUID2, task_state="task-2",
vm_state="vm-2", power_state="power-2"),
vm_state="vm-2", power_state=2),
]
fields = instance_obj.INSTANCE_DEFAULT_FIELDS
return instance_obj._make_instance_list(args[1],
instance_obj.InstanceList(),
db_list, fields)
class ExtendedStatusTest(test.TestCase):
content_type = 'application/json'
@ -70,7 +76,7 @@ class ExtendedStatusTest(test.TestCase):
def assertServerStates(self, server, vm_state, power_state, task_state):
self.assertEqual(server.get('%svm_state' % self.prefix), vm_state)
self.assertEqual(server.get('%spower_state' % self.prefix),
self.assertEqual(int(server.get('%spower_state' % self.prefix)),
power_state)
self.assertEqual(server.get('%stask_state' % self.prefix), task_state)
@ -81,7 +87,7 @@ class ExtendedStatusTest(test.TestCase):
self.assertEqual(res.status_int, 200)
self.assertServerStates(self._get_server(res.body),
vm_state='slightly crunchy',
power_state='empowered',
power_state=1,
task_state='kayaking')
def test_detail(self):
@ -92,7 +98,7 @@ class ExtendedStatusTest(test.TestCase):
for i, server in enumerate(self._get_servers(res.body)):
self.assertServerStates(server,
vm_state='vm-%s' % (i + 1),
power_state='power-%s' % (i + 1),
power_state=(i + 1),
task_state='task-%s' % (i + 1))
def test_no_instance_passthrough_404(self):

View File

@ -22,6 +22,7 @@ from nova.api.openstack import wsgi
from nova import compute
from nova.compute import vm_states
from nova import exception
from nova.objects import instance as instance_obj
from nova.openstack.common import jsonutils
from nova import test
from nova.tests.api.openstack import fakes
@ -106,7 +107,9 @@ class HideServerAddressesTest(test.TestCase):
instances = [instance_0, instance_1]
def get_all(*args, **kwargs):
return instances
fields = instance_obj.INSTANCE_DEFAULT_FIELDS
return instance_obj._make_instance_list(
args[1], instance_obj.InstanceList(), instances, fields)
self.stubs.Set(compute.api.API, 'get_all', get_all)
res = self._make_request('/v2/fake/servers/detail')

View File

@ -313,6 +313,8 @@ class KeypairsTest(test.TestCase):
def test_show_server(self):
self.stubs.Set(db, 'instance_get',
fakes.fake_instance_get())
self.stubs.Set(db, 'instance_get_by_uuid',
fakes.fake_instance_get())
req = webob.Request.blank('/v2/fake/servers/1')
req.headers['Content-Type'] = 'application/json'
response = req.get_response(fakes.wsgi_app(init_only=('servers',)))

View File

@ -27,6 +27,7 @@ from nova import compute
from nova.compute import power_state
import nova.db
from nova import exception
from nova.objects import instance as instance_obj
from nova.openstack.common import jsonutils
from nova import quota
from nova import test
@ -1457,15 +1458,26 @@ UUID3 = '00000000-0000-0000-0000-000000000003'
def fake_compute_get_all(*args, **kwargs):
return [
fakes.stub_instance(1, uuid=UUID1,
security_groups=[{'name': 'fake-0-0'},
{'name': 'fake-0-1'}]),
fakes.stub_instance(2, uuid=UUID2,
security_groups=[{'name': 'fake-1-0'},
{'name': 'fake-1-1'}])
base = {'id': 1, 'description': 'foo', 'user_id': 'bar',
'project_id': 'baz', 'deleted': False, 'deleted_at': None,
'updated_at': None, 'created_at': None}
db_list = [
fakes.stub_instance(
1, uuid=UUID1,
security_groups=[dict(base, **{'name': 'fake-0-0'}),
dict(base, **{'name': 'fake-0-1'})]),
fakes.stub_instance(
2, uuid=UUID2,
security_groups=[dict(base, **{'name': 'fake-1-0'}),
dict(base, **{'name': 'fake-1-1'})])
]
return instance_obj._make_instance_list(args[1],
instance_obj.InstanceList(),
db_list,
['metadata', 'system_metadata',
'security_groups', 'info_cache'])
def fake_compute_get(*args, **kwargs):
return fakes.stub_instance(1, uuid=UUID3,

View File

@ -20,6 +20,7 @@ from lxml import etree
from nova.api.openstack.compute.contrib import server_usage
from nova import compute
from nova import exception
from nova.objects import instance as instance_obj
from nova.openstack.common import jsonutils
from nova.openstack.common import timeutils
from nova import test
@ -40,12 +41,16 @@ def fake_compute_get(*args, **kwargs):
def fake_compute_get_all(*args, **kwargs):
return [
db_list = [
fakes.stub_instance(2, uuid=UUID1, launched_at=DATE2,
terminated_at=DATE3),
fakes.stub_instance(3, uuid=UUID2, launched_at=DATE1,
terminated_at=DATE3),
]
fields = instance_obj.INSTANCE_DEFAULT_FIELDS
return instance_obj._make_instance_list(args[1],
instance_obj.InstanceList(),
db_list, fields)
class ServerUsageTest(test.TestCase):

View File

@ -18,11 +18,17 @@ import webob
from nova.api.openstack.compute.contrib import extended_server_attributes
from nova import compute
from nova import db
from nova import exception
from nova.objects import instance as instance_obj
from nova.openstack.common import jsonutils
from nova import test
from nova.tests.api.openstack import fakes
from oslo.config import cfg
NAME_FMT = cfg.CONF.instance_name_template
UUID1 = '00000000-0000-0000-0000-000000000001'
UUID2 = '00000000-0000-0000-0000-000000000002'
UUID3 = '00000000-0000-0000-0000-000000000003'
@ -34,10 +40,14 @@ def fake_compute_get(*args, **kwargs):
def fake_compute_get_all(*args, **kwargs):
return [
db_list = [
fakes.stub_instance(1, uuid=UUID1, host="host-1", node="node-1"),
fakes.stub_instance(2, uuid=UUID2, host="host-2", node="node-2")
]
fields = instance_obj.INSTANCE_DEFAULT_FIELDS
return instance_obj._make_instance_list(args[1],
instance_obj.InstanceList(),
db_list, fields)
class ExtendedServerAttributesTest(test.TestCase):
@ -49,6 +59,7 @@ class ExtendedServerAttributesTest(test.TestCase):
fakes.stub_out_nw_api(self.stubs)
self.stubs.Set(compute.api.API, 'get', fake_compute_get)
self.stubs.Set(compute.api.API, 'get_all', fake_compute_get_all)
self.stubs.Set(db, 'instance_get_by_uuid', fake_compute_get)
self.flags(
osapi_compute_extension=[
'nova.api.openstack.compute.contrib.select_extensions'],
@ -92,7 +103,7 @@ class ExtendedServerAttributesTest(test.TestCase):
self.assertServerAttributes(server,
host='host-%s' % (i + 1),
node='node-%s' % (i + 1),
instance_name='instance-%s' % (i + 1))
instance_name=NAME_FMT % (i + 1))
def test_no_instance_passthrough_404(self):

View File

@ -19,6 +19,7 @@ import webob
from nova.api.openstack.compute.contrib import extended_status
from nova import compute
from nova import exception
from nova.objects import instance as instance_obj
from nova.openstack.common import jsonutils
from nova import test
from nova.tests.api.openstack import fakes
@ -30,16 +31,20 @@ UUID3 = '00000000-0000-0000-0000-000000000003'
def fake_compute_get(*args, **kwargs):
return fakes.stub_instance(1, uuid=UUID3, task_state="kayaking",
vm_state="slightly crunchy", power_state="empowered")
vm_state="slightly crunchy", power_state=1)
def fake_compute_get_all(*args, **kwargs):
return [
db_list = [
fakes.stub_instance(1, uuid=UUID1, task_state="task-1",
vm_state="vm-1", power_state="power-1"),
vm_state="vm-1", power_state=1),
fakes.stub_instance(2, uuid=UUID2, task_state="task-2",
vm_state="vm-2", power_state="power-2"),
vm_state="vm-2", power_state=2),
]
fields = instance_obj.INSTANCE_DEFAULT_FIELDS
return instance_obj._make_instance_list(args[1],
instance_obj.InstanceList(),
db_list, fields)
class ExtendedStatusTest(test.TestCase):
@ -70,7 +75,7 @@ class ExtendedStatusTest(test.TestCase):
def assertServerStates(self, server, vm_state, power_state, task_state):
self.assertEqual(server.get('%svm_state' % self.prefix), vm_state)
self.assertEqual(server.get('%spower_state' % self.prefix),
self.assertEqual(int(server.get('%spower_state' % self.prefix)),
power_state)
self.assertEqual(server.get('%stask_state' % self.prefix), task_state)
@ -81,7 +86,7 @@ class ExtendedStatusTest(test.TestCase):
self.assertEqual(res.status_int, 200)
self.assertServerStates(self._get_server(res.body),
vm_state='slightly crunchy',
power_state='empowered',
power_state=1,
task_state='kayaking')
def test_detail(self):
@ -92,7 +97,7 @@ class ExtendedStatusTest(test.TestCase):
for i, server in enumerate(self._get_servers(res.body)):
self.assertServerStates(server,
vm_state='vm-%s' % (i + 1),
power_state='power-%s' % (i + 1),
power_state=(i + 1),
task_state='task-%s' % (i + 1))
def test_no_instance_passthrough_404(self):

View File

@ -687,7 +687,7 @@ class ServersControllerTest(test.TestCase):
def fake_get_all(compute_self, context, search_opts=None,
sort_key=None, sort_dir='desc',
limit=None, marker=None):
limit=None, marker=None, columns_to_join=None):
return [fakes.stub_instance(100, uuid=server_uuid)]
self.stubs.Set(compute_api.API, 'get_all', fake_get_all)
@ -703,7 +703,7 @@ class ServersControllerTest(test.TestCase):
def fake_get_all(compute_self, context, search_opts=None,
sort_key=None, sort_dir='desc',
limit=None, marker=None):
limit=None, marker=None, columns_to_join=None):
self.assertNotEqual(search_opts, None)
self.assertTrue('image' in search_opts)
self.assertEqual(search_opts['image'], '12345')
@ -719,7 +719,8 @@ class ServersControllerTest(test.TestCase):
def test_tenant_id_filter_converts_to_project_id_for_admin(self):
def fake_get_all(context, filters=None, sort_key=None,
sort_dir='desc', limit=None, marker=None):
sort_dir='desc', limit=None, marker=None,
columns_to_join=None):
self.assertNotEqual(filters, None)
self.assertEqual(filters['project_id'], 'fake')
self.assertFalse(filters.get('tenant_id'))
@ -736,7 +737,8 @@ class ServersControllerTest(test.TestCase):
def test_admin_restricted_tenant(self):
def fake_get_all(context, filters=None, sort_key=None,
sort_dir='desc', limit=None, marker=None):
sort_dir='desc', limit=None, marker=None,
columns_to_join=None):
self.assertNotEqual(filters, None)
self.assertEqual(filters['project_id'], 'fake')
return [fakes.stub_instance(100)]
@ -752,7 +754,8 @@ class ServersControllerTest(test.TestCase):
def test_all_tenants_pass_policy(self):
def fake_get_all(context, filters=None, sort_key=None,
sort_dir='desc', limit=None, marker=None):
sort_dir='desc', limit=None, marker=None,
columns_to_join=None):
self.assertNotEqual(filters, None)
self.assertTrue('project_id' not in filters)
return [fakes.stub_instance(100)]
@ -776,7 +779,8 @@ class ServersControllerTest(test.TestCase):
def test_all_tenants_fail_policy(self):
def fake_get_all(context, filters=None, sort_key=None,
sort_dir='desc', limit=None, marker=None):
sort_dir='desc', limit=None, marker=None,
columns_to_join=None):
self.assertNotEqual(filters, None)
return [fakes.stub_instance(100)]
@ -800,7 +804,7 @@ class ServersControllerTest(test.TestCase):
def fake_get_all(compute_self, context, search_opts=None,
sort_key=None, sort_dir='desc',
limit=None, marker=None):
limit=None, marker=None, columns_to_join=None):
self.assertNotEqual(search_opts, None)
self.assertTrue('flavor' in search_opts)
# flavor is an integer ID
@ -826,7 +830,7 @@ class ServersControllerTest(test.TestCase):
def fake_get_all(compute_self, context, search_opts=None,
sort_key=None, sort_dir='desc',
limit=None, marker=None):
limit=None, marker=None, columns_to_join=None):
self.assertNotEqual(search_opts, None)
self.assertTrue('vm_state' in search_opts)
self.assertEqual(search_opts['vm_state'], vm_states.ACTIVE)
@ -858,7 +862,7 @@ class ServersControllerTest(test.TestCase):
def fake_get_all(compute_self, context, search_opts=None,
sort_key=None, sort_dir='desc',
limit=None, marker=None):
limit=None, marker=None, columns_to_join=None):
self.assertTrue('vm_state' in search_opts)
self.assertEqual(search_opts['vm_state'], 'deleted')
@ -878,7 +882,7 @@ class ServersControllerTest(test.TestCase):
def fake_get_all(compute_self, context, search_opts=None,
sort_key=None, sort_dir='desc',
limit=None, marker=None):
limit=None, marker=None, columns_to_join=None):
self.assertNotEqual(search_opts, None)
self.assertTrue('name' in search_opts)
self.assertEqual(search_opts['name'], 'whee.*')
@ -897,7 +901,7 @@ class ServersControllerTest(test.TestCase):
def fake_get_all(compute_self, context, search_opts=None,
sort_key=None, sort_dir='desc',
limit=None, marker=None):
limit=None, marker=None, columns_to_join=None):
self.assertNotEqual(search_opts, None)
self.assertTrue('changes-since' in search_opts)
changes_since = datetime.datetime(2011, 1, 24, 17, 8, 1,
@ -929,7 +933,7 @@ class ServersControllerTest(test.TestCase):
def fake_get_all(compute_self, context, search_opts=None,
sort_key=None, sort_dir='desc',
limit=None, marker=None):
limit=None, marker=None, columns_to_join=None):
self.assertNotEqual(search_opts, None)
# Allowed by user
self.assertTrue('name' in search_opts)
@ -958,7 +962,7 @@ class ServersControllerTest(test.TestCase):
def fake_get_all(compute_self, context, search_opts=None,
sort_key=None, sort_dir='desc',
limit=None, marker=None):
limit=None, marker=None, columns_to_join=None):
self.assertNotEqual(search_opts, None)
# Allowed by user
self.assertTrue('name' in search_opts)
@ -986,7 +990,7 @@ class ServersControllerTest(test.TestCase):
def fake_get_all(compute_self, context, search_opts=None,
sort_key=None, sort_dir='desc',
limit=None, marker=None):
limit=None, marker=None, columns_to_join=None):
self.assertNotEqual(search_opts, None)
self.assertTrue('ip' in search_opts)
self.assertEqual(search_opts['ip'], '10\..*')
@ -1008,7 +1012,7 @@ class ServersControllerTest(test.TestCase):
def fake_get_all(compute_self, context, search_opts=None,
sort_key=None, sort_dir='desc',
limit=None, marker=None):
limit=None, marker=None, columns_to_join=None):
self.assertNotEqual(search_opts, None)
self.assertTrue('ip6' in search_opts)
self.assertEqual(search_opts['ip6'], 'ffff.*')

View File

@ -30,6 +30,7 @@ from nova.image import glance
from nova.openstack.common import importutils
from nova import test
from nova.tests.api.openstack import fakes
from nova.tests import fake_instance
from nova.tests.image import fake
from nova.tests import matchers
from nova.tests import utils
@ -994,9 +995,9 @@ class ServerActionsControllerTest(test.TestCase):
def test_locked(self):
def fake_locked(context, instance_uuid):
return {"name": "foo",
"uuid": FAKE_UUID,
"locked": True}
return fake_instance.fake_db_instance(name="foo",
uuid=FAKE_UUID,
locked=True)
self.stubs.Set(db, 'instance_get_by_uuid', fake_locked)
body = dict(reboot=dict(type="HARD"))
req = fakes.HTTPRequest.blank(self.url)

View File

@ -45,6 +45,7 @@ from nova import exception
from nova.image import glance
from nova.network import manager
from nova.network.quantumv2 import api as quantum_api
from nova.objects import instance as instance_obj
from nova.openstack.common import jsonutils
from nova.openstack.common import policy as common_policy
from nova.openstack.common import rpc
@ -70,6 +71,8 @@ XPATH_NS = {
INSTANCE_IDS = {FAKE_UUID: 1}
FIELDS = instance_obj.INSTANCE_DEFAULT_FIELDS
def fake_gen_uuid():
return FAKE_UUID
@ -691,8 +694,10 @@ class ServersControllerTest(test.TestCase):
def fake_get_all(compute_self, context, search_opts=None,
sort_key=None, sort_dir='desc',
limit=None, marker=None):
return [fakes.stub_instance(100, uuid=server_uuid)]
limit=None, marker=None, want_objects=False):
db_list = [fakes.stub_instance(100, uuid=server_uuid)]
return instance_obj._make_instance_list(
context, instance_obj.InstanceList(), db_list, FIELDS)
self.stubs.Set(compute_api.API, 'get_all', fake_get_all)
@ -707,11 +712,13 @@ class ServersControllerTest(test.TestCase):
def fake_get_all(compute_self, context, search_opts=None,
sort_key=None, sort_dir='desc',
limit=None, marker=None):
limit=None, marker=None, want_objects=False):
self.assertNotEqual(search_opts, None)
self.assertTrue('image' in search_opts)
self.assertEqual(search_opts['image'], '12345')
return [fakes.stub_instance(100, uuid=server_uuid)]
db_list = [fakes.stub_instance(100, uuid=server_uuid)]
return instance_obj._make_instance_list(
context, instance_obj.InstanceList(), db_list, FIELDS)
self.stubs.Set(compute_api.API, 'get_all', fake_get_all)
@ -723,7 +730,8 @@ class ServersControllerTest(test.TestCase):
def test_tenant_id_filter_converts_to_project_id_for_admin(self):
def fake_get_all(context, filters=None, sort_key=None,
sort_dir='desc', limit=None, marker=None):
sort_dir='desc', limit=None, marker=None,
columns_to_join=None):
self.assertNotEqual(filters, None)
self.assertEqual(filters['project_id'], 'fake')
self.assertFalse(filters.get('tenant_id'))
@ -740,7 +748,8 @@ class ServersControllerTest(test.TestCase):
def test_admin_restricted_tenant(self):
def fake_get_all(context, filters=None, sort_key=None,
sort_dir='desc', limit=None, marker=None):
sort_dir='desc', limit=None, marker=None,
columns_to_join=None):
self.assertNotEqual(filters, None)
self.assertEqual(filters['project_id'], 'fake')
return [fakes.stub_instance(100)]
@ -756,7 +765,8 @@ class ServersControllerTest(test.TestCase):
def test_all_tenants_pass_policy(self):
def fake_get_all(context, filters=None, sort_key=None,
sort_dir='desc', limit=None, marker=None):
sort_dir='desc', limit=None, marker=None,
columns_to_join=None):
self.assertNotEqual(filters, None)
self.assertTrue('project_id' not in filters)
return [fakes.stub_instance(100)]
@ -780,7 +790,8 @@ class ServersControllerTest(test.TestCase):
def test_all_tenants_fail_policy(self):
def fake_get_all(context, filters=None, sort_key=None,
sort_dir='desc', limit=None, marker=None):
sort_dir='desc', limit=None, marker=None,
columns_to_join=None):
self.assertNotEqual(filters, None)
return [fakes.stub_instance(100)]
@ -804,12 +815,14 @@ class ServersControllerTest(test.TestCase):
def fake_get_all(compute_self, context, search_opts=None,
sort_key=None, sort_dir='desc',
limit=None, marker=None):
limit=None, marker=None, want_objects=False):
self.assertNotEqual(search_opts, None)
self.assertTrue('flavor' in search_opts)
# flavor is an integer ID
self.assertEqual(search_opts['flavor'], '12345')
return [fakes.stub_instance(100, uuid=server_uuid)]
db_list = [fakes.stub_instance(100, uuid=server_uuid)]
return instance_obj._make_instance_list(
context, instance_obj.InstanceList(), db_list, FIELDS)
self.stubs.Set(compute_api.API, 'get_all', fake_get_all)
@ -830,11 +843,13 @@ class ServersControllerTest(test.TestCase):
def fake_get_all(compute_self, context, search_opts=None,
sort_key=None, sort_dir='desc',
limit=None, marker=None):
limit=None, marker=None, want_objects=False):
self.assertNotEqual(search_opts, None)
self.assertTrue('vm_state' in search_opts)
self.assertEqual(search_opts['vm_state'], vm_states.ACTIVE)
return [fakes.stub_instance(100, uuid=server_uuid)]
db_list = [fakes.stub_instance(100, uuid=server_uuid)]
return instance_obj._make_instance_list(
context, instance_obj.InstanceList(), db_list, FIELDS)
self.stubs.Set(compute_api.API, 'get_all', fake_get_all)
@ -862,11 +877,13 @@ class ServersControllerTest(test.TestCase):
def fake_get_all(compute_self, context, search_opts=None,
sort_key=None, sort_dir='desc',
limit=None, marker=None):
limit=None, marker=None, want_objects=False):
self.assertTrue('vm_state' in search_opts)
self.assertEqual(search_opts['vm_state'], 'deleted')
return [fakes.stub_instance(100, uuid=server_uuid)]
db_list = [fakes.stub_instance(100, uuid=server_uuid)]
return instance_obj._make_instance_list(
context, instance_obj.InstanceList(), db_list, FIELDS)
self.stubs.Set(compute_api.API, 'get_all', fake_get_all)
@ -882,11 +899,13 @@ class ServersControllerTest(test.TestCase):
def fake_get_all(compute_self, context, search_opts=None,
sort_key=None, sort_dir='desc',
limit=None, marker=None):
limit=None, marker=None, want_objects=False):
self.assertNotEqual(search_opts, None)
self.assertTrue('name' in search_opts)
self.assertEqual(search_opts['name'], 'whee.*')
return [fakes.stub_instance(100, uuid=server_uuid)]
db_list = [fakes.stub_instance(100, uuid=server_uuid)]
return instance_obj._make_instance_list(
context, instance_obj.InstanceList(), db_list, FIELDS)
self.stubs.Set(compute_api.API, 'get_all', fake_get_all)
@ -901,14 +920,16 @@ class ServersControllerTest(test.TestCase):
def fake_get_all(compute_self, context, search_opts=None,
sort_key=None, sort_dir='desc',
limit=None, marker=None):
limit=None, marker=None, want_objects=False):
self.assertNotEqual(search_opts, None)
self.assertTrue('changes-since' in search_opts)
changes_since = datetime.datetime(2011, 1, 24, 17, 8, 1,
tzinfo=iso8601.iso8601.UTC)
self.assertEqual(search_opts['changes-since'], changes_since)
self.assertTrue('deleted' not in search_opts)
return [fakes.stub_instance(100, uuid=server_uuid)]
db_list = [fakes.stub_instance(100, uuid=server_uuid)]
return instance_obj._make_instance_list(
context, instance_obj.InstanceList(), db_list, FIELDS)
self.stubs.Set(compute_api.API, 'get_all', fake_get_all)
@ -933,7 +954,7 @@ class ServersControllerTest(test.TestCase):
def fake_get_all(compute_self, context, search_opts=None,
sort_key=None, sort_dir='desc',
limit=None, marker=None):
limit=None, marker=None, want_objects=False):
self.assertNotEqual(search_opts, None)
# Allowed by user
self.assertTrue('name' in search_opts)
@ -942,7 +963,9 @@ class ServersControllerTest(test.TestCase):
self.assertTrue('vm_state' in search_opts)
# Allowed only by admins with admin API on
self.assertFalse('unknown_option' in search_opts)
return [fakes.stub_instance(100, uuid=server_uuid)]
db_list = [fakes.stub_instance(100, uuid=server_uuid)]
return instance_obj._make_instance_list(
context, instance_obj.InstanceList(), db_list, FIELDS)
self.stubs.Set(compute_api.API, 'get_all', fake_get_all)
@ -962,7 +985,7 @@ class ServersControllerTest(test.TestCase):
def fake_get_all(compute_self, context, search_opts=None,
sort_key=None, sort_dir='desc',
limit=None, marker=None):
limit=None, marker=None, want_objects=False):
self.assertNotEqual(search_opts, None)
# Allowed by user
self.assertTrue('name' in search_opts)
@ -971,7 +994,9 @@ class ServersControllerTest(test.TestCase):
# Allowed only by admins with admin API on
self.assertTrue('ip' in search_opts)
self.assertTrue('unknown_option' in search_opts)
return [fakes.stub_instance(100, uuid=server_uuid)]
db_list = [fakes.stub_instance(100, uuid=server_uuid)]
return instance_obj._make_instance_list(
context, instance_obj.InstanceList(), db_list, FIELDS)
self.stubs.Set(compute_api.API, 'get_all', fake_get_all)
@ -989,11 +1014,13 @@ class ServersControllerTest(test.TestCase):
def fake_get_all(compute_self, context, search_opts=None,
sort_key=None, sort_dir='desc',
limit=None, marker=None):
limit=None, marker=None, want_objects=False):
self.assertNotEqual(search_opts, None)
self.assertTrue('ip' in search_opts)
self.assertEqual(search_opts['ip'], '10\..*')
return [fakes.stub_instance(100, uuid=server_uuid)]
db_list = [fakes.stub_instance(100, uuid=server_uuid)]
return instance_obj._make_instance_list(
context, instance_obj.InstanceList(), db_list, FIELDS)
self.stubs.Set(compute_api.API, 'get_all', fake_get_all)
@ -1011,11 +1038,13 @@ class ServersControllerTest(test.TestCase):
def fake_get_all(compute_self, context, search_opts=None,
sort_key=None, sort_dir='desc',
limit=None, marker=None):
limit=None, marker=None, want_objects=False):
self.assertNotEqual(search_opts, None)
self.assertTrue('ip6' in search_opts)
self.assertEqual(search_opts['ip6'], 'ffff.*')
return [fakes.stub_instance(100, uuid=server_uuid)]
db_list = [fakes.stub_instance(100, uuid=server_uuid)]
return instance_obj._make_instance_list(
context, instance_obj.InstanceList(), db_list, FIELDS)
self.stubs.Set(compute_api.API, 'get_all', fake_get_all)
@ -1045,7 +1074,7 @@ class ServersControllerTest(test.TestCase):
self.assertEqual(res_dict['server']['id'], FAKE_UUID)
self.assertEqual(res_dict['server']['name'], 'server_test')
self.assertEqual(res_dict['server']['accessIPv4'], '0.0.0.0')
self.assertEqual(res_dict['server']['accessIPv6'], 'beef::0123')
self.assertEqual(res_dict['server']['accessIPv6'], 'beef::123')
def test_update_server_invalid_xml_raises_lookup(self):
req = fakes.HTTPRequest.blank('/fake/servers/%s' % FAKE_UUID)
@ -1167,7 +1196,7 @@ class ServersControllerTest(test.TestCase):
res_dict = self.controller.update(req, FAKE_UUID, body)
self.assertEqual(res_dict['server']['id'], FAKE_UUID)
self.assertEqual(res_dict['server']['accessIPv6'], 'beef::0123')
self.assertEqual(res_dict['server']['accessIPv6'], 'beef::123')
def test_update_server_access_ipv6_bad_format(self):
self.stubs.Set(db, 'instance_get',

View File

@ -404,7 +404,6 @@ def create_info_cache(nw_cache):
'ips': [_ip(ip) for ip in pub0]},
{'cidr': 'b33f::/64',
'ips': [_ip(ip) for ip in pub1]}]}}]
return {"info_cache": {"network_info": nw_cache}}
if not isinstance(nw_cache, basestring):
nw_cache = jsonutils.dumps(nw_cache)