test fixes and typos

This commit is contained in:
Chris Behrens 2011-08-04 13:59:57 -07:00
parent b9ecf86976
commit b1b919d42d
7 changed files with 75 additions and 65 deletions

View File

@ -25,6 +25,7 @@ from nova import exception
from nova import flags
from nova import log as logging
from nova.api.openstack import wsgi
from nova.compute import power_state as compute_power_state
LOG = logging.getLogger('nova.api.openstack.common')
@ -35,6 +36,38 @@ XML_NS_V10 = 'http://docs.rackspacecloud.com/servers/api/v1.0'
XML_NS_V11 = 'http://docs.openstack.org/compute/api/v1.1'
_STATUS_MAP = {
None: 'BUILD',
compute_power_state.NOSTATE: 'BUILD',
compute_power_state.RUNNING: 'ACTIVE',
compute_power_state.BLOCKED: 'ACTIVE',
compute_power_state.SUSPENDED: 'SUSPENDED',
compute_power_state.PAUSED: 'PAUSED',
compute_power_state.SHUTDOWN: 'SHUTDOWN',
compute_power_state.SHUTOFF: 'SHUTOFF',
compute_power_state.CRASHED: 'ERROR',
compute_power_state.FAILED: 'ERROR',
compute_power_state.BUILDING: 'BUILD',
}
def status_from_power_state(power_state):
"""Map the power state to the server status string"""
return _STATUS_MAP[power_state]
def power_states_from_status(status):
"""Map the server status string to a list of power states"""
power_states = []
for power_state, status_map in _STATUS_MAP.iteritems():
# Skip the 'None' state
if power_state is None:
continue
if status.lower() == status_map.lower():
power_states.append(power_state)
return power_states
def get_pagination_params(request):
"""Return marker, limit tuple from request.

View File

@ -31,7 +31,6 @@ from nova.api.openstack import create_instance_helper as helper
from nova.api.openstack import ips
from nova.api.openstack import wsgi
from nova.compute import instance_types
from nova.compute import power_state
from nova.scheduler import api as scheduler_api
import nova.api.openstack
import nova.api.openstack.views.addresses
@ -53,7 +52,7 @@ class Controller(object):
self.compute_api = compute.API()
self.helper = helper.CreateInstanceHelper(self)
def _check_servers_options(self, search_options):
def _check_servers_options(self, context, search_options):
if FLAGS.allow_admin_api and context.is_admin:
# Allow all options
return
@ -106,7 +105,7 @@ class Controller(object):
# child zones..
if 'status' in search_opts:
status = search_opts['status']
search_opts['state'] = power_state.states_from_status(status)
search_opts['state'] = common.power_states_from_status(status)
if len(search_opts['state']) == 0:
reason = _('Invalid server status: %(status)s') % locals()
LOG.error(reason)
@ -122,10 +121,10 @@ class Controller(object):
# Admin hasn't specified deleted filter
if 'changes-since' not in search_opts:
# No 'changes-since', so we need to find non-deleted servers
search_opts['deleted'] = '^False$'
search_opts['deleted'] = False
else:
# This is the default, but just in case..
search_opts['deleted'] = '^True$'
search_opts['deleted'] = True
instance_list = self.compute_api.get_all(
context, search_opts=search_opts)

View File

@ -20,7 +20,6 @@ import hashlib
import os
from nova import exception
from nova.compute import power_state
import nova.compute
import nova.context
from nova.api.openstack import common
@ -65,7 +64,7 @@ class ViewBuilder(object):
inst_dict = {
'id': inst['id'],
'name': inst['display_name'],
'status': power_state.status_from_state(inst.get('state'))}
'status': common.status_from_power_state(inst.get('state'))}
ctxt = nova.context.get_admin_context()
compute_api = nova.compute.API()

View File

@ -48,20 +48,6 @@ _STATE_MAP = {
BUILDING: 'building',
}
_STATUS_MAP = {
None: 'BUILD',
NOSTATE: 'BUILD',
RUNNING: 'ACTIVE',
BLOCKED: 'ACTIVE',
SUSPENDED: 'SUSPENDED',
PAUSED: 'PAUSED',
SHUTDOWN: 'SHUTDOWN',
SHUTOFF: 'SHUTOFF',
CRASHED: 'ERROR',
FAILED: 'ERROR',
BUILDING: 'BUILD',
}
def name(code):
return _STATE_MAP[code]
@ -69,20 +55,3 @@ def name(code):
def valid_states():
return _STATE_MAP.keys()
def status_from_state(power_state):
"""Map the power state to the server status string"""
return _STATUS_MAP[power_state]
def states_from_status(status):
"""Map the server status string to a list of power states"""
power_states = []
for power_state, status_map in _STATUS_MAP.iteritems():
# Skip the 'None' state
if power_state is None:
continue
if status.lower() == status_map.lower():
power_states.append(power_state)
return power_states

View File

@ -1153,14 +1153,14 @@ def instance_get_all_by_filters(context, filters):
will be returned by default, unless there's a filter that says
otherwise"""
def _filter_by_ipv6(instance, filter_re):
def _regexp_filter_by_ipv6(instance, filter_re):
for interface in instance['virtual_interfaces']:
fixed_ipv6 = interface.get('fixed_ipv6')
if fixed_ipv6 and filter_re.match(fixed_ipv6):
return True
return False
def _filter_by_ip(instance, filter_re):
def _regexp_filter_by_ip(instance, filter_re):
for interface in instance['virtual_interfaces']:
for fixed_ip in interface['fixed_ips']:
if not fixed_ip or not fixed_ip['address']:
@ -1174,12 +1174,12 @@ def instance_get_all_by_filters(context, filters):
return True
return False
def _filter_by_display_name(instance, filter_re):
def _regexp_filter_by_display_name(instance, filter_re):
if filter_re.match(instance.display_name):
return True
return False
def _filter_by_column(instance, filter_name, filter_re):
def _regexp_filter_by_column(instance, filter_name, filter_re):
try:
v = getattr(instance, filter_name)
except AttributeError:
@ -1188,6 +1188,18 @@ def instance_get_all_by_filters(context, filters):
return True
return False
def _exact_match_filter(query, column, value):
"""Do exact match against a column. value to match can be a list
so you can match any value in the list.
"""
if isinstance(value, list):
column_attr = getattr(models.Instance, column)
return query.filter(column_attr.in_(value))
else:
filter_dict = {}
filter_dict[column] = value
return query.filter_by(**filter_dict)
session = get_session()
query_prefix = session.query(models.Instance).\
options(joinedload_all('fixed_ips.floating_ips')).\
@ -1208,21 +1220,16 @@ def instance_get_all_by_filters(context, filters):
else:
filters['user_id'] = context.user_id
# Filters that we can do along with the SQL query...
query_filter_funcs = {
'project_id': lambda query, value: query.filter_by(
project_id=value),
'user_id': lambda query, value: query.filter_by(
user_id=value),
'reservation_id': lambda query, value: query.filter_by(
reservation_id=value),
'state': lambda query, value: query.filter_by(state=value)}
# Filters for exact matches that we can do along with the SQL query...
# For other filters that don't match this, we will do regexp matching
exact_match_filter_names = ['project_id', 'user_id', 'image_ref',
'state', 'instance_type_id', 'deleted']
query_filters = [key for key in filters.iterkeys()
if key in query_filter_funcs]
if key in exact_match_filter_names]
for filter_name in query_filters:
query_prefix = query_filter_funcs[filter_name](query_prefix,
query_prefix = _exact_match_filter(query_prefix, filter_name,
filters[filter_name])
# Remove this from filters, so it doesn't get tried below
del filters[filter_name]
@ -1233,17 +1240,19 @@ def instance_get_all_by_filters(context, filters):
return []
# Now filter on everything else for regexp matching..
filter_funcs = {'ip6': _filter_by_ipv6,
'ip': _filter_by_ip,
'name': _filter_by_display_name}
# For filters not in the list, we'll attempt to use the filter_name
# as a column name in Instance..
regexp_filter_funcs = {'ip6': _regexp_filter_by_ipv6,
'ip': _regexp_filter_by_ip,
'name': _regexp_filter_by_display_name}
for filter_name in filters.iterkeys():
filter_func = filter_funcs.get(filter_name, None)
filter_func = regexp_filter_funcs.get(filter_name, None)
filter_re = re.compile(filters[filter_name])
if filter_func:
filter_l = lambda instance: filter_func(instance, filter_re)
else:
filter_l = lambda instance: _filter_by_column(instance,
filter_l = lambda instance: _regexp_filter_by_column(instance,
filter_name, filter_re)
instances = filter(filter_l, instances)

View File

@ -68,8 +68,6 @@ def fake_auth_init(self, application):
@webob.dec.wsgify
def fake_wsgi(self, req):
if 'nova.context' not in req.environ:
req.environ['nova.context'] = context.RequestContext(1, 1)
return self.application

View File

@ -1149,6 +1149,7 @@ class ServersTest(test.TestCase):
return [stub_instance(100)]
self.stubs.Set(nova.compute.API, 'get_all', fake_get_all)
self.flags(allow_admin_api=False)
req = webob.Request.blank('/v1.1/servers?image=12345')
res = req.get_response(fakes.wsgi_app())
@ -1168,6 +1169,7 @@ class ServersTest(test.TestCase):
return [stub_instance(100)]
self.stubs.Set(nova.compute.API, 'get_all', fake_get_all)
self.flags(allow_admin_api=False)
req = webob.Request.blank('/v1.1/servers?flavor=12345')
res = req.get_response(fakes.wsgi_app())
@ -1187,6 +1189,7 @@ class ServersTest(test.TestCase):
return [stub_instance(100)]
self.stubs.Set(nova.compute.API, 'get_all', fake_get_all)
self.flags(allow_admin_api=False)
req = webob.Request.blank('/v1.1/servers?status=active')
res = req.get_response(fakes.wsgi_app())
@ -1205,6 +1208,7 @@ class ServersTest(test.TestCase):
return [stub_instance(100)]
self.stubs.Set(nova.compute.API, 'get_all', fake_get_all)
self.flags(allow_admin_api=False)
req = webob.Request.blank('/v1.1/servers?name=whee.*')
res = req.get_response(fakes.wsgi_app())
@ -1219,8 +1223,7 @@ class ServersTest(test.TestCase):
"""Test getting servers by instance_name with admin_api
enabled but non-admin context
"""
FLAGS.allow_admin_api = True
self.flags(allow_admin_api=True)
context = nova.context.RequestContext('testuser', 'testproject',
is_admin=False)
req = webob.Request.blank('/v1.1/servers?instance_name=whee.*')
@ -1234,8 +1237,6 @@ class ServersTest(test.TestCase):
"""Test getting servers by instance_name with admin_api
enabled and admin context
"""
FLAGS.allow_admin_api = True
def fake_get_all(compute_self, context, search_opts=None):
self.assertNotEqual(search_opts, None)
self.assertTrue('instance_name' in search_opts)
@ -1243,6 +1244,7 @@ class ServersTest(test.TestCase):
return [stub_instance(100)]
self.stubs.Set(nova.compute.API, 'get_all', fake_get_all)
self.flags(allow_admin_api=True)
req = webob.Request.blank('/v1.1/servers?instance_name=whee.*')
# Request admin context
@ -1878,6 +1880,7 @@ class ServersTest(test.TestCase):
def test_get_all_server_details_v1_0(self):
req = webob.Request.blank('/v1.0/servers/detail')
res = req.get_response(fakes.wsgi_app())
self.assertEqual(res.status_int, 200)
res_dict = json.loads(res.body)
for i, s in enumerate(res_dict['servers']):
@ -1933,7 +1936,7 @@ class ServersTest(test.TestCase):
return [stub_instance(i, 'fake', 'fake', None, None, i % 2)
for i in xrange(5)]
self.stubs.Set(nova.db.api, 'instance_get_all_by_project',
self.stubs.Set(nova.db.api, 'instance_get_all_by_filters',
return_servers_with_host)
req = webob.Request.blank('/v1.0/servers/detail')