Merge "fix restructuredtext formatting in docstrings that show up in the developer guide"
This commit is contained in:
commit
a74fbcdadb
@ -20,6 +20,7 @@ do
|
||||
( cat <<EOF
|
||||
${heading}
|
||||
${underline}
|
||||
|
||||
.. automodule:: ${x}
|
||||
:members:
|
||||
:undoc-members:
|
||||
|
@ -96,7 +96,7 @@ exclude_trees = []
|
||||
|
||||
# If true, the current module name will be prepended to all description
|
||||
# unit titles (such as .. function::).
|
||||
#add_module_names = True
|
||||
add_module_names = False
|
||||
|
||||
# If true, sectionauthor and moduleauthor directives will be shown in the
|
||||
# output. They are ignored by default.
|
||||
|
@ -244,9 +244,9 @@ class FakeLDAP(object):
|
||||
def modify_s(self, dn, attrs):
|
||||
"""Modify the object at dn using the attribute list.
|
||||
|
||||
Args:
|
||||
dn -- a dn
|
||||
attrs -- a list of tuples in the following form:
|
||||
:param dn: a dn
|
||||
:param attrs: a list of tuples in the following form::
|
||||
|
||||
([MOD_ADD | MOD_DELETE | MOD_REPACE], attribute, value)
|
||||
|
||||
"""
|
||||
|
@ -126,11 +126,17 @@ class User(AuthBase):
|
||||
"""Object representing a user
|
||||
|
||||
The following attributes are defined:
|
||||
:id: A system identifier for the user. A string (for LDAP)
|
||||
:name: The user name, potentially in some more friendly format
|
||||
:access: The 'username' for EC2 authentication
|
||||
:secret: The 'password' for EC2 authenticatoin
|
||||
:admin: ???
|
||||
|
||||
``id``
|
||||
A system identifier for the user. A string (for LDAP)
|
||||
``name``
|
||||
The user name, potentially in some more friendly format
|
||||
``access``
|
||||
The 'username' for EC2 authentication
|
||||
``secret``
|
||||
The 'password' for EC2 authenticatoin
|
||||
``admin``
|
||||
???
|
||||
"""
|
||||
|
||||
def __init__(self, id, name, access, secret, admin):
|
||||
@ -256,35 +262,35 @@ class AuthManager(object):
|
||||
a project with the same name as the user. This way, older tools
|
||||
that have no project knowledge will still work.
|
||||
|
||||
@type access: str
|
||||
@param access: Access key for user in the form "access:project".
|
||||
:type access: str
|
||||
:param access: Access key for user in the form "access:project".
|
||||
|
||||
@type signature: str
|
||||
@param signature: Signature of the request.
|
||||
:type signature: str
|
||||
:param signature: Signature of the request.
|
||||
|
||||
@type params: list of str
|
||||
@param params: Web paramaters used for the signature.
|
||||
:type params: list of str
|
||||
:param params: Web paramaters used for the signature.
|
||||
|
||||
@type verb: str
|
||||
@param verb: Web request verb ('GET' or 'POST').
|
||||
:type verb: str
|
||||
:param verb: Web request verb ('GET' or 'POST').
|
||||
|
||||
@type server_string: str
|
||||
@param server_string: Web request server string.
|
||||
:type server_string: str
|
||||
:param server_string: Web request server string.
|
||||
|
||||
@type path: str
|
||||
@param path: Web request path.
|
||||
:type path: str
|
||||
:param path: Web request path.
|
||||
|
||||
@type check_type: str
|
||||
@param check_type: Type of signature to check. 'ec2' for EC2, 's3' for
|
||||
:type check_type: str
|
||||
:param check_type: Type of signature to check. 'ec2' for EC2, 's3' for
|
||||
S3. Any other value will cause signature not to be
|
||||
checked.
|
||||
|
||||
@type headers: list
|
||||
@param headers: HTTP headers passed with the request (only needed for
|
||||
:type headers: list
|
||||
:param headers: HTTP headers passed with the request (only needed for
|
||||
s3 signature checks)
|
||||
|
||||
@rtype: tuple (User, Project)
|
||||
@return: User and project that the request represents.
|
||||
:rtype: tuple (User, Project)
|
||||
:return: User and project that the request represents.
|
||||
"""
|
||||
# TODO(vish): check for valid timestamp
|
||||
(access_key, _sep, project_id) = access.partition(':')
|
||||
@ -362,11 +368,11 @@ class AuthManager(object):
|
||||
def is_superuser(self, user):
|
||||
"""Checks for superuser status, allowing user to bypass authorization
|
||||
|
||||
@type user: User or uid
|
||||
@param user: User to check.
|
||||
:type user: User or uid
|
||||
:param user: User to check.
|
||||
|
||||
@rtype: bool
|
||||
@return: True for superuser.
|
||||
:rtype: bool
|
||||
:return: True for superuser.
|
||||
"""
|
||||
if not isinstance(user, User):
|
||||
user = self.get_user(user)
|
||||
@ -380,11 +386,11 @@ class AuthManager(object):
|
||||
def is_admin(self, user):
|
||||
"""Checks for admin status, allowing user to access all projects
|
||||
|
||||
@type user: User or uid
|
||||
@param user: User to check.
|
||||
:type user: User or uid
|
||||
:param user: User to check.
|
||||
|
||||
@rtype: bool
|
||||
@return: True for admin.
|
||||
:rtype: bool
|
||||
:return: True for admin.
|
||||
"""
|
||||
if not isinstance(user, User):
|
||||
user = self.get_user(user)
|
||||
@ -426,17 +432,17 @@ class AuthManager(object):
|
||||
see if the user is the project_manager of the specified project. It
|
||||
is the same as calling is_project_manager(user, project).
|
||||
|
||||
@type user: User or uid
|
||||
@param user: User to check.
|
||||
:type user: User or uid
|
||||
:param user: User to check.
|
||||
|
||||
@type role: str
|
||||
@param role: Role to check.
|
||||
:type role: str
|
||||
:param role: Role to check.
|
||||
|
||||
@type project: Project or project_id
|
||||
@param project: Project in which to look for local role.
|
||||
:type project: Project or project_id
|
||||
:param project: Project in which to look for local role.
|
||||
|
||||
@rtype: bool
|
||||
@return: True if the user has the role.
|
||||
:rtype: bool
|
||||
:return: True if the user has the role.
|
||||
"""
|
||||
if role == 'projectmanager':
|
||||
if not project:
|
||||
@ -465,14 +471,14 @@ class AuthManager(object):
|
||||
|
||||
The 'projectmanager' role is special and can't be added or removed.
|
||||
|
||||
@type user: User or uid
|
||||
@param user: User to which to add role.
|
||||
:type user: User or uid
|
||||
:param user: User to which to add role.
|
||||
|
||||
@type role: str
|
||||
@param role: Role to add.
|
||||
:type role: str
|
||||
:param role: Role to add.
|
||||
|
||||
@type project: Project or project_id
|
||||
@param project: Project in which to add local role.
|
||||
:type project: Project or project_id
|
||||
:param project: Project in which to add local role.
|
||||
"""
|
||||
if role not in FLAGS.allowed_roles:
|
||||
raise exception.UserRoleNotFound(role_id=role)
|
||||
@ -498,14 +504,14 @@ class AuthManager(object):
|
||||
|
||||
The 'projectmanager' role is special and can't be added or removed.
|
||||
|
||||
@type user: User or uid
|
||||
@param user: User from which to remove role.
|
||||
:type user: User or uid
|
||||
:param user: User from which to remove role.
|
||||
|
||||
@type role: str
|
||||
@param role: Role to remove.
|
||||
:type role: str
|
||||
:param role: Role to remove.
|
||||
|
||||
@type project: Project or project_id
|
||||
@param project: Project in which to remove local role.
|
||||
:type project: Project or project_id
|
||||
:param project: Project in which to remove local role.
|
||||
"""
|
||||
uid = User.safe_id(user)
|
||||
pid = Project.safe_id(project)
|
||||
@ -560,23 +566,23 @@ class AuthManager(object):
|
||||
member_users=None):
|
||||
"""Create a project
|
||||
|
||||
@type name: str
|
||||
@param name: Name of the project to create. The name will also be
|
||||
:type name: str
|
||||
:param name: Name of the project to create. The name will also be
|
||||
used as the project id.
|
||||
|
||||
@type manager_user: User or uid
|
||||
@param manager_user: This user will be the project manager.
|
||||
:type manager_user: User or uid
|
||||
:param manager_user: This user will be the project manager.
|
||||
|
||||
@type description: str
|
||||
@param project: Description of the project. If no description is
|
||||
:type description: str
|
||||
:param project: Description of the project. If no description is
|
||||
specified, the name of the project will be used.
|
||||
|
||||
@type member_users: list of User or uid
|
||||
@param: Initial project members. The project manager will always be
|
||||
:type member_users: list of User or uid
|
||||
:param: Initial project members. The project manager will always be
|
||||
added as a member, even if he isn't specified in this list.
|
||||
|
||||
@rtype: Project
|
||||
@return: The new project.
|
||||
:rtype: Project
|
||||
:return: The new project.
|
||||
"""
|
||||
if member_users:
|
||||
member_users = [User.safe_id(u) for u in member_users]
|
||||
@ -594,14 +600,14 @@ class AuthManager(object):
|
||||
def modify_project(self, project, manager_user=None, description=None):
|
||||
"""Modify a project
|
||||
|
||||
@type name: Project or project_id
|
||||
@param project: The project to modify.
|
||||
:type name: Project or project_id
|
||||
:param project: The project to modify.
|
||||
|
||||
@type manager_user: User or uid
|
||||
@param manager_user: This user will be the new project manager.
|
||||
:type manager_user: User or uid
|
||||
:param manager_user: This user will be the new project manager.
|
||||
|
||||
@type description: str
|
||||
@param project: This will be the new description of the project.
|
||||
:type description: str
|
||||
:param project: This will be the new description of the project.
|
||||
|
||||
"""
|
||||
LOG.audit(_("modifying project %s"), Project.safe_id(project))
|
||||
@ -645,11 +651,11 @@ class AuthManager(object):
|
||||
def get_project_vpn_data(project):
|
||||
"""Gets vpn ip and port for project
|
||||
|
||||
@type project: Project or project_id
|
||||
@param project: Project from which to get associated vpn data
|
||||
:type project: Project or project_id
|
||||
:param project: Project from which to get associated vpn data
|
||||
|
||||
@rvalue: tuple of (str, str)
|
||||
@return: A tuple containing (ip, port) or None, None if vpn has
|
||||
:rvalue: tuple of (str, str)
|
||||
:return: A tuple containing (ip, port) or None, None if vpn has
|
||||
not been allocated for user.
|
||||
"""
|
||||
|
||||
@ -696,24 +702,24 @@ class AuthManager(object):
|
||||
def create_user(self, name, access=None, secret=None, admin=False):
|
||||
"""Creates a user
|
||||
|
||||
@type name: str
|
||||
@param name: Name of the user to create.
|
||||
:type name: str
|
||||
:param name: Name of the user to create.
|
||||
|
||||
@type access: str
|
||||
@param access: Access Key (defaults to a random uuid)
|
||||
:type access: str
|
||||
:param access: Access Key (defaults to a random uuid)
|
||||
|
||||
@type secret: str
|
||||
@param secret: Secret Key (defaults to a random uuid)
|
||||
:type secret: str
|
||||
:param secret: Secret Key (defaults to a random uuid)
|
||||
|
||||
@type admin: bool
|
||||
@param admin: Whether to set the admin flag. The admin flag gives
|
||||
:type admin: bool
|
||||
:param admin: Whether to set the admin flag. The admin flag gives
|
||||
superuser status regardless of roles specified for the user.
|
||||
|
||||
@type create_project: bool
|
||||
@param: Whether to create a project for the user with the same name.
|
||||
:type create_project: bool
|
||||
:param: Whether to create a project for the user with the same name.
|
||||
|
||||
@rtype: User
|
||||
@return: The new user.
|
||||
:rtype: User
|
||||
:return: The new user.
|
||||
"""
|
||||
if access is None:
|
||||
access = str(uuid.uuid4())
|
||||
|
@ -49,26 +49,40 @@ def enforce(match_list, target_dict, credentials_dict):
|
||||
"""Enforces authorization of some rules against credentials.
|
||||
|
||||
:param match_list: nested tuples of data to match against
|
||||
|
||||
The basic brain supports three types of match lists:
|
||||
|
||||
1) rules
|
||||
looks like: ('rule:compute:get_instance',)
|
||||
|
||||
looks like: ``('rule:compute:get_instance',)``
|
||||
|
||||
Retrieves the named rule from the rules dict and recursively
|
||||
checks against the contents of the rule.
|
||||
|
||||
2) roles
|
||||
looks like: ('role:compute:admin',)
|
||||
|
||||
looks like: ``('role:compute:admin',)``
|
||||
|
||||
Matches if the specified role is in credentials_dict['roles'].
|
||||
|
||||
3) generic
|
||||
('tenant_id:%(tenant_id)s',)
|
||||
|
||||
looks like: ``('tenant_id:%(tenant_id)s',)``
|
||||
|
||||
Substitutes values from the target dict into the match using
|
||||
the % operator and matches them against the creds dict.
|
||||
|
||||
Combining rules:
|
||||
The brain returns True if any of the outer tuple of rules match
|
||||
and also True if all of the inner tuples match. You can use this to
|
||||
perform simple boolean logic. For example, the following rule would
|
||||
return True if the creds contain the role 'admin' OR the if the
|
||||
tenant_id matches the target dict AND the the creds contains the
|
||||
role 'compute_sysadmin':
|
||||
|
||||
The brain returns True if any of the outer tuple of rules
|
||||
match and also True if all of the inner tuples match. You
|
||||
can use this to perform simple boolean logic. For
|
||||
example, the following rule would return True if the creds
|
||||
contain the role 'admin' OR the if the tenant_id matches
|
||||
the target dict AND the the creds contains the role
|
||||
'compute_sysadmin':
|
||||
|
||||
::
|
||||
|
||||
{
|
||||
"rule:combined": (
|
||||
@ -77,21 +91,22 @@ def enforce(match_list, target_dict, credentials_dict):
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
Note that rule and role are reserved words in the credentials match, so
|
||||
you can't match against properties with those names. Custom brains may
|
||||
also add new reserved words. For example, the HttpBrain adds http as a
|
||||
reserved word.
|
||||
|
||||
:param target_dict: dict of object properties
|
||||
|
||||
Target dicts contain as much information as we can about the object being
|
||||
operated on.
|
||||
|
||||
:param credentials_dict: dict of actor properties
|
||||
|
||||
Credentials dicts contain as much information as we can about the user
|
||||
performing the action.
|
||||
|
||||
:raises NotAuthorized if the check fails
|
||||
:raises NotAuthorized: if the check fails
|
||||
|
||||
"""
|
||||
global _BRAIN
|
||||
|
@ -173,7 +173,7 @@ def handle_flagfiles(args, tempdir=None):
|
||||
def handle_flagfiles_managed(args):
|
||||
'''A context manager for handle_flagfiles() which removes temp files.
|
||||
|
||||
For use with the 'with' statement, i.e.
|
||||
For use with the 'with' statement, i.e.::
|
||||
|
||||
with handle_flagfiles_managed(args) as args:
|
||||
# Do stuff
|
||||
|
@ -79,28 +79,28 @@ def publisher_id(service, host=None):
|
||||
|
||||
|
||||
def notify(publisher_id, event_type, priority, payload):
|
||||
"""
|
||||
Sends a notification using the specified driver
|
||||
"""Sends a notification using the specified driver
|
||||
|
||||
Notify parameters:
|
||||
|
||||
publisher_id - the source worker_type.host of the message
|
||||
event_type - the literal type of event (ex. Instance Creation)
|
||||
priority - patterned after the enumeration of Python logging levels in
|
||||
the set (DEBUG, WARN, INFO, ERROR, CRITICAL)
|
||||
payload - A python dictionary of attributes
|
||||
:param publisher_id: the source worker_type.host of the message
|
||||
:param event_type: the literal type of event (ex. Instance Creation)
|
||||
:param priority: patterned after the enumeration of Python logging
|
||||
levels in the set (DEBUG, WARN, INFO, ERROR, CRITICAL)
|
||||
:param payload: A python dictionary of attributes
|
||||
|
||||
Outgoing message format includes the above parameters, and appends the
|
||||
following:
|
||||
|
||||
message_id - a UUID representing the id for this notification
|
||||
timestamp - the GMT timestamp the notification was sent at
|
||||
message_id
|
||||
a UUID representing the id for this notification
|
||||
|
||||
timestamp
|
||||
the GMT timestamp the notification was sent at
|
||||
|
||||
The composite message will be constructed as a dictionary of the above
|
||||
attributes, which will then be sent via the transport mechanism defined
|
||||
by the driver.
|
||||
|
||||
Message example:
|
||||
Message example::
|
||||
|
||||
{'message_id': str(uuid.uuid4()),
|
||||
'publisher_id': 'compute.host1',
|
||||
|
@ -17,7 +17,9 @@
|
||||
r"""
|
||||
Configuration options which may be set on the command line or in config files.
|
||||
|
||||
The schema for each option is defined using the Opt sub-classes e.g.
|
||||
The schema for each option is defined using the Opt sub-classes, e.g.:
|
||||
|
||||
::
|
||||
|
||||
common_opts = [
|
||||
cfg.StrOpt('bind_host',
|
||||
@ -28,7 +30,7 @@ The schema for each option is defined using the Opt sub-classes e.g.
|
||||
help='Port number to listen on')
|
||||
]
|
||||
|
||||
Options can be strings, integers, floats, booleans, lists or 'multi strings':
|
||||
Options can be strings, integers, floats, booleans, lists or 'multi strings'::
|
||||
|
||||
enabled_apis_opt = cfg.ListOpt('enabled_apis',
|
||||
default=['ec2', 'osapi_compute'],
|
||||
@ -41,7 +43,7 @@ Options can be strings, integers, floats, booleans, lists or 'multi strings':
|
||||
default=DEFAULT_EXTENSIONS)
|
||||
|
||||
Option schemas are registered with with the config manager at runtime, but
|
||||
before the option is referenced:
|
||||
before the option is referenced::
|
||||
|
||||
class ExtensionManager(object):
|
||||
|
||||
@ -57,7 +59,7 @@ before the option is referenced:
|
||||
....
|
||||
|
||||
A common usage pattern is for each option schema to be defined in the module or
|
||||
class which uses the option:
|
||||
class which uses the option::
|
||||
|
||||
opts = ...
|
||||
|
||||
@ -72,7 +74,7 @@ class which uses the option:
|
||||
|
||||
An option may optionally be made available via the command line. Such options
|
||||
must registered with the config manager before the command line is parsed (for
|
||||
the purposes of --help and CLI arg validation):
|
||||
the purposes of --help and CLI arg validation)::
|
||||
|
||||
cli_opts = [
|
||||
cfg.BoolOpt('verbose',
|
||||
@ -88,7 +90,7 @@ the purposes of --help and CLI arg validation):
|
||||
def add_common_opts(conf):
|
||||
conf.register_cli_opts(cli_opts)
|
||||
|
||||
The config manager has a single CLI option defined by default, --config-file:
|
||||
The config manager has a single CLI option defined by default, --config-file::
|
||||
|
||||
class ConfigOpts(object):
|
||||
|
||||
@ -101,7 +103,7 @@ The config manager has a single CLI option defined by default, --config-file:
|
||||
|
||||
Option values are parsed from any supplied config files using SafeConfigParser.
|
||||
If none are specified, a default set is used e.g. glance-api.conf and
|
||||
glance-common.conf:
|
||||
glance-common.conf::
|
||||
|
||||
glance-api.conf:
|
||||
[DEFAULT]
|
||||
@ -116,7 +118,7 @@ are parsed in order, with values in later files overriding those in earlier
|
||||
files.
|
||||
|
||||
The parsing of CLI args and config files is initiated by invoking the config
|
||||
manager e.g.
|
||||
manager e.g.::
|
||||
|
||||
conf = ConfigOpts()
|
||||
conf.register_opt(BoolOpt('verbose', ...))
|
||||
@ -124,7 +126,7 @@ manager e.g.
|
||||
if conf.verbose:
|
||||
...
|
||||
|
||||
Options can be registered as belonging to a group:
|
||||
Options can be registered as belonging to a group::
|
||||
|
||||
rabbit_group = cfg.OptionGroup(name='rabbit',
|
||||
title='RabbitMQ options')
|
||||
@ -143,7 +145,7 @@ Options can be registered as belonging to a group:
|
||||
conf.register_opt(rabbit_port_opt, group='rabbit')
|
||||
|
||||
If no group is specified, options belong to the 'DEFAULT' section of config
|
||||
files:
|
||||
files::
|
||||
|
||||
glance-api.conf:
|
||||
[DEFAULT]
|
||||
@ -158,13 +160,14 @@ files:
|
||||
password = guest
|
||||
virtual_host = /
|
||||
|
||||
Command-line options in a group are automatically prefixed with the group name:
|
||||
Command-line options in a group are automatically prefixed with the
|
||||
group name::
|
||||
|
||||
--rabbit-host localhost --rabbit-port 9999
|
||||
|
||||
Option values in the default group are referenced as attributes/properties on
|
||||
the config manager; groups are also attributes on the config manager, with
|
||||
attributes for each of the options associated with the group:
|
||||
attributes for each of the options associated with the group::
|
||||
|
||||
server.start(app, conf.bind_port, conf.bind_host, conf)
|
||||
|
||||
@ -173,7 +176,7 @@ attributes for each of the options associated with the group:
|
||||
port=conf.rabbit.port,
|
||||
...)
|
||||
|
||||
Option values may reference other values using PEP 292 string substitution:
|
||||
Option values may reference other values using PEP 292 string substitution::
|
||||
|
||||
opts = [
|
||||
cfg.StrOpt('state_path',
|
||||
@ -191,15 +194,15 @@ Note that interpolation can be avoided by using '$$'.
|
||||
|
||||
For command line utilities that dispatch to other command line utilities, the
|
||||
disable_interspersed_args() method is available. If this this method is called,
|
||||
then parsing e.g.
|
||||
then parsing e.g.::
|
||||
|
||||
script --verbose cmd --debug /tmp/mything
|
||||
|
||||
will no longer return:
|
||||
will no longer return::
|
||||
|
||||
['cmd', '/tmp/mything']
|
||||
|
||||
as the leftover arguments, but will instead return:
|
||||
as the leftover arguments, but will instead return::
|
||||
|
||||
['cmd', '--debug', '/tmp/mything']
|
||||
|
||||
@ -307,9 +310,12 @@ class ConfigFileValueError(Error):
|
||||
def find_config_files(project=None, prog=None):
|
||||
"""Return a list of default configuration files.
|
||||
|
||||
:param project: an optional project name
|
||||
:param prog: the program name, defaulting to the basename of sys.argv[0]
|
||||
|
||||
We default to two config files: [${project}.conf, ${prog}.conf]
|
||||
|
||||
And we look for those config files in the following directories:
|
||||
And we look for those config files in the following directories::
|
||||
|
||||
~/.${project}/
|
||||
~/
|
||||
@ -324,9 +330,6 @@ def find_config_files(project=None, prog=None):
|
||||
'~/.foo/bar.conf']
|
||||
|
||||
If no project name is supplied, we only look for ${prog.conf}.
|
||||
|
||||
:param project: an optional project name
|
||||
:param prog: the program name, defaulting to the basename of sys.argv[0]
|
||||
"""
|
||||
if prog is None:
|
||||
prog = os.path.basename(sys.argv[0])
|
||||
|
@ -68,15 +68,15 @@ def enforce(context, action, target):
|
||||
:param context: nova context
|
||||
:param action: string representing the action to be checked
|
||||
this should be colon separated for clarity.
|
||||
i.e. compute:create_instance
|
||||
compute:attach_volume
|
||||
volume:attach_volume
|
||||
i.e. ``compute:create_instance``,
|
||||
``compute:attach_volume``,
|
||||
``volume:attach_volume``
|
||||
|
||||
:param object: dictionary representing the object of the action
|
||||
for object creation this should be a dictionary representing the
|
||||
location of the object e.g. {'project_id': context.project_id}
|
||||
location of the object e.g. ``{'project_id': context.project_id}``
|
||||
|
||||
:raises: `nova.exception.PolicyNotAllowed` if verification fails.
|
||||
:raises nova.exception.PolicyNotAllowed: if verification fails.
|
||||
|
||||
"""
|
||||
init()
|
||||
|
@ -194,6 +194,7 @@ class Scheduler(object):
|
||||
block_migration=False,
|
||||
disk_over_commit=False):
|
||||
"""Live migration scheduling method.
|
||||
|
||||
:param context:
|
||||
:param instance_id:
|
||||
:param dest: destination host
|
||||
|
@ -79,16 +79,19 @@ def compute_fill_first_cost_fn(host_state, weighing_properties):
|
||||
|
||||
def weighted_sum(weighted_fns, host_states, weighing_properties):
|
||||
"""Use the weighted-sum method to compute a score for an array of objects.
|
||||
|
||||
Normalize the results of the objective-functions so that the weights are
|
||||
meaningful regardless of objective-function's range.
|
||||
|
||||
host_list - [(host, HostInfo()), ...]
|
||||
weighted_fns - list of weights and functions like:
|
||||
[(weight, objective-functions), ...]
|
||||
weighing_properties is an arbitrary dict of values that can influence
|
||||
weights.
|
||||
:param host_list: ``[(host, HostInfo()), ...]``
|
||||
:param weighted_fns: list of weights and functions like::
|
||||
|
||||
Returns a single WeightedHost object which represents the best
|
||||
[(weight, objective-functions), ...]
|
||||
|
||||
:param weighing_properties: an arbitrary dict of values that can
|
||||
influence weights.
|
||||
|
||||
:returns: a single WeightedHost object which represents the best
|
||||
candidate.
|
||||
"""
|
||||
|
||||
|
@ -179,7 +179,8 @@ class SchedulerManager(manager.Manager):
|
||||
:param context: security context
|
||||
:param host: hostname
|
||||
:returns:
|
||||
example format is below.
|
||||
example format is below::
|
||||
|
||||
{'resource':D, 'usage':{proj_id1:D, proj_id2:D}}
|
||||
D: {'vcpus': 3, 'memory_mb': 2048, 'local_gb': 2048,
|
||||
'vcpus_used': 12, 'memory_mb_used': 10240,
|
||||
|
@ -116,6 +116,7 @@ def vpn_ping(address, port, timeout=0.05, session_id=None):
|
||||
Returns False on a failure. Basic packet structure is below.
|
||||
|
||||
Client packet (14 bytes)::
|
||||
|
||||
0 1 8 9 13
|
||||
+-+--------+-----+
|
||||
|x| cli_id |?????|
|
||||
@ -125,6 +126,7 @@ def vpn_ping(address, port, timeout=0.05, session_id=None):
|
||||
? = unknown, probably flags/padding
|
||||
|
||||
Server packet (26 bytes)::
|
||||
|
||||
0 1 8 9 13 14 21 2225
|
||||
+-+--------+-----+--------+----+
|
||||
|x| srv_id |?????| cli_id |????|
|
||||
@ -162,27 +164,29 @@ def fetchfile(url, target):
|
||||
|
||||
|
||||
def execute(*cmd, **kwargs):
|
||||
"""
|
||||
Helper method to execute command with optional retry.
|
||||
"""Helper method to execute command with optional retry.
|
||||
|
||||
If you add a run_as_root=True command, don't forget to add the
|
||||
corresponding filter to nova.rootwrap !
|
||||
|
||||
:cmd Passed to subprocess.Popen.
|
||||
:process_input Send to opened process.
|
||||
:check_exit_code Single bool, int, or list of allowed exit codes.
|
||||
Defaults to [0]. Raise exception.ProcessExecutionError
|
||||
unless program exits with one of these code.
|
||||
:delay_on_retry True | False. Defaults to True. If set to True, wait a
|
||||
short amount of time before retrying.
|
||||
:attempts How many times to retry cmd.
|
||||
:run_as_root True | False. Defaults to False. If set to True,
|
||||
:param cmd: Passed to subprocess.Popen.
|
||||
:param process_input: Send to opened process.
|
||||
:param check_exit_code: Single bool, int, or list of allowed exit
|
||||
codes. Defaults to [0]. Raise
|
||||
exception.ProcessExecutionError unless
|
||||
program exits with one of these code.
|
||||
:param delay_on_retry: True | False. Defaults to True. If set to
|
||||
True, wait a short amount of time
|
||||
before retrying.
|
||||
:param attempts: How many times to retry cmd.
|
||||
:param run_as_root: True | False. Defaults to False. If set to True,
|
||||
the command is prefixed by the command specified
|
||||
in the root_helper FLAG.
|
||||
|
||||
:raises exception.Error on receiving unknown arguments
|
||||
:raises exception.ProcessExecutionError
|
||||
:raises exception.Error: on receiving unknown arguments
|
||||
:raises exception.ProcessExecutionError:
|
||||
|
||||
:returns a tuple, (stdout, stderr) from the spawned process, or None if
|
||||
:returns: a tuple, (stdout, stderr) from the spawned process, or None if
|
||||
the command fails.
|
||||
"""
|
||||
|
||||
@ -795,14 +799,16 @@ _semaphores = {}
|
||||
def synchronized(name, external=False):
|
||||
"""Synchronization decorator.
|
||||
|
||||
Decorating a method like so:
|
||||
Decorating a method like so::
|
||||
|
||||
@synchronized('mylock')
|
||||
def foo(self, *args):
|
||||
...
|
||||
|
||||
ensures that only one thread will execute the bar method at a time.
|
||||
|
||||
Different methods can share the same lock:
|
||||
Different methods can share the same lock::
|
||||
|
||||
@synchronized('mylock')
|
||||
def foo(self, *args):
|
||||
...
|
||||
@ -1601,7 +1607,8 @@ class UndoManager(object):
|
||||
def rollback_and_reraise(self, msg=None):
|
||||
"""Rollback a series of actions then re-raise the exception.
|
||||
|
||||
NOTE(sirp): This should only be called within an exception handler.
|
||||
.. note:: (sirp) This should only be called within an
|
||||
exception handler.
|
||||
"""
|
||||
with save_and_reraise_exception():
|
||||
if msg:
|
||||
|
@ -19,8 +19,9 @@
|
||||
Handles all requests relating to Virtual Storage Arrays (VSAs).
|
||||
|
||||
Experimental code. Requires special VSA image.
|
||||
|
||||
For assistance and guidelines pls contact
|
||||
Zadara Storage Inc & Openstack community
|
||||
Zadara Storage Inc & Openstack community
|
||||
"""
|
||||
|
||||
from nova import compute
|
||||
@ -143,9 +144,8 @@ class API(base.Base):
|
||||
def create(self, context, display_name='', display_description='',
|
||||
vc_count=1, instance_type=None, image_name=None,
|
||||
availability_zone=None, storage=[], shared=None):
|
||||
"""
|
||||
Provision VSA instance with corresponding compute instances
|
||||
and associated volumes
|
||||
"""Provision VSA instance with compute instances and volumes
|
||||
|
||||
:param storage: List of dictionaries with following keys:
|
||||
disk_name, num_disks, size
|
||||
:param shared: Specifies if storage is dedicated or shared.
|
||||
|
Loading…
Reference in New Issue
Block a user