merged with nova trunk

This commit is contained in:
Isaku Yamahata
2011-08-02 11:36:58 +09:00
48 changed files with 15891 additions and 1083 deletions

View File

@@ -13,3 +13,7 @@ nova/vcsversion.py
clean.sqlite clean.sqlite
run_tests.log run_tests.log
tests.sqlite tests.sqlite
nova/tests/instance-*
tags
.coverage
covhtml

View File

@@ -14,6 +14,7 @@
<code@term.ie> <github@anarkystic.com> <code@term.ie> <github@anarkystic.com>
<code@term.ie> <termie@preciousroy.local> <code@term.ie> <termie@preciousroy.local>
<corywright@gmail.com> <cory.wright@rackspace.com> <corywright@gmail.com> <cory.wright@rackspace.com>
<dan@nicira.com> <danwent@dan-xs3-cs>
<devin.carlen@gmail.com> <devcamcar@illian.local> <devin.carlen@gmail.com> <devcamcar@illian.local>
<ewan.mellor@citrix.com> <emellor@silver> <ewan.mellor@citrix.com> <emellor@silver>
<itoumsn@nttdata.co.jp> <itoumsn@shayol> <itoumsn@nttdata.co.jp> <itoumsn@shayol>

View File

@@ -1,4 +1,5 @@
Adam Gandelman <adamg@canonical.com> Adam Gandelman <adamg@canonical.com>
Adam Johnson <adjohn@gmail.com>
Alex Meade <alex.meade@rackspace.com> Alex Meade <alex.meade@rackspace.com>
Alexander Sakhnov <asakhnov@mirantis.com> Alexander Sakhnov <asakhnov@mirantis.com>
Andrey Brindeyev <abrindeyev@griddynamics.com> Andrey Brindeyev <abrindeyev@griddynamics.com>
@@ -8,6 +9,7 @@ Anne Gentle <anne@openstack.org>
Anthony Young <sleepsonthefloor@gmail.com> Anthony Young <sleepsonthefloor@gmail.com>
Antony Messerli <ant@openstack.org> Antony Messerli <ant@openstack.org>
Armando Migliaccio <Armando.Migliaccio@eu.citrix.com> Armando Migliaccio <Armando.Migliaccio@eu.citrix.com>
Arvind Somya <asomya@cisco.com>
Bilal Akhtar <bilalakhtar@ubuntu.com> Bilal Akhtar <bilalakhtar@ubuntu.com>
Brian Lamar <brian.lamar@rackspace.com> Brian Lamar <brian.lamar@rackspace.com>
Brian Schott <bschott@isi.edu> Brian Schott <bschott@isi.edu>
@@ -19,6 +21,7 @@ Christian Berendt <berendt@b1-systems.de>
Chuck Short <zulcss@ubuntu.com> Chuck Short <zulcss@ubuntu.com>
Cory Wright <corywright@gmail.com> Cory Wright <corywright@gmail.com>
Dan Prince <dan.prince@rackspace.com> Dan Prince <dan.prince@rackspace.com>
Dan Wendlandt <dan@nicira.com>
Dave Walker <DaveWalker@ubuntu.com> Dave Walker <DaveWalker@ubuntu.com>
David Pravec <David.Pravec@danix.org> David Pravec <David.Pravec@danix.org>
Dean Troyer <dtroyer@gmail.com> Dean Troyer <dtroyer@gmail.com>
@@ -64,6 +67,7 @@ Lvov Maxim <usrleon@gmail.com>
Mark Washenberger <mark.washenberger@rackspace.com> Mark Washenberger <mark.washenberger@rackspace.com>
Masanori Itoh <itoumsn@nttdata.co.jp> Masanori Itoh <itoumsn@nttdata.co.jp>
Matt Dietz <matt.dietz@rackspace.com> Matt Dietz <matt.dietz@rackspace.com>
Matthew Hooker <matt@cloudscaling.com>
Michael Gundlach <michael.gundlach@rackspace.com> Michael Gundlach <michael.gundlach@rackspace.com>
Mike Scherbakov <mihgen@gmail.com> Mike Scherbakov <mihgen@gmail.com>
Mohammed Naser <mnaser@vexxhost.com> Mohammed Naser <mnaser@vexxhost.com>
@@ -83,6 +87,7 @@ Rick Harris <rconradharris@gmail.com>
Rob Kost <kost@isi.edu> Rob Kost <kost@isi.edu>
Ryan Lane <rlane@wikimedia.org> Ryan Lane <rlane@wikimedia.org>
Ryan Lucio <rlucio@internap.com> Ryan Lucio <rlucio@internap.com>
Ryu Ishimoto <ryu@midokura.jp>
Salvatore Orlando <salvatore.orlando@eu.citrix.com> Salvatore Orlando <salvatore.orlando@eu.citrix.com>
Sandy Walsh <sandy.walsh@rackspace.com> Sandy Walsh <sandy.walsh@rackspace.com>
Sateesh Chodapuneedi <sateesh.chodapuneedi@citrix.com> Sateesh Chodapuneedi <sateesh.chodapuneedi@citrix.com>
@@ -101,3 +106,4 @@ Yoshiaki Tamura <yoshi@midokura.jp>
Youcef Laribi <Youcef.Laribi@eu.citrix.com> Youcef Laribi <Youcef.Laribi@eu.citrix.com>
Yuriy Taraday <yorik.sar@gmail.com> Yuriy Taraday <yorik.sar@gmail.com>
Zhixue Wu <Zhixue.Wu@citrix.com> Zhixue Wu <Zhixue.Wu@citrix.com>
Zed Shaw <zedshaw@zedshaw.com>

View File

@@ -61,6 +61,7 @@ import os
import sys import sys
import time import time
from optparse import OptionParser
# If ../nova/__init__.py exists, add ../ to Python search path, so that # If ../nova/__init__.py exists, add ../ to Python search path, so that
# it will override what happens to be installed in /usr/(local/)lib/python... # it will override what happens to be installed in /usr/(local/)lib/python...
@@ -103,6 +104,14 @@ flags.DEFINE_flag(flags.HelpshortFlag())
flags.DEFINE_flag(flags.HelpXMLFlag()) flags.DEFINE_flag(flags.HelpXMLFlag())
# Decorators for actions
def args(*args, **kwargs):
def _decorator(func):
func.__dict__.setdefault('options', []).insert(0, (args, kwargs))
return func
return _decorator
def param2id(object_id): def param2id(object_id):
"""Helper function to convert various id types to internal id. """Helper function to convert various id types to internal id.
args: [object_id], e.g. 'vol-0000000a' or 'volume-0000000a' or '10' args: [object_id], e.g. 'vol-0000000a' or 'volume-0000000a' or '10'
@@ -120,10 +129,11 @@ class VpnCommands(object):
self.manager = manager.AuthManager() self.manager = manager.AuthManager()
self.pipe = pipelib.CloudPipe() self.pipe = pipelib.CloudPipe()
@args('--project', dest="project", metavar='<Project name>',
help='Project name')
def list(self, project=None): def list(self, project=None):
"""Print a listing of the VPN data for one or all projects. """Print a listing of the VPN data for one or all projects."""
args: [project=all]"""
print "%-12s\t" % 'project', print "%-12s\t" % 'project',
print "%-20s\t" % 'ip:port', print "%-20s\t" % 'ip:port',
print "%-20s\t" % 'private_ip', print "%-20s\t" % 'private_ip',
@@ -165,17 +175,23 @@ class VpnCommands(object):
self.pipe.launch_vpn_instance(p.id) self.pipe.launch_vpn_instance(p.id)
time.sleep(10) time.sleep(10)
@args('--project', dest="project_id", metavar='<Project name>',
help='Project name')
def run(self, project_id): def run(self, project_id):
"""Start the VPN for a given project.""" """Start the VPN for a given project."""
self.pipe.launch_vpn_instance(project_id) self.pipe.launch_vpn_instance(project_id)
@args('--project', dest="project_id", metavar='<Project name>',
help='Project name')
@args('--ip', dest="ip", metavar='<IP Address>', help='IP Address')
@args('--port', dest="port", metavar='<Port>', help='Port')
def change(self, project_id, ip, port): def change(self, project_id, ip, port):
"""Change the ip and port for a vpn. """Change the ip and port for a vpn.
this will update all networks associated with a project this will update all networks associated with a project
not sure if that's the desired behavior or not, patches accepted not sure if that's the desired behavior or not, patches accepted
args: project, ip, port""" """
# TODO(tr3buchet): perhaps this shouldn't update all networks # TODO(tr3buchet): perhaps this shouldn't update all networks
# associated with a project in the future # associated with a project in the future
project = self.manager.get_project(project_id) project = self.manager.get_project(project_id)
@@ -210,10 +226,10 @@ class ShellCommands(object):
Falls back to Python shell if unavailable""" Falls back to Python shell if unavailable"""
self.run('python') self.run('python')
@args('--shell', dest="shell", metavar='<bpython|ipython|python >',
help='Python shell')
def run(self, shell=None): def run(self, shell=None):
"""Runs a Python interactive interpreter. """Runs a Python interactive interpreter."""
args: [shell=bpython]"""
if not shell: if not shell:
shell = 'bpython' shell = 'bpython'
@@ -247,6 +263,7 @@ class ShellCommands(object):
readline.parse_and_bind("tab:complete") readline.parse_and_bind("tab:complete")
code.interact() code.interact()
@args('--path', dest='path', metavar='<path>', help='Script path')
def script(self, path): def script(self, path):
"""Runs the script from the specifed path with flags set properly. """Runs the script from the specifed path with flags set properly.
arguments: path""" arguments: path"""
@@ -259,10 +276,13 @@ class RoleCommands(object):
def __init__(self): def __init__(self):
self.manager = manager.AuthManager() self.manager = manager.AuthManager()
@args('--user', dest="user", metavar='<user name>', help='User name')
@args('--role', dest="role", metavar='<user role>', help='User role')
@args('--project', dest="project", metavar='<Project name>',
help='Project name')
def add(self, user, role, project=None): def add(self, user, role, project=None):
"""adds role to user """adds role to user
if project is specified, adds project specific role if project is specified, adds project specific role"""
arguments: user, role [project]"""
if project: if project:
projobj = self.manager.get_project(project) projobj = self.manager.get_project(project)
if not projobj.has_member(user): if not projobj.has_member(user):
@@ -270,17 +290,23 @@ class RoleCommands(object):
return return
self.manager.add_role(user, role, project) self.manager.add_role(user, role, project)
@args('--user', dest="user", metavar='<user name>', help='User name')
@args('--role', dest="role", metavar='<user role>', help='User role')
@args('--project', dest="project", metavar='<Project name>',
help='Project name')
def has(self, user, role, project=None): def has(self, user, role, project=None):
"""checks to see if user has role """checks to see if user has role
if project is specified, returns True if user has if project is specified, returns True if user has
the global role and the project role the global role and the project role"""
arguments: user, role [project]"""
print self.manager.has_role(user, role, project) print self.manager.has_role(user, role, project)
@args('--user', dest="user", metavar='<user name>', help='User name')
@args('--role', dest="role", metavar='<user role>', help='User role')
@args('--project', dest="project", metavar='<Project name>',
help='Project name')
def remove(self, user, role, project=None): def remove(self, user, role, project=None):
"""removes role from user """removes role from user
if project is specified, removes project specific role if project is specified, removes project specific role"""
arguments: user, role [project]"""
self.manager.remove_role(user, role, project) self.manager.remove_role(user, role, project)
@@ -304,32 +330,37 @@ class UserCommands(object):
def __init__(self): def __init__(self):
self.manager = manager.AuthManager() self.manager = manager.AuthManager()
@args('--name', dest="name", metavar='<admin name>', help='Admin name')
@args('--access', dest="access", metavar='<access>', help='Access')
@args('--secret', dest="secret", metavar='<secret>', help='Secret')
def admin(self, name, access=None, secret=None): def admin(self, name, access=None, secret=None):
"""creates a new admin and prints exports """creates a new admin and prints exports"""
arguments: name [access] [secret]"""
try: try:
user = self.manager.create_user(name, access, secret, True) user = self.manager.create_user(name, access, secret, True)
except exception.DBError, e: except exception.DBError, e:
_db_error(e) _db_error(e)
self._print_export(user) self._print_export(user)
@args('--name', dest="name", metavar='<name>', help='User name')
@args('--access', dest="access", metavar='<access>', help='Access')
@args('--secret', dest="secret", metavar='<secret>', help='Secret')
def create(self, name, access=None, secret=None): def create(self, name, access=None, secret=None):
"""creates a new user and prints exports """creates a new user and prints exports"""
arguments: name [access] [secret]"""
try: try:
user = self.manager.create_user(name, access, secret, False) user = self.manager.create_user(name, access, secret, False)
except exception.DBError, e: except exception.DBError, e:
_db_error(e) _db_error(e)
self._print_export(user) self._print_export(user)
@args('--name', dest="name", metavar='<name>', help='User name')
def delete(self, name): def delete(self, name):
"""deletes an existing user """deletes an existing user
arguments: name""" arguments: name"""
self.manager.delete_user(name) self.manager.delete_user(name)
@args('--name', dest="name", metavar='<admin name>', help='User name')
def exports(self, name): def exports(self, name):
"""prints access and secrets for user in export format """prints access and secrets for user in export format"""
arguments: name"""
user = self.manager.get_user(name) user = self.manager.get_user(name)
if user: if user:
self._print_export(user) self._print_export(user)
@@ -337,11 +368,17 @@ class UserCommands(object):
print "User %s doesn't exist" % name print "User %s doesn't exist" % name
def list(self): def list(self):
"""lists all users """lists all users"""
arguments: <none>"""
for user in self.manager.get_users(): for user in self.manager.get_users():
print user.name print user.name
@args('--name', dest="name", metavar='<name>', help='User name')
@args('--access', dest="access_key", metavar='<access>',
help='Access key')
@args('--secret', dest="secret_key", metavar='<secret>',
help='Secret key')
@args('--is_admin', dest='is_admin', metavar="<'T'|'F'>",
help='Is admin?')
def modify(self, name, access_key, secret_key, is_admin): def modify(self, name, access_key, secret_key, is_admin):
"""update a users keys & admin flag """update a users keys & admin flag
arguments: accesskey secretkey admin arguments: accesskey secretkey admin
@@ -355,9 +392,11 @@ class UserCommands(object):
is_admin = False is_admin = False
self.manager.modify_user(name, access_key, secret_key, is_admin) self.manager.modify_user(name, access_key, secret_key, is_admin)
@args('--name', dest="user_id", metavar='<name>', help='User name')
@args('--project', dest="project_id", metavar='<Project name>',
help='Project name')
def revoke(self, user_id, project_id=None): def revoke(self, user_id, project_id=None):
"""revoke certs for a user """revoke certs for a user"""
arguments: user_id [project_id]"""
if project_id: if project_id:
crypto.revoke_certs_by_user_and_project(user_id, project_id) crypto.revoke_certs_by_user_and_project(user_id, project_id)
else: else:
@@ -370,45 +409,62 @@ class ProjectCommands(object):
def __init__(self): def __init__(self):
self.manager = manager.AuthManager() self.manager = manager.AuthManager()
@args('--project', dest="project_id", metavar='<Project name>',
help='Project name')
@args('--user', dest="user_id", metavar='<name>', help='User name')
def add(self, project_id, user_id): def add(self, project_id, user_id):
"""Adds user to project """Adds user to project"""
arguments: project_id user_id"""
try: try:
self.manager.add_to_project(user_id, project_id) self.manager.add_to_project(user_id, project_id)
except exception.UserNotFound as ex: except exception.UserNotFound as ex:
print ex print ex
raise raise
@args('--project', dest="name", metavar='<Project name>',
help='Project name')
@args('--user', dest="project_manager", metavar='<user>',
help='Project manager')
@args('--desc', dest="description", metavar='<description>',
help='Description')
def create(self, name, project_manager, description=None): def create(self, name, project_manager, description=None):
"""Creates a new project """Creates a new project"""
arguments: name project_manager [description]"""
try: try:
self.manager.create_project(name, project_manager, description) self.manager.create_project(name, project_manager, description)
except exception.UserNotFound as ex: except exception.UserNotFound as ex:
print ex print ex
raise raise
@args('--project', dest="name", metavar='<Project name>',
help='Project name')
@args('--user', dest="project_manager", metavar='<user>',
help='Project manager')
@args('--desc', dest="description", metavar='<description>',
help='Description')
def modify(self, name, project_manager, description=None): def modify(self, name, project_manager, description=None):
"""Modifies a project """Modifies a project"""
arguments: name project_manager [description]"""
try: try:
self.manager.modify_project(name, project_manager, description) self.manager.modify_project(name, project_manager, description)
except exception.UserNotFound as ex: except exception.UserNotFound as ex:
print ex print ex
raise raise
@args('--project', dest="name", metavar='<Project name>',
help='Project name')
def delete(self, name): def delete(self, name):
"""Deletes an existing project """Deletes an existing project"""
arguments: name"""
try: try:
self.manager.delete_project(name) self.manager.delete_project(name)
except exception.ProjectNotFound as ex: except exception.ProjectNotFound as ex:
print ex print ex
raise raise
@args('--project', dest="project_id", metavar='<Project name>',
help='Project name')
@args('--user', dest="user_id", metavar='<name>', help='User name')
@args('--file', dest="filename", metavar='<filename>',
help='File name(Default: novarc)')
def environment(self, project_id, user_id, filename='novarc'): def environment(self, project_id, user_id, filename='novarc'):
"""Exports environment variables to an sourcable file """Exports environment variables to an sourcable file"""
arguments: project_id user_id [filename='novarc]"""
try: try:
rc = self.manager.get_environment_rc(user_id, project_id) rc = self.manager.get_environment_rc(user_id, project_id)
except (exception.UserNotFound, exception.ProjectNotFound) as ex: except (exception.UserNotFound, exception.ProjectNotFound) as ex:
@@ -420,15 +476,18 @@ class ProjectCommands(object):
with open(filename, 'w') as f: with open(filename, 'w') as f:
f.write(rc) f.write(rc)
@args('--user', dest="username", metavar='<username>', help='User name')
def list(self, username=None): def list(self, username=None):
"""Lists all projects """Lists all projects"""
arguments: [username]"""
for project in self.manager.get_projects(username): for project in self.manager.get_projects(username):
print project.name print project.name
@args('--project', dest="project_id", metavar='<Project name>',
help='Project name')
@args('--key', dest="key", metavar='<key>', help='Key')
@args('--value', dest="value", metavar='<value>', help='Value')
def quota(self, project_id, key=None, value=None): def quota(self, project_id, key=None, value=None):
"""Set or display quotas for project """Set or display quotas for project"""
arguments: project_id [key] [value]"""
ctxt = context.get_admin_context() ctxt = context.get_admin_context()
if key: if key:
if value.lower() == 'unlimited': if value.lower() == 'unlimited':
@@ -443,18 +502,21 @@ class ProjectCommands(object):
value = 'unlimited' value = 'unlimited'
print '%s: %s' % (key, value) print '%s: %s' % (key, value)
@args('--project', dest="project_id", metavar='<Project name>',
help='Project name')
@args('--user', dest="user_id", metavar='<name>', help='User name')
def remove(self, project_id, user_id): def remove(self, project_id, user_id):
"""Removes user from project """Removes user from project"""
arguments: project_id user_id"""
try: try:
self.manager.remove_from_project(user_id, project_id) self.manager.remove_from_project(user_id, project_id)
except (exception.UserNotFound, exception.ProjectNotFound) as ex: except (exception.UserNotFound, exception.ProjectNotFound) as ex:
print ex print ex
raise raise
@args('--project', dest="project_id", metavar='<Project name>',
help='Project name')
def scrub(self, project_id): def scrub(self, project_id):
"""Deletes data associated with project """Deletes data associated with project"""
arguments: project_id"""
admin_context = context.get_admin_context() admin_context = context.get_admin_context()
networks = db.project_get_networks(admin_context, project_id) networks = db.project_get_networks(admin_context, project_id)
for network in networks: for network in networks:
@@ -463,9 +525,13 @@ class ProjectCommands(object):
for group in groups: for group in groups:
db.security_group_destroy(admin_context, group['id']) db.security_group_destroy(admin_context, group['id'])
@args('--project', dest="project_id", metavar='<Project name>',
help='Project name')
@args('--user', dest="user_id", metavar='<name>', help='User name')
@args('--file', dest="filename", metavar='<filename>',
help='File name(Default: nova.zip)')
def zipfile(self, project_id, user_id, filename='nova.zip'): def zipfile(self, project_id, user_id, filename='nova.zip'):
"""Exports credentials for project to a zip file """Exports credentials for project to a zip file"""
arguments: project_id user_id [filename='nova.zip]"""
try: try:
zip_file = self.manager.get_credentials(user_id, project_id) zip_file = self.manager.get_credentials(user_id, project_id)
if filename == "-": if filename == "-":
@@ -482,9 +548,9 @@ class ProjectCommands(object):
' nova-manage network create pvt 10.0.0.0/8 10 64\n\n') ' nova-manage network create pvt 10.0.0.0/8 10 64\n\n')
except exception.ProcessExecutionError, e: except exception.ProcessExecutionError, e:
print e print e
print _("The above error may show that the certificate db has not " print _("The above error may show that the certificate db has "
"been created.\nPlease create a database by running a " "not been created.\nPlease create a database by running "
"nova-api server on this host.") "a nova-api server on this host.")
AccountCommands = ProjectCommands AccountCommands = ProjectCommands
@@ -492,8 +558,9 @@ AccountCommands = ProjectCommands
class FixedIpCommands(object): class FixedIpCommands(object):
"""Class for managing fixed ip.""" """Class for managing fixed ip."""
@args('--host', dest="host", metavar='<host>', help='Host')
def list(self, host=None): def list(self, host=None):
"""Lists all fixed ips (optionally by host) arguments: [host]""" """Lists all fixed ips (optionally by host)"""
ctxt = context.get_admin_context() ctxt = context.get_admin_context()
try: try:
@@ -528,23 +595,23 @@ class FixedIpCommands(object):
class FloatingIpCommands(object): class FloatingIpCommands(object):
"""Class for managing floating ip.""" """Class for managing floating ip."""
@args('--ip_range', dest="range", metavar='<range>', help='IP range')
def create(self, range): def create(self, range):
"""Creates floating ips for zone by range """Creates floating ips for zone by range"""
arguments: ip_range"""
for address in netaddr.IPNetwork(range): for address in netaddr.IPNetwork(range):
db.floating_ip_create(context.get_admin_context(), db.floating_ip_create(context.get_admin_context(),
{'address': str(address)}) {'address': str(address)})
@args('--ip_range', dest="ip_range", metavar='<range>', help='IP range')
def delete(self, ip_range): def delete(self, ip_range):
"""Deletes floating ips by range """Deletes floating ips by range"""
arguments: range"""
for address in netaddr.IPNetwork(ip_range): for address in netaddr.IPNetwork(ip_range):
db.floating_ip_destroy(context.get_admin_context(), db.floating_ip_destroy(context.get_admin_context(),
str(address)) str(address))
@args('--host', dest="host", metavar='<host>', help='Host')
def list(self, host=None): def list(self, host=None):
"""Lists all floating ips (optionally by host) """Lists all floating ips (optionally by host)
arguments: [host]
Note: if host is given, only active floating IPs are returned""" Note: if host is given, only active floating IPs are returned"""
ctxt = context.get_admin_context() ctxt = context.get_admin_context()
if host is None: if host is None:
@@ -563,30 +630,76 @@ class FloatingIpCommands(object):
class NetworkCommands(object): class NetworkCommands(object):
"""Class for managing networks.""" """Class for managing networks."""
def create(self, label=None, fixed_range=None, num_networks=None, @args('--label', dest="label", metavar='<label>',
help='Label for network (ex: public)')
@args('--fixed_range_v4', dest="fixed_range_v4", metavar='<x.x.x.x/yy>',
help='IPv4 subnet (ex: 10.0.0.0/8)')
@args('--num_networks', dest="num_networks", metavar='<number>',
help='Number of networks to create')
@args('--network_size', dest="network_size", metavar='<number>',
help='Number of IPs per network')
@args('--vlan', dest="vlan_start", metavar='<vlan id>', help='vlan id')
@args('--vpn', dest="vpn_start", help='vpn start')
@args('--fixed_range_v6', dest="fixed_range_v6",
help='IPv6 subnet (ex: fe80::/64')
@args('--gateway_v6', dest="gateway_v6", help='ipv6 gateway')
@args('--bridge', dest="bridge",
metavar='<bridge>',
help='VIFs on this network are connected to this bridge')
@args('--bridge_interface', dest="bridge_interface",
metavar='<bridge interface>',
help='the bridge is connected to this interface')
@args('--multi_host', dest="multi_host", metavar="<'T'|'F'>",
help='Multi host')
@args('--dns1', dest="dns1", metavar="<DNS Address>", help='First DNS')
@args('--dns2', dest="dns2", metavar="<DNS Address>", help='Second DNS')
def create(self, label=None, fixed_range_v4=None, num_networks=None,
network_size=None, multi_host=None, vlan_start=None, network_size=None, multi_host=None, vlan_start=None,
vpn_start=None, fixed_range_v6=None, gateway_v6=None, vpn_start=None, fixed_range_v6=None, gateway_v6=None,
flat_network_bridge=None, bridge_interface=None, bridge=None, bridge_interface=None, dns1=None, dns2=None):
dns1=None, dns2=None): """Creates fixed ips for host by range"""
"""Creates fixed ips for host by range
arguments: label, fixed_range, [num_networks=FLAG], # check for certain required inputs
[network_size=FLAG], [multi_host=FLAG], [vlan_start=FLAG],
[vpn_start=FLAG], [fixed_range_v6=FLAG], [gateway_v6=FLAG],
[flat_network_bridge=FLAG], [bridge_interface=FLAG]
[dns1=FLAG], [dns2]
If you wish to use a later argument fill in the gaps with ""s
Ex: network create private 10.0.0.0/8 1 16 T "" "" "" "" xenbr1 eth1
network create private 10.0.0.0/8 1 16
"""
if not label: if not label:
msg = _('a label (ex: public) is required to create networks.') raise exception.NetworkNotCreated(req='--label')
print msg if not fixed_range_v4:
raise TypeError(msg) raise exception.NetworkNotCreated(req='--fixed_range_v4')
if not fixed_range:
msg = _('Fixed range in the form of 10.0.0.0/8 is ' bridge = bridge or FLAGS.flat_network_bridge
'required to create networks.') if not bridge:
print msg bridge_required = ['nova.network.manager.FlatManager',
raise TypeError(msg) 'nova.network.manager.FlatDHCPManager']
if FLAGS.network_manager in bridge_required:
# TODO(tr3buchet) - swap print statement and following line for
# raise statement in diablo 4
print _('--bridge parameter required or FLAG '
'flat_network_bridge must be set to create networks\n'
'WARNING! ACHTUNG! Setting the bridge to br100 '
'automatically is deprecated and will be removed in '
'Diablo milestone 4. Prepare yourself accordingly.')
time.sleep(10)
bridge = 'br100'
#raise exception.NetworkNotCreated(req='--bridge')
bridge_interface = bridge_interface or FLAGS.flat_interface or \
FLAGS.vlan_interface
if not bridge_interface:
interface_required = ['nova.network.manager.FlatDHCPManager',
'nova.network.manager.VlanManager']
if FLAGS.network_manager in interface_required:
raise exception.NetworkNotCreated(req='--bridge_interface')
if FLAGS.use_ipv6:
fixed_range_v6 = fixed_range_v6 or FLAGS.fixed_range_v6
if not fixed_range_v6:
raise exception.NetworkNotCreated(req='with use_ipv6, '
'--fixed_range_v6')
gateway_v6 = gateway_v6 or FLAGS.gateway_v6
if not gateway_v6:
raise exception.NetworkNotCreated(req='with use_ipv6, '
'--gateway_v6')
# sanitize other input using FLAGS if necessary
if not num_networks: if not num_networks:
num_networks = FLAGS.num_networks num_networks = FLAGS.num_networks
if not network_size: if not network_size:
@@ -599,22 +712,14 @@ class NetworkCommands(object):
vlan_start = FLAGS.vlan_start vlan_start = FLAGS.vlan_start
if not vpn_start: if not vpn_start:
vpn_start = FLAGS.vpn_start vpn_start = FLAGS.vpn_start
if not fixed_range_v6:
fixed_range_v6 = FLAGS.fixed_range_v6
if not flat_network_bridge:
flat_network_bridge = FLAGS.flat_network_bridge
if not bridge_interface:
bridge_interface = FLAGS.flat_interface or FLAGS.vlan_interface
if not gateway_v6:
gateway_v6 = FLAGS.gateway_v6
if not dns1 and FLAGS.flat_network_dns: if not dns1 and FLAGS.flat_network_dns:
dns1 = FLAGS.flat_network_dns dns1 = FLAGS.flat_network_dns
net_manager = utils.import_object(FLAGS.network_manager)
try: # create the network
net_manager = utils.import_object(FLAGS.network_manager)
net_manager.create_networks(context.get_admin_context(), net_manager.create_networks(context.get_admin_context(),
label=label, label=label,
cidr=fixed_range, cidr=fixed_range_v4,
multi_host=multi_host, multi_host=multi_host,
num_networks=int(num_networks), num_networks=int(num_networks),
network_size=int(network_size), network_size=int(network_size),
@@ -622,13 +727,10 @@ class NetworkCommands(object):
vpn_start=int(vpn_start), vpn_start=int(vpn_start),
cidr_v6=fixed_range_v6, cidr_v6=fixed_range_v6,
gateway_v6=gateway_v6, gateway_v6=gateway_v6,
bridge=flat_network_bridge, bridge=bridge,
bridge_interface=bridge_interface, bridge_interface=bridge_interface,
dns1=dns1, dns1=dns1,
dns2=dns2) dns2=dns2)
except ValueError, e:
print e
raise e
def list(self): def list(self):
"""List all created networks""" """List all created networks"""
@@ -650,6 +752,8 @@ class NetworkCommands(object):
network.vlan, network.vlan,
network.project_id) network.project_id)
@args('--network', dest="fixed_range", metavar='<x.x.x.x/yy>',
help='Network to delete')
def delete(self, fixed_range): def delete(self, fixed_range):
"""Deletes a network""" """Deletes a network"""
network = db.network_get_by_cidr(context.get_admin_context(), \ network = db.network_get_by_cidr(context.get_admin_context(), \
@@ -663,12 +767,10 @@ class NetworkCommands(object):
class VmCommands(object): class VmCommands(object):
"""Class for mangaging VM instances.""" """Class for mangaging VM instances."""
@args('--host', dest="host", metavar='<host>', help='Host')
def list(self, host=None): def list(self, host=None):
"""Show a list of all instances """Show a list of all instances"""
:param host: show all instance on specified host.
:param instance: show specificed instance.
"""
print "%-10s %-15s %-10s %-10s %-26s %-9s %-9s %-9s" \ print "%-10s %-15s %-10s %-10s %-26s %-9s %-9s %-9s" \
" %-10s %-10s %-10s %-5s" % ( " %-10s %-10s %-10s %-5s" % (
_('instance'), _('instance'),
@@ -706,13 +808,11 @@ class VmCommands(object):
instance['availability_zone'], instance['availability_zone'],
instance['launch_index']) instance['launch_index'])
@args('--ec2_id', dest='ec2_id', metavar='<ec2 id>', help='EC2 ID')
@args('--dest', dest='dest', metavar='<Destanation>',
help='destanation node')
def live_migration(self, ec2_id, dest): def live_migration(self, ec2_id, dest):
"""Migrates a running instance to a new machine. """Migrates a running instance to a new machine."""
:param ec2_id: instance id which comes from euca-describe-instance.
:param dest: destination host name.
"""
ctxt = context.get_admin_context() ctxt = context.get_admin_context()
instance_id = ec2utils.ec2_id_to_id(ec2_id) instance_id = ec2utils.ec2_id_to_id(ec2_id)
@@ -742,9 +842,13 @@ class VmCommands(object):
class ServiceCommands(object): class ServiceCommands(object):
"""Enable and disable running services""" """Enable and disable running services"""
@args('--host', dest='host', metavar='<host>', help='Host')
@args('--service', dest='service', metavar='<service>',
help='Nova service')
def list(self, host=None, service=None): def list(self, host=None, service=None):
"""Show a list of all running services. Filter by host & service name. """
args: [host] [service]""" Show a list of all running services. Filter by host & service name.
"""
ctxt = context.get_admin_context() ctxt = context.get_admin_context()
now = utils.utcnow() now = utils.utcnow()
services = db.service_get_all(ctxt) services = db.service_get_all(ctxt)
@@ -763,9 +867,11 @@ class ServiceCommands(object):
active, art, active, art,
svc['updated_at']) svc['updated_at'])
@args('--host', dest='host', metavar='<host>', help='Host')
@args('--service', dest='service', metavar='<service>',
help='Nova service')
def enable(self, host, service): def enable(self, host, service):
"""Enable scheduling for a service """Enable scheduling for a service"""
args: host service"""
ctxt = context.get_admin_context() ctxt = context.get_admin_context()
svc = db.service_get_by_args(ctxt, host, service) svc = db.service_get_by_args(ctxt, host, service)
if not svc: if not svc:
@@ -773,9 +879,11 @@ class ServiceCommands(object):
return return
db.service_update(ctxt, svc['id'], {'disabled': False}) db.service_update(ctxt, svc['id'], {'disabled': False})
@args('--host', dest='host', metavar='<host>', help='Host')
@args('--service', dest='service', metavar='<service>',
help='Nova service')
def disable(self, host, service): def disable(self, host, service):
"""Disable scheduling for a service """Disable scheduling for a service"""
args: host service"""
ctxt = context.get_admin_context() ctxt = context.get_admin_context()
svc = db.service_get_by_args(ctxt, host, service) svc = db.service_get_by_args(ctxt, host, service)
if not svc: if not svc:
@@ -783,12 +891,9 @@ class ServiceCommands(object):
return return
db.service_update(ctxt, svc['id'], {'disabled': True}) db.service_update(ctxt, svc['id'], {'disabled': True})
@args('--host', dest='host', metavar='<host>', help='Host')
def describe_resource(self, host): def describe_resource(self, host):
"""Describes cpu/memory/hdd info for host. """Describes cpu/memory/hdd info for host."""
:param host: hostname.
"""
result = rpc.call(context.get_admin_context(), result = rpc.call(context.get_admin_context(),
FLAGS.scheduler_topic, FLAGS.scheduler_topic,
@@ -816,12 +921,9 @@ class ServiceCommands(object):
val['memory_mb'], val['memory_mb'],
val['local_gb']) val['local_gb'])
@args('--host', dest='host', metavar='<host>', help='Host')
def update_resource(self, host): def update_resource(self, host):
"""Updates available vcpu/memory/disk info for host. """Updates available vcpu/memory/disk info for host."""
:param host: hostname.
"""
ctxt = context.get_admin_context() ctxt = context.get_admin_context()
service_refs = db.service_get_all_by_host(ctxt, host) service_refs = db.service_get_all_by_host(ctxt, host)
@@ -865,6 +967,8 @@ class DbCommands(object):
def __init__(self): def __init__(self):
pass pass
@args('--version', dest='version', metavar='<version>',
help='Database version')
def sync(self, version=None): def sync(self, version=None):
"""Sync the database up to the most recent version.""" """Sync the database up to the most recent version."""
return migration.db_sync(version) return migration.db_sync(version)
@@ -884,14 +988,18 @@ class VersionCommands(object):
print _("%s (%s)") %\ print _("%s (%s)") %\
(version.version_string(), version.version_string_with_vcs()) (version.version_string(), version.version_string_with_vcs())
def __call__(self):
self.list()
class VolumeCommands(object): class VolumeCommands(object):
"""Methods for dealing with a cloud in an odd state""" """Methods for dealing with a cloud in an odd state"""
@args('--volume', dest='volume_id', metavar='<volume id>',
help='Volume ID')
def delete(self, volume_id): def delete(self, volume_id):
"""Delete a volume, bypassing the check that it """Delete a volume, bypassing the check that it
must be available. must be available."""
args: volume_id_id"""
ctxt = context.get_admin_context() ctxt = context.get_admin_context()
volume = db.volume_get(ctxt, param2id(volume_id)) volume = db.volume_get(ctxt, param2id(volume_id))
host = volume['host'] host = volume['host']
@@ -912,11 +1020,12 @@ class VolumeCommands(object):
{"method": "delete_volume", {"method": "delete_volume",
"args": {"volume_id": volume['id']}}) "args": {"volume_id": volume['id']}})
@args('--volume', dest='volume_id', metavar='<volume id>',
help='Volume ID')
def reattach(self, volume_id): def reattach(self, volume_id):
"""Re-attach a volume that has previously been attached """Re-attach a volume that has previously been attached
to an instance. Typically called after a compute host to an instance. Typically called after a compute host
has been rebooted. has been rebooted."""
args: volume_id_id"""
ctxt = context.get_admin_context() ctxt = context.get_admin_context()
volume = db.volume_get(ctxt, param2id(volume_id)) volume = db.volume_get(ctxt, param2id(volume_id))
if not volume['instance_id']: if not volume['instance_id']:
@@ -943,12 +1052,23 @@ class InstanceTypeCommands(object):
val["flavorid"], val["swap"], val["rxtx_quota"], val["flavorid"], val["swap"], val["rxtx_quota"],
val["rxtx_cap"], deleted) val["rxtx_cap"], deleted)
@args('--name', dest='name', metavar='<name>',
help='Name of instance type/flavor')
@args('--memory', dest='memory', metavar='<memory size>',
help='Memory size')
@args('--cpu', dest='vcpus', metavar='<num cores>', help='Number cpus')
@args('--local_gb', dest='local_gb', metavar='<local_gb>',
help='local_gb')
@args('--flavor', dest='flavorid', metavar='<flavor id>',
help='Flavor ID')
@args('--swap', dest='swap', metavar='<swap>', help='Swap')
@args('--rxtx_quota', dest='rxtx_quota', metavar='<rxtx_quota>',
help='rxtx_quota')
@args('--rxtx_cap', dest='rxtx_cap', metavar='<rxtx_cap>',
help='rxtx_cap')
def create(self, name, memory, vcpus, local_gb, flavorid, def create(self, name, memory, vcpus, local_gb, flavorid,
swap=0, rxtx_quota=0, rxtx_cap=0): swap=0, rxtx_quota=0, rxtx_cap=0):
"""Creates instance types / flavors """Creates instance types / flavors"""
arguments: name memory vcpus local_gb flavorid [swap] [rxtx_quota]
[rxtx_cap]
"""
try: try:
instance_types.create(name, memory, vcpus, local_gb, instance_types.create(name, memory, vcpus, local_gb,
flavorid, swap, rxtx_quota, rxtx_cap) flavorid, swap, rxtx_quota, rxtx_cap)
@@ -971,9 +1091,10 @@ class InstanceTypeCommands(object):
else: else:
print "%s created" % name print "%s created" % name
@args('--name', dest='name', metavar='<name>',
help='Name of instance type/flavor')
def delete(self, name, purge=None): def delete(self, name, purge=None):
"""Marks instance types / flavors as deleted """Marks instance types / flavors as deleted"""
arguments: name"""
try: try:
if purge == "--purge": if purge == "--purge":
instance_types.purge(name) instance_types.purge(name)
@@ -992,9 +1113,10 @@ class InstanceTypeCommands(object):
else: else:
print "%s %s" % (name, verb) print "%s %s" % (name, verb)
@args('--name', dest='name', metavar='<name>',
help='Name of instance type/flavor')
def list(self, name=None): def list(self, name=None):
"""Lists all active or specific instance types / flavors """Lists all active or specific instance types / flavors"""
arguments: [name]"""
try: try:
if name is None: if name is None:
inst_types = instance_types.get_all_types() inst_types = instance_types.get_all_types()
@@ -1042,11 +1164,18 @@ class ImageCommands(object):
except Exception as exc: except Exception as exc:
print _("Failed to register %(path)s: %(exc)s") % locals() print _("Failed to register %(path)s: %(exc)s") % locals()
@args('--image', dest='image', metavar='<image>', help='Image')
@args('--kernel', dest='kernel', metavar='<kernel>', help='Kernel')
@args('--ram', dest='ramdisk', metavar='<ramdisk>', help='RAM disk')
@args('--owner', dest='owner', metavar='<owner>', help='Image owner')
@args('--name', dest='name', metavar='<name>', help='Image name')
@args('--public', dest='is_public', metavar="<'T'|'F'>",
help='Image public or not')
@args('--arch', dest='architecture', metavar='<arch>',
help='Architecture')
def all_register(self, image, kernel, ramdisk, owner, name=None, def all_register(self, image, kernel, ramdisk, owner, name=None,
is_public='T', architecture='x86_64'): is_public='T', architecture='x86_64'):
"""Uploads an image, kernel, and ramdisk into the image_service """Uploads an image, kernel, and ramdisk into the image_service"""
arguments: image kernel ramdisk owner [name] [is_public='T']
[architecture='x86_64']"""
kernel_id = self.kernel_register(kernel, owner, None, kernel_id = self.kernel_register(kernel, owner, None,
is_public, architecture) is_public, architecture)
ramdisk_id = self.ramdisk_register(ramdisk, owner, None, ramdisk_id = self.ramdisk_register(ramdisk, owner, None,
@@ -1055,31 +1184,51 @@ class ImageCommands(object):
architecture, 'ami', 'ami', architecture, 'ami', 'ami',
kernel_id, ramdisk_id) kernel_id, ramdisk_id)
@args('--path', dest='path', metavar='<path>', help='Image path')
@args('--owner', dest='owner', metavar='<owner>', help='Image owner')
@args('--name', dest='name', metavar='<name>', help='Image name')
@args('--public', dest='is_public', metavar="<'T'|'F'>",
help='Image public or not')
@args('--arch', dest='architecture', metavar='<arch>',
help='Architecture')
@args('--cont_format', dest='container_format',
metavar='<container format>',
help='Container format(default bare)')
@args('--disk_format', dest='disk_format', metavar='<disk format>',
help='Disk format(default: raw)')
@args('--kernel', dest='kernel_id', metavar='<kernel>', help='Kernel')
@args('--ram', dest='ramdisk_id', metavar='<ramdisk>', help='RAM disk')
def image_register(self, path, owner, name=None, is_public='T', def image_register(self, path, owner, name=None, is_public='T',
architecture='x86_64', container_format='bare', architecture='x86_64', container_format='bare',
disk_format='raw', kernel_id=None, ramdisk_id=None): disk_format='raw', kernel_id=None, ramdisk_id=None):
"""Uploads an image into the image_service """Uploads an image into the image_service"""
arguments: path owner [name] [is_public='T'] [architecture='x86_64']
[container_format='bare'] [disk_format='raw']
[kernel_id=None] [ramdisk_id=None]
"""
return self._register(container_format, disk_format, path, return self._register(container_format, disk_format, path,
owner, name, is_public, architecture, owner, name, is_public, architecture,
kernel_id, ramdisk_id) kernel_id, ramdisk_id)
@args('--path', dest='path', metavar='<path>', help='Image path')
@args('--owner', dest='owner', metavar='<owner>', help='Image owner')
@args('--name', dest='name', metavar='<name>', help='Image name')
@args('--public', dest='is_public', metavar="<'T'|'F'>",
help='Image public or not')
@args('--arch', dest='architecture', metavar='<arch>',
help='Architecture')
def kernel_register(self, path, owner, name=None, is_public='T', def kernel_register(self, path, owner, name=None, is_public='T',
architecture='x86_64'): architecture='x86_64'):
"""Uploads a kernel into the image_service """Uploads a kernel into the image_service"""
arguments: path owner [name] [is_public='T'] [architecture='x86_64']
"""
return self._register('aki', 'aki', path, owner, name, return self._register('aki', 'aki', path, owner, name,
is_public, architecture) is_public, architecture)
@args('--path', dest='path', metavar='<path>', help='Image path')
@args('--owner', dest='owner', metavar='<owner>', help='Image owner')
@args('--name', dest='name', metavar='<name>', help='Image name')
@args('--public', dest='is_public', metavar="<'T'|'F'>",
help='Image public or not')
@args('--arch', dest='architecture', metavar='<arch>',
help='Architecture')
def ramdisk_register(self, path, owner, name=None, is_public='T', def ramdisk_register(self, path, owner, name=None, is_public='T',
architecture='x86_64'): architecture='x86_64'):
"""Uploads a ramdisk into the image_service """Uploads a ramdisk into the image_service"""
arguments: path owner [name] [is_public='T'] [architecture='x86_64']
"""
return self._register('ari', 'ari', path, owner, name, return self._register('ari', 'ari', path, owner, name,
is_public, architecture) is_public, architecture)
@@ -1128,9 +1277,10 @@ class ImageCommands(object):
except Exception as exc: except Exception as exc:
print _("Failed to convert %(old)s: %(exc)s") % locals() print _("Failed to convert %(old)s: %(exc)s") % locals()
@args('--dir', dest='directory', metavar='<path>',
help='Images directory')
def convert(self, directory): def convert(self, directory):
"""Uploads old objectstore images in directory to new service """Uploads old objectstore images in directory to new service"""
arguments: directory"""
machine_images = {} machine_images = {}
other_images = {} other_images = {}
directory = os.path.abspath(directory) directory = os.path.abspath(directory)
@@ -1155,8 +1305,7 @@ class AgentBuildCommands(object):
def create(self, os, architecture, version, url, md5hash, def create(self, os, architecture, version, url, md5hash,
hypervisor='xen'): hypervisor='xen'):
"""Creates a new agent build. """Creates a new agent build."""
arguments: os architecture version url md5hash [hypervisor='xen']"""
ctxt = context.get_admin_context() ctxt = context.get_admin_context()
agent_build = db.agent_build_create(ctxt, agent_build = db.agent_build_create(ctxt,
{'hypervisor': hypervisor, {'hypervisor': hypervisor,
@@ -1167,8 +1316,7 @@ class AgentBuildCommands(object):
'md5hash': md5hash}) 'md5hash': md5hash})
def delete(self, os, architecture, hypervisor='xen'): def delete(self, os, architecture, hypervisor='xen'):
"""Deletes an existing agent build. """Deletes an existing agent build."""
arguments: os architecture [hypervisor='xen']"""
ctxt = context.get_admin_context() ctxt = context.get_admin_context()
agent_build_ref = db.agent_build_get_by_triple(ctxt, agent_build_ref = db.agent_build_get_by_triple(ctxt,
hypervisor, os, architecture) hypervisor, os, architecture)
@@ -1202,9 +1350,7 @@ class AgentBuildCommands(object):
def modify(self, os, architecture, version, url, md5hash, def modify(self, os, architecture, version, url, md5hash,
hypervisor='xen'): hypervisor='xen'):
"""Update an existing agent build. """Update an existing agent build."""
arguments: os architecture version url md5hash [hypervisor='xen']
"""
ctxt = context.get_admin_context() ctxt = context.get_admin_context()
agent_build_ref = db.agent_build_get_by_triple(ctxt, agent_build_ref = db.agent_build_get_by_triple(ctxt,
hypervisor, os, architecture) hypervisor, os, architecture)
@@ -1300,21 +1446,42 @@ def main():
command_object = fn() command_object = fn()
actions = methods_of(command_object) actions = methods_of(command_object)
if len(argv) < 1: if len(argv) < 1:
if hasattr(command_object, '__call__'):
action = ''
fn = command_object.__call__
else:
print script_name + " category action [<args>]" print script_name + " category action [<args>]"
print _("Available actions for %s category:") % category print _("Available actions for %s category:") % category
for k, _v in actions: for k, _v in actions:
print "\t%s" % k print "\t%s" % k
sys.exit(2) sys.exit(2)
else:
action = argv.pop(0) action = argv.pop(0)
matches = lazy_match(action, actions) matches = lazy_match(action, actions)
action, fn = matches[0] action, fn = matches[0]
# For not decorated methods
options = getattr(fn, 'options', [])
usage = "%%prog %s %s <args> [options]" % (category, action)
parser = OptionParser(usage=usage)
for ar, kw in options:
parser.add_option(*ar, **kw)
(opts, fn_args) = parser.parse_args(argv)
fn_kwargs = vars(opts)
for k, v in fn_kwargs.items():
if v is None:
del fn_kwargs[k]
# call the action with the remaining arguments # call the action with the remaining arguments
try: try:
fn(*argv) fn(*fn_args, **fn_kwargs)
sys.exit(0) sys.exit(0)
except TypeError: except TypeError:
print _("Possible wrong number of arguments supplied") print _("Possible wrong number of arguments supplied")
print "%s %s: %s" % (category, action, fn.__doc__) print fn.__doc__
parser.print_help()
raise raise
except Exception: except Exception:
print _("Command failed, please check log for more info") print _("Command failed, please check log for more info")

