merged i8n and fixed conflicts
This commit is contained in:
1
.mailmap
1
.mailmap
@@ -19,6 +19,7 @@
|
|||||||
<mordred@inaugust.com> <mordred@hudson>
|
<mordred@inaugust.com> <mordred@hudson>
|
||||||
<paul@openstack.org> <pvoccio@castor.local>
|
<paul@openstack.org> <pvoccio@castor.local>
|
||||||
<paul@openstack.org> <paul.voccio@rackspace.com>
|
<paul@openstack.org> <paul.voccio@rackspace.com>
|
||||||
|
<soren.hansen@rackspace.com> <soren@linux2go.dk>
|
||||||
<todd@ansolabs.com> <todd@lapex>
|
<todd@ansolabs.com> <todd@lapex>
|
||||||
<todd@ansolabs.com> <todd@rubidine.com>
|
<todd@ansolabs.com> <todd@rubidine.com>
|
||||||
<vishvananda@gmail.com> <vishvananda@yahoo.com>
|
<vishvananda@gmail.com> <vishvananda@yahoo.com>
|
||||||
|
|||||||
2
Authors
2
Authors
@@ -6,6 +6,7 @@ Chris Behrens <cbehrens@codestud.com>
|
|||||||
Chmouel Boudjnah <chmouel@chmouel.com>
|
Chmouel Boudjnah <chmouel@chmouel.com>
|
||||||
Dean Troyer <dtroyer@gmail.com>
|
Dean Troyer <dtroyer@gmail.com>
|
||||||
Devin Carlen <devin.carlen@gmail.com>
|
Devin Carlen <devin.carlen@gmail.com>
|
||||||
|
Ed Leafe <ed@leafe.com>
|
||||||
Eldar Nugaev <enugaev@griddynamics.com>
|
Eldar Nugaev <enugaev@griddynamics.com>
|
||||||
Eric Day <eday@oddments.org>
|
Eric Day <eday@oddments.org>
|
||||||
Ewan Mellor <ewan.mellor@citrix.com>
|
Ewan Mellor <ewan.mellor@citrix.com>
|
||||||
@@ -14,6 +15,7 @@ Jay Pipes <jaypipes@gmail.com>
|
|||||||
Jesse Andrews <anotherjesse@gmail.com>
|
Jesse Andrews <anotherjesse@gmail.com>
|
||||||
Joe Heck <heckj@mac.com>
|
Joe Heck <heckj@mac.com>
|
||||||
Joel Moore <joelbm24@gmail.com>
|
Joel Moore <joelbm24@gmail.com>
|
||||||
|
Jonathan Bryce <jbryce@jbryce.com>
|
||||||
Josh Kearney <josh.kearney@rackspace.com>
|
Josh Kearney <josh.kearney@rackspace.com>
|
||||||
Joshua McKenty <jmckenty@gmail.com>
|
Joshua McKenty <jmckenty@gmail.com>
|
||||||
Justin Santa Barbara <justin@fathomdb.com>
|
Justin Santa Barbara <justin@fathomdb.com>
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ include nova/cloudpipe/client.ovpn.template
|
|||||||
include nova/compute/fakevirtinstance.xml
|
include nova/compute/fakevirtinstance.xml
|
||||||
include nova/compute/interfaces.template
|
include nova/compute/interfaces.template
|
||||||
include nova/virt/interfaces.template
|
include nova/virt/interfaces.template
|
||||||
include nova/virt/libvirt.*.xml.template
|
include nova/virt/libvirt*.xml.template
|
||||||
include nova/tests/CA/
|
include nova/tests/CA/
|
||||||
include nova/tests/CA/cacert.pem
|
include nova/tests/CA/cacert.pem
|
||||||
include nova/tests/CA/private/
|
include nova/tests/CA/private/
|
||||||
|
|||||||
@@ -194,6 +194,7 @@ class HostInfo(object):
|
|||||||
|
|
||||||
|
|
||||||
class NovaAdminClient(object):
|
class NovaAdminClient(object):
|
||||||
|
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
clc_url=DEFAULT_CLC_URL,
|
clc_url=DEFAULT_CLC_URL,
|
||||||
|
|||||||
@@ -37,7 +37,6 @@ class DbDriver(object):
|
|||||||
def __init__(self):
|
def __init__(self):
|
||||||
"""Imports the LDAP module"""
|
"""Imports the LDAP module"""
|
||||||
pass
|
pass
|
||||||
db
|
|
||||||
|
|
||||||
def __enter__(self):
|
def __enter__(self):
|
||||||
return self
|
return self
|
||||||
@@ -83,7 +82,7 @@ class DbDriver(object):
|
|||||||
user_ref = db.user_create(context.get_admin_context(), values)
|
user_ref = db.user_create(context.get_admin_context(), values)
|
||||||
return self._db_user_to_auth_user(user_ref)
|
return self._db_user_to_auth_user(user_ref)
|
||||||
except exception.Duplicate, e:
|
except exception.Duplicate, e:
|
||||||
raise exception.Duplicate('User %s already exists' % name)
|
raise exception.Duplicate(_('User %s already exists') % name)
|
||||||
|
|
||||||
def _db_user_to_auth_user(self, user_ref):
|
def _db_user_to_auth_user(self, user_ref):
|
||||||
return {'id': user_ref['id'],
|
return {'id': user_ref['id'],
|
||||||
@@ -105,8 +104,9 @@ class DbDriver(object):
|
|||||||
"""Create a project"""
|
"""Create a project"""
|
||||||
manager = db.user_get(context.get_admin_context(), manager_uid)
|
manager = db.user_get(context.get_admin_context(), manager_uid)
|
||||||
if not manager:
|
if not manager:
|
||||||
raise exception.NotFound("Project can't be created because "
|
raise exception.NotFound(_("Project can't be created because "
|
||||||
"manager %s doesn't exist" % manager_uid)
|
"manager %s doesn't exist")
|
||||||
|
% manager_uid)
|
||||||
|
|
||||||
# description is a required attribute
|
# description is a required attribute
|
||||||
if description is None:
|
if description is None:
|
||||||
@@ -133,8 +133,8 @@ class DbDriver(object):
|
|||||||
try:
|
try:
|
||||||
project = db.project_create(context.get_admin_context(), values)
|
project = db.project_create(context.get_admin_context(), values)
|
||||||
except exception.Duplicate:
|
except exception.Duplicate:
|
||||||
raise exception.Duplicate("Project can't be created because "
|
raise exception.Duplicate(_("Project can't be created because "
|
||||||
"project %s already exists" % name)
|
"project %s already exists") % name)
|
||||||
|
|
||||||
for member in members:
|
for member in members:
|
||||||
db.project_add_member(context.get_admin_context(),
|
db.project_add_member(context.get_admin_context(),
|
||||||
@@ -155,8 +155,8 @@ class DbDriver(object):
|
|||||||
if manager_uid:
|
if manager_uid:
|
||||||
manager = db.user_get(context.get_admin_context(), manager_uid)
|
manager = db.user_get(context.get_admin_context(), manager_uid)
|
||||||
if not manager:
|
if not manager:
|
||||||
raise exception.NotFound("Project can't be modified because "
|
raise exception.NotFound(_("Project can't be modified because "
|
||||||
"manager %s doesn't exist" %
|
"manager %s doesn't exist") %
|
||||||
manager_uid)
|
manager_uid)
|
||||||
values['project_manager'] = manager['id']
|
values['project_manager'] = manager['id']
|
||||||
if description:
|
if description:
|
||||||
@@ -243,8 +243,8 @@ class DbDriver(object):
|
|||||||
def _validate_user_and_project(self, user_id, project_id):
|
def _validate_user_and_project(self, user_id, project_id):
|
||||||
user = db.user_get(context.get_admin_context(), user_id)
|
user = db.user_get(context.get_admin_context(), user_id)
|
||||||
if not user:
|
if not user:
|
||||||
raise exception.NotFound('User "%s" not found' % user_id)
|
raise exception.NotFound(_('User "%s" not found') % user_id)
|
||||||
project = db.project_get(context.get_admin_context(), project_id)
|
project = db.project_get(context.get_admin_context(), project_id)
|
||||||
if not project:
|
if not project:
|
||||||
raise exception.NotFound('Project "%s" not found' % project_id)
|
raise exception.NotFound(_('Project "%s" not found') % project_id)
|
||||||
return user, project
|
return user, project
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
"""Fake LDAP server for test harness, backs to ReDIS.
|
"""Fake LDAP server for test harness.
|
||||||
|
|
||||||
This class does very little error checking, and knows nothing about ldap
|
This class does very little error checking, and knows nothing about ldap
|
||||||
class definitions. It implements the minimum emulation of the python ldap
|
class definitions. It implements the minimum emulation of the python ldap
|
||||||
@@ -23,34 +23,65 @@ library to work with nova.
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
import fnmatch
|
||||||
import json
|
import json
|
||||||
import redis
|
|
||||||
|
|
||||||
from nova import flags
|
|
||||||
|
|
||||||
FLAGS = flags.FLAGS
|
|
||||||
flags.DEFINE_string('redis_host', '127.0.0.1',
|
|
||||||
'Host that redis is running on.')
|
|
||||||
flags.DEFINE_integer('redis_port', 6379,
|
|
||||||
'Port that redis is running on.')
|
|
||||||
flags.DEFINE_integer('redis_db', 0, 'Multiple DB keeps tests away')
|
|
||||||
|
|
||||||
|
|
||||||
class Redis(object):
|
class Store(object):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
if hasattr(self.__class__, '_instance'):
|
if hasattr(self.__class__, '_instance'):
|
||||||
raise Exception('Attempted to instantiate singleton')
|
raise Exception(_('Attempted to instantiate singleton'))
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def instance(cls):
|
def instance(cls):
|
||||||
if not hasattr(cls, '_instance'):
|
if not hasattr(cls, '_instance'):
|
||||||
inst = redis.Redis(host=FLAGS.redis_host,
|
cls._instance = _StorageDict()
|
||||||
port=FLAGS.redis_port,
|
|
||||||
db=FLAGS.redis_db)
|
|
||||||
cls._instance = inst
|
|
||||||
return cls._instance
|
return cls._instance
|
||||||
|
|
||||||
|
|
||||||
|
class _StorageDict(dict):
|
||||||
|
def keys(self, pat=None):
|
||||||
|
ret = super(_StorageDict, self).keys()
|
||||||
|
if pat is not None:
|
||||||
|
ret = fnmatch.filter(ret, pat)
|
||||||
|
return ret
|
||||||
|
|
||||||
|
def delete(self, key):
|
||||||
|
try:
|
||||||
|
del self[key]
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
def flushdb(self):
|
||||||
|
self.clear()
|
||||||
|
|
||||||
|
def hgetall(self, key):
|
||||||
|
"""Returns the hash for the given key; creates
|
||||||
|
the hash if the key doesn't exist."""
|
||||||
|
try:
|
||||||
|
return self[key]
|
||||||
|
except KeyError:
|
||||||
|
self[key] = {}
|
||||||
|
return self[key]
|
||||||
|
|
||||||
|
def hget(self, key, field):
|
||||||
|
hashdict = self.hgetall(key)
|
||||||
|
try:
|
||||||
|
return hashdict[field]
|
||||||
|
except KeyError:
|
||||||
|
hashdict[field] = {}
|
||||||
|
return hashdict[field]
|
||||||
|
|
||||||
|
def hset(self, key, field, val):
|
||||||
|
hashdict = self.hgetall(key)
|
||||||
|
hashdict[field] = val
|
||||||
|
|
||||||
|
def hmset(self, key, value_dict):
|
||||||
|
hashdict = self.hgetall(key)
|
||||||
|
for field, val in value_dict.items():
|
||||||
|
hashdict[field] = val
|
||||||
|
|
||||||
|
|
||||||
SCOPE_BASE = 0
|
SCOPE_BASE = 0
|
||||||
SCOPE_ONELEVEL = 1 # Not implemented
|
SCOPE_ONELEVEL = 1 # Not implemented
|
||||||
SCOPE_SUBTREE = 2
|
SCOPE_SUBTREE = 2
|
||||||
@@ -169,8 +200,6 @@ def _to_json(unencoded):
|
|||||||
|
|
||||||
|
|
||||||
class FakeLDAP(object):
|
class FakeLDAP(object):
|
||||||
#TODO(vish): refactor this class to use a wrapper instead of accessing
|
|
||||||
# redis directly
|
|
||||||
"""Fake LDAP connection."""
|
"""Fake LDAP connection."""
|
||||||
|
|
||||||
def simple_bind_s(self, dn, password):
|
def simple_bind_s(self, dn, password):
|
||||||
@@ -183,14 +212,13 @@ class FakeLDAP(object):
|
|||||||
|
|
||||||
def add_s(self, dn, attr):
|
def add_s(self, dn, attr):
|
||||||
"""Add an object with the specified attributes at dn."""
|
"""Add an object with the specified attributes at dn."""
|
||||||
key = "%s%s" % (self.__redis_prefix, dn)
|
key = "%s%s" % (self.__prefix, dn)
|
||||||
|
|
||||||
value_dict = dict([(k, _to_json(v)) for k, v in attr])
|
value_dict = dict([(k, _to_json(v)) for k, v in attr])
|
||||||
Redis.instance().hmset(key, value_dict)
|
Store.instance().hmset(key, value_dict)
|
||||||
|
|
||||||
def delete_s(self, dn):
|
def delete_s(self, dn):
|
||||||
"""Remove the ldap object at specified dn."""
|
"""Remove the ldap object at specified dn."""
|
||||||
Redis.instance().delete("%s%s" % (self.__redis_prefix, dn))
|
Store.instance().delete("%s%s" % (self.__prefix, dn))
|
||||||
|
|
||||||
def modify_s(self, dn, attrs):
|
def modify_s(self, dn, attrs):
|
||||||
"""Modify the object at dn using the attribute list.
|
"""Modify the object at dn using the attribute list.
|
||||||
@@ -201,18 +229,18 @@ class FakeLDAP(object):
|
|||||||
([MOD_ADD | MOD_DELETE | MOD_REPACE], attribute, value)
|
([MOD_ADD | MOD_DELETE | MOD_REPACE], attribute, value)
|
||||||
|
|
||||||
"""
|
"""
|
||||||
redis = Redis.instance()
|
store = Store.instance()
|
||||||
key = "%s%s" % (self.__redis_prefix, dn)
|
key = "%s%s" % (self.__prefix, dn)
|
||||||
|
|
||||||
for cmd, k, v in attrs:
|
for cmd, k, v in attrs:
|
||||||
values = _from_json(redis.hget(key, k))
|
values = _from_json(store.hget(key, k))
|
||||||
if cmd == MOD_ADD:
|
if cmd == MOD_ADD:
|
||||||
values.append(v)
|
values.append(v)
|
||||||
elif cmd == MOD_REPLACE:
|
elif cmd == MOD_REPLACE:
|
||||||
values = [v]
|
values = [v]
|
||||||
else:
|
else:
|
||||||
values.remove(v)
|
values.remove(v)
|
||||||
values = redis.hset(key, k, _to_json(values))
|
values = store.hset(key, k, _to_json(values))
|
||||||
|
|
||||||
def search_s(self, dn, scope, query=None, fields=None):
|
def search_s(self, dn, scope, query=None, fields=None):
|
||||||
"""Search for all matching objects under dn using the query.
|
"""Search for all matching objects under dn using the query.
|
||||||
@@ -226,16 +254,17 @@ class FakeLDAP(object):
|
|||||||
"""
|
"""
|
||||||
if scope != SCOPE_BASE and scope != SCOPE_SUBTREE:
|
if scope != SCOPE_BASE and scope != SCOPE_SUBTREE:
|
||||||
raise NotImplementedError(str(scope))
|
raise NotImplementedError(str(scope))
|
||||||
redis = Redis.instance()
|
store = Store.instance()
|
||||||
if scope == SCOPE_BASE:
|
if scope == SCOPE_BASE:
|
||||||
keys = ["%s%s" % (self.__redis_prefix, dn)]
|
keys = ["%s%s" % (self.__prefix, dn)]
|
||||||
else:
|
else:
|
||||||
keys = redis.keys("%s*%s" % (self.__redis_prefix, dn))
|
keys = store.keys("%s*%s" % (self.__prefix, dn))
|
||||||
|
|
||||||
objects = []
|
objects = []
|
||||||
for key in keys:
|
for key in keys:
|
||||||
# get the attributes from redis
|
# get the attributes from the store
|
||||||
attrs = redis.hgetall(key)
|
attrs = store.hgetall(key)
|
||||||
# turn the values from redis into lists
|
# turn the values from the store into lists
|
||||||
# pylint: disable-msg=E1103
|
# pylint: disable-msg=E1103
|
||||||
attrs = dict([(k, _from_json(v))
|
attrs = dict([(k, _from_json(v))
|
||||||
for k, v in attrs.iteritems()])
|
for k, v in attrs.iteritems()])
|
||||||
@@ -244,13 +273,13 @@ class FakeLDAP(object):
|
|||||||
# filter the attributes by fields
|
# filter the attributes by fields
|
||||||
attrs = dict([(k, v) for k, v in attrs.iteritems()
|
attrs = dict([(k, v) for k, v in attrs.iteritems()
|
||||||
if not fields or k in fields])
|
if not fields or k in fields])
|
||||||
objects.append((key[len(self.__redis_prefix):], attrs))
|
objects.append((key[len(self.__prefix):], attrs))
|
||||||
# pylint: enable-msg=E1103
|
# pylint: enable-msg=E1103
|
||||||
if objects == []:
|
if objects == []:
|
||||||
raise NO_SUCH_OBJECT()
|
raise NO_SUCH_OBJECT()
|
||||||
return objects
|
return objects
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def __redis_prefix(self): # pylint: disable-msg=R0201
|
def __prefix(self): # pylint: disable-msg=R0201
|
||||||
"""Get the prefix to use for all redis keys."""
|
"""Get the prefix to use for all keys."""
|
||||||
return 'ldap:'
|
return 'ldap:'
|
||||||
|
|||||||
@@ -159,7 +159,7 @@ class LdapDriver(object):
|
|||||||
self.conn.modify_s(self.__uid_to_dn(name), attr)
|
self.conn.modify_s(self.__uid_to_dn(name), attr)
|
||||||
return self.get_user(name)
|
return self.get_user(name)
|
||||||
else:
|
else:
|
||||||
raise exception.NotFound("LDAP object for %s doesn't exist"
|
raise exception.NotFound(_("LDAP object for %s doesn't exist")
|
||||||
% name)
|
% name)
|
||||||
else:
|
else:
|
||||||
attr = [
|
attr = [
|
||||||
@@ -182,11 +182,12 @@ class LdapDriver(object):
|
|||||||
description=None, member_uids=None):
|
description=None, member_uids=None):
|
||||||
"""Create a project"""
|
"""Create a project"""
|
||||||
if self.__project_exists(name):
|
if self.__project_exists(name):
|
||||||
raise exception.Duplicate("Project can't be created because "
|
raise exception.Duplicate(_("Project can't be created because "
|
||||||
"project %s already exists" % name)
|
"project %s already exists") % name)
|
||||||
if not self.__user_exists(manager_uid):
|
if not self.__user_exists(manager_uid):
|
||||||
raise exception.NotFound("Project can't be created because "
|
raise exception.NotFound(_("Project can't be created because "
|
||||||
"manager %s doesn't exist" % manager_uid)
|
"manager %s doesn't exist")
|
||||||
|
% manager_uid)
|
||||||
manager_dn = self.__uid_to_dn(manager_uid)
|
manager_dn = self.__uid_to_dn(manager_uid)
|
||||||
# description is a required attribute
|
# description is a required attribute
|
||||||
if description is None:
|
if description is None:
|
||||||
@@ -195,8 +196,8 @@ class LdapDriver(object):
|
|||||||
if member_uids is not None:
|
if member_uids is not None:
|
||||||
for member_uid in member_uids:
|
for member_uid in member_uids:
|
||||||
if not self.__user_exists(member_uid):
|
if not self.__user_exists(member_uid):
|
||||||
raise exception.NotFound("Project can't be created "
|
raise exception.NotFound(_("Project can't be created "
|
||||||
"because user %s doesn't exist"
|
"because user %s doesn't exist")
|
||||||
% member_uid)
|
% member_uid)
|
||||||
members.append(self.__uid_to_dn(member_uid))
|
members.append(self.__uid_to_dn(member_uid))
|
||||||
# always add the manager as a member because members is required
|
# always add the manager as a member because members is required
|
||||||
@@ -218,9 +219,9 @@ class LdapDriver(object):
|
|||||||
attr = []
|
attr = []
|
||||||
if manager_uid:
|
if manager_uid:
|
||||||
if not self.__user_exists(manager_uid):
|
if not self.__user_exists(manager_uid):
|
||||||
raise exception.NotFound("Project can't be modified because "
|
raise exception.NotFound(_("Project can't be modified because "
|
||||||
"manager %s doesn't exist" %
|
"manager %s doesn't exist")
|
||||||
manager_uid)
|
% manager_uid)
|
||||||
manager_dn = self.__uid_to_dn(manager_uid)
|
manager_dn = self.__uid_to_dn(manager_uid)
|
||||||
attr.append((self.ldap.MOD_REPLACE, 'projectManager', manager_dn))
|
attr.append((self.ldap.MOD_REPLACE, 'projectManager', manager_dn))
|
||||||
if description:
|
if description:
|
||||||
@@ -416,8 +417,9 @@ class LdapDriver(object):
|
|||||||
if member_uids is not None:
|
if member_uids is not None:
|
||||||
for member_uid in member_uids:
|
for member_uid in member_uids:
|
||||||
if not self.__user_exists(member_uid):
|
if not self.__user_exists(member_uid):
|
||||||
raise exception.NotFound("Group can't be created "
|
raise exception.NotFound(_("Group can't be created "
|
||||||
"because user %s doesn't exist" % member_uid)
|
"because user %s doesn't exist")
|
||||||
|
% member_uid)
|
||||||
members.append(self.__uid_to_dn(member_uid))
|
members.append(self.__uid_to_dn(member_uid))
|
||||||
dn = self.__uid_to_dn(uid)
|
dn = self.__uid_to_dn(uid)
|
||||||
if not dn in members:
|
if not dn in members:
|
||||||
@@ -432,8 +434,9 @@ class LdapDriver(object):
|
|||||||
def __is_in_group(self, uid, group_dn):
|
def __is_in_group(self, uid, group_dn):
|
||||||
"""Check if user is in group"""
|
"""Check if user is in group"""
|
||||||
if not self.__user_exists(uid):
|
if not self.__user_exists(uid):
|
||||||
raise exception.NotFound("User %s can't be searched in group "
|
raise exception.NotFound(_("User %s can't be searched in group "
|
||||||
"becuase the user doesn't exist" % (uid,))
|
"because the user doesn't exist")
|
||||||
|
% uid)
|
||||||
if not self.__group_exists(group_dn):
|
if not self.__group_exists(group_dn):
|
||||||
return False
|
return False
|
||||||
res = self.__find_object(group_dn,
|
res = self.__find_object(group_dn,
|
||||||
@@ -444,28 +447,30 @@ class LdapDriver(object):
|
|||||||
def __add_to_group(self, uid, group_dn):
|
def __add_to_group(self, uid, group_dn):
|
||||||
"""Add user to group"""
|
"""Add user to group"""
|
||||||
if not self.__user_exists(uid):
|
if not self.__user_exists(uid):
|
||||||
raise exception.NotFound("User %s can't be added to the group "
|
raise exception.NotFound(_("User %s can't be added to the group "
|
||||||
"becuase the user doesn't exist" % (uid,))
|
"because the user doesn't exist")
|
||||||
|
% uid)
|
||||||
if not self.__group_exists(group_dn):
|
if not self.__group_exists(group_dn):
|
||||||
raise exception.NotFound("The group at dn %s doesn't exist" %
|
raise exception.NotFound(_("The group at dn %s doesn't exist")
|
||||||
(group_dn,))
|
% group_dn)
|
||||||
if self.__is_in_group(uid, group_dn):
|
if self.__is_in_group(uid, group_dn):
|
||||||
raise exception.Duplicate("User %s is already a member of "
|
raise exception.Duplicate(_("User %s is already a member of "
|
||||||
"the group %s" % (uid, group_dn))
|
"the group %s") % (uid, group_dn))
|
||||||
attr = [(self.ldap.MOD_ADD, 'member', self.__uid_to_dn(uid))]
|
attr = [(self.ldap.MOD_ADD, 'member', self.__uid_to_dn(uid))]
|
||||||
self.conn.modify_s(group_dn, attr)
|
self.conn.modify_s(group_dn, attr)
|
||||||
|
|
||||||
def __remove_from_group(self, uid, group_dn):
|
def __remove_from_group(self, uid, group_dn):
|
||||||
"""Remove user from group"""
|
"""Remove user from group"""
|
||||||
if not self.__group_exists(group_dn):
|
if not self.__group_exists(group_dn):
|
||||||
raise exception.NotFound("The group at dn %s doesn't exist" %
|
raise exception.NotFound(_("The group at dn %s doesn't exist")
|
||||||
(group_dn,))
|
% group_dn)
|
||||||
if not self.__user_exists(uid):
|
if not self.__user_exists(uid):
|
||||||
raise exception.NotFound("User %s can't be removed from the "
|
raise exception.NotFound(_("User %s can't be removed from the "
|
||||||
"group because the user doesn't exist" % (uid,))
|
"group because the user doesn't exist")
|
||||||
|
% uid)
|
||||||
if not self.__is_in_group(uid, group_dn):
|
if not self.__is_in_group(uid, group_dn):
|
||||||
raise exception.NotFound("User %s is not a member of the group" %
|
raise exception.NotFound(_("User %s is not a member of the group")
|
||||||
(uid,))
|
% uid)
|
||||||
# NOTE(vish): remove user from group and any sub_groups
|
# NOTE(vish): remove user from group and any sub_groups
|
||||||
sub_dns = self.__find_group_dns_with_member(
|
sub_dns = self.__find_group_dns_with_member(
|
||||||
group_dn, uid)
|
group_dn, uid)
|
||||||
@@ -479,15 +484,16 @@ class LdapDriver(object):
|
|||||||
try:
|
try:
|
||||||
self.conn.modify_s(group_dn, attr)
|
self.conn.modify_s(group_dn, attr)
|
||||||
except self.ldap.OBJECT_CLASS_VIOLATION:
|
except self.ldap.OBJECT_CLASS_VIOLATION:
|
||||||
logging.debug("Attempted to remove the last member of a group. "
|
logging.debug(_("Attempted to remove the last member of a group. "
|
||||||
"Deleting the group at %s instead.", group_dn)
|
"Deleting the group at %s instead."), group_dn)
|
||||||
self.__delete_group(group_dn)
|
self.__delete_group(group_dn)
|
||||||
|
|
||||||
def __remove_from_all(self, uid):
|
def __remove_from_all(self, uid):
|
||||||
"""Remove user from all roles and projects"""
|
"""Remove user from all roles and projects"""
|
||||||
if not self.__user_exists(uid):
|
if not self.__user_exists(uid):
|
||||||
raise exception.NotFound("User %s can't be removed from all "
|
raise exception.NotFound(_("User %s can't be removed from all "
|
||||||
"because the user doesn't exist" % (uid,))
|
"because the user doesn't exist")
|
||||||
|
% uid)
|
||||||
role_dns = self.__find_group_dns_with_member(
|
role_dns = self.__find_group_dns_with_member(
|
||||||
FLAGS.role_project_subtree, uid)
|
FLAGS.role_project_subtree, uid)
|
||||||
for role_dn in role_dns:
|
for role_dn in role_dns:
|
||||||
@@ -500,7 +506,8 @@ class LdapDriver(object):
|
|||||||
def __delete_group(self, group_dn):
|
def __delete_group(self, group_dn):
|
||||||
"""Delete Group"""
|
"""Delete Group"""
|
||||||
if not self.__group_exists(group_dn):
|
if not self.__group_exists(group_dn):
|
||||||
raise exception.NotFound("Group at dn %s doesn't exist" % group_dn)
|
raise exception.NotFound(_("Group at dn %s doesn't exist")
|
||||||
|
% group_dn)
|
||||||
self.conn.delete_s(group_dn)
|
self.conn.delete_s(group_dn)
|
||||||
|
|
||||||
def __delete_roles(self, project_dn):
|
def __delete_roles(self, project_dn):
|
||||||
|
|||||||
@@ -254,12 +254,12 @@ class AuthManager(object):
|
|||||||
# TODO(vish): check for valid timestamp
|
# TODO(vish): check for valid timestamp
|
||||||
(access_key, _sep, project_id) = access.partition(':')
|
(access_key, _sep, project_id) = access.partition(':')
|
||||||
|
|
||||||
logging.info('Looking up user: %r', access_key)
|
logging.info(_('Looking up user: %r'), access_key)
|
||||||
user = self.get_user_from_access_key(access_key)
|
user = self.get_user_from_access_key(access_key)
|
||||||
logging.info('user: %r', user)
|
logging.info('user: %r', user)
|
||||||
if user == None:
|
if user == None:
|
||||||
raise exception.NotFound('No user found for access key %s' %
|
raise exception.NotFound(_('No user found for access key %s')
|
||||||
access_key)
|
% access_key)
|
||||||
|
|
||||||
# NOTE(vish): if we stop using project name as id we need better
|
# NOTE(vish): if we stop using project name as id we need better
|
||||||
# logic to find a default project for user
|
# logic to find a default project for user
|
||||||
@@ -268,12 +268,12 @@ class AuthManager(object):
|
|||||||
|
|
||||||
project = self.get_project(project_id)
|
project = self.get_project(project_id)
|
||||||
if project == None:
|
if project == None:
|
||||||
raise exception.NotFound('No project called %s could be found' %
|
raise exception.NotFound(_('No project called %s could be found')
|
||||||
project_id)
|
% project_id)
|
||||||
if not self.is_admin(user) and not self.is_project_member(user,
|
if not self.is_admin(user) and not self.is_project_member(user,
|
||||||
project):
|
project):
|
||||||
raise exception.NotFound('User %s is not a member of project %s' %
|
raise exception.NotFound(_('User %s is not a member of project %s')
|
||||||
(user.id, project.id))
|
% (user.id, project.id))
|
||||||
if check_type == 's3':
|
if check_type == 's3':
|
||||||
sign = signer.Signer(user.secret.encode())
|
sign = signer.Signer(user.secret.encode())
|
||||||
expected_signature = sign.s3_authorization(headers, verb, path)
|
expected_signature = sign.s3_authorization(headers, verb, path)
|
||||||
@@ -281,7 +281,7 @@ class AuthManager(object):
|
|||||||
logging.debug('expected_signature: %s', expected_signature)
|
logging.debug('expected_signature: %s', expected_signature)
|
||||||
logging.debug('signature: %s', signature)
|
logging.debug('signature: %s', signature)
|
||||||
if signature != expected_signature:
|
if signature != expected_signature:
|
||||||
raise exception.NotAuthorized('Signature does not match')
|
raise exception.NotAuthorized(_('Signature does not match'))
|
||||||
elif check_type == 'ec2':
|
elif check_type == 'ec2':
|
||||||
# NOTE(vish): hmac can't handle unicode, so encode ensures that
|
# NOTE(vish): hmac can't handle unicode, so encode ensures that
|
||||||
# secret isn't unicode
|
# secret isn't unicode
|
||||||
@@ -291,7 +291,7 @@ class AuthManager(object):
|
|||||||
logging.debug('expected_signature: %s', expected_signature)
|
logging.debug('expected_signature: %s', expected_signature)
|
||||||
logging.debug('signature: %s', signature)
|
logging.debug('signature: %s', signature)
|
||||||
if signature != expected_signature:
|
if signature != expected_signature:
|
||||||
raise exception.NotAuthorized('Signature does not match')
|
raise exception.NotAuthorized(_('Signature does not match'))
|
||||||
return (user, project)
|
return (user, project)
|
||||||
|
|
||||||
def get_access_key(self, user, project):
|
def get_access_key(self, user, project):
|
||||||
@@ -361,7 +361,7 @@ class AuthManager(object):
|
|||||||
with self.driver() as drv:
|
with self.driver() as drv:
|
||||||
if role == 'projectmanager':
|
if role == 'projectmanager':
|
||||||
if not project:
|
if not project:
|
||||||
raise exception.Error("Must specify project")
|
raise exception.Error(_("Must specify project"))
|
||||||
return self.is_project_manager(user, project)
|
return self.is_project_manager(user, project)
|
||||||
|
|
||||||
global_role = drv.has_role(User.safe_id(user),
|
global_role = drv.has_role(User.safe_id(user),
|
||||||
@@ -395,9 +395,9 @@ class AuthManager(object):
|
|||||||
@param project: Project in which to add local role.
|
@param project: Project in which to add local role.
|
||||||
"""
|
"""
|
||||||
if role not in FLAGS.allowed_roles:
|
if role not in FLAGS.allowed_roles:
|
||||||
raise exception.NotFound("The %s role can not be found" % role)
|
raise exception.NotFound(_("The %s role can not be found") % role)
|
||||||
if project is not None and role in FLAGS.global_roles:
|
if project is not None and role in FLAGS.global_roles:
|
||||||
raise exception.NotFound("The %s role is global only" % role)
|
raise exception.NotFound(_("The %s role is global only") % role)
|
||||||
with self.driver() as drv:
|
with self.driver() as drv:
|
||||||
drv.add_role(User.safe_id(user), role, Project.safe_id(project))
|
drv.add_role(User.safe_id(user), role, Project.safe_id(project))
|
||||||
|
|
||||||
@@ -666,7 +666,7 @@ class AuthManager(object):
|
|||||||
port=vpn_port)
|
port=vpn_port)
|
||||||
zippy.writestr(FLAGS.credential_vpn_file, config)
|
zippy.writestr(FLAGS.credential_vpn_file, config)
|
||||||
else:
|
else:
|
||||||
logging.warn("No vpn data for project %s", pid)
|
logging.warn(_("No vpn data for project %s"), pid)
|
||||||
|
|
||||||
zippy.writestr(FLAGS.ca_file, crypto.fetch_ca(pid))
|
zippy.writestr(FLAGS.ca_file, crypto.fetch_ca(pid))
|
||||||
zippy.close()
|
zippy.close()
|
||||||
|
|||||||
@@ -37,12 +37,12 @@ class Exchange(object):
|
|||||||
self._routes = {}
|
self._routes = {}
|
||||||
|
|
||||||
def publish(self, message, routing_key=None):
|
def publish(self, message, routing_key=None):
|
||||||
logging.debug('(%s) publish (key: %s) %s',
|
logging.debug(_('(%s) publish (key: %s) %s'),
|
||||||
self.name, routing_key, message)
|
self.name, routing_key, message)
|
||||||
routing_key = routing_key.split('.')[0]
|
routing_key = routing_key.split('.')[0]
|
||||||
if routing_key in self._routes:
|
if routing_key in self._routes:
|
||||||
for f in self._routes[routing_key]:
|
for f in self._routes[routing_key]:
|
||||||
logging.debug('Publishing to route %s', f)
|
logging.debug(_('Publishing to route %s'), f)
|
||||||
f(message, routing_key=routing_key)
|
f(message, routing_key=routing_key)
|
||||||
|
|
||||||
def bind(self, callback, routing_key):
|
def bind(self, callback, routing_key):
|
||||||
@@ -82,16 +82,16 @@ class Backend(object):
|
|||||||
|
|
||||||
def queue_declare(self, queue, **kwargs):
|
def queue_declare(self, queue, **kwargs):
|
||||||
if queue not in self._queues:
|
if queue not in self._queues:
|
||||||
logging.debug('Declaring queue %s', queue)
|
logging.debug(_('Declaring queue %s'), queue)
|
||||||
self._queues[queue] = Queue(queue)
|
self._queues[queue] = Queue(queue)
|
||||||
|
|
||||||
def exchange_declare(self, exchange, type, *args, **kwargs):
|
def exchange_declare(self, exchange, type, *args, **kwargs):
|
||||||
if exchange not in self._exchanges:
|
if exchange not in self._exchanges:
|
||||||
logging.debug('Declaring exchange %s', exchange)
|
logging.debug(_('Declaring exchange %s'), exchange)
|
||||||
self._exchanges[exchange] = Exchange(exchange, type)
|
self._exchanges[exchange] = Exchange(exchange, type)
|
||||||
|
|
||||||
def queue_bind(self, queue, exchange, routing_key, **kwargs):
|
def queue_bind(self, queue, exchange, routing_key, **kwargs):
|
||||||
logging.debug('Binding %s to %s with key %s',
|
logging.debug(_('Binding %s to %s with key %s'),
|
||||||
queue, exchange, routing_key)
|
queue, exchange, routing_key)
|
||||||
self._exchanges[exchange].bind(self._queues[queue].push,
|
self._exchanges[exchange].bind(self._queues[queue].push,
|
||||||
routing_key)
|
routing_key)
|
||||||
@@ -117,7 +117,7 @@ class Backend(object):
|
|||||||
content_type=content_type,
|
content_type=content_type,
|
||||||
content_encoding=content_encoding)
|
content_encoding=content_encoding)
|
||||||
message.result = True
|
message.result = True
|
||||||
logging.debug('Getting from %s: %s', queue, message)
|
logging.debug(_('Getting from %s: %s'), queue, message)
|
||||||
return message
|
return message
|
||||||
|
|
||||||
def prepare_message(self, message_data, delivery_mode,
|
def prepare_message(self, message_data, delivery_mode,
|
||||||
|
|||||||
@@ -241,12 +241,11 @@ DEFINE_string('ec2_suffix', '/services/Cloud', 'suffix for ec2')
|
|||||||
|
|
||||||
DEFINE_string('default_image', 'ami-11111',
|
DEFINE_string('default_image', 'ami-11111',
|
||||||
'default image to use, testing only')
|
'default image to use, testing only')
|
||||||
DEFINE_string('default_kernel', 'aki-11111',
|
|
||||||
'default kernel to use, testing only')
|
|
||||||
DEFINE_string('default_ramdisk', 'ari-11111',
|
|
||||||
'default ramdisk to use, testing only')
|
|
||||||
DEFINE_string('default_instance_type', 'm1.small',
|
DEFINE_string('default_instance_type', 'm1.small',
|
||||||
'default instance type to use, testing only')
|
'default instance type to use, testing only')
|
||||||
|
DEFINE_string('null_kernel', 'nokernel',
|
||||||
|
'kernel image that indicates not to use a kernel,'
|
||||||
|
' but to use a raw disk image instead')
|
||||||
|
|
||||||
DEFINE_string('vpn_image_id', 'ami-cloudpipe', 'AMI for cloudpipe vpn server')
|
DEFINE_string('vpn_image_id', 'ami-cloudpipe', 'AMI for cloudpipe vpn server')
|
||||||
DEFINE_string('vpn_key_suffix',
|
DEFINE_string('vpn_key_suffix',
|
||||||
|
|||||||
34
nova/rpc.py
34
nova/rpc.py
@@ -91,15 +91,15 @@ class Consumer(messaging.Consumer):
|
|||||||
self.failed_connection = False
|
self.failed_connection = False
|
||||||
break
|
break
|
||||||
except: # Catching all because carrot sucks
|
except: # Catching all because carrot sucks
|
||||||
logging.exception("AMQP server on %s:%d is unreachable." \
|
logging.exception(_("AMQP server on %s:%d is unreachable."
|
||||||
" Trying again in %d seconds." % (
|
" Trying again in %d seconds.") % (
|
||||||
FLAGS.rabbit_host,
|
FLAGS.rabbit_host,
|
||||||
FLAGS.rabbit_port,
|
FLAGS.rabbit_port,
|
||||||
FLAGS.rabbit_retry_interval))
|
FLAGS.rabbit_retry_interval))
|
||||||
self.failed_connection = True
|
self.failed_connection = True
|
||||||
if self.failed_connection:
|
if self.failed_connection:
|
||||||
logging.exception("Unable to connect to AMQP server" \
|
logging.exception(_("Unable to connect to AMQP server"
|
||||||
" after %d tries. Shutting down." % FLAGS.rabbit_max_retries)
|
" after %d tries. Shutting down.") % FLAGS.rabbit_max_retries)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
def fetch(self, no_ack=None, auto_ack=None, enable_callbacks=False):
|
def fetch(self, no_ack=None, auto_ack=None, enable_callbacks=False):
|
||||||
@@ -116,14 +116,14 @@ class Consumer(messaging.Consumer):
|
|||||||
self.declare()
|
self.declare()
|
||||||
super(Consumer, self).fetch(no_ack, auto_ack, enable_callbacks)
|
super(Consumer, self).fetch(no_ack, auto_ack, enable_callbacks)
|
||||||
if self.failed_connection:
|
if self.failed_connection:
|
||||||
logging.error("Reconnected to queue")
|
logging.error(_("Reconnected to queue"))
|
||||||
self.failed_connection = False
|
self.failed_connection = False
|
||||||
# NOTE(vish): This is catching all errors because we really don't
|
# NOTE(vish): This is catching all errors because we really don't
|
||||||
# exceptions to be logged 10 times a second if some
|
# exceptions to be logged 10 times a second if some
|
||||||
# persistent failure occurs.
|
# persistent failure occurs.
|
||||||
except Exception: # pylint: disable-msg=W0703
|
except Exception: # pylint: disable-msg=W0703
|
||||||
if not self.failed_connection:
|
if not self.failed_connection:
|
||||||
logging.exception("Failed to fetch message from queue")
|
logging.exception(_("Failed to fetch message from queue"))
|
||||||
self.failed_connection = True
|
self.failed_connection = True
|
||||||
|
|
||||||
def attach_to_eventlet(self):
|
def attach_to_eventlet(self):
|
||||||
@@ -153,7 +153,7 @@ class TopicConsumer(Consumer):
|
|||||||
class AdapterConsumer(TopicConsumer):
|
class AdapterConsumer(TopicConsumer):
|
||||||
"""Calls methods on a proxy object based on method and args"""
|
"""Calls methods on a proxy object based on method and args"""
|
||||||
def __init__(self, connection=None, topic="broadcast", proxy=None):
|
def __init__(self, connection=None, topic="broadcast", proxy=None):
|
||||||
LOG.debug('Initing the Adapter Consumer for %s' % (topic))
|
LOG.debug(_('Initing the Adapter Consumer for %s') % (topic))
|
||||||
self.proxy = proxy
|
self.proxy = proxy
|
||||||
super(AdapterConsumer, self).__init__(connection=connection,
|
super(AdapterConsumer, self).__init__(connection=connection,
|
||||||
topic=topic)
|
topic=topic)
|
||||||
@@ -168,7 +168,7 @@ class AdapterConsumer(TopicConsumer):
|
|||||||
|
|
||||||
Example: {'method': 'echo', 'args': {'value': 42}}
|
Example: {'method': 'echo', 'args': {'value': 42}}
|
||||||
"""
|
"""
|
||||||
LOG.debug('received %s' % (message_data))
|
LOG.debug(_('received %s') % (message_data))
|
||||||
msg_id = message_data.pop('_msg_id', None)
|
msg_id = message_data.pop('_msg_id', None)
|
||||||
|
|
||||||
ctxt = _unpack_context(message_data)
|
ctxt = _unpack_context(message_data)
|
||||||
@@ -181,8 +181,8 @@ class AdapterConsumer(TopicConsumer):
|
|||||||
# messages stay in the queue indefinitely, so for now
|
# messages stay in the queue indefinitely, so for now
|
||||||
# we just log the message and send an error string
|
# we just log the message and send an error string
|
||||||
# back to the caller
|
# back to the caller
|
||||||
LOG.warn('no method for message: %s' % (message_data))
|
LOG.warn(_('no method for message: %s') % (message_data))
|
||||||
msg_reply(msg_id, 'No method for message: %s' % message_data)
|
msg_reply(msg_id, _('No method for message: %s') % message_data)
|
||||||
return
|
return
|
||||||
|
|
||||||
node_func = getattr(self.proxy, str(method))
|
node_func = getattr(self.proxy, str(method))
|
||||||
@@ -242,7 +242,7 @@ def msg_reply(msg_id, reply=None, failure=None):
|
|||||||
if failure:
|
if failure:
|
||||||
message = str(failure[1])
|
message = str(failure[1])
|
||||||
tb = traceback.format_exception(*failure)
|
tb = traceback.format_exception(*failure)
|
||||||
logging.error("Returning exception %s to caller", message)
|
logging.error(_("Returning exception %s to caller"), message)
|
||||||
logging.error(tb)
|
logging.error(tb)
|
||||||
failure = (failure[0].__name__, str(failure[1]), tb)
|
failure = (failure[0].__name__, str(failure[1]), tb)
|
||||||
conn = Connection.instance()
|
conn = Connection.instance()
|
||||||
@@ -283,7 +283,7 @@ def _unpack_context(msg):
|
|||||||
if key.startswith('_context_'):
|
if key.startswith('_context_'):
|
||||||
value = msg.pop(key)
|
value = msg.pop(key)
|
||||||
context_dict[key[9:]] = value
|
context_dict[key[9:]] = value
|
||||||
LOG.debug('unpacked context: %s', context_dict)
|
LOG.debug(_('unpacked context: %s'), context_dict)
|
||||||
return context.RequestContext.from_dict(context_dict)
|
return context.RequestContext.from_dict(context_dict)
|
||||||
|
|
||||||
|
|
||||||
@@ -302,10 +302,10 @@ def _pack_context(msg, context):
|
|||||||
|
|
||||||
def call(context, topic, msg):
|
def call(context, topic, msg):
|
||||||
"""Sends a message on a topic and wait for a response"""
|
"""Sends a message on a topic and wait for a response"""
|
||||||
LOG.debug("Making asynchronous call...")
|
LOG.debug(_("Making asynchronous call..."))
|
||||||
msg_id = uuid.uuid4().hex
|
msg_id = uuid.uuid4().hex
|
||||||
msg.update({'_msg_id': msg_id})
|
msg.update({'_msg_id': msg_id})
|
||||||
LOG.debug("MSG_ID is %s" % (msg_id))
|
LOG.debug(_("MSG_ID is %s") % (msg_id))
|
||||||
_pack_context(msg, context)
|
_pack_context(msg, context)
|
||||||
|
|
||||||
class WaitMessage(object):
|
class WaitMessage(object):
|
||||||
@@ -353,7 +353,7 @@ def cast(context, topic, msg):
|
|||||||
|
|
||||||
def generic_response(message_data, message):
|
def generic_response(message_data, message):
|
||||||
"""Logs a result and exits"""
|
"""Logs a result and exits"""
|
||||||
LOG.debug('response %s', message_data)
|
LOG.debug(_('response %s'), message_data)
|
||||||
message.ack()
|
message.ack()
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
|
||||||
@@ -362,8 +362,8 @@ def send_message(topic, message, wait=True):
|
|||||||
"""Sends a message for testing"""
|
"""Sends a message for testing"""
|
||||||
msg_id = uuid.uuid4().hex
|
msg_id = uuid.uuid4().hex
|
||||||
message.update({'_msg_id': msg_id})
|
message.update({'_msg_id': msg_id})
|
||||||
LOG.debug('topic is %s', topic)
|
LOG.debug(_('topic is %s'), topic)
|
||||||
LOG.debug('message %s', message)
|
LOG.debug(_('message %s'), message)
|
||||||
|
|
||||||
if wait:
|
if wait:
|
||||||
consumer = messaging.Consumer(connection=Connection.instance(),
|
consumer = messaging.Consumer(connection=Connection.instance(),
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ class SimpleScheduler(chance.ChanceScheduler):
|
|||||||
for result in results:
|
for result in results:
|
||||||
(service, instance_cores) = result
|
(service, instance_cores) = result
|
||||||
if instance_cores + instance_ref['vcpus'] > FLAGS.max_cores:
|
if instance_cores + instance_ref['vcpus'] > FLAGS.max_cores:
|
||||||
raise driver.NoValidHost("All hosts have too many cores")
|
raise driver.NoValidHost(_("All hosts have too many cores"))
|
||||||
if self.service_is_up(service):
|
if self.service_is_up(service):
|
||||||
# NOTE(vish): this probably belongs in the manager, if we
|
# NOTE(vish): this probably belongs in the manager, if we
|
||||||
# can generalize this somehow
|
# can generalize this somehow
|
||||||
@@ -57,7 +57,7 @@ class SimpleScheduler(chance.ChanceScheduler):
|
|||||||
{'host': service['host'],
|
{'host': service['host'],
|
||||||
'scheduled_at': now})
|
'scheduled_at': now})
|
||||||
return service['host']
|
return service['host']
|
||||||
raise driver.NoValidHost("No hosts found")
|
raise driver.NoValidHost(_("No hosts found"))
|
||||||
|
|
||||||
def schedule_create_volume(self, context, volume_id, *_args, **_kwargs):
|
def schedule_create_volume(self, context, volume_id, *_args, **_kwargs):
|
||||||
"""Picks a host that is up and has the fewest volumes."""
|
"""Picks a host that is up and has the fewest volumes."""
|
||||||
@@ -66,7 +66,8 @@ class SimpleScheduler(chance.ChanceScheduler):
|
|||||||
for result in results:
|
for result in results:
|
||||||
(service, volume_gigabytes) = result
|
(service, volume_gigabytes) = result
|
||||||
if volume_gigabytes + volume_ref['size'] > FLAGS.max_gigabytes:
|
if volume_gigabytes + volume_ref['size'] > FLAGS.max_gigabytes:
|
||||||
raise driver.NoValidHost("All hosts have too many gigabytes")
|
raise driver.NoValidHost(_("All hosts have too many "
|
||||||
|
"gigabytes"))
|
||||||
if self.service_is_up(service):
|
if self.service_is_up(service):
|
||||||
# NOTE(vish): this probably belongs in the manager, if we
|
# NOTE(vish): this probably belongs in the manager, if we
|
||||||
# can generalize this somehow
|
# can generalize this somehow
|
||||||
@@ -76,7 +77,7 @@ class SimpleScheduler(chance.ChanceScheduler):
|
|||||||
{'host': service['host'],
|
{'host': service['host'],
|
||||||
'scheduled_at': now})
|
'scheduled_at': now})
|
||||||
return service['host']
|
return service['host']
|
||||||
raise driver.NoValidHost("No hosts found")
|
raise driver.NoValidHost(_("No hosts found"))
|
||||||
|
|
||||||
def schedule_set_network_host(self, context, *_args, **_kwargs):
|
def schedule_set_network_host(self, context, *_args, **_kwargs):
|
||||||
"""Picks a host that is up and has the fewest networks."""
|
"""Picks a host that is up and has the fewest networks."""
|
||||||
@@ -85,7 +86,7 @@ class SimpleScheduler(chance.ChanceScheduler):
|
|||||||
for result in results:
|
for result in results:
|
||||||
(service, instance_count) = result
|
(service, instance_count) = result
|
||||||
if instance_count >= FLAGS.max_networks:
|
if instance_count >= FLAGS.max_networks:
|
||||||
raise driver.NoValidHost("All hosts have too many networks")
|
raise driver.NoValidHost(_("All hosts have too many networks"))
|
||||||
if self.service_is_up(service):
|
if self.service_is_up(service):
|
||||||
return service['host']
|
return service['host']
|
||||||
raise driver.NoValidHost("No hosts found")
|
raise driver.NoValidHost(_("No hosts found"))
|
||||||
|
|||||||
@@ -330,14 +330,10 @@ class AuthManagerLdapTestCase(AuthManagerTestCase, test.TestCase):
|
|||||||
AuthManagerTestCase.__init__(self)
|
AuthManagerTestCase.__init__(self)
|
||||||
test.TestCase.__init__(self, *args, **kwargs)
|
test.TestCase.__init__(self, *args, **kwargs)
|
||||||
import nova.auth.fakeldap as fakeldap
|
import nova.auth.fakeldap as fakeldap
|
||||||
FLAGS.redis_db = 8
|
|
||||||
if FLAGS.flush_db:
|
if FLAGS.flush_db:
|
||||||
logging.info("Flushing redis datastore")
|
logging.info("Flushing datastore")
|
||||||
try:
|
r = fakeldap.Store.instance()
|
||||||
r = fakeldap.Redis.instance()
|
|
||||||
r.flushdb()
|
r.flushdb()
|
||||||
except:
|
|
||||||
self.skip = True
|
|
||||||
|
|
||||||
|
|
||||||
class AuthManagerDbTestCase(AuthManagerTestCase, test.TestCase):
|
class AuthManagerDbTestCase(AuthManagerTestCase, test.TestCase):
|
||||||
|
|||||||
@@ -127,6 +127,14 @@ class ComputeTestCase(test.TestCase):
|
|||||||
self.assert_(instance_ref['launched_at'] < terminate)
|
self.assert_(instance_ref['launched_at'] < terminate)
|
||||||
self.assert_(instance_ref['deleted_at'] > terminate)
|
self.assert_(instance_ref['deleted_at'] > terminate)
|
||||||
|
|
||||||
|
def test_pause(self):
|
||||||
|
"""Ensure instance can be paused"""
|
||||||
|
instance_id = self._create_instance()
|
||||||
|
self.compute.run_instance(self.context, instance_id)
|
||||||
|
self.compute.pause_instance(self.context, instance_id)
|
||||||
|
self.compute.unpause_instance(self.context, instance_id)
|
||||||
|
self.compute.terminate_instance(self.context, instance_id)
|
||||||
|
|
||||||
def test_reboot(self):
|
def test_reboot(self):
|
||||||
"""Ensure instance can be rebooted"""
|
"""Ensure instance can be rebooted"""
|
||||||
instance_id = self._create_instance()
|
instance_id = self._create_instance()
|
||||||
|
|||||||
@@ -40,11 +40,8 @@ class LibvirtConnTestCase(test.TestCase):
|
|||||||
self.network = utils.import_object(FLAGS.network_manager)
|
self.network = utils.import_object(FLAGS.network_manager)
|
||||||
FLAGS.instances_path = ''
|
FLAGS.instances_path = ''
|
||||||
|
|
||||||
def test_get_uri_and_template(self):
|
test_ip = '10.11.12.13'
|
||||||
ip = '10.11.12.13'
|
test_instance = {'memory_kb': '1024000',
|
||||||
|
|
||||||
instance = {'internal_id': 1,
|
|
||||||
'memory_kb': '1024000',
|
|
||||||
'basepath': '/some/path',
|
'basepath': '/some/path',
|
||||||
'bridge_name': 'br100',
|
'bridge_name': 'br100',
|
||||||
'mac_address': '02:12:34:46:56:67',
|
'mac_address': '02:12:34:46:56:67',
|
||||||
@@ -53,6 +50,41 @@ class LibvirtConnTestCase(test.TestCase):
|
|||||||
'bridge': 'br101',
|
'bridge': 'br101',
|
||||||
'instance_type': 'm1.small'}
|
'instance_type': 'm1.small'}
|
||||||
|
|
||||||
|
def test_xml_and_uri_no_ramdisk_no_kernel(self):
|
||||||
|
instance_data = dict(self.test_instance)
|
||||||
|
self.do_test_xml_and_uri(instance_data,
|
||||||
|
expect_kernel=False, expect_ramdisk=False)
|
||||||
|
|
||||||
|
def test_xml_and_uri_no_ramdisk(self):
|
||||||
|
instance_data = dict(self.test_instance)
|
||||||
|
instance_data['kernel_id'] = 'aki-deadbeef'
|
||||||
|
self.do_test_xml_and_uri(instance_data,
|
||||||
|
expect_kernel=True, expect_ramdisk=False)
|
||||||
|
|
||||||
|
def test_xml_and_uri_no_kernel(self):
|
||||||
|
instance_data = dict(self.test_instance)
|
||||||
|
instance_data['ramdisk_id'] = 'ari-deadbeef'
|
||||||
|
self.do_test_xml_and_uri(instance_data,
|
||||||
|
expect_kernel=False, expect_ramdisk=False)
|
||||||
|
|
||||||
|
def test_xml_and_uri(self):
|
||||||
|
instance_data = dict(self.test_instance)
|
||||||
|
instance_data['ramdisk_id'] = 'ari-deadbeef'
|
||||||
|
instance_data['kernel_id'] = 'aki-deadbeef'
|
||||||
|
self.do_test_xml_and_uri(instance_data,
|
||||||
|
expect_kernel=True, expect_ramdisk=True)
|
||||||
|
|
||||||
|
def test_xml_and_uri_rescue(self):
|
||||||
|
instance_data = dict(self.test_instance)
|
||||||
|
instance_data['ramdisk_id'] = 'ari-deadbeef'
|
||||||
|
instance_data['kernel_id'] = 'aki-deadbeef'
|
||||||
|
self.do_test_xml_and_uri(instance_data,
|
||||||
|
expect_kernel=True, expect_ramdisk=True,
|
||||||
|
rescue=True)
|
||||||
|
|
||||||
|
def do_test_xml_and_uri(self, instance,
|
||||||
|
expect_ramdisk, expect_kernel,
|
||||||
|
rescue=False):
|
||||||
user_context = context.RequestContext(project=self.project,
|
user_context = context.RequestContext(project=self.project,
|
||||||
user=self.user)
|
user=self.user)
|
||||||
instance_ref = db.instance_create(user_context, instance)
|
instance_ref = db.instance_create(user_context, instance)
|
||||||
@@ -60,12 +92,13 @@ class LibvirtConnTestCase(test.TestCase):
|
|||||||
self.network.set_network_host(context.get_admin_context(),
|
self.network.set_network_host(context.get_admin_context(),
|
||||||
network_ref['id'])
|
network_ref['id'])
|
||||||
|
|
||||||
fixed_ip = {'address': ip,
|
fixed_ip = {'address': self.test_ip,
|
||||||
'network_id': network_ref['id']}
|
'network_id': network_ref['id']}
|
||||||
|
|
||||||
ctxt = context.get_admin_context()
|
ctxt = context.get_admin_context()
|
||||||
fixed_ip_ref = db.fixed_ip_create(ctxt, fixed_ip)
|
fixed_ip_ref = db.fixed_ip_create(ctxt, fixed_ip)
|
||||||
db.fixed_ip_update(ctxt, ip, {'allocated': True,
|
db.fixed_ip_update(ctxt, self.test_ip,
|
||||||
|
{'allocated': True,
|
||||||
'instance_id': instance_ref['id']})
|
'instance_id': instance_ref['id']})
|
||||||
|
|
||||||
type_uri_map = {'qemu': ('qemu:///system',
|
type_uri_map = {'qemu': ('qemu:///system',
|
||||||
@@ -78,23 +111,73 @@ class LibvirtConnTestCase(test.TestCase):
|
|||||||
(lambda t: t.find('./devices/emulator'), None)]),
|
(lambda t: t.find('./devices/emulator'), None)]),
|
||||||
'uml': ('uml:///system',
|
'uml': ('uml:///system',
|
||||||
[(lambda t: t.find('.').get('type'), 'uml'),
|
[(lambda t: t.find('.').get('type'), 'uml'),
|
||||||
(lambda t: t.find('./os/type').text, 'uml')])}
|
(lambda t: t.find('./os/type').text, 'uml')]),
|
||||||
|
'xen': ('xen:///',
|
||||||
|
[(lambda t: t.find('.').get('type'), 'xen'),
|
||||||
|
(lambda t: t.find('./os/type').text, 'linux')]),
|
||||||
|
}
|
||||||
|
|
||||||
|
for hypervisor_type in ['qemu', 'kvm', 'xen']:
|
||||||
|
check_list = type_uri_map[hypervisor_type][1]
|
||||||
|
|
||||||
|
if rescue:
|
||||||
|
check = (lambda t: t.find('./os/kernel').text.split('/')[1],
|
||||||
|
'rescue-kernel')
|
||||||
|
check_list.append(check)
|
||||||
|
check = (lambda t: t.find('./os/initrd').text.split('/')[1],
|
||||||
|
'rescue-ramdisk')
|
||||||
|
check_list.append(check)
|
||||||
|
else:
|
||||||
|
if expect_kernel:
|
||||||
|
check = (lambda t: t.find('./os/kernel').text.split(
|
||||||
|
'/')[1], 'kernel')
|
||||||
|
else:
|
||||||
|
check = (lambda t: t.find('./os/kernel'), None)
|
||||||
|
check_list.append(check)
|
||||||
|
|
||||||
|
if expect_ramdisk:
|
||||||
|
check = (lambda t: t.find('./os/initrd').text.split(
|
||||||
|
'/')[1], 'ramdisk')
|
||||||
|
else:
|
||||||
|
check = (lambda t: t.find('./os/initrd'), None)
|
||||||
|
check_list.append(check)
|
||||||
|
|
||||||
common_checks = [
|
common_checks = [
|
||||||
(lambda t: t.find('.').tag, 'domain'),
|
(lambda t: t.find('.').tag, 'domain'),
|
||||||
(lambda t: t.find('./devices/interface/filterref/parameter').\
|
(lambda t: t.find(
|
||||||
get('name'), 'IP'),
|
'./devices/interface/filterref/parameter').get('name'), 'IP'),
|
||||||
(lambda t: t.find('./devices/interface/filterref/parameter').\
|
(lambda t: t.find(
|
||||||
get('value'), '10.11.12.13')]
|
'./devices/interface/filterref/parameter').get(
|
||||||
|
'value'), '10.11.12.13'),
|
||||||
|
(lambda t: t.findall(
|
||||||
|
'./devices/interface/filterref/parameter')[1].get(
|
||||||
|
'name'), 'DHCPSERVER'),
|
||||||
|
(lambda t: t.findall(
|
||||||
|
'./devices/interface/filterref/parameter')[1].get(
|
||||||
|
'value'), '10.0.0.1'),
|
||||||
|
(lambda t: t.find('./devices/serial/source').get(
|
||||||
|
'path').split('/')[1], 'console.log'),
|
||||||
|
(lambda t: t.find('./memory').text, '2097152')]
|
||||||
|
|
||||||
|
if rescue:
|
||||||
|
common_checks += [
|
||||||
|
(lambda t: t.findall('./devices/disk/source')[0].get(
|
||||||
|
'file').split('/')[1], 'rescue-disk'),
|
||||||
|
(lambda t: t.findall('./devices/disk/source')[1].get(
|
||||||
|
'file').split('/')[1], 'disk')]
|
||||||
|
else:
|
||||||
|
common_checks += [(lambda t: t.findall(
|
||||||
|
'./devices/disk/source')[0].get('file').split('/')[1],
|
||||||
|
'disk')]
|
||||||
|
|
||||||
for (libvirt_type, (expected_uri, checks)) in type_uri_map.iteritems():
|
for (libvirt_type, (expected_uri, checks)) in type_uri_map.iteritems():
|
||||||
FLAGS.libvirt_type = libvirt_type
|
FLAGS.libvirt_type = libvirt_type
|
||||||
conn = libvirt_conn.LibvirtConnection(True)
|
conn = libvirt_conn.LibvirtConnection(True)
|
||||||
|
|
||||||
uri, _template, _rescue = conn.get_uri_and_templates()
|
uri = conn.get_uri()
|
||||||
self.assertEquals(uri, expected_uri)
|
self.assertEquals(uri, expected_uri)
|
||||||
|
|
||||||
xml = conn.to_xml(instance_ref)
|
xml = conn.to_xml(instance_ref, rescue)
|
||||||
tree = xml_to_tree(xml)
|
tree = xml_to_tree(xml)
|
||||||
for i, (check, expected_result) in enumerate(checks):
|
for i, (check, expected_result) in enumerate(checks):
|
||||||
self.assertEqual(check(tree),
|
self.assertEqual(check(tree),
|
||||||
@@ -106,6 +189,9 @@ class LibvirtConnTestCase(test.TestCase):
|
|||||||
expected_result,
|
expected_result,
|
||||||
'%s failed common check %d' % (xml, i))
|
'%s failed common check %d' % (xml, i))
|
||||||
|
|
||||||
|
# This test is supposed to make sure we don't override a specifically
|
||||||
|
# set uri
|
||||||
|
#
|
||||||
# Deliberately not just assigning this string to FLAGS.libvirt_uri and
|
# Deliberately not just assigning this string to FLAGS.libvirt_uri and
|
||||||
# checking against that later on. This way we make sure the
|
# checking against that later on. This way we make sure the
|
||||||
# implementation doesn't fiddle around with the FLAGS.
|
# implementation doesn't fiddle around with the FLAGS.
|
||||||
@@ -114,7 +200,7 @@ class LibvirtConnTestCase(test.TestCase):
|
|||||||
for (libvirt_type, (expected_uri, checks)) in type_uri_map.iteritems():
|
for (libvirt_type, (expected_uri, checks)) in type_uri_map.iteritems():
|
||||||
FLAGS.libvirt_type = libvirt_type
|
FLAGS.libvirt_type = libvirt_type
|
||||||
conn = libvirt_conn.LibvirtConnection(True)
|
conn = libvirt_conn.LibvirtConnection(True)
|
||||||
uri, _template, _rescue = conn.get_uri_and_templates()
|
uri = conn.get_uri()
|
||||||
self.assertEquals(uri, testuri)
|
self.assertEquals(uri, testuri)
|
||||||
|
|
||||||
def tearDown(self):
|
def tearDown(self):
|
||||||
|
|||||||
@@ -208,7 +208,7 @@ def stop(pidfile):
|
|||||||
pid = None
|
pid = None
|
||||||
|
|
||||||
if not pid:
|
if not pid:
|
||||||
message = "pidfile %s does not exist. Daemon not running?\n"
|
message = _("pidfile %s does not exist. Daemon not running?\n")
|
||||||
sys.stderr.write(message % pidfile)
|
sys.stderr.write(message % pidfile)
|
||||||
# Not an error in a restart
|
# Not an error in a restart
|
||||||
return
|
return
|
||||||
@@ -229,7 +229,7 @@ def stop(pidfile):
|
|||||||
|
|
||||||
|
|
||||||
def serve(filename):
|
def serve(filename):
|
||||||
logging.debug("Serving %s" % filename)
|
logging.debug(_("Serving %s") % filename)
|
||||||
name = os.path.basename(filename)
|
name = os.path.basename(filename)
|
||||||
OptionsClass = WrapTwistedOptions(TwistdServerOptions)
|
OptionsClass = WrapTwistedOptions(TwistdServerOptions)
|
||||||
options = OptionsClass()
|
options = OptionsClass()
|
||||||
@@ -281,7 +281,7 @@ def serve(filename):
|
|||||||
else:
|
else:
|
||||||
logging.getLogger().setLevel(logging.WARNING)
|
logging.getLogger().setLevel(logging.WARNING)
|
||||||
|
|
||||||
logging.debug("Full set of FLAGS:")
|
logging.debug(_("Full set of FLAGS:"))
|
||||||
for flag in FLAGS:
|
for flag in FLAGS:
|
||||||
logging.debug("%s : %s" % (flag, FLAGS.get(flag, None)))
|
logging.debug("%s : %s" % (flag, FLAGS.get(flag, None)))
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user