test fixes and typos
This commit is contained in:
parent
b9ecf86976
commit
b1b919d42d
|
@ -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.
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -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')
|
||||
|
|
Loading…
Reference in New Issue