View File

@@ -127,7 +127,7 @@ 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.DBError:
raise exception.ProjectExists(project=name) raise exception.ProjectExists(project=name)
for member in members: for member in members:

View File

@@ -518,6 +518,14 @@ class AuthManager(object):
return drv.get_user_roles(User.safe_id(user), return drv.get_user_roles(User.safe_id(user),
Project.safe_id(project)) Project.safe_id(project))
def get_active_roles(self, user, project=None):
"""Get all active roles for context"""
if project:
roles = FLAGS.allowed_roles + ['projectmanager']
else:
roles = FLAGS.global_roles
return [role for role in roles if self.has_role(user, role, project)]
def get_project(self, pid): def get_project(self, pid):
"""Get project object by id""" """Get project object by id"""
with self.driver() as drv: with self.driver() as drv:
@@ -730,10 +738,6 @@ class AuthManager(object):
with self.driver() as drv: with self.driver() as drv:
drv.modify_user(uid, access_key, secret_key, admin) drv.modify_user(uid, access_key, secret_key, admin)
@staticmethod
def get_key_pairs(context):
return db.key_pair_get_all_by_user(context.elevated(), context.user_id)
def get_credentials(self, user, project=None, use_dmz=True): def get_credentials(self, user, project=None, use_dmz=True):
"""Get credential zip for user in project""" """Get credential zip for user in project"""
if not isinstance(user, User): if not isinstance(user, User):
@@ -785,7 +789,7 @@ class AuthManager(object):
return read_buffer return read_buffer
def get_environment_rc(self, user, project=None, use_dmz=True): def get_environment_rc(self, user, project=None, use_dmz=True):
"""Get credential zip for user in project""" """Get environment rc for user in project"""
if not isinstance(user, User): if not isinstance(user, User):
user = self.get_user(user) user = self.get_user(user)
if project is None: if project is None:

View File

@@ -343,7 +343,7 @@ DEFINE_string('lock_path', os.path.join(os.path.dirname(__file__), '../'),
'Directory for lock files') 'Directory for lock files')
DEFINE_string('logdir', None, 'output to a per-service log file in named ' DEFINE_string('logdir', None, 'output to a per-service log file in named '
'directory') 'directory')
DEFINE_integer('logfile_mode', 0644, 'Default file mode of the logs.')
DEFINE_string('sqlite_db', 'nova.sqlite', 'file name for sqlite') DEFINE_string('sqlite_db', 'nova.sqlite', 'file name for sqlite')
DEFINE_string('sql_connection', DEFINE_string('sql_connection',
'sqlite:///$state_path/$sqlite_db', 'sqlite:///$state_path/$sqlite_db',

View File

@@ -43,8 +43,8 @@ from nova import version
FLAGS = flags.FLAGS FLAGS = flags.FLAGS
flags.DEFINE_string('logging_context_format_string', flags.DEFINE_string('logging_context_format_string',
'%(asctime)s %(levelname)s %(name)s ' '%(asctime)s %(levelname)s %(name)s '
'[%(request_id)s %(user)s ' '[%(request_id)s %(user_id)s '
'%(project)s] %(message)s', '%(project_id)s] %(message)s',
'format string to use for log messages with context') 'format string to use for log messages with context')
flags.DEFINE_string('logging_default_format_string', flags.DEFINE_string('logging_default_format_string',
'%(asctime)s %(levelname)s %(name)s [-] ' '%(asctime)s %(levelname)s %(name)s [-] '
@@ -257,6 +257,7 @@ class NovaRootLogger(NovaLogger):
self.filelog = WatchedFileHandler(logpath) self.filelog = WatchedFileHandler(logpath)
self.addHandler(self.filelog) self.addHandler(self.filelog)
self.logpath = logpath self.logpath = logpath
os.chmod(self.logpath, FLAGS.logfile_mode)
else: else:
self.removeHandler(self.filelog) self.removeHandler(self.filelog)
self.addHandler(self.streamlog) self.addHandler(self.streamlog)

66
nova/rpc/__init__.py Normal file
View File

@@ -0,0 +1,66 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
# Copyright 2010 United States Government as represented by the
# Administrator of the National Aeronautics and Space Administration.
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from nova.utils import import_object
from nova.rpc.common import RemoteError, LOG
from nova import flags
FLAGS = flags.FLAGS
flags.DEFINE_string('rpc_backend',
'nova.rpc.amqp',
"The messaging module to use, defaults to AMQP.")
RPCIMPL = import_object(FLAGS.rpc_backend)
def create_connection(new=True):
return RPCIMPL.Connection.instance(new=True)
def create_consumer(conn, topic, proxy, fanout=False):
if fanout:
return RPCIMPL.FanoutAdapterConsumer(
connection=conn,
topic=topic,
proxy=proxy)
else:
return RPCIMPL.TopicAdapterConsumer(
connection=conn,
topic=topic,
proxy=proxy)
def create_consumer_set(conn, consumers):
return RPCIMPL.ConsumerSet(connection=conn, consumer_list=consumers)
def call(context, topic, msg):
return RPCIMPL.call(context, topic, msg)
def cast(context, topic, msg):
return RPCIMPL.cast(context, topic, msg)
def fanout_cast(context, topic, msg):
return RPCIMPL.fanout_cast(context, topic, msg)
def multicall(context, topic, msg):
return RPCIMPL.multicall(context, topic, msg)

View File

@@ -44,9 +44,7 @@ from nova import fakerabbit
from nova import flags from nova import flags
from nova import log as logging from nova import log as logging
from nova import utils from nova import utils
from nova.rpc.common import RemoteError, LOG
LOG = logging.getLogger('nova.rpc')
FLAGS = flags.FLAGS FLAGS = flags.FLAGS
@@ -418,25 +416,6 @@ def msg_reply(msg_id, reply=None, failure=None):
publisher.close() publisher.close()
class RemoteError(exception.Error):
"""Signifies that a remote class has raised an exception.
Containes a string representation of the type of the original exception,
the value of the original exception, and the traceback. These are
sent to the parent as a joined string so printing the exception
contains all of the relevent info.
"""
def __init__(self, exc_type, value, traceback):
self.exc_type = exc_type
self.value = value
self.traceback = traceback
super(RemoteError, self).__init__('%s %s\n%s' % (exc_type,
value,
traceback))
def _unpack_context(msg): def _unpack_context(msg):
"""Unpack context from msg.""" """Unpack context from msg."""
context_dict = {} context_dict = {}

23
nova/rpc/common.py Normal file
View File

@@ -0,0 +1,23 @@
from nova import exception
from nova import log as logging
LOG = logging.getLogger('nova.rpc')
class RemoteError(exception.Error):
"""Signifies that a remote class has raised an exception.
Containes a string representation of the type of the original exception,
the value of the original exception, and the traceback. These are
sent to the parent as a joined string so printing the exception
contains all of the relevent info.
"""
def __init__(self, exc_type, value, traceback):
self.exc_type = exc_type
self.value = value
self.traceback = traceback
super(RemoteError, self).__init__('%s %s\n%s' % (exc_type,
value,
traceback))

View File

@@ -28,6 +28,7 @@ from nova import flags
from nova import log as logging from nova import log as logging
from nova.scheduler import zone_aware_scheduler from nova.scheduler import zone_aware_scheduler
from nova import utils from nova import utils
from nova import exception
LOG = logging.getLogger('nova.scheduler.least_cost') LOG = logging.getLogger('nova.scheduler.least_cost')

View File

@@ -81,7 +81,7 @@ class ZoneAwareScheduler(driver.Scheduler):
decryptor = crypto.decryptor(FLAGS.build_plan_encryption_key) decryptor = crypto.decryptor(FLAGS.build_plan_encryption_key)
try: try:
json_entry = decryptor(blob) json_entry = decryptor(blob)
return json.dumps(entry) return json.dumps(json_entry)
except M2Crypto.EVP.EVPError: except M2Crypto.EVP.EVPError:
pass pass
return None return None

View File

@@ -42,3 +42,4 @@ FLAGS['iscsi_num_targets'].SetDefault(8)
FLAGS['verbose'].SetDefault(True) FLAGS['verbose'].SetDefault(True)
FLAGS['sqlite_db'].SetDefault("tests.sqlite") FLAGS['sqlite_db'].SetDefault("tests.sqlite")
FLAGS['use_ipv6'].SetDefault(True) FLAGS['use_ipv6'].SetDefault(True)
FLAGS['flat_network_bridge'].SetDefault('br100')

View File

@@ -23,7 +23,6 @@ from nova import context
from nova import db from nova import db
from nova import flags from nova import flags
from nova import test from nova import test
from nova.auth import manager
from nova.virt import hyperv from nova.virt import hyperv
FLAGS = flags.FLAGS FLAGS = flags.FLAGS
@@ -34,11 +33,9 @@ class HyperVTestCase(test.TestCase):
"""Test cases for the Hyper-V driver""" """Test cases for the Hyper-V driver"""
def setUp(self): def setUp(self):
super(HyperVTestCase, self).setUp() super(HyperVTestCase, self).setUp()
self.manager = manager.AuthManager() self.user_id = 'fake'
self.user = self.manager.create_user('fake', 'fake', 'fake', self.project_id = 'fake'
admin=True) self.context = context.RequestContext(self.user_id, self.project_id)
self.project = self.manager.create_project('fake', 'fake', 'fake')
self.context = context.RequestContext(self.user, self.project)
def test_create_destroy(self): def test_create_destroy(self):
"""Create a VM and destroy it""" """Create a VM and destroy it"""

View File

@@ -16,6 +16,8 @@
Tests For Zone Aware Scheduler. Tests For Zone Aware Scheduler.
""" """
import json
import nova.db import nova.db
from nova import exception from nova import exception
@@ -327,3 +329,19 @@ class ZoneAwareSchedulerTestCase(test.TestCase):
sched._provision_resource_from_blob(None, request_spec, 1, sched._provision_resource_from_blob(None, request_spec, 1,
request_spec, {}) request_spec, {})
self.assertTrue(was_called) self.assertTrue(was_called)
def test_decrypt_blob(self):
"""Test that the decrypt method works."""
fixture = FakeZoneAwareScheduler()
test_data = {"foo": "bar"}
class StubDecryptor(object):
def decryptor(self, key):
return lambda blob: blob
self.stubs.Set(zone_aware_scheduler, 'crypto',
StubDecryptor())
self.assertEqual(fixture._decrypt_blob(test_data),
json.dumps(test_data))

View File

@@ -16,7 +16,6 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
import unittest
import webob import webob
from nova import context from nova import context
@@ -41,7 +40,7 @@ class FakeApiRequest(object):
class AccessTestCase(test.TestCase): class AccessTestCase(test.TestCase):
def _env_for(self, ctxt, action): def _env_for(self, ctxt, action):
env = {} env = {}
env['ec2.context'] = ctxt env['nova.context'] = ctxt
env['ec2.request'] = FakeApiRequest(action) env['ec2.request'] = FakeApiRequest(action)
return env return env
@@ -93,7 +92,11 @@ class AccessTestCase(test.TestCase):
super(AccessTestCase, self).tearDown() super(AccessTestCase, self).tearDown()
def response_status(self, user, methodName): def response_status(self, user, methodName):
ctxt = context.RequestContext(user, self.project) roles = manager.AuthManager().get_active_roles(user, self.project)
ctxt = context.RequestContext(user.id,
self.project.id,
is_admin=user.is_admin(),
roles=roles)
environ = self._env_for(ctxt, methodName) environ = self._env_for(ctxt, methodName)
req = webob.Request.blank('/', environ) req = webob.Request.blank('/', environ)
resp = req.get_response(self.mw) resp = req.get_response(self.mw)
@@ -105,30 +108,26 @@ class AccessTestCase(test.TestCase):
def shouldDeny(self, user, methodName): def shouldDeny(self, user, methodName):
self.assertEqual(401, self.response_status(user, methodName)) self.assertEqual(401, self.response_status(user, methodName))
def test_001_allow_all(self): def test_allow_all(self):
users = [self.testadmin, self.testpmsys, self.testnet, self.testsys] users = [self.testadmin, self.testpmsys, self.testnet, self.testsys]
for user in users: for user in users:
self.shouldAllow(user, '_allow_all') self.shouldAllow(user, '_allow_all')
def test_002_allow_none(self): def test_allow_none(self):
self.shouldAllow(self.testadmin, '_allow_none') self.shouldAllow(self.testadmin, '_allow_none')
users = [self.testpmsys, self.testnet, self.testsys] users = [self.testpmsys, self.testnet, self.testsys]
for user in users: for user in users:
self.shouldDeny(user, '_allow_none') self.shouldDeny(user, '_allow_none')
def test_003_allow_project_manager(self): def test_allow_project_manager(self):
for user in [self.testadmin, self.testpmsys]: for user in [self.testadmin, self.testpmsys]:
self.shouldAllow(user, '_allow_project_manager') self.shouldAllow(user, '_allow_project_manager')
for user in [self.testnet, self.testsys]: for user in [self.testnet, self.testsys]:
self.shouldDeny(user, '_allow_project_manager') self.shouldDeny(user, '_allow_project_manager')
def test_004_allow_sys_and_net(self): def test_allow_sys_and_net(self):
for user in [self.testadmin, self.testnet, self.testsys]: for user in [self.testadmin, self.testnet, self.testsys]:
self.shouldAllow(user, '_allow_sys_and_net') self.shouldAllow(user, '_allow_sys_and_net')
# denied because it doesn't have the per project sysadmin # denied because it doesn't have the per project sysadmin
for user in [self.testpmsys]: for user in [self.testpmsys]:
self.shouldDeny(user, '_allow_sys_and_net') self.shouldDeny(user, '_allow_sys_and_net')
if __name__ == "__main__":
# TODO: Implement use_fake as an option
unittest.main()

View File

@@ -25,7 +25,6 @@ from nova import log as logging
from nova import rpc from nova import rpc
from nova import test from nova import test
from nova import utils from nova import utils
from nova.auth import manager
from nova.api.ec2 import admin from nova.api.ec2 import admin
from nova.image import fake from nova.image import fake
@@ -39,7 +38,7 @@ class AdminApiTestCase(test.TestCase):
super(AdminApiTestCase, self).setUp() super(AdminApiTestCase, self).setUp()
self.flags(connection_type='fake') self.flags(connection_type='fake')
self.conn = rpc.Connection.instance() self.conn = rpc.create_connection()
# set up our cloud # set up our cloud
self.api = admin.AdminController() self.api = admin.AdminController()
@@ -51,11 +50,11 @@ class AdminApiTestCase(test.TestCase):
self.volume = self.start_service('volume') self.volume = self.start_service('volume')
self.image_service = utils.import_object(FLAGS.image_service) self.image_service = utils.import_object(FLAGS.image_service)
self.manager = manager.AuthManager() self.user_id = 'admin'
self.user = self.manager.create_user('admin', 'admin', 'admin', True) self.project_id = 'admin'
self.project = self.manager.create_project('proj', 'admin', 'proj') self.context = context.RequestContext(self.user_id,
self.context = context.RequestContext(user=self.user, self.project_id,
project=self.project) True)
def fake_show(meh, context, id): def fake_show(meh, context, id):
return {'id': 1, 'properties': {'kernel_id': 1, 'ramdisk_id': 1, return {'id': 1, 'properties': {'kernel_id': 1, 'ramdisk_id': 1,
@@ -73,11 +72,6 @@ class AdminApiTestCase(test.TestCase):
self.stubs.Set(rpc, 'cast', finish_cast) self.stubs.Set(rpc, 'cast', finish_cast)
def tearDown(self):
self.manager.delete_project(self.project)
self.manager.delete_user(self.user)
super(AdminApiTestCase, self).tearDown()
def test_block_external_ips(self): def test_block_external_ips(self):
"""Make sure provider firewall rules are created.""" """Make sure provider firewall rules are created."""
result = self.api.block_external_addresses(self.context, '1.1.1.1/32') result = self.api.block_external_addresses(self.context, '1.1.1.1/32')

View File

@@ -31,11 +31,11 @@ from nova import block_device
from nova import context from nova import context
from nova import exception from nova import exception
from nova import test from nova import test
from nova import wsgi
from nova.api import ec2 from nova.api import ec2
from nova.api.ec2 import apirequest from nova.api.ec2 import apirequest
from nova.api.ec2 import cloud from nova.api.ec2 import cloud
from nova.api.ec2 import ec2utils from nova.api.ec2 import ec2utils
from nova.auth import manager
class FakeHttplibSocket(object): class FakeHttplibSocket(object):
@@ -195,9 +195,12 @@ class ApiEc2TestCase(test.TestCase):
"""Unit test for the cloud controller on an EC2 API""" """Unit test for the cloud controller on an EC2 API"""
def setUp(self): def setUp(self):
super(ApiEc2TestCase, self).setUp() super(ApiEc2TestCase, self).setUp()
self.manager = manager.AuthManager()
self.host = '127.0.0.1' self.host = '127.0.0.1'
self.app = ec2.Authenticate(ec2.Requestify(ec2.Executor(), # NOTE(vish): skipping the Authorizer
roles = ['sysadmin', 'netadmin']
ctxt = context.RequestContext('fake', 'fake', roles=roles)
self.app = wsgi.InjectContext(ctxt,
ec2.Requestify(ec2.Authorizer(ec2.Executor()),
'nova.api.ec2.cloud.CloudController')) 'nova.api.ec2.cloud.CloudController'))
def expect_http(self, host=None, is_secure=False, api_version=None): def expect_http(self, host=None, is_secure=False, api_version=None):
@@ -216,6 +219,10 @@ class ApiEc2TestCase(test.TestCase):
self.http = FakeHttplibConnection( self.http = FakeHttplibConnection(
self.app, '%s:8773' % (self.host), False) self.app, '%s:8773' % (self.host), False)
# pylint: disable=E1103 # pylint: disable=E1103
if boto.Version >= '2':
self.ec2.new_http_connection(host or '%s:8773' % (self.host),
is_secure).AndReturn(self.http)
else:
self.ec2.new_http_connection(host, is_secure).AndReturn(self.http) self.ec2.new_http_connection(host, is_secure).AndReturn(self.http)
return self.http return self.http
@@ -245,39 +252,25 @@ class ApiEc2TestCase(test.TestCase):
self.expect_http(api_version='2010-10-30') self.expect_http(api_version='2010-10-30')
self.mox.ReplayAll() self.mox.ReplayAll()
user = self.manager.create_user('fake', 'fake', 'fake')
project = self.manager.create_project('fake', 'fake', 'fake')
# Any request should be fine # Any request should be fine
self.ec2.get_all_instances() self.ec2.get_all_instances()
self.assertTrue(self.ec2.APIVersion in self.http.getresponsebody(), self.assertTrue(self.ec2.APIVersion in self.http.getresponsebody(),
'The version in the xmlns of the response does ' 'The version in the xmlns of the response does '
'not match the API version given in the request.') 'not match the API version given in the request.')
self.manager.delete_project(project)
self.manager.delete_user(user)
def test_describe_instances(self): def test_describe_instances(self):
"""Test that, after creating a user and a project, the describe """Test that, after creating a user and a project, the describe
instances call to the API works properly""" instances call to the API works properly"""
self.expect_http() self.expect_http()
self.mox.ReplayAll() self.mox.ReplayAll()
user = self.manager.create_user('fake', 'fake', 'fake')
project = self.manager.create_project('fake', 'fake', 'fake')
self.assertEqual(self.ec2.get_all_instances(), []) self.assertEqual(self.ec2.get_all_instances(), [])
self.manager.delete_project(project)
self.manager.delete_user(user)
def test_terminate_invalid_instance(self): def test_terminate_invalid_instance(self):
"""Attempt to terminate an invalid instance""" """Attempt to terminate an invalid instance"""
self.expect_http() self.expect_http()
self.mox.ReplayAll() self.mox.ReplayAll()
user = self.manager.create_user('fake', 'fake', 'fake')
project = self.manager.create_project('fake', 'fake', 'fake')
self.assertRaises(EC2ResponseError, self.ec2.terminate_instances, self.assertRaises(EC2ResponseError, self.ec2.terminate_instances,
"i-00000005") "i-00000005")
self.manager.delete_project(project)
self.manager.delete_user(user)
def test_get_all_key_pairs(self): def test_get_all_key_pairs(self):
"""Test that, after creating a user and project and generating """Test that, after creating a user and project and generating
@@ -286,16 +279,12 @@ class ApiEc2TestCase(test.TestCase):
self.mox.ReplayAll() self.mox.ReplayAll()
keyname = "".join(random.choice("sdiuisudfsdcnpaqwertasd") \ keyname = "".join(random.choice("sdiuisudfsdcnpaqwertasd") \
for x in range(random.randint(4, 8))) for x in range(random.randint(4, 8)))
user = self.manager.create_user('fake', 'fake', 'fake')
project = self.manager.create_project('fake', 'fake', 'fake')
# NOTE(vish): create depends on pool, so call helper directly # NOTE(vish): create depends on pool, so call helper directly
cloud._gen_key(context.get_admin_context(), user.id, keyname) cloud._gen_key(context.get_admin_context(), 'fake', keyname)
rv = self.ec2.get_all_key_pairs() rv = self.ec2.get_all_key_pairs()
results = [k for k in rv if k.name == keyname] results = [k for k in rv if k.name == keyname]
self.assertEquals(len(results), 1) self.assertEquals(len(results), 1)
self.manager.delete_project(project)
self.manager.delete_user(user)
def test_create_duplicate_key_pair(self): def test_create_duplicate_key_pair(self):
"""Test that, after successfully generating a keypair, """Test that, after successfully generating a keypair,
@@ -304,8 +293,6 @@ class ApiEc2TestCase(test.TestCase):
self.mox.ReplayAll() self.mox.ReplayAll()
keyname = "".join(random.choice("sdiuisudfsdcnpaqwertasd") \ keyname = "".join(random.choice("sdiuisudfsdcnpaqwertasd") \
for x in range(random.randint(4, 8))) for x in range(random.randint(4, 8)))
user = self.manager.create_user('fake', 'fake', 'fake')
project = self.manager.create_project('fake', 'fake', 'fake')
# NOTE(vish): create depends on pool, so call helper directly # NOTE(vish): create depends on pool, so call helper directly
self.ec2.create_key_pair('test') self.ec2.create_key_pair('test')
@@ -324,27 +311,16 @@ class ApiEc2TestCase(test.TestCase):
"""Test that we can retrieve security groups""" """Test that we can retrieve security groups"""
self.expect_http() self.expect_http()
self.mox.ReplayAll() self.mox.ReplayAll()
user = self.manager.create_user('fake', 'fake', 'fake', admin=True)
project = self.manager.create_project('fake', 'fake', 'fake')
rv = self.ec2.get_all_security_groups() rv = self.ec2.get_all_security_groups()
self.assertEquals(len(rv), 1) self.assertEquals(len(rv), 1)
self.assertEquals(rv[0].name, 'default') self.assertEquals(rv[0].name, 'default')
self.manager.delete_project(project)
self.manager.delete_user(user)
def test_create_delete_security_group(self): def test_create_delete_security_group(self):
"""Test that we can create a security group""" """Test that we can create a security group"""
self.expect_http() self.expect_http()
self.mox.ReplayAll() self.mox.ReplayAll()
user = self.manager.create_user('fake', 'fake', 'fake', admin=True)
project = self.manager.create_project('fake', 'fake', 'fake')
# At the moment, you need both of these to actually be netadmin
self.manager.add_role('fake', 'netadmin')
project.add_role('fake', 'netadmin')
security_group_name = "".join(random.choice("sdiuisudfsdcnpaqwertasd") security_group_name = "".join(random.choice("sdiuisudfsdcnpaqwertasd")
for x in range(random.randint(4, 8))) for x in range(random.randint(4, 8)))
@@ -363,9 +339,6 @@ class ApiEc2TestCase(test.TestCase):
self.ec2.delete_security_group(security_group_name) self.ec2.delete_security_group(security_group_name)
self.manager.delete_project(project)
self.manager.delete_user(user)
def test_authorize_revoke_security_group_cidr(self): def test_authorize_revoke_security_group_cidr(self):
""" """
Test that we can add and remove CIDR based rules Test that we can add and remove CIDR based rules
@@ -373,12 +346,6 @@ class ApiEc2TestCase(test.TestCase):
""" """
self.expect_http() self.expect_http()
self.mox.ReplayAll() self.mox.ReplayAll()
user = self.manager.create_user('fake', 'fake', 'fake')
project = self.manager.create_project('fake', 'fake', 'fake')
# At the moment, you need both of these to actually be netadmin
self.manager.add_role('fake', 'netadmin')
project.add_role('fake', 'netadmin')
security_group_name = "".join(random.choice("sdiuisudfsdcnpaqwertasd") security_group_name = "".join(random.choice("sdiuisudfsdcnpaqwertasd")
for x in range(random.randint(4, 8))) for x in range(random.randint(4, 8)))
@@ -425,9 +392,6 @@ class ApiEc2TestCase(test.TestCase):
self.assertEqual(len(rv), 1) self.assertEqual(len(rv), 1)
self.assertEqual(rv[0].name, 'default') self.assertEqual(rv[0].name, 'default')
self.manager.delete_project(project)
self.manager.delete_user(user)
return return
def test_authorize_revoke_security_group_cidr_v6(self): def test_authorize_revoke_security_group_cidr_v6(self):
@@ -437,12 +401,6 @@ class ApiEc2TestCase(test.TestCase):
""" """
self.expect_http() self.expect_http()
self.mox.ReplayAll() self.mox.ReplayAll()
user = self.manager.create_user('fake', 'fake', 'fake')
project = self.manager.create_project('fake', 'fake', 'fake')
# At the moment, you need both of these to actually be netadmin
self.manager.add_role('fake', 'netadmin')
project.add_role('fake', 'netadmin')
security_group_name = "".join(random.choice("sdiuisudfsdcnpaqwertasd") security_group_name = "".join(random.choice("sdiuisudfsdcnpaqwertasd")
for x in range(random.randint(4, 8))) for x in range(random.randint(4, 8)))
@@ -488,9 +446,6 @@ class ApiEc2TestCase(test.TestCase):
self.assertEqual(len(rv), 1) self.assertEqual(len(rv), 1)
self.assertEqual(rv[0].name, 'default') self.assertEqual(rv[0].name, 'default')
self.manager.delete_project(project)
self.manager.delete_user(user)
return return
def test_authorize_revoke_security_group_foreign_group(self): def test_authorize_revoke_security_group_foreign_group(self):
@@ -500,12 +455,6 @@ class ApiEc2TestCase(test.TestCase):
""" """
self.expect_http() self.expect_http()
self.mox.ReplayAll() self.mox.ReplayAll()
user = self.manager.create_user('fake', 'fake', 'fake', admin=True)
project = self.manager.create_project('fake', 'fake', 'fake')
# At the moment, you need both of these to actually be netadmin
self.manager.add_role('fake', 'netadmin')
project.add_role('fake', 'netadmin')
rand_string = 'sdiuisudfsdcnpaqwertasd' rand_string = 'sdiuisudfsdcnpaqwertasd'
security_group_name = "".join(random.choice(rand_string) security_group_name = "".join(random.choice(rand_string)
@@ -559,8 +508,3 @@ class ApiEc2TestCase(test.TestCase):
self.mox.ReplayAll() self.mox.ReplayAll()
self.ec2.delete_security_group(security_group_name) self.ec2.delete_security_group(security_group_name)
self.manager.delete_project(project)
self.manager.delete_user(user)
return

View File

@@ -102,7 +102,7 @@ class _AuthManagerBaseTestCase(test.TestCase):
self.assertEqual('classified', u.secret) self.assertEqual('classified', u.secret)
self.assertEqual('private-party', u.access) self.assertEqual('private-party', u.access)
def test_004_signature_is_valid(self): def test_signature_is_valid(self):
with user_generator(self.manager, name='admin', secret='admin', with user_generator(self.manager, name='admin', secret='admin',
access='admin'): access='admin'):
with project_generator(self.manager, name="admin", with project_generator(self.manager, name="admin",
@@ -141,15 +141,14 @@ class _AuthManagerBaseTestCase(test.TestCase):
'127.0.0.1', '127.0.0.1',
'/services/Cloud')) '/services/Cloud'))
def test_005_can_get_credentials(self): def test_can_get_credentials(self):
return st = {'access': 'access', 'secret': 'secret'}
credentials = self.manager.get_user('test1').get_credentials() with user_and_project_generator(self.manager, user_state=st) as (u, p):
self.assertEqual(credentials, credentials = self.manager.get_environment_rc(u, p)
'export EC2_ACCESS_KEY="access"\n' + LOG.debug(credentials)
'export EC2_SECRET_KEY="secret"\n' + self.assertTrue('export EC2_ACCESS_KEY="access:testproj"\n'
'export EC2_URL="http://127.0.0.1:8773/services/Cloud"\n' + in credentials)
'export S3_URL="http://127.0.0.1:3333/"\n' + self.assertTrue('export EC2_SECRET_KEY="secret"\n' in credentials)
'export EC2_USER_ID="test1"\n')
def test_can_list_users(self): def test_can_list_users(self):
with user_generator(self.manager): with user_generator(self.manager):

View File

@@ -36,7 +36,6 @@ from nova import network
from nova import rpc from nova import rpc
from nova import test from nova import test
from nova import utils from nova import utils
from nova.auth import manager
from nova.api.ec2 import cloud from nova.api.ec2 import cloud
from nova.api.ec2 import ec2utils from nova.api.ec2 import ec2utils
from nova.image import fake from nova.image import fake
@@ -52,7 +51,7 @@ class CloudTestCase(test.TestCase):
self.flags(connection_type='fake', self.flags(connection_type='fake',
stub_network=True) stub_network=True)
self.conn = rpc.Connection.instance() self.conn = rpc.create_connection()
# set up our cloud # set up our cloud
self.cloud = cloud.CloudController() self.cloud = cloud.CloudController()
@@ -64,12 +63,11 @@ class CloudTestCase(test.TestCase):
self.volume = self.start_service('volume') self.volume = self.start_service('volume')
self.image_service = utils.import_object(FLAGS.image_service) self.image_service = utils.import_object(FLAGS.image_service)
self.manager = manager.AuthManager() self.user_id = 'fake'
self.user = self.manager.create_user('admin', 'admin', 'admin', True) self.project_id = 'fake'
self.project = self.manager.create_project('proj', 'admin', 'proj') self.context = context.RequestContext(self.user_id,
self.context = context.RequestContext(user=self.user, self.project_id,
project=self.project) True)
host = self.network.host
def fake_show(meh, context, id): def fake_show(meh, context, id):
return {'id': 1, 'container_format': 'ami', return {'id': 1, 'container_format': 'ami',
@@ -89,17 +87,15 @@ class CloudTestCase(test.TestCase):
self.stubs.Set(rpc, 'cast', finish_cast) self.stubs.Set(rpc, 'cast', finish_cast)
def tearDown(self): def tearDown(self):
networks = db.project_get_networks(self.context, self.project.id, networks = db.project_get_networks(self.context, self.project_id,
associate=False) associate=False)
for network in networks: for network in networks:
db.network_disassociate(self.context, network['id']) db.network_disassociate(self.context, network['id'])
self.manager.delete_project(self.project)
self.manager.delete_user(self.user)
super(CloudTestCase, self).tearDown() super(CloudTestCase, self).tearDown()
def _create_key(self, name): def _create_key(self, name):
# NOTE(vish): create depends on pool, so just call helper directly # NOTE(vish): create depends on pool, so just call helper directly
return cloud._gen_key(self.context, self.context.user.id, name) return cloud._gen_key(self.context, self.context.user_id, name)
def test_describe_regions(self): def test_describe_regions(self):
"""Makes sure describe regions runs without raising an exception""" """Makes sure describe regions runs without raising an exception"""
@@ -123,7 +119,6 @@ class CloudTestCase(test.TestCase):
public_ip=address) public_ip=address)
db.floating_ip_destroy(self.context, address) db.floating_ip_destroy(self.context, address)
@test.skip_test("Skipping this pending future merge")
def test_allocate_address(self): def test_allocate_address(self):
address = "10.10.10.10" address = "10.10.10.10"
allocate = self.cloud.allocate_address allocate = self.cloud.allocate_address
@@ -163,13 +158,10 @@ class CloudTestCase(test.TestCase):
# ApiError: Floating ip is in use. Disassociate it before releasing. # ApiError: Floating ip is in use. Disassociate it before releasing.
self.assertRaises(exception.ApiError, release, self.context, address) self.assertRaises(exception.ApiError, release, self.context, address)
@test.skip_test("Skipping this pending future merge")
def test_associate_disassociate_address(self): def test_associate_disassociate_address(self):
"""Verifies associate runs cleanly without raising an exception""" """Verifies associate runs cleanly without raising an exception"""
address = "10.10.10.10" address = "10.10.10.10"
db.floating_ip_create(self.context, db.floating_ip_create(self.context, {'address': address})
{'address': address,
'host': self.network.host})
self.cloud.allocate_address(self.context) self.cloud.allocate_address(self.context)
# TODO(jkoelker) Probably need to query for instance_type_id and # TODO(jkoelker) Probably need to query for instance_type_id and
# make sure we get a valid one # make sure we get a valid one
@@ -177,11 +169,14 @@ class CloudTestCase(test.TestCase):
'instance_type_id': 1}) 'instance_type_id': 1})
networks = db.network_get_all(self.context) networks = db.network_get_all(self.context)
for network in networks: for network in networks:
self.network.set_network_host(self.context, network['id']) db.network_update(self.context, network['id'],
{'host': self.network.host})
project_id = self.context.project_id project_id = self.context.project_id
type_id = inst['instance_type_id'] type_id = inst['instance_type_id']
ips = self.network.allocate_for_instance(self.context, ips = self.network.allocate_for_instance(self.context,
instance_id=inst['id'], instance_id=inst['id'],
host=inst['host'],
vpn=None,
instance_type_id=type_id, instance_type_id=type_id,
project_id=project_id) project_id=project_id)
# TODO(jkoelker) Make this mas bueno # TODO(jkoelker) Make this mas bueno
@@ -271,12 +266,61 @@ class CloudTestCase(test.TestCase):
delete = self.cloud.delete_security_group delete = self.cloud.delete_security_group
self.assertRaises(exception.ApiError, delete, self.context) self.assertRaises(exception.ApiError, delete, self.context)
def test_authorize_revoke_security_group_ingress(self): def test_authorize_security_group_ingress(self):
kwargs = {'project_id': self.context.project_id, 'name': 'test'} kwargs = {'project_id': self.context.project_id, 'name': 'test'}
sec = db.security_group_create(self.context, kwargs) sec = db.security_group_create(self.context, kwargs)
authz = self.cloud.authorize_security_group_ingress authz = self.cloud.authorize_security_group_ingress
kwargs = {'to_port': '999', 'from_port': '999', 'ip_protocol': 'tcp'} kwargs = {'to_port': '999', 'from_port': '999', 'ip_protocol': 'tcp'}
authz(self.context, group_name=sec['name'], **kwargs) self.assertTrue(authz(self.context, group_name=sec['name'], **kwargs))
def test_authorize_security_group_ingress_ip_permissions_ip_ranges(self):
kwargs = {'project_id': self.context.project_id, 'name': 'test'}
sec = db.security_group_create(self.context, kwargs)
authz = self.cloud.authorize_security_group_ingress
kwargs = {'ip_permissions': [{'to_port': 81, 'from_port': 81,
'ip_ranges':
{'1': {'cidr_ip': u'0.0.0.0/0'},
'2': {'cidr_ip': u'10.10.10.10/32'}},
'ip_protocol': u'tcp'}]}
self.assertTrue(authz(self.context, group_name=sec['name'], **kwargs))
def test_authorize_security_group_fail_missing_source_group(self):
kwargs = {'project_id': self.context.project_id, 'name': 'test'}
sec = db.security_group_create(self.context, kwargs)
authz = self.cloud.authorize_security_group_ingress
kwargs = {'ip_permissions': [{'to_port': 81, 'from_port': 81,
'ip_ranges':{'1': {'cidr_ip': u'0.0.0.0/0'},
'2': {'cidr_ip': u'10.10.10.10/32'}},
'groups': {'1': {'user_id': u'someuser',
'group_name': u'somegroup1'}},
'ip_protocol': u'tcp'}]}
self.assertRaises(exception.SecurityGroupNotFound, authz,
self.context, group_name=sec['name'], **kwargs)
def test_authorize_security_group_ingress_ip_permissions_groups(self):
kwargs = {'project_id': self.context.project_id, 'name': 'test'}
sec = db.security_group_create(self.context,
{'project_id': 'someuser',
'name': 'somegroup1'})
sec = db.security_group_create(self.context,
{'project_id': 'someuser',
'name': 'othergroup2'})
sec = db.security_group_create(self.context, kwargs)
authz = self.cloud.authorize_security_group_ingress
kwargs = {'ip_permissions': [{'to_port': 81, 'from_port': 81,
'groups': {'1': {'user_id': u'someuser',
'group_name': u'somegroup1'},
'2': {'user_id': u'someuser',
'group_name': u'othergroup2'}},
'ip_protocol': u'tcp'}]}
self.assertTrue(authz(self.context, group_name=sec['name'], **kwargs))
def test_revoke_security_group_ingress(self):
kwargs = {'project_id': self.context.project_id, 'name': 'test'}
sec = db.security_group_create(self.context, kwargs)
authz = self.cloud.authorize_security_group_ingress
kwargs = {'to_port': '999', 'from_port': '999', 'ip_protocol': 'tcp'}
authz(self.context, group_id=sec['id'], **kwargs)
revoke = self.cloud.revoke_security_group_ingress revoke = self.cloud.revoke_security_group_ingress
self.assertTrue(revoke(self.context, group_name=sec['name'], **kwargs)) self.assertTrue(revoke(self.context, group_name=sec['name'], **kwargs))
@@ -368,8 +412,6 @@ class CloudTestCase(test.TestCase):
db.service_destroy(self.context, service1['id']) db.service_destroy(self.context, service1['id'])
db.service_destroy(self.context, service2['id']) db.service_destroy(self.context, service2['id'])
# NOTE(jkoelker): this test relies on fixed_ip being in instances
@test.skip_test("EC2 stuff needs fixed_ip in instance_ref")
def test_describe_snapshots(self): def test_describe_snapshots(self):
"""Makes sure describe_snapshots works and filters results.""" """Makes sure describe_snapshots works and filters results."""
vol = db.volume_create(self.context, {}) vol = db.volume_create(self.context, {})
@@ -941,7 +983,7 @@ class CloudTestCase(test.TestCase):
key = RSA.load_key_string(private_key, callback=lambda: None) key = RSA.load_key_string(private_key, callback=lambda: None)
bio = BIO.MemoryBuffer() bio = BIO.MemoryBuffer()
public_key = db.key_pair_get(self.context, public_key = db.key_pair_get(self.context,
self.context.user.id, self.context.user_id,
'test')['public_key'] 'test')['public_key']
key.save_pub_key_bio(bio) key.save_pub_key_bio(bio)
converted = crypto.ssl_pub_to_ssh_pub(bio.read()) converted = crypto.ssl_pub_to_ssh_pub(bio.read())
@@ -965,7 +1007,7 @@ class CloudTestCase(test.TestCase):
'mytestfprint') 'mytestfprint')
self.assertTrue(result1) self.assertTrue(result1)
keydata = db.key_pair_get(self.context, keydata = db.key_pair_get(self.context,
self.context.user.id, self.context.user_id,
'testimportkey1') 'testimportkey1')
self.assertEqual('mytestpubkey', keydata['public_key']) self.assertEqual('mytestpubkey', keydata['public_key'])
self.assertEqual('mytestfprint', keydata['fingerprint']) self.assertEqual('mytestfprint', keydata['fingerprint'])
@@ -982,7 +1024,7 @@ class CloudTestCase(test.TestCase):
dummypub) dummypub)
self.assertTrue(result2) self.assertTrue(result2)
keydata = db.key_pair_get(self.context, keydata = db.key_pair_get(self.context,
self.context.user.id, self.context.user_id,
'testimportkey2') 'testimportkey2')
self.assertEqual(dummypub, keydata['public_key']) self.assertEqual(dummypub, keydata['public_key'])
self.assertEqual(dummyfprint, keydata['fingerprint']) self.assertEqual(dummyfprint, keydata['fingerprint'])
@@ -992,12 +1034,6 @@ class CloudTestCase(test.TestCase):
self.cloud.delete_key_pair(self.context, 'test') self.cloud.delete_key_pair(self.context, 'test')
def test_run_instances(self): def test_run_instances(self):
# stub out the rpc call
def stub_cast(*args, **kwargs):
pass
self.stubs.Set(rpc, 'cast', stub_cast)
kwargs = {'image_id': FLAGS.default_image, kwargs = {'image_id': FLAGS.default_image,
'instance_type': FLAGS.default_instance_type, 'instance_type': FLAGS.default_instance_type,
'max_count': 1} 'max_count': 1}
@@ -1007,7 +1043,7 @@ class CloudTestCase(test.TestCase):
self.assertEqual(instance['imageId'], 'ami-00000001') self.assertEqual(instance['imageId'], 'ami-00000001')
self.assertEqual(instance['displayName'], 'Server 1') self.assertEqual(instance['displayName'], 'Server 1')
self.assertEqual(instance['instanceId'], 'i-00000001') self.assertEqual(instance['instanceId'], 'i-00000001')
self.assertEqual(instance['instanceState']['name'], 'scheduling') self.assertEqual(instance['instanceState']['name'], 'running')
self.assertEqual(instance['instanceType'], 'm1.small') self.assertEqual(instance['instanceType'], 'm1.small')
def test_run_instances_image_state_none(self): def test_run_instances_image_state_none(self):
@@ -1079,16 +1115,15 @@ class CloudTestCase(test.TestCase):
self.assertEqual('c00l 1m4g3', inst['display_name']) self.assertEqual('c00l 1m4g3', inst['display_name'])
db.instance_destroy(self.context, inst['id']) db.instance_destroy(self.context, inst['id'])
# NOTE(jkoelker): This test relies on mac_address in instance
@test.skip_test("EC2 stuff needs mac_address in instance_ref")
def test_update_of_instance_wont_update_private_fields(self): def test_update_of_instance_wont_update_private_fields(self):
inst = db.instance_create(self.context, {}) inst = db.instance_create(self.context, {})
host = inst['host']
ec2_id = ec2utils.id_to_ec2_id(inst['id']) ec2_id = ec2utils.id_to_ec2_id(inst['id'])
self.cloud.update_instance(self.context, ec2_id, self.cloud.update_instance(self.context, ec2_id,
display_name='c00l 1m4g3', display_name='c00l 1m4g3',
mac_address='DE:AD:BE:EF') host='otherhost')
inst = db.instance_get(self.context, inst['id']) inst = db.instance_get(self.context, inst['id'])
self.assertEqual(None, inst['mac_address']) self.assertEqual(host, inst['host'])
db.instance_destroy(self.context, inst['id']) db.instance_destroy(self.context, inst['id'])
def test_update_of_volume_display_fields(self): def test_update_of_volume_display_fields(self):
@@ -1144,7 +1179,6 @@ class CloudTestCase(test.TestCase):
elevated = self.context.elevated(read_deleted=True) elevated = self.context.elevated(read_deleted=True)
self._wait_for_state(elevated, instance_id, is_deleted) self._wait_for_state(elevated, instance_id, is_deleted)
@test.skip_test("skipping, test is hanging with multinic for rpc reasons")
def test_stop_start_instance(self): def test_stop_start_instance(self):
"""Makes sure stop/start instance works""" """Makes sure stop/start instance works"""
# enforce periodic tasks run in short time to avoid wait for 60s. # enforce periodic tasks run in short time to avoid wait for 60s.
@@ -1202,7 +1236,6 @@ class CloudTestCase(test.TestCase):
self.assertEqual(vol['status'], "available") self.assertEqual(vol['status'], "available")
self.assertEqual(vol['attach_status'], "detached") self.assertEqual(vol['attach_status'], "detached")
@test.skip_test("skipping, test is hanging with multinic for rpc reasons")
def test_stop_start_with_volume(self): def test_stop_start_with_volume(self):
"""Make sure run instance with block device mapping works""" """Make sure run instance with block device mapping works"""
@@ -1271,7 +1304,6 @@ class CloudTestCase(test.TestCase):
self._restart_compute_service() self._restart_compute_service()
@test.skip_test("skipping, test is hanging with multinic for rpc reasons")
def test_stop_with_attached_volume(self): def test_stop_with_attached_volume(self):
"""Make sure attach info is reflected to block device mapping""" """Make sure attach info is reflected to block device mapping"""
# enforce periodic tasks run in short time to avoid wait for 60s. # enforce periodic tasks run in short time to avoid wait for 60s.
@@ -1347,7 +1379,6 @@ class CloudTestCase(test.TestCase):
greenthread.sleep(0.3) greenthread.sleep(0.3)
return result['snapshotId'] return result['snapshotId']
@test.skip_test("skipping, test is hanging with multinic for rpc reasons")
def test_run_with_snapshot(self): def test_run_with_snapshot(self):
"""Makes sure run/stop/start instance with snapshot works.""" """Makes sure run/stop/start instance with snapshot works."""
vol = self._volume_create() vol = self._volume_create()

View File

@@ -19,10 +19,6 @@
Tests For Compute Tests For Compute
""" """
import mox
import stubout
from nova.auth import manager
from nova import compute from nova import compute
from nova.compute import instance_types from nova.compute import instance_types
from nova.compute import manager as compute_manager from nova.compute import manager as compute_manager
@@ -67,10 +63,9 @@ class ComputeTestCase(test.TestCase):
network_manager='nova.network.manager.FlatManager') network_manager='nova.network.manager.FlatManager')
self.compute = utils.import_object(FLAGS.compute_manager) self.compute = utils.import_object(FLAGS.compute_manager)
self.compute_api = compute.API() self.compute_api = compute.API()
self.manager = manager.AuthManager() self.user_id = 'fake'
self.user = self.manager.create_user('fake', 'fake', 'fake') self.project_id = 'fake'
self.project = self.manager.create_project('fake', 'fake', 'fake') self.context = context.RequestContext(self.user_id, self.project_id)
self.context = context.RequestContext('fake', 'fake', False)
test_notifier.NOTIFICATIONS = [] test_notifier.NOTIFICATIONS = []
def fake_show(meh, context, id): def fake_show(meh, context, id):
@@ -78,19 +73,14 @@ class ComputeTestCase(test.TestCase):
self.stubs.Set(nova.image.fake._FakeImageService, 'show', fake_show) self.stubs.Set(nova.image.fake._FakeImageService, 'show', fake_show)
def tearDown(self):
self.manager.delete_user(self.user)
self.manager.delete_project(self.project)
super(ComputeTestCase, self).tearDown()
def _create_instance(self, params={}): def _create_instance(self, params={}):
"""Create a test instance""" """Create a test instance"""
inst = {} inst = {}
inst['image_ref'] = 1 inst['image_ref'] = 1
inst['reservation_id'] = 'r-fakeres' inst['reservation_id'] = 'r-fakeres'
inst['launch_time'] = '10' inst['launch_time'] = '10'
inst['user_id'] = self.user.id inst['user_id'] = self.user_id
inst['project_id'] = self.project.id inst['project_id'] = self.project_id
type_id = instance_types.get_instance_type_by_name('m1.tiny')['id'] type_id = instance_types.get_instance_type_by_name('m1.tiny')['id']
inst['instance_type_id'] = type_id inst['instance_type_id'] = type_id
inst['ami_launch_index'] = 0 inst['ami_launch_index'] = 0
@@ -115,8 +105,8 @@ class ComputeTestCase(test.TestCase):
def _create_group(self): def _create_group(self):
values = {'name': 'testgroup', values = {'name': 'testgroup',
'description': 'testgroup', 'description': 'testgroup',
'user_id': self.user.id, 'user_id': self.user_id,
'project_id': self.project.id} 'project_id': self.project_id}
return db.security_group_create(self.context, values) return db.security_group_create(self.context, values)
def _get_dummy_instance(self): def _get_dummy_instance(self):
@@ -350,8 +340,8 @@ class ComputeTestCase(test.TestCase):
self.assertEquals(msg['priority'], 'INFO') self.assertEquals(msg['priority'], 'INFO')
self.assertEquals(msg['event_type'], 'compute.instance.create') self.assertEquals(msg['event_type'], 'compute.instance.create')
payload = msg['payload'] payload = msg['payload']
self.assertEquals(payload['tenant_id'], self.project.id) self.assertEquals(payload['tenant_id'], self.project_id)
self.assertEquals(payload['user_id'], self.user.id) self.assertEquals(payload['user_id'], self.user_id)
self.assertEquals(payload['instance_id'], instance_id) self.assertEquals(payload['instance_id'], instance_id)
self.assertEquals(payload['instance_type'], 'm1.tiny') self.assertEquals(payload['instance_type'], 'm1.tiny')
type_id = instance_types.get_instance_type_by_name('m1.tiny')['id'] type_id = instance_types.get_instance_type_by_name('m1.tiny')['id']
@@ -374,8 +364,8 @@ class ComputeTestCase(test.TestCase):
self.assertEquals(msg['priority'], 'INFO') self.assertEquals(msg['priority'], 'INFO')
self.assertEquals(msg['event_type'], 'compute.instance.delete') self.assertEquals(msg['event_type'], 'compute.instance.delete')
payload = msg['payload'] payload = msg['payload']
self.assertEquals(payload['tenant_id'], self.project.id) self.assertEquals(payload['tenant_id'], self.project_id)
self.assertEquals(payload['user_id'], self.user.id) self.assertEquals(payload['user_id'], self.user_id)
self.assertEquals(payload['instance_id'], instance_id) self.assertEquals(payload['instance_id'], instance_id)
self.assertEquals(payload['instance_type'], 'm1.tiny') self.assertEquals(payload['instance_type'], 'm1.tiny')
type_id = instance_types.get_instance_type_by_name('m1.tiny')['id'] type_id = instance_types.get_instance_type_by_name('m1.tiny')['id']
@@ -420,7 +410,7 @@ class ComputeTestCase(test.TestCase):
def fake(*args, **kwargs): def fake(*args, **kwargs):
pass pass
self.stubs.Set(self.compute.driver, 'finish_resize', fake) self.stubs.Set(self.compute.driver, 'finish_migration', fake)
self.stubs.Set(self.compute.network_api, 'get_instance_nw_info', fake) self.stubs.Set(self.compute.network_api, 'get_instance_nw_info', fake)
context = self.context.elevated() context = self.context.elevated()
instance_id = self._create_instance() instance_id = self._create_instance()
@@ -457,8 +447,8 @@ class ComputeTestCase(test.TestCase):
self.assertEquals(msg['priority'], 'INFO') self.assertEquals(msg['priority'], 'INFO')
self.assertEquals(msg['event_type'], 'compute.instance.resize.prep') self.assertEquals(msg['event_type'], 'compute.instance.resize.prep')
payload = msg['payload'] payload = msg['payload']
self.assertEquals(payload['tenant_id'], self.project.id) self.assertEquals(payload['tenant_id'], self.project_id)
self.assertEquals(payload['user_id'], self.user.id) self.assertEquals(payload['user_id'], self.user_id)
self.assertEquals(payload['instance_id'], instance_id) self.assertEquals(payload['instance_id'], instance_id)
self.assertEquals(payload['instance_type'], 'm1.tiny') self.assertEquals(payload['instance_type'], 'm1.tiny')
type_id = instance_types.get_instance_type_by_name('m1.tiny')['id'] type_id = instance_types.get_instance_type_by_name('m1.tiny')['id']
@@ -531,8 +521,8 @@ class ComputeTestCase(test.TestCase):
def fake(*args, **kwargs): def fake(*args, **kwargs):
pass pass
self.stubs.Set(self.compute.driver, 'finish_resize', fake) self.stubs.Set(self.compute.driver, 'finish_migration', fake)
self.stubs.Set(self.compute.driver, 'revert_resize', fake) self.stubs.Set(self.compute.driver, 'revert_migration', fake)
self.stubs.Set(self.compute.network_api, 'get_instance_nw_info', fake) self.stubs.Set(self.compute.network_api, 'get_instance_nw_info', fake)
self.compute.run_instance(self.context, instance_id) self.compute.run_instance(self.context, instance_id)
@@ -583,8 +573,9 @@ class ComputeTestCase(test.TestCase):
the same host""" the same host"""
instance_id = self._create_instance() instance_id = self._create_instance()
self.compute.run_instance(self.context, instance_id) self.compute.run_instance(self.context, instance_id)
inst_ref = db.instance_get(self.context, instance_id)
self.assertRaises(exception.Error, self.compute.prep_resize, self.assertRaises(exception.Error, self.compute.prep_resize,
self.context, instance_id, 1) self.context, inst_ref['uuid'], 1)
self.compute.terminate_instance(self.context, instance_id) self.compute.terminate_instance(self.context, instance_id)
def test_migrate(self): def test_migrate(self):
@@ -624,7 +615,6 @@ class ComputeTestCase(test.TestCase):
self._setup_other_managers() self._setup_other_managers()
dbmock = self.mox.CreateMock(db) dbmock = self.mox.CreateMock(db)
volmock = self.mox.CreateMock(self.volume_manager) volmock = self.mox.CreateMock(self.volume_manager)
netmock = self.mox.CreateMock(self.network_manager)
drivermock = self.mox.CreateMock(self.compute_driver) drivermock = self.mox.CreateMock(self.compute_driver)
dbmock.instance_get(c, i_ref['id']).AndReturn(i_ref) dbmock.instance_get(c, i_ref['id']).AndReturn(i_ref)
@@ -632,12 +622,11 @@ class ComputeTestCase(test.TestCase):
for i in range(len(i_ref['volumes'])): for i in range(len(i_ref['volumes'])):
vid = i_ref['volumes'][i]['id'] vid = i_ref['volumes'][i]['id']
volmock.setup_compute_volume(c, vid).InAnyOrder('g1') volmock.setup_compute_volume(c, vid).InAnyOrder('g1')
netmock.setup_compute_network(c, i_ref['id']) drivermock.plug_vifs(i_ref, [])
drivermock.ensure_filtering_rules_for_instance(i_ref) drivermock.ensure_filtering_rules_for_instance(i_ref)
self.compute.db = dbmock self.compute.db = dbmock
self.compute.volume_manager = volmock self.compute.volume_manager = volmock
self.compute.network_manager = netmock
self.compute.driver = drivermock self.compute.driver = drivermock
self.mox.ReplayAll() self.mox.ReplayAll()
@@ -652,18 +641,16 @@ class ComputeTestCase(test.TestCase):
self._setup_other_managers() self._setup_other_managers()
dbmock = self.mox.CreateMock(db) dbmock = self.mox.CreateMock(db)
netmock = self.mox.CreateMock(self.network_manager)
drivermock = self.mox.CreateMock(self.compute_driver) drivermock = self.mox.CreateMock(self.compute_driver)
dbmock.instance_get(c, i_ref['id']).AndReturn(i_ref) dbmock.instance_get(c, i_ref['id']).AndReturn(i_ref)
dbmock.instance_get_fixed_addresses(c, i_ref['id']).AndReturn('dummy') dbmock.instance_get_fixed_addresses(c, i_ref['id']).AndReturn('dummy')
self.mox.StubOutWithMock(compute_manager.LOG, 'info') self.mox.StubOutWithMock(compute_manager.LOG, 'info')
compute_manager.LOG.info(_("%s has no volume."), i_ref['hostname']) compute_manager.LOG.info(_("%s has no volume."), i_ref['hostname'])
netmock.setup_compute_network(c, i_ref['id']) drivermock.plug_vifs(i_ref, [])
drivermock.ensure_filtering_rules_for_instance(i_ref) drivermock.ensure_filtering_rules_for_instance(i_ref)
self.compute.db = dbmock self.compute.db = dbmock
self.compute.network_manager = netmock
self.compute.driver = drivermock self.compute.driver = drivermock
self.mox.ReplayAll() self.mox.ReplayAll()
@@ -684,18 +671,20 @@ class ComputeTestCase(test.TestCase):
dbmock = self.mox.CreateMock(db) dbmock = self.mox.CreateMock(db)
netmock = self.mox.CreateMock(self.network_manager) netmock = self.mox.CreateMock(self.network_manager)
volmock = self.mox.CreateMock(self.volume_manager) volmock = self.mox.CreateMock(self.volume_manager)
drivermock = self.mox.CreateMock(self.compute_driver)
dbmock.instance_get(c, i_ref['id']).AndReturn(i_ref) dbmock.instance_get(c, i_ref['id']).AndReturn(i_ref)
dbmock.instance_get_fixed_addresses(c, i_ref['id']).AndReturn('dummy') dbmock.instance_get_fixed_addresses(c, i_ref['id']).AndReturn('dummy')
for i in range(len(i_ref['volumes'])): for i in range(len(i_ref['volumes'])):
volmock.setup_compute_volume(c, i_ref['volumes'][i]['id']) volmock.setup_compute_volume(c, i_ref['volumes'][i]['id'])
for i in range(FLAGS.live_migration_retry_count): for i in range(FLAGS.live_migration_retry_count):
netmock.setup_compute_network(c, i_ref['id']).\ drivermock.plug_vifs(i_ref, []).\
AndRaise(exception.ProcessExecutionError()) AndRaise(exception.ProcessExecutionError())
self.compute.db = dbmock self.compute.db = dbmock
self.compute.network_manager = netmock self.compute.network_manager = netmock
self.compute.volume_manager = volmock self.compute.volume_manager = volmock
self.compute.driver = drivermock
self.mox.ReplayAll() self.mox.ReplayAll()
self.assertRaises(exception.ProcessExecutionError, self.assertRaises(exception.ProcessExecutionError,
@@ -830,7 +819,7 @@ class ComputeTestCase(test.TestCase):
for v in i_ref['volumes']: for v in i_ref['volumes']:
self.compute.volume_manager.remove_compute_volume(c, v['id']) self.compute.volume_manager.remove_compute_volume(c, v['id'])
self.mox.StubOutWithMock(self.compute.driver, 'unfilter_instance') self.mox.StubOutWithMock(self.compute.driver, 'unfilter_instance')
self.compute.driver.unfilter_instance(i_ref) self.compute.driver.unfilter_instance(i_ref, [])
# executing # executing
self.mox.ReplayAll() self.mox.ReplayAll()
@@ -850,7 +839,6 @@ class ComputeTestCase(test.TestCase):
def test_run_kill_vm(self): def test_run_kill_vm(self):
"""Detect when a vm is terminated behind the scenes""" """Detect when a vm is terminated behind the scenes"""
self.stubs = stubout.StubOutForTesting()
self.stubs.Set(compute_manager.ComputeManager, self.stubs.Set(compute_manager.ComputeManager,
'_report_driver_status', nop_report_driver_status) '_report_driver_status', nop_report_driver_status)

View File

@@ -26,10 +26,9 @@ from nova import exception
from nova import flags from nova import flags
from nova import test from nova import test
from nova import utils from nova import utils
from nova.auth import manager
from nova.console import manager as console_manager
FLAGS = flags.FLAGS FLAGS = flags.FLAGS
flags.DECLARE('console_driver', 'nova.console.manager')
class ConsoleTestCase(test.TestCase): class ConsoleTestCase(test.TestCase):
@@ -39,17 +38,11 @@ class ConsoleTestCase(test.TestCase):
self.flags(console_driver='nova.console.fake.FakeConsoleProxy', self.flags(console_driver='nova.console.fake.FakeConsoleProxy',
stub_compute=True) stub_compute=True)
self.console = utils.import_object(FLAGS.console_manager) self.console = utils.import_object(FLAGS.console_manager)
self.manager = manager.AuthManager() self.user_id = 'fake'
self.user = self.manager.create_user('fake', 'fake', 'fake') self.project_id = 'fake'
self.project = self.manager.create_project('fake', 'fake', 'fake') self.context = context.RequestContext(self.user_id, self.project_id)
self.context = context.get_admin_context()
self.host = 'test_compute_host' self.host = 'test_compute_host'
def tearDown(self):
self.manager.delete_user(self.user)
self.manager.delete_project(self.project)
super(ConsoleTestCase, self).tearDown()
def _create_instance(self): def _create_instance(self):
"""Create a test instance""" """Create a test instance"""
inst = {} inst = {}
@@ -58,8 +51,8 @@ class ConsoleTestCase(test.TestCase):
inst['image_id'] = 1 inst['image_id'] = 1
inst['reservation_id'] = 'r-fakeres' inst['reservation_id'] = 'r-fakeres'
inst['launch_time'] = '10' inst['launch_time'] = '10'
inst['user_id'] = self.user.id inst['user_id'] = self.user_id
inst['project_id'] = self.project.id inst['project_id'] = self.project_id
inst['instance_type_id'] = 1 inst['instance_type_id'] = 1
inst['ami_launch_index'] = 0 inst['ami_launch_index'] = 0
return db.instance_create(self.context, inst)['id'] return db.instance_create(self.context, inst)['id']

78
nova/tests/test_db_api.py Normal file
View File

@@ -0,0 +1,78 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
# Copyright 2010 United States Government as represented by the
# Administrator of the National Aeronautics and Space Administration.
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
"""Unit tests for the DB API"""
from nova import test
from nova import context
from nova import db
from nova import flags
FLAGS = flags.FLAGS
def _setup_networking(instance_id, ip='1.2.3.4', flo_addr='1.2.1.2'):
ctxt = context.get_admin_context()
network_ref = db.project_get_networks(ctxt,
'fake',
associate=True)[0]
vif = {'address': '56:12:12:12:12:12',
'network_id': network_ref['id'],
'instance_id': instance_id}
vif_ref = db.virtual_interface_create(ctxt, vif)
fixed_ip = {'address': ip,
'network_id': network_ref['id'],
'virtual_interface_id': vif_ref['id'],
'allocated': True,
'instance_id': instance_id}
db.fixed_ip_create(ctxt, fixed_ip)
fix_ref = db.fixed_ip_get_by_address(ctxt, ip)
db.floating_ip_create(ctxt, {'address': flo_addr,
'fixed_ip_id': fix_ref['id']})
class DbApiTestCase(test.TestCase):
def setUp(self):
super(DbApiTestCase, self).setUp()
self.user_id = 'fake'
self.project_id = 'fake'
self.context = context.RequestContext(self.user_id, self.project_id)
def test_instance_get_project_vpn(self):
values = {'instance_type_id': FLAGS.default_instance_type,
'image_ref': FLAGS.vpn_image_id,
'project_id': self.project_id
}
instance = db.instance_create(self.context, values)
result = db.instance_get_project_vpn(self.context.elevated(),
self.project_id)
self.assertEqual(instance['id'], result['id'])
def test_instance_get_project_vpn_joins(self):
values = {'instance_type_id': FLAGS.default_instance_type,
'image_ref': FLAGS.vpn_image_id,
'project_id': self.project_id
}
instance = db.instance_create(self.context, values)
_setup_networking(instance['id'])
result = db.instance_get_project_vpn(self.context.elevated(),
self.project_id)
self.assertEqual(instance['id'], result['id'])
self.assertEqual(result['fixed_ips'][0]['floating_ips'][0].address,
'1.2.1.2')

View File

@@ -32,7 +32,6 @@ from nova import flags
from nova import test from nova import test
from nova import utils from nova import utils
from nova.api.ec2 import cloud from nova.api.ec2 import cloud
from nova.auth import manager
from nova.compute import power_state from nova.compute import power_state
from nova.virt.libvirt import connection from nova.virt.libvirt import connection
from nova.virt.libvirt import firewall from nova.virt.libvirt import firewall
@@ -54,9 +53,13 @@ def _create_network_info(count=1, ipv6=None):
fake_ip = '0.0.0.0/0' fake_ip = '0.0.0.0/0'
fake_ip_2 = '0.0.0.1/0' fake_ip_2 = '0.0.0.1/0'
fake_ip_3 = '0.0.0.1/0' fake_ip_3 = '0.0.0.1/0'
fake_vlan = 100
fake_bridge_interface = 'eth0'
network = {'bridge': fake, network = {'bridge': fake,
'cidr': fake_ip, 'cidr': fake_ip,
'cidr_v6': fake_ip} 'cidr_v6': fake_ip,
'vlan': fake_vlan,
'bridge_interface': fake_bridge_interface}
mapping = {'mac': fake, mapping = {'mac': fake,
'dhcp_server': fake, 'dhcp_server': fake,
'gateway': fake, 'gateway': fake,
@@ -150,36 +153,15 @@ class LibvirtConnTestCase(test.TestCase):
super(LibvirtConnTestCase, self).setUp() super(LibvirtConnTestCase, self).setUp()
connection._late_load_cheetah() connection._late_load_cheetah()
self.flags(fake_call=True) self.flags(fake_call=True)
self.manager = manager.AuthManager() self.user_id = 'fake'
self.project_id = 'fake'
try: self.context = context.RequestContext(self.user_id, self.project_id)
pjs = self.manager.get_projects()
pjs = [p for p in pjs if p.name == 'fake']
if 0 != len(pjs):
self.manager.delete_project(pjs[0])
users = self.manager.get_users()
users = [u for u in users if u.name == 'fake']
if 0 != len(users):
self.manager.delete_user(users[0])
except Exception, e:
pass
users = self.manager.get_users()
self.user = self.manager.create_user('fake', 'fake', 'fake',
admin=True)
self.project = self.manager.create_project('fake', 'fake', 'fake')
self.network = utils.import_object(FLAGS.network_manager) self.network = utils.import_object(FLAGS.network_manager)
self.context = context.get_admin_context() self.context = context.get_admin_context()
FLAGS.instances_path = '' FLAGS.instances_path = ''
self.call_libvirt_dependant_setup = False self.call_libvirt_dependant_setup = False
self.test_ip = '10.11.12.13'
def tearDown(self):
self.manager.delete_project(self.project)
self.manager.delete_user(self.user)
super(LibvirtConnTestCase, self).tearDown()
test_ip = '10.11.12.13'
test_instance = {'memory_kb': '1024000', test_instance = {'memory_kb': '1024000',
'basepath': '/some/path', 'basepath': '/some/path',
'bridge_name': 'br100', 'bridge_name': 'br100',
@@ -220,9 +202,29 @@ class LibvirtConnTestCase(test.TestCase):
def setattr(self, key, val): def setattr(self, key, val):
self.__setattr__(key, val) self.__setattr__(key, val)
# A fake VIF driver
class FakeVIFDriver(object):
def __init__(self, **kwargs):
pass
def setattr(self, key, val):
self.__setattr__(key, val)
def plug(self, instance, network, mapping):
return {
'id': 'fake',
'bridge_name': 'fake',
'mac_address': 'fake',
'ip_address': 'fake',
'dhcp_server': 'fake',
'extra_params': 'fake',
}
# Creating mocks # Creating mocks
fake = FakeLibvirtConnection() fake = FakeLibvirtConnection()
fakeip = FakeIptablesFirewallDriver fakeip = FakeIptablesFirewallDriver
fakevif = FakeVIFDriver()
# Customizing above fake if necessary # Customizing above fake if necessary
for key, val in kwargs.items(): for key, val in kwargs.items():
fake.__setattr__(key, val) fake.__setattr__(key, val)
@@ -230,6 +232,8 @@ class LibvirtConnTestCase(test.TestCase):
# Inevitable mocks for connection.LibvirtConnection # Inevitable mocks for connection.LibvirtConnection
self.mox.StubOutWithMock(connection.utils, 'import_class') self.mox.StubOutWithMock(connection.utils, 'import_class')
connection.utils.import_class(mox.IgnoreArg()).AndReturn(fakeip) connection.utils.import_class(mox.IgnoreArg()).AndReturn(fakeip)
self.mox.StubOutWithMock(connection.utils, 'import_object')
connection.utils.import_object(mox.IgnoreArg()).AndReturn(fakevif)
self.mox.StubOutWithMock(connection.LibvirtConnection, '_conn') self.mox.StubOutWithMock(connection.LibvirtConnection, '_conn')
connection.LibvirtConnection._conn = fake connection.LibvirtConnection._conn = fake
@@ -265,7 +269,6 @@ class LibvirtConnTestCase(test.TestCase):
return db.service_create(context.get_admin_context(), service_ref) return db.service_create(context.get_admin_context(), service_ref)
@test.skip_test("Please review this test to ensure intent")
def test_preparing_xml_info(self): def test_preparing_xml_info(self):
conn = connection.LibvirtConnection(True) conn = connection.LibvirtConnection(True)
instance_ref = db.instance_create(self.context, self.test_instance) instance_ref = db.instance_create(self.context, self.test_instance)
@@ -281,43 +284,23 @@ class LibvirtConnTestCase(test.TestCase):
_create_network_info(2)) _create_network_info(2))
self.assertTrue(len(result['nics']) == 2) self.assertTrue(len(result['nics']) == 2)
def test_get_nic_for_xml_v4(self):
conn = connection.LibvirtConnection(True)
network, mapping = _create_network_info()[0]
self.flags(use_ipv6=False)
params = conn._get_nic_for_xml(network, mapping)['extra_params']
self.assertTrue(params.find('PROJNETV6') == -1)
self.assertTrue(params.find('PROJMASKV6') == -1)
def test_get_nic_for_xml_v6(self):
conn = connection.LibvirtConnection(True)
network, mapping = _create_network_info()[0]
self.flags(use_ipv6=True)
params = conn._get_nic_for_xml(network, mapping)['extra_params']
self.assertTrue(params.find('PROJNETV6') > -1)
self.assertTrue(params.find('PROJMASKV6') > -1)
@test.skip_test("skipping libvirt tests depends on get_network_info shim")
def test_xml_and_uri_no_ramdisk_no_kernel(self): def test_xml_and_uri_no_ramdisk_no_kernel(self):
instance_data = dict(self.test_instance) instance_data = dict(self.test_instance)
self._check_xml_and_uri(instance_data, self._check_xml_and_uri(instance_data,
expect_kernel=False, expect_ramdisk=False) expect_kernel=False, expect_ramdisk=False)
@test.skip_test("skipping libvirt tests depends on get_network_info shim")
def test_xml_and_uri_no_ramdisk(self): def test_xml_and_uri_no_ramdisk(self):
instance_data = dict(self.test_instance) instance_data = dict(self.test_instance)
instance_data['kernel_id'] = 'aki-deadbeef' instance_data['kernel_id'] = 'aki-deadbeef'
self._check_xml_and_uri(instance_data, self._check_xml_and_uri(instance_data,
expect_kernel=True, expect_ramdisk=False) expect_kernel=True, expect_ramdisk=False)
@test.skip_test("skipping libvirt tests depends on get_network_info shim")
def test_xml_and_uri_no_kernel(self): def test_xml_and_uri_no_kernel(self):
instance_data = dict(self.test_instance) instance_data = dict(self.test_instance)
instance_data['ramdisk_id'] = 'ari-deadbeef' instance_data['ramdisk_id'] = 'ari-deadbeef'
self._check_xml_and_uri(instance_data, self._check_xml_and_uri(instance_data,
expect_kernel=False, expect_ramdisk=False) expect_kernel=False, expect_ramdisk=False)
@test.skip_test("skipping libvirt tests depends on get_network_info shim")
def test_xml_and_uri(self): def test_xml_and_uri(self):
instance_data = dict(self.test_instance) instance_data = dict(self.test_instance)
instance_data['ramdisk_id'] = 'ari-deadbeef' instance_data['ramdisk_id'] = 'ari-deadbeef'
@@ -325,7 +308,6 @@ class LibvirtConnTestCase(test.TestCase):
self._check_xml_and_uri(instance_data, self._check_xml_and_uri(instance_data,
expect_kernel=True, expect_ramdisk=True) expect_kernel=True, expect_ramdisk=True)
@test.skip_test("skipping libvirt tests depends on get_network_info shim")
def test_xml_and_uri_rescue(self): def test_xml_and_uri_rescue(self):
instance_data = dict(self.test_instance) instance_data = dict(self.test_instance)
instance_data['ramdisk_id'] = 'ari-deadbeef' instance_data['ramdisk_id'] = 'ari-deadbeef'
@@ -333,7 +315,6 @@ class LibvirtConnTestCase(test.TestCase):
self._check_xml_and_uri(instance_data, expect_kernel=True, self._check_xml_and_uri(instance_data, expect_kernel=True,
expect_ramdisk=True, rescue=True) expect_ramdisk=True, rescue=True)
@test.skip_test("skipping libvirt tests depends on get_network_info shim")
def test_lxc_container_and_uri(self): def test_lxc_container_and_uri(self):
instance_data = dict(self.test_instance) instance_data = dict(self.test_instance)
self._check_xml_and_container(instance_data) self._check_xml_and_container(instance_data)
@@ -413,6 +394,15 @@ class LibvirtConnTestCase(test.TestCase):
self.assertEquals(snapshot['status'], 'active') self.assertEquals(snapshot['status'], 'active')
self.assertEquals(snapshot['name'], snapshot_name) self.assertEquals(snapshot['name'], snapshot_name)
def test_attach_invalid_device(self):
self.create_fake_libvirt_mock()
connection.LibvirtConnection._conn.lookupByName = self.fake_lookup
self.mox.ReplayAll()
conn = connection.LibvirtConnection(False)
self.assertRaises(exception.InvalidDevicePath,
conn.attach_volume,
"fake", "bad/device/path", "/dev/fake")
def test_multi_nic(self): def test_multi_nic(self):
instance_data = dict(self.test_instance) instance_data = dict(self.test_instance)
network_info = _create_network_info(2) network_info = _create_network_info(2)
@@ -430,27 +420,10 @@ class LibvirtConnTestCase(test.TestCase):
self.assertEquals(parameters[1].get('value'), 'fake') self.assertEquals(parameters[1].get('value'), 'fake')
def _check_xml_and_container(self, instance): def _check_xml_and_container(self, instance):
user_context = context.RequestContext(project=self.project, user_context = context.RequestContext(self.user_id,
user=self.user) self.project_id)
instance_ref = db.instance_create(user_context, instance) instance_ref = db.instance_create(user_context, instance)
# Re-get the instance so it's bound to an actual session _setup_networking(instance_ref['id'], self.test_ip)
instance_ref = db.instance_get(user_context, instance_ref['id'])
network_ref = db.project_get_networks(context.get_admin_context(),
self.project.id)[0]
vif = {'address': '56:12:12:12:12:12',
'network_id': network_ref['id'],
'instance_id': instance_ref['id']}
vif_ref = db.virtual_interface_create(self.context, vif)
fixed_ip = {'address': self.test_ip,
'network_id': network_ref['id'],
'virtual_interface_id': vif_ref['id']}
ctxt = context.get_admin_context()
fixed_ip_ref = db.fixed_ip_create(ctxt, fixed_ip)
db.fixed_ip_update(ctxt, self.test_ip,
{'allocated': True,
'instance_id': instance_ref['id']})
self.flags(libvirt_type='lxc') self.flags(libvirt_type='lxc')
conn = connection.LibvirtConnection(True) conn = connection.LibvirtConnection(True)
@@ -476,13 +449,12 @@ class LibvirtConnTestCase(test.TestCase):
def _check_xml_and_uri(self, instance, expect_ramdisk, expect_kernel, def _check_xml_and_uri(self, instance, expect_ramdisk, expect_kernel,
rescue=False): rescue=False):
user_context = context.RequestContext(project=self.project, user_context = context.RequestContext(self.user_id, self.project_id)
user=self.user)
instance_ref = db.instance_create(user_context, instance) instance_ref = db.instance_create(user_context, instance)
network_ref = db.project_get_networks(context.get_admin_context(), network_ref = db.project_get_networks(context.get_admin_context(),
self.project.id)[0] self.project_id)[0]
_setup_networking(instance_ref['id'], ip=self.test_ip) _setup_networking(instance_ref['id'], self.test_ip)
type_uri_map = {'qemu': ('qemu:///system', type_uri_map = {'qemu': ('qemu:///system',
[(lambda t: t.find('.').get('type'), 'qemu'), [(lambda t: t.find('.').get('type'), 'qemu'),
@@ -723,6 +695,9 @@ class LibvirtConnTestCase(test.TestCase):
return vdmock return vdmock
self.create_fake_libvirt_mock(lookupByName=fake_lookup) self.create_fake_libvirt_mock(lookupByName=fake_lookup)
self.mox.StubOutWithMock(self.compute, "recover_live_migration")
self.compute.recover_live_migration(self.context, instance_ref,
dest='dest')
# Start test # Start test
self.mox.ReplayAll() self.mox.ReplayAll()
@@ -741,7 +716,6 @@ class LibvirtConnTestCase(test.TestCase):
db.volume_destroy(self.context, volume_ref['id']) db.volume_destroy(self.context, volume_ref['id'])
db.instance_destroy(self.context, instance_ref['id']) db.instance_destroy(self.context, instance_ref['id'])
@test.skip_test("test needs rewrite: instance no longer has mac_address")
def test_spawn_with_network_info(self): def test_spawn_with_network_info(self):
# Skip if non-libvirt environment # Skip if non-libvirt environment
if not self.lazy_load_library_exists(): if not self.lazy_load_library_exists():
@@ -760,17 +734,7 @@ class LibvirtConnTestCase(test.TestCase):
conn.firewall_driver.setattr('setup_basic_filtering', fake_none) conn.firewall_driver.setattr('setup_basic_filtering', fake_none)
conn.firewall_driver.setattr('prepare_instance_filter', fake_none) conn.firewall_driver.setattr('prepare_instance_filter', fake_none)
network = db.project_get_networks(context.get_admin_context(), network_info = _create_network_info()
self.project.id)[0]
ip_dict = {'ip': self.test_ip,
'netmask': network['netmask'],
'enabled': '1'}
mapping = {'label': network['label'],
'gateway': network['gateway'],
'mac': instance['mac_address'],
'dns': [network['dns']],
'ips': [ip_dict]}
network_info = [(network, mapping)]
try: try:
conn.spawn(instance, network_info) conn.spawn(instance, network_info)
@@ -852,11 +816,9 @@ class IptablesFirewallTestCase(test.TestCase):
def setUp(self): def setUp(self):
super(IptablesFirewallTestCase, self).setUp() super(IptablesFirewallTestCase, self).setUp()
self.manager = manager.AuthManager() self.user_id = 'fake'
self.user = self.manager.create_user('fake', 'fake', 'fake', self.project_id = 'fake'
admin=True) self.context = context.RequestContext(self.user_id, self.project_id)
self.project = self.manager.create_project('fake', 'fake', 'fake')
self.context = context.RequestContext('fake', 'fake')
self.network = utils.import_object(FLAGS.network_manager) self.network = utils.import_object(FLAGS.network_manager)
class FakeLibvirtConnection(object): class FakeLibvirtConnection(object):
@@ -864,6 +826,7 @@ class IptablesFirewallTestCase(test.TestCase):
"""setup_basic_rules in nwfilter calls this.""" """setup_basic_rules in nwfilter calls this."""
pass pass
self.fake_libvirt_connection = FakeLibvirtConnection() self.fake_libvirt_connection = FakeLibvirtConnection()
self.test_ip = '10.11.12.13'
self.fw = firewall.IptablesFirewallDriver( self.fw = firewall.IptablesFirewallDriver(
get_connection=lambda: self.fake_libvirt_connection) get_connection=lambda: self.fake_libvirt_connection)
@@ -881,11 +844,6 @@ class IptablesFirewallTestCase(test.TestCase):
connection.libxml2 = __import__('libxml2') connection.libxml2 = __import__('libxml2')
return True return True
def tearDown(self):
self.manager.delete_project(self.project)
self.manager.delete_user(self.user)
super(IptablesFirewallTestCase, self).tearDown()
in_nat_rules = [ in_nat_rules = [
'# Generated by iptables-save v1.4.10 on Sat Feb 19 00:03:19 2011', '# Generated by iptables-save v1.4.10 on Sat Feb 19 00:03:19 2011',
'*nat', '*nat',
@@ -929,27 +887,11 @@ class IptablesFirewallTestCase(test.TestCase):
'project_id': 'fake', 'project_id': 'fake',
'instance_type_id': 1}) 'instance_type_id': 1})
@test.skip_test("skipping libvirt tests depends on get_network_info shim")
def test_static_filters(self): def test_static_filters(self):
instance_ref = self._create_instance_ref() instance_ref = self._create_instance_ref()
ip = '10.11.12.13' _setup_networking(instance_ref['id'], self.test_ip)
network_ref = db.project_get_networks(self.context,
'fake',
associate=True)[0]
vif = {'address': '56:12:12:12:12:12',
'network_id': network_ref['id'],
'instance_id': instance_ref['id']}
vif_ref = db.virtual_interface_create(self.context, vif)
fixed_ip = {'address': ip,
'network_id': network_ref['id'],
'virtual_interface_id': vif_ref['id']}
admin_ctxt = context.get_admin_context() admin_ctxt = context.get_admin_context()
db.fixed_ip_create(admin_ctxt, fixed_ip)
db.fixed_ip_update(admin_ctxt, ip, {'allocated': True,
'instance_id': instance_ref['id']})
secgroup = db.security_group_create(admin_ctxt, secgroup = db.security_group_create(admin_ctxt,
{'user_id': 'fake', {'user_id': 'fake',
'project_id': 'fake', 'project_id': 'fake',
@@ -1081,7 +1023,6 @@ class IptablesFirewallTestCase(test.TestCase):
self.assertEquals(ipv6_network_rules, self.assertEquals(ipv6_network_rules,
ipv6_rules_per_network * networks_count) ipv6_rules_per_network * networks_count)
@test.skip_test("skipping libvirt tests")
def test_do_refresh_security_group_rules(self): def test_do_refresh_security_group_rules(self):
instance_ref = self._create_instance_ref() instance_ref = self._create_instance_ref()
self.mox.StubOutWithMock(self.fw, self.mox.StubOutWithMock(self.fw,
@@ -1092,7 +1033,6 @@ class IptablesFirewallTestCase(test.TestCase):
self.mox.ReplayAll() self.mox.ReplayAll()
self.fw.do_refresh_security_group_rules("fake") self.fw.do_refresh_security_group_rules("fake")
@test.skip_test("skip libvirt test project_get_network no longer exists")
def test_unfilter_instance_undefines_nwfilter(self): def test_unfilter_instance_undefines_nwfilter(self):
# Skip if non-libvirt environment # Skip if non-libvirt environment
if not self.lazy_load_library_exists(): if not self.lazy_load_library_exists():
@@ -1106,38 +1046,24 @@ class IptablesFirewallTestCase(test.TestCase):
self.fw.nwfilter._conn.nwfilterLookupByName =\ self.fw.nwfilter._conn.nwfilterLookupByName =\
fakefilter.nwfilterLookupByName fakefilter.nwfilterLookupByName
instance_ref = self._create_instance_ref() instance_ref = self._create_instance_ref()
inst_id = instance_ref['id']
instance = db.instance_get(self.context, inst_id)
ip = '10.11.12.13' _setup_networking(instance_ref['id'], self.test_ip)
network_ref = db.project_get_network(self.context, 'fake') self.fw.setup_basic_filtering(instance_ref)
fixed_ip = {'address': ip, 'network_id': network_ref['id']} self.fw.prepare_instance_filter(instance_ref)
db.fixed_ip_create(admin_ctxt, fixed_ip) self.fw.apply_instance_filter(instance_ref)
db.fixed_ip_update(admin_ctxt, ip, {'allocated': True,
'instance_id': inst_id})
self.fw.setup_basic_filtering(instance)
self.fw.prepare_instance_filter(instance)
self.fw.apply_instance_filter(instance)
original_filter_count = len(fakefilter.filters) original_filter_count = len(fakefilter.filters)
self.fw.unfilter_instance(instance) self.fw.unfilter_instance(instance_ref)
# should undefine just the instance filter # should undefine just the instance filter
self.assertEqual(original_filter_count - len(fakefilter.filters), 1) self.assertEqual(original_filter_count - len(fakefilter.filters), 1)
db.instance_destroy(admin_ctxt, instance_ref['id']) db.instance_destroy(admin_ctxt, instance_ref['id'])
@test.skip_test("skip libvirt test project_get_network no longer exists")
def test_provider_firewall_rules(self): def test_provider_firewall_rules(self):
# setup basic instance data # setup basic instance data
instance_ref = self._create_instance_ref() instance_ref = self._create_instance_ref()
nw_info = _create_network_info(1) nw_info = _create_network_info(1)
ip = '10.11.12.13' _setup_networking(instance_ref['id'], self.test_ip)
network_ref = db.project_get_network(self.context, 'fake')
admin_ctxt = context.get_admin_context()
fixed_ip = {'address': ip, 'network_id': network_ref['id']}
db.fixed_ip_create(admin_ctxt, fixed_ip)
db.fixed_ip_update(admin_ctxt, ip, {'allocated': True,
'instance_id': instance_ref['id']})
# FRAGILE: peeks at how the firewall names chains # FRAGILE: peeks at how the firewall names chains
chain_name = 'inst-%s' % instance_ref['id'] chain_name = 'inst-%s' % instance_ref['id']
@@ -1149,6 +1075,7 @@ class IptablesFirewallTestCase(test.TestCase):
if rule.chain == 'provider'] if rule.chain == 'provider']
self.assertEqual(0, len(rules)) self.assertEqual(0, len(rules))
admin_ctxt = context.get_admin_context()
# add a rule and send the update message, check for 1 rule # add a rule and send the update message, check for 1 rule
provider_fw0 = db.provider_fw_rule_create(admin_ctxt, provider_fw0 = db.provider_fw_rule_create(admin_ctxt,
{'protocol': 'tcp', {'protocol': 'tcp',
@@ -1199,22 +1126,16 @@ class NWFilterTestCase(test.TestCase):
class Mock(object): class Mock(object):
pass pass
self.manager = manager.AuthManager() self.user_id = 'fake'
self.user = self.manager.create_user('fake', 'fake', 'fake', self.project_id = 'fake'
admin=True) self.context = context.RequestContext(self.user_id, self.project_id)
self.project = self.manager.create_project('fake', 'fake', 'fake')
self.context = context.RequestContext(self.user, self.project)
self.fake_libvirt_connection = Mock() self.fake_libvirt_connection = Mock()
self.test_ip = '10.11.12.13'
self.fw = firewall.NWFilterFirewall( self.fw = firewall.NWFilterFirewall(
lambda: self.fake_libvirt_connection) lambda: self.fake_libvirt_connection)
def tearDown(self):
self.manager.delete_project(self.project)
self.manager.delete_user(self.user)
super(NWFilterTestCase, self).tearDown()
def test_cidr_rule_nwfilter_xml(self): def test_cidr_rule_nwfilter_xml(self):
cloud_controller = cloud.CloudController() cloud_controller = cloud.CloudController()
cloud_controller.create_security_group(self.context, cloud_controller.create_security_group(self.context,
@@ -1293,7 +1214,6 @@ class NWFilterTestCase(test.TestCase):
inst.update(params) inst.update(params)
return db.instance_type_create(context, inst)['id'] return db.instance_type_create(context, inst)['id']
@test.skip_test('Skipping this test')
def test_creates_base_rule_first(self): def test_creates_base_rule_first(self):
# These come pre-defined by libvirt # These come pre-defined by libvirt
self.defined_filters = ['no-mac-spoofing', self.defined_filters = ['no-mac-spoofing',
@@ -1325,21 +1245,11 @@ class NWFilterTestCase(test.TestCase):
instance_ref = self._create_instance() instance_ref = self._create_instance()
inst_id = instance_ref['id'] inst_id = instance_ref['id']
ip = '10.11.12.13' _setup_networking(instance_ref['id'], self.test_ip)
#network_ref = db.project_get_networks(self.context, 'fake')[0]
#fixed_ip = {'address': ip, 'network_id': network_ref['id']}
#admin_ctxt = context.get_admin_context()
#db.fixed_ip_create(admin_ctxt, fixed_ip)
#db.fixed_ip_update(admin_ctxt, ip, {'allocated': True,
# 'instance_id': inst_id})
self._setup_networking(instance_ref['id'], ip=ip)
def _ensure_all_called(): def _ensure_all_called():
instance_filter = 'nova-instance-%s-%s' % (instance_ref['name'], instance_filter = 'nova-instance-%s-%s' % (instance_ref['name'],
'00A0C914C829') '561212121212')
secgroup_filter = 'nova-secgroup-%s' % self.security_group['id'] secgroup_filter = 'nova-secgroup-%s' % self.security_group['id']
for required in [secgroup_filter, 'allow-dhcp-server', for required in [secgroup_filter, 'allow-dhcp-server',
'no-arp-spoofing', 'no-ip-spoofing', 'no-arp-spoofing', 'no-ip-spoofing',
@@ -1360,7 +1270,7 @@ class NWFilterTestCase(test.TestCase):
self.fw.apply_instance_filter(instance) self.fw.apply_instance_filter(instance)
_ensure_all_called() _ensure_all_called()
self.teardown_security_group() self.teardown_security_group()
db.instance_destroy(admin_ctxt, instance_ref['id']) db.instance_destroy(context.get_admin_context(), instance_ref['id'])
def test_create_network_filters(self): def test_create_network_filters(self):
instance_ref = self._create_instance() instance_ref = self._create_instance()
@@ -1370,7 +1280,6 @@ class NWFilterTestCase(test.TestCase):
"fake") "fake")
self.assertEquals(len(result), 3) self.assertEquals(len(result), 3)
@test.skip_test("skip libvirt test project_get_network no longer exists")
def test_unfilter_instance_undefines_nwfilters(self): def test_unfilter_instance_undefines_nwfilters(self):
admin_ctxt = context.get_admin_context() admin_ctxt = context.get_admin_context()
@@ -1388,12 +1297,7 @@ class NWFilterTestCase(test.TestCase):
instance = db.instance_get(self.context, inst_id) instance = db.instance_get(self.context, inst_id)
ip = '10.11.12.13' _setup_networking(instance_ref['id'], self.test_ip)
network_ref = db.project_get_network(self.context, 'fake')
fixed_ip = {'address': ip, 'network_id': network_ref['id']}
db.fixed_ip_create(admin_ctxt, fixed_ip)
db.fixed_ip_update(admin_ctxt, ip, {'allocated': True,
'instance_id': inst_id})
self.fw.setup_basic_filtering(instance) self.fw.setup_basic_filtering(instance)
self.fw.prepare_instance_filter(instance) self.fw.prepare_instance_filter(instance)
self.fw.apply_instance_filter(instance) self.fw.apply_instance_filter(instance)

View File

@@ -149,7 +149,10 @@ class FlatNetworkTestCase(test.TestCase):
'cidr': '192.168.%s.0/24' % i, 'cidr': '192.168.%s.0/24' % i,
'cidr_v6': '2001:db%s::/64' % i8, 'cidr_v6': '2001:db%s::/64' % i8,
'id': i, 'id': i,
'injected': 'DONTCARE'} 'multi_host': False,
'injected': 'DONTCARE',
'bridge_interface': 'fake_fa%s' % i,
'vlan': None}
self.assertDictMatch(nw[0], check) self.assertDictMatch(nw[0], check)
@@ -162,7 +165,9 @@ class FlatNetworkTestCase(test.TestCase):
'ips': 'DONTCARE', 'ips': 'DONTCARE',
'label': 'test%s' % i, 'label': 'test%s' % i,
'mac': 'DE:AD:BE:EF:00:0%s' % i, 'mac': 'DE:AD:BE:EF:00:0%s' % i,
'rxtx_cap': 'DONTCARE'} 'rxtx_cap': 'DONTCARE',
'should_create_vlan': False,
'should_create_bridge': False}
self.assertDictMatch(nw[1], check) self.assertDictMatch(nw[1], check)
check = [{'enabled': 'DONTCARE', check = [{'enabled': 'DONTCARE',

View File

@@ -33,11 +33,12 @@ LOG = logging.getLogger('nova.tests.rpc')
class RpcTestCase(test.TestCase): class RpcTestCase(test.TestCase):
def setUp(self): def setUp(self):
super(RpcTestCase, self).setUp() super(RpcTestCase, self).setUp()
self.conn = rpc.Connection.instance(True) self.conn = rpc.create_connection(True)
self.receiver = TestReceiver() self.receiver = TestReceiver()
self.consumer = rpc.TopicAdapterConsumer(connection=self.conn, self.consumer = rpc.create_consumer(self.conn,
topic='test', 'test',
proxy=self.receiver) self.receiver,
False)
self.consumer.attach_to_eventlet() self.consumer.attach_to_eventlet()
self.context = context.get_admin_context() self.context = context.get_admin_context()
@@ -129,6 +130,8 @@ class RpcTestCase(test.TestCase):
"""Calls echo in the passed queue""" """Calls echo in the passed queue"""
LOG.debug(_("Nested received %(queue)s, %(value)s") LOG.debug(_("Nested received %(queue)s, %(value)s")
% locals()) % locals())
# TODO: so, it will replay the context and use the same REQID?
# that's bizarre.
ret = rpc.call(context, ret = rpc.call(context,
queue, queue,
{"method": "echo", {"method": "echo",
@@ -137,10 +140,11 @@ class RpcTestCase(test.TestCase):
return value return value
nested = Nested() nested = Nested()
conn = rpc.Connection.instance(True) conn = rpc.create_connection(True)
consumer = rpc.TopicAdapterConsumer(connection=conn, consumer = rpc.create_consumer(conn,
topic='nested', 'nested',
proxy=nested) nested,
False)
consumer.attach_to_eventlet() consumer.attach_to_eventlet()
value = 42 value = 42
result = rpc.call(self.context, result = rpc.call(self.context,
@@ -149,47 +153,6 @@ class RpcTestCase(test.TestCase):
"value": value}}) "value": value}})
self.assertEqual(value, result) self.assertEqual(value, result)
def test_connectionpool_single(self):
"""Test that ConnectionPool recycles a single connection."""
conn1 = rpc.ConnectionPool.get()
rpc.ConnectionPool.put(conn1)
conn2 = rpc.ConnectionPool.get()
rpc.ConnectionPool.put(conn2)
self.assertEqual(conn1, conn2)
def test_connectionpool_double(self):
"""Test that ConnectionPool returns and reuses separate connections.
When called consecutively we should get separate connections and upon
returning them those connections should be reused for future calls
before generating a new connection.
"""
conn1 = rpc.ConnectionPool.get()
conn2 = rpc.ConnectionPool.get()
self.assertNotEqual(conn1, conn2)
rpc.ConnectionPool.put(conn1)
rpc.ConnectionPool.put(conn2)
conn3 = rpc.ConnectionPool.get()
conn4 = rpc.ConnectionPool.get()
self.assertEqual(conn1, conn3)
self.assertEqual(conn2, conn4)
def test_connectionpool_limit(self):
"""Test connection pool limit and connection uniqueness."""
max_size = FLAGS.rpc_conn_pool_size
conns = []
for i in xrange(max_size):
conns.append(rpc.ConnectionPool.get())
self.assertFalse(rpc.ConnectionPool.free_items)
self.assertEqual(rpc.ConnectionPool.current_size,
rpc.ConnectionPool.max_size)
self.assertEqual(len(set(conns)), max_size)
class TestReceiver(object): class TestReceiver(object):
"""Simple Proxy class so the consumer has methods to call. """Simple Proxy class so the consumer has methods to call.

View File

@@ -0,0 +1,68 @@
from nova import context
from nova import flags
from nova import log as logging
from nova import rpc
from nova.rpc import amqp
from nova import test
FLAGS = flags.FLAGS
LOG = logging.getLogger('nova.tests.rpc')
class RpcAMQPTestCase(test.TestCase):
def setUp(self):
super(RpcAMQPTestCase, self).setUp()
self.conn = rpc.create_connection(True)
self.receiver = TestReceiver()
self.consumer = rpc.create_consumer(self.conn,
'test',
self.receiver,
False)
self.consumer.attach_to_eventlet()
self.context = context.get_admin_context()
def test_connectionpool_single(self):
"""Test that ConnectionPool recycles a single connection."""
conn1 = amqp.ConnectionPool.get()
amqp.ConnectionPool.put(conn1)
conn2 = amqp.ConnectionPool.get()
amqp.ConnectionPool.put(conn2)
self.assertEqual(conn1, conn2)
class TestReceiver(object):
"""Simple Proxy class so the consumer has methods to call.
Uses static methods because we aren't actually storing any state.
"""
@staticmethod
def echo(context, value):
"""Simply returns whatever value is sent in."""
LOG.debug(_("Received %s"), value)
return value
@staticmethod
def context(context, value):
"""Returns dictionary version of context."""
LOG.debug(_("Received %s"), context)
return context.to_dict()
@staticmethod
def echo_three_times(context, value):
context.reply(value)
context.reply(value + 1)
context.reply(value + 2)
@staticmethod
def echo_three_times_yield(context, value):
yield value
yield value + 1
yield value + 2
@staticmethod
def fail(context, value):
"""Raises an exception with the value sent in."""
raise Exception(value)

View File

@@ -19,14 +19,11 @@
Test suite for VMWareAPI. Test suite for VMWareAPI.
""" """
import stubout
from nova import context from nova import context
from nova import db from nova import db
from nova import flags from nova import flags
from nova import test from nova import test
from nova import utils from nova import utils
from nova.auth import manager
from nova.compute import power_state from nova.compute import power_state
from nova.tests.glance import stubs as glance_stubs from nova.tests.glance import stubs as glance_stubs
from nova.tests.vmwareapi import db_fakes from nova.tests.vmwareapi import db_fakes
@@ -41,51 +38,63 @@ FLAGS = flags.FLAGS
class VMWareAPIVMTestCase(test.TestCase): class VMWareAPIVMTestCase(test.TestCase):
"""Unit tests for Vmware API connection calls.""" """Unit tests for Vmware API connection calls."""
# NOTE(jkoelker): This is leaking stubs into the db module. def setUp(self):
# Commenting out until updated for multi-nic. super(VMWareAPIVMTestCase, self).setUp()
#def setUp(self): self.flags(vmwareapi_host_ip='test_url',
# super(VMWareAPIVMTestCase, self).setUp() vmwareapi_host_username='test_username',
# self.flags(vmwareapi_host_ip='test_url', vmwareapi_host_password='test_pass')
# vmwareapi_host_username='test_username', self.user_id = 'fake'
# vmwareapi_host_password='test_pass') self.project_id = 'fake'
# self.manager = manager.AuthManager() self.context = context.RequestContext(self.user_id, self.project_id)
# self.user = self.manager.create_user('fake', 'fake', 'fake', self.network = utils.import_object(FLAGS.network_manager)
# admin=True) vmwareapi_fake.reset()
# self.project = self.manager.create_project('fake', 'fake', 'fake') db_fakes.stub_out_db_instance_api(self.stubs)
# self.network = utils.import_object(FLAGS.network_manager) stubs.set_stubs(self.stubs)
# self.stubs = stubout.StubOutForTesting() glance_stubs.stubout_glance_client(self.stubs)
# vmwareapi_fake.reset() self.conn = vmwareapi_conn.get_connection(False)
# db_fakes.stub_out_db_instance_api(self.stubs) # NOTE(vish): none of the network plugging code is actually
# stubs.set_stubs(self.stubs) # being tested
# glance_stubs.stubout_glance_client(self.stubs, self.network_info = [({'bridge': 'fa0',
# glance_stubs.FakeGlance) 'id': 0,
# self.conn = vmwareapi_conn.get_connection(False) 'vlan': None,
'bridge_interface': None,
'injected': True},
{'broadcast': '192.168.0.255',
'dns': ['192.168.0.1'],
'gateway': '192.168.0.1',
'gateway6': 'dead:beef::1',
'ip6s': [{'enabled': '1',
'ip': 'dead:beef::dcad:beff:feef:0',
'netmask': '64'}],
'ips': [{'enabled': '1',
'ip': '192.168.0.100',
'netmask': '255.255.255.0'}],
'label': 'fake',
'mac': 'DE:AD:BE:EF:00:00',
'rxtx_cap': 3})]
#def tearDown(self): def tearDown(self):
# super(VMWareAPIVMTestCase, self).tearDown() super(VMWareAPIVMTestCase, self).tearDown()
# vmwareapi_fake.cleanup() vmwareapi_fake.cleanup()
# self.manager.delete_project(self.project)
# self.manager.delete_user(self.user)
# self.stubs.UnsetAll()
def _create_instance_in_the_db(self): def _create_instance_in_the_db(self):
values = {'name': 1, values = {'name': 1,
'id': 1, 'id': 1,
'project_id': self.project.id, 'project_id': self.project_id,
'user_id': self.user.id, 'user_id': self.user_id,
'image_id': "1", 'image_ref': "1",
'kernel_id': "1", 'kernel_id': "1",
'ramdisk_id': "1", 'ramdisk_id': "1",
'mac_address': "de:ad:be:ef:be:ef",
'instance_type': 'm1.large', 'instance_type': 'm1.large',
'mac_address': 'aa:bb:cc:dd:ee:ff',
} }
self.instance = db.instance_create(values) self.instance = db.instance_create(None, values)
def _create_vm(self): def _create_vm(self):
"""Create and spawn the VM.""" """Create and spawn the VM."""
self._create_instance_in_the_db() self._create_instance_in_the_db()
self.type_data = db.instance_type_get_by_name(None, 'm1.large') self.type_data = db.instance_type_get_by_name(None, 'm1.large')
self.conn.spawn(self.instance) self.conn.spawn(self.instance, self.network_info)
self._check_vm_record() self._check_vm_record()
def _check_vm_record(self): def _check_vm_record(self):
@@ -129,24 +138,20 @@ class VMWareAPIVMTestCase(test.TestCase):
self.assertEquals(info["mem"], mem_kib) self.assertEquals(info["mem"], mem_kib)
self.assertEquals(info["num_cpu"], self.type_data['vcpus']) self.assertEquals(info["num_cpu"], self.type_data['vcpus'])
@test.skip_test("DB stubbing not removed, needs updating for multi-nic")
def test_list_instances(self): def test_list_instances(self):
instances = self.conn.list_instances() instances = self.conn.list_instances()
self.assertEquals(len(instances), 0) self.assertEquals(len(instances), 0)
@test.skip_test("DB stubbing not removed, needs updating for multi-nic")
def test_list_instances_1(self): def test_list_instances_1(self):
self._create_vm() self._create_vm()
instances = self.conn.list_instances() instances = self.conn.list_instances()
self.assertEquals(len(instances), 1) self.assertEquals(len(instances), 1)
@test.skip_test("DB stubbing not removed, needs updating for multi-nic")
def test_spawn(self): def test_spawn(self):
self._create_vm() self._create_vm()
info = self.conn.get_info(1) info = self.conn.get_info(1)
self._check_vm_info(info, power_state.RUNNING) self._check_vm_info(info, power_state.RUNNING)
@test.skip_test("DB stubbing not removed, needs updating for multi-nic")
def test_snapshot(self): def test_snapshot(self):
self._create_vm() self._create_vm()
info = self.conn.get_info(1) info = self.conn.get_info(1)
@@ -155,27 +160,23 @@ class VMWareAPIVMTestCase(test.TestCase):
info = self.conn.get_info(1) info = self.conn.get_info(1)
self._check_vm_info(info, power_state.RUNNING) self._check_vm_info(info, power_state.RUNNING)
@test.skip_test("DB stubbing not removed, needs updating for multi-nic")
def test_snapshot_non_existent(self): def test_snapshot_non_existent(self):
self._create_instance_in_the_db() self._create_instance_in_the_db()
self.assertRaises(Exception, self.conn.snapshot, self.instance, self.assertRaises(Exception, self.conn.snapshot, self.instance,
"Test-Snapshot") "Test-Snapshot")
@test.skip_test("DB stubbing not removed, needs updating for multi-nic")
def test_reboot(self): def test_reboot(self):
self._create_vm() self._create_vm()
info = self.conn.get_info(1) info = self.conn.get_info(1)
self._check_vm_info(info, power_state.RUNNING) self._check_vm_info(info, power_state.RUNNING)
self.conn.reboot(self.instance) self.conn.reboot(self.instance, self.network_info)
info = self.conn.get_info(1) info = self.conn.get_info(1)
self._check_vm_info(info, power_state.RUNNING) self._check_vm_info(info, power_state.RUNNING)
@test.skip_test("DB stubbing not removed, needs updating for multi-nic")
def test_reboot_non_existent(self): def test_reboot_non_existent(self):
self._create_instance_in_the_db() self._create_instance_in_the_db()
self.assertRaises(Exception, self.conn.reboot, self.instance) self.assertRaises(Exception, self.conn.reboot, self.instance)
@test.skip_test("DB stubbing not removed, needs updating for multi-nic")
def test_reboot_not_poweredon(self): def test_reboot_not_poweredon(self):
self._create_vm() self._create_vm()
info = self.conn.get_info(1) info = self.conn.get_info(1)
@@ -185,7 +186,6 @@ class VMWareAPIVMTestCase(test.TestCase):
self._check_vm_info(info, power_state.PAUSED) self._check_vm_info(info, power_state.PAUSED)
self.assertRaises(Exception, self.conn.reboot, self.instance) self.assertRaises(Exception, self.conn.reboot, self.instance)
@test.skip_test("DB stubbing not removed, needs updating for multi-nic")
def test_suspend(self): def test_suspend(self):
self._create_vm() self._create_vm()
info = self.conn.get_info(1) info = self.conn.get_info(1)
@@ -194,13 +194,11 @@ class VMWareAPIVMTestCase(test.TestCase):
info = self.conn.get_info(1) info = self.conn.get_info(1)
self._check_vm_info(info, power_state.PAUSED) self._check_vm_info(info, power_state.PAUSED)
@test.skip_test("DB stubbing not removed, needs updating for multi-nic")
def test_suspend_non_existent(self): def test_suspend_non_existent(self):
self._create_instance_in_the_db() self._create_instance_in_the_db()
self.assertRaises(Exception, self.conn.suspend, self.instance, self.assertRaises(Exception, self.conn.suspend, self.instance,
self.dummy_callback_handler) self.dummy_callback_handler)
@test.skip_test("DB stubbing not removed, needs updating for multi-nic")
def test_resume(self): def test_resume(self):
self._create_vm() self._create_vm()
info = self.conn.get_info(1) info = self.conn.get_info(1)
@@ -212,13 +210,11 @@ class VMWareAPIVMTestCase(test.TestCase):
info = self.conn.get_info(1) info = self.conn.get_info(1)
self._check_vm_info(info, power_state.RUNNING) self._check_vm_info(info, power_state.RUNNING)
@test.skip_test("DB stubbing not removed, needs updating for multi-nic")
def test_resume_non_existent(self): def test_resume_non_existent(self):
self._create_instance_in_the_db() self._create_instance_in_the_db()
self.assertRaises(Exception, self.conn.resume, self.instance, self.assertRaises(Exception, self.conn.resume, self.instance,
self.dummy_callback_handler) self.dummy_callback_handler)
@test.skip_test("DB stubbing not removed, needs updating for multi-nic")
def test_resume_not_suspended(self): def test_resume_not_suspended(self):
self._create_vm() self._create_vm()
info = self.conn.get_info(1) info = self.conn.get_info(1)
@@ -226,49 +222,41 @@ class VMWareAPIVMTestCase(test.TestCase):
self.assertRaises(Exception, self.conn.resume, self.instance, self.assertRaises(Exception, self.conn.resume, self.instance,
self.dummy_callback_handler) self.dummy_callback_handler)
@test.skip_test("DB stubbing not removed, needs updating for multi-nic")
def test_get_info(self): def test_get_info(self):
self._create_vm() self._create_vm()
info = self.conn.get_info(1) info = self.conn.get_info(1)
self._check_vm_info(info, power_state.RUNNING) self._check_vm_info(info, power_state.RUNNING)
@test.skip_test("DB stubbing not removed, needs updating for multi-nic")
def test_destroy(self): def test_destroy(self):
self._create_vm() self._create_vm()
info = self.conn.get_info(1) info = self.conn.get_info(1)
self._check_vm_info(info, power_state.RUNNING) self._check_vm_info(info, power_state.RUNNING)
instances = self.conn.list_instances() instances = self.conn.list_instances()
self.assertEquals(len(instances), 1) self.assertEquals(len(instances), 1)
self.conn.destroy(self.instance) self.conn.destroy(self.instance, self.network_info)
instances = self.conn.list_instances() instances = self.conn.list_instances()
self.assertEquals(len(instances), 0) self.assertEquals(len(instances), 0)
@test.skip_test("DB stubbing not removed, needs updating for multi-nic")
def test_destroy_non_existent(self): def test_destroy_non_existent(self):
self._create_instance_in_the_db() self._create_instance_in_the_db()
self.assertEquals(self.conn.destroy(self.instance), None) self.assertEquals(self.conn.destroy(self.instance, self.network_info),
None)
@test.skip_test("DB stubbing not removed, needs updating for multi-nic")
def test_pause(self): def test_pause(self):
pass pass
@test.skip_test("DB stubbing not removed, needs updating for multi-nic")
def test_unpause(self): def test_unpause(self):
pass pass
@test.skip_test("DB stubbing not removed, needs updating for multi-nic")
def test_diagnostics(self): def test_diagnostics(self):
pass pass
@test.skip_test("DB stubbing not removed, needs updating for multi-nic")
def test_get_console_output(self): def test_get_console_output(self):
pass pass
@test.skip_test("DB stubbing not removed, needs updating for multi-nic")
def test_get_ajax_console(self): def test_get_ajax_console(self):
pass pass
@test.skip_test("DB stubbing not removed, needs updating for multi-nic")
def dummy_callback_handler(self, ret): def dummy_callback_handler(self, ret):
""" """
Dummy callback function to be passed to suspend, resume, etc., calls. Dummy callback function to be passed to suspend, resume, etc., calls.

View File

@@ -30,7 +30,6 @@ from nova import flags
from nova import log as logging from nova import log as logging
from nova import test from nova import test
from nova import utils from nova import utils
from nova.auth import manager
from nova.compute import instance_types from nova.compute import instance_types
from nova.compute import power_state from nova.compute import power_state
from nova import exception from nova import exception
@@ -69,7 +68,9 @@ class XenAPIVolumeTestCase(test.TestCase):
def setUp(self): def setUp(self):
super(XenAPIVolumeTestCase, self).setUp() super(XenAPIVolumeTestCase, self).setUp()
self.stubs = stubout.StubOutForTesting() self.stubs = stubout.StubOutForTesting()
self.context = context.RequestContext('fake', 'fake', False) self.user_id = 'fake'
self.project_id = 'fake'
self.context = context.RequestContext(self.user_id, self.project_id)
FLAGS.target_host = '127.0.0.1' FLAGS.target_host = '127.0.0.1'
FLAGS.xenapi_connection_url = 'test_url' FLAGS.xenapi_connection_url = 'test_url'
FLAGS.xenapi_connection_password = 'test_pass' FLAGS.xenapi_connection_password = 'test_pass'
@@ -77,7 +78,7 @@ class XenAPIVolumeTestCase(test.TestCase):
stubs.stub_out_get_target(self.stubs) stubs.stub_out_get_target(self.stubs)
xenapi_fake.reset() xenapi_fake.reset()
self.values = {'id': 1, self.values = {'id': 1,
'project_id': 'fake', 'project_id': self.user_id,
'user_id': 'fake', 'user_id': 'fake',
'image_ref': 1, 'image_ref': 1,
'kernel_id': 2, 'kernel_id': 2,
@@ -173,10 +174,6 @@ class XenAPIVMTestCase(test.TestCase):
"""Unit tests for VM operations.""" """Unit tests for VM operations."""
def setUp(self): def setUp(self):
super(XenAPIVMTestCase, self).setUp() super(XenAPIVMTestCase, self).setUp()
self.manager = manager.AuthManager()
self.user = self.manager.create_user('fake', 'fake', 'fake',
admin=True)
self.project = self.manager.create_project('fake', 'fake', 'fake')
self.network = utils.import_object(FLAGS.network_manager) self.network = utils.import_object(FLAGS.network_manager)
self.stubs = stubout.StubOutForTesting() self.stubs = stubout.StubOutForTesting()
self.flags(xenapi_connection_url='test_url', self.flags(xenapi_connection_url='test_url',
@@ -195,7 +192,9 @@ class XenAPIVMTestCase(test.TestCase):
stubs.stub_out_vm_methods(self.stubs) stubs.stub_out_vm_methods(self.stubs)
glance_stubs.stubout_glance_client(self.stubs) glance_stubs.stubout_glance_client(self.stubs)
fake_utils.stub_out_utils_execute(self.stubs) fake_utils.stub_out_utils_execute(self.stubs)
self.context = context.RequestContext('fake', 'fake', False) self.user_id = 'fake'
self.project_id = 'fake'
self.context = context.RequestContext(self.user_id, self.project_id)
self.conn = xenapi_conn.get_connection(False) self.conn = xenapi_conn.get_connection(False)
def test_parallel_builds(self): def test_parallel_builds(self):
@@ -229,8 +228,8 @@ class XenAPIVMTestCase(test.TestCase):
instance = db.instance_create(self.context, values) instance = db.instance_create(self.context, values)
self.conn.spawn(instance, network_info) self.conn.spawn(instance, network_info)
gt1 = eventlet.spawn(_do_build, 1, self.project.id, self.user.id) gt1 = eventlet.spawn(_do_build, 1, self.project_id, self.user_id)
gt2 = eventlet.spawn(_do_build, 2, self.project.id, self.user.id) gt2 = eventlet.spawn(_do_build, 2, self.project_id, self.user_id)
gt1.wait() gt1.wait()
gt2.wait() gt2.wait()
@@ -396,11 +395,13 @@ class XenAPIVMTestCase(test.TestCase):
def _test_spawn(self, image_ref, kernel_id, ramdisk_id, def _test_spawn(self, image_ref, kernel_id, ramdisk_id,
instance_type_id="3", os_type="linux", instance_type_id="3", os_type="linux",
architecture="x86-64", instance_id=1, architecture="x86-64", instance_id=1,
check_injection=False): check_injection=False,
create_record=True):
stubs.stubout_loopingcall_start(self.stubs) stubs.stubout_loopingcall_start(self.stubs)
if create_record:
values = {'id': instance_id, values = {'id': instance_id,
'project_id': self.project.id, 'project_id': self.project_id,
'user_id': self.user.id, 'user_id': self.user_id,
'image_ref': image_ref, 'image_ref': image_ref,
'kernel_id': kernel_id, 'kernel_id': kernel_id,
'ramdisk_id': ramdisk_id, 'ramdisk_id': ramdisk_id,
@@ -408,6 +409,8 @@ class XenAPIVMTestCase(test.TestCase):
'os_type': os_type, 'os_type': os_type,
'architecture': architecture} 'architecture': architecture}
instance = db.instance_create(self.context, values) instance = db.instance_create(self.context, values)
else:
instance = db.instance_get(self.context, instance_id)
network_info = [({'bridge': 'fa0', 'id': 0, 'injected': True}, network_info = [({'bridge': 'fa0', 'id': 0, 'injected': True},
{'broadcast': '192.168.0.255', {'broadcast': '192.168.0.255',
'dns': ['192.168.0.1'], 'dns': ['192.168.0.1'],
@@ -465,12 +468,30 @@ class XenAPIVMTestCase(test.TestCase):
self._check_vdis(vdi_recs_start, vdi_recs_end) self._check_vdis(vdi_recs_start, vdi_recs_end)
def test_spawn_raw_objectstore(self): def test_spawn_raw_objectstore(self):
# TODO(vish): deprecated
from nova.auth import manager
authman = manager.AuthManager()
authman.create_user('fake', 'fake')
authman.create_project('fake', 'fake')
try:
FLAGS.xenapi_image_service = 'objectstore' FLAGS.xenapi_image_service = 'objectstore'
self._test_spawn(1, None, None) self._test_spawn(1, None, None)
finally:
authman.delete_project('fake')
authman.delete_user('fake')
def test_spawn_objectstore(self): def test_spawn_objectstore(self):
# TODO(vish): deprecated
from nova.auth import manager
authman = manager.AuthManager()
authman.create_user('fake', 'fake')
authman.create_project('fake', 'fake')
try:
FLAGS.xenapi_image_service = 'objectstore' FLAGS.xenapi_image_service = 'objectstore'
self._test_spawn(1, 2, 3) self._test_spawn(1, 2, 3)
finally:
authman.delete_project('fake')
authman.delete_user('fake')
@stub_vm_utils_with_vdi_attached_here @stub_vm_utils_with_vdi_attached_here
def test_spawn_raw_glance(self): def test_spawn_raw_glance(self):
@@ -599,41 +620,38 @@ class XenAPIVMTestCase(test.TestCase):
# guest agent is detected # guest agent is detected
self.assertFalse(self._tee_executed) self.assertFalse(self._tee_executed)
@test.skip_test("Never gets an address, not sure why")
def test_spawn_vlanmanager(self): def test_spawn_vlanmanager(self):
self.flags(xenapi_image_service='glance', self.flags(xenapi_image_service='glance',
network_manager='nova.network.manager.VlanManager', network_manager='nova.network.manager.VlanManager',
network_driver='nova.network.xenapi_net',
vlan_interface='fake0') vlan_interface='fake0')
def dummy(*args, **kwargs): def dummy(*args, **kwargs):
pass pass
self.stubs.Set(VMOps, 'create_vifs', dummy) self.stubs.Set(vmops.VMOps, 'create_vifs', dummy)
# Reset network table # Reset network table
xenapi_fake.reset_table('network') xenapi_fake.reset_table('network')
# Instance id = 2 will use vlan network (see db/fakes.py) # Instance id = 2 will use vlan network (see db/fakes.py)
ctxt = self.context.elevated() ctxt = self.context.elevated()
instance_ref = self._create_instance(2) instance = self._create_instance(2, False)
network_bk = self.network
# Ensure we use xenapi_net driver
self.network = utils.import_object(FLAGS.network_manager)
networks = self.network.db.network_get_all(ctxt) networks = self.network.db.network_get_all(ctxt)
for network in networks: for network in networks:
self.network.set_network_host(ctxt, network['id']) self.network.set_network_host(ctxt, network)
self.network.allocate_for_instance(ctxt, instance_id=instance_ref.id, self.network.allocate_for_instance(ctxt,
instance_type_id=1, project_id=self.project.id) instance_id=2,
self.network.setup_compute_network(ctxt, instance_ref.id) host=FLAGS.host,
vpn=None,
instance_type_id=1,
project_id=self.project_id)
self._test_spawn(glance_stubs.FakeGlance.IMAGE_MACHINE, self._test_spawn(glance_stubs.FakeGlance.IMAGE_MACHINE,
glance_stubs.FakeGlance.IMAGE_KERNEL, glance_stubs.FakeGlance.IMAGE_KERNEL,
glance_stubs.FakeGlance.IMAGE_RAMDISK, glance_stubs.FakeGlance.IMAGE_RAMDISK,
instance_id=instance_ref.id, instance_id=2,
create_record=False) create_record=False)
# TODO(salvatore-orlando): a complete test here would require # TODO(salvatore-orlando): a complete test here would require
# a check for making sure the bridge for the VM's VIF is # a check for making sure the bridge for the VM's VIF is
# consistent with bridge specified in nova db # consistent with bridge specified in nova db
self.network = network_bk
def test_spawn_with_network_qos(self): def test_spawn_with_network_qos(self):
self._create_instance() self._create_instance()
@@ -644,10 +662,10 @@ class XenAPIVMTestCase(test.TestCase):
str(3 * 1024)) str(3 * 1024))
def test_rescue(self): def test_rescue(self):
self.flags(xenapi_inject_image=False) self.flags(flat_injected=False)
instance = self._create_instance() instance = self._create_instance()
conn = xenapi_conn.get_connection(False) conn = xenapi_conn.get_connection(False)
conn.rescue(instance, None) conn.rescue(instance, None, [])
def test_unrescue(self): def test_unrescue(self):
instance = self._create_instance() instance = self._create_instance()
@@ -655,21 +673,13 @@ class XenAPIVMTestCase(test.TestCase):
# Ensure that it will not unrescue a non-rescued instance. # Ensure that it will not unrescue a non-rescued instance.
self.assertRaises(Exception, conn.unrescue, instance, None) self.assertRaises(Exception, conn.unrescue, instance, None)
def tearDown(self): def _create_instance(self, instance_id=1, spawn=True):
super(XenAPIVMTestCase, self).tearDown()
self.manager.delete_project(self.project)
self.manager.delete_user(self.user)
self.vm_info = None
self.vm = None
self.stubs.UnsetAll()
def _create_instance(self, instance_id=1):
"""Creates and spawns a test instance.""" """Creates and spawns a test instance."""
stubs.stubout_loopingcall_start(self.stubs) stubs.stubout_loopingcall_start(self.stubs)
values = { values = {
'id': instance_id, 'id': instance_id,
'project_id': self.project.id, 'project_id': self.project_id,
'user_id': self.user.id, 'user_id': self.user_id,
'image_ref': 1, 'image_ref': 1,
'kernel_id': 2, 'kernel_id': 2,
'ramdisk_id': 3, 'ramdisk_id': 3,
@@ -691,6 +701,7 @@ class XenAPIVMTestCase(test.TestCase):
'label': 'fake', 'label': 'fake',
'mac': 'DE:AD:BE:EF:00:00', 'mac': 'DE:AD:BE:EF:00:00',
'rxtx_cap': 3})] 'rxtx_cap': 3})]
if spawn:
self.conn.spawn(instance, network_info) self.conn.spawn(instance, network_info)
return instance return instance
@@ -750,14 +761,12 @@ class XenAPIMigrateInstance(test.TestCase):
stubs.stub_out_get_target(self.stubs) stubs.stub_out_get_target(self.stubs)
xenapi_fake.reset() xenapi_fake.reset()
xenapi_fake.create_network('fake', FLAGS.flat_network_bridge) xenapi_fake.create_network('fake', FLAGS.flat_network_bridge)
self.manager = manager.AuthManager() self.user_id = 'fake'
self.user = self.manager.create_user('fake', 'fake', 'fake', self.project_id = 'fake'
admin=True) self.context = context.RequestContext(self.user_id, self.project_id)
self.project = self.manager.create_project('fake', 'fake', 'fake')
self.context = context.RequestContext('fake', 'fake', False)
self.values = {'id': 1, self.values = {'id': 1,
'project_id': self.project.id, 'project_id': self.project_id,
'user_id': self.user.id, 'user_id': self.user_id,
'image_ref': 1, 'image_ref': 1,
'kernel_id': None, 'kernel_id': None,
'ramdisk_id': None, 'ramdisk_id': None,
@@ -771,20 +780,21 @@ class XenAPIMigrateInstance(test.TestCase):
stubs.stubout_get_this_vm_uuid(self.stubs) stubs.stubout_get_this_vm_uuid(self.stubs)
glance_stubs.stubout_glance_client(self.stubs) glance_stubs.stubout_glance_client(self.stubs)
def tearDown(self):
super(XenAPIMigrateInstance, self).tearDown()
self.manager.delete_project(self.project)
self.manager.delete_user(self.user)
self.stubs.UnsetAll()
def test_migrate_disk_and_power_off(self): def test_migrate_disk_and_power_off(self):
instance = db.instance_create(self.context, self.values) instance = db.instance_create(self.context, self.values)
stubs.stubout_session(self.stubs, stubs.FakeSessionForMigrationTests) stubs.stubout_session(self.stubs, stubs.FakeSessionForMigrationTests)
conn = xenapi_conn.get_connection(False) conn = xenapi_conn.get_connection(False)
conn.migrate_disk_and_power_off(instance, '127.0.0.1') conn.migrate_disk_and_power_off(instance, '127.0.0.1')
def test_finish_resize(self): def test_finish_migrate(self):
instance = db.instance_create(self.context, self.values) instance = db.instance_create(self.context, self.values)
self.called = False
def fake_vdi_resize(*args, **kwargs):
self.called = True
self.stubs.Set(stubs.FakeSessionForMigrationTests,
"VDI_resize_online", fake_vdi_resize)
stubs.stubout_session(self.stubs, stubs.FakeSessionForMigrationTests) stubs.stubout_session(self.stubs, stubs.FakeSessionForMigrationTests)
stubs.stubout_loopingcall_start(self.stubs) stubs.stubout_loopingcall_start(self.stubs)
conn = xenapi_conn.get_connection(False) conn = xenapi_conn.get_connection(False)
@@ -802,8 +812,86 @@ class XenAPIMigrateInstance(test.TestCase):
'label': 'fake', 'label': 'fake',
'mac': 'DE:AD:BE:EF:00:00', 'mac': 'DE:AD:BE:EF:00:00',
'rxtx_cap': 3})] 'rxtx_cap': 3})]
conn.finish_resize(instance, dict(base_copy='hurr', cow='durr'), conn.finish_migration(instance, dict(base_copy='hurr', cow='durr'),
network_info) network_info, resize_instance=True)
self.assertEqual(self.called, True)
def test_finish_migrate_no_local_storage(self):
tiny_type_id = \
instance_types.get_instance_type_by_name('m1.tiny')['id']
self.values.update({'instance_type_id': tiny_type_id, 'local_gb': 0})
instance = db.instance_create(self.context, self.values)
def fake_vdi_resize(*args, **kwargs):
raise Exception("This shouldn't be called")
self.stubs.Set(stubs.FakeSessionForMigrationTests,
"VDI_resize_online", fake_vdi_resize)
stubs.stubout_session(self.stubs, stubs.FakeSessionForMigrationTests)
stubs.stubout_loopingcall_start(self.stubs)
conn = xenapi_conn.get_connection(False)
network_info = [({'bridge': 'fa0', 'id': 0, 'injected': False},
{'broadcast': '192.168.0.255',
'dns': ['192.168.0.1'],
'gateway': '192.168.0.1',
'gateway6': 'dead:beef::1',
'ip6s': [{'enabled': '1',
'ip': 'dead:beef::dcad:beff:feef:0',
'netmask': '64'}],
'ips': [{'enabled': '1',
'ip': '192.168.0.100',
'netmask': '255.255.255.0'}],
'label': 'fake',
'mac': 'DE:AD:BE:EF:00:00',
'rxtx_cap': 3})]
conn.finish_migration(instance, dict(base_copy='hurr', cow='durr'),
network_info, resize_instance=True)
def test_finish_migrate_no_resize_vdi(self):
instance = db.instance_create(self.context, self.values)
def fake_vdi_resize(*args, **kwargs):
raise Exception("This shouldn't be called")
self.stubs.Set(stubs.FakeSessionForMigrationTests,
"VDI_resize_online", fake_vdi_resize)
stubs.stubout_session(self.stubs, stubs.FakeSessionForMigrationTests)
stubs.stubout_loopingcall_start(self.stubs)
conn = xenapi_conn.get_connection(False)
network_info = [({'bridge': 'fa0', 'id': 0, 'injected': False},
{'broadcast': '192.168.0.255',
'dns': ['192.168.0.1'],
'gateway': '192.168.0.1',
'gateway6': 'dead:beef::1',
'ip6s': [{'enabled': '1',
'ip': 'dead:beef::dcad:beff:feef:0',
'netmask': '64'}],
'ips': [{'enabled': '1',
'ip': '192.168.0.100',
'netmask': '255.255.255.0'}],
'label': 'fake',
'mac': 'DE:AD:BE:EF:00:00',
'rxtx_cap': 3})]
# Resize instance would be determined by the compute call
conn.finish_migration(instance, dict(base_copy='hurr', cow='durr'),
network_info, resize_instance=False)
class XenAPIImageTypeTestCase(test.TestCase):
"""Test ImageType class."""
def test_to_string(self):
"""Can convert from type id to type string."""
self.assertEquals(
vm_utils.ImageType.to_string(vm_utils.ImageType.KERNEL),
vm_utils.ImageType.KERNEL_STR)
def test_from_string(self):
"""Can convert from string to type id."""
self.assertEquals(
vm_utils.ImageType.from_string(vm_utils.ImageType.KERNEL_STR),
vm_utils.ImageType.KERNEL)
class XenAPIDetermineDiskImageTestCase(test.TestCase): class XenAPIDetermineDiskImageTestCase(test.TestCase):

View File

@@ -70,8 +70,8 @@ def stub_out_db_instance_api(stubs):
'launch_time': time.strftime('%Y-%m-%dT%H:%M:%SZ', time.gmtime()), 'launch_time': time.strftime('%Y-%m-%dT%H:%M:%SZ', time.gmtime()),
'instance_type': values['instance_type'], 'instance_type': values['instance_type'],
'memory_mb': type_data['memory_mb'], 'memory_mb': type_data['memory_mb'],
'mac_address': values['mac_address'],
'vcpus': type_data['vcpus'], 'vcpus': type_data['vcpus'],
'mac_addresses': [{'address': values['mac_address']}],
'local_gb': type_data['local_gb'], 'local_gb': type_data['local_gb'],
} }
return FakeModel(base_options) return FakeModel(base_options)
@@ -83,6 +83,8 @@ def stub_out_db_instance_api(stubs):
'bridge': 'vmnet0', 'bridge': 'vmnet0',
'netmask': '255.255.255.0', 'netmask': '255.255.255.0',
'gateway': '10.10.10.1', 'gateway': '10.10.10.1',
'broadcast': '10.10.10.255',
'dns1': 'fake',
'vlan': 100} 'vlan': 100}
return FakeModel(fields) return FakeModel(fields)
@@ -90,7 +92,7 @@ def stub_out_db_instance_api(stubs):
"""Stubs out the db.instance_action_create method.""" """Stubs out the db.instance_action_create method."""
pass pass
def fake_instance_get_fixed_address(context, instance_id): def fake_instance_get_fixed_addresses(context, instance_id):
"""Stubs out the db.instance_get_fixed_address method.""" """Stubs out the db.instance_get_fixed_address method."""
return '10.10.10.10' return '10.10.10.10'
@@ -103,7 +105,7 @@ def stub_out_db_instance_api(stubs):
stubs.Set(db, 'instance_create', fake_instance_create) stubs.Set(db, 'instance_create', fake_instance_create)
stubs.Set(db, 'network_get_by_instance', fake_network_get_by_instance) stubs.Set(db, 'network_get_by_instance', fake_network_get_by_instance)
stubs.Set(db, 'instance_action_create', fake_instance_action_create) stubs.Set(db, 'instance_action_create', fake_instance_action_create)
stubs.Set(db, 'instance_get_fixed_address', stubs.Set(db, 'instance_get_fixed_addresses',
fake_instance_get_fixed_address) fake_instance_get_fixed_addresses)
stubs.Set(db, 'instance_type_get_all', fake_instance_type_get_all) stubs.Set(db, 'instance_type_get_all', fake_instance_type_get_all)
stubs.Set(db, 'instance_type_get_by_name', fake_instance_type_get_by_name) stubs.Set(db, 'instance_type_get_by_name', fake_instance_type_get_by_name)

View File

@@ -22,6 +22,8 @@ Stubouts for the test suite
from nova.virt import vmwareapi_conn from nova.virt import vmwareapi_conn
from nova.virt.vmwareapi import fake from nova.virt.vmwareapi import fake
from nova.virt.vmwareapi import vmware_images from nova.virt.vmwareapi import vmware_images
from nova.virt.vmwareapi import vmops
from nova.virt.vmwareapi import network_utils
def fake_get_vim_object(arg): def fake_get_vim_object(arg):
@@ -36,10 +38,15 @@ def fake_is_vim_object(arg, module):
def set_stubs(stubs): def set_stubs(stubs):
"""Set the stubs.""" """Set the stubs."""
stubs.Set(vmops.VMWareVMOps, 'plug_vifs', fake.fake_plug_vifs)
stubs.Set(network_utils, 'get_network_with_the_name',
fake.fake_get_network)
stubs.Set(vmware_images, 'fetch_image', fake.fake_fetch_image) stubs.Set(vmware_images, 'fetch_image', fake.fake_fetch_image)
stubs.Set(vmware_images, 'get_vmdk_size_and_properties', stubs.Set(vmware_images, 'get_vmdk_size_and_properties',
fake.fake_get_vmdk_size_and_properties) fake.fake_get_vmdk_size_and_properties)
stubs.Set(vmware_images, 'upload_image', fake.fake_upload_image) stubs.Set(vmware_images, 'upload_image', fake.fake_upload_image)
stubs.Set(vmwareapi_conn.VMWareAPISession, "_get_vim_object",
fake_get_vim_object)
stubs.Set(vmwareapi_conn.VMWareAPISession, "_get_vim_object", stubs.Set(vmwareapi_conn.VMWareAPISession, "_get_vim_object",
fake_get_vim_object) fake_get_vim_object)
stubs.Set(vmwareapi_conn.VMWareAPISession, "_is_vim_object", stubs.Set(vmwareapi_conn.VMWareAPISession, "_is_vim_object",

View File

@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-03-19 06:18+0000\n" "X-Launchpad-Export-Date: 2011-07-23 05:11+0000\n"
"X-Generator: Launchpad (build 12559)\n" "X-Generator: Launchpad (build 13405)\n"
#: ../nova/scheduler/chance.py:37 ../nova/scheduler/zone.py:55 #: ../nova/scheduler/chance.py:37 ../nova/scheduler/zone.py:55
#: ../nova/scheduler/simple.py:75 ../nova/scheduler/simple.py:110 #: ../nova/scheduler/simple.py:75 ../nova/scheduler/simple.py:110

View File

@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-03-19 06:18+0000\n" "X-Launchpad-Export-Date: 2011-07-23 05:11+0000\n"
"X-Generator: Launchpad (build 12559)\n" "X-Generator: Launchpad (build 13405)\n"
#: ../nova/scheduler/chance.py:37 ../nova/scheduler/zone.py:55 #: ../nova/scheduler/chance.py:37 ../nova/scheduler/zone.py:55
#: ../nova/scheduler/simple.py:75 ../nova/scheduler/simple.py:110 #: ../nova/scheduler/simple.py:75 ../nova/scheduler/simple.py:110

View File

@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-03-19 06:18+0000\n" "X-Launchpad-Export-Date: 2011-07-23 05:12+0000\n"
"X-Generator: Launchpad (build 12559)\n" "X-Generator: Launchpad (build 13405)\n"
#: ../nova/scheduler/chance.py:37 ../nova/scheduler/zone.py:55 #: ../nova/scheduler/chance.py:37 ../nova/scheduler/zone.py:55
#: ../nova/scheduler/simple.py:75 ../nova/scheduler/simple.py:110 #: ../nova/scheduler/simple.py:75 ../nova/scheduler/simple.py:110

View File

@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: nova\n" "Project-Id-Version: nova\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" "Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-02-21 10:03-0500\n" "POT-Creation-Date: 2011-02-21 10:03-0500\n"
"PO-Revision-Date: 2011-04-03 19:42+0000\n" "PO-Revision-Date: 2011-06-06 07:58+0000\n"
"Last-Translator: Matthias Loidolt <kedapperdrake@googlemail.com>\n" "Last-Translator: Christian Berendt <Unknown>\n"
"Language-Team: German <de@li.org>\n" "Language-Team: German <de@li.org>\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-04-04 05:19+0000\n" "X-Launchpad-Export-Date: 2011-07-23 05:12+0000\n"
"X-Generator: Launchpad (build 12559)\n" "X-Generator: Launchpad (build 13405)\n"
#: ../nova/scheduler/chance.py:37 ../nova/scheduler/zone.py:55 #: ../nova/scheduler/chance.py:37 ../nova/scheduler/zone.py:55
#: ../nova/scheduler/simple.py:75 ../nova/scheduler/simple.py:110 #: ../nova/scheduler/simple.py:75 ../nova/scheduler/simple.py:110
@@ -85,6 +85,7 @@ msgstr ""
#, python-format #, python-format
msgid "%(param)s property not found for image %(_image_id)s" msgid "%(param)s property not found for image %(_image_id)s"
msgstr "" msgstr ""
"Die Property %(param)s konnte im Image %(_image_id)s nicht gefunden werden"
#: ../nova/api/openstack/servers.py:168 #: ../nova/api/openstack/servers.py:168
msgid "No keypairs defined" msgid "No keypairs defined"
@@ -141,12 +142,12 @@ msgstr "PID-Datei %s existiert nicht. Läuft der Daemon nicht?\n"
#: ../nova/twistd.py:221 #: ../nova/twistd.py:221
msgid "No such process" msgid "No such process"
msgstr "" msgstr "Kein passender Prozess gefunden"
#: ../nova/twistd.py:230 ../nova/service.py:224 #: ../nova/twistd.py:230 ../nova/service.py:224
#, python-format #, python-format
msgid "Serving %s" msgid "Serving %s"
msgstr "" msgstr "Bedient %s"
#: ../nova/twistd.py:262 ../nova/service.py:225 #: ../nova/twistd.py:262 ../nova/service.py:225
msgid "Full set of FLAGS:" msgid "Full set of FLAGS:"
@@ -183,12 +184,13 @@ msgstr ""
#: ../nova/virt/xenapi/volumeops.py:91 #: ../nova/virt/xenapi/volumeops.py:91
#, python-format #, python-format
msgid "Unable to attach volume to instance %s" msgid "Unable to attach volume to instance %s"
msgstr "" msgstr "Nicht möglich Volumen zur Instanze %s hinzuzufügen"
#: ../nova/virt/xenapi/volumeops.py:93 #: ../nova/virt/xenapi/volumeops.py:93
#, python-format #, python-format
msgid "Mountpoint %(mountpoint)s attached to instance %(instance_name)s" msgid "Mountpoint %(mountpoint)s attached to instance %(instance_name)s"
msgstr "" msgstr ""
"Einhängepunkt%(mountpoint)s zur Instanze %(instance_name)s hinzugefügt"
#. Detach VBD from VM #. Detach VBD from VM
#: ../nova/virt/xenapi/volumeops.py:104 #: ../nova/virt/xenapi/volumeops.py:104
@@ -199,7 +201,7 @@ msgstr ""
#: ../nova/virt/xenapi/volumeops.py:112 #: ../nova/virt/xenapi/volumeops.py:112
#, python-format #, python-format
msgid "Unable to locate volume %s" msgid "Unable to locate volume %s"
msgstr "" msgstr "Nicht möglich volume %s zufinden"
#: ../nova/virt/xenapi/volumeops.py:120 #: ../nova/virt/xenapi/volumeops.py:120
#, python-format #, python-format
@@ -214,7 +216,7 @@ msgstr ""
#: ../nova/compute/instance_types.py:41 #: ../nova/compute/instance_types.py:41
#, python-format #, python-format
msgid "Unknown instance type: %s" msgid "Unknown instance type: %s"
msgstr "" msgstr "Unbekannter Instanztyp: %s"
#: ../nova/crypto.py:46 #: ../nova/crypto.py:46
msgid "Filename of root CA" msgid "Filename of root CA"
@@ -230,7 +232,7 @@ msgstr "Dateiname der Certificate Revocation List"
#: ../nova/crypto.py:53 #: ../nova/crypto.py:53
msgid "Where we keep our keys" msgid "Where we keep our keys"
msgstr "" msgstr "Wo wir unsere Schlüssel aufbewahren"
#: ../nova/crypto.py:55 #: ../nova/crypto.py:55
msgid "Where we keep our root CA" msgid "Where we keep our root CA"
@@ -298,12 +300,12 @@ msgstr ""
#: ../nova/compute/manager.py:179 #: ../nova/compute/manager.py:179
msgid "Instance has already been created" msgid "Instance has already been created"
msgstr "" msgstr "Instanz wurde bereits erstellt"
#: ../nova/compute/manager.py:180 #: ../nova/compute/manager.py:180
#, python-format #, python-format
msgid "instance %s: starting..." msgid "instance %s: starting..."
msgstr "" msgstr "Instanz %s startet..."
#. pylint: disable=W0702 #. pylint: disable=W0702
#: ../nova/compute/manager.py:219 #: ../nova/compute/manager.py:219
@@ -314,7 +316,7 @@ msgstr ""
#: ../nova/compute/manager.py:233 ../nova/tests/test_cloud.py:286 #: ../nova/compute/manager.py:233 ../nova/tests/test_cloud.py:286
#, python-format #, python-format
msgid "Terminating instance %s" msgid "Terminating instance %s"
msgstr "" msgstr "Beende Instanz %s"
#: ../nova/compute/manager.py:255 #: ../nova/compute/manager.py:255
#, python-format #, python-format
@@ -377,7 +379,7 @@ msgstr ""
#: ../nova/compute/manager.py:372 #: ../nova/compute/manager.py:372
#, python-format #, python-format
msgid "instance %s: rescuing" msgid "instance %s: rescuing"
msgstr "" msgstr "Instanz %s: Rettung"
#: ../nova/compute/manager.py:387 #: ../nova/compute/manager.py:387
#, python-format #, python-format
@@ -387,12 +389,12 @@ msgstr ""
#: ../nova/compute/manager.py:406 #: ../nova/compute/manager.py:406
#, python-format #, python-format
msgid "instance %s: pausing" msgid "instance %s: pausing"
msgstr "" msgstr "Instanz %s pausiert"
#: ../nova/compute/manager.py:423 #: ../nova/compute/manager.py:423
#, python-format #, python-format
msgid "instance %s: unpausing" msgid "instance %s: unpausing"
msgstr "" msgstr "Instanz %s wird fortgesetzt"
#: ../nova/compute/manager.py:440 #: ../nova/compute/manager.py:440
#, python-format #, python-format
@@ -584,7 +586,7 @@ msgstr ""
#: ../nova/virt/connection.py:73 #: ../nova/virt/connection.py:73
msgid "Failed to open connection to the hypervisor" msgid "Failed to open connection to the hypervisor"
msgstr "" msgstr "Konnte Verbindung zum Hypervisor nicht öffnen"
#: ../nova/network/linux_net.py:187 #: ../nova/network/linux_net.py:187
#, python-format #, python-format
@@ -637,7 +639,7 @@ msgstr "Klasse %s konnte nicht gefunden werden"
#: ../nova/utils.py:118 #: ../nova/utils.py:118
#, python-format #, python-format
msgid "Fetching %s" msgid "Fetching %s"
msgstr "" msgstr "Hole %s"
#: ../nova/utils.py:130 #: ../nova/utils.py:130
#, python-format #, python-format
@@ -2562,7 +2564,7 @@ msgstr ""
#: ../nova/auth/manager.py:270 #: ../nova/auth/manager.py:270
#, python-format #, python-format
msgid "Using project name = user name (%s)" msgid "Using project name = user name (%s)"
msgstr "" msgstr "Verwende Project-Name = User-Name (%s)"
#: ../nova/auth/manager.py:277 #: ../nova/auth/manager.py:277
#, python-format #, python-format
@@ -2572,7 +2574,7 @@ msgstr ""
#: ../nova/auth/manager.py:279 #: ../nova/auth/manager.py:279
#, python-format #, python-format
msgid "No project called %s could be found" msgid "No project called %s could be found"
msgstr "" msgstr "Es konnte kein Projekt mit dem Namen %s gefunden werden"
#: ../nova/auth/manager.py:287 #: ../nova/auth/manager.py:287
#, python-format #, python-format
@@ -2696,6 +2698,7 @@ msgstr ""
#: ../nova/service.py:195 #: ../nova/service.py:195
msgid "The service database object disappeared, Recreating it." msgid "The service database object disappeared, Recreating it."
msgstr "" msgstr ""
"Das Service-Datenbank-Objekt ist verschwunden, es wird erneut erzeugt."
#: ../nova/service.py:207 #: ../nova/service.py:207
msgid "Recovered model server connection!" msgid "Recovered model server connection!"
@@ -2723,7 +2726,7 @@ msgstr ""
#: ../nova/auth/ldapdriver.py:472 #: ../nova/auth/ldapdriver.py:472
#, python-format #, python-format
msgid "Group can't be created because group %s already exists" msgid "Group can't be created because group %s already exists"
msgstr "" msgstr "Die Gruppe %s kann nicht angelegt werde, da sie bereits existiert"
#: ../nova/auth/ldapdriver.py:478 #: ../nova/auth/ldapdriver.py:478
#, python-format #, python-format
@@ -2739,6 +2742,7 @@ msgstr ""
#, python-format #, python-format
msgid "User %s can't be added to the group because the user doesn't exist" msgid "User %s can't be added to the group because the user doesn't exist"
msgstr "" msgstr ""
"Der User %s kann nicht zur Gruppe hinzugefügt werde, da er nicht existiert"
#: ../nova/auth/ldapdriver.py:510 ../nova/auth/ldapdriver.py:521 #: ../nova/auth/ldapdriver.py:510 ../nova/auth/ldapdriver.py:521
#, python-format #, python-format
@@ -2755,6 +2759,7 @@ msgstr ""
msgid "" msgid ""
"User %s can't be removed from the group because the user doesn't exist" "User %s can't be removed from the group because the user doesn't exist"
msgstr "" msgstr ""
"Der User %s kann nicht aus der Gruppe entfernt werden, da er nicht existiert"
#: ../nova/auth/ldapdriver.py:528 #: ../nova/auth/ldapdriver.py:528
#, python-format #, python-format
@@ -2840,7 +2845,7 @@ msgstr ""
#: ../nova/api/ec2/admin.py:200 #: ../nova/api/ec2/admin.py:200
#, python-format #, python-format
msgid "Delete project: %s" msgid "Delete project: %s"
msgstr "" msgstr "Lösche Projekt %s"
#: ../nova/api/ec2/admin.py:214 #: ../nova/api/ec2/admin.py:214
#, python-format #, python-format

2848
po/en_AU.po Normal file

File diff suppressed because it is too large Load Diff

2873
po/en_GB.po Normal file

File diff suppressed because it is too large Load Diff

139
po/es.po
View File

@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: nova\n" "Project-Id-Version: nova\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" "Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-02-21 10:03-0500\n" "POT-Creation-Date: 2011-02-21 10:03-0500\n"
"PO-Revision-Date: 2011-03-17 15:54+0000\n" "PO-Revision-Date: 2011-06-30 16:42+0000\n"
"Last-Translator: Erick Huezo <erickhuezo@gmail.com>\n" "Last-Translator: David Caro <Unknown>\n"
"Language-Team: Spanish <es@li.org>\n" "Language-Team: Spanish <es@li.org>\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-03-19 06:19+0000\n" "X-Launchpad-Export-Date: 2011-07-23 05:12+0000\n"
"X-Generator: Launchpad (build 12559)\n" "X-Generator: Launchpad (build 13405)\n"
#: ../nova/scheduler/chance.py:37 ../nova/scheduler/zone.py:55 #: ../nova/scheduler/chance.py:37 ../nova/scheduler/zone.py:55
#: ../nova/scheduler/simple.py:75 ../nova/scheduler/simple.py:110 #: ../nova/scheduler/simple.py:75 ../nova/scheduler/simple.py:110
@@ -36,10 +36,15 @@ msgid ""
"Stdout: %(stdout)r\n" "Stdout: %(stdout)r\n"
"Stderr: %(stderr)r" "Stderr: %(stderr)r"
msgstr "" msgstr ""
"%(description)s\n"
"Comando: %(cmd)s\n"
"Código de salida: %(exit_code)s\n"
"Stdout: %(stdout)r\n"
"Stderr: %(stderr)r"
#: ../nova/exception.py:107 #: ../nova/exception.py:107
msgid "DB exception wrapped" msgid "DB exception wrapped"
msgstr "" msgstr "Excepción DB encapsulada"
#. exc_type, exc_value, exc_traceback = sys.exc_info() #. exc_type, exc_value, exc_traceback = sys.exc_info()
#: ../nova/exception.py:120 #: ../nova/exception.py:120
@@ -49,12 +54,12 @@ msgstr "Excepción no controlada"
#: ../nova/volume/api.py:45 #: ../nova/volume/api.py:45
#, python-format #, python-format
msgid "Quota exceeeded for %(pid)s, tried to create %(size)sG volume" msgid "Quota exceeeded for %(pid)s, tried to create %(size)sG volume"
msgstr "" msgstr "Cuota excedida por %(pid)s, se intentó crear el volumen %(size)sG"
#: ../nova/volume/api.py:47 #: ../nova/volume/api.py:47
#, python-format #, python-format
msgid "Volume quota exceeded. You cannot create a volume of size %sG" msgid "Volume quota exceeded. You cannot create a volume of size %sG"
msgstr "Cuota excedida. No puedes crear un volumen con tamaño %sG" msgstr "Cuota excedida. No puede crear un volumen con tamaño %sG"
#: ../nova/volume/api.py:71 ../nova/volume/api.py:96 #: ../nova/volume/api.py:71 ../nova/volume/api.py:96
msgid "Volume status must be available" msgid "Volume status must be available"
@@ -83,7 +88,7 @@ msgstr "%(param)s propiedad no encontrada para la imagen %(_image_id)s"
#: ../nova/api/openstack/servers.py:168 #: ../nova/api/openstack/servers.py:168
msgid "No keypairs defined" msgid "No keypairs defined"
msgstr "No se definio una Keypairs" msgstr "No se definio un par de llaves (Keypair)"
#: ../nova/api/openstack/servers.py:238 #: ../nova/api/openstack/servers.py:238
#, python-format #, python-format
@@ -103,7 +108,7 @@ msgstr "Compute.api::get_lock %s"
#: ../nova/api/openstack/servers.py:281 #: ../nova/api/openstack/servers.py:281
#, python-format #, python-format
msgid "Compute.api::reset_network %s" msgid "Compute.api::reset_network %s"
msgstr "" msgstr "Compute.api::reset_network %s"
#: ../nova/api/openstack/servers.py:292 #: ../nova/api/openstack/servers.py:292
#, python-format #, python-format
@@ -127,16 +132,16 @@ msgstr "compute.api::resume %s"
#: ../nova/twistd.py:157 #: ../nova/twistd.py:157
msgid "Wrong number of arguments." msgid "Wrong number of arguments."
msgstr "Numero de argumentos incorrectos" msgstr "Cantidad de argumentos incorrecta"
#: ../nova/twistd.py:209 #: ../nova/twistd.py:209
#, python-format #, python-format
msgid "pidfile %s does not exist. Daemon not running?\n" msgid "pidfile %s does not exist. Daemon not running?\n"
msgstr "el pidfile %s no existe. ¿No estará el demonio parado?\n" msgstr "El \"pidfile\" %s no existe. Quizás el servicio no este corriendo.\n"
#: ../nova/twistd.py:221 #: ../nova/twistd.py:221
msgid "No such process" msgid "No such process"
msgstr "No se encontró proceso" msgstr "No existe el proceso"
#: ../nova/twistd.py:230 ../nova/service.py:224 #: ../nova/twistd.py:230 ../nova/service.py:224
#, python-format #, python-format
@@ -145,12 +150,12 @@ msgstr "Sirviendo %s"
#: ../nova/twistd.py:262 ../nova/service.py:225 #: ../nova/twistd.py:262 ../nova/service.py:225
msgid "Full set of FLAGS:" msgid "Full set of FLAGS:"
msgstr "Conjunto completo de opciones:" msgstr "Conjunto completo de opciones (FLAGS):"
#: ../nova/twistd.py:266 #: ../nova/twistd.py:266
#, python-format #, python-format
msgid "Starting %s" msgid "Starting %s"
msgstr "Comenzando %s" msgstr "Iniciando %s"
#: ../nova/virt/xenapi/volumeops.py:48 ../nova/virt/xenapi/volumeops.py:101 #: ../nova/virt/xenapi/volumeops.py:48 ../nova/virt/xenapi/volumeops.py:101
#: ../nova/db/sqlalchemy/api.py:731 ../nova/virt/libvirt_conn.py:741 #: ../nova/db/sqlalchemy/api.py:731 ../nova/virt/libvirt_conn.py:741
@@ -163,17 +168,19 @@ msgstr "La instancia %s no se ha encontrado"
#: ../nova/virt/xenapi/volumeops.py:51 #: ../nova/virt/xenapi/volumeops.py:51
#, python-format #, python-format
msgid "Attach_volume: %(instance_name)s, %(device_path)s, %(mountpoint)s" msgid "Attach_volume: %(instance_name)s, %(device_path)s, %(mountpoint)s"
msgstr "" msgstr "Volumen_unido: %(instance_name)s, %(device_path)s, %(mountpoint)s"
#: ../nova/virt/xenapi/volumeops.py:69 #: ../nova/virt/xenapi/volumeops.py:69
#, python-format #, python-format
msgid "Unable to create VDI on SR %(sr_ref)s for instance %(instance_name)s" msgid "Unable to create VDI on SR %(sr_ref)s for instance %(instance_name)s"
msgstr "" msgstr ""
"No es posible crear el VDI en SR %(sr_ref)s para la instancia "
"%(instance_name)s"
#: ../nova/virt/xenapi/volumeops.py:80 #: ../nova/virt/xenapi/volumeops.py:80
#, python-format #, python-format
msgid "Unable to use SR %(sr_ref)s for instance %(instance_name)s" msgid "Unable to use SR %(sr_ref)s for instance %(instance_name)s"
msgstr "" msgstr "No es posible usar SR %(sr_ref)s para la instancia %(instance_name)s"
#: ../nova/virt/xenapi/volumeops.py:91 #: ../nova/virt/xenapi/volumeops.py:91
#, python-format #, python-format
@@ -184,12 +191,14 @@ msgstr "Imposible adjuntar volumen a la instancia %s"
#, python-format #, python-format
msgid "Mountpoint %(mountpoint)s attached to instance %(instance_name)s" msgid "Mountpoint %(mountpoint)s attached to instance %(instance_name)s"
msgstr "" msgstr ""
"El punto de montaje %(mountpoint)s esta unido a la instancia "
"%(instance_name)s"
#. Detach VBD from VM #. Detach VBD from VM
#: ../nova/virt/xenapi/volumeops.py:104 #: ../nova/virt/xenapi/volumeops.py:104
#, python-format #, python-format
msgid "Detach_volume: %(instance_name)s, %(mountpoint)s" msgid "Detach_volume: %(instance_name)s, %(mountpoint)s"
msgstr "" msgstr "Volume_separado: %(instance_name)s, %(mountpoint)s"
#: ../nova/virt/xenapi/volumeops.py:112 #: ../nova/virt/xenapi/volumeops.py:112
#, python-format #, python-format
@@ -205,6 +214,8 @@ msgstr "Imposible desasociar volumen %s"
#, python-format #, python-format
msgid "Mountpoint %(mountpoint)s detached from instance %(instance_name)s" msgid "Mountpoint %(mountpoint)s detached from instance %(instance_name)s"
msgstr "" msgstr ""
"El punto de montaje %(mountpoint)s se desligó de la instancia "
"%(instance_name)s"
#: ../nova/compute/instance_types.py:41 #: ../nova/compute/instance_types.py:41
#, python-format #, python-format
@@ -259,7 +270,7 @@ msgstr ""
#: ../nova/crypto.py:258 #: ../nova/crypto.py:258
#, python-format #, python-format
msgid "Flags path: %s" msgid "Flags path: %s"
msgstr "" msgstr "Ruta a las opciones: %s"
#: ../nova/scheduler/manager.py:69 #: ../nova/scheduler/manager.py:69
#, python-format #, python-format
@@ -276,6 +287,7 @@ msgstr "check_instance_lock: decorating: |%s|"
msgid "" msgid ""
"check_instance_lock: arguments: |%(self)s| |%(context)s| |%(instance_id)s|" "check_instance_lock: arguments: |%(self)s| |%(context)s| |%(instance_id)s|"
msgstr "" msgstr ""
"check_instance_lock: argumentos: |%(self)s| |%(context)s| |%(instance_id)s|"
#: ../nova/compute/manager.py:84 #: ../nova/compute/manager.py:84
#, python-format #, python-format
@@ -338,6 +350,8 @@ msgid ""
"trying to reboot a non-running instance: %(instance_id)s (state: %(state)s " "trying to reboot a non-running instance: %(instance_id)s (state: %(state)s "
"expected: %(running)s)" "expected: %(running)s)"
msgstr "" msgstr ""
"intentando reiniciar una instancia no ejecutada: %(instance_id)s (state: "
"%(state)s expected: %(running)s)"
#: ../nova/compute/manager.py:311 #: ../nova/compute/manager.py:311
#, python-format #, python-format
@@ -350,6 +364,8 @@ msgid ""
"trying to snapshot a non-running instance: %(instance_id)s (state: %(state)s " "trying to snapshot a non-running instance: %(instance_id)s (state: %(state)s "
"expected: %(running)s)" "expected: %(running)s)"
msgstr "" msgstr ""
"intentando crear una imagen instantanea(snapshot) de una maquina no "
"ejecutada: %(instance_id)s (state: %(state)s expected: %(running)s)"
#: ../nova/compute/manager.py:332 #: ../nova/compute/manager.py:332
#, python-format #, python-format
@@ -357,11 +373,13 @@ msgid ""
"trying to reset the password on a non-running instance: %(instance_id)s " "trying to reset the password on a non-running instance: %(instance_id)s "
"(state: %(instance_state)s expected: %(expected_state)s)" "(state: %(instance_state)s expected: %(expected_state)s)"
msgstr "" msgstr ""
"intentando restablecer el password en una instancia: %(instance_id)s "
"(estado: %(instance_state)s esperado: %(expected_state)s)"
#: ../nova/compute/manager.py:335 #: ../nova/compute/manager.py:335
#, python-format #, python-format
msgid "instance %s: setting admin password" msgid "instance %s: setting admin password"
msgstr "" msgstr "instancia %s: estableciendo password de administrador"
#: ../nova/compute/manager.py:353 #: ../nova/compute/manager.py:353
#, python-format #, python-format
@@ -369,11 +387,13 @@ msgid ""
"trying to inject a file into a non-running instance: %(instance_id)s (state: " "trying to inject a file into a non-running instance: %(instance_id)s (state: "
"%(instance_state)s expected: %(expected_state)s)" "%(instance_state)s expected: %(expected_state)s)"
msgstr "" msgstr ""
"intentando inyectar un archivo dentro de una instancia parada: "
"%(instance_id)s (estado: %(instance_state)s esperado: %(expected_state)s)"
#: ../nova/compute/manager.py:362 #: ../nova/compute/manager.py:362
#, python-format #, python-format
msgid "instance %(nm)s: injecting file to %(plain_path)s" msgid "instance %(nm)s: injecting file to %(plain_path)s"
msgstr "" msgstr "instancia %(nm)s: inyectando archivo en %(plain_path)s"
#: ../nova/compute/manager.py:372 #: ../nova/compute/manager.py:372
#, python-format #, python-format
@@ -393,7 +413,7 @@ msgstr "instancia %s: pausando"
#: ../nova/compute/manager.py:423 #: ../nova/compute/manager.py:423
#, python-format #, python-format
msgid "instance %s: unpausing" msgid "instance %s: unpausing"
msgstr "instnacia %s: continuando tras pausa" msgstr "instancia %s: continuando tras pausa"
#: ../nova/compute/manager.py:440 #: ../nova/compute/manager.py:440
#, python-format #, python-format
@@ -403,7 +423,7 @@ msgstr "instancia %s: obteniendo los diagnosticos"
#: ../nova/compute/manager.py:453 #: ../nova/compute/manager.py:453
#, python-format #, python-format
msgid "instance %s: suspending" msgid "instance %s: suspending"
msgstr "" msgstr "instancia %s: suspendiendo"
#: ../nova/compute/manager.py:472 #: ../nova/compute/manager.py:472
#, python-format #, python-format
@@ -501,7 +521,7 @@ msgstr "Exportando de nuevo los volumenes %s"
#: ../nova/volume/manager.py:90 #: ../nova/volume/manager.py:90
#, python-format #, python-format
msgid "volume %s: skipping export" msgid "volume %s: skipping export"
msgstr "" msgstr "volume %s: saltando exportación"
#: ../nova/volume/manager.py:96 #: ../nova/volume/manager.py:96
#, python-format #, python-format
@@ -511,7 +531,7 @@ msgstr "volumen %s: creando"
#: ../nova/volume/manager.py:108 #: ../nova/volume/manager.py:108
#, python-format #, python-format
msgid "volume %(vol_name)s: creating lv of size %(vol_size)sG" msgid "volume %(vol_name)s: creating lv of size %(vol_size)sG"
msgstr "" msgstr "volume %(vol_name)s: creando lv del tamaño %(vol_size)sG"
#: ../nova/volume/manager.py:112 #: ../nova/volume/manager.py:112
#, python-format #, python-format
@@ -549,7 +569,7 @@ msgstr "volumen %s: eliminado satisfactoriamente"
#: ../nova/virt/xenapi/fake.py:74 #: ../nova/virt/xenapi/fake.py:74
#, python-format #, python-format
msgid "%(text)s: _db_content => %(content)s" msgid "%(text)s: _db_content => %(content)s"
msgstr "" msgstr "%(text)s: _db_content => %(content)s"
#: ../nova/virt/xenapi/fake.py:304 ../nova/virt/xenapi/fake.py:404 #: ../nova/virt/xenapi/fake.py:304 ../nova/virt/xenapi/fake.py:404
#: ../nova/virt/xenapi/fake.py:422 ../nova/virt/xenapi/fake.py:478 #: ../nova/virt/xenapi/fake.py:422 ../nova/virt/xenapi/fake.py:478
@@ -564,7 +584,7 @@ msgstr "xenapi.fake no tiene una implementación para %s"
#: ../nova/virt/xenapi/fake.py:341 #: ../nova/virt/xenapi/fake.py:341
#, python-format #, python-format
msgid "Calling %(localname)s %(impl)s" msgid "Calling %(localname)s %(impl)s"
msgstr "" msgstr "Llamando %(localname)s %(impl)s"
#: ../nova/virt/xenapi/fake.py:346 #: ../nova/virt/xenapi/fake.py:346
#, python-format #, python-format
@@ -618,12 +638,12 @@ msgstr "El pid %d está pasado, relanzando dnsmasq"
#: ../nova/network/linux_net.py:358 #: ../nova/network/linux_net.py:358
#, python-format #, python-format
msgid "killing radvd threw %s" msgid "killing radvd threw %s"
msgstr "" msgstr "Matando radvd lanzado %s"
#: ../nova/network/linux_net.py:360 #: ../nova/network/linux_net.py:360
#, python-format #, python-format
msgid "Pid %d is stale, relaunching radvd" msgid "Pid %d is stale, relaunching radvd"
msgstr "" msgstr "Pid %d corrupto, relanzando radvd"
#. pylint: disable=W0703 #. pylint: disable=W0703
#: ../nova/network/linux_net.py:449 #: ../nova/network/linux_net.py:449
@@ -659,7 +679,7 @@ msgstr "El resultado fue %s"
#: ../nova/utils.py:159 #: ../nova/utils.py:159
#, python-format #, python-format
msgid "Running cmd (SSH): %s" msgid "Running cmd (SSH): %s"
msgstr "" msgstr "corriendo cmd (SSH): %s"
#: ../nova/utils.py:217 #: ../nova/utils.py:217
#, python-format #, python-format
@@ -674,12 +694,12 @@ msgstr "Ejecutando %s"
#: ../nova/utils.py:262 #: ../nova/utils.py:262
#, python-format #, python-format
msgid "Link Local address is not found.:%s" msgid "Link Local address is not found.:%s"
msgstr "" msgstr "No se encuentra la dirección del enlace local.:%s"
#: ../nova/utils.py:265 #: ../nova/utils.py:265
#, python-format #, python-format
msgid "Couldn't get Link Local IP of %(interface)s :%(ex)s" msgid "Couldn't get Link Local IP of %(interface)s :%(ex)s"
msgstr "" msgstr "No se pudo obtener enlace de la ip local de %(interface)s :%(ex)s"
#: ../nova/utils.py:363 #: ../nova/utils.py:363
#, python-format #, python-format
@@ -694,7 +714,7 @@ msgstr "backend %s"
#: ../nova/fakerabbit.py:49 #: ../nova/fakerabbit.py:49
#, python-format #, python-format
msgid "(%(nm)s) publish (key: %(routing_key)s) %(message)s" msgid "(%(nm)s) publish (key: %(routing_key)s) %(message)s"
msgstr "" msgstr "(%(nm)s) publica (key: %(routing_key)s) %(message)s"
#: ../nova/fakerabbit.py:54 #: ../nova/fakerabbit.py:54
#, python-format #, python-format
@@ -714,12 +734,12 @@ msgstr "Declarando intercambio %s"
#: ../nova/fakerabbit.py:96 #: ../nova/fakerabbit.py:96
#, python-format #, python-format
msgid "Binding %(queue)s to %(exchange)s with key %(routing_key)s" msgid "Binding %(queue)s to %(exchange)s with key %(routing_key)s"
msgstr "" msgstr "Enlazando %(queue)s a %(exchange)s con la llave %(routing_key)s"
#: ../nova/fakerabbit.py:121 #: ../nova/fakerabbit.py:121
#, python-format #, python-format
msgid "Getting from %(queue)s: %(message)s" msgid "Getting from %(queue)s: %(message)s"
msgstr "" msgstr "Obtendiendo desde %(queue)s: %(message)s"
#: ../nova/virt/xenapi/vm_utils.py:135 ../nova/virt/hyperv.py:171 #: ../nova/virt/xenapi/vm_utils.py:135 ../nova/virt/hyperv.py:171
#, python-format #, python-format
@@ -729,17 +749,17 @@ msgstr "Creada VM %s..."
#: ../nova/virt/xenapi/vm_utils.py:138 #: ../nova/virt/xenapi/vm_utils.py:138
#, python-format #, python-format
msgid "Created VM %(instance_name)s as %(vm_ref)s." msgid "Created VM %(instance_name)s as %(vm_ref)s."
msgstr "" msgstr "VM creada %(instance_name)s como %(vm_ref)s."
#: ../nova/virt/xenapi/vm_utils.py:168 #: ../nova/virt/xenapi/vm_utils.py:168
#, python-format #, python-format
msgid "Creating VBD for VM %(vm_ref)s, VDI %(vdi_ref)s ... " msgid "Creating VBD for VM %(vm_ref)s, VDI %(vdi_ref)s ... "
msgstr "" msgstr "Creando VBD para VM %(vm_ref)s, VDI %(vdi_ref)s ... "
#: ../nova/virt/xenapi/vm_utils.py:171 #: ../nova/virt/xenapi/vm_utils.py:171
#, python-format #, python-format
msgid "Created VBD %(vbd_ref)s for VM %(vm_ref)s, VDI %(vdi_ref)s." msgid "Created VBD %(vbd_ref)s for VM %(vm_ref)s, VDI %(vdi_ref)s."
msgstr "" msgstr "Creado el VBD %(vbd_ref)s para VM %(vm_ref)s, VDI %(vdi_ref)s"
#: ../nova/virt/xenapi/vm_utils.py:187 #: ../nova/virt/xenapi/vm_utils.py:187
#, python-format #, python-format
@@ -759,12 +779,12 @@ msgstr "Imposible destruir VBD %s"
#: ../nova/virt/xenapi/vm_utils.py:224 #: ../nova/virt/xenapi/vm_utils.py:224
#, python-format #, python-format
msgid "Creating VIF for VM %(vm_ref)s, network %(network_ref)s." msgid "Creating VIF for VM %(vm_ref)s, network %(network_ref)s."
msgstr "" msgstr "Creando VIF para VM %(vm_ref)s, red %(network_ref)s."
#: ../nova/virt/xenapi/vm_utils.py:227 #: ../nova/virt/xenapi/vm_utils.py:227
#, python-format #, python-format
msgid "Created VIF %(vif_ref)s for VM %(vm_ref)s, network %(network_ref)s." msgid "Created VIF %(vif_ref)s for VM %(vm_ref)s, network %(network_ref)s."
msgstr "" msgstr "Creado el VIF %(vif_ref)s para VM %(vm_ref)s, red %(network_ref)s."
#: ../nova/virt/xenapi/vm_utils.py:246 #: ../nova/virt/xenapi/vm_utils.py:246
#, python-format #, python-format
@@ -772,50 +792,52 @@ msgid ""
"Created VDI %(vdi_ref)s (%(name_label)s, %(virtual_size)s, %(read_only)s) on " "Created VDI %(vdi_ref)s (%(name_label)s, %(virtual_size)s, %(read_only)s) on "
"%(sr_ref)s." "%(sr_ref)s."
msgstr "" msgstr ""
"VDI creado %(vdi_ref)s (%(name_label)s, %(virtual_size)s, %(read_only)s) "
"sobre %(sr_ref)s."
#. TODO(sirp): Add quiesce and VSS locking support when Windows support #. TODO(sirp): Add quiesce and VSS locking support when Windows support
#. is added #. is added
#: ../nova/virt/xenapi/vm_utils.py:258 #: ../nova/virt/xenapi/vm_utils.py:258
#, python-format #, python-format
msgid "Snapshotting VM %(vm_ref)s with label '%(label)s'..." msgid "Snapshotting VM %(vm_ref)s with label '%(label)s'..."
msgstr "" msgstr "Creando snapshot de la VM %(vm_ref)s con etiqueta '%(label)s'..."
#: ../nova/virt/xenapi/vm_utils.py:272 #: ../nova/virt/xenapi/vm_utils.py:272
#, python-format #, python-format
msgid "Created snapshot %(template_vm_ref)s from VM %(vm_ref)s." msgid "Created snapshot %(template_vm_ref)s from VM %(vm_ref)s."
msgstr "" msgstr "Instantánea creada %(template_vm_ref)s de la VM %(vm_ref)s."
#: ../nova/virt/xenapi/vm_utils.py:286 #: ../nova/virt/xenapi/vm_utils.py:286
#, python-format #, python-format
msgid "Asking xapi to upload %(vdi_uuids)s as ID %(image_id)s" msgid "Asking xapi to upload %(vdi_uuids)s as ID %(image_id)s"
msgstr "" msgstr "Pidiendo xapi a subir %(vdi_uuids)s como ID %(image_id)s"
#: ../nova/virt/xenapi/vm_utils.py:327 #: ../nova/virt/xenapi/vm_utils.py:327
#, python-format #, python-format
msgid "Size for image %(image)s:%(virtual_size)d" msgid "Size for image %(image)s:%(virtual_size)d"
msgstr "" msgstr "Tamaño para imagen %(image)s:%(virtual_size)d"
#: ../nova/virt/xenapi/vm_utils.py:332 #: ../nova/virt/xenapi/vm_utils.py:332
#, python-format #, python-format
msgid "Glance image %s" msgid "Glance image %s"
msgstr "" msgstr "Imagen Glance %s"
#. we need to invoke a plugin for copying VDI's #. we need to invoke a plugin for copying VDI's
#. content into proper path #. content into proper path
#: ../nova/virt/xenapi/vm_utils.py:342 #: ../nova/virt/xenapi/vm_utils.py:342
#, python-format #, python-format
msgid "Copying VDI %s to /boot/guest on dom0" msgid "Copying VDI %s to /boot/guest on dom0"
msgstr "" msgstr "Copiando VDI %s a /boot/guest on dom0"
#: ../nova/virt/xenapi/vm_utils.py:352 #: ../nova/virt/xenapi/vm_utils.py:352
#, python-format #, python-format
msgid "Kernel/Ramdisk VDI %s destroyed" msgid "Kernel/Ramdisk VDI %s destroyed"
msgstr "" msgstr "Kernel/Ramdisk VDI %s destruído"
#: ../nova/virt/xenapi/vm_utils.py:361 #: ../nova/virt/xenapi/vm_utils.py:361
#, python-format #, python-format
msgid "Asking xapi to fetch %(url)s as %(access)s" msgid "Asking xapi to fetch %(url)s as %(access)s"
msgstr "" msgstr "Pidiendo a xapi que descargue %(url)s como %(access)s"
#: ../nova/virt/xenapi/vm_utils.py:386 ../nova/virt/xenapi/vm_utils.py:402 #: ../nova/virt/xenapi/vm_utils.py:386 ../nova/virt/xenapi/vm_utils.py:402
#, python-format #, python-format
@@ -825,21 +847,21 @@ msgstr "Buscando vid %s para el kernel PV"
#: ../nova/virt/xenapi/vm_utils.py:397 #: ../nova/virt/xenapi/vm_utils.py:397
#, python-format #, python-format
msgid "PV Kernel in VDI:%s" msgid "PV Kernel in VDI:%s"
msgstr "" msgstr "Kernel PV en VDI:%s"
#: ../nova/virt/xenapi/vm_utils.py:405 #: ../nova/virt/xenapi/vm_utils.py:405
#, python-format #, python-format
msgid "Running pygrub against %s" msgid "Running pygrub against %s"
msgstr "" msgstr "Ejecutando pygrub contra %s"
#: ../nova/virt/xenapi/vm_utils.py:411 #: ../nova/virt/xenapi/vm_utils.py:411
#, python-format #, python-format
msgid "Found Xen kernel %s" msgid "Found Xen kernel %s"
msgstr "" msgstr "Kernel Xen Encontrado %s"
#: ../nova/virt/xenapi/vm_utils.py:413 #: ../nova/virt/xenapi/vm_utils.py:413
msgid "No Xen kernel found. Booting HVM." msgid "No Xen kernel found. Booting HVM."
msgstr "" msgstr "Kernel Xen no encontrado. Reiniciando HVM"
#: ../nova/virt/xenapi/vm_utils.py:425 ../nova/virt/hyperv.py:431 #: ../nova/virt/xenapi/vm_utils.py:425 ../nova/virt/hyperv.py:431
#, python-format #, python-format
@@ -864,7 +886,7 @@ msgstr "(VM_UTILS) xenapi power_state -> |%s|"
#: ../nova/virt/xenapi/vm_utils.py:525 #: ../nova/virt/xenapi/vm_utils.py:525
#, python-format #, python-format
msgid "VHD %(vdi_uuid)s has parent %(parent_ref)s" msgid "VHD %(vdi_uuid)s has parent %(parent_ref)s"
msgstr "" msgstr "VHD %(vdi_uuid)s tiene origen en %(parent_ref)s"
#: ../nova/virt/xenapi/vm_utils.py:542 #: ../nova/virt/xenapi/vm_utils.py:542
#, python-format #, python-format
@@ -893,18 +915,19 @@ msgstr "No se han encontrado VDI's para VM %s"
#, python-format #, python-format
msgid "Unexpected number of VDIs (%(num_vdis)s) found for VM %(vm_ref)s" msgid "Unexpected number of VDIs (%(num_vdis)s) found for VM %(vm_ref)s"
msgstr "" msgstr ""
"Numero de VDIs inesperado (%(num_vdis)s) encontrados por VM %(vm_ref)s"
#: ../nova/virt/xenapi/vm_utils.py:653 #: ../nova/virt/xenapi/vm_utils.py:653
#: ../plugins/xenserver/xenapi/etc/xapi.d/plugins/pluginlib_nova.py:188 #: ../plugins/xenserver/xenapi/etc/xapi.d/plugins/pluginlib_nova.py:188
#, python-format #, python-format
msgid "Creating VBD for VDI %s ... " msgid "Creating VBD for VDI %s ... "
msgstr "" msgstr "Creando VBD para VDI %s ... "
#: ../nova/virt/xenapi/vm_utils.py:655 #: ../nova/virt/xenapi/vm_utils.py:655
#: ../plugins/xenserver/xenapi/etc/xapi.d/plugins/pluginlib_nova.py:190 #: ../plugins/xenserver/xenapi/etc/xapi.d/plugins/pluginlib_nova.py:190
#, python-format #, python-format
msgid "Creating VBD for VDI %s done." msgid "Creating VBD for VDI %s done."
msgstr "" msgstr "Creando VBF para VDI %s terminado"
#: ../nova/virt/xenapi/vm_utils.py:657 #: ../nova/virt/xenapi/vm_utils.py:657
#: ../plugins/xenserver/xenapi/etc/xapi.d/plugins/pluginlib_nova.py:192 #: ../plugins/xenserver/xenapi/etc/xapi.d/plugins/pluginlib_nova.py:192
@@ -2850,12 +2873,12 @@ msgstr ""
#: ../nova/api/ec2/admin.py:177 #: ../nova/api/ec2/admin.py:177
#, python-format #, python-format
msgid "Create project %(name)s managed by %(manager_user)s" msgid "Create project %(name)s managed by %(manager_user)s"
msgstr "" msgstr "Crear proyecto %(name)s administrador por %(manager_user)s"
#: ../nova/api/ec2/admin.py:190 #: ../nova/api/ec2/admin.py:190
#, python-format #, python-format
msgid "Modify project: %(name)s managed by %(manager_user)s" msgid "Modify project: %(name)s managed by %(manager_user)s"
msgstr "" msgstr "Modificar proyecto: %(name)s administrado por %(manager_user)s"
#: ../nova/api/ec2/admin.py:200 #: ../nova/api/ec2/admin.py:200
#, python-format #, python-format
@@ -2865,12 +2888,12 @@ msgstr "Borrar proyecto: %s"
#: ../nova/api/ec2/admin.py:214 #: ../nova/api/ec2/admin.py:214
#, python-format #, python-format
msgid "Adding user %(user)s to project %(project)s" msgid "Adding user %(user)s to project %(project)s"
msgstr "" msgstr "Agregando usuario %(user)s al proyecto %(project)s"
#: ../nova/api/ec2/admin.py:218 #: ../nova/api/ec2/admin.py:218
#, python-format #, python-format
msgid "Removing user %(user)s from project %(project)s" msgid "Removing user %(user)s from project %(project)s"
msgstr "" msgstr "Eliminando el usuario %(user)s del proyecto %(project)s"
#, python-format #, python-format
#~ msgid "" #~ msgid ""

2992
po/fr.po Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-03-19 06:19+0000\n" "X-Launchpad-Export-Date: 2011-07-23 05:12+0000\n"
"X-Generator: Launchpad (build 12559)\n" "X-Generator: Launchpad (build 13405)\n"
#: ../nova/scheduler/chance.py:37 ../nova/scheduler/zone.py:55 #: ../nova/scheduler/chance.py:37 ../nova/scheduler/zone.py:55
#: ../nova/scheduler/simple.py:75 ../nova/scheduler/simple.py:110 #: ../nova/scheduler/simple.py:75 ../nova/scheduler/simple.py:110

482
po/ja.po

File diff suppressed because it is too large Load Diff

View File

@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-03-25 05:22+0000\n" "X-Launchpad-Export-Date: 2011-07-23 05:12+0000\n"
"X-Generator: Launchpad (build 12559)\n" "X-Generator: Launchpad (build 13405)\n"
#: ../nova/scheduler/chance.py:37 ../nova/scheduler/zone.py:55 #: ../nova/scheduler/chance.py:37 ../nova/scheduler/zone.py:55
#: ../nova/scheduler/simple.py:75 ../nova/scheduler/simple.py:110 #: ../nova/scheduler/simple.py:75 ../nova/scheduler/simple.py:110

View File

@@ -8,20 +8,20 @@ msgstr ""
"Project-Id-Version: nova\n" "Project-Id-Version: nova\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" "Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-02-21 10:03-0500\n" "POT-Creation-Date: 2011-02-21 10:03-0500\n"
"PO-Revision-Date: 2011-03-30 07:06+0000\n" "PO-Revision-Date: 2011-07-09 07:20+0000\n"
"Last-Translator: Andrey Olykainen <Unknown>\n" "Last-Translator: ilya kislicyn <Unknown>\n"
"Language-Team: Russian <ru@li.org>\n" "Language-Team: Russian <ru@li.org>\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-03-31 05:58+0000\n" "X-Launchpad-Export-Date: 2011-07-23 05:12+0000\n"
"X-Generator: Launchpad (build 12559)\n" "X-Generator: Launchpad (build 13405)\n"
#: ../nova/scheduler/chance.py:37 ../nova/scheduler/zone.py:55 #: ../nova/scheduler/chance.py:37 ../nova/scheduler/zone.py:55
#: ../nova/scheduler/simple.py:75 ../nova/scheduler/simple.py:110 #: ../nova/scheduler/simple.py:75 ../nova/scheduler/simple.py:110
#: ../nova/scheduler/simple.py:122 #: ../nova/scheduler/simple.py:122
msgid "No hosts found" msgid "No hosts found"
msgstr "" msgstr "Узлы не найдены"
#: ../nova/exception.py:33 #: ../nova/exception.py:33
msgid "Unexpected error while running command." msgid "Unexpected error while running command."
@@ -54,7 +54,7 @@ msgstr ""
#: ../nova/volume/api.py:47 #: ../nova/volume/api.py:47
#, python-format #, python-format
msgid "Volume quota exceeded. You cannot create a volume of size %sG" msgid "Volume quota exceeded. You cannot create a volume of size %sG"
msgstr "" msgstr "Квота тома превышена. Вы не можете создать том размером %sG"
#: ../nova/volume/api.py:71 ../nova/volume/api.py:96 #: ../nova/volume/api.py:71 ../nova/volume/api.py:96
msgid "Volume status must be available" msgid "Volume status must be available"
@@ -62,19 +62,19 @@ msgstr ""
#: ../nova/volume/api.py:98 #: ../nova/volume/api.py:98
msgid "Volume is already attached" msgid "Volume is already attached"
msgstr "" msgstr "Том уже смотирован"
#: ../nova/volume/api.py:104 #: ../nova/volume/api.py:104
msgid "Volume is already detached" msgid "Volume is already detached"
msgstr "" msgstr "Том уже отмонтирован"
#: ../nova/api/openstack/servers.py:72 #: ../nova/api/openstack/servers.py:72
msgid "Failed to read private ip" msgid "Failed to read private ip"
msgstr "" msgstr "Ошибка чтения приватного IP адреса"
#: ../nova/api/openstack/servers.py:79 #: ../nova/api/openstack/servers.py:79
msgid "Failed to read public ip(s)" msgid "Failed to read public ip(s)"
msgstr "" msgstr "Ошибка чтения публичных IP адресов"
#: ../nova/api/openstack/servers.py:152 #: ../nova/api/openstack/servers.py:152
#, python-format #, python-format
@@ -83,7 +83,7 @@ msgstr ""
#: ../nova/api/openstack/servers.py:168 #: ../nova/api/openstack/servers.py:168
msgid "No keypairs defined" msgid "No keypairs defined"
msgstr "" msgstr "Не определены ключевые пары"
#: ../nova/api/openstack/servers.py:238 #: ../nova/api/openstack/servers.py:238
#, python-format #, python-format

2855
po/tl.po Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-03-19 06:19+0000\n" "X-Launchpad-Export-Date: 2011-07-23 05:12+0000\n"
"X-Generator: Launchpad (build 12559)\n" "X-Generator: Launchpad (build 13405)\n"
#: ../nova/scheduler/chance.py:37 ../nova/scheduler/zone.py:55 #: ../nova/scheduler/chance.py:37 ../nova/scheduler/zone.py:55
#: ../nova/scheduler/simple.py:75 ../nova/scheduler/simple.py:110 #: ../nova/scheduler/simple.py:75 ../nova/scheduler/simple.py:110

View File

@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: nova\n" "Project-Id-Version: nova\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" "Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-02-21 10:03-0500\n" "POT-Creation-Date: 2011-02-21 10:03-0500\n"
"PO-Revision-Date: 2011-04-07 05:01+0000\n" "PO-Revision-Date: 2011-06-14 14:44+0000\n"
"Last-Translator: ben <Unknown>\n" "Last-Translator: chong <Unknown>\n"
"Language-Team: Chinese (Simplified) <zh_CN@li.org>\n" "Language-Team: Chinese (Simplified) <zh_CN@li.org>\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-04-08 05:28+0000\n" "X-Launchpad-Export-Date: 2011-07-23 05:12+0000\n"
"X-Generator: Launchpad (build 12735)\n" "X-Generator: Launchpad (build 13405)\n"
#: ../nova/twistd.py:266 #: ../nova/twistd.py:266
#, python-format #, python-format
@@ -26,7 +26,7 @@ msgstr "启动 %s 中"
#: ../nova/scheduler/simple.py:75 ../nova/scheduler/simple.py:110 #: ../nova/scheduler/simple.py:75 ../nova/scheduler/simple.py:110
#: ../nova/scheduler/simple.py:122 #: ../nova/scheduler/simple.py:122
msgid "No hosts found" msgid "No hosts found"
msgstr "找到主机" msgstr "没有找到主机"
#: ../nova/exception.py:33 #: ../nova/exception.py:33
msgid "Unexpected error while running command." msgid "Unexpected error while running command."
@@ -41,6 +41,11 @@ msgid ""
"Stdout: %(stdout)r\n" "Stdout: %(stdout)r\n"
"Stderr: %(stderr)r" "Stderr: %(stderr)r"
msgstr "" msgstr ""
"%(description)s\n"
"命令: %(cmd)s\n"
"退出代码: %(exit_code)s\n"
"标准输出: %(stdout)r\n"
"标准出错: %(stderr)r"
#: ../nova/exception.py:107 #: ../nova/exception.py:107
msgid "DB exception wrapped" msgid "DB exception wrapped"
@@ -309,17 +314,17 @@ msgstr ""
#: ../nova/compute/manager.py:233 ../nova/tests/test_cloud.py:286 #: ../nova/compute/manager.py:233 ../nova/tests/test_cloud.py:286
#, python-format #, python-format
msgid "Terminating instance %s" msgid "Terminating instance %s"
msgstr "" msgstr "正在结束实例 %s"
#: ../nova/compute/manager.py:255 #: ../nova/compute/manager.py:255
#, python-format #, python-format
msgid "Deallocating address %s" msgid "Deallocating address %s"
msgstr "" msgstr "取消分配地址 %s"
#: ../nova/compute/manager.py:268 #: ../nova/compute/manager.py:268
#, python-format #, python-format
msgid "trying to destroy already destroyed instance: %s" msgid "trying to destroy already destroyed instance: %s"
msgstr "" msgstr "尝试销毁已经销毁的实例: %s"
#: ../nova/compute/manager.py:282 #: ../nova/compute/manager.py:282
#, python-format #, python-format
@@ -331,12 +336,12 @@ msgstr "重启虚拟机 %s"
msgid "" msgid ""
"trying to reboot a non-running instance: %(instance_id)s (state: %(state)s " "trying to reboot a non-running instance: %(instance_id)s (state: %(state)s "
"expected: %(running)s)" "expected: %(running)s)"
msgstr "" msgstr "尝试重启没有在运行中实例: %(instance_id)s (状态: %(state)s 预料: %(running)s)"
#: ../nova/compute/manager.py:311 #: ../nova/compute/manager.py:311
#, python-format #, python-format
msgid "instance %s: snapshotting" msgid "instance %s: snapshotting"
msgstr "" msgstr "实例 %s: 快照中"
#: ../nova/compute/manager.py:316 #: ../nova/compute/manager.py:316
#, python-format #, python-format
@@ -351,6 +356,8 @@ msgid ""
"trying to reset the password on a non-running instance: %(instance_id)s " "trying to reset the password on a non-running instance: %(instance_id)s "
"(state: %(instance_state)s expected: %(expected_state)s)" "(state: %(instance_state)s expected: %(expected_state)s)"
msgstr "" msgstr ""
"尝试对没有在运行的实例重置密码: %(instance_id)s (状态: %(instance_state)s 预料: "
"%(expected_state)s)"
#: ../nova/compute/manager.py:335 #: ../nova/compute/manager.py:335
#, python-format #, python-format

2848
po/zh_TW.po Normal file

File diff suppressed because it is too large Load Diff