From c9b4bf8f3eb3bdb51b51b98b6f283415229c2e0e Mon Sep 17 00:00:00 2001 From: Sandy Walsh Date: Mon, 30 May 2011 11:02:55 -0700 Subject: [PATCH 01/70] first pass at reservation id support --- nova/api/openstack/zones.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/nova/api/openstack/zones.py b/nova/api/openstack/zones.py index 29b7b22795..7b495cecf8 100644 --- a/nova/api/openstack/zones.py +++ b/nova/api/openstack/zones.py @@ -114,6 +114,13 @@ class Controller(common.OpenstackController): zone = api.zone_update(context, zone_id, env["zone"]) return dict(zone=_scrub_zone(zone)) + def boot(self, req): + """Creates a new server for a given user while being Zone aware.""" + reservation_id = \ + common.create(req, self.compute_api.create_all_at_once) + + return {'reservation': {'reservation_id': reservation_id}} + @check_encryption_key def select(self, req): """Returns a weighted list of costs to create instances From d428a8e4f9dc5291cae105e13a02e993cca19350 Mon Sep 17 00:00:00 2001 From: Sandy Walsh Date: Mon, 30 May 2011 15:38:29 -0700 Subject: [PATCH 02/70] regular boot working again --- nova/api/openstack/__init__.py | 7 +- nova/api/openstack/common.py | 3 +- nova/api/openstack/servers.py | 233 ++------------------------------- nova/api/openstack/zones.py | 22 +++- nova/compute/api.py | 20 ++- 5 files changed, 47 insertions(+), 238 deletions(-) diff --git a/nova/api/openstack/__init__.py b/nova/api/openstack/__init__.py index ce9e0b7edd..6862abd39a 100644 --- a/nova/api/openstack/__init__.py +++ b/nova/api/openstack/__init__.py @@ -98,8 +98,11 @@ class APIRouter(wsgi.Router): server_members['inject_network_info'] = 'POST' mapper.resource("zone", "zones", controller=zones.Controller(), - collection={'detail': 'GET', 'info': 'GET', - 'select': 'POST'}) + collection={'detail': 'GET', + 'info': 'GET', + 'select': 'POST', + 'boot': 'POST' + }) mapper.resource("user", "users", controller=users.Controller(), collection={'detail': 'GET'}) diff --git a/nova/api/openstack/common.py b/nova/api/openstack/common.py index 32cd689ca1..32a948f2de 100644 --- a/nova/api/openstack/common.py +++ b/nova/api/openstack/common.py @@ -23,12 +23,11 @@ import webob from nova import exception from nova import flags from nova import log as logging +from nova import utils from nova import wsgi LOG = logging.getLogger('nova.api.openstack.common') - - FLAGS = flags.FLAGS diff --git a/nova/api/openstack/servers.py b/nova/api/openstack/servers.py index 0ffb667637..cbf284d603 100644 --- a/nova/api/openstack/servers.py +++ b/nova/api/openstack/servers.py @@ -23,16 +23,15 @@ from nova import compute from nova import exception from nova import flags from nova import log as logging -from nova import quota from nova import utils from nova.api.openstack import common +from nova.api.openstack import create_instance_controller as controller from nova.api.openstack import faults import nova.api.openstack.views.addresses import nova.api.openstack.views.flavors import nova.api.openstack.views.images import nova.api.openstack.views.servers from nova.auth import manager as auth_manager -from nova.compute import instance_types import nova.api.openstack from nova.scheduler import api as scheduler_api @@ -41,7 +40,7 @@ LOG = logging.getLogger('nova.api.openstack.servers') FLAGS = flags.FLAGS -class Controller(common.OpenstackController): +class Controller(controller.OpenstackCreateInstanceController): """ The Server API controller for the OpenStack API """ _serialization_metadata = { @@ -64,7 +63,6 @@ class Controller(common.OpenstackController): def __init__(self): self.compute_api = compute.API() - self._image_service = utils.import_object(FLAGS.image_service) super(Controller, self).__init__() def index(self, req): @@ -124,89 +122,18 @@ class Controller(common.OpenstackController): def create(self, req): """ Creates a new server for a given user """ - env = self._deserialize_create(req) - if not env: - return faults.Fault(exc.HTTPUnprocessableEntity()) - - context = req.environ['nova.context'] - - password = self._get_server_admin_password(env['server']) - - key_name = None - key_data = None - key_pairs = auth_manager.AuthManager.get_key_pairs(context) - if key_pairs: - key_pair = key_pairs[0] - key_name = key_pair['name'] - key_data = key_pair['public_key'] - - requested_image_id = self._image_id_from_req_data(env) - try: - image_id = common.get_image_id_from_image_hash(self._image_service, - context, requested_image_id) - except: - msg = _("Can not find requested image") - return faults.Fault(exc.HTTPBadRequest(msg)) - - kernel_id, ramdisk_id = self._get_kernel_ramdisk_from_image( - req, image_id) - - personality = env['server'].get('personality') - injected_files = [] - if personality: - injected_files = self._get_injected_files(personality) - - flavor_id = self._flavor_id_from_req_data(env) - - if not 'name' in env['server']: - msg = _("Server name is not defined") - return exc.HTTPBadRequest(msg) - - zone_blob = env['server'].get('blob') - name = env['server']['name'] - self._validate_server_name(name) - name = name.strip() - - try: - inst_type = \ - instance_types.get_instance_type_by_flavor_id(flavor_id) - (inst,) = self.compute_api.create( - context, - inst_type, - image_id, - kernel_id=kernel_id, - ramdisk_id=ramdisk_id, - display_name=name, - display_description=name, - key_name=key_name, - key_data=key_data, - metadata=env['server'].get('metadata', {}), - injected_files=injected_files, - admin_password=password, - zone_blob=zone_blob) - except quota.QuotaError as error: - self._handle_quota_error(error) - - inst['instance_type'] = inst_type - inst['image_id'] = requested_image_id + extra_values, instances = \ + self.create_instance(req, self.compute_api.create) + (inst, ) = instances + for key in ['instance_type', 'image_id']: + inst[key] = extra_values[key] + builder = self._get_view_builder(req) server = builder.build(inst, is_detail=True) - server['server']['adminPass'] = password + server['server']['adminPass'] = extra_values['password'] return server - def _deserialize_create(self, request): - """ - Deserialize a create request - - Overrides normal behavior in the case of xml content - """ - if request.content_type == "application/xml": - deserializer = ServerCreateRequestXMLDeserializer() - return deserializer.deserialize(request.body) - else: - return self._deserialize(request.body, request.get_content_type()) - def _get_injected_files(self, personality): """ Create a list of injected files from the personality attribute @@ -235,22 +162,6 @@ class Controller(common.OpenstackController): injected_files.append((path, contents)) return injected_files - def _handle_quota_error(self, error): - """ - Reraise quota errors as api-specific http exceptions - """ - if error.code == "OnsetFileLimitExceeded": - expl = _("Personality file limit exceeded") - raise exc.HTTPBadRequest(explanation=expl) - if error.code == "OnsetFilePathLimitExceeded": - expl = _("Personality file path too long") - raise exc.HTTPBadRequest(explanation=expl) - if error.code == "OnsetFileContentLimitExceeded": - expl = _("Personality file content too long") - raise exc.HTTPBadRequest(explanation=expl) - # if the original error is okay, just reraise it - raise error - def _get_server_admin_password(self, server): """ Determine the admin password for a server on creation """ return utils.generate_password(16) @@ -552,45 +463,6 @@ class Controller(common.OpenstackController): error=item.error)) return dict(actions=actions) - def _get_kernel_ramdisk_from_image(self, req, image_id): - """Fetch an image from the ImageService, then if present, return the - associated kernel and ramdisk image IDs. - """ - context = req.environ['nova.context'] - image_meta = self._image_service.show(context, image_id) - # NOTE(sirp): extracted to a separate method to aid unit-testing, the - # new method doesn't need a request obj or an ImageService stub - kernel_id, ramdisk_id = self._do_get_kernel_ramdisk_from_image( - image_meta) - return kernel_id, ramdisk_id - - @staticmethod - def _do_get_kernel_ramdisk_from_image(image_meta): - """Given an ImageService image_meta, return kernel and ramdisk image - ids if present. - - This is only valid for `ami` style images. - """ - image_id = image_meta['id'] - if image_meta['status'] != 'active': - raise exception.ImageUnacceptable(image_id=image_id, - reason=_("status is not active")) - - if image_meta.get('container_format') != 'ami': - return None, None - - try: - kernel_id = image_meta['properties']['kernel_id'] - except KeyError: - raise exception.KernelNotFoundForImage(image_id=image_id) - - try: - ramdisk_id = image_meta['properties']['ramdisk_id'] - except KeyError: - raise exception.RamdiskNotFoundForImage(image_id=image_id) - - return kernel_id, ramdisk_id - class ControllerV10(Controller): def _image_id_from_req_data(self, data): @@ -727,92 +599,5 @@ class ControllerV11(Controller): response.empty_body = True return response - def _get_server_admin_password(self, server): - """ Determine the admin password for a server on creation """ - password = server.get('adminPass') - if password is None: - return utils.generate_password(16) - if not isinstance(password, basestring) or password == '': - msg = _("Invalid adminPass") - raise exc.HTTPBadRequest(msg) - return password - def get_default_xmlns(self, req): return common.XML_NS_V11 - - -class ServerCreateRequestXMLDeserializer(object): - """ - Deserializer to handle xml-formatted server create requests. - - Handles standard server attributes as well as optional metadata - and personality attributes - """ - - def deserialize(self, string): - """Deserialize an xml-formatted server create request""" - dom = minidom.parseString(string) - server = self._extract_server(dom) - return {'server': server} - - def _extract_server(self, node): - """Marshal the server attribute of a parsed request""" - server = {} - server_node = self._find_first_child_named(node, 'server') - for attr in ["name", "imageId", "flavorId", "imageRef", "flavorRef"]: - if server_node.getAttribute(attr): - server[attr] = server_node.getAttribute(attr) - metadata = self._extract_metadata(server_node) - if metadata is not None: - server["metadata"] = metadata - personality = self._extract_personality(server_node) - if personality is not None: - server["personality"] = personality - return server - - def _extract_metadata(self, server_node): - """Marshal the metadata attribute of a parsed request""" - metadata_node = self._find_first_child_named(server_node, "metadata") - if metadata_node is None: - return None - metadata = {} - for meta_node in self._find_children_named(metadata_node, "meta"): - key = meta_node.getAttribute("key") - metadata[key] = self._extract_text(meta_node) - return metadata - - def _extract_personality(self, server_node): - """Marshal the personality attribute of a parsed request""" - personality_node = \ - self._find_first_child_named(server_node, "personality") - if personality_node is None: - return None - personality = [] - for file_node in self._find_children_named(personality_node, "file"): - item = {} - if file_node.hasAttribute("path"): - item["path"] = file_node.getAttribute("path") - item["contents"] = self._extract_text(file_node) - personality.append(item) - return personality - - def _find_first_child_named(self, parent, name): - """Search a nodes children for the first child with a given name""" - for node in parent.childNodes: - if node.nodeName == name: - return node - return None - - def _find_children_named(self, parent, name): - """Return all of a nodes children who have the given name""" - for node in parent.childNodes: - if node.nodeName == name: - yield node - - def _extract_text(self, node): - """Get the text field contained by the given node""" - if len(node.childNodes) == 1: - child = node.childNodes[0] - if child.nodeType == child.TEXT_NODE: - return child.nodeValue - return "" diff --git a/nova/api/openstack/zones.py b/nova/api/openstack/zones.py index 7b495cecf8..51ce315dc3 100644 --- a/nova/api/openstack/zones.py +++ b/nova/api/openstack/zones.py @@ -21,7 +21,7 @@ from nova import db from nova import exception from nova import flags from nova import log as logging -from nova.api.openstack import common +from nova.api.openstack import create_instance_controller as controller from nova.scheduler import api @@ -57,7 +57,7 @@ def check_encryption_key(func): return wrapped -class Controller(common.OpenstackController): +class Controller(controller.OpenstackCreateInstanceController): _serialization_metadata = { 'application/xml': { @@ -97,17 +97,20 @@ class Controller(common.OpenstackController): return dict(zone=_scrub_zone(zone)) def delete(self, req, id): + """Delete a child zone entry.""" zone_id = int(id) api.zone_delete(req.environ['nova.context'], zone_id) return {} def create(self, req): + """Create a child zone entry.""" context = req.environ['nova.context'] env = self._deserialize(req.body, req.get_content_type()) zone = api.zone_create(context, env["zone"]) return dict(zone=_scrub_zone(zone)) def update(self, req, id): + """Update a child zone entry.""" context = req.environ['nova.context'] env = self._deserialize(req.body, req.get_content_type()) zone_id = int(id) @@ -115,11 +118,14 @@ class Controller(common.OpenstackController): return dict(zone=_scrub_zone(zone)) def boot(self, req): - """Creates a new server for a given user while being Zone aware.""" + """Creates a new server for a given user while being Zone aware. + + Returns a reservation ID (a UUID). + """ reservation_id = \ common.create(req, self.compute_api.create_all_at_once) - return {'reservation': {'reservation_id': reservation_id}} + return {'reservation_id': reservation_id} @check_encryption_key def select(self, req): @@ -144,3 +150,11 @@ class Controller(common.OpenstackController): cooked.append(dict(weight=entry['weight'], blob=cipher_text)) return cooked + + # Assume OS 1.0 functionality for these overrides. + + def _image_id_from_req_data(self, data): + return data['server']['imageId'] + + def _flavor_id_from_req_data(self, data): + return data['server']['flavorId'] diff --git a/nova/compute/api.py b/nova/compute/api.py index 52cff3d564..fc369ccd2f 100644 --- a/nova/compute/api.py +++ b/nova/compute/api.py @@ -140,7 +140,8 @@ class API(base.Base): display_name='', display_description='', key_name=None, key_data=None, security_group='default', availability_zone=None, user_data=None, metadata={}, - injected_files=None, admin_password=None, zone_blob=None): + injected_files=None, admin_password=None, zone_blob=None, + reservation_id=None): """Verify all the input parameters regardless of the provisioning strategy being performed.""" @@ -205,8 +206,11 @@ class API(base.Base): key_pair = db.key_pair_get(context, context.user_id, key_name) key_data = key_pair['public_key'] + if reservation_id is None: + reservation_id = utils.generate_uid('r') + base_options = { - 'reservation_id': utils.generate_uid('r'), + 'reservation_id': reservation_id, 'image_id': image_id, 'kernel_id': kernel_id or '', 'ramdisk_id': ramdisk_id or '', @@ -305,7 +309,8 @@ class API(base.Base): display_name='', display_description='', key_name=None, key_data=None, security_group='default', availability_zone=None, user_data=None, metadata={}, - injected_files=None, admin_password=None, zone_blob=None): + injected_files=None, admin_password=None, zone_blob=None, + reservation_id=None): """Provision the instances by passing the whole request to the Scheduler for execution. Returns a Reservation ID related to the creation of all of these instances.""" @@ -317,7 +322,8 @@ class API(base.Base): display_name, display_description, key_name, key_data, security_group, availability_zone, user_data, metadata, - injected_files, admin_password, zone_blob) + injected_files, admin_password, zone_blob, + reservation_id) self._ask_scheduler_to_create_instance(context, base_options, instance_type, zone_blob, @@ -333,7 +339,8 @@ class API(base.Base): display_name='', display_description='', key_name=None, key_data=None, security_group='default', availability_zone=None, user_data=None, metadata={}, - injected_files=None, admin_password=None, zone_blob=None): + injected_files=None, admin_password=None, zone_blob=None, + reservation_id=None): """ Provision the instances by sending off a series of single instance requests to the Schedulers. This is fine for trival @@ -351,7 +358,8 @@ class API(base.Base): display_name, display_description, key_name, key_data, security_group, availability_zone, user_data, metadata, - injected_files, admin_password, zone_blob) + injected_files, admin_password, zone_blob, + reservation_id) instances = [] LOG.debug(_("Going to run %s instances..."), num_instances) From 318e307c268bb554d24ba441b2484790f2a08798 Mon Sep 17 00:00:00 2001 From: Sandy Walsh Date: Mon, 30 May 2011 15:38:45 -0700 Subject: [PATCH 03/70] regular boot working again --- .../openstack/create_instance_controller.py | 291 ++++++++++++++++++ 1 file changed, 291 insertions(+) create mode 100644 nova/api/openstack/create_instance_controller.py diff --git a/nova/api/openstack/create_instance_controller.py b/nova/api/openstack/create_instance_controller.py new file mode 100644 index 0000000000..52c1e444e0 --- /dev/null +++ b/nova/api/openstack/create_instance_controller.py @@ -0,0 +1,291 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 OpenStack LLC. +# 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. + +import re +from urlparse import urlparse +from webob import exc +from xml.dom import minidom + +import webob + +from nova import exception +from nova import flags +from nova import log as logging +from nova import quota +from nova import utils +from nova import wsgi + +from nova.compute import instance_types +from nova.api.openstack import common +from nova.api.openstack import faults +from nova.auth import manager as auth_manager + + +LOG = logging.getLogger('nova.api.openstack.create_instance_controller') +FLAGS = flags.FLAGS + + +class OpenstackCreateInstanceController(common.OpenstackController): + """This is the base class for OS API Controllers that + are capable of creating instances (currently Servers and Zones). + + Once we stabilize the Zones portion of the API we may be able + to move this code back into servers.py + """ + + def __init__(self): + """We need the image service to create an instance.""" + self._image_service = utils.import_object(FLAGS.image_service) + super(OpenstackCreateInstanceController, self).__init__() + + def create_instance(self, req, create_method): + """Creates a new server for the given user. The approach + used depends on the create_method. For example, the standard + POST /server call uses compute.api.create(), while + POST /zones/server uses compute.api.create_all_at_once(). + + The problem is, both approaches return different values (i.e. + [instance dicts] vs. reservation_id). So the handling of the + return type from this method is left to the caller. + """ + env = self._deserialize_create(req) + if not env: + return faults.Fault(exc.HTTPUnprocessableEntity()) + + context = req.environ['nova.context'] + + password = self._get_server_admin_password(env['server']) + + key_name = None + key_data = None + key_pairs = auth_manager.AuthManager.get_key_pairs(context) + if key_pairs: + key_pair = key_pairs[0] + key_name = key_pair['name'] + key_data = key_pair['public_key'] + + requested_image_id = self._image_id_from_req_data(env) + try: + image_id = common.get_image_id_from_image_hash(self._image_service, + context, requested_image_id) + except: + msg = _("Can not find requested image") + return faults.Fault(exc.HTTPBadRequest(msg)) + + kernel_id, ramdisk_id = self._get_kernel_ramdisk_from_image( + req, image_id) + + personality = env['server'].get('personality') + injected_files = [] + if personality: + injected_files = self._get_injected_files(personality) + + flavor_id = self._flavor_id_from_req_data(env) + + if not 'name' in env['server']: + msg = _("Server name is not defined") + return exc.HTTPBadRequest(msg) + + zone_blob = env['server'].get('blob') + reservation_id = env['server'].get('reservation_id') + name = env['server']['name'] + self._validate_server_name(name) + name = name.strip() + + inst_type = instance_types.get_instance_type_by_flavor_id(flavor_id) + extra_values = { + 'instance_type': inst_type, + 'image_id': requested_image_id, + 'password': password + } + + try: + return (extra_values, + create_method(context, + inst_type, + image_id, + kernel_id=kernel_id, + ramdisk_id=ramdisk_id, + display_name=name, + display_description=name, + key_name=key_name, + key_data=key_data, + metadata=env['server'].get('metadata', {}), + injected_files=injected_files, + admin_password=password, + zone_blob=zone_blob, + reservation_id=reservation_id + ) + ) + except quota.QuotaError as error: + self._handle_quota_error(error) + + # Let the caller deal with unhandled exceptions. + + def _handle_quota_error(self, error): + """ + Reraise quota errors as api-specific http exceptions + """ + if error.code == "OnsetFileLimitExceeded": + expl = _("Personality file limit exceeded") + raise exc.HTTPBadRequest(explanation=expl) + if error.code == "OnsetFilePathLimitExceeded": + expl = _("Personality file path too long") + raise exc.HTTPBadRequest(explanation=expl) + if error.code == "OnsetFileContentLimitExceeded": + expl = _("Personality file content too long") + raise exc.HTTPBadRequest(explanation=expl) + # if the original error is okay, just reraise it + raise error + + def _deserialize_create(self, request): + """ + Deserialize a create request + + Overrides normal behavior in the case of xml content + """ + if request.content_type == "application/xml": + deserializer = ServerCreateRequestXMLDeserializer() + return deserializer.deserialize(request.body) + else: + return self._deserialize(request.body, request.get_content_type()) + + def _get_server_admin_password(self, server): + """ Determine the admin password for a server on creation """ + password = server.get('adminPass') + if password is None: + return utils.generate_password(16) + if not isinstance(password, basestring) or password == '': + msg = _("Invalid adminPass") + raise exc.HTTPBadRequest(msg) + return password + + def _get_kernel_ramdisk_from_image(self, req, image_id): + """Fetch an image from the ImageService, then if present, return the + associated kernel and ramdisk image IDs. + """ + context = req.environ['nova.context'] + image_meta = self._image_service.show(context, image_id) + # NOTE(sirp): extracted to a separate method to aid unit-testing, the + # new method doesn't need a request obj or an ImageService stub + kernel_id, ramdisk_id = self._do_get_kernel_ramdisk_from_image( + image_meta) + return kernel_id, ramdisk_id + + @staticmethod + def _do_get_kernel_ramdisk_from_image(image_meta): + """Given an ImageService image_meta, return kernel and ramdisk image + ids if present. + + This is only valid for `ami` style images. + """ + image_id = image_meta['id'] + if image_meta['status'] != 'active': + raise exception.ImageUnacceptable(image_id=image_id, + reason=_("status is not active")) + + if image_meta.get('container_format') != 'ami': + return None, None + + try: + kernel_id = image_meta['properties']['kernel_id'] + except KeyError: + raise exception.KernelNotFoundForImage(image_id=image_id) + + try: + ramdisk_id = image_meta['properties']['ramdisk_id'] + except KeyError: + raise exception.RamdiskNotFoundForImage(image_id=image_id) + + return kernel_id, ramdisk_id + + +class ServerCreateRequestXMLDeserializer(object): + """ + Deserializer to handle xml-formatted server create requests. + + Handles standard server attributes as well as optional metadata + and personality attributes + """ + + def deserialize(self, string): + """Deserialize an xml-formatted server create request""" + dom = minidom.parseString(string) + server = self._extract_server(dom) + return {'server': server} + + def _extract_server(self, node): + """Marshal the server attribute of a parsed request""" + server = {} + server_node = self._find_first_child_named(node, 'server') + for attr in ["name", "imageId", "flavorId", "imageRef", "flavorRef"]: + if server_node.getAttribute(attr): + server[attr] = server_node.getAttribute(attr) + metadata = self._extract_metadata(server_node) + if metadata is not None: + server["metadata"] = metadata + personality = self._extract_personality(server_node) + if personality is not None: + server["personality"] = personality + return server + + def _extract_metadata(self, server_node): + """Marshal the metadata attribute of a parsed request""" + metadata_node = self._find_first_child_named(server_node, "metadata") + if metadata_node is None: + return None + metadata = {} + for meta_node in self._find_children_named(metadata_node, "meta"): + key = meta_node.getAttribute("key") + metadata[key] = self._extract_text(meta_node) + return metadata + + def _extract_personality(self, server_node): + """Marshal the personality attribute of a parsed request""" + personality_node = \ + self._find_first_child_named(server_node, "personality") + if personality_node is None: + return None + personality = [] + for file_node in self._find_children_named(personality_node, "file"): + item = {} + if file_node.hasAttribute("path"): + item["path"] = file_node.getAttribute("path") + item["contents"] = self._extract_text(file_node) + personality.append(item) + return personality + + def _find_first_child_named(self, parent, name): + """Search a nodes children for the first child with a given name""" + for node in parent.childNodes: + if node.nodeName == name: + return node + return None + + def _find_children_named(self, parent, name): + """Return all of a nodes children who have the given name""" + for node in parent.childNodes: + if node.nodeName == name: + yield node + + def _extract_text(self, node): + """Get the text field contained by the given node""" + if len(node.childNodes) == 1: + child = node.childNodes[0] + if child.nodeType == child.TEXT_NODE: + return child.nodeValue + return "" From 544ec189a7fddc4b4491774b62071a4884e8e895 Mon Sep 17 00:00:00 2001 From: Sandy Walsh Date: Mon, 30 May 2011 16:18:11 -0700 Subject: [PATCH 04/70] zone-boot working --- nova/api/openstack/create_instance_controller.py | 15 +++++++++++++++ nova/api/openstack/servers.py | 15 --------------- nova/api/openstack/zones.py | 12 +++++++++--- 3 files changed, 24 insertions(+), 18 deletions(-) diff --git a/nova/api/openstack/create_instance_controller.py b/nova/api/openstack/create_instance_controller.py index 52c1e444e0..1c4098a084 100644 --- a/nova/api/openstack/create_instance_controller.py +++ b/nova/api/openstack/create_instance_controller.py @@ -52,6 +52,12 @@ class OpenstackCreateInstanceController(common.OpenstackController): self._image_service = utils.import_object(FLAGS.image_service) super(OpenstackCreateInstanceController, self).__init__() + def _image_id_from_req_data(self, data): + raise NotImplementedError() + + def _flavor_id_from_req_data(self, data): + raise NotImplementedError() + def create_instance(self, req, create_method): """Creates a new server for the given user. The approach used depends on the create_method. For example, the standard @@ -164,6 +170,15 @@ class OpenstackCreateInstanceController(common.OpenstackController): else: return self._deserialize(request.body, request.get_content_type()) + def _validate_server_name(self, value): + if not isinstance(value, basestring): + msg = _("Server name is not a string or unicode") + raise exc.HTTPBadRequest(msg) + + if value.strip() == '': + msg = _("Server name is an empty string") + raise exc.HTTPBadRequest(msg) + def _get_server_admin_password(self, server): """ Determine the admin password for a server on creation """ password = server.get('adminPass') diff --git a/nova/api/openstack/servers.py b/nova/api/openstack/servers.py index cbf284d603..6e86c29567 100644 --- a/nova/api/openstack/servers.py +++ b/nova/api/openstack/servers.py @@ -73,12 +73,6 @@ class Controller(controller.OpenstackCreateInstanceController): """ Returns a list of server details for a given user """ return self._items(req, is_detail=True) - def _image_id_from_req_data(self, data): - raise NotImplementedError() - - def _flavor_id_from_req_data(self, data): - raise NotImplementedError() - def _get_view_builder(self, req): raise NotImplementedError() @@ -193,15 +187,6 @@ class Controller(controller.OpenstackCreateInstanceController): return exc.HTTPNoContent() - def _validate_server_name(self, value): - if not isinstance(value, basestring): - msg = _("Server name is not a string or unicode") - raise exc.HTTPBadRequest(msg) - - if value.strip() == '': - msg = _("Server name is an empty string") - raise exc.HTTPBadRequest(msg) - def _parse_update(self, context, id, inst_dict, update_dict): pass diff --git a/nova/api/openstack/zones.py b/nova/api/openstack/zones.py index 51ce315dc3..91531aa97d 100644 --- a/nova/api/openstack/zones.py +++ b/nova/api/openstack/zones.py @@ -21,9 +21,11 @@ from nova import db from nova import exception from nova import flags from nova import log as logging -from nova.api.openstack import create_instance_controller as controller + +from nova.compute import api as compute from nova.scheduler import api +from nova.api.openstack import create_instance_controller as controller FLAGS = flags.FLAGS @@ -64,6 +66,10 @@ class Controller(controller.OpenstackCreateInstanceController): "attributes": { "zone": ["id", "api_url", "name", "capabilities"]}}} + def __init__(self): + self.compute_api = compute.API() + super(Controller, self).__init__() + def index(self, req): """Return all zones in brief""" # Ask the ZoneManager in the Scheduler for most recent data, @@ -122,8 +128,8 @@ class Controller(controller.OpenstackCreateInstanceController): Returns a reservation ID (a UUID). """ - reservation_id = \ - common.create(req, self.compute_api.create_all_at_once) + extra_values, reservation_id = \ + self.create_instance(req, self.compute_api.create_all_at_once) return {'reservation_id': reservation_id} From fccc653376ec03e2f8d4e91449a18d62cd87902f Mon Sep 17 00:00:00 2001 From: Sandy Walsh Date: Tue, 31 May 2011 06:29:38 -0700 Subject: [PATCH 05/70] tests passing again --- .../openstack/create_instance_controller.py | 31 +++++++------------ nova/api/openstack/servers.py | 27 ++++++++++++---- nova/api/openstack/zones.py | 12 ++++--- nova/tests/api/openstack/test_servers.py | 4 ++- 4 files changed, 44 insertions(+), 30 deletions(-) diff --git a/nova/api/openstack/create_instance_controller.py b/nova/api/openstack/create_instance_controller.py index 1c4098a084..ca076a218c 100644 --- a/nova/api/openstack/create_instance_controller.py +++ b/nova/api/openstack/create_instance_controller.py @@ -46,7 +46,7 @@ class OpenstackCreateInstanceController(common.OpenstackController): Once we stabilize the Zones portion of the API we may be able to move this code back into servers.py """ - + def __init__(self): """We need the image service to create an instance.""" self._image_service = utils.import_object(FLAGS.image_service) @@ -58,19 +58,22 @@ class OpenstackCreateInstanceController(common.OpenstackController): def _flavor_id_from_req_data(self, data): raise NotImplementedError() + def _get_server_admin_password(self, server): + raise NotImplementedError() + def create_instance(self, req, create_method): """Creates a new server for the given user. The approach used depends on the create_method. For example, the standard - POST /server call uses compute.api.create(), while + POST /server call uses compute.api.create(), while POST /zones/server uses compute.api.create_all_at_once(). The problem is, both approaches return different values (i.e. [instance dicts] vs. reservation_id). So the handling of the - return type from this method is left to the caller. + return type from this method is left to the caller. """ env = self._deserialize_create(req) if not env: - return faults.Fault(exc.HTTPUnprocessableEntity()) + return (None, faults.Fault(exc.HTTPUnprocessableEntity())) context = req.environ['nova.context'] @@ -90,7 +93,7 @@ class OpenstackCreateInstanceController(common.OpenstackController): context, requested_image_id) except: msg = _("Can not find requested image") - return faults.Fault(exc.HTTPBadRequest(msg)) + return (None, faults.Fault(exc.HTTPBadRequest(msg))) kernel_id, ramdisk_id = self._get_kernel_ramdisk_from_image( req, image_id) @@ -104,14 +107,14 @@ class OpenstackCreateInstanceController(common.OpenstackController): if not 'name' in env['server']: msg = _("Server name is not defined") - return exc.HTTPBadRequest(msg) - - zone_blob = env['server'].get('blob') - reservation_id = env['server'].get('reservation_id') + return (None, exc.HTTPBadRequest(msg)) name = env['server']['name'] self._validate_server_name(name) name = name.strip() + zone_blob = env['server'].get('blob') + reservation_id = env['server'].get('reservation_id') + inst_type = instance_types.get_instance_type_by_flavor_id(flavor_id) extra_values = { 'instance_type': inst_type, @@ -179,16 +182,6 @@ class OpenstackCreateInstanceController(common.OpenstackController): msg = _("Server name is an empty string") raise exc.HTTPBadRequest(msg) - def _get_server_admin_password(self, server): - """ Determine the admin password for a server on creation """ - password = server.get('adminPass') - if password is None: - return utils.generate_password(16) - if not isinstance(password, basestring) or password == '': - msg = _("Invalid adminPass") - raise exc.HTTPBadRequest(msg) - return password - def _get_kernel_ramdisk_from_image(self, req, image_id): """Fetch an image from the ImageService, then if present, return the associated kernel and ramdisk image IDs. diff --git a/nova/api/openstack/servers.py b/nova/api/openstack/servers.py index 6e86c29567..223e1a1919 100644 --- a/nova/api/openstack/servers.py +++ b/nova/api/openstack/servers.py @@ -116,13 +116,17 @@ class Controller(controller.OpenstackCreateInstanceController): def create(self, req): """ Creates a new server for a given user """ - extra_values, instances = \ + extra_values, result = \ self.create_instance(req, self.compute_api.create) + if extra_values is None: + return result # a Fault. + + instances = result (inst, ) = instances for key in ['instance_type', 'image_id']: inst[key] = extra_values[key] - + builder = self._get_view_builder(req) server = builder.build(inst, is_detail=True) server['server']['adminPass'] = extra_values['password'] @@ -156,10 +160,6 @@ class Controller(controller.OpenstackCreateInstanceController): injected_files.append((path, contents)) return injected_files - def _get_server_admin_password(self, server): - """ Determine the admin password for a server on creation """ - return utils.generate_password(16) - @scheduler_api.redirect_handler def update(self, req, id): """ Updates the server name or password """ @@ -491,6 +491,10 @@ class ControllerV10(Controller): response.empty_body = True return response + def _get_server_admin_password(self, server): + """ Determine the admin password for a server on creation """ + return utils.generate_password(16) + class ControllerV11(Controller): def _image_id_from_req_data(self, data): @@ -586,3 +590,14 @@ class ControllerV11(Controller): def get_default_xmlns(self, req): return common.XML_NS_V11 + + def _get_server_admin_password(self, server): + """ Determine the admin password for a server on creation """ + password = server.get('adminPass') + + if password is None: + return utils.generate_password(16) + if not isinstance(password, basestring) or password == '': + msg = _("Invalid adminPass") + raise exc.HTTPBadRequest(msg) + return password diff --git a/nova/api/openstack/zones.py b/nova/api/openstack/zones.py index 91531aa97d..acd01a1ff2 100644 --- a/nova/api/openstack/zones.py +++ b/nova/api/openstack/zones.py @@ -26,6 +26,7 @@ from nova.compute import api as compute from nova.scheduler import api from nova.api.openstack import create_instance_controller as controller +from nova.api.openstack import common FLAGS = flags.FLAGS @@ -125,12 +126,15 @@ class Controller(controller.OpenstackCreateInstanceController): def boot(self, req): """Creates a new server for a given user while being Zone aware. - + Returns a reservation ID (a UUID). """ - extra_values, reservation_id = \ + extra_values, result = \ self.create_instance(req, self.compute_api.create_all_at_once) + if extra_values is None: + return result # a Fault. + reservation_id = result return {'reservation_id': reservation_id} @check_encryption_key @@ -156,8 +160,8 @@ class Controller(controller.OpenstackCreateInstanceController): cooked.append(dict(weight=entry['weight'], blob=cipher_text)) return cooked - - # Assume OS 1.0 functionality for these overrides. + + # Assume OS 1.0 functionality for these overrides. def _image_id_from_req_data(self, data): return data['server']['imageId'] diff --git a/nova/tests/api/openstack/test_servers.py b/nova/tests/api/openstack/test_servers.py index fbde5c9ced..7bad28ca80 100644 --- a/nova/tests/api/openstack/test_servers.py +++ b/nova/tests/api/openstack/test_servers.py @@ -31,6 +31,7 @@ from nova import flags from nova import test import nova.api.openstack from nova.api.openstack import servers +from nova.api.openstack import create_instance_controller import nova.compute.api from nova.compute import instance_types from nova.compute import power_state @@ -1380,7 +1381,8 @@ class ServersTest(test.TestCase): class TestServerCreateRequestXMLDeserializer(unittest.TestCase): def setUp(self): - self.deserializer = servers.ServerCreateRequestXMLDeserializer() + self.deserializer = \ + create_instance_controller.ServerCreateRequestXMLDeserializer() def test_minimal_request(self): serial_request = """ From beb6bf93d0bab5b50c6f0af90758e21cc68187ab Mon Sep 17 00:00:00 2001 From: Sandy Walsh Date: Tue, 31 May 2011 14:56:04 -0700 Subject: [PATCH 06/70] basic zone-boot test in place --- .../openstack/create_instance_controller.py | 3 ++- nova/api/openstack/servers.py | 4 --- nova/api/openstack/zones.py | 1 + nova/tests/api/openstack/test_servers.py | 27 +++++++++++++++++-- 4 files changed, 28 insertions(+), 7 deletions(-) diff --git a/nova/api/openstack/create_instance_controller.py b/nova/api/openstack/create_instance_controller.py index ca076a218c..c79638bd9b 100644 --- a/nova/api/openstack/create_instance_controller.py +++ b/nova/api/openstack/create_instance_controller.py @@ -59,7 +59,8 @@ class OpenstackCreateInstanceController(common.OpenstackController): raise NotImplementedError() def _get_server_admin_password(self, server): - raise NotImplementedError() + """ Determine the admin password for a server on creation """ + return utils.generate_password(16) def create_instance(self, req, create_method): """Creates a new server for the given user. The approach diff --git a/nova/api/openstack/servers.py b/nova/api/openstack/servers.py index 223e1a1919..67b3fd23f3 100644 --- a/nova/api/openstack/servers.py +++ b/nova/api/openstack/servers.py @@ -491,10 +491,6 @@ class ControllerV10(Controller): response.empty_body = True return response - def _get_server_admin_password(self, server): - """ Determine the admin password for a server on creation """ - return utils.generate_password(16) - class ControllerV11(Controller): def _image_id_from_req_data(self, data): diff --git a/nova/api/openstack/zones.py b/nova/api/openstack/zones.py index acd01a1ff2..687978b083 100644 --- a/nova/api/openstack/zones.py +++ b/nova/api/openstack/zones.py @@ -129,6 +129,7 @@ class Controller(controller.OpenstackCreateInstanceController): Returns a reservation ID (a UUID). """ + print "************** IN ZONE BOOT" extra_values, result = \ self.create_instance(req, self.compute_api.create_all_at_once) if extra_values is None: diff --git a/nova/tests/api/openstack/test_servers.py b/nova/tests/api/openstack/test_servers.py index 7bad28ca80..9d12097c83 100644 --- a/nova/tests/api/openstack/test_servers.py +++ b/nova/tests/api/openstack/test_servers.py @@ -218,7 +218,6 @@ class ServersTest(test.TestCase): }, ] - print res_dict['server'] self.assertEqual(res_dict['server']['links'], expected_links) def test_get_server_by_id_with_addresses_xml(self): @@ -484,7 +483,9 @@ class ServersTest(test.TestCase): self.stubs.Set(nova.db.api, 'queue_get_for', queue_get_for) self.stubs.Set(nova.network.manager.VlanManager, 'allocate_fixed_ip', fake_method) - self.stubs.Set(nova.api.openstack.servers.Controller, + self.stubs.Set( + nova.api.openstack.create_instance_controller.\ + OpenstackCreateInstanceController, "_get_kernel_ramdisk_from_image", kernel_ramdisk_mapping) self.stubs.Set(nova.api.openstack.common, "get_image_id_from_image_hash", image_id_from_hash) @@ -515,6 +516,28 @@ class ServersTest(test.TestCase): def test_create_instance(self): self._test_create_instance_helper() + def test_create_instance_via_zones(self): + """Server generated ReservationID""" + self._setup_for_create_instance() + FLAGS.allow_admin_api = True + + body = dict(server=dict( + name='server_test', imageId=3, flavorId=2, + metadata={'hello': 'world', 'open': 'stack'}, + personality={})) + req = webob.Request.blank('/v1.0/zones/boot') + req.method = 'POST' + req.body = json.dumps(body) + req.headers["content-type"] = "application/json" + + res = req.get_response(fakes.wsgi_app()) + + reservation_id = json.loads(res.body)['reservation_id'] + self.assertEqual(res.status_int, 200) + self.assertNotEqual(reservation_id, "") + self.assertNotEqual(reservation_id, None) + self.assertTrue(len(reservation_id) > 1) + def test_create_instance_no_key_pair(self): fakes.stub_out_key_pair_funcs(self.stubs, have_key_pair=False) self._test_create_instance_helper() From db68508e1468e9d2d3469f2ea6a9ec577d1190bc Mon Sep 17 00:00:00 2001 From: Sandy Walsh Date: Wed, 1 Jun 2011 05:36:41 -0700 Subject: [PATCH 07/70] added /zones/boot reservation id tests --- nova/tests/api/openstack/test_servers.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/nova/tests/api/openstack/test_servers.py b/nova/tests/api/openstack/test_servers.py index 9d12097c83..3d5f92dea6 100644 --- a/nova/tests/api/openstack/test_servers.py +++ b/nova/tests/api/openstack/test_servers.py @@ -538,6 +538,26 @@ class ServersTest(test.TestCase): self.assertNotEqual(reservation_id, None) self.assertTrue(len(reservation_id) > 1) + def test_create_instance_via_zones_with_resid(self): + """User supplied ReservationID""" + self._setup_for_create_instance() + FLAGS.allow_admin_api = True + + body = dict(server=dict( + name='server_test', imageId=3, flavorId=2, + metadata={'hello': 'world', 'open': 'stack'}, + personality={}, reservation_id='myresid')) + req = webob.Request.blank('/v1.0/zones/boot') + req.method = 'POST' + req.body = json.dumps(body) + req.headers["content-type"] = "application/json" + + res = req.get_response(fakes.wsgi_app()) + + reservation_id = json.loads(res.body)['reservation_id'] + self.assertEqual(res.status_int, 200) + self.assertEqual(reservation_id, "myresid") + def test_create_instance_no_key_pair(self): fakes.stub_out_key_pair_funcs(self.stubs, have_key_pair=False) self._test_create_instance_helper() From 3bf3255f91aab28aa6915a2836dad77f17312e03 Mon Sep 17 00:00:00 2001 From: Sandy Walsh Date: Wed, 1 Jun 2011 11:52:33 -0700 Subject: [PATCH 08/70] basic reservation id support to GET /servers --- nova/api/openstack/servers.py | 34 +++++----------------------------- nova/api/openstack/zones.py | 1 - 2 files changed, 5 insertions(+), 30 deletions(-) diff --git a/nova/api/openstack/servers.py b/nova/api/openstack/servers.py index 67b3fd23f3..2bfcbac814 100644 --- a/nova/api/openstack/servers.py +++ b/nova/api/openstack/servers.py @@ -87,7 +87,11 @@ class Controller(controller.OpenstackCreateInstanceController): builder - the response model builder """ - instance_list = self.compute_api.get_all(req.environ['nova.context']) + reservation_id = req.str_GET.get('reservation_id') + LOG.exception(_(" ************* RESERVATION ID %s"), reservation_id) + instance_list = self.compute_api.get_all( + req.environ['nova.context'], + reservation_id=reservation_id) limited_list = self._limit_items(instance_list, req) builder = self._get_view_builder(req) servers = [builder.build(inst, is_detail)['server'] @@ -132,34 +136,6 @@ class Controller(controller.OpenstackCreateInstanceController): server['server']['adminPass'] = extra_values['password'] return server - def _get_injected_files(self, personality): - """ - Create a list of injected files from the personality attribute - - At this time, injected_files must be formatted as a list of - (file_path, file_content) pairs for compatibility with the - underlying compute service. - """ - injected_files = [] - - for item in personality: - try: - path = item['path'] - contents = item['contents'] - except KeyError as key: - expl = _('Bad personality format: missing %s') % key - raise exc.HTTPBadRequest(explanation=expl) - except TypeError: - expl = _('Bad personality format') - raise exc.HTTPBadRequest(explanation=expl) - try: - contents = base64.b64decode(contents) - except TypeError: - expl = _('Personality content for %s cannot be decoded') % path - raise exc.HTTPBadRequest(explanation=expl) - injected_files.append((path, contents)) - return injected_files - @scheduler_api.redirect_handler def update(self, req, id): """ Updates the server name or password """ diff --git a/nova/api/openstack/zones.py b/nova/api/openstack/zones.py index 687978b083..acd01a1ff2 100644 --- a/nova/api/openstack/zones.py +++ b/nova/api/openstack/zones.py @@ -129,7 +129,6 @@ class Controller(controller.OpenstackCreateInstanceController): Returns a reservation ID (a UUID). """ - print "************** IN ZONE BOOT" extra_values, result = \ self.create_instance(req, self.compute_api.create_all_at_once) if extra_values is None: From b05dcdc69387ecd54e40063e66355961d39b4430 Mon Sep 17 00:00:00 2001 From: Sandy Walsh Date: Wed, 1 Jun 2011 12:39:31 -0700 Subject: [PATCH 09/70] reservation id's properly forwarded to child zones on create --- .../openstack/create_instance_controller.py | 30 +++++++++++++++++++ nova/scheduler/zone_aware_scheduler.py | 6 ++-- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/nova/api/openstack/create_instance_controller.py b/nova/api/openstack/create_instance_controller.py index c79638bd9b..786d74e37d 100644 --- a/nova/api/openstack/create_instance_controller.py +++ b/nova/api/openstack/create_instance_controller.py @@ -116,6 +116,8 @@ class OpenstackCreateInstanceController(common.OpenstackController): zone_blob = env['server'].get('blob') reservation_id = env['server'].get('reservation_id') + LOG.exception("******* CREATE_INSTANCE RES_ID=%s of %s" % (reservation_id, env)) + inst_type = instance_types.get_instance_type_by_flavor_id(flavor_id) extra_values = { 'instance_type': inst_type, @@ -221,6 +223,34 @@ class OpenstackCreateInstanceController(common.OpenstackController): raise exception.RamdiskNotFoundForImage(image_id=image_id) return kernel_id, ramdisk_id + + def _get_injected_files(self, personality): + """ + Create a list of injected files from the personality attribute + + At this time, injected_files must be formatted as a list of + (file_path, file_content) pairs for compatibility with the + underlying compute service. + """ + injected_files = [] + + for item in personality: + try: + path = item['path'] + contents = item['contents'] + except KeyError as key: + expl = _('Bad personality format: missing %s') % key + raise exc.HTTPBadRequest(explanation=expl) + except TypeError: + expl = _('Bad personality format') + raise exc.HTTPBadRequest(explanation=expl) + try: + contents = base64.b64decode(contents) + except TypeError: + expl = _('Personality content for %s cannot be decoded') % path + raise exc.HTTPBadRequest(explanation=expl) + injected_files.append((path, contents)) + return injected_files class ServerCreateRequestXMLDeserializer(object): diff --git a/nova/scheduler/zone_aware_scheduler.py b/nova/scheduler/zone_aware_scheduler.py index 35ffdbde18..4b96f9877b 100644 --- a/nova/scheduler/zone_aware_scheduler.py +++ b/nova/scheduler/zone_aware_scheduler.py @@ -90,6 +90,7 @@ class ZoneAwareScheduler(driver.Scheduler): image_id = instance_properties['image_id'] meta = instance_properties['metadata'] flavor_id = instance_type['flavorid'] + reservation_id = instance_properties['reservation_id'] files = kwargs['injected_files'] ipgroup = None # Not supported in OS API ... yet @@ -98,7 +99,8 @@ class ZoneAwareScheduler(driver.Scheduler): child_blob = zone_info['child_blob'] zone = db.zone_get(context, child_zone) url = zone.api_url - LOG.debug(_("Forwarding instance create call to child zone %(url)s") + LOG.debug(_("Forwarding instance create call to child zone %(url)s" + ". ReservationID=%(reservation_id)s") % locals()) nova = None try: @@ -109,7 +111,7 @@ class ZoneAwareScheduler(driver.Scheduler): "to talk to zone at %(url)s.") % locals()) nova.servers.create(name, image_id, flavor_id, ipgroup, meta, files, - child_blob) + child_blob, reservation_id=reservation_id) def _provision_resource_from_blob(self, context, item, instance_id, request_spec, kwargs): From cf464dc7f2093ea3d1f831915ce22f54f0d1c90a Mon Sep 17 00:00:00 2001 From: Sandy Walsh Date: Wed, 1 Jun 2011 17:35:49 -0700 Subject: [PATCH 10/70] list --reservation now works across zones --- .../openstack/create_instance_controller.py | 2 -- nova/api/openstack/views/servers.py | 12 +++++++--- nova/compute/api.py | 22 +++++++++++++++++-- nova/scheduler/api.py | 8 ++++--- 4 files changed, 34 insertions(+), 10 deletions(-) diff --git a/nova/api/openstack/create_instance_controller.py b/nova/api/openstack/create_instance_controller.py index 786d74e37d..edb1a50071 100644 --- a/nova/api/openstack/create_instance_controller.py +++ b/nova/api/openstack/create_instance_controller.py @@ -116,8 +116,6 @@ class OpenstackCreateInstanceController(common.OpenstackController): zone_blob = env['server'].get('blob') reservation_id = env['server'].get('reservation_id') - LOG.exception("******* CREATE_INSTANCE RES_ID=%s of %s" % (reservation_id, env)) - inst_type = instance_types.get_instance_type_by_flavor_id(flavor_id) extra_values = { 'instance_type': inst_type, diff --git a/nova/api/openstack/views/servers.py b/nova/api/openstack/views/servers.py index 0be468edc8..0ee461ddef 100644 --- a/nova/api/openstack/views/servers.py +++ b/nova/api/openstack/views/servers.py @@ -41,10 +41,13 @@ class ViewBuilder(object): def build(self, inst, is_detail): """Return a dict that represenst a server.""" - if is_detail: - server = self._build_detail(inst) + if inst.get('_is_precooked', False): + server = dict(server=inst) else: - server = self._build_simple(inst) + if is_detail: + server = self._build_detail(inst) + else: + server = self._build_simple(inst) self._build_extra(server, inst) @@ -78,6 +81,9 @@ class ViewBuilder(object): ctxt = nova.context.get_admin_context() compute_api = nova.compute.API() + + # TODO(sandy): Could be a bug here since the instance ID + # may have come from another Zone. if compute_api.has_finished_migration(ctxt, inst['id']): inst_dict['status'] = 'RESIZE-CONFIRM' diff --git a/nova/compute/api.py b/nova/compute/api.py index fc369ccd2f..f9e76ffbc2 100644 --- a/nova/compute/api.py +++ b/nova/compute/api.py @@ -543,6 +543,25 @@ class API(base.Base): """ return self.get(context, instance_id) + def get_all_across_zones(self, context, reservation_id): + """Get all instances with this reservation_id, across + all available Zones (if any). + """ + instances = self.db.instance_get_all_by_reservation( + context, reservation_id) + + children = scheduler_api.call_zone_method(context, "list", + novaclient_collection_name="servers", + reservation_id=reservation_id) + + for zone, servers in children: + for server in servers: + LOG.debug("**** INSTANCE= %s" % server._info) + # Results are ready to send to user. No need to scrub. + server._info['_is_precooked'] = True + instances.append(server._info) + return instances + def get_all(self, context, project_id=None, reservation_id=None, fixed_ip=None): """Get all instances filtered by one of the given parameters. @@ -552,8 +571,7 @@ class API(base.Base): """ if reservation_id is not None: - return self.db.instance_get_all_by_reservation( - context, reservation_id) + return self.get_all_across_zones(context, reservation_id) if fixed_ip is not None: return self.db.fixed_ip_get_instance(context, fixed_ip) diff --git a/nova/scheduler/api.py b/nova/scheduler/api.py index de0660713c..0f423655e4 100644 --- a/nova/scheduler/api.py +++ b/nova/scheduler/api.py @@ -118,7 +118,8 @@ def _process(func, zone): return func(nova, zone) -def call_zone_method(context, method, errors_to_ignore=None, *args, **kwargs): +def call_zone_method(context, method_name, errors_to_ignore=None, + novaclient_collection_name='zones', *args, **kwargs): """Returns a list of (zone, call_result) objects.""" if not isinstance(errors_to_ignore, (list, tuple)): # This will also handle the default None @@ -138,11 +139,12 @@ def call_zone_method(context, method, errors_to_ignore=None, *args, **kwargs): #TODO (dabo) - add logic for failure counts per zone, # with escalation after a given number of failures. continue - zone_method = getattr(nova.zones, method) + novaclient_collection = getattr(nova, novaclient_collection_name) + collection_method = getattr(novaclient_collection, method_name) def _error_trap(*args, **kwargs): try: - return zone_method(*args, **kwargs) + return collection_method(*args, **kwargs) except Exception as e: if type(e) in errors_to_ignore: return None From e0d2dde5d370d76cd8ff55e47dbbf749be43a4c9 Mon Sep 17 00:00:00 2001 From: Sandy Walsh Date: Wed, 1 Jun 2011 17:49:49 -0700 Subject: [PATCH 11/70] tests all passing again --- nova/api/openstack/create_instance_controller.py | 5 +++-- nova/api/openstack/servers.py | 1 - nova/compute/api.py | 1 - nova/scheduler/api.py | 5 +---- nova/tests/test_scheduler.py | 8 +------- 5 files changed, 5 insertions(+), 15 deletions(-) diff --git a/nova/api/openstack/create_instance_controller.py b/nova/api/openstack/create_instance_controller.py index edb1a50071..3a8bbb3c9a 100644 --- a/nova/api/openstack/create_instance_controller.py +++ b/nova/api/openstack/create_instance_controller.py @@ -15,13 +15,14 @@ # License for the specific language governing permissions and limitations # under the License. +import base64 import re +import webob + from urlparse import urlparse from webob import exc from xml.dom import minidom -import webob - from nova import exception from nova import flags from nova import log as logging diff --git a/nova/api/openstack/servers.py b/nova/api/openstack/servers.py index 2bfcbac814..e5b04db431 100644 --- a/nova/api/openstack/servers.py +++ b/nova/api/openstack/servers.py @@ -88,7 +88,6 @@ class Controller(controller.OpenstackCreateInstanceController): builder - the response model builder """ reservation_id = req.str_GET.get('reservation_id') - LOG.exception(_(" ************* RESERVATION ID %s"), reservation_id) instance_list = self.compute_api.get_all( req.environ['nova.context'], reservation_id=reservation_id) diff --git a/nova/compute/api.py b/nova/compute/api.py index f9e76ffbc2..9cb5727206 100644 --- a/nova/compute/api.py +++ b/nova/compute/api.py @@ -556,7 +556,6 @@ class API(base.Base): for zone, servers in children: for server in servers: - LOG.debug("**** INSTANCE= %s" % server._info) # Results are ready to send to user. No need to scrub. server._info['_is_precooked'] = True instances.append(server._info) diff --git a/nova/scheduler/api.py b/nova/scheduler/api.py index 0f423655e4..432f22b905 100644 --- a/nova/scheduler/api.py +++ b/nova/scheduler/api.py @@ -148,10 +148,7 @@ def call_zone_method(context, method_name, errors_to_ignore=None, except Exception as e: if type(e) in errors_to_ignore: return None - # TODO (dabo) - want to be able to re-raise here. - # Returning a string now; raising was causing issues. - # raise e - return "ERROR", "%s" % e + raise e res = pool.spawn(_error_trap, *args, **kwargs) results.append((zone, res)) diff --git a/nova/tests/test_scheduler.py b/nova/tests/test_scheduler.py index 54b3f80fb3..5d8f34efd1 100644 --- a/nova/tests/test_scheduler.py +++ b/nova/tests/test_scheduler.py @@ -1109,10 +1109,4 @@ class CallZoneMethodTest(test.TestCase): def test_call_zone_method_generates_exception(self): context = {} method = 'raises_exception' - results = api.call_zone_method(context, method) - - # FIXME(sirp): for now the _error_trap code is catching errors and - # converting them to a ("ERROR", "string") tuples. The code (and this - # test) should eventually handle real exceptions. - expected = [(1, ('ERROR', 'testing'))] - self.assertEqual(expected, results) + self.assertRaises(Exception, api.call_zone_method, context, method) From d31ad6211956e69644894490ce37f6c3e8ea5e6e Mon Sep 17 00:00:00 2001 From: Sandy Walsh Date: Wed, 1 Jun 2011 17:53:45 -0700 Subject: [PATCH 12/70] pep8 and all that --- nova/api/openstack/create_instance_controller.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nova/api/openstack/create_instance_controller.py b/nova/api/openstack/create_instance_controller.py index 3a8bbb3c9a..0ab262b6ef 100644 --- a/nova/api/openstack/create_instance_controller.py +++ b/nova/api/openstack/create_instance_controller.py @@ -222,7 +222,7 @@ class OpenstackCreateInstanceController(common.OpenstackController): raise exception.RamdiskNotFoundForImage(image_id=image_id) return kernel_id, ramdisk_id - + def _get_injected_files(self, personality): """ Create a list of injected files from the personality attribute From 970415346b356f03f9d6152bfd4744b94bb59bbd Mon Sep 17 00:00:00 2001 From: Sandy Walsh Date: Wed, 1 Jun 2011 18:17:04 -0700 Subject: [PATCH 13/70] Little cleanups --- nova/api/openstack/views/servers.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/nova/api/openstack/views/servers.py b/nova/api/openstack/views/servers.py index 0ee461ddef..84086b3b20 100644 --- a/nova/api/openstack/views/servers.py +++ b/nova/api/openstack/views/servers.py @@ -49,7 +49,7 @@ class ViewBuilder(object): else: server = self._build_simple(inst) - self._build_extra(server, inst) + self._build_extra(server, inst) return server @@ -82,8 +82,6 @@ class ViewBuilder(object): ctxt = nova.context.get_admin_context() compute_api = nova.compute.API() - # TODO(sandy): Could be a bug here since the instance ID - # may have come from another Zone. if compute_api.has_finished_migration(ctxt, inst['id']): inst_dict['status'] = 'RESIZE-CONFIRM' From 3fb467e44b5e5715e364c6c616998e54d7f20f92 Mon Sep 17 00:00:00 2001 From: Sandy Walsh Date: Thu, 2 Jun 2011 07:57:35 -0700 Subject: [PATCH 14/70] get_all with reservation id across zone tests --- nova/compute/api.py | 16 -------- nova/scheduler/api.py | 7 ---- nova/scheduler/driver.py | 7 ---- nova/scheduler/zone_aware_scheduler.py | 6 --- nova/tests/api/openstack/test_servers.py | 50 ++++++++++++++++++++++-- 5 files changed, 47 insertions(+), 39 deletions(-) diff --git a/nova/compute/api.py b/nova/compute/api.py index 9cb5727206..b99d1d0a34 100644 --- a/nova/compute/api.py +++ b/nova/compute/api.py @@ -377,22 +377,6 @@ class API(base.Base): return [dict(x.iteritems()) for x in instances] - def smart_create(self, *args, **kwargs): - """ - Ask the scheduler if we should do single shot instance requests - or all-at-once. - - Cache this information on first request and act accordingly. - """ - - if API.should_create_all_at_once == None: - API.should_create_all_at_once = \ - scheduler_api.should_create_all_at_once(context) - - if API.should_create_all_at_once: - return self.create_all_at_once(*args, **kwargs) - return self.create(*args, **kwargs) - def has_finished_migration(self, context, instance_id): """Returns true if an instance has a finished migration.""" try: diff --git a/nova/scheduler/api.py b/nova/scheduler/api.py index 432f22b905..789993890a 100644 --- a/nova/scheduler/api.py +++ b/nova/scheduler/api.py @@ -87,13 +87,6 @@ def select(context, specs=None): params={"request_spec": specs}) -def should_create_all_at_once(context): - """Returns a tuple of rules for how instances should - be created given the current Scheduler driver being used.""" - return _call_scheduler('should_create_all_at_once', context=context, - params={}) - - def update_service_capabilities(context, service_name, host, capabilities): """Send an update to all the scheduler services informing them of the capabilities of this service.""" diff --git a/nova/scheduler/driver.py b/nova/scheduler/driver.py index 237e31c044..2094e3565e 100644 --- a/nova/scheduler/driver.py +++ b/nova/scheduler/driver.py @@ -72,13 +72,6 @@ class Scheduler(object): for service in services if self.service_is_up(service)] - def should_create_all_at_once(self, context=None, *args, **kwargs): - """ - Does this driver prefer single-shot requests or all-at-once? - By default, prefer single-shot. - """ - return False - def schedule(self, context, topic, *_args, **_kwargs): """Must override at least this method for scheduler to work.""" raise NotImplementedError(_("Must implement a fallback schedule")) diff --git a/nova/scheduler/zone_aware_scheduler.py b/nova/scheduler/zone_aware_scheduler.py index 4b96f9877b..5e8d630385 100644 --- a/nova/scheduler/zone_aware_scheduler.py +++ b/nova/scheduler/zone_aware_scheduler.py @@ -159,12 +159,6 @@ class ZoneAwareScheduler(driver.Scheduler): self._provision_resource_from_blob(context, item, instance_id, request_spec, kwargs) - def should_create_all_at_once(self, context=None, *args, **kwargs): - """ - This driver prefers all-at-once requests. - """ - return True - def schedule_run_instance(self, context, instance_id, request_spec, *args, **kwargs): """This method is called from nova.compute.api to provision diff --git a/nova/tests/api/openstack/test_servers.py b/nova/tests/api/openstack/test_servers.py index 3d5f92dea6..ae3fad2dc6 100644 --- a/nova/tests/api/openstack/test_servers.py +++ b/nova/tests/api/openstack/test_servers.py @@ -36,6 +36,7 @@ import nova.compute.api from nova.compute import instance_types from nova.compute import power_state import nova.db.api +import nova.scheduler.api from nova.db.sqlalchemy.models import Instance from nova.db.sqlalchemy.models import InstanceMetadata import nova.rpc @@ -68,6 +69,26 @@ def return_servers(context, user_id=1): return [stub_instance(i, user_id) for i in xrange(5)] +def return_servers_by_reservation(context, reservation_id=""): + return [stub_instance(i, reservation_id) for i in xrange(5)] + + +def return_servers_from_child_zones(*args, **kwargs): + class Server(object): + pass + + zones = [] + for zone in xrange(3): + servers = [] + for server_id in xrange(5): + server = Server() + server._info = stub_instance(server_id, reservation_id="child") + servers.append(server) + + zones.append(("Zone%d" % zone, servers)) + return zones + + def return_security_group(context, instance_id, security_group_id): pass @@ -81,7 +102,7 @@ def instance_address(context, instance_id): def stub_instance(id, user_id=1, private_address=None, public_addresses=None, - host=None, power_state=0): + host=None, power_state=0, reservation_id=""): metadata = [] metadata.append(InstanceMetadata(key='seq', value=id)) @@ -93,6 +114,11 @@ def stub_instance(id, user_id=1, private_address=None, public_addresses=None, if host is not None: host = str(host) + # ReservationID isn't sent back, hack it in there. + server_name = "server%s" % id + if reservation_id != "": + server_name = "reservation_%s" % (reservation_id, ) + instance = { "id": id, "admin_pass": "", @@ -113,13 +139,13 @@ def stub_instance(id, user_id=1, private_address=None, public_addresses=None, "host": host, "instance_type": dict(inst_type), "user_data": "", - "reservation_id": "", + "reservation_id": reservation_id, "mac_address": "", "scheduled_at": datetime.datetime.now(), "launched_at": datetime.datetime.now(), "terminated_at": datetime.datetime.now(), "availability_zone": "", - "display_name": "server%s" % id, + "display_name": server_name, "display_description": "", "locked": False, "metadata": metadata} @@ -364,6 +390,24 @@ class ServersTest(test.TestCase): self.assertEqual(s.get('imageId', None), None) i += 1 + def test_get_server_list_with_reservation_id(self): + self.stubs.Set(nova.db.api, 'instance_get_all_by_reservation', + return_servers_by_reservation) + self.stubs.Set(nova.scheduler.api, 'call_zone_method', + return_servers_from_child_zones) + req = webob.Request.blank('/v1.0/servers/detail?reservation_id=foo') + res = req.get_response(fakes.wsgi_app()) + res_dict = json.loads(res.body) + + i = 0 + for s in res_dict['servers']: + print "SERVER", s + if '_is_precooked' in s: + self.assertEqual(s.get('reservation_id'), 'child') + else: + self.assertEqual(s.get('name'), 'server%d' % i) + i += 1 + def test_get_server_list_v1_1(self): req = webob.Request.blank('/v1.1/servers') res = req.get_response(fakes.wsgi_app()) From 983bff090da0f09f944dd4152173a4586866a895 Mon Sep 17 00:00:00 2001 From: Sandy Walsh Date: Thu, 2 Jun 2011 08:05:46 -0700 Subject: [PATCH 15/70] more tests (empty responses) --- nova/tests/api/openstack/test_servers.py | 45 +++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/nova/tests/api/openstack/test_servers.py b/nova/tests/api/openstack/test_servers.py index ae3fad2dc6..ba76b6691f 100644 --- a/nova/tests/api/openstack/test_servers.py +++ b/nova/tests/api/openstack/test_servers.py @@ -73,6 +73,14 @@ def return_servers_by_reservation(context, reservation_id=""): return [stub_instance(i, reservation_id) for i in xrange(5)] +def return_servers_by_reservation_empty(context, reservation_id=""): + return [] + + +def return_servers_from_child_zones_empty(*args, **kwargs): + return [] + + def return_servers_from_child_zones(*args, **kwargs): class Server(object): pass @@ -395,19 +403,54 @@ class ServersTest(test.TestCase): return_servers_by_reservation) self.stubs.Set(nova.scheduler.api, 'call_zone_method', return_servers_from_child_zones) + req = webob.Request.blank('/v1.0/servers?reservation_id=foo') + res = req.get_response(fakes.wsgi_app()) + res_dict = json.loads(res.body) + + i = 0 + for s in res_dict['servers']: + if '_is_precooked' in s: + self.assertEqual(s.get('reservation_id'), 'child') + else: + self.assertEqual(s.get('name'), 'server%d' % i) + i += 1 + + def test_get_server_list_with_reservation_id_empty(self): + self.stubs.Set(nova.db.api, 'instance_get_all_by_reservation', + return_servers_by_reservation_empty) + self.stubs.Set(nova.scheduler.api, 'call_zone_method', + return_servers_from_child_zones_empty) req = webob.Request.blank('/v1.0/servers/detail?reservation_id=foo') res = req.get_response(fakes.wsgi_app()) res_dict = json.loads(res.body) i = 0 for s in res_dict['servers']: - print "SERVER", s if '_is_precooked' in s: self.assertEqual(s.get('reservation_id'), 'child') else: self.assertEqual(s.get('name'), 'server%d' % i) i += 1 + def test_get_server_list_with_reservation_id_details(self): + self.stubs.Set(nova.db.api, 'instance_get_all_by_reservation', + return_servers_by_reservation) + self.stubs.Set(nova.scheduler.api, 'call_zone_method', + return_servers_from_child_zones) + req = webob.Request.blank('/v1.0/servers/detail?reservation_id=foo') + res = req.get_response(fakes.wsgi_app()) + res_dict = json.loads(res.body) + + i = 0 + for s in res_dict['servers']: + if '_is_precooked' in s: + self.assertEqual(s.get('reservation_id'), 'child') + else: + self.assertEqual(s.get('name'), 'server%d' % i) + i += 1 + + + def test_get_server_list_v1_1(self): req = webob.Request.blank('/v1.1/servers') res = req.get_response(fakes.wsgi_app()) From 22c71e27cef8131c8432b57d5965bd14e5300428 Mon Sep 17 00:00:00 2001 From: Sandy Walsh Date: Tue, 7 Jun 2011 15:36:43 -0300 Subject: [PATCH 16/70] Added illustrations for Distributed Scheduler and fixed up formatting --- doc/.autogenerated | 3276 +++++++++++++++++ doc/source/devref/distributed_scheduler.rst | 90 +- doc/source/images/costs_weights.png | Bin 0 -> 35723 bytes doc/source/images/dating_service.png | Bin 0 -> 31945 bytes doc/source/images/filtering.png | Bin 0 -> 18779 bytes doc/source/images/nova.compute.api.create.png | Bin 0 -> 50171 bytes .../nova.compute.api.create_all_at_once.png | Bin 0 -> 62263 bytes doc/source/images/zone_aware_overview.png | Bin 0 -> 56142 bytes doc/source/images/zone_aware_scheduler.png | Bin 0 -> 20902 bytes 9 files changed, 3329 insertions(+), 37 deletions(-) create mode 100644 doc/source/images/costs_weights.png create mode 100644 doc/source/images/dating_service.png create mode 100644 doc/source/images/filtering.png create mode 100755 doc/source/images/nova.compute.api.create.png create mode 100755 doc/source/images/nova.compute.api.create_all_at_once.png create mode 100755 doc/source/images/zone_aware_overview.png create mode 100644 doc/source/images/zone_aware_scheduler.png diff --git a/doc/.autogenerated b/doc/.autogenerated index 456c8ad1e0..5f9630a57f 100644 --- a/doc/.autogenerated +++ b/doc/.autogenerated @@ -281,3 +281,3279 @@ source/api/nova..volume.driver.rst source/api/nova..volume.manager.rst source/api/nova..volume.san.rst source/api/nova..wsgi.rst +source/api/nova.crypto.rst +source/api/nova.cloudpipe.pipelib.rst +source/api/nova.context.rst +source/api/nova.quota.rst +source/api/nova.tests.test_compute.rst +source/api/nova.tests.test_quota.rst +source/api/nova.tests.test_flags.rst +source/api/nova.tests.test_objectstore.rst +source/api/nova.tests.test_crypto.rst +source/api/nova.tests.runtime_flags.rst +source/api/nova.tests.test_exception.rst +source/api/nova.tests.vmwareapi.db_fakes.rst +source/api/nova.tests.vmwareapi.stubs.rst +source/api/nova.tests.test_host_filter.rst +source/api/nova.tests.test_network.rst +source/api/nova.tests.network.base.rst +source/api/nova.tests.declare_flags.rst +source/api/nova.tests.test_localization.rst +source/api/nova.tests.test_access.rst +source/api/nova.tests.test_libvirt.rst +source/api/nova.tests.image.test_glance.rst +source/api/nova.tests.test_direct.rst +source/api/nova.tests.fake_utils.rst +source/api/nova.tests.integrated.test_login.rst +source/api/nova.tests.integrated.test_extensions.rst +source/api/nova.tests.integrated.integrated_helpers.rst +source/api/nova.tests.integrated.test_servers.rst +source/api/nova.tests.integrated.test_xml.rst +source/api/nova.tests.integrated.api.client.rst +source/api/nova.tests.integrated.test_volumes.rst +source/api/nova.tests.test_rpc.rst +source/api/nova.tests.test_volume.rst +source/api/nova.tests.test_notifier.rst +source/api/nova.tests.fake_flags.rst +source/api/nova.tests.test_log.rst +source/api/nova.tests.test_service.rst +source/api/nova.tests.test_twistd.rst +source/api/nova.tests.test_misc.rst +source/api/nova.tests.test_cloud.rst +source/api/nova.tests.glance.stubs.rst +source/api/nova.tests.test_auth.rst +source/api/nova.tests.test_utils.rst +source/api/nova.tests.test_vmwareapi.rst +source/api/nova.tests.test_vlan_network.rst +source/api/nova.tests.test_zones.rst +source/api/nova.tests.test_middleware.rst +source/api/nova.tests.test_ipv6.rst +source/api/nova.tests.xenapi.stubs.rst +source/api/nova.tests.test_api.rst +source/api/nova.tests.scheduler.test_host_filter.rst +source/api/nova.tests.scheduler.test_zone_aware_scheduler.rst +source/api/nova.tests.scheduler.test_least_cost_scheduler.rst +source/api/nova.tests.scheduler.test_scheduler.rst +source/api/nova.tests.db.fakes.rst +source/api/nova.tests.test_instance_types.rst +source/api/nova.tests.test_console.rst +source/api/nova.tests.api.test_wsgi.rst +source/api/nova.tests.api.openstack.test_users.rst +source/api/nova.tests.api.openstack.fakes.rst +source/api/nova.tests.api.openstack.common.rst +source/api/nova.tests.api.openstack.test_wsgi.rst +source/api/nova.tests.api.openstack.test_accounts.rst +source/api/nova.tests.api.openstack.test_flavors.rst +source/api/nova.tests.api.openstack.test_extensions.rst +source/api/nova.tests.api.openstack.test_adminapi.rst +source/api/nova.tests.api.openstack.test_versions.rst +source/api/nova.tests.api.openstack.test_image_metadata.rst +source/api/nova.tests.api.openstack.test_auth.rst +source/api/nova.tests.api.openstack.test_servers.rst +source/api/nova.tests.api.openstack.test_zones.rst +source/api/nova.tests.api.openstack.test_images.rst +source/api/nova.tests.api.openstack.test_api.rst +source/api/nova.tests.api.openstack.test_faults.rst +source/api/nova.tests.api.openstack.test_limits.rst +source/api/nova.tests.api.openstack.test_server_metadata.rst +source/api/nova.tests.api.openstack.test_shared_ip_groups.rst +source/api/nova.tests.api.openstack.test_common.rst +source/api/nova.tests.api.openstack.extensions.foxinsocks.rst +source/api/nova.tests.test_xenapi.rst +source/api/nova.tests.hyperv_unittest.rst +source/api/nova.tests.test_test.rst +source/api/nova.tests.test_flat_network.rst +source/api/nova.network.linux_net.rst +source/api/nova.network.api.rst +source/api/nova.network.manager.rst +source/api/nova.network.vmwareapi_net.rst +source/api/nova.network.xenapi_net.rst +source/api/nova.volume.driver.rst +source/api/nova.volume.api.rst +source/api/nova.volume.san.rst +source/api/nova.volume.manager.rst +source/api/nova.virt.images.rst +source/api/nova.virt.driver.rst +source/api/nova.virt.vmwareapi.io_util.rst +source/api/nova.virt.vmwareapi.error_util.rst +source/api/nova.virt.vmwareapi.vmops.rst +source/api/nova.virt.vmwareapi.fake.rst +source/api/nova.virt.vmwareapi.vim.rst +source/api/nova.virt.vmwareapi.read_write_util.rst +source/api/nova.virt.vmwareapi.vmware_images.rst +source/api/nova.virt.vmwareapi.network_utils.rst +source/api/nova.virt.vmwareapi.vim_util.rst +source/api/nova.virt.vmwareapi.vm_util.rst +source/api/nova.virt.xenapi_conn.rst +source/api/nova.virt.fake.rst +source/api/nova.virt.vmwareapi_conn.rst +source/api/nova.virt.connection.rst +source/api/nova.virt.disk.rst +source/api/nova.virt.libvirt.connection.rst +source/api/nova.virt.libvirt.firewall.rst +source/api/nova.virt.libvirt.netutils.rst +source/api/nova.virt.hyperv.rst +source/api/nova.virt.xenapi.vmops.rst +source/api/nova.virt.xenapi.fake.rst +source/api/nova.virt.xenapi.volume_utils.rst +source/api/nova.virt.xenapi.network_utils.rst +source/api/nova.virt.xenapi.vm_utils.rst +source/api/nova.virt.xenapi.volumeops.rst +source/api/nova.exception.rst +source/api/nova.image.fake.rst +source/api/nova.image.local.rst +source/api/nova.image.glance.rst +source/api/nova.image.service.rst +source/api/nova.image.s3.rst +source/api/nova.objectstore.s3server.rst +source/api/nova.ipv6.account_identifier.rst +source/api/nova.ipv6.api.rst +source/api/nova.ipv6.rfc2462.rst +source/api/nova.notifier.no_op_notifier.rst +source/api/nova.notifier.log_notifier.rst +source/api/nova.notifier.rabbit_notifier.rst +source/api/nova.notifier.api.rst +source/api/nova.vcsversion.rst +source/api/nova.compute.instance_types.rst +source/api/nova.compute.power_state.rst +source/api/nova.compute.api.rst +source/api/nova.compute.manager.rst +source/api/nova.compute.monitor.rst +source/api/nova.wsgi.rst +source/api/nova.console.vmrc_manager.rst +source/api/nova.console.fake.rst +source/api/nova.console.vmrc.rst +source/api/nova.console.api.rst +source/api/nova.console.manager.rst +source/api/nova.console.xvp.rst +source/api/nova.version.rst +source/api/nova.utils.rst +source/api/nova.auth.dbdriver.rst +source/api/nova.auth.fakeldap.rst +source/api/nova.auth.ldapdriver.rst +source/api/nova.auth.signer.rst +source/api/nova.auth.manager.rst +source/api/nova.manager.rst +source/api/nova.scheduler.driver.rst +source/api/nova.scheduler.host_filter.rst +source/api/nova.scheduler.zone.rst +source/api/nova.scheduler.simple.rst +source/api/nova.scheduler.zone_aware_scheduler.rst +source/api/nova.scheduler.zone_manager.rst +source/api/nova.scheduler.api.rst +source/api/nova.scheduler.least_cost.rst +source/api/nova.scheduler.manager.rst +source/api/nova.scheduler.chance.rst +source/api/nova.vnc.auth.rst +source/api/nova.vnc.proxy.rst +source/api/nova.db.base.rst +source/api/nova.db.migration.rst +source/api/nova.db.sqlalchemy.session.rst +source/api/nova.db.sqlalchemy.migration.rst +source/api/nova.db.sqlalchemy.migrate_repo.manage.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.018_rename_server_management_url.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.017_make_instance_type_id_an_integer.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.010_add_os_type_to_instances.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.013_add_flavors_to_migrations.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.009_add_instance_migrations.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.002_bexar.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.020_add_snapshot_id_to_volumes.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.016_make_quotas_key_and_value.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.003_add_label_to_networks.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.021_rename_image_ids.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.006_add_provider_data_to_volumes.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.008_add_instance_types.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.019_add_volume_snapshot_support.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.001_austin.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.011_live_migration.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.005_add_instance_metadata.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.004_add_zone_tables.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.012_add_ipv6_flatmanager.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.015_add_auto_assign_to_floating_ips.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.007_add_ipv6_to_fixed_ips.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.014_add_instance_type_id_to_instances.rst +source/api/nova.db.sqlalchemy.api.rst +source/api/nova.db.sqlalchemy.models.rst +source/api/nova.db.api.rst +source/api/nova.twistd.rst +source/api/nova.test.rst +source/api/nova.fakerabbit.rst +source/api/nova.service.rst +source/api/nova.flags.rst +source/api/nova.api.ec2.ec2utils.rst +source/api/nova.api.ec2.metadatarequesthandler.rst +source/api/nova.api.ec2.cloud.rst +source/api/nova.api.ec2.admin.rst +source/api/nova.api.ec2.apirequest.rst +source/api/nova.api.openstack.images.rst +source/api/nova.api.openstack.faults.rst +source/api/nova.api.openstack.shared_ip_groups.rst +source/api/nova.api.openstack.common.rst +source/api/nova.api.openstack.ips.rst +source/api/nova.api.openstack.extensions.rst +source/api/nova.api.openstack.servers.rst +source/api/nova.api.openstack.consoles.rst +source/api/nova.api.openstack.users.rst +source/api/nova.api.openstack.auth.rst +source/api/nova.api.openstack.versions.rst +source/api/nova.api.openstack.zones.rst +source/api/nova.api.openstack.limits.rst +source/api/nova.api.openstack.flavors.rst +source/api/nova.api.openstack.image_metadata.rst +source/api/nova.api.openstack.contrib.volumes.rst +source/api/nova.api.openstack.wsgi.rst +source/api/nova.api.openstack.accounts.rst +source/api/nova.api.openstack.views.images.rst +source/api/nova.api.openstack.views.addresses.rst +source/api/nova.api.openstack.views.servers.rst +source/api/nova.api.openstack.views.versions.rst +source/api/nova.api.openstack.views.limits.rst +source/api/nova.api.openstack.views.flavors.rst +source/api/nova.api.openstack.server_metadata.rst +source/api/nova.api.openstack.backup_schedules.rst +source/api/nova.api.direct.rst +source/api/nova.log.rst +source/api/nova.rpc.rst +source/api/nova.fakememcache.rst +source/api/nova.crypto.rst +source/api/nova.cloudpipe.pipelib.rst +source/api/nova.context.rst +source/api/nova.quota.rst +source/api/nova.tests.test_compute.rst +source/api/nova.tests.test_quota.rst +source/api/nova.tests.test_flags.rst +source/api/nova.tests.test_objectstore.rst +source/api/nova.tests.test_crypto.rst +source/api/nova.tests.runtime_flags.rst +source/api/nova.tests.test_exception.rst +source/api/nova.tests.vmwareapi.db_fakes.rst +source/api/nova.tests.vmwareapi.stubs.rst +source/api/nova.tests.test_host_filter.rst +source/api/nova.tests.test_network.rst +source/api/nova.tests.network.base.rst +source/api/nova.tests.declare_flags.rst +source/api/nova.tests.test_localization.rst +source/api/nova.tests.test_access.rst +source/api/nova.tests.test_libvirt.rst +source/api/nova.tests.image.test_glance.rst +source/api/nova.tests.test_direct.rst +source/api/nova.tests.fake_utils.rst +source/api/nova.tests.integrated.test_login.rst +source/api/nova.tests.integrated.test_extensions.rst +source/api/nova.tests.integrated.integrated_helpers.rst +source/api/nova.tests.integrated.test_servers.rst +source/api/nova.tests.integrated.test_xml.rst +source/api/nova.tests.integrated.api.client.rst +source/api/nova.tests.integrated.test_volumes.rst +source/api/nova.tests.test_rpc.rst +source/api/nova.tests.test_volume.rst +source/api/nova.tests.test_notifier.rst +source/api/nova.tests.fake_flags.rst +source/api/nova.tests.test_log.rst +source/api/nova.tests.test_service.rst +source/api/nova.tests.test_twistd.rst +source/api/nova.tests.test_misc.rst +source/api/nova.tests.test_cloud.rst +source/api/nova.tests.glance.stubs.rst +source/api/nova.tests.test_auth.rst +source/api/nova.tests.test_utils.rst +source/api/nova.tests.test_vmwareapi.rst +source/api/nova.tests.test_vlan_network.rst +source/api/nova.tests.test_zones.rst +source/api/nova.tests.test_middleware.rst +source/api/nova.tests.test_ipv6.rst +source/api/nova.tests.xenapi.stubs.rst +source/api/nova.tests.test_api.rst +source/api/nova.tests.scheduler.test_host_filter.rst +source/api/nova.tests.scheduler.test_zone_aware_scheduler.rst +source/api/nova.tests.scheduler.test_least_cost_scheduler.rst +source/api/nova.tests.scheduler.test_scheduler.rst +source/api/nova.tests.db.fakes.rst +source/api/nova.tests.test_instance_types.rst +source/api/nova.tests.test_console.rst +source/api/nova.tests.api.test_wsgi.rst +source/api/nova.tests.api.openstack.test_users.rst +source/api/nova.tests.api.openstack.fakes.rst +source/api/nova.tests.api.openstack.common.rst +source/api/nova.tests.api.openstack.test_wsgi.rst +source/api/nova.tests.api.openstack.test_accounts.rst +source/api/nova.tests.api.openstack.test_flavors.rst +source/api/nova.tests.api.openstack.test_extensions.rst +source/api/nova.tests.api.openstack.test_adminapi.rst +source/api/nova.tests.api.openstack.test_versions.rst +source/api/nova.tests.api.openstack.test_image_metadata.rst +source/api/nova.tests.api.openstack.test_auth.rst +source/api/nova.tests.api.openstack.test_servers.rst +source/api/nova.tests.api.openstack.test_zones.rst +source/api/nova.tests.api.openstack.test_images.rst +source/api/nova.tests.api.openstack.test_api.rst +source/api/nova.tests.api.openstack.test_faults.rst +source/api/nova.tests.api.openstack.test_limits.rst +source/api/nova.tests.api.openstack.test_server_metadata.rst +source/api/nova.tests.api.openstack.test_shared_ip_groups.rst +source/api/nova.tests.api.openstack.test_common.rst +source/api/nova.tests.api.openstack.extensions.foxinsocks.rst +source/api/nova.tests.test_xenapi.rst +source/api/nova.tests.hyperv_unittest.rst +source/api/nova.tests.test_test.rst +source/api/nova.tests.test_flat_network.rst +source/api/nova.network.linux_net.rst +source/api/nova.network.api.rst +source/api/nova.network.manager.rst +source/api/nova.network.vmwareapi_net.rst +source/api/nova.network.xenapi_net.rst +source/api/nova.volume.driver.rst +source/api/nova.volume.api.rst +source/api/nova.volume.san.rst +source/api/nova.volume.manager.rst +source/api/nova.virt.images.rst +source/api/nova.virt.driver.rst +source/api/nova.virt.vmwareapi.io_util.rst +source/api/nova.virt.vmwareapi.error_util.rst +source/api/nova.virt.vmwareapi.vmops.rst +source/api/nova.virt.vmwareapi.fake.rst +source/api/nova.virt.vmwareapi.vim.rst +source/api/nova.virt.vmwareapi.read_write_util.rst +source/api/nova.virt.vmwareapi.vmware_images.rst +source/api/nova.virt.vmwareapi.network_utils.rst +source/api/nova.virt.vmwareapi.vim_util.rst +source/api/nova.virt.vmwareapi.vm_util.rst +source/api/nova.virt.xenapi_conn.rst +source/api/nova.virt.fake.rst +source/api/nova.virt.vmwareapi_conn.rst +source/api/nova.virt.connection.rst +source/api/nova.virt.disk.rst +source/api/nova.virt.libvirt.connection.rst +source/api/nova.virt.libvirt.firewall.rst +source/api/nova.virt.libvirt.netutils.rst +source/api/nova.virt.hyperv.rst +source/api/nova.virt.xenapi.vmops.rst +source/api/nova.virt.xenapi.fake.rst +source/api/nova.virt.xenapi.volume_utils.rst +source/api/nova.virt.xenapi.network_utils.rst +source/api/nova.virt.xenapi.vm_utils.rst +source/api/nova.virt.xenapi.volumeops.rst +source/api/nova.exception.rst +source/api/nova.image.fake.rst +source/api/nova.image.local.rst +source/api/nova.image.glance.rst +source/api/nova.image.service.rst +source/api/nova.image.s3.rst +source/api/nova.objectstore.s3server.rst +source/api/nova.ipv6.account_identifier.rst +source/api/nova.ipv6.api.rst +source/api/nova.ipv6.rfc2462.rst +source/api/nova.notifier.no_op_notifier.rst +source/api/nova.notifier.log_notifier.rst +source/api/nova.notifier.rabbit_notifier.rst +source/api/nova.notifier.api.rst +source/api/nova.vcsversion.rst +source/api/nova.compute.instance_types.rst +source/api/nova.compute.power_state.rst +source/api/nova.compute.api.rst +source/api/nova.compute.manager.rst +source/api/nova.compute.monitor.rst +source/api/nova.wsgi.rst +source/api/nova.console.vmrc_manager.rst +source/api/nova.console.fake.rst +source/api/nova.console.vmrc.rst +source/api/nova.console.api.rst +source/api/nova.console.manager.rst +source/api/nova.console.xvp.rst +source/api/nova.version.rst +source/api/nova.utils.rst +source/api/nova.auth.dbdriver.rst +source/api/nova.auth.fakeldap.rst +source/api/nova.auth.ldapdriver.rst +source/api/nova.auth.signer.rst +source/api/nova.auth.manager.rst +source/api/nova.manager.rst +source/api/nova.scheduler.driver.rst +source/api/nova.scheduler.host_filter.rst +source/api/nova.scheduler.zone.rst +source/api/nova.scheduler.simple.rst +source/api/nova.scheduler.zone_aware_scheduler.rst +source/api/nova.scheduler.zone_manager.rst +source/api/nova.scheduler.api.rst +source/api/nova.scheduler.least_cost.rst +source/api/nova.scheduler.manager.rst +source/api/nova.scheduler.chance.rst +source/api/nova.vnc.auth.rst +source/api/nova.vnc.proxy.rst +source/api/nova.db.base.rst +source/api/nova.db.migration.rst +source/api/nova.db.sqlalchemy.session.rst +source/api/nova.db.sqlalchemy.migration.rst +source/api/nova.db.sqlalchemy.migrate_repo.manage.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.018_rename_server_management_url.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.017_make_instance_type_id_an_integer.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.010_add_os_type_to_instances.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.013_add_flavors_to_migrations.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.009_add_instance_migrations.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.002_bexar.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.020_add_snapshot_id_to_volumes.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.016_make_quotas_key_and_value.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.003_add_label_to_networks.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.021_rename_image_ids.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.006_add_provider_data_to_volumes.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.008_add_instance_types.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.019_add_volume_snapshot_support.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.001_austin.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.011_live_migration.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.005_add_instance_metadata.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.004_add_zone_tables.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.012_add_ipv6_flatmanager.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.015_add_auto_assign_to_floating_ips.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.007_add_ipv6_to_fixed_ips.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.014_add_instance_type_id_to_instances.rst +source/api/nova.db.sqlalchemy.api.rst +source/api/nova.db.sqlalchemy.models.rst +source/api/nova.db.api.rst +source/api/nova.twistd.rst +source/api/nova.test.rst +source/api/nova.fakerabbit.rst +source/api/nova.service.rst +source/api/nova.flags.rst +source/api/nova.api.ec2.ec2utils.rst +source/api/nova.api.ec2.metadatarequesthandler.rst +source/api/nova.api.ec2.cloud.rst +source/api/nova.api.ec2.admin.rst +source/api/nova.api.ec2.apirequest.rst +source/api/nova.api.openstack.images.rst +source/api/nova.api.openstack.faults.rst +source/api/nova.api.openstack.shared_ip_groups.rst +source/api/nova.api.openstack.common.rst +source/api/nova.api.openstack.ips.rst +source/api/nova.api.openstack.extensions.rst +source/api/nova.api.openstack.servers.rst +source/api/nova.api.openstack.consoles.rst +source/api/nova.api.openstack.users.rst +source/api/nova.api.openstack.auth.rst +source/api/nova.api.openstack.versions.rst +source/api/nova.api.openstack.zones.rst +source/api/nova.api.openstack.limits.rst +source/api/nova.api.openstack.flavors.rst +source/api/nova.api.openstack.image_metadata.rst +source/api/nova.api.openstack.contrib.volumes.rst +source/api/nova.api.openstack.wsgi.rst +source/api/nova.api.openstack.accounts.rst +source/api/nova.api.openstack.views.images.rst +source/api/nova.api.openstack.views.addresses.rst +source/api/nova.api.openstack.views.servers.rst +source/api/nova.api.openstack.views.versions.rst +source/api/nova.api.openstack.views.limits.rst +source/api/nova.api.openstack.views.flavors.rst +source/api/nova.api.openstack.server_metadata.rst +source/api/nova.api.openstack.backup_schedules.rst +source/api/nova.api.direct.rst +source/api/nova.log.rst +source/api/nova.rpc.rst +source/api/nova.fakememcache.rst +source/api/nova.crypto.rst +source/api/nova.cloudpipe.pipelib.rst +source/api/nova.context.rst +source/api/nova.quota.rst +source/api/nova.tests.test_compute.rst +source/api/nova.tests.test_quota.rst +source/api/nova.tests.test_flags.rst +source/api/nova.tests.test_objectstore.rst +source/api/nova.tests.test_crypto.rst +source/api/nova.tests.runtime_flags.rst +source/api/nova.tests.test_exception.rst +source/api/nova.tests.vmwareapi.db_fakes.rst +source/api/nova.tests.vmwareapi.stubs.rst +source/api/nova.tests.test_host_filter.rst +source/api/nova.tests.test_network.rst +source/api/nova.tests.network.base.rst +source/api/nova.tests.declare_flags.rst +source/api/nova.tests.test_localization.rst +source/api/nova.tests.test_access.rst +source/api/nova.tests.test_libvirt.rst +source/api/nova.tests.image.test_glance.rst +source/api/nova.tests.test_direct.rst +source/api/nova.tests.fake_utils.rst +source/api/nova.tests.integrated.test_login.rst +source/api/nova.tests.integrated.test_extensions.rst +source/api/nova.tests.integrated.integrated_helpers.rst +source/api/nova.tests.integrated.test_servers.rst +source/api/nova.tests.integrated.test_xml.rst +source/api/nova.tests.integrated.api.client.rst +source/api/nova.tests.integrated.test_volumes.rst +source/api/nova.tests.test_rpc.rst +source/api/nova.tests.test_volume.rst +source/api/nova.tests.test_notifier.rst +source/api/nova.tests.fake_flags.rst +source/api/nova.tests.test_log.rst +source/api/nova.tests.test_service.rst +source/api/nova.tests.test_twistd.rst +source/api/nova.tests.test_misc.rst +source/api/nova.tests.test_cloud.rst +source/api/nova.tests.glance.stubs.rst +source/api/nova.tests.test_auth.rst +source/api/nova.tests.test_utils.rst +source/api/nova.tests.test_vmwareapi.rst +source/api/nova.tests.test_vlan_network.rst +source/api/nova.tests.test_zones.rst +source/api/nova.tests.test_middleware.rst +source/api/nova.tests.test_ipv6.rst +source/api/nova.tests.xenapi.stubs.rst +source/api/nova.tests.test_api.rst +source/api/nova.tests.scheduler.test_host_filter.rst +source/api/nova.tests.scheduler.test_zone_aware_scheduler.rst +source/api/nova.tests.scheduler.test_least_cost_scheduler.rst +source/api/nova.tests.scheduler.test_scheduler.rst +source/api/nova.tests.db.fakes.rst +source/api/nova.tests.test_instance_types.rst +source/api/nova.tests.test_console.rst +source/api/nova.tests.api.test_wsgi.rst +source/api/nova.tests.api.openstack.test_users.rst +source/api/nova.tests.api.openstack.fakes.rst +source/api/nova.tests.api.openstack.common.rst +source/api/nova.tests.api.openstack.test_wsgi.rst +source/api/nova.tests.api.openstack.test_accounts.rst +source/api/nova.tests.api.openstack.test_flavors.rst +source/api/nova.tests.api.openstack.test_extensions.rst +source/api/nova.tests.api.openstack.test_adminapi.rst +source/api/nova.tests.api.openstack.test_versions.rst +source/api/nova.tests.api.openstack.test_image_metadata.rst +source/api/nova.tests.api.openstack.test_auth.rst +source/api/nova.tests.api.openstack.test_servers.rst +source/api/nova.tests.api.openstack.test_zones.rst +source/api/nova.tests.api.openstack.test_images.rst +source/api/nova.tests.api.openstack.test_api.rst +source/api/nova.tests.api.openstack.test_faults.rst +source/api/nova.tests.api.openstack.test_limits.rst +source/api/nova.tests.api.openstack.test_server_metadata.rst +source/api/nova.tests.api.openstack.test_shared_ip_groups.rst +source/api/nova.tests.api.openstack.test_common.rst +source/api/nova.tests.api.openstack.extensions.foxinsocks.rst +source/api/nova.tests.test_xenapi.rst +source/api/nova.tests.hyperv_unittest.rst +source/api/nova.tests.test_test.rst +source/api/nova.tests.test_flat_network.rst +source/api/nova.network.linux_net.rst +source/api/nova.network.api.rst +source/api/nova.network.manager.rst +source/api/nova.network.vmwareapi_net.rst +source/api/nova.network.xenapi_net.rst +source/api/nova.volume.driver.rst +source/api/nova.volume.api.rst +source/api/nova.volume.san.rst +source/api/nova.volume.manager.rst +source/api/nova.virt.images.rst +source/api/nova.virt.driver.rst +source/api/nova.virt.vmwareapi.io_util.rst +source/api/nova.virt.vmwareapi.error_util.rst +source/api/nova.virt.vmwareapi.vmops.rst +source/api/nova.virt.vmwareapi.fake.rst +source/api/nova.virt.vmwareapi.vim.rst +source/api/nova.virt.vmwareapi.read_write_util.rst +source/api/nova.virt.vmwareapi.vmware_images.rst +source/api/nova.virt.vmwareapi.network_utils.rst +source/api/nova.virt.vmwareapi.vim_util.rst +source/api/nova.virt.vmwareapi.vm_util.rst +source/api/nova.virt.xenapi_conn.rst +source/api/nova.virt.fake.rst +source/api/nova.virt.vmwareapi_conn.rst +source/api/nova.virt.connection.rst +source/api/nova.virt.disk.rst +source/api/nova.virt.libvirt.connection.rst +source/api/nova.virt.libvirt.firewall.rst +source/api/nova.virt.libvirt.netutils.rst +source/api/nova.virt.hyperv.rst +source/api/nova.virt.xenapi.vmops.rst +source/api/nova.virt.xenapi.fake.rst +source/api/nova.virt.xenapi.volume_utils.rst +source/api/nova.virt.xenapi.network_utils.rst +source/api/nova.virt.xenapi.vm_utils.rst +source/api/nova.virt.xenapi.volumeops.rst +source/api/nova.exception.rst +source/api/nova.image.fake.rst +source/api/nova.image.local.rst +source/api/nova.image.glance.rst +source/api/nova.image.service.rst +source/api/nova.image.s3.rst +source/api/nova.objectstore.s3server.rst +source/api/nova.ipv6.account_identifier.rst +source/api/nova.ipv6.api.rst +source/api/nova.ipv6.rfc2462.rst +source/api/nova.notifier.no_op_notifier.rst +source/api/nova.notifier.log_notifier.rst +source/api/nova.notifier.rabbit_notifier.rst +source/api/nova.notifier.api.rst +source/api/nova.vcsversion.rst +source/api/nova.compute.instance_types.rst +source/api/nova.compute.power_state.rst +source/api/nova.compute.api.rst +source/api/nova.compute.manager.rst +source/api/nova.compute.monitor.rst +source/api/nova.wsgi.rst +source/api/nova.console.vmrc_manager.rst +source/api/nova.console.fake.rst +source/api/nova.console.vmrc.rst +source/api/nova.console.api.rst +source/api/nova.console.manager.rst +source/api/nova.console.xvp.rst +source/api/nova.version.rst +source/api/nova.utils.rst +source/api/nova.auth.dbdriver.rst +source/api/nova.auth.fakeldap.rst +source/api/nova.auth.ldapdriver.rst +source/api/nova.auth.signer.rst +source/api/nova.auth.manager.rst +source/api/nova.manager.rst +source/api/nova.scheduler.driver.rst +source/api/nova.scheduler.host_filter.rst +source/api/nova.scheduler.zone.rst +source/api/nova.scheduler.simple.rst +source/api/nova.scheduler.zone_aware_scheduler.rst +source/api/nova.scheduler.zone_manager.rst +source/api/nova.scheduler.api.rst +source/api/nova.scheduler.least_cost.rst +source/api/nova.scheduler.manager.rst +source/api/nova.scheduler.chance.rst +source/api/nova.vnc.auth.rst +source/api/nova.vnc.proxy.rst +source/api/nova.db.base.rst +source/api/nova.db.migration.rst +source/api/nova.db.sqlalchemy.session.rst +source/api/nova.db.sqlalchemy.migration.rst +source/api/nova.db.sqlalchemy.migrate_repo.manage.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.018_rename_server_management_url.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.017_make_instance_type_id_an_integer.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.010_add_os_type_to_instances.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.013_add_flavors_to_migrations.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.009_add_instance_migrations.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.002_bexar.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.020_add_snapshot_id_to_volumes.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.016_make_quotas_key_and_value.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.003_add_label_to_networks.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.021_rename_image_ids.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.006_add_provider_data_to_volumes.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.008_add_instance_types.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.019_add_volume_snapshot_support.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.001_austin.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.011_live_migration.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.005_add_instance_metadata.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.004_add_zone_tables.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.012_add_ipv6_flatmanager.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.015_add_auto_assign_to_floating_ips.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.007_add_ipv6_to_fixed_ips.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.014_add_instance_type_id_to_instances.rst +source/api/nova.db.sqlalchemy.api.rst +source/api/nova.db.sqlalchemy.models.rst +source/api/nova.db.api.rst +source/api/nova.twistd.rst +source/api/nova.test.rst +source/api/nova.fakerabbit.rst +source/api/nova.service.rst +source/api/nova.flags.rst +source/api/nova.api.ec2.ec2utils.rst +source/api/nova.api.ec2.metadatarequesthandler.rst +source/api/nova.api.ec2.cloud.rst +source/api/nova.api.ec2.admin.rst +source/api/nova.api.ec2.apirequest.rst +source/api/nova.api.openstack.images.rst +source/api/nova.api.openstack.faults.rst +source/api/nova.api.openstack.shared_ip_groups.rst +source/api/nova.api.openstack.common.rst +source/api/nova.api.openstack.ips.rst +source/api/nova.api.openstack.extensions.rst +source/api/nova.api.openstack.servers.rst +source/api/nova.api.openstack.consoles.rst +source/api/nova.api.openstack.users.rst +source/api/nova.api.openstack.auth.rst +source/api/nova.api.openstack.versions.rst +source/api/nova.api.openstack.zones.rst +source/api/nova.api.openstack.limits.rst +source/api/nova.api.openstack.flavors.rst +source/api/nova.api.openstack.image_metadata.rst +source/api/nova.api.openstack.contrib.volumes.rst +source/api/nova.api.openstack.wsgi.rst +source/api/nova.api.openstack.accounts.rst +source/api/nova.api.openstack.views.images.rst +source/api/nova.api.openstack.views.addresses.rst +source/api/nova.api.openstack.views.servers.rst +source/api/nova.api.openstack.views.versions.rst +source/api/nova.api.openstack.views.limits.rst +source/api/nova.api.openstack.views.flavors.rst +source/api/nova.api.openstack.server_metadata.rst +source/api/nova.api.openstack.backup_schedules.rst +source/api/nova.api.direct.rst +source/api/nova.log.rst +source/api/nova.rpc.rst +source/api/nova.fakememcache.rst +source/api/nova.crypto.rst +source/api/nova.cloudpipe.pipelib.rst +source/api/nova.context.rst +source/api/nova.quota.rst +source/api/nova.tests.test_compute.rst +source/api/nova.tests.test_quota.rst +source/api/nova.tests.test_flags.rst +source/api/nova.tests.test_objectstore.rst +source/api/nova.tests.test_crypto.rst +source/api/nova.tests.runtime_flags.rst +source/api/nova.tests.test_exception.rst +source/api/nova.tests.vmwareapi.db_fakes.rst +source/api/nova.tests.vmwareapi.stubs.rst +source/api/nova.tests.test_host_filter.rst +source/api/nova.tests.test_network.rst +source/api/nova.tests.network.base.rst +source/api/nova.tests.declare_flags.rst +source/api/nova.tests.test_localization.rst +source/api/nova.tests.test_access.rst +source/api/nova.tests.test_libvirt.rst +source/api/nova.tests.image.test_glance.rst +source/api/nova.tests.test_direct.rst +source/api/nova.tests.fake_utils.rst +source/api/nova.tests.integrated.test_login.rst +source/api/nova.tests.integrated.test_extensions.rst +source/api/nova.tests.integrated.integrated_helpers.rst +source/api/nova.tests.integrated.test_servers.rst +source/api/nova.tests.integrated.test_xml.rst +source/api/nova.tests.integrated.api.client.rst +source/api/nova.tests.integrated.test_volumes.rst +source/api/nova.tests.test_rpc.rst +source/api/nova.tests.test_volume.rst +source/api/nova.tests.test_notifier.rst +source/api/nova.tests.fake_flags.rst +source/api/nova.tests.test_log.rst +source/api/nova.tests.test_service.rst +source/api/nova.tests.test_twistd.rst +source/api/nova.tests.test_misc.rst +source/api/nova.tests.test_cloud.rst +source/api/nova.tests.glance.stubs.rst +source/api/nova.tests.test_auth.rst +source/api/nova.tests.test_utils.rst +source/api/nova.tests.test_vmwareapi.rst +source/api/nova.tests.test_vlan_network.rst +source/api/nova.tests.test_zones.rst +source/api/nova.tests.test_middleware.rst +source/api/nova.tests.test_ipv6.rst +source/api/nova.tests.xenapi.stubs.rst +source/api/nova.tests.test_api.rst +source/api/nova.tests.scheduler.test_host_filter.rst +source/api/nova.tests.scheduler.test_zone_aware_scheduler.rst +source/api/nova.tests.scheduler.test_least_cost_scheduler.rst +source/api/nova.tests.scheduler.test_scheduler.rst +source/api/nova.tests.db.fakes.rst +source/api/nova.tests.test_instance_types.rst +source/api/nova.tests.test_console.rst +source/api/nova.tests.api.test_wsgi.rst +source/api/nova.tests.api.openstack.test_users.rst +source/api/nova.tests.api.openstack.fakes.rst +source/api/nova.tests.api.openstack.common.rst +source/api/nova.tests.api.openstack.test_wsgi.rst +source/api/nova.tests.api.openstack.test_accounts.rst +source/api/nova.tests.api.openstack.test_flavors.rst +source/api/nova.tests.api.openstack.test_extensions.rst +source/api/nova.tests.api.openstack.test_adminapi.rst +source/api/nova.tests.api.openstack.test_versions.rst +source/api/nova.tests.api.openstack.test_image_metadata.rst +source/api/nova.tests.api.openstack.test_auth.rst +source/api/nova.tests.api.openstack.test_servers.rst +source/api/nova.tests.api.openstack.test_zones.rst +source/api/nova.tests.api.openstack.test_images.rst +source/api/nova.tests.api.openstack.test_api.rst +source/api/nova.tests.api.openstack.test_faults.rst +source/api/nova.tests.api.openstack.test_limits.rst +source/api/nova.tests.api.openstack.test_server_metadata.rst +source/api/nova.tests.api.openstack.test_shared_ip_groups.rst +source/api/nova.tests.api.openstack.test_common.rst +source/api/nova.tests.api.openstack.extensions.foxinsocks.rst +source/api/nova.tests.test_xenapi.rst +source/api/nova.tests.hyperv_unittest.rst +source/api/nova.tests.test_test.rst +source/api/nova.tests.test_flat_network.rst +source/api/nova.network.linux_net.rst +source/api/nova.network.api.rst +source/api/nova.network.manager.rst +source/api/nova.network.vmwareapi_net.rst +source/api/nova.network.xenapi_net.rst +source/api/nova.volume.driver.rst +source/api/nova.volume.api.rst +source/api/nova.volume.san.rst +source/api/nova.volume.manager.rst +source/api/nova.virt.images.rst +source/api/nova.virt.driver.rst +source/api/nova.virt.vmwareapi.io_util.rst +source/api/nova.virt.vmwareapi.error_util.rst +source/api/nova.virt.vmwareapi.vmops.rst +source/api/nova.virt.vmwareapi.fake.rst +source/api/nova.virt.vmwareapi.vim.rst +source/api/nova.virt.vmwareapi.read_write_util.rst +source/api/nova.virt.vmwareapi.vmware_images.rst +source/api/nova.virt.vmwareapi.network_utils.rst +source/api/nova.virt.vmwareapi.vim_util.rst +source/api/nova.virt.vmwareapi.vm_util.rst +source/api/nova.virt.xenapi_conn.rst +source/api/nova.virt.fake.rst +source/api/nova.virt.vmwareapi_conn.rst +source/api/nova.virt.connection.rst +source/api/nova.virt.disk.rst +source/api/nova.virt.libvirt.connection.rst +source/api/nova.virt.libvirt.firewall.rst +source/api/nova.virt.libvirt.netutils.rst +source/api/nova.virt.hyperv.rst +source/api/nova.virt.xenapi.vmops.rst +source/api/nova.virt.xenapi.fake.rst +source/api/nova.virt.xenapi.volume_utils.rst +source/api/nova.virt.xenapi.network_utils.rst +source/api/nova.virt.xenapi.vm_utils.rst +source/api/nova.virt.xenapi.volumeops.rst +source/api/nova.exception.rst +source/api/nova.image.fake.rst +source/api/nova.image.local.rst +source/api/nova.image.glance.rst +source/api/nova.image.service.rst +source/api/nova.image.s3.rst +source/api/nova.objectstore.s3server.rst +source/api/nova.ipv6.account_identifier.rst +source/api/nova.ipv6.api.rst +source/api/nova.ipv6.rfc2462.rst +source/api/nova.notifier.no_op_notifier.rst +source/api/nova.notifier.log_notifier.rst +source/api/nova.notifier.rabbit_notifier.rst +source/api/nova.notifier.api.rst +source/api/nova.vcsversion.rst +source/api/nova.compute.instance_types.rst +source/api/nova.compute.power_state.rst +source/api/nova.compute.api.rst +source/api/nova.compute.manager.rst +source/api/nova.compute.monitor.rst +source/api/nova.wsgi.rst +source/api/nova.console.vmrc_manager.rst +source/api/nova.console.fake.rst +source/api/nova.console.vmrc.rst +source/api/nova.console.api.rst +source/api/nova.console.manager.rst +source/api/nova.console.xvp.rst +source/api/nova.version.rst +source/api/nova.utils.rst +source/api/nova.auth.dbdriver.rst +source/api/nova.auth.fakeldap.rst +source/api/nova.auth.ldapdriver.rst +source/api/nova.auth.signer.rst +source/api/nova.auth.manager.rst +source/api/nova.manager.rst +source/api/nova.scheduler.driver.rst +source/api/nova.scheduler.host_filter.rst +source/api/nova.scheduler.zone.rst +source/api/nova.scheduler.simple.rst +source/api/nova.scheduler.zone_aware_scheduler.rst +source/api/nova.scheduler.zone_manager.rst +source/api/nova.scheduler.api.rst +source/api/nova.scheduler.least_cost.rst +source/api/nova.scheduler.manager.rst +source/api/nova.scheduler.chance.rst +source/api/nova.vnc.auth.rst +source/api/nova.vnc.proxy.rst +source/api/nova.db.base.rst +source/api/nova.db.migration.rst +source/api/nova.db.sqlalchemy.session.rst +source/api/nova.db.sqlalchemy.migration.rst +source/api/nova.db.sqlalchemy.migrate_repo.manage.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.018_rename_server_management_url.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.017_make_instance_type_id_an_integer.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.010_add_os_type_to_instances.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.013_add_flavors_to_migrations.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.009_add_instance_migrations.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.002_bexar.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.020_add_snapshot_id_to_volumes.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.016_make_quotas_key_and_value.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.003_add_label_to_networks.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.021_rename_image_ids.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.006_add_provider_data_to_volumes.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.008_add_instance_types.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.019_add_volume_snapshot_support.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.001_austin.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.011_live_migration.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.005_add_instance_metadata.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.004_add_zone_tables.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.012_add_ipv6_flatmanager.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.015_add_auto_assign_to_floating_ips.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.007_add_ipv6_to_fixed_ips.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.014_add_instance_type_id_to_instances.rst +source/api/nova.db.sqlalchemy.api.rst +source/api/nova.db.sqlalchemy.models.rst +source/api/nova.db.api.rst +source/api/nova.twistd.rst +source/api/nova.test.rst +source/api/nova.fakerabbit.rst +source/api/nova.service.rst +source/api/nova.flags.rst +source/api/nova.api.ec2.ec2utils.rst +source/api/nova.api.ec2.metadatarequesthandler.rst +source/api/nova.api.ec2.cloud.rst +source/api/nova.api.ec2.admin.rst +source/api/nova.api.ec2.apirequest.rst +source/api/nova.api.openstack.images.rst +source/api/nova.api.openstack.faults.rst +source/api/nova.api.openstack.shared_ip_groups.rst +source/api/nova.api.openstack.common.rst +source/api/nova.api.openstack.ips.rst +source/api/nova.api.openstack.extensions.rst +source/api/nova.api.openstack.servers.rst +source/api/nova.api.openstack.consoles.rst +source/api/nova.api.openstack.users.rst +source/api/nova.api.openstack.auth.rst +source/api/nova.api.openstack.versions.rst +source/api/nova.api.openstack.zones.rst +source/api/nova.api.openstack.limits.rst +source/api/nova.api.openstack.flavors.rst +source/api/nova.api.openstack.image_metadata.rst +source/api/nova.api.openstack.contrib.volumes.rst +source/api/nova.api.openstack.wsgi.rst +source/api/nova.api.openstack.accounts.rst +source/api/nova.api.openstack.views.images.rst +source/api/nova.api.openstack.views.addresses.rst +source/api/nova.api.openstack.views.servers.rst +source/api/nova.api.openstack.views.versions.rst +source/api/nova.api.openstack.views.limits.rst +source/api/nova.api.openstack.views.flavors.rst +source/api/nova.api.openstack.server_metadata.rst +source/api/nova.api.openstack.backup_schedules.rst +source/api/nova.api.direct.rst +source/api/nova.log.rst +source/api/nova.rpc.rst +source/api/nova.fakememcache.rst +source/api/nova.crypto.rst +source/api/nova.cloudpipe.pipelib.rst +source/api/nova.context.rst +source/api/nova.quota.rst +source/api/nova.tests.test_compute.rst +source/api/nova.tests.test_quota.rst +source/api/nova.tests.test_flags.rst +source/api/nova.tests.test_objectstore.rst +source/api/nova.tests.test_crypto.rst +source/api/nova.tests.runtime_flags.rst +source/api/nova.tests.test_exception.rst +source/api/nova.tests.vmwareapi.db_fakes.rst +source/api/nova.tests.vmwareapi.stubs.rst +source/api/nova.tests.test_host_filter.rst +source/api/nova.tests.test_network.rst +source/api/nova.tests.network.base.rst +source/api/nova.tests.declare_flags.rst +source/api/nova.tests.test_localization.rst +source/api/nova.tests.test_access.rst +source/api/nova.tests.test_libvirt.rst +source/api/nova.tests.image.test_glance.rst +source/api/nova.tests.test_direct.rst +source/api/nova.tests.fake_utils.rst +source/api/nova.tests.integrated.test_login.rst +source/api/nova.tests.integrated.test_extensions.rst +source/api/nova.tests.integrated.integrated_helpers.rst +source/api/nova.tests.integrated.test_servers.rst +source/api/nova.tests.integrated.test_xml.rst +source/api/nova.tests.integrated.api.client.rst +source/api/nova.tests.integrated.test_volumes.rst +source/api/nova.tests.test_rpc.rst +source/api/nova.tests.test_volume.rst +source/api/nova.tests.test_notifier.rst +source/api/nova.tests.fake_flags.rst +source/api/nova.tests.test_log.rst +source/api/nova.tests.test_service.rst +source/api/nova.tests.test_twistd.rst +source/api/nova.tests.test_misc.rst +source/api/nova.tests.test_cloud.rst +source/api/nova.tests.glance.stubs.rst +source/api/nova.tests.test_auth.rst +source/api/nova.tests.test_utils.rst +source/api/nova.tests.test_vmwareapi.rst +source/api/nova.tests.test_vlan_network.rst +source/api/nova.tests.test_zones.rst +source/api/nova.tests.test_middleware.rst +source/api/nova.tests.test_ipv6.rst +source/api/nova.tests.xenapi.stubs.rst +source/api/nova.tests.test_api.rst +source/api/nova.tests.scheduler.test_host_filter.rst +source/api/nova.tests.scheduler.test_zone_aware_scheduler.rst +source/api/nova.tests.scheduler.test_least_cost_scheduler.rst +source/api/nova.tests.scheduler.test_scheduler.rst +source/api/nova.tests.db.fakes.rst +source/api/nova.tests.test_instance_types.rst +source/api/nova.tests.test_console.rst +source/api/nova.tests.api.test_wsgi.rst +source/api/nova.tests.api.openstack.test_users.rst +source/api/nova.tests.api.openstack.fakes.rst +source/api/nova.tests.api.openstack.common.rst +source/api/nova.tests.api.openstack.test_wsgi.rst +source/api/nova.tests.api.openstack.test_accounts.rst +source/api/nova.tests.api.openstack.test_flavors.rst +source/api/nova.tests.api.openstack.test_extensions.rst +source/api/nova.tests.api.openstack.test_adminapi.rst +source/api/nova.tests.api.openstack.test_versions.rst +source/api/nova.tests.api.openstack.test_image_metadata.rst +source/api/nova.tests.api.openstack.test_auth.rst +source/api/nova.tests.api.openstack.test_servers.rst +source/api/nova.tests.api.openstack.test_zones.rst +source/api/nova.tests.api.openstack.test_images.rst +source/api/nova.tests.api.openstack.test_api.rst +source/api/nova.tests.api.openstack.test_faults.rst +source/api/nova.tests.api.openstack.test_limits.rst +source/api/nova.tests.api.openstack.test_server_metadata.rst +source/api/nova.tests.api.openstack.test_shared_ip_groups.rst +source/api/nova.tests.api.openstack.test_common.rst +source/api/nova.tests.api.openstack.extensions.foxinsocks.rst +source/api/nova.tests.test_xenapi.rst +source/api/nova.tests.hyperv_unittest.rst +source/api/nova.tests.test_test.rst +source/api/nova.tests.test_flat_network.rst +source/api/nova.network.linux_net.rst +source/api/nova.network.api.rst +source/api/nova.network.manager.rst +source/api/nova.network.vmwareapi_net.rst +source/api/nova.network.xenapi_net.rst +source/api/nova.volume.driver.rst +source/api/nova.volume.api.rst +source/api/nova.volume.san.rst +source/api/nova.volume.manager.rst +source/api/nova.virt.images.rst +source/api/nova.virt.driver.rst +source/api/nova.virt.vmwareapi.io_util.rst +source/api/nova.virt.vmwareapi.error_util.rst +source/api/nova.virt.vmwareapi.vmops.rst +source/api/nova.virt.vmwareapi.fake.rst +source/api/nova.virt.vmwareapi.vim.rst +source/api/nova.virt.vmwareapi.read_write_util.rst +source/api/nova.virt.vmwareapi.vmware_images.rst +source/api/nova.virt.vmwareapi.network_utils.rst +source/api/nova.virt.vmwareapi.vim_util.rst +source/api/nova.virt.vmwareapi.vm_util.rst +source/api/nova.virt.xenapi_conn.rst +source/api/nova.virt.fake.rst +source/api/nova.virt.vmwareapi_conn.rst +source/api/nova.virt.connection.rst +source/api/nova.virt.disk.rst +source/api/nova.virt.libvirt.connection.rst +source/api/nova.virt.libvirt.firewall.rst +source/api/nova.virt.libvirt.netutils.rst +source/api/nova.virt.hyperv.rst +source/api/nova.virt.xenapi.vmops.rst +source/api/nova.virt.xenapi.fake.rst +source/api/nova.virt.xenapi.volume_utils.rst +source/api/nova.virt.xenapi.network_utils.rst +source/api/nova.virt.xenapi.vm_utils.rst +source/api/nova.virt.xenapi.volumeops.rst +source/api/nova.exception.rst +source/api/nova.image.fake.rst +source/api/nova.image.local.rst +source/api/nova.image.glance.rst +source/api/nova.image.service.rst +source/api/nova.image.s3.rst +source/api/nova.objectstore.s3server.rst +source/api/nova.ipv6.account_identifier.rst +source/api/nova.ipv6.api.rst +source/api/nova.ipv6.rfc2462.rst +source/api/nova.notifier.no_op_notifier.rst +source/api/nova.notifier.log_notifier.rst +source/api/nova.notifier.rabbit_notifier.rst +source/api/nova.notifier.api.rst +source/api/nova.vcsversion.rst +source/api/nova.compute.instance_types.rst +source/api/nova.compute.power_state.rst +source/api/nova.compute.api.rst +source/api/nova.compute.manager.rst +source/api/nova.compute.monitor.rst +source/api/nova.wsgi.rst +source/api/nova.console.vmrc_manager.rst +source/api/nova.console.fake.rst +source/api/nova.console.vmrc.rst +source/api/nova.console.api.rst +source/api/nova.console.manager.rst +source/api/nova.console.xvp.rst +source/api/nova.version.rst +source/api/nova.utils.rst +source/api/nova.auth.dbdriver.rst +source/api/nova.auth.fakeldap.rst +source/api/nova.auth.ldapdriver.rst +source/api/nova.auth.signer.rst +source/api/nova.auth.manager.rst +source/api/nova.manager.rst +source/api/nova.scheduler.driver.rst +source/api/nova.scheduler.host_filter.rst +source/api/nova.scheduler.zone.rst +source/api/nova.scheduler.simple.rst +source/api/nova.scheduler.zone_aware_scheduler.rst +source/api/nova.scheduler.zone_manager.rst +source/api/nova.scheduler.api.rst +source/api/nova.scheduler.least_cost.rst +source/api/nova.scheduler.manager.rst +source/api/nova.scheduler.chance.rst +source/api/nova.vnc.auth.rst +source/api/nova.vnc.proxy.rst +source/api/nova.db.base.rst +source/api/nova.db.migration.rst +source/api/nova.db.sqlalchemy.session.rst +source/api/nova.db.sqlalchemy.migration.rst +source/api/nova.db.sqlalchemy.migrate_repo.manage.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.018_rename_server_management_url.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.017_make_instance_type_id_an_integer.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.010_add_os_type_to_instances.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.013_add_flavors_to_migrations.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.009_add_instance_migrations.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.002_bexar.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.020_add_snapshot_id_to_volumes.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.016_make_quotas_key_and_value.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.003_add_label_to_networks.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.021_rename_image_ids.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.006_add_provider_data_to_volumes.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.008_add_instance_types.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.019_add_volume_snapshot_support.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.001_austin.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.011_live_migration.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.005_add_instance_metadata.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.004_add_zone_tables.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.012_add_ipv6_flatmanager.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.015_add_auto_assign_to_floating_ips.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.007_add_ipv6_to_fixed_ips.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.014_add_instance_type_id_to_instances.rst +source/api/nova.db.sqlalchemy.api.rst +source/api/nova.db.sqlalchemy.models.rst +source/api/nova.db.api.rst +source/api/nova.twistd.rst +source/api/nova.test.rst +source/api/nova.fakerabbit.rst +source/api/nova.service.rst +source/api/nova.flags.rst +source/api/nova.api.ec2.ec2utils.rst +source/api/nova.api.ec2.metadatarequesthandler.rst +source/api/nova.api.ec2.cloud.rst +source/api/nova.api.ec2.admin.rst +source/api/nova.api.ec2.apirequest.rst +source/api/nova.api.openstack.images.rst +source/api/nova.api.openstack.faults.rst +source/api/nova.api.openstack.shared_ip_groups.rst +source/api/nova.api.openstack.common.rst +source/api/nova.api.openstack.ips.rst +source/api/nova.api.openstack.extensions.rst +source/api/nova.api.openstack.servers.rst +source/api/nova.api.openstack.consoles.rst +source/api/nova.api.openstack.users.rst +source/api/nova.api.openstack.auth.rst +source/api/nova.api.openstack.versions.rst +source/api/nova.api.openstack.zones.rst +source/api/nova.api.openstack.limits.rst +source/api/nova.api.openstack.flavors.rst +source/api/nova.api.openstack.image_metadata.rst +source/api/nova.api.openstack.contrib.volumes.rst +source/api/nova.api.openstack.wsgi.rst +source/api/nova.api.openstack.accounts.rst +source/api/nova.api.openstack.views.images.rst +source/api/nova.api.openstack.views.addresses.rst +source/api/nova.api.openstack.views.servers.rst +source/api/nova.api.openstack.views.versions.rst +source/api/nova.api.openstack.views.limits.rst +source/api/nova.api.openstack.views.flavors.rst +source/api/nova.api.openstack.server_metadata.rst +source/api/nova.api.openstack.backup_schedules.rst +source/api/nova.api.direct.rst +source/api/nova.log.rst +source/api/nova.rpc.rst +source/api/nova.fakememcache.rst +source/api/nova.crypto.rst +source/api/nova.cloudpipe.pipelib.rst +source/api/nova.context.rst +source/api/nova.quota.rst +source/api/nova.tests.test_compute.rst +source/api/nova.tests.test_quota.rst +source/api/nova.tests.test_flags.rst +source/api/nova.tests.test_objectstore.rst +source/api/nova.tests.test_crypto.rst +source/api/nova.tests.runtime_flags.rst +source/api/nova.tests.test_exception.rst +source/api/nova.tests.vmwareapi.db_fakes.rst +source/api/nova.tests.vmwareapi.stubs.rst +source/api/nova.tests.test_host_filter.rst +source/api/nova.tests.test_network.rst +source/api/nova.tests.network.base.rst +source/api/nova.tests.declare_flags.rst +source/api/nova.tests.test_localization.rst +source/api/nova.tests.test_access.rst +source/api/nova.tests.test_libvirt.rst +source/api/nova.tests.image.test_glance.rst +source/api/nova.tests.test_direct.rst +source/api/nova.tests.fake_utils.rst +source/api/nova.tests.integrated.test_login.rst +source/api/nova.tests.integrated.test_extensions.rst +source/api/nova.tests.integrated.integrated_helpers.rst +source/api/nova.tests.integrated.test_servers.rst +source/api/nova.tests.integrated.test_xml.rst +source/api/nova.tests.integrated.api.client.rst +source/api/nova.tests.integrated.test_volumes.rst +source/api/nova.tests.test_rpc.rst +source/api/nova.tests.test_volume.rst +source/api/nova.tests.test_notifier.rst +source/api/nova.tests.fake_flags.rst +source/api/nova.tests.test_log.rst +source/api/nova.tests.test_service.rst +source/api/nova.tests.test_twistd.rst +source/api/nova.tests.test_misc.rst +source/api/nova.tests.test_cloud.rst +source/api/nova.tests.glance.stubs.rst +source/api/nova.tests.test_auth.rst +source/api/nova.tests.test_utils.rst +source/api/nova.tests.test_vmwareapi.rst +source/api/nova.tests.test_vlan_network.rst +source/api/nova.tests.test_zones.rst +source/api/nova.tests.test_middleware.rst +source/api/nova.tests.test_ipv6.rst +source/api/nova.tests.xenapi.stubs.rst +source/api/nova.tests.test_api.rst +source/api/nova.tests.scheduler.test_host_filter.rst +source/api/nova.tests.scheduler.test_zone_aware_scheduler.rst +source/api/nova.tests.scheduler.test_least_cost_scheduler.rst +source/api/nova.tests.scheduler.test_scheduler.rst +source/api/nova.tests.db.fakes.rst +source/api/nova.tests.test_instance_types.rst +source/api/nova.tests.test_console.rst +source/api/nova.tests.api.test_wsgi.rst +source/api/nova.tests.api.openstack.test_users.rst +source/api/nova.tests.api.openstack.fakes.rst +source/api/nova.tests.api.openstack.common.rst +source/api/nova.tests.api.openstack.test_wsgi.rst +source/api/nova.tests.api.openstack.test_accounts.rst +source/api/nova.tests.api.openstack.test_flavors.rst +source/api/nova.tests.api.openstack.test_extensions.rst +source/api/nova.tests.api.openstack.test_adminapi.rst +source/api/nova.tests.api.openstack.test_versions.rst +source/api/nova.tests.api.openstack.test_image_metadata.rst +source/api/nova.tests.api.openstack.test_auth.rst +source/api/nova.tests.api.openstack.test_servers.rst +source/api/nova.tests.api.openstack.test_zones.rst +source/api/nova.tests.api.openstack.test_images.rst +source/api/nova.tests.api.openstack.test_api.rst +source/api/nova.tests.api.openstack.test_faults.rst +source/api/nova.tests.api.openstack.test_limits.rst +source/api/nova.tests.api.openstack.test_server_metadata.rst +source/api/nova.tests.api.openstack.test_shared_ip_groups.rst +source/api/nova.tests.api.openstack.test_common.rst +source/api/nova.tests.api.openstack.extensions.foxinsocks.rst +source/api/nova.tests.test_xenapi.rst +source/api/nova.tests.hyperv_unittest.rst +source/api/nova.tests.test_test.rst +source/api/nova.tests.test_flat_network.rst +source/api/nova.network.linux_net.rst +source/api/nova.network.api.rst +source/api/nova.network.manager.rst +source/api/nova.network.vmwareapi_net.rst +source/api/nova.network.xenapi_net.rst +source/api/nova.volume.driver.rst +source/api/nova.volume.api.rst +source/api/nova.volume.san.rst +source/api/nova.volume.manager.rst +source/api/nova.virt.images.rst +source/api/nova.virt.driver.rst +source/api/nova.virt.vmwareapi.io_util.rst +source/api/nova.virt.vmwareapi.error_util.rst +source/api/nova.virt.vmwareapi.vmops.rst +source/api/nova.virt.vmwareapi.fake.rst +source/api/nova.virt.vmwareapi.vim.rst +source/api/nova.virt.vmwareapi.read_write_util.rst +source/api/nova.virt.vmwareapi.vmware_images.rst +source/api/nova.virt.vmwareapi.network_utils.rst +source/api/nova.virt.vmwareapi.vim_util.rst +source/api/nova.virt.vmwareapi.vm_util.rst +source/api/nova.virt.xenapi_conn.rst +source/api/nova.virt.fake.rst +source/api/nova.virt.vmwareapi_conn.rst +source/api/nova.virt.connection.rst +source/api/nova.virt.disk.rst +source/api/nova.virt.libvirt.connection.rst +source/api/nova.virt.libvirt.firewall.rst +source/api/nova.virt.libvirt.netutils.rst +source/api/nova.virt.hyperv.rst +source/api/nova.virt.xenapi.vmops.rst +source/api/nova.virt.xenapi.fake.rst +source/api/nova.virt.xenapi.volume_utils.rst +source/api/nova.virt.xenapi.network_utils.rst +source/api/nova.virt.xenapi.vm_utils.rst +source/api/nova.virt.xenapi.volumeops.rst +source/api/nova.exception.rst +source/api/nova.image.fake.rst +source/api/nova.image.local.rst +source/api/nova.image.glance.rst +source/api/nova.image.service.rst +source/api/nova.image.s3.rst +source/api/nova.objectstore.s3server.rst +source/api/nova.ipv6.account_identifier.rst +source/api/nova.ipv6.api.rst +source/api/nova.ipv6.rfc2462.rst +source/api/nova.notifier.no_op_notifier.rst +source/api/nova.notifier.log_notifier.rst +source/api/nova.notifier.rabbit_notifier.rst +source/api/nova.notifier.api.rst +source/api/nova.vcsversion.rst +source/api/nova.compute.instance_types.rst +source/api/nova.compute.power_state.rst +source/api/nova.compute.api.rst +source/api/nova.compute.manager.rst +source/api/nova.compute.monitor.rst +source/api/nova.wsgi.rst +source/api/nova.console.vmrc_manager.rst +source/api/nova.console.fake.rst +source/api/nova.console.vmrc.rst +source/api/nova.console.api.rst +source/api/nova.console.manager.rst +source/api/nova.console.xvp.rst +source/api/nova.version.rst +source/api/nova.utils.rst +source/api/nova.auth.dbdriver.rst +source/api/nova.auth.fakeldap.rst +source/api/nova.auth.ldapdriver.rst +source/api/nova.auth.signer.rst +source/api/nova.auth.manager.rst +source/api/nova.manager.rst +source/api/nova.scheduler.driver.rst +source/api/nova.scheduler.host_filter.rst +source/api/nova.scheduler.zone.rst +source/api/nova.scheduler.simple.rst +source/api/nova.scheduler.zone_aware_scheduler.rst +source/api/nova.scheduler.zone_manager.rst +source/api/nova.scheduler.api.rst +source/api/nova.scheduler.least_cost.rst +source/api/nova.scheduler.manager.rst +source/api/nova.scheduler.chance.rst +source/api/nova.vnc.auth.rst +source/api/nova.vnc.proxy.rst +source/api/nova.db.base.rst +source/api/nova.db.migration.rst +source/api/nova.db.sqlalchemy.session.rst +source/api/nova.db.sqlalchemy.migration.rst +source/api/nova.db.sqlalchemy.migrate_repo.manage.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.018_rename_server_management_url.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.017_make_instance_type_id_an_integer.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.010_add_os_type_to_instances.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.013_add_flavors_to_migrations.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.009_add_instance_migrations.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.002_bexar.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.020_add_snapshot_id_to_volumes.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.016_make_quotas_key_and_value.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.003_add_label_to_networks.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.021_rename_image_ids.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.006_add_provider_data_to_volumes.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.008_add_instance_types.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.019_add_volume_snapshot_support.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.001_austin.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.011_live_migration.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.005_add_instance_metadata.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.004_add_zone_tables.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.012_add_ipv6_flatmanager.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.015_add_auto_assign_to_floating_ips.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.007_add_ipv6_to_fixed_ips.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.014_add_instance_type_id_to_instances.rst +source/api/nova.db.sqlalchemy.api.rst +source/api/nova.db.sqlalchemy.models.rst +source/api/nova.db.api.rst +source/api/nova.twistd.rst +source/api/nova.test.rst +source/api/nova.fakerabbit.rst +source/api/nova.service.rst +source/api/nova.flags.rst +source/api/nova.api.ec2.ec2utils.rst +source/api/nova.api.ec2.metadatarequesthandler.rst +source/api/nova.api.ec2.cloud.rst +source/api/nova.api.ec2.admin.rst +source/api/nova.api.ec2.apirequest.rst +source/api/nova.api.openstack.images.rst +source/api/nova.api.openstack.faults.rst +source/api/nova.api.openstack.shared_ip_groups.rst +source/api/nova.api.openstack.common.rst +source/api/nova.api.openstack.ips.rst +source/api/nova.api.openstack.extensions.rst +source/api/nova.api.openstack.servers.rst +source/api/nova.api.openstack.consoles.rst +source/api/nova.api.openstack.users.rst +source/api/nova.api.openstack.auth.rst +source/api/nova.api.openstack.versions.rst +source/api/nova.api.openstack.zones.rst +source/api/nova.api.openstack.limits.rst +source/api/nova.api.openstack.flavors.rst +source/api/nova.api.openstack.image_metadata.rst +source/api/nova.api.openstack.contrib.volumes.rst +source/api/nova.api.openstack.wsgi.rst +source/api/nova.api.openstack.accounts.rst +source/api/nova.api.openstack.views.images.rst +source/api/nova.api.openstack.views.addresses.rst +source/api/nova.api.openstack.views.servers.rst +source/api/nova.api.openstack.views.versions.rst +source/api/nova.api.openstack.views.limits.rst +source/api/nova.api.openstack.views.flavors.rst +source/api/nova.api.openstack.server_metadata.rst +source/api/nova.api.openstack.backup_schedules.rst +source/api/nova.api.direct.rst +source/api/nova.log.rst +source/api/nova.rpc.rst +source/api/nova.fakememcache.rst +source/api/nova.crypto.rst +source/api/nova.cloudpipe.pipelib.rst +source/api/nova.context.rst +source/api/nova.quota.rst +source/api/nova.tests.test_compute.rst +source/api/nova.tests.test_quota.rst +source/api/nova.tests.test_flags.rst +source/api/nova.tests.test_objectstore.rst +source/api/nova.tests.test_crypto.rst +source/api/nova.tests.runtime_flags.rst +source/api/nova.tests.test_exception.rst +source/api/nova.tests.vmwareapi.db_fakes.rst +source/api/nova.tests.vmwareapi.stubs.rst +source/api/nova.tests.test_host_filter.rst +source/api/nova.tests.test_network.rst +source/api/nova.tests.network.base.rst +source/api/nova.tests.declare_flags.rst +source/api/nova.tests.test_localization.rst +source/api/nova.tests.test_access.rst +source/api/nova.tests.test_libvirt.rst +source/api/nova.tests.image.test_glance.rst +source/api/nova.tests.test_direct.rst +source/api/nova.tests.fake_utils.rst +source/api/nova.tests.integrated.test_login.rst +source/api/nova.tests.integrated.test_extensions.rst +source/api/nova.tests.integrated.integrated_helpers.rst +source/api/nova.tests.integrated.test_servers.rst +source/api/nova.tests.integrated.test_xml.rst +source/api/nova.tests.integrated.api.client.rst +source/api/nova.tests.integrated.test_volumes.rst +source/api/nova.tests.test_rpc.rst +source/api/nova.tests.test_volume.rst +source/api/nova.tests.test_notifier.rst +source/api/nova.tests.fake_flags.rst +source/api/nova.tests.test_log.rst +source/api/nova.tests.test_service.rst +source/api/nova.tests.test_twistd.rst +source/api/nova.tests.test_misc.rst +source/api/nova.tests.test_cloud.rst +source/api/nova.tests.glance.stubs.rst +source/api/nova.tests.test_auth.rst +source/api/nova.tests.test_utils.rst +source/api/nova.tests.test_vmwareapi.rst +source/api/nova.tests.test_vlan_network.rst +source/api/nova.tests.test_zones.rst +source/api/nova.tests.test_middleware.rst +source/api/nova.tests.test_ipv6.rst +source/api/nova.tests.xenapi.stubs.rst +source/api/nova.tests.test_api.rst +source/api/nova.tests.scheduler.test_host_filter.rst +source/api/nova.tests.scheduler.test_zone_aware_scheduler.rst +source/api/nova.tests.scheduler.test_least_cost_scheduler.rst +source/api/nova.tests.scheduler.test_scheduler.rst +source/api/nova.tests.db.fakes.rst +source/api/nova.tests.test_instance_types.rst +source/api/nova.tests.test_console.rst +source/api/nova.tests.api.test_wsgi.rst +source/api/nova.tests.api.openstack.test_users.rst +source/api/nova.tests.api.openstack.fakes.rst +source/api/nova.tests.api.openstack.common.rst +source/api/nova.tests.api.openstack.test_wsgi.rst +source/api/nova.tests.api.openstack.test_accounts.rst +source/api/nova.tests.api.openstack.test_flavors.rst +source/api/nova.tests.api.openstack.test_extensions.rst +source/api/nova.tests.api.openstack.test_adminapi.rst +source/api/nova.tests.api.openstack.test_versions.rst +source/api/nova.tests.api.openstack.test_image_metadata.rst +source/api/nova.tests.api.openstack.test_auth.rst +source/api/nova.tests.api.openstack.test_servers.rst +source/api/nova.tests.api.openstack.test_zones.rst +source/api/nova.tests.api.openstack.test_images.rst +source/api/nova.tests.api.openstack.test_api.rst +source/api/nova.tests.api.openstack.test_faults.rst +source/api/nova.tests.api.openstack.test_limits.rst +source/api/nova.tests.api.openstack.test_server_metadata.rst +source/api/nova.tests.api.openstack.test_shared_ip_groups.rst +source/api/nova.tests.api.openstack.test_common.rst +source/api/nova.tests.api.openstack.extensions.foxinsocks.rst +source/api/nova.tests.test_xenapi.rst +source/api/nova.tests.hyperv_unittest.rst +source/api/nova.tests.test_test.rst +source/api/nova.tests.test_flat_network.rst +source/api/nova.network.linux_net.rst +source/api/nova.network.api.rst +source/api/nova.network.manager.rst +source/api/nova.network.vmwareapi_net.rst +source/api/nova.network.xenapi_net.rst +source/api/nova.volume.driver.rst +source/api/nova.volume.api.rst +source/api/nova.volume.san.rst +source/api/nova.volume.manager.rst +source/api/nova.virt.images.rst +source/api/nova.virt.driver.rst +source/api/nova.virt.vmwareapi.io_util.rst +source/api/nova.virt.vmwareapi.error_util.rst +source/api/nova.virt.vmwareapi.vmops.rst +source/api/nova.virt.vmwareapi.fake.rst +source/api/nova.virt.vmwareapi.vim.rst +source/api/nova.virt.vmwareapi.read_write_util.rst +source/api/nova.virt.vmwareapi.vmware_images.rst +source/api/nova.virt.vmwareapi.network_utils.rst +source/api/nova.virt.vmwareapi.vim_util.rst +source/api/nova.virt.vmwareapi.vm_util.rst +source/api/nova.virt.xenapi_conn.rst +source/api/nova.virt.fake.rst +source/api/nova.virt.vmwareapi_conn.rst +source/api/nova.virt.connection.rst +source/api/nova.virt.disk.rst +source/api/nova.virt.libvirt.connection.rst +source/api/nova.virt.libvirt.firewall.rst +source/api/nova.virt.libvirt.netutils.rst +source/api/nova.virt.hyperv.rst +source/api/nova.virt.xenapi.vmops.rst +source/api/nova.virt.xenapi.fake.rst +source/api/nova.virt.xenapi.volume_utils.rst +source/api/nova.virt.xenapi.network_utils.rst +source/api/nova.virt.xenapi.vm_utils.rst +source/api/nova.virt.xenapi.volumeops.rst +source/api/nova.exception.rst +source/api/nova.image.fake.rst +source/api/nova.image.local.rst +source/api/nova.image.glance.rst +source/api/nova.image.service.rst +source/api/nova.image.s3.rst +source/api/nova.objectstore.s3server.rst +source/api/nova.ipv6.account_identifier.rst +source/api/nova.ipv6.api.rst +source/api/nova.ipv6.rfc2462.rst +source/api/nova.notifier.no_op_notifier.rst +source/api/nova.notifier.log_notifier.rst +source/api/nova.notifier.rabbit_notifier.rst +source/api/nova.notifier.api.rst +source/api/nova.vcsversion.rst +source/api/nova.compute.instance_types.rst +source/api/nova.compute.power_state.rst +source/api/nova.compute.api.rst +source/api/nova.compute.manager.rst +source/api/nova.compute.monitor.rst +source/api/nova.wsgi.rst +source/api/nova.console.vmrc_manager.rst +source/api/nova.console.fake.rst +source/api/nova.console.vmrc.rst +source/api/nova.console.api.rst +source/api/nova.console.manager.rst +source/api/nova.console.xvp.rst +source/api/nova.version.rst +source/api/nova.utils.rst +source/api/nova.auth.dbdriver.rst +source/api/nova.auth.fakeldap.rst +source/api/nova.auth.ldapdriver.rst +source/api/nova.auth.signer.rst +source/api/nova.auth.manager.rst +source/api/nova.manager.rst +source/api/nova.scheduler.driver.rst +source/api/nova.scheduler.host_filter.rst +source/api/nova.scheduler.zone.rst +source/api/nova.scheduler.simple.rst +source/api/nova.scheduler.zone_aware_scheduler.rst +source/api/nova.scheduler.zone_manager.rst +source/api/nova.scheduler.api.rst +source/api/nova.scheduler.least_cost.rst +source/api/nova.scheduler.manager.rst +source/api/nova.scheduler.chance.rst +source/api/nova.vnc.auth.rst +source/api/nova.vnc.proxy.rst +source/api/nova.db.base.rst +source/api/nova.db.migration.rst +source/api/nova.db.sqlalchemy.session.rst +source/api/nova.db.sqlalchemy.migration.rst +source/api/nova.db.sqlalchemy.migrate_repo.manage.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.018_rename_server_management_url.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.017_make_instance_type_id_an_integer.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.010_add_os_type_to_instances.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.013_add_flavors_to_migrations.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.009_add_instance_migrations.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.002_bexar.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.020_add_snapshot_id_to_volumes.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.016_make_quotas_key_and_value.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.003_add_label_to_networks.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.021_rename_image_ids.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.006_add_provider_data_to_volumes.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.008_add_instance_types.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.019_add_volume_snapshot_support.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.001_austin.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.011_live_migration.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.005_add_instance_metadata.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.004_add_zone_tables.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.012_add_ipv6_flatmanager.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.015_add_auto_assign_to_floating_ips.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.007_add_ipv6_to_fixed_ips.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.014_add_instance_type_id_to_instances.rst +source/api/nova.db.sqlalchemy.api.rst +source/api/nova.db.sqlalchemy.models.rst +source/api/nova.db.api.rst +source/api/nova.twistd.rst +source/api/nova.test.rst +source/api/nova.fakerabbit.rst +source/api/nova.service.rst +source/api/nova.flags.rst +source/api/nova.api.ec2.ec2utils.rst +source/api/nova.api.ec2.metadatarequesthandler.rst +source/api/nova.api.ec2.cloud.rst +source/api/nova.api.ec2.admin.rst +source/api/nova.api.ec2.apirequest.rst +source/api/nova.api.openstack.images.rst +source/api/nova.api.openstack.faults.rst +source/api/nova.api.openstack.shared_ip_groups.rst +source/api/nova.api.openstack.common.rst +source/api/nova.api.openstack.ips.rst +source/api/nova.api.openstack.extensions.rst +source/api/nova.api.openstack.servers.rst +source/api/nova.api.openstack.consoles.rst +source/api/nova.api.openstack.users.rst +source/api/nova.api.openstack.auth.rst +source/api/nova.api.openstack.versions.rst +source/api/nova.api.openstack.zones.rst +source/api/nova.api.openstack.limits.rst +source/api/nova.api.openstack.flavors.rst +source/api/nova.api.openstack.image_metadata.rst +source/api/nova.api.openstack.contrib.volumes.rst +source/api/nova.api.openstack.wsgi.rst +source/api/nova.api.openstack.accounts.rst +source/api/nova.api.openstack.views.images.rst +source/api/nova.api.openstack.views.addresses.rst +source/api/nova.api.openstack.views.servers.rst +source/api/nova.api.openstack.views.versions.rst +source/api/nova.api.openstack.views.limits.rst +source/api/nova.api.openstack.views.flavors.rst +source/api/nova.api.openstack.server_metadata.rst +source/api/nova.api.openstack.backup_schedules.rst +source/api/nova.api.direct.rst +source/api/nova.log.rst +source/api/nova.rpc.rst +source/api/nova.fakememcache.rst +source/api/nova.crypto.rst +source/api/nova.cloudpipe.pipelib.rst +source/api/nova.context.rst +source/api/nova.quota.rst +source/api/nova.tests.test_compute.rst +source/api/nova.tests.test_quota.rst +source/api/nova.tests.test_flags.rst +source/api/nova.tests.test_objectstore.rst +source/api/nova.tests.test_crypto.rst +source/api/nova.tests.runtime_flags.rst +source/api/nova.tests.test_exception.rst +source/api/nova.tests.vmwareapi.db_fakes.rst +source/api/nova.tests.vmwareapi.stubs.rst +source/api/nova.tests.test_host_filter.rst +source/api/nova.tests.test_network.rst +source/api/nova.tests.network.base.rst +source/api/nova.tests.declare_flags.rst +source/api/nova.tests.test_localization.rst +source/api/nova.tests.test_access.rst +source/api/nova.tests.test_libvirt.rst +source/api/nova.tests.image.test_glance.rst +source/api/nova.tests.test_direct.rst +source/api/nova.tests.fake_utils.rst +source/api/nova.tests.integrated.test_login.rst +source/api/nova.tests.integrated.test_extensions.rst +source/api/nova.tests.integrated.integrated_helpers.rst +source/api/nova.tests.integrated.test_servers.rst +source/api/nova.tests.integrated.test_xml.rst +source/api/nova.tests.integrated.api.client.rst +source/api/nova.tests.integrated.test_volumes.rst +source/api/nova.tests.test_rpc.rst +source/api/nova.tests.test_volume.rst +source/api/nova.tests.test_notifier.rst +source/api/nova.tests.fake_flags.rst +source/api/nova.tests.test_log.rst +source/api/nova.tests.test_service.rst +source/api/nova.tests.test_twistd.rst +source/api/nova.tests.test_misc.rst +source/api/nova.tests.test_cloud.rst +source/api/nova.tests.glance.stubs.rst +source/api/nova.tests.test_auth.rst +source/api/nova.tests.test_utils.rst +source/api/nova.tests.test_vmwareapi.rst +source/api/nova.tests.test_vlan_network.rst +source/api/nova.tests.test_zones.rst +source/api/nova.tests.test_middleware.rst +source/api/nova.tests.test_ipv6.rst +source/api/nova.tests.xenapi.stubs.rst +source/api/nova.tests.test_api.rst +source/api/nova.tests.scheduler.test_host_filter.rst +source/api/nova.tests.scheduler.test_zone_aware_scheduler.rst +source/api/nova.tests.scheduler.test_least_cost_scheduler.rst +source/api/nova.tests.scheduler.test_scheduler.rst +source/api/nova.tests.db.fakes.rst +source/api/nova.tests.test_instance_types.rst +source/api/nova.tests.test_console.rst +source/api/nova.tests.api.test_wsgi.rst +source/api/nova.tests.api.openstack.test_users.rst +source/api/nova.tests.api.openstack.fakes.rst +source/api/nova.tests.api.openstack.common.rst +source/api/nova.tests.api.openstack.test_wsgi.rst +source/api/nova.tests.api.openstack.test_accounts.rst +source/api/nova.tests.api.openstack.test_flavors.rst +source/api/nova.tests.api.openstack.test_extensions.rst +source/api/nova.tests.api.openstack.test_adminapi.rst +source/api/nova.tests.api.openstack.test_versions.rst +source/api/nova.tests.api.openstack.test_image_metadata.rst +source/api/nova.tests.api.openstack.test_auth.rst +source/api/nova.tests.api.openstack.test_servers.rst +source/api/nova.tests.api.openstack.test_zones.rst +source/api/nova.tests.api.openstack.test_images.rst +source/api/nova.tests.api.openstack.test_api.rst +source/api/nova.tests.api.openstack.test_faults.rst +source/api/nova.tests.api.openstack.test_limits.rst +source/api/nova.tests.api.openstack.test_server_metadata.rst +source/api/nova.tests.api.openstack.test_shared_ip_groups.rst +source/api/nova.tests.api.openstack.test_common.rst +source/api/nova.tests.api.openstack.extensions.foxinsocks.rst +source/api/nova.tests.test_xenapi.rst +source/api/nova.tests.hyperv_unittest.rst +source/api/nova.tests.test_test.rst +source/api/nova.tests.test_flat_network.rst +source/api/nova.network.linux_net.rst +source/api/nova.network.api.rst +source/api/nova.network.manager.rst +source/api/nova.network.vmwareapi_net.rst +source/api/nova.network.xenapi_net.rst +source/api/nova.volume.driver.rst +source/api/nova.volume.api.rst +source/api/nova.volume.san.rst +source/api/nova.volume.manager.rst +source/api/nova.virt.images.rst +source/api/nova.virt.driver.rst +source/api/nova.virt.vmwareapi.io_util.rst +source/api/nova.virt.vmwareapi.error_util.rst +source/api/nova.virt.vmwareapi.vmops.rst +source/api/nova.virt.vmwareapi.fake.rst +source/api/nova.virt.vmwareapi.vim.rst +source/api/nova.virt.vmwareapi.read_write_util.rst +source/api/nova.virt.vmwareapi.vmware_images.rst +source/api/nova.virt.vmwareapi.network_utils.rst +source/api/nova.virt.vmwareapi.vim_util.rst +source/api/nova.virt.vmwareapi.vm_util.rst +source/api/nova.virt.xenapi_conn.rst +source/api/nova.virt.fake.rst +source/api/nova.virt.vmwareapi_conn.rst +source/api/nova.virt.connection.rst +source/api/nova.virt.disk.rst +source/api/nova.virt.libvirt.connection.rst +source/api/nova.virt.libvirt.firewall.rst +source/api/nova.virt.libvirt.netutils.rst +source/api/nova.virt.hyperv.rst +source/api/nova.virt.xenapi.vmops.rst +source/api/nova.virt.xenapi.fake.rst +source/api/nova.virt.xenapi.volume_utils.rst +source/api/nova.virt.xenapi.network_utils.rst +source/api/nova.virt.xenapi.vm_utils.rst +source/api/nova.virt.xenapi.volumeops.rst +source/api/nova.exception.rst +source/api/nova.image.fake.rst +source/api/nova.image.local.rst +source/api/nova.image.glance.rst +source/api/nova.image.service.rst +source/api/nova.image.s3.rst +source/api/nova.objectstore.s3server.rst +source/api/nova.ipv6.account_identifier.rst +source/api/nova.ipv6.api.rst +source/api/nova.ipv6.rfc2462.rst +source/api/nova.notifier.no_op_notifier.rst +source/api/nova.notifier.log_notifier.rst +source/api/nova.notifier.rabbit_notifier.rst +source/api/nova.notifier.api.rst +source/api/nova.vcsversion.rst +source/api/nova.compute.instance_types.rst +source/api/nova.compute.power_state.rst +source/api/nova.compute.api.rst +source/api/nova.compute.manager.rst +source/api/nova.compute.monitor.rst +source/api/nova.wsgi.rst +source/api/nova.console.vmrc_manager.rst +source/api/nova.console.fake.rst +source/api/nova.console.vmrc.rst +source/api/nova.console.api.rst +source/api/nova.console.manager.rst +source/api/nova.console.xvp.rst +source/api/nova.version.rst +source/api/nova.utils.rst +source/api/nova.auth.dbdriver.rst +source/api/nova.auth.fakeldap.rst +source/api/nova.auth.ldapdriver.rst +source/api/nova.auth.signer.rst +source/api/nova.auth.manager.rst +source/api/nova.manager.rst +source/api/nova.scheduler.driver.rst +source/api/nova.scheduler.host_filter.rst +source/api/nova.scheduler.zone.rst +source/api/nova.scheduler.simple.rst +source/api/nova.scheduler.zone_aware_scheduler.rst +source/api/nova.scheduler.zone_manager.rst +source/api/nova.scheduler.api.rst +source/api/nova.scheduler.least_cost.rst +source/api/nova.scheduler.manager.rst +source/api/nova.scheduler.chance.rst +source/api/nova.vnc.auth.rst +source/api/nova.vnc.proxy.rst +source/api/nova.db.base.rst +source/api/nova.db.migration.rst +source/api/nova.db.sqlalchemy.session.rst +source/api/nova.db.sqlalchemy.migration.rst +source/api/nova.db.sqlalchemy.migrate_repo.manage.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.018_rename_server_management_url.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.017_make_instance_type_id_an_integer.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.010_add_os_type_to_instances.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.013_add_flavors_to_migrations.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.009_add_instance_migrations.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.002_bexar.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.020_add_snapshot_id_to_volumes.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.016_make_quotas_key_and_value.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.003_add_label_to_networks.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.021_rename_image_ids.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.006_add_provider_data_to_volumes.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.008_add_instance_types.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.019_add_volume_snapshot_support.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.001_austin.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.011_live_migration.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.005_add_instance_metadata.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.004_add_zone_tables.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.012_add_ipv6_flatmanager.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.015_add_auto_assign_to_floating_ips.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.007_add_ipv6_to_fixed_ips.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.014_add_instance_type_id_to_instances.rst +source/api/nova.db.sqlalchemy.api.rst +source/api/nova.db.sqlalchemy.models.rst +source/api/nova.db.api.rst +source/api/nova.twistd.rst +source/api/nova.test.rst +source/api/nova.fakerabbit.rst +source/api/nova.service.rst +source/api/nova.flags.rst +source/api/nova.api.ec2.ec2utils.rst +source/api/nova.api.ec2.metadatarequesthandler.rst +source/api/nova.api.ec2.cloud.rst +source/api/nova.api.ec2.admin.rst +source/api/nova.api.ec2.apirequest.rst +source/api/nova.api.openstack.images.rst +source/api/nova.api.openstack.faults.rst +source/api/nova.api.openstack.shared_ip_groups.rst +source/api/nova.api.openstack.common.rst +source/api/nova.api.openstack.ips.rst +source/api/nova.api.openstack.extensions.rst +source/api/nova.api.openstack.servers.rst +source/api/nova.api.openstack.consoles.rst +source/api/nova.api.openstack.users.rst +source/api/nova.api.openstack.auth.rst +source/api/nova.api.openstack.versions.rst +source/api/nova.api.openstack.zones.rst +source/api/nova.api.openstack.limits.rst +source/api/nova.api.openstack.flavors.rst +source/api/nova.api.openstack.image_metadata.rst +source/api/nova.api.openstack.contrib.volumes.rst +source/api/nova.api.openstack.wsgi.rst +source/api/nova.api.openstack.accounts.rst +source/api/nova.api.openstack.views.images.rst +source/api/nova.api.openstack.views.addresses.rst +source/api/nova.api.openstack.views.servers.rst +source/api/nova.api.openstack.views.versions.rst +source/api/nova.api.openstack.views.limits.rst +source/api/nova.api.openstack.views.flavors.rst +source/api/nova.api.openstack.server_metadata.rst +source/api/nova.api.openstack.backup_schedules.rst +source/api/nova.api.direct.rst +source/api/nova.log.rst +source/api/nova.rpc.rst +source/api/nova.fakememcache.rst +source/api/nova.crypto.rst +source/api/nova.cloudpipe.pipelib.rst +source/api/nova.context.rst +source/api/nova.quota.rst +source/api/nova.tests.test_compute.rst +source/api/nova.tests.test_quota.rst +source/api/nova.tests.test_flags.rst +source/api/nova.tests.test_objectstore.rst +source/api/nova.tests.test_crypto.rst +source/api/nova.tests.runtime_flags.rst +source/api/nova.tests.test_exception.rst +source/api/nova.tests.vmwareapi.db_fakes.rst +source/api/nova.tests.vmwareapi.stubs.rst +source/api/nova.tests.test_host_filter.rst +source/api/nova.tests.test_network.rst +source/api/nova.tests.network.base.rst +source/api/nova.tests.declare_flags.rst +source/api/nova.tests.test_localization.rst +source/api/nova.tests.test_access.rst +source/api/nova.tests.test_libvirt.rst +source/api/nova.tests.image.test_glance.rst +source/api/nova.tests.test_direct.rst +source/api/nova.tests.fake_utils.rst +source/api/nova.tests.integrated.test_login.rst +source/api/nova.tests.integrated.test_extensions.rst +source/api/nova.tests.integrated.integrated_helpers.rst +source/api/nova.tests.integrated.test_servers.rst +source/api/nova.tests.integrated.test_xml.rst +source/api/nova.tests.integrated.api.client.rst +source/api/nova.tests.integrated.test_volumes.rst +source/api/nova.tests.test_rpc.rst +source/api/nova.tests.test_volume.rst +source/api/nova.tests.test_notifier.rst +source/api/nova.tests.fake_flags.rst +source/api/nova.tests.test_log.rst +source/api/nova.tests.test_service.rst +source/api/nova.tests.test_twistd.rst +source/api/nova.tests.test_misc.rst +source/api/nova.tests.test_cloud.rst +source/api/nova.tests.glance.stubs.rst +source/api/nova.tests.test_auth.rst +source/api/nova.tests.test_utils.rst +source/api/nova.tests.test_vmwareapi.rst +source/api/nova.tests.test_vlan_network.rst +source/api/nova.tests.test_zones.rst +source/api/nova.tests.test_middleware.rst +source/api/nova.tests.test_ipv6.rst +source/api/nova.tests.xenapi.stubs.rst +source/api/nova.tests.test_api.rst +source/api/nova.tests.scheduler.test_host_filter.rst +source/api/nova.tests.scheduler.test_zone_aware_scheduler.rst +source/api/nova.tests.scheduler.test_least_cost_scheduler.rst +source/api/nova.tests.scheduler.test_scheduler.rst +source/api/nova.tests.db.fakes.rst +source/api/nova.tests.test_instance_types.rst +source/api/nova.tests.test_console.rst +source/api/nova.tests.api.test_wsgi.rst +source/api/nova.tests.api.openstack.test_users.rst +source/api/nova.tests.api.openstack.fakes.rst +source/api/nova.tests.api.openstack.common.rst +source/api/nova.tests.api.openstack.test_wsgi.rst +source/api/nova.tests.api.openstack.test_accounts.rst +source/api/nova.tests.api.openstack.test_flavors.rst +source/api/nova.tests.api.openstack.test_extensions.rst +source/api/nova.tests.api.openstack.test_adminapi.rst +source/api/nova.tests.api.openstack.test_versions.rst +source/api/nova.tests.api.openstack.test_image_metadata.rst +source/api/nova.tests.api.openstack.test_auth.rst +source/api/nova.tests.api.openstack.test_servers.rst +source/api/nova.tests.api.openstack.test_zones.rst +source/api/nova.tests.api.openstack.test_images.rst +source/api/nova.tests.api.openstack.test_api.rst +source/api/nova.tests.api.openstack.test_faults.rst +source/api/nova.tests.api.openstack.test_limits.rst +source/api/nova.tests.api.openstack.test_server_metadata.rst +source/api/nova.tests.api.openstack.test_shared_ip_groups.rst +source/api/nova.tests.api.openstack.test_common.rst +source/api/nova.tests.api.openstack.extensions.foxinsocks.rst +source/api/nova.tests.test_xenapi.rst +source/api/nova.tests.hyperv_unittest.rst +source/api/nova.tests.test_test.rst +source/api/nova.tests.test_flat_network.rst +source/api/nova.network.linux_net.rst +source/api/nova.network.api.rst +source/api/nova.network.manager.rst +source/api/nova.network.vmwareapi_net.rst +source/api/nova.network.xenapi_net.rst +source/api/nova.volume.driver.rst +source/api/nova.volume.api.rst +source/api/nova.volume.san.rst +source/api/nova.volume.manager.rst +source/api/nova.virt.images.rst +source/api/nova.virt.driver.rst +source/api/nova.virt.vmwareapi.io_util.rst +source/api/nova.virt.vmwareapi.error_util.rst +source/api/nova.virt.vmwareapi.vmops.rst +source/api/nova.virt.vmwareapi.fake.rst +source/api/nova.virt.vmwareapi.vim.rst +source/api/nova.virt.vmwareapi.read_write_util.rst +source/api/nova.virt.vmwareapi.vmware_images.rst +source/api/nova.virt.vmwareapi.network_utils.rst +source/api/nova.virt.vmwareapi.vim_util.rst +source/api/nova.virt.vmwareapi.vm_util.rst +source/api/nova.virt.xenapi_conn.rst +source/api/nova.virt.fake.rst +source/api/nova.virt.vmwareapi_conn.rst +source/api/nova.virt.connection.rst +source/api/nova.virt.disk.rst +source/api/nova.virt.libvirt.connection.rst +source/api/nova.virt.libvirt.firewall.rst +source/api/nova.virt.libvirt.netutils.rst +source/api/nova.virt.hyperv.rst +source/api/nova.virt.xenapi.vmops.rst +source/api/nova.virt.xenapi.fake.rst +source/api/nova.virt.xenapi.volume_utils.rst +source/api/nova.virt.xenapi.network_utils.rst +source/api/nova.virt.xenapi.vm_utils.rst +source/api/nova.virt.xenapi.volumeops.rst +source/api/nova.exception.rst +source/api/nova.image.fake.rst +source/api/nova.image.local.rst +source/api/nova.image.glance.rst +source/api/nova.image.service.rst +source/api/nova.image.s3.rst +source/api/nova.objectstore.s3server.rst +source/api/nova.ipv6.account_identifier.rst +source/api/nova.ipv6.api.rst +source/api/nova.ipv6.rfc2462.rst +source/api/nova.notifier.no_op_notifier.rst +source/api/nova.notifier.log_notifier.rst +source/api/nova.notifier.rabbit_notifier.rst +source/api/nova.notifier.api.rst +source/api/nova.vcsversion.rst +source/api/nova.compute.instance_types.rst +source/api/nova.compute.power_state.rst +source/api/nova.compute.api.rst +source/api/nova.compute.manager.rst +source/api/nova.compute.monitor.rst +source/api/nova.wsgi.rst +source/api/nova.console.vmrc_manager.rst +source/api/nova.console.fake.rst +source/api/nova.console.vmrc.rst +source/api/nova.console.api.rst +source/api/nova.console.manager.rst +source/api/nova.console.xvp.rst +source/api/nova.version.rst +source/api/nova.utils.rst +source/api/nova.auth.dbdriver.rst +source/api/nova.auth.fakeldap.rst +source/api/nova.auth.ldapdriver.rst +source/api/nova.auth.signer.rst +source/api/nova.auth.manager.rst +source/api/nova.manager.rst +source/api/nova.scheduler.driver.rst +source/api/nova.scheduler.host_filter.rst +source/api/nova.scheduler.zone.rst +source/api/nova.scheduler.simple.rst +source/api/nova.scheduler.zone_aware_scheduler.rst +source/api/nova.scheduler.zone_manager.rst +source/api/nova.scheduler.api.rst +source/api/nova.scheduler.least_cost.rst +source/api/nova.scheduler.manager.rst +source/api/nova.scheduler.chance.rst +source/api/nova.vnc.auth.rst +source/api/nova.vnc.proxy.rst +source/api/nova.db.base.rst +source/api/nova.db.migration.rst +source/api/nova.db.sqlalchemy.session.rst +source/api/nova.db.sqlalchemy.migration.rst +source/api/nova.db.sqlalchemy.migrate_repo.manage.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.018_rename_server_management_url.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.017_make_instance_type_id_an_integer.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.010_add_os_type_to_instances.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.013_add_flavors_to_migrations.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.009_add_instance_migrations.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.002_bexar.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.020_add_snapshot_id_to_volumes.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.016_make_quotas_key_and_value.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.003_add_label_to_networks.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.021_rename_image_ids.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.006_add_provider_data_to_volumes.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.008_add_instance_types.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.019_add_volume_snapshot_support.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.001_austin.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.011_live_migration.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.005_add_instance_metadata.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.004_add_zone_tables.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.012_add_ipv6_flatmanager.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.015_add_auto_assign_to_floating_ips.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.007_add_ipv6_to_fixed_ips.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.014_add_instance_type_id_to_instances.rst +source/api/nova.db.sqlalchemy.api.rst +source/api/nova.db.sqlalchemy.models.rst +source/api/nova.db.api.rst +source/api/nova.twistd.rst +source/api/nova.test.rst +source/api/nova.fakerabbit.rst +source/api/nova.service.rst +source/api/nova.flags.rst +source/api/nova.api.ec2.ec2utils.rst +source/api/nova.api.ec2.metadatarequesthandler.rst +source/api/nova.api.ec2.cloud.rst +source/api/nova.api.ec2.admin.rst +source/api/nova.api.ec2.apirequest.rst +source/api/nova.api.openstack.images.rst +source/api/nova.api.openstack.faults.rst +source/api/nova.api.openstack.shared_ip_groups.rst +source/api/nova.api.openstack.common.rst +source/api/nova.api.openstack.ips.rst +source/api/nova.api.openstack.extensions.rst +source/api/nova.api.openstack.servers.rst +source/api/nova.api.openstack.consoles.rst +source/api/nova.api.openstack.users.rst +source/api/nova.api.openstack.auth.rst +source/api/nova.api.openstack.versions.rst +source/api/nova.api.openstack.zones.rst +source/api/nova.api.openstack.limits.rst +source/api/nova.api.openstack.flavors.rst +source/api/nova.api.openstack.image_metadata.rst +source/api/nova.api.openstack.contrib.volumes.rst +source/api/nova.api.openstack.wsgi.rst +source/api/nova.api.openstack.accounts.rst +source/api/nova.api.openstack.views.images.rst +source/api/nova.api.openstack.views.addresses.rst +source/api/nova.api.openstack.views.servers.rst +source/api/nova.api.openstack.views.versions.rst +source/api/nova.api.openstack.views.limits.rst +source/api/nova.api.openstack.views.flavors.rst +source/api/nova.api.openstack.server_metadata.rst +source/api/nova.api.openstack.backup_schedules.rst +source/api/nova.api.direct.rst +source/api/nova.log.rst +source/api/nova.rpc.rst +source/api/nova.fakememcache.rst +source/api/nova.crypto.rst +source/api/nova.cloudpipe.pipelib.rst +source/api/nova.context.rst +source/api/nova.quota.rst +source/api/nova.tests.test_compute.rst +source/api/nova.tests.test_quota.rst +source/api/nova.tests.test_flags.rst +source/api/nova.tests.test_objectstore.rst +source/api/nova.tests.test_crypto.rst +source/api/nova.tests.runtime_flags.rst +source/api/nova.tests.test_exception.rst +source/api/nova.tests.vmwareapi.db_fakes.rst +source/api/nova.tests.vmwareapi.stubs.rst +source/api/nova.tests.test_host_filter.rst +source/api/nova.tests.test_network.rst +source/api/nova.tests.network.base.rst +source/api/nova.tests.declare_flags.rst +source/api/nova.tests.test_localization.rst +source/api/nova.tests.test_access.rst +source/api/nova.tests.test_libvirt.rst +source/api/nova.tests.image.test_glance.rst +source/api/nova.tests.test_direct.rst +source/api/nova.tests.fake_utils.rst +source/api/nova.tests.integrated.test_login.rst +source/api/nova.tests.integrated.test_extensions.rst +source/api/nova.tests.integrated.integrated_helpers.rst +source/api/nova.tests.integrated.test_servers.rst +source/api/nova.tests.integrated.test_xml.rst +source/api/nova.tests.integrated.api.client.rst +source/api/nova.tests.integrated.test_volumes.rst +source/api/nova.tests.test_rpc.rst +source/api/nova.tests.test_volume.rst +source/api/nova.tests.test_notifier.rst +source/api/nova.tests.fake_flags.rst +source/api/nova.tests.test_log.rst +source/api/nova.tests.test_service.rst +source/api/nova.tests.test_twistd.rst +source/api/nova.tests.test_misc.rst +source/api/nova.tests.test_cloud.rst +source/api/nova.tests.glance.stubs.rst +source/api/nova.tests.test_auth.rst +source/api/nova.tests.test_utils.rst +source/api/nova.tests.test_vmwareapi.rst +source/api/nova.tests.test_vlan_network.rst +source/api/nova.tests.test_zones.rst +source/api/nova.tests.test_middleware.rst +source/api/nova.tests.test_ipv6.rst +source/api/nova.tests.xenapi.stubs.rst +source/api/nova.tests.test_api.rst +source/api/nova.tests.scheduler.test_host_filter.rst +source/api/nova.tests.scheduler.test_zone_aware_scheduler.rst +source/api/nova.tests.scheduler.test_least_cost_scheduler.rst +source/api/nova.tests.scheduler.test_scheduler.rst +source/api/nova.tests.db.fakes.rst +source/api/nova.tests.test_instance_types.rst +source/api/nova.tests.test_console.rst +source/api/nova.tests.api.test_wsgi.rst +source/api/nova.tests.api.openstack.test_users.rst +source/api/nova.tests.api.openstack.fakes.rst +source/api/nova.tests.api.openstack.common.rst +source/api/nova.tests.api.openstack.test_wsgi.rst +source/api/nova.tests.api.openstack.test_accounts.rst +source/api/nova.tests.api.openstack.test_flavors.rst +source/api/nova.tests.api.openstack.test_extensions.rst +source/api/nova.tests.api.openstack.test_adminapi.rst +source/api/nova.tests.api.openstack.test_versions.rst +source/api/nova.tests.api.openstack.test_image_metadata.rst +source/api/nova.tests.api.openstack.test_auth.rst +source/api/nova.tests.api.openstack.test_servers.rst +source/api/nova.tests.api.openstack.test_zones.rst +source/api/nova.tests.api.openstack.test_images.rst +source/api/nova.tests.api.openstack.test_api.rst +source/api/nova.tests.api.openstack.test_faults.rst +source/api/nova.tests.api.openstack.test_limits.rst +source/api/nova.tests.api.openstack.test_server_metadata.rst +source/api/nova.tests.api.openstack.test_shared_ip_groups.rst +source/api/nova.tests.api.openstack.test_common.rst +source/api/nova.tests.api.openstack.extensions.foxinsocks.rst +source/api/nova.tests.test_xenapi.rst +source/api/nova.tests.hyperv_unittest.rst +source/api/nova.tests.test_test.rst +source/api/nova.tests.test_flat_network.rst +source/api/nova.network.linux_net.rst +source/api/nova.network.api.rst +source/api/nova.network.manager.rst +source/api/nova.network.vmwareapi_net.rst +source/api/nova.network.xenapi_net.rst +source/api/nova.volume.driver.rst +source/api/nova.volume.api.rst +source/api/nova.volume.san.rst +source/api/nova.volume.manager.rst +source/api/nova.virt.images.rst +source/api/nova.virt.driver.rst +source/api/nova.virt.vmwareapi.io_util.rst +source/api/nova.virt.vmwareapi.error_util.rst +source/api/nova.virt.vmwareapi.vmops.rst +source/api/nova.virt.vmwareapi.fake.rst +source/api/nova.virt.vmwareapi.vim.rst +source/api/nova.virt.vmwareapi.read_write_util.rst +source/api/nova.virt.vmwareapi.vmware_images.rst +source/api/nova.virt.vmwareapi.network_utils.rst +source/api/nova.virt.vmwareapi.vim_util.rst +source/api/nova.virt.vmwareapi.vm_util.rst +source/api/nova.virt.xenapi_conn.rst +source/api/nova.virt.fake.rst +source/api/nova.virt.vmwareapi_conn.rst +source/api/nova.virt.connection.rst +source/api/nova.virt.disk.rst +source/api/nova.virt.libvirt.connection.rst +source/api/nova.virt.libvirt.firewall.rst +source/api/nova.virt.libvirt.netutils.rst +source/api/nova.virt.hyperv.rst +source/api/nova.virt.xenapi.vmops.rst +source/api/nova.virt.xenapi.fake.rst +source/api/nova.virt.xenapi.volume_utils.rst +source/api/nova.virt.xenapi.network_utils.rst +source/api/nova.virt.xenapi.vm_utils.rst +source/api/nova.virt.xenapi.volumeops.rst +source/api/nova.exception.rst +source/api/nova.image.fake.rst +source/api/nova.image.local.rst +source/api/nova.image.glance.rst +source/api/nova.image.service.rst +source/api/nova.image.s3.rst +source/api/nova.objectstore.s3server.rst +source/api/nova.ipv6.account_identifier.rst +source/api/nova.ipv6.api.rst +source/api/nova.ipv6.rfc2462.rst +source/api/nova.notifier.no_op_notifier.rst +source/api/nova.notifier.log_notifier.rst +source/api/nova.notifier.rabbit_notifier.rst +source/api/nova.notifier.api.rst +source/api/nova.vcsversion.rst +source/api/nova.compute.instance_types.rst +source/api/nova.compute.power_state.rst +source/api/nova.compute.api.rst +source/api/nova.compute.manager.rst +source/api/nova.compute.monitor.rst +source/api/nova.wsgi.rst +source/api/nova.console.vmrc_manager.rst +source/api/nova.console.fake.rst +source/api/nova.console.vmrc.rst +source/api/nova.console.api.rst +source/api/nova.console.manager.rst +source/api/nova.console.xvp.rst +source/api/nova.version.rst +source/api/nova.utils.rst +source/api/nova.auth.dbdriver.rst +source/api/nova.auth.fakeldap.rst +source/api/nova.auth.ldapdriver.rst +source/api/nova.auth.signer.rst +source/api/nova.auth.manager.rst +source/api/nova.manager.rst +source/api/nova.scheduler.driver.rst +source/api/nova.scheduler.host_filter.rst +source/api/nova.scheduler.zone.rst +source/api/nova.scheduler.simple.rst +source/api/nova.scheduler.zone_aware_scheduler.rst +source/api/nova.scheduler.zone_manager.rst +source/api/nova.scheduler.api.rst +source/api/nova.scheduler.least_cost.rst +source/api/nova.scheduler.manager.rst +source/api/nova.scheduler.chance.rst +source/api/nova.vnc.auth.rst +source/api/nova.vnc.proxy.rst +source/api/nova.db.base.rst +source/api/nova.db.migration.rst +source/api/nova.db.sqlalchemy.session.rst +source/api/nova.db.sqlalchemy.migration.rst +source/api/nova.db.sqlalchemy.migrate_repo.manage.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.018_rename_server_management_url.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.017_make_instance_type_id_an_integer.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.010_add_os_type_to_instances.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.013_add_flavors_to_migrations.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.009_add_instance_migrations.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.002_bexar.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.020_add_snapshot_id_to_volumes.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.016_make_quotas_key_and_value.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.003_add_label_to_networks.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.021_rename_image_ids.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.006_add_provider_data_to_volumes.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.008_add_instance_types.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.019_add_volume_snapshot_support.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.001_austin.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.011_live_migration.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.005_add_instance_metadata.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.004_add_zone_tables.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.012_add_ipv6_flatmanager.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.015_add_auto_assign_to_floating_ips.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.007_add_ipv6_to_fixed_ips.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.014_add_instance_type_id_to_instances.rst +source/api/nova.db.sqlalchemy.api.rst +source/api/nova.db.sqlalchemy.models.rst +source/api/nova.db.api.rst +source/api/nova.twistd.rst +source/api/nova.test.rst +source/api/nova.fakerabbit.rst +source/api/nova.service.rst +source/api/nova.flags.rst +source/api/nova.api.ec2.ec2utils.rst +source/api/nova.api.ec2.metadatarequesthandler.rst +source/api/nova.api.ec2.cloud.rst +source/api/nova.api.ec2.admin.rst +source/api/nova.api.ec2.apirequest.rst +source/api/nova.api.openstack.images.rst +source/api/nova.api.openstack.faults.rst +source/api/nova.api.openstack.shared_ip_groups.rst +source/api/nova.api.openstack.common.rst +source/api/nova.api.openstack.ips.rst +source/api/nova.api.openstack.extensions.rst +source/api/nova.api.openstack.servers.rst +source/api/nova.api.openstack.consoles.rst +source/api/nova.api.openstack.users.rst +source/api/nova.api.openstack.auth.rst +source/api/nova.api.openstack.versions.rst +source/api/nova.api.openstack.zones.rst +source/api/nova.api.openstack.limits.rst +source/api/nova.api.openstack.flavors.rst +source/api/nova.api.openstack.image_metadata.rst +source/api/nova.api.openstack.contrib.volumes.rst +source/api/nova.api.openstack.wsgi.rst +source/api/nova.api.openstack.accounts.rst +source/api/nova.api.openstack.views.images.rst +source/api/nova.api.openstack.views.addresses.rst +source/api/nova.api.openstack.views.servers.rst +source/api/nova.api.openstack.views.versions.rst +source/api/nova.api.openstack.views.limits.rst +source/api/nova.api.openstack.views.flavors.rst +source/api/nova.api.openstack.server_metadata.rst +source/api/nova.api.openstack.backup_schedules.rst +source/api/nova.api.direct.rst +source/api/nova.log.rst +source/api/nova.rpc.rst +source/api/nova.fakememcache.rst +source/api/nova.crypto.rst +source/api/nova.cloudpipe.pipelib.rst +source/api/nova.context.rst +source/api/nova.quota.rst +source/api/nova.tests.test_compute.rst +source/api/nova.tests.test_quota.rst +source/api/nova.tests.test_flags.rst +source/api/nova.tests.test_objectstore.rst +source/api/nova.tests.test_crypto.rst +source/api/nova.tests.runtime_flags.rst +source/api/nova.tests.test_exception.rst +source/api/nova.tests.vmwareapi.db_fakes.rst +source/api/nova.tests.vmwareapi.stubs.rst +source/api/nova.tests.test_host_filter.rst +source/api/nova.tests.test_network.rst +source/api/nova.tests.network.base.rst +source/api/nova.tests.declare_flags.rst +source/api/nova.tests.test_localization.rst +source/api/nova.tests.test_access.rst +source/api/nova.tests.test_libvirt.rst +source/api/nova.tests.image.test_glance.rst +source/api/nova.tests.test_direct.rst +source/api/nova.tests.fake_utils.rst +source/api/nova.tests.integrated.test_login.rst +source/api/nova.tests.integrated.test_extensions.rst +source/api/nova.tests.integrated.integrated_helpers.rst +source/api/nova.tests.integrated.test_servers.rst +source/api/nova.tests.integrated.test_xml.rst +source/api/nova.tests.integrated.api.client.rst +source/api/nova.tests.integrated.test_volumes.rst +source/api/nova.tests.test_rpc.rst +source/api/nova.tests.test_volume.rst +source/api/nova.tests.test_notifier.rst +source/api/nova.tests.fake_flags.rst +source/api/nova.tests.test_log.rst +source/api/nova.tests.test_service.rst +source/api/nova.tests.test_twistd.rst +source/api/nova.tests.test_misc.rst +source/api/nova.tests.test_cloud.rst +source/api/nova.tests.glance.stubs.rst +source/api/nova.tests.test_auth.rst +source/api/nova.tests.test_utils.rst +source/api/nova.tests.test_vmwareapi.rst +source/api/nova.tests.test_vlan_network.rst +source/api/nova.tests.test_zones.rst +source/api/nova.tests.test_middleware.rst +source/api/nova.tests.test_ipv6.rst +source/api/nova.tests.xenapi.stubs.rst +source/api/nova.tests.test_api.rst +source/api/nova.tests.scheduler.test_host_filter.rst +source/api/nova.tests.scheduler.test_zone_aware_scheduler.rst +source/api/nova.tests.scheduler.test_least_cost_scheduler.rst +source/api/nova.tests.scheduler.test_scheduler.rst +source/api/nova.tests.db.fakes.rst +source/api/nova.tests.test_instance_types.rst +source/api/nova.tests.test_console.rst +source/api/nova.tests.api.test_wsgi.rst +source/api/nova.tests.api.openstack.test_users.rst +source/api/nova.tests.api.openstack.fakes.rst +source/api/nova.tests.api.openstack.common.rst +source/api/nova.tests.api.openstack.test_wsgi.rst +source/api/nova.tests.api.openstack.test_accounts.rst +source/api/nova.tests.api.openstack.test_flavors.rst +source/api/nova.tests.api.openstack.test_extensions.rst +source/api/nova.tests.api.openstack.test_adminapi.rst +source/api/nova.tests.api.openstack.test_versions.rst +source/api/nova.tests.api.openstack.test_image_metadata.rst +source/api/nova.tests.api.openstack.test_auth.rst +source/api/nova.tests.api.openstack.test_servers.rst +source/api/nova.tests.api.openstack.test_zones.rst +source/api/nova.tests.api.openstack.test_images.rst +source/api/nova.tests.api.openstack.test_api.rst +source/api/nova.tests.api.openstack.test_faults.rst +source/api/nova.tests.api.openstack.test_limits.rst +source/api/nova.tests.api.openstack.test_server_metadata.rst +source/api/nova.tests.api.openstack.test_shared_ip_groups.rst +source/api/nova.tests.api.openstack.test_common.rst +source/api/nova.tests.api.openstack.extensions.foxinsocks.rst +source/api/nova.tests.test_xenapi.rst +source/api/nova.tests.hyperv_unittest.rst +source/api/nova.tests.test_test.rst +source/api/nova.tests.test_flat_network.rst +source/api/nova.network.linux_net.rst +source/api/nova.network.api.rst +source/api/nova.network.manager.rst +source/api/nova.network.vmwareapi_net.rst +source/api/nova.network.xenapi_net.rst +source/api/nova.volume.driver.rst +source/api/nova.volume.api.rst +source/api/nova.volume.san.rst +source/api/nova.volume.manager.rst +source/api/nova.virt.images.rst +source/api/nova.virt.driver.rst +source/api/nova.virt.vmwareapi.io_util.rst +source/api/nova.virt.vmwareapi.error_util.rst +source/api/nova.virt.vmwareapi.vmops.rst +source/api/nova.virt.vmwareapi.fake.rst +source/api/nova.virt.vmwareapi.vim.rst +source/api/nova.virt.vmwareapi.read_write_util.rst +source/api/nova.virt.vmwareapi.vmware_images.rst +source/api/nova.virt.vmwareapi.network_utils.rst +source/api/nova.virt.vmwareapi.vim_util.rst +source/api/nova.virt.vmwareapi.vm_util.rst +source/api/nova.virt.xenapi_conn.rst +source/api/nova.virt.fake.rst +source/api/nova.virt.vmwareapi_conn.rst +source/api/nova.virt.connection.rst +source/api/nova.virt.disk.rst +source/api/nova.virt.libvirt.connection.rst +source/api/nova.virt.libvirt.firewall.rst +source/api/nova.virt.libvirt.netutils.rst +source/api/nova.virt.hyperv.rst +source/api/nova.virt.xenapi.vmops.rst +source/api/nova.virt.xenapi.fake.rst +source/api/nova.virt.xenapi.volume_utils.rst +source/api/nova.virt.xenapi.network_utils.rst +source/api/nova.virt.xenapi.vm_utils.rst +source/api/nova.virt.xenapi.volumeops.rst +source/api/nova.exception.rst +source/api/nova.image.fake.rst +source/api/nova.image.local.rst +source/api/nova.image.glance.rst +source/api/nova.image.service.rst +source/api/nova.image.s3.rst +source/api/nova.objectstore.s3server.rst +source/api/nova.ipv6.account_identifier.rst +source/api/nova.ipv6.api.rst +source/api/nova.ipv6.rfc2462.rst +source/api/nova.notifier.no_op_notifier.rst +source/api/nova.notifier.log_notifier.rst +source/api/nova.notifier.rabbit_notifier.rst +source/api/nova.notifier.api.rst +source/api/nova.vcsversion.rst +source/api/nova.compute.instance_types.rst +source/api/nova.compute.power_state.rst +source/api/nova.compute.api.rst +source/api/nova.compute.manager.rst +source/api/nova.compute.monitor.rst +source/api/nova.wsgi.rst +source/api/nova.console.vmrc_manager.rst +source/api/nova.console.fake.rst +source/api/nova.console.vmrc.rst +source/api/nova.console.api.rst +source/api/nova.console.manager.rst +source/api/nova.console.xvp.rst +source/api/nova.version.rst +source/api/nova.utils.rst +source/api/nova.auth.dbdriver.rst +source/api/nova.auth.fakeldap.rst +source/api/nova.auth.ldapdriver.rst +source/api/nova.auth.signer.rst +source/api/nova.auth.manager.rst +source/api/nova.manager.rst +source/api/nova.scheduler.driver.rst +source/api/nova.scheduler.host_filter.rst +source/api/nova.scheduler.zone.rst +source/api/nova.scheduler.simple.rst +source/api/nova.scheduler.zone_aware_scheduler.rst +source/api/nova.scheduler.zone_manager.rst +source/api/nova.scheduler.api.rst +source/api/nova.scheduler.least_cost.rst +source/api/nova.scheduler.manager.rst +source/api/nova.scheduler.chance.rst +source/api/nova.vnc.auth.rst +source/api/nova.vnc.proxy.rst +source/api/nova.db.base.rst +source/api/nova.db.migration.rst +source/api/nova.db.sqlalchemy.session.rst +source/api/nova.db.sqlalchemy.migration.rst +source/api/nova.db.sqlalchemy.migrate_repo.manage.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.018_rename_server_management_url.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.017_make_instance_type_id_an_integer.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.010_add_os_type_to_instances.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.013_add_flavors_to_migrations.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.009_add_instance_migrations.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.002_bexar.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.020_add_snapshot_id_to_volumes.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.016_make_quotas_key_and_value.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.003_add_label_to_networks.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.021_rename_image_ids.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.006_add_provider_data_to_volumes.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.008_add_instance_types.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.019_add_volume_snapshot_support.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.001_austin.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.011_live_migration.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.005_add_instance_metadata.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.004_add_zone_tables.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.012_add_ipv6_flatmanager.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.015_add_auto_assign_to_floating_ips.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.007_add_ipv6_to_fixed_ips.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.014_add_instance_type_id_to_instances.rst +source/api/nova.db.sqlalchemy.api.rst +source/api/nova.db.sqlalchemy.models.rst +source/api/nova.db.api.rst +source/api/nova.twistd.rst +source/api/nova.test.rst +source/api/nova.fakerabbit.rst +source/api/nova.service.rst +source/api/nova.flags.rst +source/api/nova.api.ec2.ec2utils.rst +source/api/nova.api.ec2.metadatarequesthandler.rst +source/api/nova.api.ec2.cloud.rst +source/api/nova.api.ec2.admin.rst +source/api/nova.api.ec2.apirequest.rst +source/api/nova.api.openstack.images.rst +source/api/nova.api.openstack.faults.rst +source/api/nova.api.openstack.shared_ip_groups.rst +source/api/nova.api.openstack.common.rst +source/api/nova.api.openstack.ips.rst +source/api/nova.api.openstack.extensions.rst +source/api/nova.api.openstack.servers.rst +source/api/nova.api.openstack.consoles.rst +source/api/nova.api.openstack.users.rst +source/api/nova.api.openstack.auth.rst +source/api/nova.api.openstack.versions.rst +source/api/nova.api.openstack.zones.rst +source/api/nova.api.openstack.limits.rst +source/api/nova.api.openstack.flavors.rst +source/api/nova.api.openstack.image_metadata.rst +source/api/nova.api.openstack.contrib.volumes.rst +source/api/nova.api.openstack.wsgi.rst +source/api/nova.api.openstack.accounts.rst +source/api/nova.api.openstack.views.images.rst +source/api/nova.api.openstack.views.addresses.rst +source/api/nova.api.openstack.views.servers.rst +source/api/nova.api.openstack.views.versions.rst +source/api/nova.api.openstack.views.limits.rst +source/api/nova.api.openstack.views.flavors.rst +source/api/nova.api.openstack.server_metadata.rst +source/api/nova.api.openstack.backup_schedules.rst +source/api/nova.api.direct.rst +source/api/nova.log.rst +source/api/nova.rpc.rst +source/api/nova.fakememcache.rst +source/api/nova.crypto.rst +source/api/nova.cloudpipe.pipelib.rst +source/api/nova.context.rst +source/api/nova.quota.rst +source/api/nova.tests.test_compute.rst +source/api/nova.tests.test_quota.rst +source/api/nova.tests.test_flags.rst +source/api/nova.tests.test_objectstore.rst +source/api/nova.tests.test_crypto.rst +source/api/nova.tests.runtime_flags.rst +source/api/nova.tests.test_exception.rst +source/api/nova.tests.vmwareapi.db_fakes.rst +source/api/nova.tests.vmwareapi.stubs.rst +source/api/nova.tests.test_host_filter.rst +source/api/nova.tests.test_network.rst +source/api/nova.tests.network.base.rst +source/api/nova.tests.declare_flags.rst +source/api/nova.tests.test_localization.rst +source/api/nova.tests.test_access.rst +source/api/nova.tests.test_libvirt.rst +source/api/nova.tests.image.test_glance.rst +source/api/nova.tests.test_direct.rst +source/api/nova.tests.fake_utils.rst +source/api/nova.tests.integrated.test_login.rst +source/api/nova.tests.integrated.test_extensions.rst +source/api/nova.tests.integrated.integrated_helpers.rst +source/api/nova.tests.integrated.test_servers.rst +source/api/nova.tests.integrated.test_xml.rst +source/api/nova.tests.integrated.api.client.rst +source/api/nova.tests.integrated.test_volumes.rst +source/api/nova.tests.test_rpc.rst +source/api/nova.tests.test_volume.rst +source/api/nova.tests.test_notifier.rst +source/api/nova.tests.fake_flags.rst +source/api/nova.tests.test_log.rst +source/api/nova.tests.test_service.rst +source/api/nova.tests.test_twistd.rst +source/api/nova.tests.test_misc.rst +source/api/nova.tests.test_cloud.rst +source/api/nova.tests.glance.stubs.rst +source/api/nova.tests.test_auth.rst +source/api/nova.tests.test_utils.rst +source/api/nova.tests.test_vmwareapi.rst +source/api/nova.tests.test_vlan_network.rst +source/api/nova.tests.test_zones.rst +source/api/nova.tests.test_middleware.rst +source/api/nova.tests.test_ipv6.rst +source/api/nova.tests.xenapi.stubs.rst +source/api/nova.tests.test_api.rst +source/api/nova.tests.scheduler.test_host_filter.rst +source/api/nova.tests.scheduler.test_zone_aware_scheduler.rst +source/api/nova.tests.scheduler.test_least_cost_scheduler.rst +source/api/nova.tests.scheduler.test_scheduler.rst +source/api/nova.tests.db.fakes.rst +source/api/nova.tests.test_instance_types.rst +source/api/nova.tests.test_console.rst +source/api/nova.tests.api.test_wsgi.rst +source/api/nova.tests.api.openstack.test_users.rst +source/api/nova.tests.api.openstack.fakes.rst +source/api/nova.tests.api.openstack.common.rst +source/api/nova.tests.api.openstack.test_wsgi.rst +source/api/nova.tests.api.openstack.test_accounts.rst +source/api/nova.tests.api.openstack.test_flavors.rst +source/api/nova.tests.api.openstack.test_extensions.rst +source/api/nova.tests.api.openstack.test_adminapi.rst +source/api/nova.tests.api.openstack.test_versions.rst +source/api/nova.tests.api.openstack.test_image_metadata.rst +source/api/nova.tests.api.openstack.test_auth.rst +source/api/nova.tests.api.openstack.test_servers.rst +source/api/nova.tests.api.openstack.test_zones.rst +source/api/nova.tests.api.openstack.test_images.rst +source/api/nova.tests.api.openstack.test_api.rst +source/api/nova.tests.api.openstack.test_faults.rst +source/api/nova.tests.api.openstack.test_limits.rst +source/api/nova.tests.api.openstack.test_server_metadata.rst +source/api/nova.tests.api.openstack.test_shared_ip_groups.rst +source/api/nova.tests.api.openstack.test_common.rst +source/api/nova.tests.api.openstack.extensions.foxinsocks.rst +source/api/nova.tests.test_xenapi.rst +source/api/nova.tests.hyperv_unittest.rst +source/api/nova.tests.test_test.rst +source/api/nova.tests.test_flat_network.rst +source/api/nova.network.linux_net.rst +source/api/nova.network.api.rst +source/api/nova.network.manager.rst +source/api/nova.network.vmwareapi_net.rst +source/api/nova.network.xenapi_net.rst +source/api/nova.volume.driver.rst +source/api/nova.volume.api.rst +source/api/nova.volume.san.rst +source/api/nova.volume.manager.rst +source/api/nova.virt.images.rst +source/api/nova.virt.driver.rst +source/api/nova.virt.vmwareapi.io_util.rst +source/api/nova.virt.vmwareapi.error_util.rst +source/api/nova.virt.vmwareapi.vmops.rst +source/api/nova.virt.vmwareapi.fake.rst +source/api/nova.virt.vmwareapi.vim.rst +source/api/nova.virt.vmwareapi.read_write_util.rst +source/api/nova.virt.vmwareapi.vmware_images.rst +source/api/nova.virt.vmwareapi.network_utils.rst +source/api/nova.virt.vmwareapi.vim_util.rst +source/api/nova.virt.vmwareapi.vm_util.rst +source/api/nova.virt.xenapi_conn.rst +source/api/nova.virt.fake.rst +source/api/nova.virt.vmwareapi_conn.rst +source/api/nova.virt.connection.rst +source/api/nova.virt.disk.rst +source/api/nova.virt.libvirt.connection.rst +source/api/nova.virt.libvirt.firewall.rst +source/api/nova.virt.libvirt.netutils.rst +source/api/nova.virt.hyperv.rst +source/api/nova.virt.xenapi.vmops.rst +source/api/nova.virt.xenapi.fake.rst +source/api/nova.virt.xenapi.volume_utils.rst +source/api/nova.virt.xenapi.network_utils.rst +source/api/nova.virt.xenapi.vm_utils.rst +source/api/nova.virt.xenapi.volumeops.rst +source/api/nova.exception.rst +source/api/nova.image.fake.rst +source/api/nova.image.local.rst +source/api/nova.image.glance.rst +source/api/nova.image.service.rst +source/api/nova.image.s3.rst +source/api/nova.objectstore.s3server.rst +source/api/nova.ipv6.account_identifier.rst +source/api/nova.ipv6.api.rst +source/api/nova.ipv6.rfc2462.rst +source/api/nova.notifier.no_op_notifier.rst +source/api/nova.notifier.log_notifier.rst +source/api/nova.notifier.rabbit_notifier.rst +source/api/nova.notifier.api.rst +source/api/nova.vcsversion.rst +source/api/nova.compute.instance_types.rst +source/api/nova.compute.power_state.rst +source/api/nova.compute.api.rst +source/api/nova.compute.manager.rst +source/api/nova.compute.monitor.rst +source/api/nova.wsgi.rst +source/api/nova.console.vmrc_manager.rst +source/api/nova.console.fake.rst +source/api/nova.console.vmrc.rst +source/api/nova.console.api.rst +source/api/nova.console.manager.rst +source/api/nova.console.xvp.rst +source/api/nova.version.rst +source/api/nova.utils.rst +source/api/nova.auth.dbdriver.rst +source/api/nova.auth.fakeldap.rst +source/api/nova.auth.ldapdriver.rst +source/api/nova.auth.signer.rst +source/api/nova.auth.manager.rst +source/api/nova.manager.rst +source/api/nova.scheduler.driver.rst +source/api/nova.scheduler.host_filter.rst +source/api/nova.scheduler.zone.rst +source/api/nova.scheduler.simple.rst +source/api/nova.scheduler.zone_aware_scheduler.rst +source/api/nova.scheduler.zone_manager.rst +source/api/nova.scheduler.api.rst +source/api/nova.scheduler.least_cost.rst +source/api/nova.scheduler.manager.rst +source/api/nova.scheduler.chance.rst +source/api/nova.vnc.auth.rst +source/api/nova.vnc.proxy.rst +source/api/nova.db.base.rst +source/api/nova.db.migration.rst +source/api/nova.db.sqlalchemy.session.rst +source/api/nova.db.sqlalchemy.migration.rst +source/api/nova.db.sqlalchemy.migrate_repo.manage.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.018_rename_server_management_url.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.017_make_instance_type_id_an_integer.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.010_add_os_type_to_instances.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.013_add_flavors_to_migrations.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.009_add_instance_migrations.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.002_bexar.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.020_add_snapshot_id_to_volumes.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.016_make_quotas_key_and_value.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.003_add_label_to_networks.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.021_rename_image_ids.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.006_add_provider_data_to_volumes.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.008_add_instance_types.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.019_add_volume_snapshot_support.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.001_austin.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.011_live_migration.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.005_add_instance_metadata.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.004_add_zone_tables.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.012_add_ipv6_flatmanager.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.015_add_auto_assign_to_floating_ips.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.007_add_ipv6_to_fixed_ips.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.014_add_instance_type_id_to_instances.rst +source/api/nova.db.sqlalchemy.api.rst +source/api/nova.db.sqlalchemy.models.rst +source/api/nova.db.api.rst +source/api/nova.twistd.rst +source/api/nova.test.rst +source/api/nova.fakerabbit.rst +source/api/nova.service.rst +source/api/nova.flags.rst +source/api/nova.api.ec2.ec2utils.rst +source/api/nova.api.ec2.metadatarequesthandler.rst +source/api/nova.api.ec2.cloud.rst +source/api/nova.api.ec2.admin.rst +source/api/nova.api.ec2.apirequest.rst +source/api/nova.api.openstack.images.rst +source/api/nova.api.openstack.faults.rst +source/api/nova.api.openstack.shared_ip_groups.rst +source/api/nova.api.openstack.common.rst +source/api/nova.api.openstack.ips.rst +source/api/nova.api.openstack.extensions.rst +source/api/nova.api.openstack.servers.rst +source/api/nova.api.openstack.consoles.rst +source/api/nova.api.openstack.users.rst +source/api/nova.api.openstack.auth.rst +source/api/nova.api.openstack.versions.rst +source/api/nova.api.openstack.zones.rst +source/api/nova.api.openstack.limits.rst +source/api/nova.api.openstack.flavors.rst +source/api/nova.api.openstack.image_metadata.rst +source/api/nova.api.openstack.contrib.volumes.rst +source/api/nova.api.openstack.wsgi.rst +source/api/nova.api.openstack.accounts.rst +source/api/nova.api.openstack.views.images.rst +source/api/nova.api.openstack.views.addresses.rst +source/api/nova.api.openstack.views.servers.rst +source/api/nova.api.openstack.views.versions.rst +source/api/nova.api.openstack.views.limits.rst +source/api/nova.api.openstack.views.flavors.rst +source/api/nova.api.openstack.server_metadata.rst +source/api/nova.api.openstack.backup_schedules.rst +source/api/nova.api.direct.rst +source/api/nova.log.rst +source/api/nova.rpc.rst +source/api/nova.fakememcache.rst +source/api/nova.crypto.rst +source/api/nova.cloudpipe.pipelib.rst +source/api/nova.context.rst +source/api/nova.quota.rst +source/api/nova.tests.test_compute.rst +source/api/nova.tests.test_quota.rst +source/api/nova.tests.test_flags.rst +source/api/nova.tests.test_objectstore.rst +source/api/nova.tests.test_crypto.rst +source/api/nova.tests.runtime_flags.rst +source/api/nova.tests.test_exception.rst +source/api/nova.tests.vmwareapi.db_fakes.rst +source/api/nova.tests.vmwareapi.stubs.rst +source/api/nova.tests.test_host_filter.rst +source/api/nova.tests.test_network.rst +source/api/nova.tests.network.base.rst +source/api/nova.tests.declare_flags.rst +source/api/nova.tests.test_localization.rst +source/api/nova.tests.test_access.rst +source/api/nova.tests.test_libvirt.rst +source/api/nova.tests.image.test_glance.rst +source/api/nova.tests.test_direct.rst +source/api/nova.tests.fake_utils.rst +source/api/nova.tests.integrated.test_login.rst +source/api/nova.tests.integrated.test_extensions.rst +source/api/nova.tests.integrated.integrated_helpers.rst +source/api/nova.tests.integrated.test_servers.rst +source/api/nova.tests.integrated.test_xml.rst +source/api/nova.tests.integrated.api.client.rst +source/api/nova.tests.integrated.test_volumes.rst +source/api/nova.tests.test_rpc.rst +source/api/nova.tests.test_volume.rst +source/api/nova.tests.test_notifier.rst +source/api/nova.tests.fake_flags.rst +source/api/nova.tests.test_log.rst +source/api/nova.tests.test_service.rst +source/api/nova.tests.test_twistd.rst +source/api/nova.tests.test_misc.rst +source/api/nova.tests.test_cloud.rst +source/api/nova.tests.glance.stubs.rst +source/api/nova.tests.test_auth.rst +source/api/nova.tests.test_utils.rst +source/api/nova.tests.test_vmwareapi.rst +source/api/nova.tests.test_vlan_network.rst +source/api/nova.tests.test_zones.rst +source/api/nova.tests.test_middleware.rst +source/api/nova.tests.test_ipv6.rst +source/api/nova.tests.xenapi.stubs.rst +source/api/nova.tests.test_api.rst +source/api/nova.tests.scheduler.test_host_filter.rst +source/api/nova.tests.scheduler.test_zone_aware_scheduler.rst +source/api/nova.tests.scheduler.test_least_cost_scheduler.rst +source/api/nova.tests.scheduler.test_scheduler.rst +source/api/nova.tests.db.fakes.rst +source/api/nova.tests.test_instance_types.rst +source/api/nova.tests.test_console.rst +source/api/nova.tests.api.test_wsgi.rst +source/api/nova.tests.api.openstack.test_users.rst +source/api/nova.tests.api.openstack.fakes.rst +source/api/nova.tests.api.openstack.common.rst +source/api/nova.tests.api.openstack.test_wsgi.rst +source/api/nova.tests.api.openstack.test_accounts.rst +source/api/nova.tests.api.openstack.test_flavors.rst +source/api/nova.tests.api.openstack.test_extensions.rst +source/api/nova.tests.api.openstack.test_adminapi.rst +source/api/nova.tests.api.openstack.test_versions.rst +source/api/nova.tests.api.openstack.test_image_metadata.rst +source/api/nova.tests.api.openstack.test_auth.rst +source/api/nova.tests.api.openstack.test_servers.rst +source/api/nova.tests.api.openstack.test_zones.rst +source/api/nova.tests.api.openstack.test_images.rst +source/api/nova.tests.api.openstack.test_api.rst +source/api/nova.tests.api.openstack.test_faults.rst +source/api/nova.tests.api.openstack.test_limits.rst +source/api/nova.tests.api.openstack.test_server_metadata.rst +source/api/nova.tests.api.openstack.test_shared_ip_groups.rst +source/api/nova.tests.api.openstack.test_common.rst +source/api/nova.tests.api.openstack.extensions.foxinsocks.rst +source/api/nova.tests.test_xenapi.rst +source/api/nova.tests.hyperv_unittest.rst +source/api/nova.tests.test_test.rst +source/api/nova.tests.test_flat_network.rst +source/api/nova.network.linux_net.rst +source/api/nova.network.api.rst +source/api/nova.network.manager.rst +source/api/nova.network.vmwareapi_net.rst +source/api/nova.network.xenapi_net.rst +source/api/nova.volume.driver.rst +source/api/nova.volume.api.rst +source/api/nova.volume.san.rst +source/api/nova.volume.manager.rst +source/api/nova.virt.images.rst +source/api/nova.virt.driver.rst +source/api/nova.virt.vmwareapi.io_util.rst +source/api/nova.virt.vmwareapi.error_util.rst +source/api/nova.virt.vmwareapi.vmops.rst +source/api/nova.virt.vmwareapi.fake.rst +source/api/nova.virt.vmwareapi.vim.rst +source/api/nova.virt.vmwareapi.read_write_util.rst +source/api/nova.virt.vmwareapi.vmware_images.rst +source/api/nova.virt.vmwareapi.network_utils.rst +source/api/nova.virt.vmwareapi.vim_util.rst +source/api/nova.virt.vmwareapi.vm_util.rst +source/api/nova.virt.xenapi_conn.rst +source/api/nova.virt.fake.rst +source/api/nova.virt.vmwareapi_conn.rst +source/api/nova.virt.connection.rst +source/api/nova.virt.disk.rst +source/api/nova.virt.libvirt.connection.rst +source/api/nova.virt.libvirt.firewall.rst +source/api/nova.virt.libvirt.netutils.rst +source/api/nova.virt.hyperv.rst +source/api/nova.virt.xenapi.vmops.rst +source/api/nova.virt.xenapi.fake.rst +source/api/nova.virt.xenapi.volume_utils.rst +source/api/nova.virt.xenapi.network_utils.rst +source/api/nova.virt.xenapi.vm_utils.rst +source/api/nova.virt.xenapi.volumeops.rst +source/api/nova.exception.rst +source/api/nova.image.fake.rst +source/api/nova.image.local.rst +source/api/nova.image.glance.rst +source/api/nova.image.service.rst +source/api/nova.image.s3.rst +source/api/nova.objectstore.s3server.rst +source/api/nova.ipv6.account_identifier.rst +source/api/nova.ipv6.api.rst +source/api/nova.ipv6.rfc2462.rst +source/api/nova.notifier.no_op_notifier.rst +source/api/nova.notifier.log_notifier.rst +source/api/nova.notifier.rabbit_notifier.rst +source/api/nova.notifier.api.rst +source/api/nova.vcsversion.rst +source/api/nova.compute.instance_types.rst +source/api/nova.compute.power_state.rst +source/api/nova.compute.api.rst +source/api/nova.compute.manager.rst +source/api/nova.compute.monitor.rst +source/api/nova.wsgi.rst +source/api/nova.console.vmrc_manager.rst +source/api/nova.console.fake.rst +source/api/nova.console.vmrc.rst +source/api/nova.console.api.rst +source/api/nova.console.manager.rst +source/api/nova.console.xvp.rst +source/api/nova.version.rst +source/api/nova.utils.rst +source/api/nova.auth.dbdriver.rst +source/api/nova.auth.fakeldap.rst +source/api/nova.auth.ldapdriver.rst +source/api/nova.auth.signer.rst +source/api/nova.auth.manager.rst +source/api/nova.manager.rst +source/api/nova.scheduler.driver.rst +source/api/nova.scheduler.host_filter.rst +source/api/nova.scheduler.zone.rst +source/api/nova.scheduler.simple.rst +source/api/nova.scheduler.zone_aware_scheduler.rst +source/api/nova.scheduler.zone_manager.rst +source/api/nova.scheduler.api.rst +source/api/nova.scheduler.least_cost.rst +source/api/nova.scheduler.manager.rst +source/api/nova.scheduler.chance.rst +source/api/nova.vnc.auth.rst +source/api/nova.vnc.proxy.rst +source/api/nova.db.base.rst +source/api/nova.db.migration.rst +source/api/nova.db.sqlalchemy.session.rst +source/api/nova.db.sqlalchemy.migration.rst +source/api/nova.db.sqlalchemy.migrate_repo.manage.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.018_rename_server_management_url.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.017_make_instance_type_id_an_integer.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.010_add_os_type_to_instances.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.013_add_flavors_to_migrations.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.009_add_instance_migrations.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.002_bexar.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.020_add_snapshot_id_to_volumes.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.016_make_quotas_key_and_value.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.003_add_label_to_networks.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.021_rename_image_ids.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.006_add_provider_data_to_volumes.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.008_add_instance_types.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.019_add_volume_snapshot_support.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.001_austin.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.011_live_migration.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.005_add_instance_metadata.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.004_add_zone_tables.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.012_add_ipv6_flatmanager.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.015_add_auto_assign_to_floating_ips.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.007_add_ipv6_to_fixed_ips.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.014_add_instance_type_id_to_instances.rst +source/api/nova.db.sqlalchemy.api.rst +source/api/nova.db.sqlalchemy.models.rst +source/api/nova.db.api.rst +source/api/nova.twistd.rst +source/api/nova.test.rst +source/api/nova.fakerabbit.rst +source/api/nova.service.rst +source/api/nova.flags.rst +source/api/nova.api.ec2.ec2utils.rst +source/api/nova.api.ec2.metadatarequesthandler.rst +source/api/nova.api.ec2.cloud.rst +source/api/nova.api.ec2.admin.rst +source/api/nova.api.ec2.apirequest.rst +source/api/nova.api.openstack.images.rst +source/api/nova.api.openstack.faults.rst +source/api/nova.api.openstack.shared_ip_groups.rst +source/api/nova.api.openstack.common.rst +source/api/nova.api.openstack.ips.rst +source/api/nova.api.openstack.extensions.rst +source/api/nova.api.openstack.servers.rst +source/api/nova.api.openstack.consoles.rst +source/api/nova.api.openstack.users.rst +source/api/nova.api.openstack.auth.rst +source/api/nova.api.openstack.versions.rst +source/api/nova.api.openstack.zones.rst +source/api/nova.api.openstack.limits.rst +source/api/nova.api.openstack.flavors.rst +source/api/nova.api.openstack.image_metadata.rst +source/api/nova.api.openstack.contrib.volumes.rst +source/api/nova.api.openstack.wsgi.rst +source/api/nova.api.openstack.accounts.rst +source/api/nova.api.openstack.views.images.rst +source/api/nova.api.openstack.views.addresses.rst +source/api/nova.api.openstack.views.servers.rst +source/api/nova.api.openstack.views.versions.rst +source/api/nova.api.openstack.views.limits.rst +source/api/nova.api.openstack.views.flavors.rst +source/api/nova.api.openstack.server_metadata.rst +source/api/nova.api.openstack.backup_schedules.rst +source/api/nova.api.direct.rst +source/api/nova.log.rst +source/api/nova.rpc.rst +source/api/nova.fakememcache.rst +source/api/nova.crypto.rst +source/api/nova.cloudpipe.pipelib.rst +source/api/nova.context.rst +source/api/nova.quota.rst +source/api/nova.tests.test_compute.rst +source/api/nova.tests.test_quota.rst +source/api/nova.tests.test_flags.rst +source/api/nova.tests.test_objectstore.rst +source/api/nova.tests.test_crypto.rst +source/api/nova.tests.runtime_flags.rst +source/api/nova.tests.test_exception.rst +source/api/nova.tests.vmwareapi.db_fakes.rst +source/api/nova.tests.vmwareapi.stubs.rst +source/api/nova.tests.test_host_filter.rst +source/api/nova.tests.test_network.rst +source/api/nova.tests.network.base.rst +source/api/nova.tests.declare_flags.rst +source/api/nova.tests.test_localization.rst +source/api/nova.tests.test_access.rst +source/api/nova.tests.test_libvirt.rst +source/api/nova.tests.image.test_glance.rst +source/api/nova.tests.test_direct.rst +source/api/nova.tests.fake_utils.rst +source/api/nova.tests.integrated.test_login.rst +source/api/nova.tests.integrated.test_extensions.rst +source/api/nova.tests.integrated.integrated_helpers.rst +source/api/nova.tests.integrated.test_servers.rst +source/api/nova.tests.integrated.test_xml.rst +source/api/nova.tests.integrated.api.client.rst +source/api/nova.tests.integrated.test_volumes.rst +source/api/nova.tests.test_rpc.rst +source/api/nova.tests.test_volume.rst +source/api/nova.tests.test_notifier.rst +source/api/nova.tests.fake_flags.rst +source/api/nova.tests.test_log.rst +source/api/nova.tests.test_service.rst +source/api/nova.tests.test_twistd.rst +source/api/nova.tests.test_misc.rst +source/api/nova.tests.test_cloud.rst +source/api/nova.tests.glance.stubs.rst +source/api/nova.tests.test_auth.rst +source/api/nova.tests.test_utils.rst +source/api/nova.tests.test_vmwareapi.rst +source/api/nova.tests.test_vlan_network.rst +source/api/nova.tests.test_zones.rst +source/api/nova.tests.test_middleware.rst +source/api/nova.tests.test_ipv6.rst +source/api/nova.tests.xenapi.stubs.rst +source/api/nova.tests.test_api.rst +source/api/nova.tests.scheduler.test_host_filter.rst +source/api/nova.tests.scheduler.test_zone_aware_scheduler.rst +source/api/nova.tests.scheduler.test_least_cost_scheduler.rst +source/api/nova.tests.scheduler.test_scheduler.rst +source/api/nova.tests.db.fakes.rst +source/api/nova.tests.test_instance_types.rst +source/api/nova.tests.test_console.rst +source/api/nova.tests.api.test_wsgi.rst +source/api/nova.tests.api.openstack.test_users.rst +source/api/nova.tests.api.openstack.fakes.rst +source/api/nova.tests.api.openstack.common.rst +source/api/nova.tests.api.openstack.test_wsgi.rst +source/api/nova.tests.api.openstack.test_accounts.rst +source/api/nova.tests.api.openstack.test_flavors.rst +source/api/nova.tests.api.openstack.test_extensions.rst +source/api/nova.tests.api.openstack.test_adminapi.rst +source/api/nova.tests.api.openstack.test_versions.rst +source/api/nova.tests.api.openstack.test_image_metadata.rst +source/api/nova.tests.api.openstack.test_auth.rst +source/api/nova.tests.api.openstack.test_servers.rst +source/api/nova.tests.api.openstack.test_zones.rst +source/api/nova.tests.api.openstack.test_images.rst +source/api/nova.tests.api.openstack.test_api.rst +source/api/nova.tests.api.openstack.test_faults.rst +source/api/nova.tests.api.openstack.test_limits.rst +source/api/nova.tests.api.openstack.test_server_metadata.rst +source/api/nova.tests.api.openstack.test_shared_ip_groups.rst +source/api/nova.tests.api.openstack.test_common.rst +source/api/nova.tests.api.openstack.extensions.foxinsocks.rst +source/api/nova.tests.test_xenapi.rst +source/api/nova.tests.hyperv_unittest.rst +source/api/nova.tests.test_test.rst +source/api/nova.tests.test_flat_network.rst +source/api/nova.network.linux_net.rst +source/api/nova.network.api.rst +source/api/nova.network.manager.rst +source/api/nova.network.vmwareapi_net.rst +source/api/nova.network.xenapi_net.rst +source/api/nova.volume.driver.rst +source/api/nova.volume.api.rst +source/api/nova.volume.san.rst +source/api/nova.volume.manager.rst +source/api/nova.virt.images.rst +source/api/nova.virt.driver.rst +source/api/nova.virt.vmwareapi.io_util.rst +source/api/nova.virt.vmwareapi.error_util.rst +source/api/nova.virt.vmwareapi.vmops.rst +source/api/nova.virt.vmwareapi.fake.rst +source/api/nova.virt.vmwareapi.vim.rst +source/api/nova.virt.vmwareapi.read_write_util.rst +source/api/nova.virt.vmwareapi.vmware_images.rst +source/api/nova.virt.vmwareapi.network_utils.rst +source/api/nova.virt.vmwareapi.vim_util.rst +source/api/nova.virt.vmwareapi.vm_util.rst +source/api/nova.virt.xenapi_conn.rst +source/api/nova.virt.fake.rst +source/api/nova.virt.vmwareapi_conn.rst +source/api/nova.virt.connection.rst +source/api/nova.virt.disk.rst +source/api/nova.virt.libvirt.connection.rst +source/api/nova.virt.libvirt.firewall.rst +source/api/nova.virt.libvirt.netutils.rst +source/api/nova.virt.hyperv.rst +source/api/nova.virt.xenapi.vmops.rst +source/api/nova.virt.xenapi.fake.rst +source/api/nova.virt.xenapi.volume_utils.rst +source/api/nova.virt.xenapi.network_utils.rst +source/api/nova.virt.xenapi.vm_utils.rst +source/api/nova.virt.xenapi.volumeops.rst +source/api/nova.exception.rst +source/api/nova.image.fake.rst +source/api/nova.image.local.rst +source/api/nova.image.glance.rst +source/api/nova.image.service.rst +source/api/nova.image.s3.rst +source/api/nova.objectstore.s3server.rst +source/api/nova.ipv6.account_identifier.rst +source/api/nova.ipv6.api.rst +source/api/nova.ipv6.rfc2462.rst +source/api/nova.notifier.no_op_notifier.rst +source/api/nova.notifier.log_notifier.rst +source/api/nova.notifier.rabbit_notifier.rst +source/api/nova.notifier.api.rst +source/api/nova.vcsversion.rst +source/api/nova.compute.instance_types.rst +source/api/nova.compute.power_state.rst +source/api/nova.compute.api.rst +source/api/nova.compute.manager.rst +source/api/nova.compute.monitor.rst +source/api/nova.wsgi.rst +source/api/nova.console.vmrc_manager.rst +source/api/nova.console.fake.rst +source/api/nova.console.vmrc.rst +source/api/nova.console.api.rst +source/api/nova.console.manager.rst +source/api/nova.console.xvp.rst +source/api/nova.version.rst +source/api/nova.utils.rst +source/api/nova.auth.dbdriver.rst +source/api/nova.auth.fakeldap.rst +source/api/nova.auth.ldapdriver.rst +source/api/nova.auth.signer.rst +source/api/nova.auth.manager.rst +source/api/nova.manager.rst +source/api/nova.scheduler.driver.rst +source/api/nova.scheduler.host_filter.rst +source/api/nova.scheduler.zone.rst +source/api/nova.scheduler.simple.rst +source/api/nova.scheduler.zone_aware_scheduler.rst +source/api/nova.scheduler.zone_manager.rst +source/api/nova.scheduler.api.rst +source/api/nova.scheduler.least_cost.rst +source/api/nova.scheduler.manager.rst +source/api/nova.scheduler.chance.rst +source/api/nova.vnc.auth.rst +source/api/nova.vnc.proxy.rst +source/api/nova.db.base.rst +source/api/nova.db.migration.rst +source/api/nova.db.sqlalchemy.session.rst +source/api/nova.db.sqlalchemy.migration.rst +source/api/nova.db.sqlalchemy.migrate_repo.manage.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.018_rename_server_management_url.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.017_make_instance_type_id_an_integer.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.010_add_os_type_to_instances.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.013_add_flavors_to_migrations.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.009_add_instance_migrations.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.002_bexar.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.020_add_snapshot_id_to_volumes.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.016_make_quotas_key_and_value.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.003_add_label_to_networks.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.021_rename_image_ids.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.006_add_provider_data_to_volumes.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.008_add_instance_types.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.019_add_volume_snapshot_support.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.001_austin.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.011_live_migration.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.005_add_instance_metadata.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.004_add_zone_tables.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.012_add_ipv6_flatmanager.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.015_add_auto_assign_to_floating_ips.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.007_add_ipv6_to_fixed_ips.rst +source/api/nova.db.sqlalchemy.migrate_repo.versions.014_add_instance_type_id_to_instances.rst +source/api/nova.db.sqlalchemy.api.rst +source/api/nova.db.sqlalchemy.models.rst +source/api/nova.db.api.rst +source/api/nova.twistd.rst +source/api/nova.test.rst +source/api/nova.fakerabbit.rst +source/api/nova.service.rst +source/api/nova.flags.rst +source/api/nova.api.ec2.ec2utils.rst +source/api/nova.api.ec2.metadatarequesthandler.rst +source/api/nova.api.ec2.cloud.rst +source/api/nova.api.ec2.admin.rst +source/api/nova.api.ec2.apirequest.rst +source/api/nova.api.openstack.images.rst +source/api/nova.api.openstack.faults.rst +source/api/nova.api.openstack.shared_ip_groups.rst +source/api/nova.api.openstack.common.rst +source/api/nova.api.openstack.ips.rst +source/api/nova.api.openstack.extensions.rst +source/api/nova.api.openstack.servers.rst +source/api/nova.api.openstack.consoles.rst +source/api/nova.api.openstack.users.rst +source/api/nova.api.openstack.auth.rst +source/api/nova.api.openstack.versions.rst +source/api/nova.api.openstack.zones.rst +source/api/nova.api.openstack.limits.rst +source/api/nova.api.openstack.flavors.rst +source/api/nova.api.openstack.image_metadata.rst +source/api/nova.api.openstack.contrib.volumes.rst +source/api/nova.api.openstack.wsgi.rst +source/api/nova.api.openstack.accounts.rst +source/api/nova.api.openstack.views.images.rst +source/api/nova.api.openstack.views.addresses.rst +source/api/nova.api.openstack.views.servers.rst +source/api/nova.api.openstack.views.versions.rst +source/api/nova.api.openstack.views.limits.rst +source/api/nova.api.openstack.views.flavors.rst +source/api/nova.api.openstack.server_metadata.rst +source/api/nova.api.openstack.backup_schedules.rst +source/api/nova.api.direct.rst +source/api/nova.log.rst +source/api/nova.rpc.rst +source/api/nova.fakememcache.rst diff --git a/doc/source/devref/distributed_scheduler.rst b/doc/source/devref/distributed_scheduler.rst index eb6a1a03e4..cc9e789167 100644 --- a/doc/source/devref/distributed_scheduler.rst +++ b/doc/source/devref/distributed_scheduler.rst @@ -15,10 +15,12 @@ under the License. Distributed Scheduler -===== +===================== The Scheduler is akin to a Dating Service. Requests for the creation of new instances come in and the most applicable Compute nodes are selected from a large pool of potential candidates. In a small deployment we may be happy with the currently available Change Scheduler which randomly selects a Host from the available pool. Or if you need something a little more fancy you may want to use the Availability Zone Scheduler, which selects Compute hosts from a logical partitioning of available hosts (within a single Zone). + .. image:: /images/dating_service.png + But for larger deployments a more complex scheduling algorithm is required. Additionally, if you are using Zones in your Nova setup, you'll need a scheduler that understand how to pass instance requests from Zone to Zone. This is the purpose of the Distributed Scheduler (DS). The DS utilizes the Capabilities of a Zone and its component services to make informed decisions on where a new instance should be created. When making this decision it consults not only all the Compute nodes in the current Zone, but the Compute nodes in each Child Zone. This continues recursively until the ideal host is found. @@ -27,70 +29,82 @@ So, how does this all work? This document will explain the strategy employed by the `ZoneAwareScheduler` and its derivations. You should read the Zones documentation before reading this. + .. image:: /images/zone_aware_scheduler.png + Costs & Weights ----------- +--------------- When deciding where to place an Instance, we compare a Weighted Cost for each Host. The Weighting, currently, is just the sum of each Cost. Costs are nothing more than integers from `0 - max_int`. Costs are computed by looking at the various Capabilities of the Host relative to the specs of the Instance being asked for. Trying to putting a plain vanilla instance on a high performance host should have a very high cost. But putting a vanilla instance on a vanilla Host should have a low cost. Some Costs are more esoteric. Consider a rule that says we should prefer Hosts that don't already have an instance on it that is owned by the user requesting it (to mitigate against machine failures). Here we have to look at all the other Instances on the host to compute our cost. An example of some other costs might include selecting: -* a GPU-based host over a standard CPU -* a host with fast ethernet over a 10mbps line -* a host that can run Windows instances -* a host in the EU vs North America -* etc + * a GPU-based host over a standard CPU + * a host with fast ethernet over a 10mbps line + * a host that can run Windows instances + * a host in the EU vs North America + * etc This Weight is computed for each Instance requested. If the customer asked for 1000 instances, the consumed resources on each Host are "virtually" depleted so the Cost can change accordingly. + .. image:: /images/costs_weights.png + nova.scheduler.zone_aware_scheduler.ZoneAwareScheduler ------------ +------------------------------------------------------ As we explained in the Zones documentation, each Scheduler has a `ZoneManager` object that collects "Capabilities" about child Zones and each of the services running in the current Zone. The `ZoneAwareScheduler` uses this information to make its decisions. Here is how it works: -1. The compute nodes are filtered and the nodes remaining are weighed. -1a. Filtering the hosts is a simple matter of ensuring the compute node has ample resources (CPU, RAM, Disk, etc) to fulfil the request. -1b. Weighing of the remaining compute nodes assigns a number based on their suitability for the request. -2. The same request is sent to each child Zone and step #1 is done there too. The resulting weighted list is returned to the parent. -3. The parent Zone sorts and aggregates all the weights and a final build plan is constructed. -4. The build plan is executed upon. Concurrently, instance create requests are sent to each of the selected hosts, be they local or in a child zone. Child Zones may forward the requests to their child Zones as needed. + 1. The compute nodes are filtered and the nodes remaining are weighed. + 2. Filtering the hosts is a simple matter of ensuring the compute node has ample resources (CPU, RAM, Disk, etc) to fulfil the request. + 3. Weighing of the remaining compute nodes assigns a number based on their suitability for the request. + 4. The same request is sent to each child Zone and step #1 is done there too. The resulting weighted list is returned to the parent. + 5. The parent Zone sorts and aggregates all the weights and a final build plan is constructed. + 6. The build plan is executed upon. Concurrently, instance create requests are sent to each of the selected hosts, be they local or in a child zone. Child Zones may forward the requests to their child Zones as needed. + + .. image:: /images/zone_aware_overview.png `ZoneAwareScheduler` by itself is not capable of handling all the provisioning itself. Derived classes are used to select which host filtering and weighing strategy will be used. Filtering and Weighing ------------- +---------------------- The filtering (excluding compute nodes incapable of fulfilling the request) and weighing (computing the relative "fitness" of a compute node to fulfill the request) rules used are very subjective operations ... Service Providers will probably have a very different set of filtering and weighing rules than private cloud administrators. The filtering and weighing aspects of the `ZoneAwareScheduler` are flexible and extensible. + .. image:: /images/filtering.png + Requesting a new instance ------------- +------------------------- Prior to the `ZoneAwareScheduler`, to request a new instance, a call was made to `nova.compute.api.create()`. The type of instance created depended on the value of the `InstanceType` record being passed in. The `InstanceType` determined the amount of disk, CPU, RAM and network required for the instance. Administrators can add new `InstanceType` records to suit their needs. For more complicated instance requests we need to go beyond the default fields in the `InstanceType` table. `nova.compute.api.create()` performed the following actions: -1. it validated all the fields passed into it. -2. it created an entry in the `Instance` table for each instance requested -3. it put one `run_instance` message in the scheduler queue for each instance requested -4. the schedulers picked off the messages and decided which compute node should handle the request. -5. the `run_instance` message was forwarded to the compute node for processing and the instance is created. -6. it returned a list of dicts representing each of the `Instance` records (even if the instance has not been activated yet). At least the `instance_id`s are valid. + 1. it validated all the fields passed into it. + 2. it created an entry in the `Instance` table for each instance requested + 3. it put one `run_instance` message in the scheduler queue for each instance requested + 4. the schedulers picked off the messages and decided which compute node should handle the request. + 5. the `run_instance` message was forwarded to the compute node for processing and the instance is created. + 6. it returned a list of dicts representing each of the `Instance` records (even if the instance has not been activated yet). At least the `instance_ids` are valid. + + .. image:: /images/nova.compute.api.create.png Generally, the standard schedulers (like `ChanceScheduler` and `AvailabilityZoneScheduler`) only operate in the current Zone. They have no concept of child Zones. The problem with this approach is each request is scattered amongst each of the schedulers. If we are asking for 1000 instances, each scheduler gets the requests one-at-a-time. There is no possability of optimizing the requests to take into account all 1000 instances as a group. We call this Single-Shot vs. All-at-Once. For the `ZoneAwareScheduler` we need to use the All-at-Once approach. We need to consider all the hosts across all the Zones before deciding where they should reside. In order to handle this we have a new method `nova.compute.api.create_all_at_once()`. This method does things a little differently: -1. it validates all the fields passed into it. -2. it creates a single `reservation_id` for all of instances created. This is a UUID. -3. it creates a single `run_instance` request in the scheduler queue -4. a scheduler picks the message off the queue and works on it. -5. the scheduler sends off an OS API `POST /zones/select` command to each child Zone. The `BODY` payload of the call contains the `request_spec`. -6. the child Zones use the `request_spec` to compute a weighted list for each instance requested. No attempt to actually create an instance is done at this point. We're only estimating the suitability of the Zones. -7. if the child Zone has its own child Zones, the `/zones/select` call will be sent down to them as well. -8. Finally, when all the estimates have bubbled back to the Zone that initiated the call, all the results are merged, sorted and processed. -9. Now the instances can be created. The initiating Zone either forwards the `run_instance` message to the local Compute node to do the work, or it issues a `POST /servers` call to the relevant child Zone. The parameters to the child Zone call are the same as what was passed in by the user. -10. The `reservation_id` is passed back to the caller. Later we explain how the user can check on the status of the command with this `reservation_id`. + 1. it validates all the fields passed into it. + 2. it creates a single `reservation_id` for all of instances created. This is a UUID. + 3. it creates a single `run_instance` request in the scheduler queue + 4. a scheduler picks the message off the queue and works on it. + 5. the scheduler sends off an OS API `POST /zones/select` command to each child Zone. The `BODY` payload of the call contains the `request_spec`. + 6. the child Zones use the `request_spec` to compute a weighted list for each instance requested. No attempt to actually create an instance is done at this point. We're only estimating the suitability of the Zones. + 7. if the child Zone has its own child Zones, the `/zones/select` call will be sent down to them as well. + 8. Finally, when all the estimates have bubbled back to the Zone that initiated the call, all the results are merged, sorted and processed. + 9. Now the instances can be created. The initiating Zone either forwards the `run_instance` message to the local Compute node to do the work, or it issues a `POST /servers` call to the relevant child Zone. The parameters to the child Zone call are the same as what was passed in by the user. + 10. The `reservation_id` is passed back to the caller. Later we explain how the user can check on the status of the command with this `reservation_id`. + + .. image:: /images/nova.compute.api.create_all_at_once.png The Catch -------------- +--------- This all seems pretty straightforward but, like most things, there's a catch. Zones are expected to operate in complete isolation from each other. Each Zone has its own AMQP service, database and set of Nova services. But, for security reasons Zones should never leak information about the architectural layout internally. That means Zones cannot leak information about hostnames or service IP addresses outside of its world. When `POST /zones/select` is called to estimate which compute node to use, time passes until the `POST /servers` call is issued. If we only passed the weight back from the `select` we would have to re-compute the appropriate compute node for the create command ... and we could end up with a different host. Somehow we need to remember the results of our computations and pass them outside of the Zone. Now, we could store this information in the local database and return a reference to it, but remember that the vast majority of weights are going be ignored. Storing them in the database would result in a flood of disk access and then we have to clean up all these entries periodically. Recall that there are going to be many many `select` calls issued to child Zones asking for estimates. @@ -117,7 +131,7 @@ Finally, we need to give the user a way to get information on each of the instan `python-novaclient` will be extended to support both of these changes. Host Filter --------------- +----------- As we mentioned earlier, filtering hosts is a very deployment-specific process. Service Providers may have a different set of criteria for filtering Compute nodes than a University. To faciliate this the `nova.scheduler.host_filter` module supports a variety of filtering strategies as well as an easy means for plugging in your own algorithms. @@ -130,21 +144,22 @@ The filter used is determined by the `--default_host_filter` flag, which points To create your own `HostFilter` the user simply has to derive from `nova.scheduler.host_filter.HostFilter` and implement two methods: `instance_type_to_filter` and `filter_hosts`. Since Nova is currently dependent on the `InstanceType` structure, the `instance_type_to_filter` method should take an `InstanceType` and turn it into an internal data structure usable by your filter. This is for backward compatibility with existing OpenStack and EC2 API calls. If you decide to create your own call for creating instances not based on `Flavors` or `InstanceTypes` you can ignore this method. The real work is done in `filter_hosts` which must return a list of host tuples for each appropriate host. The set of all available hosts is in the `ZoneManager` object passed into the call as well as the filter query. The host tuple contains (``, ``) where `` is whatever you want it to be. Cost Scheduler Weighing --------------- +----------------------- Every `ZoneAwareScheduler` derivation must also override the `weigh_hosts` method. This takes the list of filtered hosts (generated by the `filter_hosts` method) and returns a list of weight dicts. The weight dicts must contain two keys: `weight` and `hostname` where `weight` is simply an integer (lower is better) and `hostname` is the name of the host. The list does not need to be sorted, this will be done by the `ZoneAwareScheduler` base class when all the results have been assembled. Simple Zone Aware Scheduling --------------- +---------------------------- The easiest way to get started with the `ZoneAwareScheduler` is to use the `nova.scheduler.host_filter.HostFilterScheduler`. This scheduler uses the default Host Filter as and the `weight_hosts` method simply returns a weight of 1 for all hosts. But, from this, you can see calls being routed from Zone to Zone and follow the flow of things. The `--scheduler_driver` flag is how you specify the scheduler class name. Flags --------------- +----- All this Zone and Distributed Scheduler stuff can seem a little daunting to configure, but it's actually not too bad. Here are some of the main flags you should set in your `nova.conf` file: :: + --allow_admin_api=true --enable_zone_routing=true --zone_name=zone1 @@ -162,6 +177,7 @@ All this Zone and Distributed Scheduler stuff can seem a little daunting to conf Some optional flags which are handy for debugging are: :: + --connection_type=fake --verbose diff --git a/doc/source/images/costs_weights.png b/doc/source/images/costs_weights.png new file mode 100644 index 0000000000000000000000000000000000000000..b65e98b0c5d1f1bf6d24b6ab28a95f94fb149421 GIT binary patch literal 35723 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 literal 0 HcmV?d00001 diff --git a/doc/source/images/dating_service.png b/doc/source/images/dating_service.png new file mode 100644 index 0000000000000000000000000000000000000000..49f1bd86a30d678f282832c265a7f028a847d827 GIT binary patch literal 31945 zcmb@tWmsEZ)IA8n-QB&oLvb(e5P}o}v=k}s?p~}|ad!(+C>~sjQ{1f-cely!op7IYh9VX^IXWC19G0?@ybc^3d?M_{feL_~v6yp7g}uSM z>L|*>)lN_zzzz_<$f(P}!PO^VJewoIj?tWy3|-;iuzUY|!4thx34)y@b5j7h={j1u zd78U?hSM^)ad6|(P|&0G;O7$LdM_*%^brouPefT>M$gOiBnQQWP>}?xZb34z-cH|n z7q2vAii>eu3)1S3P|_`Cc)|WPNaf@dE(gyZ1;QmF#7$&Vk2}cxamnN2%F0T_d4j|kJhW>BG$lkx*W0TvfNpR3XXMRI z_Z^9byZx7sYh~BhzRJorQZLuKQvVE<2=LHQr2z;upwFMV2?%EGYy(cZ%MTYX4eA1V zb}IJvhyedEl~SV+`#%B@C_xGelZ}lS$jFtVk_uLTL({o`4|KZHoyajl9nmm9fm2gb zOuJuymF(pOqi}c?e*5-pP-lA4E=7AohmUKAh6w`uKi}hpD%;yW`by8BQ&(0T1frp_ z=1KbFAH9YPU?;(uG4X(d!~5{ex?e5xXJT$l=H_UW8Trhf5Om1s;p@|&P{eu9jh+VZ zBeaz0=z!-(lUcxnLUlXo%zJsjbMk+e*V?^tsP&WqkkhrQUx9D%Z;uE%1phmhI64I| z%cKl9f3y&|eGzT3Hjp?-hrgMJh|CPx-iB<_a@m4k`k-JecQ-;pJ?wTCpz!P3%(IlA zSAIlDOzz0?vEqj8Re3oo!pG3@$j~E-HyfMBS^IQ`(+>nKyPY-NHS|e0BctcYh6oQ$7$edGa`H%D1oQg*)J6iP#t*0wjt_hB5Hno z@4U0`JNQXZ=*@j~dS-Y++01-mv3|!hmt|h?`Jl@(y!561F)fhBOf^eVH{Rv!BLy&1 z3N)-iDe1F45*w{MVZ9dA&1}z=<_}NKn#Zq7*CI{-qZ)d3)jQ6LXld zvS#<|vF}c6BM;et4+iu1vrbP_%dOymVa}R-aR5hGJZdptecFGng(ldOi>V7rGQIWo zaJG3ws@MgHLDW2Ve~}fSwJ>yQ;82T-hUok~`~@0x0&^A^mqycvHJ`tz)(_h_k#K>%v_ z&~BUgYU8t3{oZ3ZR}~X(-tUAnpK^_E5SwO6rqA}(&FN?O^^a-YFO@kRQ2{!au8Q-k z8tR$6{>!aV#&POnL~wt?LwCw3#H*fI5QyFhdfe9R+XvL>ha8ctQUE1WEn6Vnkf#_BM5w<Z2mtNVZU6C^lajriTJ1!l%SycJPI z#^rd9@~;9lKTk!y1ZEG$elj%>dr z;Cek=p*hx%=_qkjV>BgE$a=@?4vO1h0^JYCGyP{=Mf2B0gAjggu{w(@=9Xg=%$$d; z>=_ye=3g97Q@?~s@T=1kl7ZSmiId#RP~rYrmhqOp+0|8Y?_lPmhLx{Sk2W5-{$x)n z7@h$>8U=VWB&@IYd0%YsML1OrK4dp|5Zdd4?0}s4q+&B z=K~qM5WIJl$#Bix!ihC6`5sG2h6+I*vzDh0t3kvCzeGj=&~2w^Z7e2M!lcg-ShQ*a zKxWxLQ$IJNV2P6Zw9KAS90vG2U)$rPJZvNpebC*nsx|s)K3AF3lKZUpKpS{TYQqq_ z*U0>BX-^@vs?s!t6PPXa?}|>)8Jo8~*wu;-YO(S=34rk5R{L7RW&eK1#bV`@Ks$Y+ zF({Q3&uv@$)%~}W<|Xy>c>1us6T4KTw}a=-kFY6DrgcAioJdylIWl8_9J0ng zxqEh1fBlmoHt#lYx@Mfs9G6F&0qgddJ4 zGzU8ilS>W7lm{B}on*;a4rwN(k(XHiyFQ*%+)sT(FGV>tdhH~4_8w+zUBNm0X@$eP zvAg!?($Vt8v4rXDboHH=(WR~{e_5lfeBa>_t#s{~6n>%`SYMngTf$?p;#_=FgLt%# z0irU>MiNIsUsivA-+JyfgK#bmhPO*9JcLYRxTv%%J1fZ*%@L1NihMkfvB@IwwY>2a zf3mYxaLzx}uMjaTj^c{G?L+)YgpJSXtx8mCq-G?U5iJ|i3&d3vq( z8QyL+#XGsUWR?CBG@+}8RkfvS;xueQm72sbWW#M5rxCFDM?uQg_Sw|EH=nai*F^XS z=gbmt?b*?GDm-a6lD+kkg=+6t#T*fh3AuXUaehl%h~oat)`2S4JWJr;Up4QS06tu#04$@-%PY0>fHzLJO_TC{T}VAs{L$K zotgD!V0!ye{UuM$ENqm9y((a@{{ilnEsdZ30d4FsuPiaJgX5{T;jkq>9d-wRFk9Vy z>ycZ-T{|rlKe;|kKn@kQ)eRhs#S#cb7h?iA=)Mu`5?j#2BZ5#N{l)C`!Q z9Cm&D;((ht>`saLN#z~0C7MkHE{u>LVStIOv`aD!S=d&bbuX#~&{Iu~=Kl6fp~)pU ztj%Qe+fS7%?{=ISWd^KSmsVOdOwZ1J9xIP7&OTkh@&zm%Wip35L$s5~_7kcI;L~si z(OfWilY->okBV}ZJJup4no{=mhs%+-Xy8d|nJk(JcfX7!dSa+m1-_(*Rvg1-N5WzI z`bV`Dv7pN7MwYPoZkXXH*XeXZO!ryTcY}eFOWh%B>wnnxNWi(|vc{pfTX_-zeL>ra zjHWBu!yS%@vq-Y1d{%t`m7Rg~-xO}4&+*Xjhk)vyz8%L7 zJDbPPsgLw8Sf-mXsd#^%=0F+WRubSrEDY4rFP_Tf<~sb}9f{!~*pF*L8{+xN#UIrB zH>y9D@b6dEb$y?0T6F!l{j$F{Gy+4N{|&$YJo5-fmq!)bLWCCP%SB*P>_F!BhLakd zBA8a$yWH(p&$+*X=1P7Zal{SAk@0KJZ<)c7z0hPGi?|$uDrW1{-BppI^CR~Dk<)fE7Q4vgGbiu2#*-W(4P@jjwPZRgksx7&l z__)oZ7n^aBoJ4nL8Y$%U2UB~IO!lV71Fga}90te(YZZ3KlANw$5a_?I9zBI=r_MW8 z1D-a5vkps)YF55B_#Tj}`qG1uUCeKCI1s_#$_Jz^` zL|VtuUdeJy`wHb;uQt?cY_xnuG3vgMk%Jmn$xS7_>(?hVKCbn%ABr9yd;1)f7BnjZ z=^$q<$rKBYVv(VIo~Wc)efmqS;rZtFqQ`dj7FM4Q5?}sF{1U7dnv>XZ{#>6_Q1DRc zhU$e-37pp#v*fp)oVih?A@l^Eg4AV8!~P%e#7E*dT}AqJ$+_9=$Ocy?Jj2P|1qQW*H^!mv&rp}Gqf9X`z~o~c-0HW5}z zkbysP_{+&%Hx>WI;?Y&orLvO^hGzd8=s|F*TF^EZA5Y)ET=O{WIShEj2QA17F(JOTHFvO;y~Fmxh!4 z>tQQo3%9LddV;TOT2Gx%^#rWKhcJr%iIJIR(X*F5adkxar{@?QY^S60RciE3{Ewhs z%LE_)(N<||K1!?m!RK)7SA(UAkvB;tVLi$rGK3}eMV;Ida{Kk;&YKAp$?qSh;eRR< zW}+DsHPt8l`$Ci)Ebh;@7?vk(D(&pL+=9yMYP0#R6J4k5ozm}?+PAZ|beM^;*Ub%- z;T=K;?K;Zes+tRd9>@8~+BmG!>53}qCXLQdg%tz~)G;3}@h_*cl2nm95E-dJ@_`El zmb=s)k5wfHv&62c9$+f8Uufd=D886fE$4q{X?y@cePxO0l(m4;QmGTfObsYGzrxNm zyOmJi?gX@Lr<|n>+`yES;_omyNH;5x8>CD6#hd~c%MO~LvkSk%M0)^@k!bmHk2yO! zj}=-=F}@tU7i>;Ge1>0yl8}-0a4!L8S1`>r9Pk+Qft2+oFCsM*u_N0iLNJ^HvhX(svaWV(4ShML12ZdL*N04|tr$IyilW^Pmk zl}t!pG}H98VY6cUIQj(2XLNL1dAKve`Fn6;E>P#ymN&224D5} zv#XC!z?1jM;O|>C0{gUT?y|5GXkkPv4!MBH$@CLN*pGrxu!`5&x$Vw_kH+Vp-5Z}) zhZP$BDox$hVQh&!Dt);sOUqN{Q?ykwp?}|z65rz=g(ArGsjMEoNog@Q??@fYX)peNbbd*HT{kl+hWXb)W{SyE7#5*Q3%XFqyu{Gy%>D0!eEy&Y?8 zwI@cF5*Cg{N?4Qxh+BEwVxb*W4_ngXlm3AEyga%ak^hps!TEPxlEbL;ccsNKDd3xu zv@9bJPw>s8)LZ|c#SY6)Dg z&!;+`pJT*4FB7?7#%CCL5(PQD(gWXK?#8o3mX;E-GTSuidJs6|eU;_<%-nn&OxOMU z-I#1FiM&k{p>Qa~M^xQj+L?*cT&!DMo*mXbe{N34$KQgAY)mNYOG}9l+Ub+v{1{*F zy5C+dhG@E9ZdZm9XaZj!_S@Rp4(E#+8ZNi`6srm1D=XRN&&+$sV`R2A0-g{_diUsU z9)emcI$)U}0e) zAt7NRGcYj`#WD@{gDovD>g(kR+0er2hX%A~W?ZbB+MW1FA3V>xKIOEwes+75m_HlY zHP*sJ?_+YJGodC3?Ey!Pj8tfy^hM&ByZ?jD1L3mV%^ig@Is|lv*5xvpOJvS-Kdhvt zM~EF-aKWP=rh0kBZfOyd53-l7gG0dWF!MQZB@O##H@T@dJLoT%p#FCIKV% z-ot>m7tdhHuWvOb4MB6Sxza7&0WVe_9&`pTI9l#UKxZ|~*Y(b){PnwymiVUZpUeo{ z_07#(f`V9J_&Pxm5emX{67KcObF!UE26tmpYmn(H0*1M@0ILwO96eKdS{i%@uJ32x zgj9L(%gutBjm?2c4RuH?b53sL2ZCHl|CsCCfN?P||NLH)PIOyBI#JOi*^yu}&kbjW zC~{l7z~5sWQSlLE?{Z}e(o<5T7fu#>&wO{7ut8F9&lu72-Vc{3*uEh58x%G{7A|ZY zpdQHexV=A#T%I1D#}^hmfc9+$hWh;84zCMrNmr156 z^LeOJ|GUd96=GOr$2;qXQdLFp>cw#jS??XzHxqe!GAk_lKuskCuVgq-DYX<=n3LSa z1uGbSlP3a&Wlc`+Go0xr|F@x8@PyaSpt^FShcYgNjg2iixsethVWk#1&x|82^T&_p zodl^%A&tZ;d3N|8clvsIj7%jTK5U<@vYI~)KG_7bXp$EdDT6pFAP_Ct`A>`h(3C$0 zI(nVy_?dqy%Io8lsqfRnFhH1$Qu32R*1vw z?`}$eKdz2$g}S;r!pb0<6F7Ku`B3-n+~?@x{=)LSl;CoKmj4R5V|rbz=jBO%ditJ1 z*dcg`*ijCtRiz2v>*_BSu_|=S`h0H77K-zumxxHJq+Y`@GgqEul%=V16Hy$41IXEVPWwp)yX|3He#J58;PqL(RCN?J1 z_b_Es-e+f!pD-pd-4o|xgm5($*JS*B9@@esDTyZ=Dk$(Q0{+)`6$+K#8jLHOp8mDc z;u`RBW6+~)$|!h60LmAZ@PEVvXeW&b2jP9C8Z|ejl-H%juPe~{b$N;2bpr@)+6?P{WF!VT+IWZNtE}?$EBkKN^k`)K zAYEN+|LlM4_>v^q(fp9NKe^GX@!<#Kt>@PpA`q;_BSEYh@NnsCs<5;~gZ}q>bhHhP zq~C7wlLsdPm8jI43~;_kqlu0EiHnX7>((~dCaonisY;#;ek#*^#R&+64`Ex6FqV1s&=3kq$OUQMc@pBU#*uW_$homP_83=nNV%*O`){rt!?Ar$3$tRs_JJn+aTat>lI*( z^6pGZT5G_}54E)!2G0W)$+SW67KS8<-sXxZ91I~nEi_B6-tfeJ*HQg?*q*yL3R7V6 zBCVMvmBub=KZcpDqG@v7E$UypP+Q@Zsxa}}#1&^I_o#kY=AeG6ybghaO^Da1EA}GPl zTvg?(ofe@!3vSDktSyL=Yi}eOKIG8}3ZR52g5fDPmo zelEyUur-CsP?2%-HY7#2$ug1F*%@lX3CN31mm5z$u9#3Ur$0IpvzadA<)@K6BI z#(m$w$f64-N$2q;ajA>PhhtEamF1IfAemx6_5HaDj{!_K?<~FZ^gA;h7>G>@2$(*X z<7P5WH^_T<{D6p<@1yC7&SY+>Hxy0%{H+H}KoG5TpWbx`$6HZQUyl~4O0cq-_q|VW zktaRPF!kj_VNdU0hsyk*DTSzEDLt~yv zJ8<)WZ04!(=H^H9n3$~^co4~!AdABkqmF`ccgFbEIFGu+iy?r5ktj#Wqy=MPe3q=EX69{oG~>)nCek|AJW5RTDR63Be0--j&gZo0vGM>UBtaOH#OG}M1qW19OHd8y#iRL@POzmU z=dk99Mo7~A%i|>2$p^!QL`DfNL{J8i1uue7F=+12Jn9cL2{BjP+hb>tK;|2Lv4*({ zoa|RVQo}-*>1_b$9bp>5(XY)S}TRUvvtPvYn#5Cqn7YV z4z3`Df+-)BjDZz?SNFM{p_|11#FIs7^r$REusUvigX`SfldAb*r00`IZKD0T3Ea`` z$%-_VwlcrO%X*bTUBA5m{mH>c0Pg#2*;dX<$M#Oi$@V27E#5)xF|+b z^#3XXhP|(@CZ#ZR1%^8x-vys_Jz=|~&>Ckd2!0B4H3KOH4{S(!5KVCJ13)}xao_sU z7147}0fVoLppJ8vvFzV?tV_xO+8chMgDo2Y zD`pW@VJ%l@-EYBBypU9t`xnI4qH;z!UodU@zq;;Mwto|oR1jz%Q8>NZ%^+Z$Mz)`j z@Xw8cDJ}&`@3dPDB_%mNK5itk%pGFaoEhl;dLn1v{{U_H=ZiLAZ%^v`h(MQn5jER3 zHb`saKc-Ca$sibDJu`DEFV6^L7r37yT%$v)5D^F4T##_+>f7AakaB7p@C|7Q-845f zU+T<+rGq|BY)I<3&?;|E7m+X0j_2j}bAy9d6l4JvWnY~WDRKFN3bZ~&MJmvL?yF?! z?*ud&_>SspQElb%m<8SQ;~wJ3erIN!q8*plthY9rttdrZT9C`fr-7!17End15^Z5W z1Pk0h9W+iIcMuW|bzYFE_(oMYoTKMi8dkA6S^*Q;w1^5h%lCh$@p>sOvS;PJNlO!e;p0HcwYTG0Eh8ftArVndhmJRk z6WvA`Dq=-kTr{b7RC z>+lfuFb%lAG!h1AFq^@1a<%w{(hc0_BeF#VS664TY^Q8ANNn2rYu#_Sf6un%D07Vg zZA9p)AwvZH$-sQ$V2in0;~NHWFpfyl@FbC37ksRsmN`G3mpCj>-`Upbp=zolpw z;kiM$(*_B}N7D@qY?;e!!Hg%C7f8ZU-}Xf&kg8Q$7g=4YmB*9FlEg(pL)Q-5eo@!f z*0N~keqE?}#DhprEG>oO(q@@abIKI0M~ zy!Ep%Gp}_AzTIsE?k^@k(hmA=1K>rTxPASea{d9dmu!(j{2PjDN&PyDjk6IBF5`t~Cgq+s*?w*V8 zG`P5lbhRi=aX&d0HDT2O^_rd(*ZUcqaCi=&98Aw+WMVRw{(&Ji$^_u$cNw%4-X{Vf z#YE1@ea-laDH=DC=5law@NFWT^jx)>q?v>i4hpau7)q83cwW2<<4gHPuA=&z zk00Z{WHYLRdLo#J#B21AhcE^c=7*59YHf6iPud0^tZfY|JBEA0c$$+MCsD&*jI8MrO3 zSC5=4cRSx%@zN*9a)g{`3tUgUMC(_2q>abrFN2U=nDOg6eeY@$s6bv&HgLySZ2g)4x=zVL=eIh_4p?0NSrgRL_rmLmMj~#V-FGE!*guG*^(x= zLvn)gm$HudGj{>wpX_)91$1IV5_v_D3l!QI8<{%&`=7;;PztPdr;t1>_sbB5#8%Av=YvWXZ za!~%eZkiih#ume&TyIfVSV_y2`B*J<2hI3RrGET81Bs_GyLjzv1mzgi{-`mNYQKx0 z&eZxVF)3l_1r6blK4127c;`|u%%o*x#FjrGbI;7eY)XVy6O@pR5UVErWEyW>gu`&t zYe+->4|woN_{+X!8J8AWjjo*SXhl&ZHkFu+QbDiOw83+>rnd(o(1?Cnn6dP%D$D|@ z+OZpH0Z4%P;pzTDp%bAhA&p}T9)q50_P{MEL9`gYLm6)S3zV5nh6B67f-%Zzfp;Ie zoz3URv6M`cb`N)SvLd&&W%WK=!=stk7z{tbL%MGH4g&|2Xq_v&70Q6@xP#SNnSgI? zYpbE$I&o)1tEWW&IXV$&VgvH)$KBVDmV(rp@P3|-kps(s(vOcRI^30D4m_Lmq>UQ0 z|4*){#6uUQHeqAava`J%?$~nZr6}LGy@Y#vx>hiyr3)yC15yGox^&*@(K}vX!{T63 zL5V&|Uh+H<`J5JhDqbdTzuiZnU==UY+Pf1jwkO}aooYs3TU$@Z^ydw2#^^v=rm0&w z9`o#BsU8q)6L#VbCE@2Ck*zU=_)TKLduiH(kjT8 z23fxMd^kJvUw?UKD)sM*EMfuMFIj{St;C*p_$@*FnTI(cwBDcn#DgQ_ImN*;I}i{D z{?m`hbjD@X&D7w=cN^m;iC;(}`<%-^qc(xu+}v=Wg`9#~=snFnj5!*r>P1@kMfya9 z!e7@MYRi6|nY_zUOEebny&)e;1wLM?R35b)3;apkIHM*H*xKwjyfP4VFmx~npScO# zALo{2Y4qymKbwr(x14@#@k(klm!}L^QE|=Er^ue?W}S${$$A%$n>b*E@YZM#c=jsarTG9Q(K-5l@ZI%@vjo zHkW*^K-DxbSn7hSYPj5Q5~wxU3Pa~mx*W_ZiCf`~NZBt!JiqT>sC&bugIGMTCFFdb zXxyYFC~Q7^zuw-9G}}^yf>Z2Irbx#;_3~$6l1tCbbfYmMwaco$Qd1AV>OCi~Pt7cR zULOS&jyFF`=m_57;cW#R2dBS}C<79Wg;f)^RUqEJr;(#GJUBy?(#rG$)4}kOj~hz0 zo=(`dUkL#Vot79S^~j%71}QfH%26INc^{H zuiHb6bwNGjlMQi(_NfRt)LT3d$E;WwaKEw+od^U`LFG+pwWZMkHR0c%v}|l|e}B-Z z0y-jVl!d|9t{6C2k|%7^7QS3#0{Oj@G~|Xp6zw=yTk9S)3FxW0nEq64Oq71cKWOrkzTow?JOYxR;7$Q~5<(TM!&4}JSw z;V51<26((#Q;a!3TDDB6K(p`hW3}mNq3_^u0?*jH@uE2sMkQ*xCADD8=Dwf z4gsdF%FZ<#3-RslGw{mZdp|qL-hTIJBHE+i7X1DSQ;BHd}%E=Lj)*C48>s5CTC$5MiRw`3Ror2a)}_7RR)Vs3guZ*o{oQ_g!~M3twh zrJ9FVuw_cyK=P2xdF%dmgn;GLt#wLh*QR19o=R-zxE}!m_pKb)%va2q!dQ$1Cvd8G zQ@F>}!9z&M_?C)kmT#tlb>)^?=?l+0R|40l<`voCAidkP|d%6?=FgQ*(i-){-62BLw zN^5IRk7tF%%nhYR%#B1S42HdXXHyVeF`XXIPRgNLmJD33h8AljYX@A~rhVcHCL$nc z40!PYf+Tsx^X+|at>^uO6x@Guxx>Vb-3?PoWL8anwcT~k&lRB`WpC&uh<|Wr5jkng znBOMeu*|`Oc1j|$(Wh$di0dPe?7~@DO{$4tXu$J~kB@&Zh)P#dQ!eAf8R#khCA9iihy0iLvoZ^HMsWjJqU5;=W-%0J5<*d zrPR$1gS(^F&W`^@nTbGRi-h=8ya4^f-TqyiaP5!6GU1DUh4F~A5`8AsTTzYK*(`|d z?_L&e`y+PF=IS5SUj*A5rn@>P+Sso4d(1f_&pF;AoyxDWlc>XkHT8>bO0zrvZ+P5lQ&H$O7bj877Tt3=ZVIA%s9V zqpJ?T!H0wz2d|-P4>E*K0rGPm2&u7$)!`%R$30D>ntQXeDYfdL9c_*ql1T^{^RD$E zQ9!kZ3URjp$D$euH8xrJtd5R@Y)U<>C`L%q0!st^6@wcEIO-)Hkg6{)Y0C97e*iGt z3MH`>NR_0kvV9*mjkB^UFdnf}G9~V+<>M!tV7#Fni zbO@9FygnW|c0E|}Tm@}lQ3*Rde%iWQy z{YjBxn*|HV1L`pl*ERzt-n9?MJ)yP=Ik&FfqQi#D7Vv}=5k*#okxWptlr}#EmTebm zJTyJDw`jhENK6iF>fFC4_*$njrP~YZ3ut5sHHHfJ21>=V|ItfUahzGQP zRntHjfGO7P7HaQqZ}%VET*bQG4#+Vud=(S~wJO^HcCXJ5FurDZ~e zMAKdsXkQTP^3oESKoY#i*Y%DJK>|V=@Z6t2Q`Vje*c>Kd>0KoVuKQR_)6%*L(&N&R zUbdBNqrcgz*8@nmEBJ$na6ebskjf!TX+I+C%DvsEe5{J&Os~}fCh|6XY_TbMpwB=$ z!pV&kUB&(i)JZhZnR$OiGoI$WW(#_KedXffS`DagXlQ`CTHKwkWoBkFD8`40fLmhb z%C(D{?N{cf`Hs#UXDA@ZSUN_0?Uk=m;I(4glO@T!W2T=5H>!E-)B2f$Uvp=?x~2Cz zYhwiKPU@H{X(Vg(u6$U@YL2ODXQ#mFgf$Haqh@-6hV~2Rqn9badsRt@60-FqxBC%+ z0~l9DD1UVvjj#ViI0Wx)_cE9Iw&YYcT}$LlX!oL++kv1|xg_Ypx?i6R134hDInju~ zPqG7vh_oh9&qYy!Fpa)vq!DM1DWQsd`H3yAaNyyCzAwjn@JCOK!2N7ko*2TB^0UY| z_$Sb8g`3NJMdzd97e~?5@@{bamroWtvOg+w4R!n=X$AU#Tv8fmWrfMi!P+7ik*ike z^EKxo&4$DHd;f`#%;)$!ld9E3HX3uKhY~yl&N!Bs)2P*j>FDm9!s!!y`C6xMi{)M? zg54!$#lvjm(@vZrIq<-K&3PxHW=&kt{nTkF*>=+9TJJBWalR-WWr?K!SX6b{JPPm| z6<>gxX?;m(SBh#>!1Dl7(O~>yn{RIB*g4b6US;e!vBry4(tI(0y5L%~`usGkHM)a#WbW|X^{>H&M!TPbn)cGO=#Qkve()gxrVJdal;0hBdro8oi za%Aq%0~2MNpvn79$dTK5lKSlzzz+DVF**dki%3Y3>Nws@(H*CH@3FQA*M@yuWdt|m zueK7JZJQ5oy5>YSpJK}m53h0G_1fXhKg4P%6e{6+YtrfS)6)okLfX)@(JJoSH_RVX zVzxR^X4>?eoSeu=6bR-a{Ab&(-f&ns6lI|Dh#p^W?__Ny#i{M^(;tP5gBabfZW+)R zNny|8>vJZcuKs65uBlwZxlb*VF2|QIG2`kU#%bR~sH$t~=sUlTAWAjGkA=}?Oxgp> z;}!!<37X2<8TVi!b3$>Uk39Cnp9@)^kxRp7b|SIJ1Q}m5y}9{EHK6oKZoxot&#Wla z_>Ow{eDh$I0CRIX90W9YVjS6>lkdYyJw~e{0&NI7GfoAArSl&?%#Wz;__jx+TGZ6t z8urCBYa6tO(a#Jcb}C@}AP0IvRlaprSK5D2DbkL*XvfLcnndd(BF{Ot^&|Dt?o#eb1b za+sx-TO?6bF%VER@@{1*mmnAWm+OxppWxg) zGR6FaAaj{4-Mvg^XB*i&qZGz(&GpVcqT}ux%t#`JNJu;iPmQ_|zU5#fewnEn(Q(8c z6r@L<_v4(fTI}FAGAcTxD>1E1a7>HMY$*f+xxRMOC{3jL4Oeq}wt*v>laOF~2Cb|% z%T(2Qc&w6vt6rv`Rp5`{N~GYo-%i}2b1HZlxgi+RAa|x$+TZ)wSeDAEG!5RsZ9g&tnEnOFS>)nFB*w`?&_F1ta+5}np?Jzwvs9Z(aX(TW@D^9m)*vzVGf zr0_h};mI^?Rjbw`%qp@JoUP4lC^YHupcGKyzv6lx;UX$Z)derlvj z!hxokqjpgYyBCFOCxtjZe2qGL{OR-+J?gOGemp|tbJ;nhwZ ztNzUA!&S$ixcco>fSf8j!J8Q`k|ah7;^*fFB}dwNDJ(4XI9;tMETre;T(gP8abur? z0Bekp!eM0>uw$SZ_I)Bk&GH@3Eex5miS7f?79mFN>XDk*-Cz_Z%bg+gBkx+I7nh5s^pJH^v@) z>*?xMCp}bFL&26Xsh6>p`N?jRsjjZwcxldg*$$WD*tNh-97h7rTaP#;5M+BuA!ZM1 z^yzE z`#`(rMDBPj3L&>^h7)rB{1@T<$vl)R^p<~TCF1Og*c|*uAO@PsZg7vvasFPW0P$#Nf^Hg7n}eAdCS8l&6*%8QBtrA^>`9Tb8v7B? zFS)oQY`!f|MU~U(>-p8RRfsM+4vBVj13~?HvRAry=&PsOYJ)#b^G))|$TS-0{q*UR7PKT-rD}6?Gb##I5`aN(-al|5 zHPZOwTbu_tm>(XpJ~ib8Beyx%tmk>(Q&T^7kJ@elK4M0vj?fR7$WRSL7#vWHrFK{@ zFUqs*xC;^{YEwu8Phc=o7Z0II{EzeSgz+F{2lK6?BE?BVLqqi}p&IsL+73R( z=paAid{^EF*?4W;rsuJ8A+UmpXh}6K3kyTLOBVloeffvH2zyy{KE9*d+;|)bDevQV z3jV4V><#6gLMBV3?}KIKM=B2*-JdM*)O&-G&fd|%vzJ0ctemq@GmXJWDEE(EzF6XG z=+DLGnxD0_aP3B+W?%`J5`()gJE0iYT%QLH+?w3uwRw10QBneHQuMdz6@6bgRw#Nl7FTv7KSPN5B?TEZ|E2wE$s(N4YLh)0i)c_byo5?JTov6 zAz?~dnoI2`XC#g(N$D1HuO`46y7k<&z;82fNvRGkBzn`Q*vYobvu^uxk5sH(5Vsd8 zMBROr9s#e6kch~<0D(R*h{so6S(qGHnAAa6uWu*{nOVN!V?!fo9qawNy*n~^8$Uv5 zJH%?vUh_`OAhTw1TWw3LdvrKR7^5j91BE8lSrUlk8=W8i`pO&P8$CU3fytrtII6FK zJ`s%c8X)Fz42P2m?*Uf^z3k0IgEdZ(fF{{c;XTyCc45Jn7nlauPu%`@n!oEl7u;kh zH=UrKjLh7K4fiuqWMA+Rnr~_u1$er~ZC6~D;2+`l=(HFq(Szq{1etf@IUfwGE1k&H z|DkdqOW4PDj#z!cQ8Jy}f?wwe3hjEIbD5<6u`0x0fyWZ5dkHGtM7vH~HSy0{$go?! zS!GzK`j<-0s0akw#ShgQ@S#N2-rnC|82KIC4GmdL2sw&>t|7DXOHGxUKDdjg>7H^Q zM41+2QO~sa(z3iDOi6i1_l0G(^N7tnK|oo7?2zkCT$Pb~jyFct61insOGi&jZz>FaWWg-oANKJFuQOkNL$KTcH1~v$j^}zTgWsac zxCh9%h>bQ;KXr$Q&cTrem_ISK`bdvF|8#e@b>i}#eU}nMYl1Ch_fkdrBaBYGN&5e) z>a3#TYNBn82X}Xe;O-vWoyHq?2*D);LU0SN!Cf17cXtVmyGyVH2s!(|_q-h58GH1u z>grW%&H2p`0)l0%U__j`zpsU`^2tnJEF|1EM+Iffx0i+w#ln(|^&SfFXxm}Zumg~M z7k-Eb5a#G2RMOs>2+yHv+cnxV*n=4uY?_<8fGs6GnUs{Y<{wi}2?Lm+f(dYF;`_dm zm`h7j6gvkCZ{`T!MPQI^xk^M(?d1LX#d1^DCWQL!tCRC<6_cJiIv{C6zj;GUmYkKs zISIpFL+f(x?&?~XOom&AlrL>$Wf|2Y>3ezcE9T%apuwi)hcM*p&f3^)KfhdKp+N_h zNk}_}S6AH!kK#P>Te{hH~)ceIFFBLkC!@6I=nBn3=K0u@aKTo z0ZEh@s+MqrenSJ7O~v$1_7Pj@AKtwhA_f~56_^YE%_vJ*d24v&>hs;v&dbwGPR{if z#RO2#UArN1!O?%l=+}{;!Z!9j7^4Xf=hettDOxlT)Toy~4W7;D!9?oG0n6 zWFAyqI@yu7Pk~Z|ieMFf<)?*G$GL=l2;BMZ;MvATr)7;rJ?T3_1;yQAnuImNeM%7e zv06)bDdFSeV-~4n*=wQ510+U4ux@jIyv0Xb2YJL+euwzp;fb3&z}To`wWjCqt&(puIhGQq1xm<9yZwf zdP}}#%xbc<7SYI|1hZ*kMgR%yCnCzW?H>J5Ps3E`ed!Yd+(OK1*DIs5L`wVZ;a-C# z{W~w!od^gHd?>`vo7QEd)y`$GS?IV2*8Cr|S>fgMel(^JXx|#7)vcq|8t^HFW6lG#~l$O5)DB$cqPz**MO>xOO^QPkBdgsRp=q8(mj}$)Grro)* zCbfO~(>oJXcJa6-t9=$ax<;#GV=Dum6WA+-*tj?W7s+xvTYRFc)_)m-ucQl97wbOJ zh-^qPdPqv=^zrwrFz*~G)?N;oSFv3Dq* zgRISFiSqMN;|m}?1nuk>j#J2VYw1Ku5OMrQG*hzku?T3UggIgE<@q8KA( zfN#-5miX1^j|&RS_I=zrZ+X(KdZo6HSOlg}U-Gx5o`=SixLV&%HbXybGckd^uZe#~ z^ufZNuBIK2JHq6QGh3iV-mGtEBK&eAFmVi;r{qH1L07Usxo%^_5SqB{gMsE*wYFw@ z>4+m$S#D2;Y6H*P)9z6sI{mwkje%3rVwFP=uAfq9V3fpM!#=drH=y-Y|FUo0q3jDI z!Xl%Cya*#D9+~fm<*DnD+X?*##1FqAYZ(p*Bd|`9rO`1;vFO@Ua_lh#Fl;2fU(~sQOV>kaXJ&U*i@xuxoEd42pd^#~JS3Rs%j@mC3sFQev19OA1$}GZ z*J0Ag&WLDa4BhmV{%k2WiWgTH~vpw=Yz}I z{;iqw921TK^Y`N@&*7VJPIb+{zP6~?s&4s*D^5~qEA|#34TG* zk@=@1I;DT*fN`0TNKVC4#aVZeuyynNGa)G-16X`=0*FS!+P7Du}oVtsNuPVJcvdPj_n44 zG5P)94})LzWnAq(s_a@1Lww5J(W<}o>8u|)6(sjdtBi~}ky**io*UNK^*EE0hS4=c zAx0ry_L;SXR6-JV);oKJ+(S!Jt?ZA`3}L+SHbs6@MhGD%{JAO;%T0<|cDNTftahMe zMdjvp9%V=uChf7obPtJ5(LN>hp^dYT<^3P;rz@M>T=|uiI}z#V<`qHbHNlaQ#*Gcn z@dE<<31yl*2M5;fuBCOmuM{DviMcHvsU^|jEt#27g-O5K`#_4@9iQXEvchv)O3%z% zRc@~Q;a1khc^@#)(I1*Ayz`26l53h$JmXZ;){Gn+Icab;v!c$?0O*Y@XzGQPMCwg!n$i z%hrFLF)cnm{^*(1!^_jV!#Sf&Vs&>6(+bT{r>vQk9Nkl&ee<#<;K!n+m*^N@Ev=hP z$N7-H-zAAaK#Q|@lYi+z*EEw4yJ4k>o{Gg_Zb_pqp^F!^#!2K$NJY;ep$9*dAx%Z^ zkWJ0I-Bo8P)1e#caOX;9_`3}1TAqBj=wI|OLBYCuVYYbdxpurmbv^qg`=T%`|G=?k zH=DcJp*ID{3`|ik_G6-HUADUH)|*Hu1aCtO9hb`cV+iAbi8>`=m8mAA7^0bST%t0e zTPdxud3Klbk-|flcLBwh4Z&5NRtFSHKES?%i+dBLRIQwl5Z2HGN4| z8&?&Dh@_ex+Z_~0TSXivGeS@QeUX`-wh@Gj!vel)P-n!=|E22)wY9GeE~)Ki!{o4~ zELe~646L*W?Az_O3mejkYGui{u!s?Wpg&vG+S=O$7xS4TnM3a*Vzs&en=_B}2Q7Z?xZM7H;_?dF z-DD2G-^B|HaGZV<(>eoEwildyY|s4|EsvN1#;~KOAuusI2qD~P4Y;q*=XE(|b0y@Q zeQ;>_VSB#)?jHL`uwj){t!^(tWOK?KMl%;*4XBH_ZpkJAsV4)OcOir{|TUsJ3CN(#v^vp>$1y8H84A1>+HZSNn{`TY2 zd17{{^X{7;%DHoO^P^_V#oJTCuHn;aR#nsEl4quk6wwCyu(uiaFz>o-Xdc( z#&U4gZ-NZgam;I`$o_=0Q+u!=DOM)VvS|$XIDM$G7i)g%GrLzy-`Pqy;``%VF^6Dh z95R8696>jWvd@9RHF7cdj~Bw>qvq@^j^QRk8hJ(#y)R~~9J##q*dmL#%B5zB*+L%L zhOD8EEH!!JjpgN*wxgkqj|6vloXRyc3TA#$Q5R!%e{V(}@*bKqJUkeug2#_?-06By zXn2#)>%{}$(u#`etE#fU&xXFk@;He|RWIt3J#BPMi67lF?#5fFcXvPWy|6Rlfw(i{ zi(sy_?YiOfpdfy6{A+B4it_L$auipnxJoe?pcq+Ki72`XT94eo*nd0&JLS=_Cpr7G@7qvKrn9uO0_$y9Khz zR+#%4E8GH8HdH}oBTUMz6)WqYpp#o{cwlr0Ck{Kg`Xm&AXCXlt$`FVdGJMJw zUw0@AtkA*A9D!;dn`WTzTw@y?p{iu-v+Jg=&|1;g2Dh?9V~$1f{P4Zsyx9@-=w122#hXQU z75Za?&%O4xI$P-Qc3(ahYeDFh}C}xjP%J64Z4e2A4S$Rs=SQskENS z4Z_7(eE0w#BDL1@`Q^%9Z(#-dIRRZ6_cBzF#4zS(q7JrB`box*MzeF?$~yLTmUi*zs}L_#8fQLQPc)p>j!S^<3)L~*`p{iv<%+CR;>vY%>!1$`O>Z!b5!!SMl$keK?w~`^% zy*g1U52Yh38!$I4Gf1H^HhK^xTM5xS0+b+Ifhp~V9T*_=5rSS1)-+D2dmn)bDel1M zBMmYq%WlhU6f79coj*l(ue7`G(&+;5#+M)}b_EABp-ctz5+Z$vZIcZ)th4P`RzQo@ z|8?ih-b64&X&0qdS#RnA>$t#hNay&jI zATGkI9PeR+a{A=3ZTuG?-d9WLXi%1eyS?FuZn90R>ISicqXL#XY;pxl*qCp>bXE*; z@o~M!#)GEc?i}8?4Oe=o`)+(pWU0fOcxni$9g%L4T3Qo)v?zKjq^j>f+=)w*a9) z>Bx#fR|3bj-`PNJv$4kSkdBmSj3pjWz%cY@xfdg{&HxIY-L&qUjcd@w!wG7&PMP|h zpox*ejdbL}79Dlu<_fv`Z$x8Enxc*6Dg&AbM5e=l_jFo)S>=K_Q)fFxb9&>J{b-Eg zAA`3L(7t|*C+5cOss-6;q(e9m>a@55*v)(1PPBXwK;)J&AHe;&XEl%E9qU;z)iDti zm#uAmVxf^L$T87Yfk^uK(3w=$i`6U9UYA2l6^})a-6)BOmAcK@jarT9j(m$F;;T#N zv$3fuxW0v^pFvCG-hW|_*c#G{@E|ie!Yb5U9sKw=TDy*FGV=?)aaZEaZ&0`1FlMwJ z4)nD>za(a@KDg0&EGmgUx(^~_e_x(HNN53r19c@REa1GL&_}Yc+WB)AqIK-&>L12bMj{_#m%P2{)_&M45o z#|v~ zx4%5O*({lnQ(*<{G$80Wm-odXWWLp$_{GbWbuwRX&1}*lq*nf^HutK}AH@1?Y)?Qy zfY){kCNG?`mE#Md04D>(gIcz?dHYwuv|f>Cjz4))TTp=J%>fbm=;VpzlPxaiy>~}? zH1cEg=ekt{W~sP?@xx0jnaVKE2P@(u=hMLtA#aFmOQ}0TGGsb)iPAJ$C^a|Hl84?4 z=bxBWgq24|ay*|@i;DmFKg)1oqoV8|60NuBk>LfL9gOFf`!c7=NWGIEs^@sZQs~D* zNu;r;2dVQ_-yMt3o#4abRO&QqX|-*^t3CvP>yZ($P;SR8k|O)TU<7?#T`Ab*kVN?_TRbsSCb+tcBJLM3O{JcIc7mQV83tyvP)RFpp)A;G+!jOo-E7$Q{ zY}G1JuGfSJP)e?a3lxp43=FU1t*Y~s3j#77Gn*yreB;tOX%nI8Fhh$`mHaNVuw4C+ zG-)ECM|BSM;AIY4Y-&aHJ!^8IkJz@}5GWG4f~Y#Y;m@X>bgL0XQIRX^WH$nWX3s(b zCeoEVsECyUmR$2M=995l2P59IbLZPcmYEr}LGEX-DHlPPK7UWse_gHqrjrZDPqFHG zTE5?%JV$g$$V$#G*q%iSutl;KJLTwnaKoC5R z6~JuZCKhRnJv+^eCFZVNoWgk%4tkYcYliPcE-FgSm2f%mOofcED7&x83qGU~LQ5(K zeSGcBM0l*GiWAQTXL7lBv;Pt`uZPHCBxjd#bvM|YQhc2_IMsfS!m>kH=fF=92IPIQ#lA##dK$fK_M7e_^ezDACi&)37*#&$pZnsBr+!E z(MpXpleyQ~1d8@Ax>5G*!axP%r`m;Y(~Ti?M#3!XHmYDXFB?ZC$J@KIc8;w2z>8O6 zIh)E~QxE$@NzF^RM`}+=c4wLzx}$7YgdiSXgCj;j&&64v!-QGT_hu*F7|pomVS6f9-0g4zgG})1YnuT9!M|bMlgeMR z9n-nxe9g=TZf8qcBv@(XYQzUPcId;nfkzse8AdOLgK*&K#B8IjdnyQ$8tLEiDS}0aUA1)r(A5>{)z!1^84FFG zZ`Y5is@Iho#?km1N67?o!*;iA8Xq4wccBDI@zbj-P9XuW8WOf=6ckVtl73l)kB`qg z45z)JD3vs}+q*kf78W?uSXS_*qOlTBF%uo_m~ZE$-2)6m94AtCk&y5(snYs)n=Ixb zwO285K^ktS>LlV*f96bVV%ojpS~_@pMaaw1Zi!_~?bH@?%(h`cI>&0vmGw*}X(X$a z78qFqM@sFckx*yh?w|bZ-cYq-Kx%V$FaKFwh-aGqUo8s%W_h?32Ab{HkdR7%XiOXR z-uJo5#P*2DB8x_uDAWSk9Xo71((DTH+Q^<)TA#Ns`}%Boi$}BXBjpaMJ`*^^g0eK4 zVpXmE2QF!sCRq(jO->p7&Ybm_3TL*hW-+4+x7KxYqUD%LJ9-Ug2!p8G%kTDimJv5} zqPA(xnbpM}4#^eUj{eq>$~MFzRYnKfvAD(`7QeSZGak=vvpNHQqNB4>y4*odZ97Zo zhXMXFNGoL;d79<)n4{?T4v}KXIe~-2!|=4$A%1AOHSx9qkq3g7LxPo+Ruts6h=>(O zM_DpC)kjF#%l<_>PopyT()Fm4q6Usrn&P1-R-@<=L>RpejTYj?W z%p}WaGixH5e&dKoOWN1Dzp7QH4C!0#3@|2_22*M%uo>s;>xH&9Ty{dqNu$NRlwCJF zGL@CTQygc<`(?vgL+br6)@W8%bo4>$phjDL+gf4P8S^VW@xGtSqSfM4EhrXe31(c= z$AS(W{RNIszorYV_+u!u5#^lpR-xOy4%ix8_RjUQ)Q(zp+0yk#s{-{Fjur+@P9jL3 zPF$U6&_Ff%j{-)^T}@qS4koK(LmT^ni=uxnLj9!2*ICZjImhhtvR!0*9bdB=g}!RS z!&TQ7$3!WGOZg&0extLw_S01U`Vn06RZp6sXblbxb>}1G->J`5PtK*WM_+$sejj=0 zyoB$^kocM3QFsyky7l6D9#uclj*bSwWYpgR5+XIf{GRKooG8ttaDOh}gn^uR!q3&f z7*|(j5dL-0#+uBOr1HqIzn~s{BrN%ZB)`6Y-TSJMiYCf$_qtZlx5xi3g;Xd20RglL z8v}4TztHr_0KKwUy?C18j~Oy?$|b4k|K=3HUZjtl=0-Xd&qN%|Qu$A(ixHuf%MMo9 zJF4>X6I(%9t*x|k#igZ!P+{ZJdtI1dueUC^uz{TDN4V;}ml5L?RbKud7dWMhYYq3y zXm^|EW!YKk>wc>BT@&6hhbILedgo1BZ#)aMfC zV@Kr9?Cf~Gy*VXNnL9c!)J=x{Uk}l1BA>)!cLu)t?Z){1s+FiwFg-jt&KNTpJ&M zl5;-EH8NtkE07=v&t@=)zHN{gif^LKJCvp;%#e%Qo{WQk#Dlt`bjZa%owRdpGGZ2P zQ0olTc2{*g(?!YJio#0;^Y<0;mk(78CGNLH^I-(gab-{vq58oaY8U{(8ARKcr6p)> zt(i*Nnp&<{^J0%2n8degV*GuLdG95lf z`%_^gETp(3+-OqJNX=6l5+g;xf+L7GEY)paVe&Tb~vsLRt^ zy+F@3>FnTr(OWjI05m<-C^Z$7By(777dy^=q$qfyG`Qa6U;w68uAT`FCT0`((F*_% zU9dZ@pC7hlp6Ws2FizC)D#Gd{3O04NK7Xs_K?31Be2qg9|GB_u;Z-+8}#fzjyBXJ(H`tD;C9d_{L6u^#Xjh!2qb^2SIL;(dQ2 zY-+lHx@hOMe)hZM-_YugH&%frboIXunM&j5z9?b55zG*LK-Z}A%WO@vh@dQi3cYa& zWl^DEaXQ-dRGsW^^U_9CokZyS8J}IDiheqI48vxX+ETCn#LJ)N!Ct@!eQ|0~W$p(J zE!<>OoZbR|b($c1*`P+AbRLPXow5-slX$*yAz+QKg4{Iczc3#^z=s=kqf(i*VWYp@ z>y*s|oBlN2_mh?|h}=PED6qv0(R-R;VOp*3N#z;Vn4%(V3Fmcb`4YH&aiq2woh6WN z@UgPZZ?SlXL?xhsv(3(**UtT&N9x}qvBhj3LXS4twHOSQK)!0A{Uu{Xz2K{;7zt=4 z$R=%dFnJiPtAdnWLnbC%1x`NB5J{&akO93eKMh!98Xh8{y>|#E;HslYNbqkb5Eq`9 z#}WFRGBRKveuPCLpLn+TXQLe}D{FRUW{qK^?RL-SYyo#`6K9DuJ~kODt0hp$K7Q5 zVGcSU0w_mO33oC$nuA&nA2l9d3=ZormYE<{4<~_RQ!l2Evf<&W zO-l)!^s$Al85rcQsHhNIj2=V_fYawtn*?d0HZ|^Q4|?Zm)*QodIG-+>?Fbkyo_-f& zIvgehQP_QzS%g?x3h{sehGvo?EoR=I&g-7RUE)_nLblhi@IvrE;fT3Ym3m-~0J16I z4;X9sj4CIWR>5qOeb|_%zb?qXrp0xJEzL!({O*xuMMkL47)% zaU!XuEJu~r#a~fEYRn`b_`bP>%K2c-=IYcq7(O@5-8WTjga+z(G;8VDjD+K1IGGzF z`Hu-xrOyT|{GDoI0{{H^lLBwE-uu!>QSax>``!P%jAc!Hs1cjE^AI8Ylpz9m^TiBe zF{%*67d&{lLh5}jbFQI3%|Q8{P|Ra}F?KO({_R}mWr~X1f2|{~kw}%Q0cme}LokE! zZ))_LwfLddK4To8DUZwBQa>wJc~ch`3FqJGSVSudebrP_etNdydl7wyXY?_{?t7XK zRt@)%dp0`Lb{ssrgr3Ni%~t1)z*LmSn9O=Sxcj%St*n(6 z#m>;q`8lgK7$+(d+cS9(HXJ7AgS3(*H*F$18RPGP>Z~mD&!0mr$Umv)NTgj5f&}*o zA~eXo%F3xo^jhw2g?gT5wk9Gs9Yl!- zDvB^uvKon4>(*Vj%%+8LTE9o(%vujl)oEA?c+rhJyfdCqWm5TEkDNF&UJeI;aMRr}HOt~+xF7+Amd#LB zl)Y!?w-pkYd^K!&Y)jl`u1v@i^;#>xRR#A8oX+DZT-<4jw%h#r?NG$0CqJw8!^C8H zy2GL~d|3o zuFBp=SxCxLqM@s+oiG{aE8F2wOLy6F$E!1ZBoT4gLd73))Y6?anpeh$N|F=9htxE! z#IxCnOJ!8mI$8VG7Pju}f(RP27Il<}QF>k#vq`6zyHQl}jDRohsww_{n+xloV#YM} zXg7=7=hN`ZaPW(@e*HA)(Xj&cow+b7_E&N)-Ly@KaFC9(z(B+>t97`Wgduhj(b1$L zQAgJuYO|Jy{o=+c{HnN7#2)M<*$4o zY)XK^eiq&0+HJ#Epf7kh3MwsVV-!N*6DNs+2Mem?TkRgby^X?0|3tr?=i0Iex8l?EXxL@eRr5#6D2Aph^|rRWv3Q(HwG}^V zs*>kE1Ss>+Ff%g?guqC?`yp9g*h!q6G4;GylHB>&ZmOy>OvY^QECE>^9ZgDJT-F=i z+-zGs-76#^M=yX~y?wgBt-rnD3e|Vnu>T5>^BLEEV4RQ1tK9K-a+r7J7cdh=tB7{m zZ7!(2gnor%^W^(nggkSuCO|2Yu581i1H*;}pPEec$`R1vKn(p}ae4tBe(n4o5+={| z1~5lW9^?@~CQ&N5XsfHMAA-Akm<=~zCjDEXHkRk^w`=+^g#5y0=BCTue^5=m5CtXi z*;B!lb?pER(8Y^C@8fHMnm+FlM+Y|XvIHqftf%D$0lQ1lH+%sn$IEn}MVDW7oS2-9 zHyd&pkVx=*s!-E>YTf?;S^UpU&;Iw%JrDVLq8G6=i;ETSM;~3yyI1CW`LD%(Bn3KO z>wh0nssqE|N(caRVR#lC=esGoF#KMZ&2_JAZwn=tKUY6_R5JQ1E1$n7B~4sL0^u_? zL-e&`zsH7#q$q#%`q>f+_8B!unN8pd;*1EtXOsw!;+`ADa=vMZAtB`8sy_ z@&7-pKG6HoD-z6#5BAE%eJ2075qOWQldXulx@00h4IV;xsWo=x|FUJGU^ff6kHDJm z@k`a#7ybTbiBpot+arK3zv7ZYsKu;J$U`FPzrn=3D^S{C_>M^$5sJ_>b>AhHvtbYV z5fX;toxIpIgq^H@ZRXmutH^T{9rhq%sjR${xhX&C4G+1WO4liOag{IgUaQ;u!oeWy z2Sw$zs}nFLHg=98fGhy^dS$3JVQDL5yw>T3L^E>OS|{+S>fWB)Ut<~C7ZO~XshoeK_=!D;7jZIq_~j-6sGtl5n@ zn06OeR8o)$y388^fgpG~i+j}fkNRBxdPrD8g6Ahtx5N3{kS1HQGF;5u;P#20CZXMjBDCx8nYQPLX+nZKoOx6$v=<)nVjVHb-=Ws)?oXRlC ziGAMfFHsNQ&i;m)Q{7)HCH_?{RP{Vu$fL;`LO-W;`IHKa*H1`?_B2VACz!+n6Ry4H z%sUuDu?1{Or`~Hw%Bbe&#Jl9Ly2l)fYWMXw9TypcrC*W0{A1qg(c3f&8`h>yC3h=A zo`?7*XVaVM0YIVbRZ+O=NB7B<8rafrlRwlMMiD0_oW7aeB7%nzfBfL}=s_Wu_g}Ov zAG{h!Hm-ThLAw=d^R5e+Lq&t?snooFfLELI$-)-V7{~y&Wcnt>8x6T%`yhfglE2FygewcCY&2n4*f0 zoXm-z%f1bW95X@*88a^U0g(_AnYb0>k_N3=_w4^UAM~f8`P~fDw;bMvtuaqmjVK)* z0d<;h<7ezPv@G0#AxWphjW6hzEt=4hjUP=SfYYj~(e5)C9;4N*EBzNeu57RW6CBkGLdj8|F+oA$Rds64QMIa2#vaFDBqw!EyOaqR)b>&Zy;Llwr%{|=y-(brjYFj^r5!QOHEClrc@FIZ z^WIUr)$MojX2_v(uMaJZ699#RB`c&p55DOhy~Z`9+3)VCC!*qng`q`9#xhX%qc7BT z!rCNubQlc7`$Jjc*#F|-=bb~%8=3B>J%`o(TYBXao9*ASpOE+uU;XNu^r86dalU73 z+&8z@ncaHl%x*R@**G~l4OZ{O>d>B+#K#WE0Ko5O5&v24}tksp^jsg_R7u!$UgXqB+Aa$v9Bop__?NpZ;pfbo1a0>1zn0!zsXXo$xUVkus_=$Qg0Ht|+1< z)!&YQ3@vM#yuJe1;G8c(!U+0PC3r_G-bav6vpMVZj_)TGz{xszRs^YhHwW~LkVv5# zxifBhWm*v_?|51d;a3jci#JDii5lAH>ex!Z?bC(YdXDR2^ z48(%3_a_>Dp-zx8b-|I4IIup%YF5N9z7rgu9LwZ1wy^+5msqbEl8oX~7fKh_yrIrP zBDKs^R$T4o79X8KmBr=d)de2HsH5ur6ZY@YI$!>bDF!j3p0VVuuWLMA_fE_bZ8vsg z&GJg8VfQ_q0g;eb0oy?2k`IZpB?h)fxXdo!5qdlLbPbz!#;;^ zTT5ob0MK;@lS06^orqi6lHvOWf_Cmlo~a=!P;PFng$0UOTZa3u--?-SLJL5@{5Ovx zHuzR9HVK4sQQNm$o>NZG!NFw6{b%Sd81y-vQ$c|LmhuKoTALF$nEw#?hg+v_)O~yD z^bGa6U0s2YF$hI1zA^{lBsMfzwP$(lHxaZ<3Kbwk-6Sz#YYWXLPk7@4VPCAY#Zn2l z!SRv9j2^C^j|)cW((j#6=oxu>UamwXFli7#f%v8L`iSw9*1sNt#LK^rpee#(QRyEa z9o_oq0uQVcW2kSrxX9MX6F@Crq+5Q}LFq%4mw~$lAeDR9-vM{7xu3G7%iMeSwv^Sn zKZGI0d6-(oKQD2EONeQ2&j9nx9|=m}lbRMMfh<&1RFstkcr0;HAoMpk76jW&q1EnT zFeK87%)G}sVt ze*_R5K^?t5=E};Fu94iZ##nh8IZ7}UJZAbcV1ST*@P4;Rb^#U19oR-E+(d;hw&%m5xiKPV&QOw-Bi|X`pOXr6N9yn zUGdce1)o6t9hq2z>l#)4!@>Bu)2eHvHRIY=KQ`E1V&!|%Ya&cF84vLjw(SF_t#t6? z`KlY*_QY1jEKT3uEVZoTt}+~e27UkDFp?_pi^WQf@$9EhSExTjVYxdz_)EVJd`;~G zCfmtL3yHyBEN9r(m@;yMo_;o3_CF%UJ1Ow7#mj}^AG9J+`|wd})K=~>Z+B;4UBLbn z%VJXONRMgXljwruPbc>-l|J~RCd0I0=7e*Ygt!m}-!kdU?~ zz~)dx$b>XdO!oFoxPz(C!kwP6`1?nC7>*^MtAo;#O-K9Rc>QSrT=?-}V`JgKdV;ez z5PPQc=#m2&DA34&h+u}fxw+te`d;5#^$cJ`UN6tx5KWCziTktlrB9Sq;(%|JzAN$v zruOB1c^e0t6lr^4>#5|^BM!4Ll_7-EyxlL(27V6tT8R#r#pq*}pgt&4X@kFgEiHDP zLNJY@YPu@VJ_H6TOG_8{uCL-01#Bx|YllJ@V609@;-FDcu|ScAt3uc#Da5RgE+3?= zefA&H_Cj#I^#us9**=IcVaG=aeA@K!4aBv!leUfg{EaA|MY0z+j!{=vH+pbO%C!>< zj?I-JJcTF|0bo4t@8i+b@Zp|@2s)>x1;xlS0Z4rFCK}7+xUc3kG(UB!YGR^i(6Zw6l%)6HTPI|j#QYjq>bgBy7QAQ#@DczuEtr?R;gM@% zZ@FE)^(9Ts!Ze-^`}GMS01sHfR8H;A9r~M5sxQIm4yx#s0zEWqXVL6y-LWzZ^QR<0 z4)})Z#r>+-Nvp}ERm?3 z-`-BbC=Dc6R9BBC@oEIVwn^~dYS1PERo8P-Biykm5-j0ygN*Vc6G}=-O8z`(jn)Ss ziA%*b>FF*3Xi);PnC{On@yI%ED2>KIXk2MiVgQOUoaEbYtDrY{K2jnojqoncI`gL& zUt<_^MN9x_D6bGo=+|9RVgs(y{oxO=J1nqh4uWVC`+!sSYO5QqGq9-e247jd7kUD} z2sLhvE-H#*#+TsbeF2cBv^Yg$ZqYC*2X!zG!I}&(M}BKMYV?f5L*N@iuM{JM?|mT+4x zT6c|;0p`u*`z(v7sHm_oLEK2Fq@${;_NQNQK=g`19YRuMb>LR9kaBNzyK5Dx-+q~v~<7I|A9xCp96ETGORyJO_7?3 z(f0ee;K_Ygb@c!sNEa3^!G>mejXsC3m(VGo}wXH0XHBqMI3kHT{E!EXs z`F%A$zaqn;F$C6*T9^ZsLqYy`%SeO_T$pMYbAV31y|xC@(?eXxCg*aWobBB{4ZPWb zJ+H$aE9vP06uUmXufJlx2~i=})&c9926qS&+*yK4fIx6}*Tvl}NRZ$TyTOCIy9R=cOsM(zhj`1pu)hwV8}>+Q-y(n#fI7oAK;)@3Eg=f58;K7(u^^d_;Jq_&%yBhby$#Ki(e z*~HqxjZINfozerq_Jxg)S1`~321a^B=9`$hm*Ht9vNoQ~U3WNaSO$WOEKWqCE0GK4 zULZfcGUNjTrAlz3>li<>>(^)^4r&ItL{BZxdxvv}>C@HMcSj-%UpS6Dcyzh@`SpE> zw!!M_(W_ULp+-l~%O{^4oUgQB;}AG*@T5lmK<$eF20$@R4o;2|90TBH2#qyH7RCZ; z7FHeZMh3d@;g764da&5|_)v`3e?uhe?6) zhZ?y`hE~?& z=$x3C|Kc)_9yg1eye;@=LvN1YL8dQ6}l&esW2ad}07hkD|Lhsi}E#vT{@zNqmwz?g>@uhISc5o|nq}{`n0$ z8uG`9L7^yU(_+y7{Nw^8L0(QB1D5ND4p;a`LJ&ylgtoWsyJ>0Qkt~obfOKH*x0lBh zW*`ksCB$1(gLr@c826cD5H|)khcl447h0wN+xP@&9w$s#q-)Qxl_ed$y2-Nhmtg** zhV@n{>W(QJ)#;hrDFHf}xblTwDgU%v7ss_}^F?Jri99Cg7&0&*;pJt5t24KjDqRp@ z))sA8x6q}@Zx4_%*k-`o2HfYQ)Epe#8*T+d`ITe!9V0DW%WvJN*xob|dKHb?HO`EY zD%iND_!?RFrN|axu%o=1h{NbK1^mtiZk%~Q=GPPOX`L@n&YUk0eD7#Kzxd$;>gKl) zXDQpA^^bhnYjkWZ(dqPqmF6to&$U4y7-m7_Gm;ehDI|tgtqsmIyKI%fUiFFowOC-P~syH zqehkifbM9VOdJ-K%n7j)7`nR?xNp?69mGD7Pwgsij{Uds>$qD_k6g#&UH&?~;puMg zdWXQp3FU%Y$mJ^-+!*!^4CYaJ|7741RxWydP}})IG=142)Ia^R*FP`atcA)ZTxT76 zU$402K&;AxFoT&NGAO&=C4GgxzqEO5EDQg*s{jkdOJ|PrGr@nXQs7~K=Q#ty;RW-r zk194@T|3@nEhF&D3d$U@Iz`$|TD@aJ>gv8pCsHkB5Aep!vn2766bgnI?+3(B z?W?=q?`F#sEG!;NN)QhZ35SQz)|xqmxNn{vyI#)&-t#VZi&_@EAa0G|HX_uEjcPJJ zOtFf76gkUu(Vu8 zO?^d9F8AsXZ}3C z|GWE~6E>;?Zr0Nwd8JnAa+7%=LB#i7p;qDkL`sURqe*UmPS2;3VC!FvuA|1$vAaB~ zhHj@m7lYxu@RvG?*)jcAa{_EJPm#cnpE^fJSNrN)#Il5!JN=)xJkQr&Ex?bD``M23 zv%5Ol^;cJKKSOulIY1HP?pxy^N51u5l=YkR|3LY;C*96D zrMcobg^Ld~YO=jdO}P#=N2Ks*E&sBIrS^NjMJ_TNzRaGk=C8&#Y4HP{>|+mPSP_%6 zpY+KwX->rD+Cnq-6)gW!CO`bO@@@Y-#=FROlk=IKaQO`8^hDX)#5xF91T|`J6Rz$e zxiBJ;7>16nzr5lU*5J>>S(~Ga3y7C@aJp!DEOT1eQ*oPp1hT!{G;;Caz~Z5*&VU9Z zl@Mc3an=rOVz$FbBP09X7P!VPuU zu=+FE8=Lj=gpK0!9`S>S2QuYg0;3j7GvI=&K0uu4=DURslprf*lLVOqD4mOn$gotL z4m30-DA+t{9eGKGGD@<*v20%Nn*&UPssG%ps{=3gU`4L7)G0wYe^*8U7VR>?UW&RXvD{sPWzH#G(nhJ4~-Z5jz zfk+m$258s_59E0|jBan#W#|DbTYGmIe!l?#1TeYIp9}zS7LOL+T0cNGf@?1gK3<|B zYX2RJ=5%$7sSb+r6ZP_sp}WsgJ>;SS!&ZBJV5@S?v*^MqQ2pkgG)ROhokYr3nJ8EZ`usfQ_ql7 z%`gk9H-1z|ZyIMkz4emZbB!F`?`~raE1pMy{9@fmP1(i9>L!okCL;D&v7+jx|CN-o zjlb0k2N(|&5GijiT?o|`CU(Xg3f13I^-JL$NJW3Kw(kc~!MWa_VYC{)r#psCPc;JU z9kBk$Ng)8|0BSlq#9}^Vf^Nk!vZy|H>aUy!PlTp5`?t4Bf_!{}FWzLHPJEUQS>e4M zB>UpU)!z))21cSzJaGLmK7L%UvmE~v@FJFW7p>(LtnC`mB%x5CVo`8e)|72J`tzLJ zmO17q9rE;DYouQPOUvs5X6gj@3|Q#g?a1Fu%gACWT{(2%w@O#mcI6=(FqCMJ}UY zVQ8EsOalw_0H~>}t7~g}kvgjr;u|E#=j0=9nZ@z(ZCyOqbJ0Kv37a!Bqw?uk^%eGd>d9lEP;j3IQkagctSl-jYW#1X+>#P? znTV+#KXVfqE{?!l(B2+UcZNJ?I3iAIe&$7bl010WwV}RJzm?lrSovpFm7}!u;M?o- zp=u5asuCiAJ$q5e(bIg;3zNh31T>ezjB(R>emK3H_ose)>jrdvbD>NL57b;DCgO*^ zPR!1ZQ`diJ%i1{j(19mQa~%@HN-yx6KsVl^(x@%9+Hu|1!=o0J%9y;%Vbv=Y)h6)$ z>hcl=6Eij@#)1;?`ue&*?weoW&9zUAT~n2tn`&sB<0m`p5%yJ3GUeg1M44_HY{3Zw zLq|_f&(0nf9rQ0J=j}4jTnPc;YCJQKkaXhhGi1GUF4if_d z(U@oiLRh?A-W(zYM0zHxGWh2i!zO>=W#YP>`o(3j$EzE?!_)73P3q>RK@?%8A~zS$ zG5B#j;4LXV9SstHc-&W5Xv*Ibfowv7hPpTHXul!lZDPXS+>($Yan2y2f=$LzI{;%0 z-8|_MB@>fG6eNIS2MV`{paN}(3iO|em9Vc)x#R#(gH<9Mhdte;Smwn!ZQq~B!6293NYg^l$E8rx=LP6 zrwa2`3SbqUqfL;iUQ$1&@IKX?xi5%e=(nQ<)pa|^bL zf`8MG?v1zE-R#$lq5!)Gzpn6PE!6}J#QspFaRO(Ha((_xB_g7xbWVtB>lzhv`VdR* z?Ch*=OL{&K9~dZ@PoYbS7L`^+U-Pn9XX$yez!`=*48h~v-lA)>P0MJY66Jtyc^atM z>1r_d@>>g^Mr03JtgL77H@anquSk}qxmT*aukqM}{;IFh>wPle4F~bN>`2q}O-@W; zIoQWUv;Ry$F>H+1uC8qtnjZW$CF2VjNW&qM*IEA8g&@F3SwRfS%-J1@NW&u}JYVY| zwFvW2@0Xpju#A5N$5QzE6VG)}J^hqm`@R}7o3W#N4jRbNQu;N|t-d#7*!l2f7+nKc zT3YHNDVb2JAKpi?+9}*t9$7rPuS9-rSPequfrBdv3i`+Og%%8(TVvjh@a#>PJWm-Q z^a<;NAY5XNSx2_Cvy;MN4^8>e2iPh_xmc9A@6Rs@a<#x3A<4i2NdI+Yo{wv}AlaZbek_TJpuO<41bD9`ab@b1ESlxa*ka+p-S_?-+N#JwdHwGEue&b6`ZX>acoa~q{XCEGdq)(>&WKIpkw*nVkGUJ%;amAesk zD5Gbmrov5C|N1$f`*o$YgFfTr!W_~a5K2l+bt?Y}ZDcVXD;aEU3{>6C`U3}D7u%a0 zzbm4{)5c!h>zU-&O3O&v-^AnKA_5g1T=m=L37>e9se%UJ;EGa-1s$l)Sy}`@DqOCR zUicwM91DwBRu%(*0Z=bz{4~cCXKDGOS^16Wk`$eei79bv?8Le8Dr&T(ym)YC_7D13 zQDZZm29J+A0bxvl?;pvD+pel8KkTgw=kI;S6NtqDj(xCaedDd3e-wY%p<^Alv|1$Yr)7scHj_{iArbO@OQ`P8n_0u-wBtjm#&5r~S09_^=mInID zz)m7i!~nNrij9j2$HQ%8;BbV(wSpG&-|$?q{h~PgtPU4SzcWwNHC7bHZ&_XSw!SvY zq6bU!+Y56*L5`iJ=ds+=7UAT>fb*N3n$hdDkSm(rO7`q!4>vxcA9m?3QVzLm!E4xB zpq14%{oI4s_ftflTBo@FU z(5B^p%atphe$Deg`L69;`zAz?ZTlbTOT35o<=IVN;HCBt{SV2;~0AXs0O_c zBh*%ELUqTY);bzpxORF?IfTSB)||s6{1sD6PikF+PI`h9U=e^62E4yTKc(qf^Jf+O z8J0Juq|h`CSkxQ$3+T7p?q@efs&6m-L%sShgo%fv1t??_>*Yi3c#j*MeYO_Eb#1W( zI9wsF2K+Hy8Mv3VT^jLeh8_UrQW{~{ziXEU-Fu+GB2H$R%wGuO*kIO5NQ|YkJ}S|X z_*UYjrtHPAa2r`dcGGQ0_Nb`J*eB->)sxC0%wxXW3BnxP^-A_m6SOqairPQ2A_(Sd z5E9Wpn_t9px?WO?2(7d?-J{`t`O7>m1bCyMn85xty?y>yXQ|CoRZxNjX2G0Ha`1TK9)_rM^-f<+NJ;!wlZwOzSr01jZtSgi8`l)=Z<*1jx?wg; zouw#yem>#Rz-b`ra;Ry^GEVM#If9RLxo&0`sTXWkA9QYF^0E;ADDU;qGF+tx5BSF| z+>M@^qM;Zz;$3yrebH>Io&bU2NJ!8$FgP{3?gWg>pDfl@$yg>ME-zrs3JY)QYhD&D z!eql1$D&7+Q=zW}2z*GgMaL)+w9bQPAIxiPs)kGvSW~nuu)b2T|Y(vpj z+u}B!W2<;TE#ll6Z^e3l`^VIVT4|X)0U})-C2GS-fW1@RjA)HjV)oOVPH3gJt!>-Z zFqQE{-rCw4pPpVdPR`qVWMqWYX2f3Mrgj+H4{N4tLVBq9m$^9l-=%yN_o;`+p^W>%vXW$o89KYoWv9^v3CafWwchC%{euF9$wwn z`?3jxa6N_X_>83yJ8dBO| zKV41F#xu9;!rto($-J9U(VCqE2xepUz90ZyTyQh>J!Zb}%+2lz=v6SXGjrEhf55?h z0h=PZG4nQcW@NlZj?!u%+)>}1hqE+D1A8zqBEqbm%tl4u9=7l0{l2Q&k%*bTU4kb? zqTQ90=wlqYoom3BNH<@c?#}`eOI`l_+1iXz92hH1wftUYO|qM;X)*9r_M2}ujw>nC z+fXY&l9fX(siewAM>nyEvVr3>mEiOs%$BivlyLUNrTrIGT~Chc^7?vddGyCF8jk&q zYjxXF$iwqeh7hu`IiXoNOuYME$g2H@+JW);L2Z4#r5AuzwcE+Px$`QFjmFH4IxLnc((F$j&Yludu(2C53WW=Tr2!NSV1 z8MJ=e_LcnZOG{f}yyW`qK^oRo2s+zmMnT}%qQE{fq3?Nii)^&UnL(7tcNLgws>*8u{cTn}8&pU~hq%{^Jbramus?2_l1wx;h8|-zs?I4@;ASoWRNdY>OZZLl zmEpTeO>Mo?K8de8hOoVTjKmw(1~rG8w$7nVd5OKT`Sw76DxgXh&2N{D>83+Wn*h|adBy3Dwc_DF*_?W{fm*m zfh0c_kAaS1s)?yM^jujTG|EFgSM@zCci<#CJNuJ4QwD0<$yVR*r>7WsGIy&dyx6Fquhq7%?v=cC`tqGF>>puWGJSzitVKhf-4gbf?2k z#xq3xeVAC$ui;!bdyXcQV`}`87yxxYi6>V7O-xwkn|;YyuSTs9(|%Zqz;$oHV#>P> z#PT@E5*}wvv=R^Xe0-Ra8sHo{fn4p5P_^x=H=7f(&vDktd2IHS=1{tu*UBUl15N0t zsHog~XlQ9^H!n6tQ0=}>K5OeJMg6jK^N5Xz05{_dUY{3N_&cq&o7m{^w>7tH`}u81 znWucFql4p6+e|d*T&cHB^AHb4bj`xXE`)`(;Rp`mk}w;$eDVX3eENW6Zx|U#Vro$U zDM3l7^whR136nZ2RPbJ0><|_<#_f+y=XKZtTJAqRYn2thd=*#_)zo08-*0&EBFPR> z>6@DN?=p5CtT%w8;^G_PBFXazV?04OVDe(6+5Tcp6oXE+u}{EkOMwLNxN~+=HVu2( z1?L#cSu+~M{f+N|DxcUi*XliP9$^e5)f6Aoe^;{Vej|`c2Sr}K5fYdgs;c{WJm0C` zXwccq{RTTnUud>2$u2aUKN_^3TaTU%X;O+0#qyLrkH108xP=b%Q}X<`LQH)k4mS>f zN=aG8nc#ZFAyf`Vz`r80lXLd9>fE2YqFEkZSv7TOr>oDWkW*A?0HAT0FZIBsXQ_nQ z+h*k@n4NCk%lA5zOr?*&%y@>5`TEk8j~#cvucj~c_3;^DCkOIU0HPwvm`hC+*P1Wl zBQxMZCSVoa*<#XfI6CYN2bdc6>u%YCyq!Otn|BZN_fuDW>3S+uSl3&=oeRFuFc$HY zEs&frR3Sh|8tKal$mGLaqaD+8xMv*Qq$1QZ7|VoxN+KcdDaEfBm7wRAx3}zHLo5^( zY76Lkc(|nYe&k_e>q&*3xqJQj$;372SxD$nR+d&oq$*qZ`Qy*Vo_w{^&wYocz)pmw zcA;@`XUspDi>Ht(2bxvCfnnE*>g2-}xmHLK5$K(q@) z3I16^No5P)3Zgn5KXJuZ?qRoT4_R+emmZUCy)C`0G>EE=ie9mM=xg}A9>?X%pniYb zrUbrrOtD5mt$qIXw{Y#@`>zF!WMFT|RfFYI3EVm}yd zwagoRJRO&pJRUa{1mJIhA_c60z^i5sR`dxyq}$O0dpBrb(n@)HClj|y_OB2^gD&3B z&`Zm&qI)C;fEwF53dq}MzP)-Pr*zFO_(uQcN!M)Gs3EUrkI`B`8O(^yT&sEnL2vu) zH8MuHsof6J@)H@Gv7StamAbQ3RT^nIQ!NZ_Iy@i$+I_tp{t+rii!?iL+sMeM>FTQa z2>1n7891)_y*xMr2Xg2&J|u%>BySoJi@ByByT64bv2uU>XtU}w%D|%A)HYu5+%TG8 zkLKnUGIy%#vvfG)JpOM|<>f+zpPW1)nL0^Aj~0XVAKO~pCvS^fN4ldHEhO2q`&qB~ zbDsw35%&f-h?4I_j-@TTcZrme3k7M{hxs9|-f-R+14yWQv?Lm7iBduCu)H%T#I5tC z!BNpixV+A5eboR9KgH5=o|4u*JhLMy#U1Ns(20&y5AuUgT4slsuE6*jMdYoAyF%Yo zbX5RjGPo*j^Ya&Fi$W2_2>YP!Y2MF*IG^+x8Om5mvdiuBMlEVpE_dDi4cShRKJH?~ zirewsN&GkpLnV{DFNqQAt25=CD}JTNSo zt%c7%>9x9|{M&!mp)a1MwjB-OtU*vkmqHeJbR_@h56{c?rvS@jE91{kQVI$|EsqL3 zJhi8L1L?dU7AcKA&)@)c#~K=4?{9*6Ss_%nIS`I-(YPAoDPT0l;RSEMeA$y6=3op6 zo%yejl2joy$un5MAALey^2jm9Uqg|d6fU>Ataddj&dJ2FwUZ^BdUlVRURE%GDOuAh zWP_^xGI+p80fP=r6g_)Q67Mj}K4T5;&}j4!^Ie2eN43Mvc+TksD-!IQvw=^dT;JF@ z=2kq8HEY1cEX3am{qvn8S@oyJhjmR&uO9j__J|v$z$U*OCPwA&&8EG{7T~MHC##Qd zQ8Pz<@v}OdUFQDrpBchk!n|kxL5n63BDL7tk_b<$BfALxVzmqTB`4_t6}d&tSJ?cDh}uSo7GkN?@3MVkO0 z|Az@hx{NufIr3Vg} zrevqu*=MZVjq!5~9SOjxtE>@Pa;U5{zJrs!g#+k?gn#_Bwf&KfzK!!gVbW#0e>Xbu z1)*lIsp?c$uOeHhf%K^z|6d!X??XXH(!?dviL1}ULZM@KLDR_QC2m_T_WYQZ$M`b2 zls{msHhoU{O5whUVlv&MZ7zJy;GFD}D3u)!&&2-CLGJAc=68_t^+}C_ZP}>TrX4jP zFI}GHc`w~0to`;mHnz;hM!k(~Lglb~^C~~zrO7co^neh+<+Ac8n`iIwargJ{ zxrnGyo>Z&g+XjpbT5Jqs%0;v&n;u#b>kuNl%3In>ltRW{Od#Jrf#Koqd__5s|lb-k8 z-@qWNl!=z(leYHM&FwW8*RMV+{;RrL)tlR{+=XLUCU$kz(z24=0-QljOCa#hqKaot zV|o~(B>E~$zt8tVWvOVq*0t`r7wzEPg8kXVgc6`t$!!4)<2VI_h*qYjUoCWRp`v$j zaq-^X-g4dmRGd%L*N<34as9$swnI5=>92=ft8Gg622vg*Bse#BWy=_F!St^i6}2vbKn=fwARLWv zX5E2Lbm8HiaY?jj8`k?+?cCo(q_ zni-Q1R8Ueo=XA(W!9;sosq#ne+g6gZZ97n9BXg|VxE<|>-&<|-6cZCm&OEON5gqK(G_-)TyXvbimS)QqJv`q3 z{PK5qatdt7otG&qD-W@|A8d0os~J*JF@p+f`!uW&79bt1WO!=Mesr?;9fXGk-2yoE zHc|wa&SMW(ASC77Y->fy3ghQ7KTDe`;I+}Mqo6Rn;>O<6?6I(@qWR^Lou2zk0w*`o zu28f2&;qT4gM%5{;z=W*o^u<|MVYM<=1RO7v$NLCJ*8#(jE_-r{9G@27MJb|j?!TJ zZ^FFR84c3`s$DIE&uU=8x8*>W{H?wI`2n{K<%Oa7}5m8MWeMbzRH=MMRMtCY50!{ z#yFb2X5u7U_p6wm4tgSXbu_@^qjTqW*MX}sgX1@<`7>Ugk$Nw!ma@*XC+@zE0`a6c z(tT%f6^Tf*QEUZW9KT$MpD+L#0vOGI47&bI>&i97Tq=4>sIH-zk*Nm)TFV^fckJzi zj0uY!lG;Q?$|bxc}UB(eFLru zH*u)#|E)254B=DyM}*$)xnN53tJh?4L5DYcf+4~%+TyRVj*cGyg}G^?UAJ`mun5+* z39|~faU~xPx1O#+odIApE}xUV-t>zC?Zlj<+4~yv`-s|Pb|Z6)P`&kSC!qRTzqWDY==K`L`#AGTY^4ZT3kX#`5y-rnpB3zcPmI;E}e^j|Dx!K@qLl zAC3Fh0*XLzKTLe%T>VSAn)udt3EI&~m-lFxHZ7A)Yoni#$>$F)&Mv~;5%~B2{Upi!&vMcgD;&uzb9VcB5fZZ%MHn!`5VN~zr~c7C*vXtIGvO=B=-@p3E(Q+ z9FWA?8F{d^;fS0VI@I$rAP&g~X0Lz$c7xu^Yv_9iF#z(AsX5x#`7aa;+E||4@uRk$ z8Nsn>-W$-6v1^?gEYDCPdh=7jQj{lxXO=~fU4UT*rK%cz=H6zgR-^5aT-Uddhqe}~ z_lvGR)4ZNuPrlz9r~0{SnBg%&0t?`oy6@^3WYb)As`40&HQvL)&Rp(HRi$EEDq1>r z1x4O$Y1Mx(7GRerk~p`Ud~R1Ppg2krIm-ZZ|8an(*)rEAqJZhgb1*dQ^XXP?d7my4 zm(c3C78wXh9nx<#ljCNLV?U0%FxEO#kB*sTDdm!Q2Dn{*l`|>j3^ca11Z|4W4GeB> zl~z@(Zdx@ycFTa6VFuo2J-VaE=PaIIO~qQGrg}Wgyo>p)_4OmNJ6ISr)eM`b=Dezu z{uN=qSz0lGQCyrr=@7omm3m6p{Ay2aDZ_j{wU4KBqm0z0UNVMK)D%h^$|LCxZf}v?GP^shI@$T)%kQNvuxcQ2_o08%;xZX_0nSOhL#l;9kl3k6z%$hH; zAMAUX4wAmdjj;k-1x^J;Kgwca@^$%Gtcyzbpr5$SzfDohHBTRVPO4Hg0Nh}|r+^o( z_l*)`N3*9Vb4$;l3y^cVI&+y3<6eG@fHnQlQAt&mXjMgw+rEId_8%IWeLMi$8tFc> zu5{O@-F!9;N$te4>H-1L@zns~34Q2C_O8t|Q+x_4b8iRV+fFnAQlqLe-mtKPMtZt*hQ zw%0^mKtli$Y$e_1PXFAa!Dxs}LHoBe zB*L!|+SpS%r`R|IECqbbwhFOYB zNQWFOGCs-s{jKFovJqGZ!rG)vfE;H&SMLJQ3C>bR zY;~4A7x_Vr8g75qDDBD5CS{AYSo|svnzcx3J81~Y?;zj4FPQ`#PbcZHfF;bU_#)eA z;*1`@uLs?w-bl=NQb?zls$_=FQiQIl8w-mpC;t@O9=yLH7{%Yk4rcJm0%1T`S1e1j zR;Km8(@86h*1I#9Tf1KGzWTJ@4kbC%zq=E~f!kMB=wM;$u@J=$DHY4Sxq3ORdsRbnTmZ1zSJUpnGr%rK|YdP4u4{?yt=2>aZ*$BybNCPgJh~ zOA5z$1~lTkki666{QUTJvVje-{K+140s=noZ?E-Tl&rKxLZ4vD`P1E4yGKo99#!Ge zHOD+xtM2Yv`b@Fyyb}5*asb`N^@=s{e<9S{q36i@!5(scwE!m5?(R)@YJy`8C>U0r zj{@liCd0w4xO<-HI;PJX)e^}yeQzj}=$F?_b@ukAlelvUl&v%o zT5nG#E5;NRmpiEE7Pq$1&{${OU6@Ep%SuffQW(Momz|q^$;hOQH#|(TEn$>T$6+`O z4GrUue-hwWvG?LZ&~Fz>hihG3YG~&dqtW@1Pt)+Q_SE%y2G}7QUb8?5udS?x#kRSc z+J0I_TzVk!ps8Ki05k0XJgg~Rz8PO*sRHx`L@V1jgnCLluc#uF{BU@RR>wPwkQ2m=>_>0@?*ge}upFt@PWSG~_ZTwHpO8#l5H?RZ+ui1OD zdGF8e;4fGE+_#GGkdwsM^Ap!8_o(5Ejh4wld7oAjcXttJla#ge(tXbYgw zO%hfDqsFM}E4y_Yv~-PSMPG9D`3X7Z@(+pFg}<3%q%qxm#plYYqQ1p(!grI2{_wN1 z`sHyf<|_j<30ouL%p1l%g*v3-?#?C=__!S>%EUCKtJef53WYT`HHFB^ejo_jge0fz z?90i$rnw2AqdRArSh&~JMJbNLbC4XBDUmOpe*%NjNc@>XI4l4+GnXMOJ&?esCDe5Z zie--$%NQv%IDe&oTceCL)-dS*4kGjOhZ%YnzX4&0E~t=^k*x;;D-#(2jlTD6m6c;= zzvPghFB=f~(f-pqC?c{aPKPKA03Vs+bH3`*DWyoe&k- z*Gq_&oRxO&B|e;-^$a?K`Nubm^QNYh*cR0ni2vXWJU@ACIVBIlQW0h5=i_-Fsaw$Y6=Re< z^}_8D1-yTg?8A;6f>k~xC1YC~iDL4t)`B zxTJeR*H<^VxDAYTs*|(Xi*26lkgklI1xJ(1RPKJsZy)?hMOb*W#CrnzBH@pR;$n{H zKP^{Nb9rkaojE?&I`4x-wmTHt07JvLXBL#(sYaZ`Tm!EvZ<)JMo zq??XLU#&6^^DtQ*8xI&B7Zqb#5+fj3C`IvJGckEYiOSqaB=qxZs;#5<3d;_71K-iV zY(ab8h(+KE&DwHLvTS!3$PA||!8XsHF7kuZTa$@lWm4uBb!_I(*H}WzSIatl))AG> zQfnYm{`JXbFC8syX&bvj#vJ%6fGXZeOf2_wO*pJ!PD?$6>l(j@rX$${_~#>wa$^dW zRX|)v0@wbKwzy_f#CSjYm+4&>GmEfi@+N^%+^hjAhJV<}{ExeU9`s-Py}awmEp4K^ zo4L+yKv`X5!~<7~tSMpN&de=C)KecQ#@|*>$M~26(XX0wug`F_XHHnRLMhz-tFc|s zNWHiB2Nng%@zbU|p{om;b1QPdu=LYe%WkDT*Qipahv3Dsqgp0j3p7mm4GH^YKkgG@ zrJ;XZCV2~jkE$Ac=y_coVWs|KeM1UWFHE$JbuzJ(%+>pWsgx7!c`7TH9uEs1t~sLM z^+{`PHO#W6lEpdvRJW8`*(r&Eq5pEINH`%eQG{WKWk;W)w7Rw7kJD@!3D}=lo+wl@ zoqtBSEed}BSVw2nQGVjBG9pAkNp;Fk{%Y9v4>esGc ziKKOqp;xlhjiaC&tEf&l^2l|7^X%Z;`VVK~ zWR_l6%z=A5ZhX8w-aE~cQ$T*sbXe!^x<62>^n9?e>Mq%BeO%SlD~$O9kgt{3{Le#@ z5D%agCmK3CpbnbAAOl8W5(k@T(?CUB`DBQ}e>IjYsiDUxAKwfgpA4iT%56L^XWS}D z+TScQV;rRgDnKIIA?E>0pY;VYC)|B%JDi?Bjy2W0{0aaItD8|DLA$&1gyuJwD;Wm{ z!2iuH7k!}keH6PkwM$Lk)1<-mEYBZ)h3fp7+dlZZZDhhvq9s1({3ZlC9_6wg;Dq(u zzDa8-rSq*gGQ$i#Gt4f+!s3B^QiNxgJIom`L@+Kg+4xhbzQ3_3*B0KV9DR==rWv(F zVkk7gA{u5m0Ph`TP6cA3{2Xp#i^gLZ?K7&dkSsd|qc;}N!EdP9@u2#!d?Tpb0 zsi`&fuhPzIQ4aI0b1NJG2ftomIlk=H4_{~b)C{Y0Jk}N$Hyyk=~+bL?4j^V0@c8-K>Kxp z_ZN+aWpiX|_GWQ#U;MSdwNH=_6AZS;P`hfSQa4+e!OPk_fqq{G9a_v>s?qPr{C z5^CuB(QpS9tvlJ;@`*-4L>15DA{C^hM-57`lk&3D=M)M`8b+mh{i7QooRy`el)cvGvU?Yb#=gAN zy4L=9vFbTpx8u&#&y51H(-Sva@!m512IWp}rl($%(@t!qvu`0US0n6%$H!=xRLT>=`fwA%JZ_m`fk@O}v z>*E;Gc&&)d3N&j)czCVP^i|Mp1&5QjynHuwr(qP<^`Kwoq{#)~;?u6T9EXR69j+jv zH{e9OXy4mlaB=Z@Jix}Sgw3#h;w4@8Oy!i2Zp=>e)X^tvIXukIP$mdm(TU^dFH_2X zdo+6g9Wxpxa*Zx)%)<%)WU#x*IXL!)7_Z#1^GVw-C1v(Q-n}m9@7^~@VGJB&RUqZM zualD#!xrD}DS2TotUpev6#N~=kDkBSMP;O|9;`zxK!xC7aeiK2yI+#{q=QuI)U@vA z?>}}r=-$xvoY;*zUp~D*3~+OQ^g*Lbh5>NFmv~K2Pdn1Y9?w@YBNEi8{dYDg9h3k}uL(}T{rck`aT zjHB;IM@PY#N#MI?_hSMHmsuqisX{ZPB^m$#x1@yEaZO&gHQ7aN-G~EZBQxYB+GVR% zHTCE0tNIUB)xy@Nk9a3y#yQ_43rcF7r+m5xyA{7KH#uhigw!{64UTynA1(D}SZd5( zji#R#JyjvijO#=BX&D6tTD28(_9`(OQl=Zzn#+MWrP5t<#7e^sk}lVMW;Ql1EezFs zIsyJKyu5K*RFudBP(X%UagP#^nR%+ChH@Q0RA|d+2@_1ifDtUPil`DiM ztDE@?TiAa~i~a!7H$&2|&B(Zww>9~lKL1_H2FeXBG}>cw!V`qy5Gk+RJmjIMKn4*Z`7O9g!IP9kvW`vbvh5H~lDhW|1z?0&|# z^vG*y%$}{bZ8Kmhk2?AL*ZK#JqoHPLR|mS-PGRyiYO}Ks%hJ8k($Vb=CeoTm{EU+P zX8I>@fK3R>ixYFWh7(tFFf!VL7ilHn0O2RmO-;NZ5sYzzb(U4}Bte)ScXdUI78d6D zI@-!%lS|q<@SbOov9UtkWiL^>fdSqRsMJF*-90Ym^OZGM)vIJvJrMHs^1N*g-KAE? zE{iF}0N1)@kQ~qcNpx42=xhh}PtS8CC6toUn$l9Nh_D_Fe0;{j!sMh;N|Mx_W4ULx zqJN2R%S|*282>W!zh`$IFD@Mv!*3VOk?U1h;3d1qgMs+o>5egFa9y}%ir!_R}G_+h?we^uO zYYVUr3u;rNpGFW6hKD~a+xK$vf*<$N9ic$Pfq?^u{jTF`ZFJmw9qG>{;^4xbx$}aa z9%&%k^`(97-1UXh=TaBbZrEcB-@h`?DW-uqfCM9 ztdAE7HD;-6B4(x~){Yqo(%sI;hS6EkZ#rGQ7DZYg+!k(cncJFH$LjTG=l7%K0m4Ej zS6d~gQ69)7u1a|j<;zhVQ?u;&u|D*g8vd=l5cB?_Q)zb#$puqJ5Y|@$E{FXc1lzhk zNh7DM;vyqFmFH_NoGaN<5>nFCZ3R;oxdaG8g+bKK%^S3LPN2+%MATi8@5mqtJ5gY? z&1-Dql0F4hlB23qm&|&f0w&H+ztVs~{)c!xdZb>)ZhV7pv?F-CW;qaL6FP26<6kp@ zWUii~t!qCb*w(CXx{ujvJOvX!K^I$l@;KhSt^7@=zoZ!$6{&ME9znmpD|o;8(3`o} zS)_ah7IF$OmHxzQpDxqNgZOa*#?QdyE39qy&wu)tL+sH6vh~Opp*>b+rs8{`q{EJh@%} zjP$*UW;2VF*DFjjHLXY+q!NaZRad(}DoAxI<8R>ZV{=7E`0}?~Nrd7uATKX(8M z=$4=7f&<^m#DX>ms~Vh?%?0y{Gm!AWpGe?jCFf)+5|4G*;NQn4`dKa+^6lsVD(e2} z>_%_mNK2{c`{Y;mSOjSMlEinCn8eqLusE(V>08j^^ELXz{;G1%5l0S^B>GT>+6nqsNQN&=tPa3obb>Af;sbiJ$%=YxonM1&>KCZxSp# zuOv8kFC9vD@ge}$jX9`_6jKOx2-380HCkHRKR4xsOh}e6$jD0%jZ`2(0bb#!Hi?WZhEE>ThcJ+d@3e93!%^XBHBnV*}Z3ZRm&1W(A&(9jQ#VOmc^ zi3nq7;$cYi#n%x96<{%knwnY?BURAMw%*DL@z7Ar?e3lw62Hag5Il)Qzlsh)!-0rZn~BuHbS3@jd>M6YQ?`ecos9#B`E;p{4hA#B%n z1{1woG!Rx{)HJtUY@}d7lK_61x&A?g5)%7EF|oqJ1*f=i2vxc5%OpXy^nq^IHhew&5a!W!I%4v(uy-ZC+nbSxLoAaEdJBDQ><*=-@ zd)6i`hX^I-rY(ml@;vLmc;5Y9{XU=T<#k=3?-x}4IMT^XwWg+m++5DfEs+1>h3cQF zwhWrNM&Ze){1DEl>vvNQFs>*N=gm@fFd zA13Me_lms^SL4os8>8t4IBk@Vx!;Sn5^D!Zx9kwb^8-YwKX#t@bb6ZLZ72t?<+~)6 z)+lu7hZ)=1Y5P_GnkDl*I7%8C%LZYOB$XwLiP(@9zT)$*OQYtAB93X_IVyb?3Lz|- z0gO&-(p@3ze;|sW2Q*`zL8ooYK(^fojGO%9_k-x!}63 z0jLkCM>3Sv@S>W-eU-h*KzDeuDho>Zw(!XSnFX<8^95v~Qk7-`LM+}#I^I0#qTgg` z>o^d8eFu%APW($p(k4alalhj_7Bf;<#48Eic@^f=-cS4lHG!7l03NV!kR3-yDg2bdXIj zckf-lL%d64mRn)2yKSUr&pSjRK%kj!!c>1CsG~3GpI?f8jbgjPaY|*7K>C(ut$JMQ zjoFRT{ur*o76lq$+fRRNuMMw%1klq}(F)z`kvdUar0F%*my)7zr_Me8&Ydyw$vb;a zZ`{;@>F!wmbcvtya zoszDniN_Dm0+qdo@dZH zr>}nPa(w#TwsNDRRB&7lsCFRgIBXDZj}MDN$&`tr$8Q}HzGs$l?38o3n|~XURLXUP zug@20q^0#UNq3*JktCIf@OdX^llKMlicT-@W$gA2&Bsq869WCIrWHeOS}X-emHC{z zOG~aPcqbIoNbd4)qIxm1K(iNkgv-3O%!>+~ChmgI?>&<1qiWg$|4*ySljOlv6BuK_ zW#)(0!^3>}nm+BV)OD7<`X1nnouP8b^i**6yTqnM-}bzAg@+8%ffqde;xT-H$wU&d zz8uRRP1xm~n%V}}fKI2T3b(c%0>JfbfOQ4V`C1NVfP)9^&)s#*E2db7%m{b8MXe)Ixa${Hu@K55lKhoKMi}Pl*ceWue!rlZbv+5;uOV=C4AoT2&;`ek?f1Z zjkLL;)M4-_z0Zf=$vW0G2K(%n^$!C|Oyo2C^=%A3tG3hLAZfI-B$cy%t$%&AiHnQ# z*K;UuvYe5Wf-q$-`lvP$J1ar2k7Z|@CNkh;oeIoI&%vP9Gi^$8G+JI%6oguCZ*OnX zIK$oevy2DUa(MBHO;Z=F+N&>PLh;7>$*uW1wgj#z5Gin&LmS%!ynFq+s}b{z7_!F} zIir`Q1pwGnsg$h{CJKzBk0u}x?E3i5h9wqhufw*8b^Ef`Hz^vjv-R!dM-nNcp{53Z z{hF?5mHfcca9Ck0RC5+4x2CMv@@0s(Yx_Lp>MC5mCd`-wazEj(k?ZV(Vp_!iv!{ANzqHjqF7 z|EyEW+-I61ki|V7%~nRR#iS=w@q09az zJ~}#fb~e_?2=MT(M{}0j%9Cginm5sX>(@B0=cN7749K81P1M5VYGbX|3ea9s!wvj! z;@U97TbdZHV}qoMlTxh?w@UQ(BH#UY;-HXv2?|o74m`Eb1!oWWogih(Neh}384g!z pk6!mW?RTO{3#uCvajwy6am%5K++)jBqH9KBT`5%`Uqm}>w literal 0 HcmV?d00001 diff --git a/doc/source/images/nova.compute.api.create.png b/doc/source/images/nova.compute.api.create.png new file mode 100755 index 0000000000000000000000000000000000000000..999f39ed95afdb067f9ec47c988eb9a2bb28c35f GIT binary patch literal 50171 zcmeGDRa7O<&jtzugS!mw?mEce?(PnQyW5}}cXxMpcNyH>VQ?GVeX}|I{@;81-Jgqd z(W|?Ys-)7XRh{)DiBM9IM1seI2Ll5`l9m!v0Rw~30s{jdfQ9&?bfb~{__~3+s7Q){ z)y@!{e!W0i2+IqDfi=V-0F9u&-r*djv|Yf!kO%&|z%glL{J)5}uHss*st)F^9!Ab) zU`j?-_O46{;%X%BKbSa}esb~p>w|#}+DMBDtNk{($br&Q)yElCRu*g!w~ALv7!g85 z{4->Kp`j$i3a*@tjv555+tBq*Tn6vkFqYVam~ipA_w^MH(k70r?X~aIzcmHW?E350 zbM|xgq-G>Goj-g&L^&AUpF#MWTgR=2v#;m>k%VXiQF+1tkF7}WPjYyAJUUVI-&lWm z64(Zm|4s9UziEbm70I>ttLFQ^v4N=X|0e?M|4q~60$J|QbqyV`Hy&Ti*fcBCKi-p= zTM`8lhyjjfgbgbHv+JfE0x__@_~t&U-t7lR$xz5f^I?&GPG{7k`VuexZDW3Ua8Dpr zFZ^A-Hh$tzrizcRw|Ih%wD9@ltag&+WrdFyXl;6hg07|EzW+fPTn!9U2xbLs4u1`qHR)WV_dQ%jH`%jP~OGYute1oq?1PolY)dAHvBZK2r{i@Li zEW1^88Pb0UHt=y3|M#`$ioiZd7(6{q`o!8=Dc*HjuK27MiyGn90UC=JWe1yr}44otM>f_y`>2>+7*ZC_q)4q$vu*T-Mut zDd$}hO8x}qYUX@YV+T6~&8C&?;(-Ecp#;4c1{|()+v87(Ir{AnYsU1!*HR8Kex}$Zs%@%lhpu1lUbPE-) ziRmY|_&JXp?%$L@K=&tedxMy~D7_Bh5bsZyHU@-XvQh9$RbM9gI6GJE0vKtEZ5-V0 z-JFh2XA}3k-)EwBd8Ho{qE_v_A35R@omK)ci-u@cTa&=up-nd1j>1^%AcJ$RdxPqt zqWlc&4an)YWBP168Xf_J-p}~QPJQUqAgVsCf-<_b2zVXzw#zP8;-4n^de&G8ipObg zO`-5^=WBr~f3O&J;ow!-9%CrZKR-mLI>+g@cvPmf1$t9+I^klp&2M>P(0iV$s8Ib3 zDj85Bo-b-#S?`i&TZb3E#zoD38Y*(ss0I+zm1-t~tj-5m3j=d>6ZVyBISD%_Y^J?m z?hp$0uTf;FkkQXJa)Fg*^q{Ncfla-bAZFP}c!*g0D@w}0p`~a>v2BMVk|Dk>}R z!{QE9s;*bdfT0hI>!;dWs)Y`Ij=>d(9+8M$6b?qbv%}2o4BUc*0s)F7;*UtcgBZSWq?HODxRhq!xq8gVU zX@)9q)JC9kgXO{MTjYT6&VJ(Zsh9-{TN;QnLZxPTc5U*U@X^(B~h|%`_1?X&!oU%qR=KR~MEj<`$@nTC1hruxzw}AA25>-jiXdFc zptVxOR8Bx(JtB|IS@s9Iro!1y1^=?K-F%^0n1Yx@>FA&g{O7BEhE%BCvheRcb26wb zq&E?}a#QvP#EPI`H~;v`&^sxMxFX4JWa~#JUH(g&&QFk}O5*kP)ni$5GiBdD>ndNd zJ;mI=E%xTmD`p+C)U)%+(?I#;s_mK7AH znETV7&(~2mQh2Md#eet}`_EKj_ru3z%h)fVele0e`ca!6cLTyOXNa?o!Ee<`cFy-s zmyqmFbF=kJD0l%;c+Oye>EFq^C@#YG;=c9a3)92h+xwq|0S&0-VCUcSQG&T=!(f#p z&-$yL<|q3XWJt0*UbUdk&-30J3l2%>Ic%4^9tavG1P| zHT`8TA(~RGTq%wyKWM_;vKc>jgL5Jws>joYEEdYNTKJ+t46DU@Pta)gR89D~%9vy# zB}XmVu~~7B>$-q=ljfwo40h3kyR~`mLJ~G*Nmla}yA`?yYzS#XA#PCllmK*0_5s`toNE8}O! zD5pFyPO3iSEc)`4V;ZTx)`cw(U1`p|ZgYE*70Cju)RDH<^1gr4g_Dp)5YucAKZwM% z*U(r_LET>f6$G!2mA`>C6;Pj(?LL%tr@c7PY*C~xK8EHMq5JDK&}6)gk^E?U*5a~V zAw*8vNW$xFhoBNh!SBuDgwdr-Y4q7k2*<;W+RCRTfe`No#8rctn3tnjjCjJ>_0aYD zW@A^QN)4-vtbHZdphK%^9?Z7v)=Cg8ozUx?toNeRd^Xn+RX%j{(d(%1lar`y79~wM z!{)gTSo{IPO5O4u;^(d)UoUb;y*sz#m9A1S2Qsc#k}x>xXmJ|yF9J0cJcXSbK|oNF z@FpDIu9;LVF{rHgnXcw9_eo7&6?+MD^LGLw5J%ECUiagjz7+*~7V=0$n|26nLo8c9 zN2jafpyRT_fIwIg>4b! zFr#Ug1RQA!-qxzQh}-0WFv#W(@wN9J@Zw-1o!9Cj~m~&ofnsH z;djQw#t9W_7Y0x+%Uix*?SFi!YyMnzf!)_#4YK2l0TU^ zWpv3Bk}v?@`N{Y$MoxVXXiL&ii_gBLRF0EfSnm@`RVl30?Sj;W)2;Ir^b@m958vya z`18^{6iJI(?RV70eZk~;mV4Pgl`Y&$W` z4&zLY9_+u~CrGL!wry)q3R@(>rT|~WoJ!h-y*~KSn>qM-`H@?npD%BJ)PKOrM)nHy zu-Y|C;QM82)If!J!zN#DRKo>taT0o}P{a0BE5(yVu?)Z164vI8%1M7_@h~M|%VZIZ)bVg(92 zf})N5*_=wi#$oQ@lPflpo)YA^#y1+7h448XhIlFJ_8YgL&reZ)wE)56^VnjiUPq2F zViRs!zsqixD69%}U0A!JqB(x{&1fyb&Gf;2z*)k4g~R;e1=B^f$Tc8djpi`2YT8{@ z9PW$=4o?>nW;W(iT<&!Rc0dqLcw=E}?2oZEhC5n`V1mZYx{!J(FrF6GZ-*rs&-XAf z2)D%>eycuD{&+!H#%vOK6R#vnYB#@PzPcJ9BuuS`Z5je#P;%^9JU#n9RH2N8+?)RW zghq%N_MnzG0xmu&g3)}_V4~u}@Q#_oJQ6-dUgYkes5f!Nu!e+T8pvX(8cSf2wzfm= zL8#FO-#03cN236(dvO>5IcrS^?rYYM?_WAfHs2tkeWx4JVxt`ZunCC!@ zh(&!exOtXNAon3k(!_H99x&~a{EoEU__ z&pdC@+MA6*V4V|>b#tS6gzvAFHkRtNuh z=AU{+Yjb6B!)g}k4;fJ;maip{IcHKFr%)O~g@wE7^(!aU)Yp`1{0K%0vow(J5Hw)K z-zbwPqbdM-F{@0Jsjt6~%gV~C&S%1Q{k<7Rhk84osop14bu#!aJT_7rtId@Q5gib} zDG(sv;Z{~3|& zg?R*>>yBF?QsN-%q<+9J>GwH#x5bugI#_Rp+&8g;Gg#+oUFBNFCMx85ZUi{n9!$Kb zs^z7!l$vu~5SOx>)+h_+aYs>VbjTN%(%2h4huK6tj?^eOrgurEG9rT3%4?%7D$ zKx4r|N5v3yyv(AUaZ4V8M|MQ5?VlZeeMoJn(yOjlJ^@S+Lwe<=Y`as%Zd_2EY?20P zpZi#bJTXjsO4j@-3*Px0qvlMf2y4o|aT8kXdcq_QuPvXH`S)iACMd@k@T za3aTSgIeWalbAxNWU$)X6)eIAs$jxnHjFcNkK$jXjv7T1-%LGlNTVd#SlmW6a7fa? z_!2^Rj015f)Zp&5v%hK<|BS1F0wsn zUnKj}NiCFCT7MGLtcP?~+3)|;x{$zvW}xwr#^>bniS2jD0EiyA}>$8~b`&ICH4gKyr_FV>O`jpT_%tB^`cL<^4>`d!05L z<=fNX;G1d{k4hD#P7kF5=9}N2D#XpC%wX4C5-jBgm37zrMzqExg$MC4;6jI4M^?sq zKBWi*swXwFa9M4(`z1p(tGJhtXwrV%SvgAGK#Vz}xcxL#7wi1@mpUH{mcccf+oxO2sEwa7Hp?qhWf(!FFv-vd|CzhN zS#+g^9+cJtlIGry7AKjSlu9qzKx11@KY9rpml$`~=5M^nz%7q;`{`*{ip;rXzwEiMY zD}%Rlz`)q)D9|8L*{=s++$^P7e_?e=25%xt$M+AY`&S?73?pCzDaY#Y^9})*o}1|x z)a9NqBai)0JULSp6*0c^R^XdCw{|YWcszG2EnuQ=Y<#-vvR+l{*kgbYN=EtQ^4X-& z3gCyR&1L0y?u?L1go-6j#AYoTu~1voc)oR_v{D}BJtVEK)4bu#R=S^%d;N{Cn1+(Q z?=Ck2-P!580))}tvHYZXr~})!6)jbjiMwE5bjU9>4QL~|ihzE-j(&|9SP`bHOs$sV z|5<$BxKJ@U{Mz?igCo&myYawJm?OofF|gAksXNgWr*l^|%kiFQa7u7C@VC$6@_|?N zbltpk7_?ifzN5xc<$vya=QUN^P1SfRLq&$)B!Q4=Pm z8H45RXJbQSjUPcy8j)c|45Zbxd_cGpv)M?w{}BMBqu}F7QrRB>2>KGPJSEb2A3~{z zya{V1rWtXU5qsw4w~l4#EDXqTiQ2ItO=qkK(jEFO8X@08Mt*t;0#(eNv4L>jJ{E%) z2@}mWL#EeJDCo2(#I?VV%!>Itoh@awg>q=C>fXXWm;^JkVBeq5NApL;mIDoZ=*Hyk z*IT^&8}I(~C&liN*<29gpl2Fz%k1qqkP3s}EFbv)AvV*nc2XABOa6RY|27HFF>qgL zI1nczPB->Sh#?})esOvo9bL{#G#D`#R1>@XroYXRT9kqW8U zo!^wX=S5Y&AGkxDhL}cW0ylXs0Vo@ITxNu!gWYu3KXVm0wc)W_ZfGZ=raA;6O&k%w z)|PVo{EE=;p69IfX(Vi3otRZXe#j5s3;7<)bEe`Yul>@}x+y*b7L6PK^n}$a6f2Sb zxY96WjYJw{&M)BdtxjY)dVdp6&jFbmGdsIA4Zev6H0v2;w~^!xZx-bl*y^lb3g0S5 zHALPRZGuMuPS8X!Ki;o8-Q3@?mUA)J&ID8T5DNPiuIObNKfAYCB%1giK>-^wz|R)q z&JETkU_&S6e6Q}ub#I!UI4;xAL zJ3yeQNfS*Ql&9d#1v^%mfL=x>HjrA-yaDi6Q|GVYEx4#uj%ipYcY2h2fk2+Nbv)?Y zl}AH^-h=AP2ZIqwTfC1=h@mhdM~pdTo9dI@woKm{2IlokIMgK-l#9BPmpH^=X4bqe zQEJhgZ`UH#Z6x69A%kBnT2Gb3dY)vkb19F^s1z?f=5xYmcF zHoW%ym@+n#1JTSjuHMQ54t*PwdBAK)qb>#KtiKLGdXR~LK`MH_A1X-Nw^%}>Hz#_u z=;}dZbYOC0+~8#JDXj#1FC>=5=Na? z+x3pH#8(54&$T6)+=>(x3+Q0MZ2IZfPTT5P6t*aRucMzk|BQ*X6@9?C-Du zJd)M$UBx9~{%4!)>*+bYvpW;$4-z1*w?=lg_KCn~F2x*O!qXd@dgl{-S<$b=jCKJS z;?!?>`hN9U5#s?B zqvWv1)+;*SpW!qoeaxgLZ%X`8n5DLU_ec{dpBI@~KAICtLgzCQX7YN-A`{q=I;teh zCMM@&%p6zv6=jnyu&`SWl4Fyy5Az0<{Hy7|r?sf)=!%VgFOp|M8ZC2(oK@2X#xIlO zm4?By6ny>NzNaRhi+7n)Zr(0-i-B~ne14R*vmaa@HHP(jXr14dw;CVu@e9W;u-q~2 zc%)%f(|pdxeA`?$t7Pa_4st&u?OixE_DVV8wKg>udfBhE;~HqT@?eQS>&yH+wdR_r zJ^=809p8-!erW(4Ok5-hyQ>9G zu<1wA&amF28?j)s!%lDG(V~TE>1C(wqu*2^$H2a-t}Bg|wZL?-XBlv_m|ir#Uj01; znG5ze@V9_+%HNyko$W9~YpVhY2&05Y0`9SP+1b-uQ}8Gd5hszVu%DlFNPx*`tiH7^ zG0{8dow(9ar9aN&2fL9-O8bcYgO9G?@I|&T2Mx@ub8&UQMmpX{UD5f$(nR(wf1@A7 zc)K#a{*OD^$fiEK43Wh4$AzG0X^!sbuq016LcVJ&TLQ+m$r)(<2yuyCEC}*#<#JuL z;H0)Zli%v~jc)|t1LcBV(kK#i;3m~HD{~*G? z>b6xlTQRS>9%|q)KKG6LMVi?Yn6wep)u;(Vprpne>#x2i^G2&7e7<+KwXJUFSUZc< zOmLcp`S`+GZuvtVh0w*xFAeS=aUd0%p~vWI+lZHAKX0!WU*VVN}c+S zm0$2{8|Z}!{jS}vnE!FOWGTI1i#zZsW;Jf0qfs&IfRbG4bXixEIdehJ3OU}Gm>Z*B zdD09{NtnbO%&&nwz2uwW3DxW8$0uKgsO!>w=<9e( zdxgZ(scL|c6FYmpTZc5k6;GI10{uy5cx$ArUM_0>xTqTI0?Iubm^o%*p&3ig&DtPe zUf;9!b*OB!eXCQT5B}ldq3fr5M;_^86|iqRYec!oHP!jK>}^$z25gXIN)c8m?Gz$4 zW_zS41oKa379N`%fxwB)vd-bed$uT5@&_s73$-1u#+8kB%Q2#V{a@{4LELA&9J3+z zD`jNwNnf`HT^Ox546P&QI^)nC69?RXaaTf*?bV3+GdP4Aa| z#UTcBZrDw?Gi(F9idvF`0~y8zD7X;m3XU%tQL+MTLYI_;PzvH(hbvaYV9vH z_znFiyWQDPa-lIQ%Z8_9Www@1;r7elYr73i_-m#(gqXYRPpSrg=(nH=%OkK=Tf-vJrnA@YQ(eo`x>*7>H5Ch{oq<%9sAbBl$N(_0 z>CVeEydZYZiYpC`x~Tn1N?K9+SH+nIDU!q%(Z7Linn$Sp=wH&hjmK8c>{J0pHs_6z zr&2&9JUcvW|G;nW$zB*wdl^~3ai>t?MK*e4s?VLe1K!e<8emIC(*c27l(_N+7NMCl zA7(tB4+l>}VUVSh@GqsG3T_7u_9BYuI`=}X*PYtSboc~2HrIXp=3iA`C zd`U#XphK2-;0_(Hy?G``3Kz`C>B`|ASLP7dFahCxwjDo!i2aRD0eZIa1CEkzhS!uG z>xHVY9OJ%bYLoIhEA4b2EqU^C2ES6QqmP`}a7ne;i#Eo<_t3$p^B&@?Gp94xQ-#wF zs`;nj`$5*4MI8p6T02oxeE#Y??*w7^xG||Rt~A8l9BYP3u-D zB*jO8TVq|`4qudS5~vR7`VEq_Dt{U0bO~DIC#&Ah+VPXVd29P_dKA24J46hmNTBpe z6ZCwnRuV4D%9W2J^pQ+>XM^oqeWU35%TO|Pupbk#;-K#|Pf}Nhk*cS|^ha7=d;^=x z_J+L<)qDsrv@Y$+dSYKAB}y3;>pEQ`J9Iz@OzT+3@;uu} zI&_wOriPEFd$(X9hbP4E1~xuHIjGuUkcpdX)apyzpIh$F} zyQU0FpQx_*uPpJ=+&9^@jvatFt=tC*q_gh1s=h6ab~8@f%86k}PfmuzHBxc48G6kR zce}&U?_>0j>z4t}`Y#)w|Mt>d?dP2s)<~TnHZ?Bz1!loZ%7l)(wx# z7dh)RtIZKI63%-~(WuniH^`lJ_iRTuF&i0vJKK_T^kk}CQdD8&i2SAce(bZAPp>(s z%16_{^RNW}Cbr+=hZ^Ygb{xokIa4Z55BgSoF8i7SnD#SL|J-iezeRw(;(PysGwJj= z40x9RJ7!*rkB)`=Nq?pnLj0{1A`e8RnEbdknr%%{S(4vM8NJ}V43kU8cwwz7&b+pm zxmG)|OA>#vd5E+nEnxx94X%c85Eo42!1jgwcC}iKtaI~dQaxg-!_J)os3R!aCuSpoZ&rdAiDmc?xc1Z+>~ z=M!aWnSu&NFSN4zRk)!Iv>Z4^5e`KPJoe=z^Iv5&_I*ZN~(#=hM z|H?p3SL-uSt=x^P;hOZ!z^rN(tw_GTu6hqXqN*ebG~PgETVncifB!x2j^y z3l4P=C+?TYhj^s%CmCW|=>Ebs8wrBznSQR0y-8b6Bb-ckb^SV34#@lhHjVo%x4-aE zZG-_(XA_p)-+LO8a!(Hg27bCf;a`=05=#U1*=0grUT^jDNo7o|{n)bKaaex014yot zce`U_DXrzcK-8EDrqURAb}lGCP<11JbB8+EWE4D0Em&Z@(=-e8{}l>if8nWzg(E|i z|5w}g|MCC-d>_YN2=Uj7TPKCl*%NF`E_owWgDq_~92n7?GckZ{#TBMLQtS||a5y9A8O zp|TFXw)_a87uG|iycI_z?*z>;wFGU{3JMPE^g>v}+5Wg~P$79oVtJJL*2_yOAz~={ zrvf5A(}s%sek<`hlF-41d(G-hPO9e^la%5^(z2Dv>R&)Bz z$mp#LDyZc3Wr)bH1SjCNulf<@{?@Iv6K!-u#mKrGO#W+W?$D_;@$Dk|(v8= zn|z9;WfXdm?Y0Gr|7PX%y?- z?Btjq(4ytTt=O{gY*&OXc!eSnRJ0YG#{0ORZ7ms`+&hB5FZKSaMxr;jHC7zVC-*H; zL`8uh^|;xUrE{kMZ`S8?TvlpD7mGdHjSF}O76yIJ-UZtvFFFRICu2qJ*Vkk#(<_03 z?@#y_&L@}|b7^HK5pmGW9WI;t4*qPEEqh_alIE%m-TQ@Ysu7Bz*@z!vp>aJOb$P|b zfoF}gB_#q`BM5GnLL>$9-f(c^c4cHFLff-(wY(Y+DFxqUEeZfbRhf3fK*Ka-TUGKX zX4(o?KTyutY;wm;;;+0KUrNfBP}eod#G*@TB3YnV&Fkg^D%vWCQy5K%wxE5sD?zCc++V}h z_x%sSj-_OS?G5^kPBSjMB%d==%kj;qO_J6T*Q)DRhSREaSUM&3FV{Z7rPAD3Whz

WbJFJG*soUfrZ6E4rS^woAbizT>m3>rJ(NxE}T*$4nTji$8HFSY@ zUOX6)Y6-1Nz3P)pq~$&gcjW?U5KBT#FjRwa0_+0Y9(NlJJh_$Cz(=B2<+*{9Npg@Ul+lb$$rjeD8M`zxNh)3wGDAugx6 zf;v|esiLN{p?JkU@L<0g`hZ$H9{1~onkqIQdg|>`O2f2VYix43q%+a@HpF3AUxUFV z%iFfOrbaTt*G;!XO%-+ZE2PAhb25*cr>gxz+d7UST@i6!x0K|IlG@rUujj?SCG04- z@4C&F2#w`cG_DwyoBA4;8n)1fDk?AU<)_iDK0f+lrfSQ}M?*ZKsUqYWK5r?6-fnT3 zK8o-lsKYn9+4`Rl8rzgvW`rP{EqOUCl~m00r#zt(^`}*ubb3d_8n|_ZmY=e^-x;L* zD7Hec1#xTqQIrh3mB3fNip))WO8GL#pn_SDkux93a0$p76*CoVzyXu9AZ;bR#0+B| z(UA6v)y=mz3wJB0?H_`5+kcu{w`^LA=q{NH0Dg-vg{_a1=b z??dmz=+{%LfrcZe&Qk8mR>Bh9M~IAm0s<%MKXLLYu?`$D8>$dJD5wM&b#dUWI!HgrRr-62#kXk^GeVg`5s$>oyU+3LAM^1n`Ol;%oiZm9DxPhIJ8M~+&YCQkyJZV z{txgrHPqIZx^s~%gg+sxSZ9oGx$`$RuXJFT= zE=q@5Bn=gA=CBRLzy`JTR^9h*YNzxyfs>q-d+ z@z#vwdsl`~jqGV!*OqPoT&W`+@JA5Il&e1EF^S<0sf+st>Z*NJ3;IplOa6OZ-|C7T zybBxCYx)Bu>YemeAIzk=8fxVDc@Le-xR0L`_1F+K$KGNekVoj{<0Hp!NY3sWpLns# zToYPkc<(%^TnW@_A5THN0|=t7%m2P&e&4ws>`5=k!CGXilawf<@P^I2Nl7MlPH*5V zyLOc#tVM9x&?-tVAbi`eI~Hu)iim~rRjW5SL+?Z>-7mx6b?1S`i>_n;AnL%nKx*HF zb=@_J-$zw#ruv^BtcN?;1<`}`<+{I(!TZ7970!$uVfWs;oUTI%{iLYPRu=cTO#Aa| z%X{uk4I&zsYGdEWhtZ9b@YQElI^S*5eE|<;8yMi=2k`W?ob{rtAlmBk_(X~RxnGGE zJRWM@=;K4Eaq(CMJ#fuCS{_vM(|gm**f}Y3|M{THb=QW}+V_&9eG*Q4^GFB3c+@;Y8Bb@>U0qe5SLz!%ybjn1wK5lU_JCnGsk7_+vN3&>eZQHH zj8qXn$ZKP<&QuU!7v-S)cX!MuS{H}aJ+ePsbU7jGS)4;`G)N!22Cn<9b2e_>g4c&p zzIIsEPIO81Yq7W%3M{2P<)PB%l|?*(+`ap$H(j(j+EabcTQ-pM&nAv5=_>4AB_GF| z_q7}i&dywhM!+5#W-a#4r$%D~JgCGDXSGZ`YGncb>;NkhN=#1)2ERE{e9gmIFGKw0 zt(AN)hfFz6{N-_)!_4xVKtof5pv|{}yPk_OeHb|l$dC(vy` zgLY zF&mUf?{Y0TxA-vSFx0Gqo%M2~IQ6TtB02~Qn^GQZ2d9@a)IRPH3**GByUsSTmMUg2 zo~#S(&Rn4+(OWR0v0ydNO!T+?1y`M7QL1GZL*5Lw>e z!C7D%wHA7SQ{TIDo7xBP=f~Kl6!sDpVVeMbU3sIpR(6hXab`jajHf98z~4kHJat4A z03{yG#C+{#x6yJfYHhAex~y$J2LH@9x&whCT7y;p&_0x_^0M$30Pq8X>&CaElf^!h z$*esaoe5g*yo_Es4ys@Vt7M|=pbp7@rDV_k?5KOq^>78>%Q^{P)jd3Pi$qf90mali zb*p9ybA{R8vGn4dkwV+TbaBb^cFo_v^#{8A*ANzKpL?v@-YEo|?B(pv3l7_hoRpSf z%e7fvBUK$Djl%VElV$#PNX$7;Wijc6nDKs!-NEwcQpz45sA#{obcuDm82V5k*WqSx z4ub8C;xmDBz5HuJ*P%-KaT!#g5*#(+PfOqCup{72!OFX)Y;OARWGY+mIz|$mD$=oz zlxnlpfioTICsd!Z>JBOy)hWYZx;SiU!V84xq8)zBVF9X-4}ymt`3jv4nicWOBSqbzzwE1TdO4;#{ym@nyuobvVj z#DGl&g;hZaUAmx~vMn)VHutkPgk;PaU|CojI;~rRo^AWQ?Kzd13=?_UrTlCK^1woH zKE@sY7ra+^)IMCQv|%M$vN4A2&gX~G{_?nd2}))}CqJ&<>RlF7O(lcRd#Jz(v>48F zQ1-F#k~6gLK3~gO_{%P8SI8~4Bq_>6C0pitKJVLFFnph!z0h5}Eb4uC>#^?G?t|N2 zP7;!iiy43G2P}96lGPVaOMewmxmYtIGudpBK$4SE9}a5qCR_`|r{aTzM;~Zt#VBg*V#um$vi3F~+Oe3>*LZ z88KhIcw(b`g9}PYjpS84l|~K;Mf9AFK-ar$TFrV(T6)X;)nHro0-Hq!JQisKFU8ef z!tE}Pn1LN{Y$Iy1?V@~kIWLgP0_|0craa+UQUISAt zZk^!Ad&(Of=hHG$U!lMM1+jG9-p4)4E9wQ~@E*ofnIKZYL&OcUA>chpwD=~n6TA0e zGE5BRd2M%hZ7t2P*DO`2H=Y-b`rzo}y@5y|WBj{CMq&2LfuuV#y;e8!5oK96tm8h%zIi*spAOb#adku)R(gQHxMZhk6Gegj!+YhfrmggmM@ zF)G;Qdb=NO1_n!^FCPc*4WbPmS3U|KqDpteQ49Gbg^>|;CV70MGH$DaaoybE-j9>d zmKRMH#7O|mlVfx?Ka!e;#A<4ki1>tr1}BHbAGC%&e)2xbdM`))ZZBt#i`c)&K{By% zZf+m0C#tY!`W&M0hIW<45y&&CJP#{#pV%=0CE zk9*C-uJHcHbXJMQOmZ&2uGa_8ZCMn;ZA#ORThQL%0tR(>`^hW@ptB3ZQ24K69xM-$ zfE*AGe3#zAVV{2pN=i&J&C3fNK*TNL1NAxJ{X#(%`m(Z|@`5ois5u&kaZO4ng|t8+ zd$cF)<94NYS|Tg9uLS*qF(F!ta$S(Ew6RzgkvN#AgwUvV0|I?GU`5HlyqMot^!&ar zSelM`vA*73n9YML6q2qr_^LyUH!x6x+U_R3`Zjh)%rE03zJd@5jsxwU81eFgYDmZ{ z(Jkm&&dv}GHVgV#s_fUy-#eNV0|NlaC`{o=3mOg4`?SuOzxv8H_36)N2=}YL!Gzb5 zFm?BNw>>P;iWr0=0223qa-&@n3sR|cIfs7LbL-{}z zlQQGv8-YW3XMsFNKRS0JuLUsJnj3@UL#@$tntdU4Y+7{&= zN031Vm@5N?^CfOTGlb5>dn^Lu6yB1VXrhSwEdP?QZ*WAY60+uG;m9DY#t?oY8G`@s zc0p11@_V0tm&_Bq6O8XLB~!)+ik*^qmmR1r$J*@o$+UHH!KIBsB^GgsfkK38Xr>x{ zmrbzG|2Hij+Yt{W$GpibwT%(4srLO=9loJ0r`>XH}=G@VZDXg zn~vvTG?aCRru+2mhNR5x++a%ytFw7Sn*C-1%zvz2Fc=itK_5jNLsj11zZ#tPa>M3g zKt7&qD%C+}wwpU0w!G}wI=_K&-d~5Lv%{wGG@fuk9-NWJ`L45^>CPYloo3bHWzi4( z)tXH!z?CBTQW~Q)){$xUhJ*dNFC0}sUr)P@sV(|T!ddP_>fNtWy}GY3^gIiPKK%dJ zD6f?E<+Kap|8-I4L-5snam%uZ>1Uas;1Li+C;pnPt3yv=fAxJ!ec|A17)s!rG&j%J zhHJ7jq0y|eUmfA)rC?v3^-y$wpuYy#q7pWVL0Nx+`QiHCFnt1?)h_%`$G38@ zlP|#jFuV0nVm^c=nlZ5u)LQtMrhjQhwn1e;p8ZdCM(IeTbLSUH!GV;47y;8ir9%(^0=_+-yByI|QBienKoOTN z=IRa&h$K@kvy(8;(niF^)fw=<93D-6wHQjt$w4~pPD~aFaCD&2#Yh)IWS4&#fT0UD zDOLvIXl!9`Z!aM+GMgvZ=l7ABosCHD{p;6mkN0yd0r&pF!MD+LTwL55?Iv@cqlLvq zd|vm9a^<2ojowbz(}j+WqiLRA8!yQYjG-^b(EJ1+Z<3>L<85tR-nUb2? zm-+=NL?f$-)@G!7L^ZtJ;aE{zYoL@sZcHBl!GI4uhOWIGTQU~YFZBo33-1! zFRQ8PF&#%I;rZ)G!1w!RrAC+8pc^cxi_a6V|z(Wtd7RH(F^4M6=AZ%%Fo+>XO-^9p5|$V##so6@%{t9336gTH()OV~jj1-SO|Y3SG(5dDKu2zIm_b-!zL(#jW812%~?pQ7JP3YG)S==u=&|A9D4 z!y4nhCdW;qZ@~*ZY2OMsupFD4o4;4(LXSd)$OF*w$j{#3eNC9-r*2xDQ4xo3A^{i6R<|SF zUv^)X&@K8L>o(j_oEbmxfGR61GmZFTB*nC)ak~_-e&FaQ^~X_S6(4n7L^?Y;{Z{Qg z`^os~T@@}0Wf0yHx3sp}SXn*Ytodokw-?nv8aXEH9K&wDmv2X%btx?`54yq77dy!0 zwdXO&an!5H>`_p=;F-ysgVyaJC~Q?`sQ{s*S7*?HHX)0ezW zl~l=3o*4hf>**Z-t&Q5H;A3lhnExs2Egjv^Y{!0qspK~Un0yY)#22_(fNPVSob2N2 z+6{r>jUnbTuP|sQsZatmGxqlO^Dr>pOkJ?RmWS&?*Rr;@)>R-pMD>3n+Cs#$VsVv~ zyE$BdzvDHyuTSpo%AW;Yr_X5HoSMQa82P?uU;wGNcwI4t@9gb0J8nw-c37x2qhgdd zf$pF-m402ywo#t}ZB$J3uxKksSa)wzmJ+ z_X6MMnf#A$mnfWO(4b0f|HAlUk(gC(52loj#t|s=4(v+ zdDG;Bjy5PoeS=vyAcz#Bp!rX$;jShsQ*3N(xgtKsD#i*4=q$%@%6Vo1slYZ=QBe^a zvze=ceGh)$7>d^BkHLM-5z zYg+GF$FykuU@i!u{;HjbKxs730$Vo>ocV^@+Q6J2`S}tQI%12l_^skGUjh#~>f=pQ zVc<#LSV(^7kfTrrjxT)7a=k_{@#JKIbP$I0F|_J^zDDO$7>B<+gc_g>Mt|lTKv3ie z=&sk%cEw1zo+^|x8sT{xVvhFFh@%#xfut=@LBBP{rw|jvF4|-s-vpKlr#K}q6ey3UcE6y@KWy9FFh+&>FXL(* zf$qo40bk+A3RHA-WwkxWhKKLZHj!=V>KhsmlW>Y!yLZZ+med`kvJVv@JScUwEUakn zLQ%1SV_ZWCQH7-(j5dtEo2e-eA-6v=06go{(BnG0)q&lc?{Lh zPL*!^>(h;%%dp*sc#wpFjU&$=Lh(VVvt|w(1aNx{D!t$F(yxh`8JDxaeGomE)h@)a z+CQWTb8x_ht?XOSHbkH%?c0S`-~?asFxh4X6?14VgW(3^+WlTSR>Ru}fJFpUPyhET zi&ZvYCAS!vwhD`jk?AXc<0ceCfrphfFX-tYP#zHR^tf+zqlz-z! z&AtBQzrW9ghl#9KHV``&*CwO*&6EzuI7;ZNH?n@82t*nk5t;RYAPIr((CMA^2p<@z zN`aK)lQYl1nV+&8K<2jv%<>M{neVAdq)K1Yf7#ja6czKW?)KV@%bk9r*(x5aM1k>h zx>+%RV5?T;8`~%eu($O$a`+`&T&j{2?+`Qh*QBgFNYS7+^98qn+tCeA(lB)g*BT4n`biJFOqGSEcJ2W&@h^33)mjs2qx>xa`>xssve4w@a+~0a%@Afwd zr2wKacx?yw#)LQmsy@Hf+vBD;aWAUmb7qvCE~zhps#Xel|0XbA&i8t(lLQ#hT4BzzP!SfuD%te3%kGlwXv$0!!A-R zjMnD6b@-vm~I6{c@QXbh8kbo3tkCeYoRuwlWeAKdy+0Ij%*~7hfaN z9(&3!_SWUHZEZKXKDk#ZHFkm7b({2;DH``dua-2{aS%+bcXp7mD6V7TrhP8I8`su$ zP}J(_op0)9^_!8%_{7^&DCh0(qkrk{$&loOs5QiVDNM{Tlg_uPKDTZ|92&*UI9s`n zSnc)oyCS|i6k&z_1-zVqPvGaDM&%5wdHOVl$!vufFvF|%5ju4wYb$hOe(URyup2E) z3~fuF1hPIu1acM2l>=S*dxrYUL&Y4_`>qo6 zpY(8W=#Dm?q@u~V)g={bE!cOXR8VTL%wzw}+5cAlEGw?)v~XN^mTPdrkv9J%Dng7u zwlYBRwlgM!OG35zg#+}Xl!o~y-_GjAZT-YVOh1M)NeQRre7H(MD6>pd>A$ZYxrrGm zSq|1W?`0M`u(eB5Z`E_k``V{38u(jFZcKqNc~y}m{WCuZPd#P380Ex8nr-Y=|C${CyF95|-NZ!jb#R(X zQD{S}t_SryudV3!i%JGe~&Nh0=Gzyn-=#RFRW{S%651GyEtHzp4>cJSpHKOEk&ziApp|auezUactoYHX(0QB zU)}^E7>-t=MCeB#2PfT8`pexFb4u9|Dl`d1C(VKq3r|~37CclFH*kp?RxRMFHDy@D zz7T)}4R9V+Od9d|fQ^*ZsG2}>6>dD1@@1%a%v|nsDZ4&w*tIgdT&tSBNJoaKylFzY zVc(B9MO&@!#7}7u#RWHNkj^uFFGBjOQZ~zuC`#@Rh&c$dMm942mO!GK|8q(uPAzKi zq|#%R0oG$y#`*Q^#d`VidH#9pID$G1_^-}|&VEufJTyN?*zbb#I6&%Gix`p5fMk1I zmOY3wF5_|UYPLMJV69iwL64c&=#h46{fFzJ2u+K*W+mG7~aC5eRJ3S;_vXnqOd@{ z!7jO2I!R?W%_E##oWL;2y&iQ#Ppj6ICb<{wzO%&WY+k#UHG6Fna<0Lpddf-j;Et`+ zl=MTNu8C%o56!MI;~eJ&W7$Q8m13c74eI}AGqPi^3PGe)ZMeUR_J*Z-%eg+Ffk5Hc znrlbc&sY^NNDcAV1$m%M9y;W}T>!NqR zW$0pb_HLp`C&%oxZqp_iN+s{)?gPqY2bo-&Qw{8HG1f8KM&A}PUk)0LGg_ygbw&{x z9Tw~pxwN5Q;P%+eY0}bGL#ptT@(x+j{iJ1mWX%Ic<7r$9Ak0bfZ58@L09asN(Gljg zHnBki^bcQ;t9LNfo!b>$V?B3w3oE#e1^ZFR{0T+Boi=4V0O||uNjZG;PQG9TEY~p;F7StTA5u;1~Kg`0}DG9g$8j$+N zf)Nze+3soF?3DP~;(Y(TYkSa3d9s&ZN#4MiI#M)-(r6X0=?ZKIVvF0c&?R{4#A|wi zN5*pbz5rvadexQ#h88e1#42b#e~Muw2{y_!%K!ZB>p`v1sq3Gc`_(9dDBas&yYOaw zq11z1)VHnwG~Ez-nT)XHj!Pn>fxgOIbL!$ zB|3N_2ZC~U2om$Z_uf%bP%S#n*9N)LA_EJOT~Tokz)MIKfEPO`%k3%1DkYY-+3LuW zoA{iY|2Hz@)AIQ>|MR;2opeYwMb^B8erwR$3zg_QaiYt2M{TJX-)g281oxE0`#z#x z_>nghe5|eaI}ad@83Ng>ZEyh{BL_L>>G_^!~8)1Ua#UA$ysZ3O(GBMc|)J%nC?NePw zWBVGB#+AsGPVysz%&e@jd@TmL`r2i4U7pN;mVrKvhI+HE2@u;yxRP3TmHL~oB_w)BhnhVMG zb%QtWR>e<6&W0jH5>*9bMIW`@`h?Larlahup4ulSs!C))#~p99G;i`9s%OyyPHh&a zIj3I67F^HBS+C;k(Hp!OCKfK@5WsQ1zy6jKTE7k9)X8{-PSO9*-VPPhR@K*6owQ?O zL}_(49v17a66S`-MY-2eAXG{JY6xzRXR^b$NcTg@>)9%l!4_$^WrYsRg797PMJ!I;2rXL{X+fEaHU@(z z;)7_F%O6~SQU<4=foUIHa?BkYo6hn6Mjd#2MGUV+kGvHx;Tu2K(wVID{U+qo%PhcI zfQjAF(ypcYdGWvz$WZl%Q2-1p%Unaaqw?EKLF+n@+T)G8<Ui zr<1&QVN|vmY??V}fsj)C-Q!2>;N_JL1s%axZF;(8N%4H6iRgr&_@0?Bov29rynwW% zzS-!-34%@4;z87Bn_HhjnsV%Kwn4%1iGEICaw>U0Z@&`x8=1_wX?>m-Ulj6Uw)O)F zTg}CbQg~DPj9ltTJ^grBr-R`4*w2Drg=)SJS8T}}-(h#O?$tvS%0)E9(w+q!_prqq ztOQkGzVky(>8nVJMf`S~_3J^IwYe(iKn&izrJoJd-YC!fCBrN&3JTx>@>(S>CkVdp z;X`A8=jlIrMKzpInfVHZFKdIM{7jH9HM85O&u7d3g%L`XM#ULyB8hOg`a|j&c87Dm zuLOHlH40p^T+h}icXF#CyJ)4K?`!!2>_FOTh3w$I#wLBwv;A3DtP2s9Uq2hA z0nC*Yy$kJc@z>!sX9oaK3DIrn^%~=b{q7tNd-7F z>IN$;P6NRsEAQMc5G>xmv#UjY4=2H(t|HMZX|tIQ%^tFN^Gj>mz-34CR&@W_D}P3Y z{VBTGMzsT9*Jv;OH0c!4$H^rsFhgE?1RlO`=tFCa zjy1*E1~UJPZgT3?X=J5r80Kk6{q+47X*Ug#6t_l&{CPM1gcK@2g2UyI{Y3zGedH?B(V5m*8Ta+P}OX)XuBwf=lwlbArsi|P`^!Ct=?bXXp&e9L*8-AoE1U4~qy^ywSM1M%Bs3W# z_JBIDfe?cT4j6dACgTL7yQB&Py@!S78m=0Mm{v~5dF^E$d!Jv@n&}A|l!$!+epKTJ zKwAi4S8nGQUmur?H`^^&8>FuNT(nn5l{Q;p?taQ)`+x0EXa?hsg+LP(5ZKu7tTW%H zjM0PX`i5`_!x-fnckHJnKgwr0xmwT3{-~=c9r#X`Ls)nBLC{+^lFBshcsYYPFkVlu zaqplH8^nbxQU6om6opxvf-eCT>-!J=jbB-=+aL8Bt!-T2VXDkuvd%|4ef$rqhXhD} zd4i;@-+eMg2=?4<{MWFKD?)VMd|vP%>+5q#$+%FM*&n#o>0oT>oAsiwCa5$>e*pdd zzv88rQOIxqux_Frw@vP% zw!=VFCc^#E_;JE-?4uEjdGqU4it&H0Qs7d_diFh5CQd)gtSuMvg+pK&Z$El)t`V6kJX+R~VwfGd)cL%roly{>G6_N~SPg#!Q|`RzKBQ;j~K zc_m6b6g~u%FByi*%qLk_yS(g066sjw6@4m&4;J0D z@45I}Zs_#%r*H-Z3UlL{Z4*A{Rn^D6sD{pOV8ucu5(m`amV3?bsVn9vM*Cu?5Lh&^ zkax5HaAU`@l-8&7%&pFC$GK+OTZ@}R3md#9YGh(X>r!{M{xG)I%-Ts)f%7bTdGJEH z7TEslFD}!Uq0&y&@&JyfyX{q)_gf?zNwh^@KH>Qsf7FbRzW_rf1}C{b9VH17}81|x|# zky~7G4Qh7(o*W+LR#V23Gfd|r;s+Pr?X~V=9J3TUuFHD3xn1Y}OeNjLJYpz*%0L}6 z&*z>X#1$XB_~Ks(puajy^h)&o*dUq0zZBWrS>;Qmwv&pwCW(7qK^=dO1aGECW7dE#e(bR1c)v528BFeRm6nozJ7JKgWzy9usS2esfpPl~+{-xD(F>?OJ^MK>HCCz?y$)#F-r`W zS5s3%Z6H+P4|w5yQG_-Jp+MzW90BfkLr=g>-P{?ISsRKT;Bd7+YvpkUfwNz2TWGK$ z41_TH<)vxGyk6!eua`MBmUGNT8SVc9!4en2Vo8f(|HX#BCMWrSQaAl10$3P3Bt06^ z*iJ(e9d}yr;`5J7@k!QQn^f{LkGF^0nOn)~p=t4_8)E|#L+GEtY^TM)szrSjW#wc& z?skNO%uLyOyo>=0x%X>i+Dsh#+~uOK?OX^GN=WE_&L|)5mE8s66-kdyX%KovWs9I4 zQQ99|56`5lRW}2ruqdC_x9N*i!Des&M|?V40TUO*!A*DP{5Ms-A04WN`}S^>lrmT( z^WE5r(dyVu6dfLdG#IgrPjvo0Q3H;U#8pKlDz%1rhO~7Pq>^<`)1ADS%acU|BA?Oi^s^_ z6On;sH%bxnK1O#g*X<6Udxi;KSC4BEM%KIOSxGnAnebp2i>g+_JD$BwxlJ7sa@`A8 z!X!@D*7S^wHy&nd|9qLS#SBzDqYkc=WEia?s@+&~t!z)~>>3HaRq+^A>{cqjX*kKJ zAetb-pv0WY_Ih??(K(-o2ug9~Njb!vH=V_2IX|6WKXcGkj^tGjaTxxkh$b!bSw7*% zy)*{nAyB729%lM+171ld27f8i7+Ub$4cp0YN$ZVJVS1%6p3mn)sFkp2mF$V|Pf#as*thbGKznk5x74;jM#UzgmAd%&&|W)8bwsUX@n#5XfXk zaW}AYKUxTqwD!U0S@afDjdJnE%C4b3zSs@p#lrg6&FfuoQ83sP7eG%JB3QAwfeCw^ z$!a@i@O!iS;6DIwi7PI?A$ZSee?}#VID_2FGAv+$_+{B;|Ho=e6xHdX6}-9>amQyx zxjV8v(H|3CI`2;NepN;QVR}b7j+NDrdzRK^X49F5gsjd`(jfsxx~*Guh`I?4Avgm$k3?+oFK0I=&>qXo5BpAU3w^%=2RlZ4z zm@q`7OxQ?jyQSGKe2EAcZjTds7E24AfNK*L%JGx;af0d_$cer^<}!s%El)U(r;Ck< zIQcdHPjqriyRUEr?KO zFxxIvDlK@q(0EecL&$6D3dgptaQ8NkMZkX75uwj(@lkJhVbp}c{=E60lFrX^h*VmJ z(@R@wL&FtMQs3WX$*d7EK8M%^D<_HTS6~+v1h1%9`Z>nyvWg}(Q7Lomx%%AM_yLp0 z>;7!^5lj=M|HOpk<6`XHX)xXMMkkEBUrhr0FW>)lS&WU-*s5Yfz1E6uUk7q5qC%WpIK-MfJ+34K32SM$L=9McgzPF4ow_#A^_2 z9GUP$rRaY0p{al<;Sk=-G3w@G0JZKsCcbYX?VUWwCud}2-EI{{xhw$~Euo91n#$Dv z2e4ZQMtg_H8B|VbH8gjLn!5bhl`BgdUH;L*;URLCr&xr(?MwNbd+4_3@Fm+-i{o$Q zugNlW-ifZk1zbS7>%XJg#6cXacSRRve;%Pp1T1O1K2W0-6{nSw@%I&QVB5iFaC;&5 zfV@tV!$z;l(*tG>kLs>f^LD#z`ltOzaPuMD0R0d%OKJXR$}k58tlBo+-%K)FrLtLkufp3<7sl+mdoS|uam(udCgfICQ+1G3m z)jAF)fza}Qp6kKx(Z3P-Kq8iG0~7&CKqMildQ1_En zM55C}fFj0*kB^^IDWd)ekSl z_{}nCQ3T+m;jyK3YLI8^lg<}!ApajJ;``|F?|0t+n#iYqirGIo5jE<9x$n8q1=7~l z4Sb{rK-#+CRzHm!NLx!?U0kRsEB_D`st);xeXbi-SJMGd{URqqbZ9|)_A_-B699|l z`RO6`nL!92pb@Bzjjav?G=g%`U)!+&jo_2};XJ3+)X%}e&;Ng!@oYi&s=U0s>T32U z6%VGjK$M-4+5R0!u50<(jgX6fwuk~~x1{5^kox-NR(JOQJp*r1AmV*(3#@ExY^7}~e8`ktn zIhW_>fn5Dv0;WtDRWZrAxqiFjtgo}u!2 zF$BL@euLQ`=q7S`d$t)99nGfSbPBMGMn^}pva<5?X^u6I0D_9qeQ#eMEGVxCph8lL zd|N+el01U(2IzrC*Jh@sy}i9nt*rnH$Z2aZVWq_tUM=nqFViZIcrG>0XSbh@oBiTg z8(w*kKm~xN3fbe{eJ1P1t##fV|8TC6wO-b-FB$94u?kDrP4)ZFA0AH5g*pqY-*9Qe zK1FZhDdfe{$ch3^HwWUx5Z4j3uA{3BJD~(s)o*r&a=4)u{xxbFL$)^4Y zh!2&jeYredc>pG%&xoTLc?3**VHH7N8>Z<@)a$aOsfq7vMikj$nc(DasrJYM>N_yN zi3EsvsFum!zt2uj!&Ax;5~c#9Tj}(p{4=}WTr-xOu(7e>P=sDDfD!C37SGJX)0pmt z$nXLTMa1u!3?JWhvmfIW-pR@7JqL$>sUjyQr)9Tdwm<@pVGQ|?MsHf(uz;rh{rz=| zk;)s?vHF$f(s`g>ueAbZ85#sTv=4|Of~>R=!|;(i_Mgu_m}(M#82Tj5LDn4u7ple0 z%?)8i!XWtoh6V$C)gDIHt~VaNFF*ycn8<;A1099qZN+zVfA0f8II}t@ z*+L`JPWKZE`EVIo*+#pSmKJekA8gZO+|R^QVQBe50Qe(ENF??>IoUrID7%KJtq5%J z>%#?yG_(q7XjhB(jU9|dAKK$NrH}{AvtT`18fq0;#rOAod_*}?az#L#&N1A>1V{}S zZ0cwekdiC4***N8?ys0;!)9e+NEzzP$4IbItA>*3gX}oeFy2GySXj_+KKukD3&8Ia zS(gfAbVzZjh>5}E=%RNt7(E4v;*6MeBd7r7p@2Y4^g{^TT8B?i9)UdXX#usP#*(Sk zR|0Cu9yaFy@CGWCY-?AOqpPb~o&dxU`x@!@vM^I1wiE0HTJ$GvaZ_+?yt;t_#WI3= z1z{U<4kx{eNpBfQ;vZ>bWF!ZM@72Br1HVmS*Nk$&B9J;XUb7TH>>|e_xbB*&t*M!u zn+x;7I@zVC=-bZP@U;aGc`RR*eg*ocUT^(a_c+FP>m zG*0+$;4ahT_;?t5ZzroVo(Yosg?{DFK-`z5(6wA@yg%zvgieKf9rN+yN60XfwHNl3 zE~>n6Q(Zu1{`!re^-Kvqvu0O<6T}?7mCC3rD+IC|lMDJ&i}Ol(&2LI`fyehBo8w5m zJ>8Jx3m#oqAigGqrdR_UY^U$#Us~N_BBe9~u-&};o5vNI&EJUsI&z_xd_&((ubv=3OykPqLZz6iWy26*qGxy@WR{M+kj<2#Vm9PZmFp` zYy7&@<<|M_?tL;Y4-Q->slj6ZK4%&mlXCGZ%1Nc44>L*!{eh)-*~QPr&5iGt(;fVl zYzb+%v8xDCR8&+9jRU1kg~xUtCKF*ja7f^^BzT}#tJBDvj71O16BJsK6d&(!dkTht zY~+7pVoP|equNHb0UTskwZuFcShWo*(h@XV+R~aLn8w+1t)xJ0ZS5{Rw%eQ4c5gzw zAbxplY&S!H4P-Bjs1GS3*E0fIVw}qD?RtfrU zkEfRx^lq_1H`+LxyiA{`cMVt6y+cT z2GYVS@ljfOu1QL}@V8NX_dSErca3ANLmWisPl$Zlz`KxnF$pS(nP4tzAm%7)QCBJC ziXH(&6J9~$FdoC33AEB(PY6Zd_E6%$%CPGG)PNUYN!Nj9r4g}D)bt}V%;e{re zzy*IGgVvR-8>xC^;hIL;grN_`0^`|#y@IrWYBUTmN{oR)d9VSe^Qb#HX9!_c+@{`0 zr&ttxh<~VsdWjzGPQ%}u>*4^FYw&>C%;PA-BH;l%Ok9_4S43gqX&WLm^oy(%pehssD${%G=B2K|$xVJz$PMeL5sMG;UFXT=*j2@Q|`2Dj(Irz>5 zQ^&wo9vk1N0NBtxk#RcCC2*(uVjdtQB0si-H(I)x=R}Z!e%~LTX8z7`@d#I77B%SM#NG5#}IZCpj>Q5Xb7GuALgys;}=RO z7*3n$JPy@yOJIsv<&WUt0Jj>0Z@I;_JSYgBi~$w5&cT8I=|MQ-M@bqWbRhti)i!~g z%d8kq43RG%kpdY+@P_3!paG#H^%M{B7QwbVl>K>9hxhbrfQGODd>sdo_AduaJ|Rp( z0>+K-uUuSQFrqBX(B`7k3L`!Ym`gC&Ee(&U>kb$te`gFN7(*4N-v@H!?*Q4ra(n3h zp_K6v5{aakxqc0Wnu&&@qQ&IIq>|s{lm3g1V#KLk3UeC@vte{RIXsLS>Uv9fi_Delz=DRIu!n(F!D4L1 zsBOZ*HMICaCy_+H5GrJ?u8!w{63~i~HnQ$s2PiH8tw%r*7AUH&lx30_cY_RAimYh@ z?KkFlRJ=T0xL)8y=abd;^$obKpgj?fTX=1LKwkrU=m@$iQ^)#48!$XN(>$~pPXdT- z0>`OX#BelKH?HB(Z2(^D6AX8Eh3&Z$IJ5-D1~5*wQquB;R(Spc2!Z&BdT?xCS`Z$H zyUKAPyT`|vDX528K{dC#6S4fK* zFbUJBAapQULK_$6!sCGp!)90`A+8_O)DU^Ie*B=~`v#LEhYkr7#P_g7dPLdn>W(y# zq;MatjSWG`gZmB~Z{xUiD#WhDpl-a=)58TWcJ}JAOx~an*c3|njsQ9Ov>-C|KS+dT zJ)szFMy%b-++?yaNHkgS$jq@naj;?~)>{#F8=y$v&A}bKO%0r||3xqF5ex~cToV)2 z-UnI0gUIHT>>m3)IT&d>+bfO5Gi2z-9H`)H(rdNA zFeV3_AD~cLp=F#uUY`176~1Z!G1ykNfs@_%Flc3&Lj_5aLP!*prEi4GiF@x0L_g|tQ8b!lfjHjg$X~$#?-~u{r?`n>|gIgti&9u z!}>(iuAq$UwMSrFP*dl*rl?V4qXU}j&G8oqPIqW1El!#O(q6l@ckoLi1LiA zkjegff^*57&%2*t9a7EM*!tlR*N;&tQel%Y*6k4|l%y1t1404zv~9Q-(XTSNb$Gbr zAM1FFB}(U;a4X;{B8r|~M0~I}zR?^;1vwO4Y|D;9@Z;|F8+3df(4h+xbeYG&a?U&S zD#NiDQZcl`4!&aS?Ye;wtV4|JX;d(%j zrLpvnAB?2`69{FaNa}{l;lg~n3f$J~A@3%d7c4;2gX?-rhvnU+_%Ox#e1oKlJi9Y+ z#?5?kfEBlBkmh2-U_pk$Bdl+fkClvOsi^}c0e>N8E&CiTa+`up4o1oM09srDd1ea% zgv{gmP-mVo{2*{tCXUKfkvG)1+js*26dbsiCG*eBjS#5q8@(lMFse9>F#lrr)W?D( ziV6!vX^z}to*9S|d0)-5c`I+ppY?aB^p>=Uq%<^v5bFI&NB(UK3dgORJREh7Oiu|OX1kbNJJ{B5-PWtmxf$N?T{6}2RzzX}m9 zZjUk^`lujaSv-p?b(Gb#$)m%=jl?B{auEU{5v^jXs#5?;6BQYm!Dl#HrSrN;2*!FD zLl7)fgw}KEVgjg4BcdpCEpf`vUzqegD{`?1qCyo!-*0Pfc16q!R4(F1VE7A z)6<#!&O3nkaCa;ddHj7GrD*6b8~2AVInlX^iM2qOh=@i2Kv}X{T7;`zS4T^{Id}zo zOyrc5SeY6|p56fbK?QjDJz%?nz1o2+J_BIs26%B=(Lff~Bg4bzDpdrmy7ktxs8SB! zj;Wl-;EtmN1O$GjZOsDeje1ZzZql=MM@I)792~1&XEX)E?fzT~4-~i~a^~ zjfQBFwJz0L1x++rg%<%pQvC*z9Scw%e=2^4gH0H<3)fr$|EQ*hTYOHEZ?3Pe4?qYq!hk+!>*QqZ_3yJ${YMx8kDRf!zTQPb z0xlbelZgFQO%bALXGsp8L%;}j(AAJk+B~{lcSf*L|Cxh|in`v^z2x;l%v`nU3!L{gq7`d5EXV zY3ElD>omA*)Nl8frGV=4cZ{&G@LqIax5q1cGwy>+P#KCvnL>_GGjL~HV)A?*s2z0R z$^+2Ayu7o`0j!j_;SoUBXEJ6J6BBr<-syyY2~q#0=Si=wC@kCt0-N8Hxt@s31NF7F zi!H9q<*Gd{|I}f2c;3E!d+PF5VEb>j(W`>@;50nEeSDmQerVMOQ28MtAsw>9Z}}cC z^Z&5}Bh){L`YvBy>DCyB$Lxk-Pcpg(JBQ}(G2L%}7?WHYF(=RABK(W5a~Il&NwwWNO$+(T z*L*N(z5#7Nq8>Jb$IhN88BiJ<-+tK-JS8iKww6}NtivVW=>~M~ z9VX9l=A}dk(IT!e0sjhZjgfwa4PCl{hk?)=MlvtDtWPC#xBeo>qU3c(L38c@NdgF< zApvkavX}Hq5@0F3ui{Ssme*a(X+i=k;HZ^PpM#M5-K5#uSh^;O@wDsvJfC^6RKb4& zPoLpMX_;?E96xufVt2c&-9?nUrR7E3WNc&FmIwOQtG%`Z7gsQz2w}C-rdFH;Y^R_)!yd zQs2;MPERZI`dF^O_vuW5@iH4Ev?L*cI5sRmnf?)RImDd=mNvTs)?f2pEXiboBz8D~ zP~SKTdx+>aYJ#sod%sb=<{p!d^x``iCPW=G9O#OagTtT~>4|d_8wl^)m)g}mmI}0~ z<6VGq#_7xRRsjJlIb-6ud>TH;ZLZj%lKxq|DQMO8@vP}nrltFD3}osWH5#hlz5Qsr zS$RR-^`{vtVLNs-e-N2FNJO|%1qOt?JM0Ev9UP%K=)#^+BeSJ8Uzt_0#Rvc9)pZY1 zgGgDZquzu^N9s1uZn#_;k_n0hkV`-IvoGkH9a{eQM1)OL@0N+g({T_pWkLXL6?>=z)omULg-yCt2=vMP?=e^C78LE>0aj zH*7qiM=|^KyPcly*)S`h8)LT=EGmh1bB`$%lf1`(?P{w-E7o2^w{8@+W)trsCDc{i z_{*tlMCrv{X(&(q)m)_NCJFU)ftkrifcq6%hW-=9#6{az+FReI}JT}WGQqT|u)y_eL zw`V@@z5-}#h#noMfR86WuP!^6s5F>FUzb`f>hMHIMj6DeO-R<-C${O_iGE5;ZHawU0mKfgg>0}T%6oxmAtsybofM^CS$jS=B|Symn76p5o}*N zP+i~Qr`gpPcOF+T`5I`L4wS0!#I=2|dwmwaIUCnm1Y;jzY1g1ms4LdAyuZW#8}+os z?mw*$W2HOqhRe92voqoR^8Jo z0?>V0M;8`zSmI0-sM3at11;M!&0RwE0jeV{cOV2udbD4LM0}pFWhxthBE{!F6adVu zAr~p^DdA^FS-^eG)PoZbr?RbuC1HgYC6I^@?x=h}JH!c&w&|Y&(zgiU>F9Bw*+e?f z!YU;;K_P(%Af~8S(P9Cu<{(2zmH&n%5;xt0WSh*+azJ8sT-`q|HmR1N*sE+=yOr*PF_6qk&sV6qOSd+xQe4e z+P&jy_TD|t|Z^Hup2bXje1vJ-b*%O$Jo^NxOBXo?>C|1P| zc4Zjt(kW1Bw!zp14Nq{kKBdNgXc?R__Mxw#J{b2a*8wAd5m$%>Y+SB2-4 zpt{}^iT@b67M{(Z4K5HW${{E2tC;!(7qWZSK4b9U6s*+EkL$dAayw z^{HRZ8Oj&Np5vsyYrU3|awOyJU7*M*cmDo+b54YNX@cxj~K zCIcD1BK~ycA#?YYXs+uZ%==(lk@M_CQyOvoVABkgDJA653&u%zeix%|=r&oYzj1Ow zpi7jkNQ38lD{epBbPY$2&=RRw8}oMbBP!@&qJ~^R9>aQ3$8=qyn)hR&#I%;4Zj>v1 za`L}l9-H4!%uru+EWq^Cvfrxsrax(EWk5ibA>k2>S#fjoWB9bO)a?_hn8slvt``s+$%WbU@weG;huBY+Enh2Veqbop$KpIq z^p47`QIp*lYYk3lWJb4QUmbCHjLGcAOEl5KMk$;7pKXOqGYEYCr?cW5(4>M$uxhbY z*wP)A9W2cvd>%PGS@M`I!i(>X!wAAMDCl$nntI>+krjzJ)%xHq5Ht?N4n@SRQYh=% z;UK-0PZz9HlMbi*`F?ClB%a1f`J7=T4_8y$?RZM#qwA{OdC$FpB~GoUx|tA=bl%LU z`G5pZ70tMM)S{%VEidkUA&~1IBeH=E9Vtr8kJ75lU=%Wnoy;RrBh6I&G9zzqrYcrK zO*P})GFCvoYfQkBLrulGa4j<#3-A5O6lqTo>5z|5&~HIM!uOs4>wNuJyH9m{$y95c4;BJGvy9EjEZUKTj z!5sp@-8Foj=lyfPx9-nNO;Odubf43wd+6@H*IsA5FhI4dEBwViES_}#+y3PIF@?w& z$G5q@UcJ_|1(+1VcTFL@$N1mCaJbvNHl9_?Ejq?>Q@3Z5-$M;1L%fZY|s4vkh&G+#KKhA9FigtW1+chvUX7sD|a-$3zY!orJt8p>A z$>-ds;f_I^)LGP`iR+=d$$`_nV7r0egocQ$d?NT=uO0z+rGJr~yA1oHe1p1C=TBBO zzid3=a4anTIxw&V!g~M5|Ckcl2y&? z{$37rzwM2W%d2bE%c7&e2shljXuH>yE{R(>+BqMdTW~O1{or~kfefOh#iKus zsJ`E5Q-ID%uJqQH4Bjf#?=o+B!k+7e{{#q=g?EHude;4`CF@Ku* zx+94ULcEz5lU`cpC{`w51GStqJ-dBk!8q0fs2oz4o;=~cRWQoLU_B~hYq68=&0uF z%=x~|&q!&Ji()38<0SF;o(vbpaI4_^o{L-` zY&$k>H_WO|+1C3b*Do*-B*258qIt;Ci-4MNQ{XH8T@Z(lc{l2aMg6->t4)i{(5Q_o zZjQBFkgCH){Z0fbuKqYWnu0MGd-0YOZn(ST?y*PsGsU%I|zQ?&?&ConNhaMGn1*Cm1ZR zuWP!iB~~*mxiTh1q%?R^mq{hX_n1O!lrL6g+=aj0{QB%QYMUj-pfbvw_;qSSSi)oL z&OGBz(yn?}L&Ia_Tb-J7=X$X54fa9%iPE2SbYP>dI_%3FLQ>_7FOEfe^q-(>* zqtj{@sn+&PsMpM7E@@+z&V9^ds&*19(F>kA#IK_pIE*lGCPezf&02Dal zAQ|fO-snS&3J!PVZcfWA8!y#}9;r9|g{*YMLZFYUJ>>qxky2H5?jH2kQq^o}tbfc* z>b)u@gtSEw#2(E!KE@&@&nG*(&&w(q`9(V+=(d>FmG)6Nx1z){x(a*BD;UH>nNFiD zPnzMlA^en1+TW3`>h0=hs>E6`Zr#+^(z8B>HIw9FG5_PWBbr3Ip2-Rl37&NcyGfnj zX#B%;xS>{mF1t%X+g6Zu?iphF$?itg*mshrb7|+x%P>~3Rr^5FBxmC(jwQb7WoHJ_ zx6EU=M@y{h;_k(iFcsq+#kImp&UD&>W-lR`N0A}rDBxCK{M|e1ndTvl=TFnq>*udq z(7zJ#7C@wvMoFou#4WH^FFlC+_t-z@BO45nLbCWkQK>9Mn}ul`k%i|YxhHr0rh7D` zmzT|CA7vB?4nc7`=eQaNIG64lFN8$0X(MGb0M!0I3Owo4A}=(9Ma)(VUAJ~V6f;fA zvrGwK2*fSEIqm42-7k0>9c$4iHEh5vX%t_i#dvsLsq=HShvNjU>0C-{Wm}IOeq*LM z*ea@=V=&)DjIVBYs`!Kl8k(>H-|Zc9bxQz{XDYTE3G>73qnh2Q@UyM&>X64!B@!ev z>Ppt|#xU%7CF9sy@ghwdFfQ&$J|qBis3DJ7?9(V)KwG6>%M#^Z~cm^-{BcP zc6Tb`R4MreErP((c*|Z24=F}u6Hz-A6PJ`n!A>}vuQ(^!_uYDWr+)Nw@i+_}JdgtV z^M~7-fx-3r3H5j$mwt;r2K=9xPpdFTNMcH3^M zr@ziz4rvTc1A?2J(t&PZ_6#OayFh&wb-Y70wQ+sutl9IJ@3jR+MJ9`t&;4+%;ePsZ zG}v{H{y110kIh{vfhv835)O0Z8MM-^QnO zEvFY=U%Kn>{7iPC=LsIJ3fk=4DW;EV_GGE$w;&L2N3zIjGgx0E*G2q&y z@pZ`C8y236>9-|REzZ63Sf*0PETfVsjkQnP>|NuwskQmdV!$u^E9-J2L{(o=u1lRh z_2fE3qqKOkGzvF|xfI5YuhhSd4mLnUKCH>Z(NuB@ol4KlihwQAWVZiIVxWg=s`7&; zdNLn;W>fNnx~3fXr93tt`d`*foJm9tylEyMZPN=B)9oy}Qx>aS!!}hXr5Ni4{IXc$ zmYeDu{DRcAmW-S43QydNo(FX8fCt9C>a<}m*18Ubbq^_~!+STzKh9BE76eRnqJGv@ ztIp+bib|oEle4KU!!}0->fYp_Hm800uzX}S=`{PV-x~9$nD@uxwA;eeCu2uit^hW) zdg<-c`KyQ2Fn8tLq1kX|7xeDmB;Q490)5Q7e9BQj2i+3HNyqM+808-ZocPuM|2to5 zd`eg;ve#g0xsXa?2oRM@t1=oYeL=M^{hq}@LQC`-Qbqt-jSVBL)SoKtv+xMzotrh@ z+k01Ugej>)2E^N(1HWx}e(M@3j#@6Ux%#+-r|pU%;@x)qrB}-UR^8D3HUUW&ST^fT~IO9!Ell z9W?qK>QtoaumrQWgrm#PI2kJYb zFlbyKS{_K!be{$eIRzYYY?hIjEAyNT~Om}P)wMW$nh~lSU1_&6ypH8wT@U=WyNQG{0v`xZLm? z8YcCMSD?jwv{nmTPuo-&s~{6_qhe=|lfdKP_Xa}l^>Xfd)j%R<@}!%Dgak0SEgK?J zz5SGn-QC-(Z%9y88NY#C)-*0|78=t)5X$SHILc{NJGIH2_#?J6kpSc(H~6 zAD=gIE}dlzNHWzM{Mt(cXhb0CGEuWO@xA{alGWwye$D8}#a0#(AKeA|fD`rV8)L31m;{ zv%0<(1F_|GBp@(X1qO<$OTgMzz)GW5mX&HiWb4LEnET%}Vd>F<_>@U~mu}oZVy{K4 z82JA^cm@aj0w!(kqf<|3=92u!NOEccRWRmW9ArQ+uGLCuP&^8VS9|KnVKs`U(v0=q1mm zL3qf1;!uA-U;u?mcK`CFuCbA3003$aVu<+wP7u&VzWx~_*rLsyF>vP!78L`4<%dgZ z6M!4>2Fzw*JI9|ymZzpL&bTta$n}0}0Hp1dSrEr@`|Ub*@M=az#v?%T#>ZoduTSO( z0gBCSr5OP6HSF>N>L0K}4d3MuH{hnb86x+588_+g^tgmMlLWB)9YDX@Lg$3K3Zz^C z_8fWwZjXAcsV6@#Apx3?11ca?tgzLS2WecVN9uk4)4#pH+C?h0u(LyXT3T9aZEu&X zLBIr9a@3NXO98ow3QK|7MnElVk4qN?2Wtl~qtON6L_J;I-cnm@Yxm3FGPN=$+@_o# zqZf9O#m%8%dVL@zkOJ}*EIk|t%br*`r~vrKn?v_)7T7QoHG_; zPESwS4O*exxYm|MX7TbruJ`r9!K*^Nyi~cOoZM1S`2RQs$ zeasTytvhnrp4!@4fOq%u^b9nQ0uD?^hmi0Qd`YOuM>v?R73}YPG!2fea?1Fd8N>_)w3}_m0g_Wf3s%;S-UEld7b=o$^PXn)q&X}j3(M@zq&is*P(@32`ocw zd2?C>pd-(Ba$C+$Wm}b!<~ICF(COg!3JO#N6uq?X48B6eJH1)h+9IRaU(i=p|6}F% zegUf>y`rJArz(+&QvtJgvuzRnLZrrfVhtdqbHyMN2Bnf85+*~J%8gPA-Z{E{Qn!y^)KC4#6r4NbZ-UlAiVU zUO$hfFoVwm2%uOZ111ocP>_*>YM{Kq{sW1t*Co~O_7+hA;KcpFar)TgBjFxBv>_BY zfbg&r`PdBraS`LR(v!lJQLZbT0%7+7X5Lg2!;3xLt5yR^Jx5$s=OXykCmy#bg0z+J z4nCKS6G$Cok)MSmB_)|6?Vhc7>@IWxr%KQ=V(w;u$UAovWZbjvna2*SRj4E@1?YoR zpla3g;exVtJ7Dz)a0TJB=+q{DO>o>on4F!((JJeuCp-YRu&6<$76Tn#Krto4 zS->sm=<6bClOe7A30PADkwB`D6q{dj!8|etBS5LG6DMo{romSeXl!1O02>hRZ-Dg% zzzB>@7}DN1_%%-_+hiHEkP+^GLTao2knMnM^&l*`P^5IBpg`EO1ZY37B^-`ifJgw9 zGA0K#+n^0M{IDMi!37eFfYTOSKrai!3(8XABjry)Djb;r3)4{8#E?e};Ft=+5ST(^ z`w_*%S5oxtLuoke29l#I=W!N*Wo?9kOZ1H`N)-9lDMA!O?F69@bPpoN+O`Q?U{!am zD~3D!bOm*&ogRFE=N2h!l+SJ^_l?d)RN$=`c)ceO=WI7KpTE`(1cG>C^-%Kf^^HBZTYZDQ(gPSmQ=mI^Jok#-6SxqoH zf0}-T+YS?Bn*0b=DRPkHG!EmU$FB|Tu-G$9oq_mFYtj_AR)J``B&scch6S?-4j^w` z5??l%Cs9Dbh=o!PK1Nd->5F)OAz&|}^!|MSIraWQH0}03L1e$wI}<5E9q(FZ!savR zyR8zuP>hRRxJ~8sM@SbMW&mqeLR0$m&y?U?_F<&17Q&Q3dU22#M(v$RB8~%7pl9QCRIeQR8S~6(2jQ)@5d%{j5n2w; zp!?E@+?~$5Gt(RTmeL(U6ub`T@%o@glvFCE?Er<{kL$H%#>qO|so(vqe)+kgow2&-?3(^2@+3bCb_92sgSv9DVKc-kj*|j~Rfqb=G zfj+1><3WAZ#GQtPa&Gyg>A@xB-kuO%>R2$HIV26c~22Gi%4b&c7} zkF^^4P~$tUKy{i~T*&N$Dq$)!l$#siWBMf60%*syFm-cL=$4f5wt&h6Ns6`08Lt;W zO_pi1YEtJZ4ejgetLGk49i=};T)1xf=mb=Cap&|3LeP3+60k~^N&c-CWDQ-3o+#1{ z2*jO&WS#Bbv2dL;K+#dSXw(l)W^f^56n!o#2_sDfO0B3|7iMR7&d}&%iYQy?#zH6{ zB|*Ufrbn>t9YBGQQiPM;j%in`6m_|RD> z@goe8o#;WPtC$|6J;R*7PcCkZQIFqXZkVBP9;OXfo9qzxwPwjtq&SP9S}7753W2Jc zEuK+T1Jv>Le=8PDlqlx_citHL$IkB0rl&xI{HM_E$NdpFZH0m)`Y8NLk)2`=Zedej zDvQ=Wf~(;vg+a0s640^RTd{6^dQL4cPE^f6l@7+B-v^4K^OCLQcxTM1Yf$`dL&&gMTN#m-yQu zCu6oKuufd9MAK3Prz5!?ebW|Jop#M8r|ys3)7xNR=u*1|ph84Mx`=k}u)MC?qO=7h_6fPH zs|{OXCj_(7dpsSLFi;x9fB3!Ct$d!?Xm@&lb}^>g;y_A5)}LL@f?)d9HZvh4c=6|y z_D1sWvBO`p94Nd!QaR~%#I@Mfo9!JNhd0IAG7Ke-8iTudR@e9}R?6c<=Dp$mFE{X9 zaan1`Y59F&u-F{n3iwP)bed{shb1nrDGM`M-Pfa8A zPAR>D|1m%G2Hs@1O@dcY=lcw}N{GlrXC0yrdx@b3*$=eKE@3!om^2}q=dnLAtQ?nw zymz4Q0O7)E#R&SoR9w=Rxe`^deP-|3hcK8H63;$3P+*WXyHV3kr{AR|^pPi(uy1Y| zbu=k{H;1A&5wFEV{=mf8n7fe6+S7wn5rqple{0;;X?710xd9*I#2;{f*&yU|X2OR6 zA1n4Kp@!+=00N2mMDsN`i{Qowl?Ub2UWaeqxVr6q|8~>TT1N^I2Ry$!XZYW z^S?9l6m^&>0b&*T9bC{rSU|*Ox3zeYwKF*M%;nDJj>LR*J~mBU38>MrPxh_OZSI!f zS4TwtIdQy;w?`~Y2BfqwA=63s-Xt5Ya~NUps#{A*=Uix2sCP!Ru2w`4q&ytHlO=C{ zFrFqbByM@$vkNQ#5F>dYsdrB)j8P!;ooDbU4S8q1yC z-!2@;07w#x;Ga|Pqd$;4P6FE5!O==T6U4hD)`W-WCGQmeIhDPR3EGx`t2UCWjH8A}QeoaK9k;1q0d}g6;rIXz(NtEp3<5pF%>u|7u2n+)0mKrRos;hwSB#m zcFaOz8Vl#mKA!qn(8(sWE_gWtlv#8F#0JQpCbC+H-8vp+|MrGL!?Sdr9k6oMcsNhQ z%YblQ1h*W3S+($POd#{g(|KU(c9+G7NOL(@36RRpO4EM8b@3-)KzjZjv(wi!=1+vz zPgB9=Te$?p(U)<{awmB<#FkhR{O0?n$TVP<@C+`yT_Qjq(`A?vb|*N}!MkCQF#***!nS1@b1AP(2mU*kbm za2Y@KXtvBdEWFS5t`{0`nIy#~D4BwJS@l)~pJkH)yOE2_ID%c=HTzX<$Io31dud`0 zbJvtroTo(~#I)4BK6*%{$J8HvaCq=zhai(>?M&S_8aUg2yuB>fP9V$r10xae{2E7H zQnPe`qgvR922J@8o_X%((shjwoEs)Wx21&4c109Y_@)*b$=k88)_L2}3>>2G^vE-8 z-`~cT{R+%lp+ZGP-q>>?VFXpd-~v3ImiDH_D&Y4FOYvF+0X2=54wfzFqg*6H3>Azv zIQZ4ZpSIOs-QsMlGv?;zKBV4}-HYY-}H?SZekvE6qg`Ox{V;o+{)F%$Y9p@$jw_vq`6$tcXOYn-RFoLI#RCU~;;L&!)Q4)-YGnAG%OX@LAbV{@Bu|q!LqYWcNEpB;!|%p;UdSvXNHHz~$f%MRvoX$xa|}gC#EPAPc=u0^ebRA40V37oB-6s3L$qcXf z0c=oJuBMt4@W;-^{uwHJQ~*gNQIPl=gZW)ncj*vFA>uZ8se$@rQwSuMN&(^vuufG# z*>wOxrY5g%GE1di3#t5ikQhop8}G~!fKO@X4S-TjUO?lTDnR0KG>QW78dSqnzS07+ zr3(6>+K;zDSBg6Uv)uqNyUzdReK^W}rk)jJnE$nzT?5p7pv(X3{V^Vj@m1G{$ySa+ zA*9G2MFaD?-pj=gWrcDkeGrb7!A0E&&E_Dmb763c9=m5`?zf|cQ&xvp2L%xfgKjPz z$DGel%(uG?m|k+P%e6yNW#35(oZKUzuSwk2M(ia+6z_~%c|UzClfoRs-5Wo}d3GFN zc>bIZEiUXR`U}hF# zt^Al}c*&aZXw8Z=7lN5|8|Sd;>*226qxx?|QO%o=V|}^W)@rn?r{gq;N-cNR#ktwA zk~J5`ifNPQY~KVHx1kw2m-h!LGzsf^D=N?4?3hBLCfusirVT!k4|9eHU_fZA~q7>M%xZNhFlGKhb7M6v==cOx&R2gLs^64&Bo*5EV|I^iF1yxgeAGO);IYWZO8MEP#i;30lvBsC;EvNfE36HXZ6gev`6R^R@InPT zx;NVmTG#iX{?2X)n>W>n_7#c!Dq?iq#71oF2&rklFo|9Tyy8S<);G>by4rNaWmYgU zAQrz97)D+)S(Zs%I5EhEDM%)?&=%ZxgksaU3W^(Ynp^)s|)nsYcb zST$*R|6A4Zy!J=bA|d;gmtE^;oKHM6C*|HcXZT^k7k;I^riZvHa~y9+HV=OzqB-s253EM4Wwx`(-j`d5QA=N;ACB ze0dTcyCqPQA2?Al%4+Sme4b%eVDg1;A4ARfv5G!^7AYVYk|4nO^qU`3c5gC|PfuZN zjh7)!i(m})*#ggnZ*wA0MObQfG2@iR?+T|mbN%lb-Uoq^Yp;v&Ki=aiAs=#8Ui?0= zy?niX20IrcbsBG7E^w9i(+fM7l`RJaPc5D<$+(=$Ad&_*6p)fmtrLnkZyJ?5yeTy= zO*MO))lO&_l$yIgeoS)Tpm#Q~YYtA_;nj5^e+Kjv znID{%%(Uqv%h9bJVltY3D9y9%d~j>HhY;EuvM&@$-FL63SH8U0L~BX?vt~-}`aBv*pMr1o`r(qHY*CBB8(|iG4M!5L{j6hPjh#j6UvAPAT|nv} zvLVEzoT_49;0@^xlxRV(;@Lan?Z|Mwkd5ywDt&pljn5pUpdB$Sv51ZCUV`fj;$gn+ zA6$(WX+2_YAO7XA=$})BFtNdDGr)U!=0m-(=^Vpyi~LwnOu3=y^-%k$Psd_F%h0pv ze!zdrNKD7dgGX?<=Ksg?{@~Z?g1)}%*{YO;>q}&gx%JfXLfhE5FL`J1Zw+ts?Cx{; zjD(b^hUABbDr-r(1N3v267b~GDrM=?;BuW|oRQx31bq#6TIvC}*-u}-5?R|=Xw%;M zkU}rzb!}(=aJJed%ic{1+u_d7IB5>Jc)PRf_$OqVM}+Z3%PJbGR{a+PRy%vFA(JIw z>F=92tT+V35g_+j1NSkmc9*CD!N1kM9n64)%XaaAu%X=zFXI^h9Ot65#_6q%%yIan zSxE0bIj8N9M$g5^U?KTZWp0t9cLt5#ajtf~qJ{Vld5u0%$vSd|4Vc3TGiReV6gME{ zGx`a>S?c1wNQm$JEa{q&Z9jyk!<9bvlxk+P=bjm|=6}^1P^-cI2g!W#8h6J`OQ?Oh%r9z;gh#GED}uwz<<^ZjI!eW_T+ zW`nD%2Ens~%gUx)c@|{vWdM=d$Ly~Xxk#h=CK8w>I!~aXVvZtsR{GyDMUjllmu|}S zY3Q_U2xx{Uiu34@O{eOU*JTO?GtcsgqkQYt~5lWo>I$!79=*Gt<^$p*_-z zlGZ96Sg!7h;I5JVzEsd$mVj}hDVc=O_X{kDProt^sLvx%Gyj8JG{T85)mI&?NkweTIKd_~`2DO`enmqUj;uoOBMtncUTCy^Nc}Vt-5f*X zKy0pXmveVY#YgtlLPH5O#X<4H;W=Czh@fp(86>CrE5PWba6Gpa2bo}%bZvsYu;u!% zF%0DB+vwAf0hMCsPyfkxTuK)Gd%l!1qBEYMb|n#UbuLj1(3s6f6b%=ju)jp%KTh?C z|G3UaJL3s-(pG((E46kS#l*7_+1EC@$Syp<-cOQS8B=QXiXSNL%SMoF88Q{o4<|M# z^Az1&F#i!>8M;kqw(?Vm({W+WPi=PHL?Hso)LOvzp6{YfTij#H&CrDfcDrO+h|^cK zh8O3=oRLD~XwJWQow~2`2K2}GKHxd8Vz_%wqVj_f%qr6wuEs=^dyEYvo5U=mhqRg6x<6+`J=5k+MKwVB)pikn!rJR(>AukV#y zkM@osh{5g_f4|A#>{@wp6aaSyPRElUIBlao+Zx@yiAtDXfM+}A{P0tGmF?0OLc@#z zWqE9KAm7EjGJ$nQZqx~bd$0GDLCQxBaC^FZfU1W1Z3ZwSRY2NkJ?wWOkunU(CNK-( zXZAV8a!0Y>^KxzKVP|?J7#TWM7C4}{al(qK&I6jQ@~602>fH=`yUTfk2y(7VFA}zy zvbXYv5gJgFoAk%>j4lQL^3m*Bhh*I5bG>yLbDqj#SkPP2j5`b0-d&Esdflz+7~<3s zLV?_c`tm|m$5^S_?aBIgSG(f*ecQH)nrnw(bMXhem2lHnEyL0;C(fSls3zDgU83Hh zho|}1s_NgmYX4AYk^Dm1k%k-c#+EBs_m&t%h8xn7&Uzx~(q-qt5l~zBJF?3XS%~EJ zaM}yv>Pz8riE=oySrV2lsJU(A`|vm)UHzKx|A|iOD+vge%2E%dDv12+hc2^*wz}-W zb`h1*9G}9Fh~z6TdTdCSOS2k+R$lsjBn;D-Puca|%By}{t%qcQ6Xc3w=eg*?siNi6 z20y$=+~?asr=*OJ-|s~FpHxFbx?dp>ZxFL%014rI#stL;Mv@I{=ib)|z){{@oifY) zg&_-yi${M^-Icn4DL~bsarwj5-&@1Yw`A??;@Ar6dHvWGEZI7cCPIxr6b`X8Kq7}Y z4>2jm!-Fx;g zVM9?j4fdMw{%Sh*UzpNilv0rV2s;UZlGHu4^kz6`4pg-tUO};$%O!eH(6rj(9*Tbw zfB0Zz(eiJ$YgS#%l_+ z=(FX5&Cv#V8j#$HpX^K|RKZFoio>pffehxIUVY6;+K;!jW#uXa#~*KvqL{K{jYr?? zyuJnH-rvI|e+f$X0x=iYY4jTKsN>+(Jk#epYhEz)9lSJkno6xdK2O#JgOwVaR#rGM zW8FLyKLSyX9?QkykRt^O4c(3(N;pI2VM5KnRt&{J!9{v*q%F5f@FA}x!PoDAN(nSb zF6AcoQ)6!Dz3)I?uKQM+jp8D^n}37NYP(S|FD5euZX56U(vo`bQUaW59*3nAZ-A=r zAAzHILud$-loD*|1c70##b3CPONZMar=5kSZ(q&#SEoZm6zOt-Td~6)i;v5|^=E4? zuuETM`MxZ%96CZht^2 zcajLY+PGYrop#4Xgk~<$gfUoAUCEjtqfq6b=FchyQ4SjyGvVRAeLYAqXUgz&#>l>U z3h|c#ol%@vDWd|~iqjbL$q&fc1q?c4(Kk3%@h9|1ulr}he&A^H=G zNDS<&DoQcs2g`lP$O#D}3-coVL)zIyx2UhmyR9PGPbi)@Uf&YFPf%NRG7BI;iqYwP zI^2_uJWiY+KV2PsHWt8Qzfn6-ql4RwG6rIZM$Yn!5dz(*dNtmNl8B8!I-h;8tc|LpK%=`z&lE_&0}i3rqN zuG3~Ki;?n2h&(lmUFiP&n6jY#?rUgMRH14OC2@5;ufn8KSK#lYyWSXhLkf~=7M{U9 z@ppB1+jxJSTiXw6S)qjtbKr$y)+9JMM1rwp(KSMO`Xbc}J1_)6w?wvHDdTl6-@l(% zuE(WcG+MBOe7{|#)}*r)wf`#bb94%8P{%0qJFd1k6E)c^T&%4Z+*2aoH2yj&A*tyl z&aYIq&)*TewE-#*^<7lMA?#*-S0dZtKC>)ePV`{o;ZLhW4eVO`a{%cBhJB|jRkKUj zP}wqXT!v~2vp5LFTTWRXCGh9l3;f;&%D5pn;_!78`jSUVI^GvSUl|2y9n-{RALnz* z%=&MzTFW7rv9T_JsUk=xpH4MMVv#cuIbt^5bNEV2YjNYs_qC4EpHL# z3SlQ^1EbD~aGnjT#n~Jmb{qj^y00XBUtEL)az68A5VitO)p?~P>enAmA6HAKnh`|y zvjlE&?O972W;Vp8=-WS4{MmbJzawfIwb|J7tv9PesOdhzmT*liTcom|=}s~^pK)&X zn$&4hZVek3KKD3J&wgxZTy-TDo>=pqRQQ=Y`U)wAh7@agyCaR2t8j@qp65x8)V18% zeurN*nA5QEQf}NJ9v{~NPeK={SftL-6$17=jO=qLWw4B=y_cypU#g<xMzd*E*w|+s2k)ug9W>C{x?z%Wtgm_B zU8Sf++J3u&>PsYb)9)BV%e3)a-o6x5h`oy631WRt#`PMVT5s<0oI!IwhA zcC{et7j6{%-kIP^a7S5HBg&|d2eVRvHOBJC!RzrZSNa${oO5|-)5*q}E6x==?N&L@ zF!9(|q5BLt0XChEg5daZ=~Zwj?jBqe=I9pb%}2Wc1^SONYV#2d-&@Y9D(xgH|9XVc z90BfE7BRvje%Fn0HnVc(SRCdB;Dk`b($LJcMJl(A`*l*%y&}s0wl#t2Sw{ACg$|s0 zq(nl^w2%bTm(3{HW#JmF)hZ_yyCOB$F|0zV!DFy#^xmpoqAa7W6AN-PD`Uz@&GyB<_$_F=WJl*v^D+x{^upXa%UN)IRbMDI=ObN@auA8uut zn04a?O)R}(uf5(Ipv@9W^&g3Si8(CJL*+qY1+R*OT%*UEMcmY#Z*V22dUxpb)>d|m z-SkOwEp1zVko$;Q{L-lKewJc%cPb!s#-GYMzKl?N==@-%l{Eg>abGDfv%Qah&GGfu zq5sUGlA*rcP)wcr0O?2Qgj(7_I2t4h8WuW+EV#x|y8PckW8n-(Th*|!GSGHET=YH) z4K&yD+u~JFe3DspZsU%jx!-f}ihDA@Vr;w5bbZaLp~A--?|3*(M|@Na4M`s%AK$N8+X)6-A4VGx$P!j7Rvgr?W@LV(rH%( z5<101oOCzZ61Dc)s>&ZX>Mv?9Y^`)C@sxfu$!%rgH!B$F8$6_RC)!U^*+Ix-=Jk+~ zhm>yfz+!B5d)lc^y0bCys-!lb^fXNM<|*Is1S~#R)<0_XB=&GPqc#^}0J8$h{4pLk z0X-8kEf`~puq)^ls6u|;`>iIX456ds`I>W|KDD_#RM7n-f5pZwx8BIJRH!;GHQDz# zn(`w{PH;~3{d$_o$0b^9y8Fh*V&?aWae1M)5=)tLfo(CAQ@(=PIrq?#>6zKTM#v?W z)H(>6XyPz7Bv!VboaV>gbaKYu9V%XomIv=5j@Z-alHH-JZBidIV8+YC=`Q8mm@i=QI8=5bG zUI#zK3SnZCN>1hwH7tAHZG+~6txM2wP~3Pk?C)fB_eY)|JB~o}mmgEc2Z;Tn030C) ziT%0kr5?BZJQ6gppLG6WF3rF0qB@Fiy-7eYZOS9Vkne4Fp0LbvUAEB_M0@A*IHXQ1 z`Pj1K2~X7*N1q;LEOi38Nma%|K5T0>e}@&DW%a7uw;=rm?Mr_G0v6L(>KX$J9SGMi zw!c3}uB~R@QSJIs6&gVj?mnkz>i^yTi}H(>DX(4)C;2NDoxT10Mgb2KuU7_eCRJZ@ z6u3Fx?RLed4zj!xgEZ$gl z*lt`lowM*Ue-271wwvl6F%Iw<7=6Jrm6nxp=tc1B(}<{bIuh0Dj_iiF&Q+f|1ZGo8-b3!0`fd!XC?h6Gy^oE$eHi1Jq)UBd z&SfCpe&Js=k_cydd%sJq_n=w0u1Pv!FEj!9At#WtETC&#c)Knn6gHNNI-nZa1&5RJ_u6v$ya{J=XItzwcWZA;-!NzcdheQ@}61*mD6$HGwcZ**ytu=If@ z#KI74Tin#3*dJYr!uaovLm~ZOR(PK0W8+Q_N`D`d8YnC#iasSPL#NeHvrTVlk)H@y zUXjzyJBhpk&$iwjRJ!QEvT9xnpD54q-(VvdkhyKLoo%v?s+}@{5H&KE*E;T?L+VKB zqv%q-a)PUb2Bdy>pNz)MmV2~&pshe>rI|L|DH${Z)RH$H!(=rhjLdM02Qjn#5Lby{bosGHf{Pq4+ z@c;sq%hWAlAjepY4d6OSy3^R^fx|550KKLXnXw!u{@|HP+WogYq?||oV{~JkdOc`~ zg{z#6Mt>9*HMYHw9yc4y^-lvX76L+;jTz1*6&y?uH*wS$f`xs%BA7m~C`!EN*VaNa zFFfmeY(qx_q&}9wV&-oq;Q^mRc&wiCsKw+t2 hA-KT&KiUu^&Y literal 0 HcmV?d00001 diff --git a/doc/source/images/nova.compute.api.create_all_at_once.png b/doc/source/images/nova.compute.api.create_all_at_once.png new file mode 100755 index 0000000000000000000000000000000000000000..c3ce86d039f0b9f3811d21a0f2db168ef598fa8a GIT binary patch literal 62263 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 VR4vBX8~OtH$Vw{0Dxiiz{|~vaTf+bV literal 0 HcmV?d00001 diff --git a/doc/source/images/zone_aware_overview.png b/doc/source/images/zone_aware_overview.png new file mode 100755 index 0000000000000000000000000000000000000000..470e78138971caa8a404585e21cdda46693eb6db GIT binary patch literal 56142 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

33JIJoM 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 Date: Wed, 8 Jun 2011 08:59:28 -0300 Subject: [PATCH 17/70] removed autogen file --- doc/.autogenerated | 3559 -------------------------------------------- 1 file changed, 3559 deletions(-) delete mode 100644 doc/.autogenerated diff --git a/doc/.autogenerated b/doc/.autogenerated deleted file mode 100644 index 5f9630a57f..0000000000 --- a/doc/.autogenerated +++ /dev/null @@ -1,3559 +0,0 @@ -source/api/nova..adminclient.rst -source/api/nova..api.direct.rst -source/api/nova..api.ec2.admin.rst -source/api/nova..api.ec2.apirequest.rst -source/api/nova..api.ec2.cloud.rst -source/api/nova..api.ec2.metadatarequesthandler.rst -source/api/nova..api.openstack.auth.rst -source/api/nova..api.openstack.backup_schedules.rst -source/api/nova..api.openstack.common.rst -source/api/nova..api.openstack.consoles.rst -source/api/nova..api.openstack.faults.rst -source/api/nova..api.openstack.flavors.rst -source/api/nova..api.openstack.images.rst -source/api/nova..api.openstack.servers.rst -source/api/nova..api.openstack.shared_ip_groups.rst -source/api/nova..api.openstack.zones.rst -source/api/nova..auth.dbdriver.rst -source/api/nova..auth.fakeldap.rst -source/api/nova..auth.ldapdriver.rst -source/api/nova..auth.manager.rst -source/api/nova..auth.signer.rst -source/api/nova..cloudpipe.pipelib.rst -source/api/nova..compute.api.rst -source/api/nova..compute.instance_types.rst -source/api/nova..compute.manager.rst -source/api/nova..compute.monitor.rst -source/api/nova..compute.power_state.rst -source/api/nova..console.api.rst -source/api/nova..console.fake.rst -source/api/nova..console.manager.rst -source/api/nova..console.xvp.rst -source/api/nova..context.rst -source/api/nova..crypto.rst -source/api/nova..db.api.rst -source/api/nova..db.base.rst -source/api/nova..db.migration.rst -source/api/nova..db.sqlalchemy.api.rst -source/api/nova..db.sqlalchemy.migrate_repo.manage.rst -source/api/nova..db.sqlalchemy.migrate_repo.versions.001_austin.rst -source/api/nova..db.sqlalchemy.migrate_repo.versions.002_bexar.rst -source/api/nova..db.sqlalchemy.migrate_repo.versions.003_add_label_to_networks.rst -source/api/nova..db.sqlalchemy.migrate_repo.versions.004_add_zone_tables.rst -source/api/nova..db.sqlalchemy.migrate_repo.versions.005_add_instance_metadata.rst -source/api/nova..db.sqlalchemy.migrate_repo.versions.006_add_provider_data_to_volumes.rst -source/api/nova..db.sqlalchemy.migrate_repo.versions.007_add_instance_types.rst -source/api/nova..db.sqlalchemy.migration.rst -source/api/nova..db.sqlalchemy.models.rst -source/api/nova..db.sqlalchemy.session.rst -source/api/nova..exception.rst -source/api/nova..fakememcache.rst -source/api/nova..fakerabbit.rst -source/api/nova..flags.rst -source/api/nova..image.glance.rst -source/api/nova..image.local.rst -source/api/nova..image.s3.rst -source/api/nova..image.service.rst -source/api/nova..log.rst -source/api/nova..manager.rst -source/api/nova..network.api.rst -source/api/nova..network.linux_net.rst -source/api/nova..network.manager.rst -source/api/nova..objectstore.bucket.rst -source/api/nova..objectstore.handler.rst -source/api/nova..objectstore.image.rst -source/api/nova..objectstore.stored.rst -source/api/nova..quota.rst -source/api/nova..rpc.rst -source/api/nova..scheduler.chance.rst -source/api/nova..scheduler.driver.rst -source/api/nova..scheduler.manager.rst -source/api/nova..scheduler.simple.rst -source/api/nova..scheduler.zone.rst -source/api/nova..service.rst -source/api/nova..test.rst -source/api/nova..tests.api.openstack.fakes.rst -source/api/nova..tests.api.openstack.test_adminapi.rst -source/api/nova..tests.api.openstack.test_api.rst -source/api/nova..tests.api.openstack.test_auth.rst -source/api/nova..tests.api.openstack.test_common.rst -source/api/nova..tests.api.openstack.test_faults.rst -source/api/nova..tests.api.openstack.test_flavors.rst -source/api/nova..tests.api.openstack.test_images.rst -source/api/nova..tests.api.openstack.test_ratelimiting.rst -source/api/nova..tests.api.openstack.test_servers.rst -source/api/nova..tests.api.openstack.test_shared_ip_groups.rst -source/api/nova..tests.api.openstack.test_zones.rst -source/api/nova..tests.api.test_wsgi.rst -source/api/nova..tests.db.fakes.rst -source/api/nova..tests.declare_flags.rst -source/api/nova..tests.fake_flags.rst -source/api/nova..tests.glance.stubs.rst -source/api/nova..tests.hyperv_unittest.rst -source/api/nova..tests.objectstore_unittest.rst -source/api/nova..tests.real_flags.rst -source/api/nova..tests.runtime_flags.rst -source/api/nova..tests.test_access.rst -source/api/nova..tests.test_api.rst -source/api/nova..tests.test_auth.rst -source/api/nova..tests.test_cloud.rst -source/api/nova..tests.test_compute.rst -source/api/nova..tests.test_console.rst -source/api/nova..tests.test_direct.rst -source/api/nova..tests.test_flags.rst -source/api/nova..tests.test_instance_types.rst -source/api/nova..tests.test_localization.rst -source/api/nova..tests.test_log.rst -source/api/nova..tests.test_middleware.rst -source/api/nova..tests.test_misc.rst -source/api/nova..tests.test_network.rst -source/api/nova..tests.test_quota.rst -source/api/nova..tests.test_rpc.rst -source/api/nova..tests.test_scheduler.rst -source/api/nova..tests.test_service.rst -source/api/nova..tests.test_test.rst -source/api/nova..tests.test_twistd.rst -source/api/nova..tests.test_utils.rst -source/api/nova..tests.test_virt.rst -source/api/nova..tests.test_volume.rst -source/api/nova..tests.test_xenapi.rst -source/api/nova..tests.xenapi.stubs.rst -source/api/nova..twistd.rst -source/api/nova..utils.rst -source/api/nova..version.rst -source/api/nova..virt.connection.rst -source/api/nova..virt.disk.rst -source/api/nova..virt.fake.rst -source/api/nova..virt.hyperv.rst -source/api/nova..virt.images.rst -source/api/nova..virt.libvirt_conn.rst -source/api/nova..virt.xenapi.fake.rst -source/api/nova..virt.xenapi.network_utils.rst -source/api/nova..virt.xenapi.vm_utils.rst -source/api/nova..virt.xenapi.vmops.rst -source/api/nova..virt.xenapi.volume_utils.rst -source/api/nova..virt.xenapi.volumeops.rst -source/api/nova..virt.xenapi_conn.rst -source/api/nova..volume.api.rst -source/api/nova..volume.driver.rst -source/api/nova..volume.manager.rst -source/api/nova..volume.san.rst -source/api/nova..wsgi.rst -source/api/autoindex.rst -source/api/nova..adminclient.rst -source/api/nova..api.direct.rst -source/api/nova..api.ec2.admin.rst -source/api/nova..api.ec2.apirequest.rst -source/api/nova..api.ec2.cloud.rst -source/api/nova..api.ec2.metadatarequesthandler.rst -source/api/nova..api.openstack.auth.rst -source/api/nova..api.openstack.backup_schedules.rst -source/api/nova..api.openstack.common.rst -source/api/nova..api.openstack.consoles.rst -source/api/nova..api.openstack.faults.rst -source/api/nova..api.openstack.flavors.rst -source/api/nova..api.openstack.images.rst -source/api/nova..api.openstack.servers.rst -source/api/nova..api.openstack.shared_ip_groups.rst -source/api/nova..api.openstack.zones.rst -source/api/nova..auth.dbdriver.rst -source/api/nova..auth.fakeldap.rst -source/api/nova..auth.ldapdriver.rst -source/api/nova..auth.manager.rst -source/api/nova..auth.signer.rst -source/api/nova..cloudpipe.pipelib.rst -source/api/nova..compute.api.rst -source/api/nova..compute.instance_types.rst -source/api/nova..compute.manager.rst -source/api/nova..compute.monitor.rst -source/api/nova..compute.power_state.rst -source/api/nova..console.api.rst -source/api/nova..console.fake.rst -source/api/nova..console.manager.rst -source/api/nova..console.xvp.rst -source/api/nova..context.rst -source/api/nova..crypto.rst -source/api/nova..db.api.rst -source/api/nova..db.base.rst -source/api/nova..db.migration.rst -source/api/nova..db.sqlalchemy.api.rst -source/api/nova..db.sqlalchemy.migrate_repo.manage.rst -source/api/nova..db.sqlalchemy.migrate_repo.versions.001_austin.rst -source/api/nova..db.sqlalchemy.migrate_repo.versions.002_bexar.rst -source/api/nova..db.sqlalchemy.migrate_repo.versions.003_add_label_to_networks.rst -source/api/nova..db.sqlalchemy.migrate_repo.versions.004_add_zone_tables.rst -source/api/nova..db.sqlalchemy.migrate_repo.versions.005_add_instance_metadata.rst -source/api/nova..db.sqlalchemy.migrate_repo.versions.006_add_provider_data_to_volumes.rst -source/api/nova..db.sqlalchemy.migrate_repo.versions.007_add_instance_types.rst -source/api/nova..db.sqlalchemy.migration.rst -source/api/nova..db.sqlalchemy.models.rst -source/api/nova..db.sqlalchemy.session.rst -source/api/nova..exception.rst -source/api/nova..fakememcache.rst -source/api/nova..fakerabbit.rst -source/api/nova..flags.rst -source/api/nova..image.glance.rst -source/api/nova..image.local.rst -source/api/nova..image.s3.rst -source/api/nova..image.service.rst -source/api/nova..log.rst -source/api/nova..manager.rst -source/api/nova..network.api.rst -source/api/nova..network.linux_net.rst -source/api/nova..network.manager.rst -source/api/nova..objectstore.bucket.rst -source/api/nova..objectstore.handler.rst -source/api/nova..objectstore.image.rst -source/api/nova..objectstore.stored.rst -source/api/nova..quota.rst -source/api/nova..rpc.rst -source/api/nova..scheduler.chance.rst -source/api/nova..scheduler.driver.rst -source/api/nova..scheduler.manager.rst -source/api/nova..scheduler.simple.rst -source/api/nova..scheduler.zone.rst -source/api/nova..service.rst -source/api/nova..test.rst -source/api/nova..tests.api.openstack.fakes.rst -source/api/nova..tests.api.openstack.test_adminapi.rst -source/api/nova..tests.api.openstack.test_api.rst -source/api/nova..tests.api.openstack.test_auth.rst -source/api/nova..tests.api.openstack.test_common.rst -source/api/nova..tests.api.openstack.test_faults.rst -source/api/nova..tests.api.openstack.test_flavors.rst -source/api/nova..tests.api.openstack.test_images.rst -source/api/nova..tests.api.openstack.test_ratelimiting.rst -source/api/nova..tests.api.openstack.test_servers.rst -source/api/nova..tests.api.openstack.test_shared_ip_groups.rst -source/api/nova..tests.api.openstack.test_zones.rst -source/api/nova..tests.api.test_wsgi.rst -source/api/nova..tests.db.fakes.rst -source/api/nova..tests.declare_flags.rst -source/api/nova..tests.fake_flags.rst -source/api/nova..tests.glance.stubs.rst -source/api/nova..tests.hyperv_unittest.rst -source/api/nova..tests.objectstore_unittest.rst -source/api/nova..tests.real_flags.rst -source/api/nova..tests.runtime_flags.rst -source/api/nova..tests.test_access.rst -source/api/nova..tests.test_api.rst -source/api/nova..tests.test_auth.rst -source/api/nova..tests.test_cloud.rst -source/api/nova..tests.test_compute.rst -source/api/nova..tests.test_console.rst -source/api/nova..tests.test_direct.rst -source/api/nova..tests.test_flags.rst -source/api/nova..tests.test_instance_types.rst -source/api/nova..tests.test_localization.rst -source/api/nova..tests.test_log.rst -source/api/nova..tests.test_middleware.rst -source/api/nova..tests.test_misc.rst -source/api/nova..tests.test_network.rst -source/api/nova..tests.test_quota.rst -source/api/nova..tests.test_rpc.rst -source/api/nova..tests.test_scheduler.rst -source/api/nova..tests.test_service.rst -source/api/nova..tests.test_test.rst -source/api/nova..tests.test_twistd.rst -source/api/nova..tests.test_utils.rst -source/api/nova..tests.test_virt.rst -source/api/nova..tests.test_volume.rst -source/api/nova..tests.test_xenapi.rst -source/api/nova..tests.xenapi.stubs.rst -source/api/nova..twistd.rst -source/api/nova..utils.rst -source/api/nova..version.rst -source/api/nova..virt.connection.rst -source/api/nova..virt.disk.rst -source/api/nova..virt.fake.rst -source/api/nova..virt.hyperv.rst -source/api/nova..virt.images.rst -source/api/nova..virt.libvirt_conn.rst -source/api/nova..virt.xenapi.fake.rst -source/api/nova..virt.xenapi.network_utils.rst -source/api/nova..virt.xenapi.vm_utils.rst -source/api/nova..virt.xenapi.vmops.rst -source/api/nova..virt.xenapi.volume_utils.rst -source/api/nova..virt.xenapi.volumeops.rst -source/api/nova..virt.xenapi_conn.rst -source/api/nova..volume.api.rst -source/api/nova..volume.driver.rst -source/api/nova..volume.manager.rst -source/api/nova..volume.san.rst -source/api/nova..wsgi.rst -source/api/nova.crypto.rst -source/api/nova.cloudpipe.pipelib.rst -source/api/nova.context.rst -source/api/nova.quota.rst -source/api/nova.tests.test_compute.rst -source/api/nova.tests.test_quota.rst -source/api/nova.tests.test_flags.rst -source/api/nova.tests.test_objectstore.rst -source/api/nova.tests.test_crypto.rst -source/api/nova.tests.runtime_flags.rst -source/api/nova.tests.test_exception.rst -source/api/nova.tests.vmwareapi.db_fakes.rst -source/api/nova.tests.vmwareapi.stubs.rst -source/api/nova.tests.test_host_filter.rst -source/api/nova.tests.test_network.rst -source/api/nova.tests.network.base.rst -source/api/nova.tests.declare_flags.rst -source/api/nova.tests.test_localization.rst -source/api/nova.tests.test_access.rst -source/api/nova.tests.test_libvirt.rst -source/api/nova.tests.image.test_glance.rst -source/api/nova.tests.test_direct.rst -source/api/nova.tests.fake_utils.rst -source/api/nova.tests.integrated.test_login.rst -source/api/nova.tests.integrated.test_extensions.rst -source/api/nova.tests.integrated.integrated_helpers.rst -source/api/nova.tests.integrated.test_servers.rst -source/api/nova.tests.integrated.test_xml.rst -source/api/nova.tests.integrated.api.client.rst -source/api/nova.tests.integrated.test_volumes.rst -source/api/nova.tests.test_rpc.rst -source/api/nova.tests.test_volume.rst -source/api/nova.tests.test_notifier.rst -source/api/nova.tests.fake_flags.rst -source/api/nova.tests.test_log.rst -source/api/nova.tests.test_service.rst -source/api/nova.tests.test_twistd.rst -source/api/nova.tests.test_misc.rst -source/api/nova.tests.test_cloud.rst -source/api/nova.tests.glance.stubs.rst -source/api/nova.tests.test_auth.rst -source/api/nova.tests.test_utils.rst -source/api/nova.tests.test_vmwareapi.rst -source/api/nova.tests.test_vlan_network.rst -source/api/nova.tests.test_zones.rst -source/api/nova.tests.test_middleware.rst -source/api/nova.tests.test_ipv6.rst -source/api/nova.tests.xenapi.stubs.rst -source/api/nova.tests.test_api.rst -source/api/nova.tests.scheduler.test_host_filter.rst -source/api/nova.tests.scheduler.test_zone_aware_scheduler.rst -source/api/nova.tests.scheduler.test_least_cost_scheduler.rst -source/api/nova.tests.scheduler.test_scheduler.rst -source/api/nova.tests.db.fakes.rst -source/api/nova.tests.test_instance_types.rst -source/api/nova.tests.test_console.rst -source/api/nova.tests.api.test_wsgi.rst -source/api/nova.tests.api.openstack.test_users.rst -source/api/nova.tests.api.openstack.fakes.rst -source/api/nova.tests.api.openstack.common.rst -source/api/nova.tests.api.openstack.test_wsgi.rst -source/api/nova.tests.api.openstack.test_accounts.rst -source/api/nova.tests.api.openstack.test_flavors.rst -source/api/nova.tests.api.openstack.test_extensions.rst -source/api/nova.tests.api.openstack.test_adminapi.rst -source/api/nova.tests.api.openstack.test_versions.rst -source/api/nova.tests.api.openstack.test_image_metadata.rst -source/api/nova.tests.api.openstack.test_auth.rst -source/api/nova.tests.api.openstack.test_servers.rst -source/api/nova.tests.api.openstack.test_zones.rst -source/api/nova.tests.api.openstack.test_images.rst -source/api/nova.tests.api.openstack.test_api.rst -source/api/nova.tests.api.openstack.test_faults.rst -source/api/nova.tests.api.openstack.test_limits.rst -source/api/nova.tests.api.openstack.test_server_metadata.rst -source/api/nova.tests.api.openstack.test_shared_ip_groups.rst -source/api/nova.tests.api.openstack.test_common.rst -source/api/nova.tests.api.openstack.extensions.foxinsocks.rst -source/api/nova.tests.test_xenapi.rst -source/api/nova.tests.hyperv_unittest.rst -source/api/nova.tests.test_test.rst -source/api/nova.tests.test_flat_network.rst -source/api/nova.network.linux_net.rst -source/api/nova.network.api.rst -source/api/nova.network.manager.rst -source/api/nova.network.vmwareapi_net.rst -source/api/nova.network.xenapi_net.rst -source/api/nova.volume.driver.rst -source/api/nova.volume.api.rst -source/api/nova.volume.san.rst -source/api/nova.volume.manager.rst -source/api/nova.virt.images.rst -source/api/nova.virt.driver.rst -source/api/nova.virt.vmwareapi.io_util.rst -source/api/nova.virt.vmwareapi.error_util.rst -source/api/nova.virt.vmwareapi.vmops.rst -source/api/nova.virt.vmwareapi.fake.rst -source/api/nova.virt.vmwareapi.vim.rst -source/api/nova.virt.vmwareapi.read_write_util.rst -source/api/nova.virt.vmwareapi.vmware_images.rst -source/api/nova.virt.vmwareapi.network_utils.rst -source/api/nova.virt.vmwareapi.vim_util.rst -source/api/nova.virt.vmwareapi.vm_util.rst -source/api/nova.virt.xenapi_conn.rst -source/api/nova.virt.fake.rst -source/api/nova.virt.vmwareapi_conn.rst -source/api/nova.virt.connection.rst -source/api/nova.virt.disk.rst -source/api/nova.virt.libvirt.connection.rst -source/api/nova.virt.libvirt.firewall.rst -source/api/nova.virt.libvirt.netutils.rst -source/api/nova.virt.hyperv.rst -source/api/nova.virt.xenapi.vmops.rst -source/api/nova.virt.xenapi.fake.rst -source/api/nova.virt.xenapi.volume_utils.rst -source/api/nova.virt.xenapi.network_utils.rst -source/api/nova.virt.xenapi.vm_utils.rst -source/api/nova.virt.xenapi.volumeops.rst -source/api/nova.exception.rst -source/api/nova.image.fake.rst -source/api/nova.image.local.rst -source/api/nova.image.glance.rst -source/api/nova.image.service.rst -source/api/nova.image.s3.rst -source/api/nova.objectstore.s3server.rst -source/api/nova.ipv6.account_identifier.rst -source/api/nova.ipv6.api.rst -source/api/nova.ipv6.rfc2462.rst -source/api/nova.notifier.no_op_notifier.rst -source/api/nova.notifier.log_notifier.rst -source/api/nova.notifier.rabbit_notifier.rst -source/api/nova.notifier.api.rst -source/api/nova.vcsversion.rst -source/api/nova.compute.instance_types.rst -source/api/nova.compute.power_state.rst -source/api/nova.compute.api.rst -source/api/nova.compute.manager.rst -source/api/nova.compute.monitor.rst -source/api/nova.wsgi.rst -source/api/nova.console.vmrc_manager.rst -source/api/nova.console.fake.rst -source/api/nova.console.vmrc.rst -source/api/nova.console.api.rst -source/api/nova.console.manager.rst -source/api/nova.console.xvp.rst -source/api/nova.version.rst -source/api/nova.utils.rst -source/api/nova.auth.dbdriver.rst -source/api/nova.auth.fakeldap.rst -source/api/nova.auth.ldapdriver.rst -source/api/nova.auth.signer.rst -source/api/nova.auth.manager.rst -source/api/nova.manager.rst -source/api/nova.scheduler.driver.rst -source/api/nova.scheduler.host_filter.rst -source/api/nova.scheduler.zone.rst -source/api/nova.scheduler.simple.rst -source/api/nova.scheduler.zone_aware_scheduler.rst -source/api/nova.scheduler.zone_manager.rst -source/api/nova.scheduler.api.rst -source/api/nova.scheduler.least_cost.rst -source/api/nova.scheduler.manager.rst -source/api/nova.scheduler.chance.rst -source/api/nova.vnc.auth.rst -source/api/nova.vnc.proxy.rst -source/api/nova.db.base.rst -source/api/nova.db.migration.rst -source/api/nova.db.sqlalchemy.session.rst -source/api/nova.db.sqlalchemy.migration.rst -source/api/nova.db.sqlalchemy.migrate_repo.manage.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.018_rename_server_management_url.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.017_make_instance_type_id_an_integer.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.010_add_os_type_to_instances.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.013_add_flavors_to_migrations.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.009_add_instance_migrations.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.002_bexar.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.020_add_snapshot_id_to_volumes.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.016_make_quotas_key_and_value.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.003_add_label_to_networks.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.021_rename_image_ids.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.006_add_provider_data_to_volumes.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.008_add_instance_types.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.019_add_volume_snapshot_support.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.001_austin.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.011_live_migration.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.005_add_instance_metadata.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.004_add_zone_tables.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.012_add_ipv6_flatmanager.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.015_add_auto_assign_to_floating_ips.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.007_add_ipv6_to_fixed_ips.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.014_add_instance_type_id_to_instances.rst -source/api/nova.db.sqlalchemy.api.rst -source/api/nova.db.sqlalchemy.models.rst -source/api/nova.db.api.rst -source/api/nova.twistd.rst -source/api/nova.test.rst -source/api/nova.fakerabbit.rst -source/api/nova.service.rst -source/api/nova.flags.rst -source/api/nova.api.ec2.ec2utils.rst -source/api/nova.api.ec2.metadatarequesthandler.rst -source/api/nova.api.ec2.cloud.rst -source/api/nova.api.ec2.admin.rst -source/api/nova.api.ec2.apirequest.rst -source/api/nova.api.openstack.images.rst -source/api/nova.api.openstack.faults.rst -source/api/nova.api.openstack.shared_ip_groups.rst -source/api/nova.api.openstack.common.rst -source/api/nova.api.openstack.ips.rst -source/api/nova.api.openstack.extensions.rst -source/api/nova.api.openstack.servers.rst -source/api/nova.api.openstack.consoles.rst -source/api/nova.api.openstack.users.rst -source/api/nova.api.openstack.auth.rst -source/api/nova.api.openstack.versions.rst -source/api/nova.api.openstack.zones.rst -source/api/nova.api.openstack.limits.rst -source/api/nova.api.openstack.flavors.rst -source/api/nova.api.openstack.image_metadata.rst -source/api/nova.api.openstack.contrib.volumes.rst -source/api/nova.api.openstack.wsgi.rst -source/api/nova.api.openstack.accounts.rst -source/api/nova.api.openstack.views.images.rst -source/api/nova.api.openstack.views.addresses.rst -source/api/nova.api.openstack.views.servers.rst -source/api/nova.api.openstack.views.versions.rst -source/api/nova.api.openstack.views.limits.rst -source/api/nova.api.openstack.views.flavors.rst -source/api/nova.api.openstack.server_metadata.rst -source/api/nova.api.openstack.backup_schedules.rst -source/api/nova.api.direct.rst -source/api/nova.log.rst -source/api/nova.rpc.rst -source/api/nova.fakememcache.rst -source/api/nova.crypto.rst -source/api/nova.cloudpipe.pipelib.rst -source/api/nova.context.rst -source/api/nova.quota.rst -source/api/nova.tests.test_compute.rst -source/api/nova.tests.test_quota.rst -source/api/nova.tests.test_flags.rst -source/api/nova.tests.test_objectstore.rst -source/api/nova.tests.test_crypto.rst -source/api/nova.tests.runtime_flags.rst -source/api/nova.tests.test_exception.rst -source/api/nova.tests.vmwareapi.db_fakes.rst -source/api/nova.tests.vmwareapi.stubs.rst -source/api/nova.tests.test_host_filter.rst -source/api/nova.tests.test_network.rst -source/api/nova.tests.network.base.rst -source/api/nova.tests.declare_flags.rst -source/api/nova.tests.test_localization.rst -source/api/nova.tests.test_access.rst -source/api/nova.tests.test_libvirt.rst -source/api/nova.tests.image.test_glance.rst -source/api/nova.tests.test_direct.rst -source/api/nova.tests.fake_utils.rst -source/api/nova.tests.integrated.test_login.rst -source/api/nova.tests.integrated.test_extensions.rst -source/api/nova.tests.integrated.integrated_helpers.rst -source/api/nova.tests.integrated.test_servers.rst -source/api/nova.tests.integrated.test_xml.rst -source/api/nova.tests.integrated.api.client.rst -source/api/nova.tests.integrated.test_volumes.rst -source/api/nova.tests.test_rpc.rst -source/api/nova.tests.test_volume.rst -source/api/nova.tests.test_notifier.rst -source/api/nova.tests.fake_flags.rst -source/api/nova.tests.test_log.rst -source/api/nova.tests.test_service.rst -source/api/nova.tests.test_twistd.rst -source/api/nova.tests.test_misc.rst -source/api/nova.tests.test_cloud.rst -source/api/nova.tests.glance.stubs.rst -source/api/nova.tests.test_auth.rst -source/api/nova.tests.test_utils.rst -source/api/nova.tests.test_vmwareapi.rst -source/api/nova.tests.test_vlan_network.rst -source/api/nova.tests.test_zones.rst -source/api/nova.tests.test_middleware.rst -source/api/nova.tests.test_ipv6.rst -source/api/nova.tests.xenapi.stubs.rst -source/api/nova.tests.test_api.rst -source/api/nova.tests.scheduler.test_host_filter.rst -source/api/nova.tests.scheduler.test_zone_aware_scheduler.rst -source/api/nova.tests.scheduler.test_least_cost_scheduler.rst -source/api/nova.tests.scheduler.test_scheduler.rst -source/api/nova.tests.db.fakes.rst -source/api/nova.tests.test_instance_types.rst -source/api/nova.tests.test_console.rst -source/api/nova.tests.api.test_wsgi.rst -source/api/nova.tests.api.openstack.test_users.rst -source/api/nova.tests.api.openstack.fakes.rst -source/api/nova.tests.api.openstack.common.rst -source/api/nova.tests.api.openstack.test_wsgi.rst -source/api/nova.tests.api.openstack.test_accounts.rst -source/api/nova.tests.api.openstack.test_flavors.rst -source/api/nova.tests.api.openstack.test_extensions.rst -source/api/nova.tests.api.openstack.test_adminapi.rst -source/api/nova.tests.api.openstack.test_versions.rst -source/api/nova.tests.api.openstack.test_image_metadata.rst -source/api/nova.tests.api.openstack.test_auth.rst -source/api/nova.tests.api.openstack.test_servers.rst -source/api/nova.tests.api.openstack.test_zones.rst -source/api/nova.tests.api.openstack.test_images.rst -source/api/nova.tests.api.openstack.test_api.rst -source/api/nova.tests.api.openstack.test_faults.rst -source/api/nova.tests.api.openstack.test_limits.rst -source/api/nova.tests.api.openstack.test_server_metadata.rst -source/api/nova.tests.api.openstack.test_shared_ip_groups.rst -source/api/nova.tests.api.openstack.test_common.rst -source/api/nova.tests.api.openstack.extensions.foxinsocks.rst -source/api/nova.tests.test_xenapi.rst -source/api/nova.tests.hyperv_unittest.rst -source/api/nova.tests.test_test.rst -source/api/nova.tests.test_flat_network.rst -source/api/nova.network.linux_net.rst -source/api/nova.network.api.rst -source/api/nova.network.manager.rst -source/api/nova.network.vmwareapi_net.rst -source/api/nova.network.xenapi_net.rst -source/api/nova.volume.driver.rst -source/api/nova.volume.api.rst -source/api/nova.volume.san.rst -source/api/nova.volume.manager.rst -source/api/nova.virt.images.rst -source/api/nova.virt.driver.rst -source/api/nova.virt.vmwareapi.io_util.rst -source/api/nova.virt.vmwareapi.error_util.rst -source/api/nova.virt.vmwareapi.vmops.rst -source/api/nova.virt.vmwareapi.fake.rst -source/api/nova.virt.vmwareapi.vim.rst -source/api/nova.virt.vmwareapi.read_write_util.rst -source/api/nova.virt.vmwareapi.vmware_images.rst -source/api/nova.virt.vmwareapi.network_utils.rst -source/api/nova.virt.vmwareapi.vim_util.rst -source/api/nova.virt.vmwareapi.vm_util.rst -source/api/nova.virt.xenapi_conn.rst -source/api/nova.virt.fake.rst -source/api/nova.virt.vmwareapi_conn.rst -source/api/nova.virt.connection.rst -source/api/nova.virt.disk.rst -source/api/nova.virt.libvirt.connection.rst -source/api/nova.virt.libvirt.firewall.rst -source/api/nova.virt.libvirt.netutils.rst -source/api/nova.virt.hyperv.rst -source/api/nova.virt.xenapi.vmops.rst -source/api/nova.virt.xenapi.fake.rst -source/api/nova.virt.xenapi.volume_utils.rst -source/api/nova.virt.xenapi.network_utils.rst -source/api/nova.virt.xenapi.vm_utils.rst -source/api/nova.virt.xenapi.volumeops.rst -source/api/nova.exception.rst -source/api/nova.image.fake.rst -source/api/nova.image.local.rst -source/api/nova.image.glance.rst -source/api/nova.image.service.rst -source/api/nova.image.s3.rst -source/api/nova.objectstore.s3server.rst -source/api/nova.ipv6.account_identifier.rst -source/api/nova.ipv6.api.rst -source/api/nova.ipv6.rfc2462.rst -source/api/nova.notifier.no_op_notifier.rst -source/api/nova.notifier.log_notifier.rst -source/api/nova.notifier.rabbit_notifier.rst -source/api/nova.notifier.api.rst -source/api/nova.vcsversion.rst -source/api/nova.compute.instance_types.rst -source/api/nova.compute.power_state.rst -source/api/nova.compute.api.rst -source/api/nova.compute.manager.rst -source/api/nova.compute.monitor.rst -source/api/nova.wsgi.rst -source/api/nova.console.vmrc_manager.rst -source/api/nova.console.fake.rst -source/api/nova.console.vmrc.rst -source/api/nova.console.api.rst -source/api/nova.console.manager.rst -source/api/nova.console.xvp.rst -source/api/nova.version.rst -source/api/nova.utils.rst -source/api/nova.auth.dbdriver.rst -source/api/nova.auth.fakeldap.rst -source/api/nova.auth.ldapdriver.rst -source/api/nova.auth.signer.rst -source/api/nova.auth.manager.rst -source/api/nova.manager.rst -source/api/nova.scheduler.driver.rst -source/api/nova.scheduler.host_filter.rst -source/api/nova.scheduler.zone.rst -source/api/nova.scheduler.simple.rst -source/api/nova.scheduler.zone_aware_scheduler.rst -source/api/nova.scheduler.zone_manager.rst -source/api/nova.scheduler.api.rst -source/api/nova.scheduler.least_cost.rst -source/api/nova.scheduler.manager.rst -source/api/nova.scheduler.chance.rst -source/api/nova.vnc.auth.rst -source/api/nova.vnc.proxy.rst -source/api/nova.db.base.rst -source/api/nova.db.migration.rst -source/api/nova.db.sqlalchemy.session.rst -source/api/nova.db.sqlalchemy.migration.rst -source/api/nova.db.sqlalchemy.migrate_repo.manage.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.018_rename_server_management_url.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.017_make_instance_type_id_an_integer.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.010_add_os_type_to_instances.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.013_add_flavors_to_migrations.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.009_add_instance_migrations.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.002_bexar.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.020_add_snapshot_id_to_volumes.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.016_make_quotas_key_and_value.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.003_add_label_to_networks.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.021_rename_image_ids.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.006_add_provider_data_to_volumes.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.008_add_instance_types.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.019_add_volume_snapshot_support.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.001_austin.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.011_live_migration.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.005_add_instance_metadata.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.004_add_zone_tables.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.012_add_ipv6_flatmanager.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.015_add_auto_assign_to_floating_ips.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.007_add_ipv6_to_fixed_ips.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.014_add_instance_type_id_to_instances.rst -source/api/nova.db.sqlalchemy.api.rst -source/api/nova.db.sqlalchemy.models.rst -source/api/nova.db.api.rst -source/api/nova.twistd.rst -source/api/nova.test.rst -source/api/nova.fakerabbit.rst -source/api/nova.service.rst -source/api/nova.flags.rst -source/api/nova.api.ec2.ec2utils.rst -source/api/nova.api.ec2.metadatarequesthandler.rst -source/api/nova.api.ec2.cloud.rst -source/api/nova.api.ec2.admin.rst -source/api/nova.api.ec2.apirequest.rst -source/api/nova.api.openstack.images.rst -source/api/nova.api.openstack.faults.rst -source/api/nova.api.openstack.shared_ip_groups.rst -source/api/nova.api.openstack.common.rst -source/api/nova.api.openstack.ips.rst -source/api/nova.api.openstack.extensions.rst -source/api/nova.api.openstack.servers.rst -source/api/nova.api.openstack.consoles.rst -source/api/nova.api.openstack.users.rst -source/api/nova.api.openstack.auth.rst -source/api/nova.api.openstack.versions.rst -source/api/nova.api.openstack.zones.rst -source/api/nova.api.openstack.limits.rst -source/api/nova.api.openstack.flavors.rst -source/api/nova.api.openstack.image_metadata.rst -source/api/nova.api.openstack.contrib.volumes.rst -source/api/nova.api.openstack.wsgi.rst -source/api/nova.api.openstack.accounts.rst -source/api/nova.api.openstack.views.images.rst -source/api/nova.api.openstack.views.addresses.rst -source/api/nova.api.openstack.views.servers.rst -source/api/nova.api.openstack.views.versions.rst -source/api/nova.api.openstack.views.limits.rst -source/api/nova.api.openstack.views.flavors.rst -source/api/nova.api.openstack.server_metadata.rst -source/api/nova.api.openstack.backup_schedules.rst -source/api/nova.api.direct.rst -source/api/nova.log.rst -source/api/nova.rpc.rst -source/api/nova.fakememcache.rst -source/api/nova.crypto.rst -source/api/nova.cloudpipe.pipelib.rst -source/api/nova.context.rst -source/api/nova.quota.rst -source/api/nova.tests.test_compute.rst -source/api/nova.tests.test_quota.rst -source/api/nova.tests.test_flags.rst -source/api/nova.tests.test_objectstore.rst -source/api/nova.tests.test_crypto.rst -source/api/nova.tests.runtime_flags.rst -source/api/nova.tests.test_exception.rst -source/api/nova.tests.vmwareapi.db_fakes.rst -source/api/nova.tests.vmwareapi.stubs.rst -source/api/nova.tests.test_host_filter.rst -source/api/nova.tests.test_network.rst -source/api/nova.tests.network.base.rst -source/api/nova.tests.declare_flags.rst -source/api/nova.tests.test_localization.rst -source/api/nova.tests.test_access.rst -source/api/nova.tests.test_libvirt.rst -source/api/nova.tests.image.test_glance.rst -source/api/nova.tests.test_direct.rst -source/api/nova.tests.fake_utils.rst -source/api/nova.tests.integrated.test_login.rst -source/api/nova.tests.integrated.test_extensions.rst -source/api/nova.tests.integrated.integrated_helpers.rst -source/api/nova.tests.integrated.test_servers.rst -source/api/nova.tests.integrated.test_xml.rst -source/api/nova.tests.integrated.api.client.rst -source/api/nova.tests.integrated.test_volumes.rst -source/api/nova.tests.test_rpc.rst -source/api/nova.tests.test_volume.rst -source/api/nova.tests.test_notifier.rst -source/api/nova.tests.fake_flags.rst -source/api/nova.tests.test_log.rst -source/api/nova.tests.test_service.rst -source/api/nova.tests.test_twistd.rst -source/api/nova.tests.test_misc.rst -source/api/nova.tests.test_cloud.rst -source/api/nova.tests.glance.stubs.rst -source/api/nova.tests.test_auth.rst -source/api/nova.tests.test_utils.rst -source/api/nova.tests.test_vmwareapi.rst -source/api/nova.tests.test_vlan_network.rst -source/api/nova.tests.test_zones.rst -source/api/nova.tests.test_middleware.rst -source/api/nova.tests.test_ipv6.rst -source/api/nova.tests.xenapi.stubs.rst -source/api/nova.tests.test_api.rst -source/api/nova.tests.scheduler.test_host_filter.rst -source/api/nova.tests.scheduler.test_zone_aware_scheduler.rst -source/api/nova.tests.scheduler.test_least_cost_scheduler.rst -source/api/nova.tests.scheduler.test_scheduler.rst -source/api/nova.tests.db.fakes.rst -source/api/nova.tests.test_instance_types.rst -source/api/nova.tests.test_console.rst -source/api/nova.tests.api.test_wsgi.rst -source/api/nova.tests.api.openstack.test_users.rst -source/api/nova.tests.api.openstack.fakes.rst -source/api/nova.tests.api.openstack.common.rst -source/api/nova.tests.api.openstack.test_wsgi.rst -source/api/nova.tests.api.openstack.test_accounts.rst -source/api/nova.tests.api.openstack.test_flavors.rst -source/api/nova.tests.api.openstack.test_extensions.rst -source/api/nova.tests.api.openstack.test_adminapi.rst -source/api/nova.tests.api.openstack.test_versions.rst -source/api/nova.tests.api.openstack.test_image_metadata.rst -source/api/nova.tests.api.openstack.test_auth.rst -source/api/nova.tests.api.openstack.test_servers.rst -source/api/nova.tests.api.openstack.test_zones.rst -source/api/nova.tests.api.openstack.test_images.rst -source/api/nova.tests.api.openstack.test_api.rst -source/api/nova.tests.api.openstack.test_faults.rst -source/api/nova.tests.api.openstack.test_limits.rst -source/api/nova.tests.api.openstack.test_server_metadata.rst -source/api/nova.tests.api.openstack.test_shared_ip_groups.rst -source/api/nova.tests.api.openstack.test_common.rst -source/api/nova.tests.api.openstack.extensions.foxinsocks.rst -source/api/nova.tests.test_xenapi.rst -source/api/nova.tests.hyperv_unittest.rst -source/api/nova.tests.test_test.rst -source/api/nova.tests.test_flat_network.rst -source/api/nova.network.linux_net.rst -source/api/nova.network.api.rst -source/api/nova.network.manager.rst -source/api/nova.network.vmwareapi_net.rst -source/api/nova.network.xenapi_net.rst -source/api/nova.volume.driver.rst -source/api/nova.volume.api.rst -source/api/nova.volume.san.rst -source/api/nova.volume.manager.rst -source/api/nova.virt.images.rst -source/api/nova.virt.driver.rst -source/api/nova.virt.vmwareapi.io_util.rst -source/api/nova.virt.vmwareapi.error_util.rst -source/api/nova.virt.vmwareapi.vmops.rst -source/api/nova.virt.vmwareapi.fake.rst -source/api/nova.virt.vmwareapi.vim.rst -source/api/nova.virt.vmwareapi.read_write_util.rst -source/api/nova.virt.vmwareapi.vmware_images.rst -source/api/nova.virt.vmwareapi.network_utils.rst -source/api/nova.virt.vmwareapi.vim_util.rst -source/api/nova.virt.vmwareapi.vm_util.rst -source/api/nova.virt.xenapi_conn.rst -source/api/nova.virt.fake.rst -source/api/nova.virt.vmwareapi_conn.rst -source/api/nova.virt.connection.rst -source/api/nova.virt.disk.rst -source/api/nova.virt.libvirt.connection.rst -source/api/nova.virt.libvirt.firewall.rst -source/api/nova.virt.libvirt.netutils.rst -source/api/nova.virt.hyperv.rst -source/api/nova.virt.xenapi.vmops.rst -source/api/nova.virt.xenapi.fake.rst -source/api/nova.virt.xenapi.volume_utils.rst -source/api/nova.virt.xenapi.network_utils.rst -source/api/nova.virt.xenapi.vm_utils.rst -source/api/nova.virt.xenapi.volumeops.rst -source/api/nova.exception.rst -source/api/nova.image.fake.rst -source/api/nova.image.local.rst -source/api/nova.image.glance.rst -source/api/nova.image.service.rst -source/api/nova.image.s3.rst -source/api/nova.objectstore.s3server.rst -source/api/nova.ipv6.account_identifier.rst -source/api/nova.ipv6.api.rst -source/api/nova.ipv6.rfc2462.rst -source/api/nova.notifier.no_op_notifier.rst -source/api/nova.notifier.log_notifier.rst -source/api/nova.notifier.rabbit_notifier.rst -source/api/nova.notifier.api.rst -source/api/nova.vcsversion.rst -source/api/nova.compute.instance_types.rst -source/api/nova.compute.power_state.rst -source/api/nova.compute.api.rst -source/api/nova.compute.manager.rst -source/api/nova.compute.monitor.rst -source/api/nova.wsgi.rst -source/api/nova.console.vmrc_manager.rst -source/api/nova.console.fake.rst -source/api/nova.console.vmrc.rst -source/api/nova.console.api.rst -source/api/nova.console.manager.rst -source/api/nova.console.xvp.rst -source/api/nova.version.rst -source/api/nova.utils.rst -source/api/nova.auth.dbdriver.rst -source/api/nova.auth.fakeldap.rst -source/api/nova.auth.ldapdriver.rst -source/api/nova.auth.signer.rst -source/api/nova.auth.manager.rst -source/api/nova.manager.rst -source/api/nova.scheduler.driver.rst -source/api/nova.scheduler.host_filter.rst -source/api/nova.scheduler.zone.rst -source/api/nova.scheduler.simple.rst -source/api/nova.scheduler.zone_aware_scheduler.rst -source/api/nova.scheduler.zone_manager.rst -source/api/nova.scheduler.api.rst -source/api/nova.scheduler.least_cost.rst -source/api/nova.scheduler.manager.rst -source/api/nova.scheduler.chance.rst -source/api/nova.vnc.auth.rst -source/api/nova.vnc.proxy.rst -source/api/nova.db.base.rst -source/api/nova.db.migration.rst -source/api/nova.db.sqlalchemy.session.rst -source/api/nova.db.sqlalchemy.migration.rst -source/api/nova.db.sqlalchemy.migrate_repo.manage.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.018_rename_server_management_url.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.017_make_instance_type_id_an_integer.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.010_add_os_type_to_instances.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.013_add_flavors_to_migrations.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.009_add_instance_migrations.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.002_bexar.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.020_add_snapshot_id_to_volumes.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.016_make_quotas_key_and_value.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.003_add_label_to_networks.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.021_rename_image_ids.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.006_add_provider_data_to_volumes.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.008_add_instance_types.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.019_add_volume_snapshot_support.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.001_austin.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.011_live_migration.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.005_add_instance_metadata.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.004_add_zone_tables.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.012_add_ipv6_flatmanager.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.015_add_auto_assign_to_floating_ips.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.007_add_ipv6_to_fixed_ips.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.014_add_instance_type_id_to_instances.rst -source/api/nova.db.sqlalchemy.api.rst -source/api/nova.db.sqlalchemy.models.rst -source/api/nova.db.api.rst -source/api/nova.twistd.rst -source/api/nova.test.rst -source/api/nova.fakerabbit.rst -source/api/nova.service.rst -source/api/nova.flags.rst -source/api/nova.api.ec2.ec2utils.rst -source/api/nova.api.ec2.metadatarequesthandler.rst -source/api/nova.api.ec2.cloud.rst -source/api/nova.api.ec2.admin.rst -source/api/nova.api.ec2.apirequest.rst -source/api/nova.api.openstack.images.rst -source/api/nova.api.openstack.faults.rst -source/api/nova.api.openstack.shared_ip_groups.rst -source/api/nova.api.openstack.common.rst -source/api/nova.api.openstack.ips.rst -source/api/nova.api.openstack.extensions.rst -source/api/nova.api.openstack.servers.rst -source/api/nova.api.openstack.consoles.rst -source/api/nova.api.openstack.users.rst -source/api/nova.api.openstack.auth.rst -source/api/nova.api.openstack.versions.rst -source/api/nova.api.openstack.zones.rst -source/api/nova.api.openstack.limits.rst -source/api/nova.api.openstack.flavors.rst -source/api/nova.api.openstack.image_metadata.rst -source/api/nova.api.openstack.contrib.volumes.rst -source/api/nova.api.openstack.wsgi.rst -source/api/nova.api.openstack.accounts.rst -source/api/nova.api.openstack.views.images.rst -source/api/nova.api.openstack.views.addresses.rst -source/api/nova.api.openstack.views.servers.rst -source/api/nova.api.openstack.views.versions.rst -source/api/nova.api.openstack.views.limits.rst -source/api/nova.api.openstack.views.flavors.rst -source/api/nova.api.openstack.server_metadata.rst -source/api/nova.api.openstack.backup_schedules.rst -source/api/nova.api.direct.rst -source/api/nova.log.rst -source/api/nova.rpc.rst -source/api/nova.fakememcache.rst -source/api/nova.crypto.rst -source/api/nova.cloudpipe.pipelib.rst -source/api/nova.context.rst -source/api/nova.quota.rst -source/api/nova.tests.test_compute.rst -source/api/nova.tests.test_quota.rst -source/api/nova.tests.test_flags.rst -source/api/nova.tests.test_objectstore.rst -source/api/nova.tests.test_crypto.rst -source/api/nova.tests.runtime_flags.rst -source/api/nova.tests.test_exception.rst -source/api/nova.tests.vmwareapi.db_fakes.rst -source/api/nova.tests.vmwareapi.stubs.rst -source/api/nova.tests.test_host_filter.rst -source/api/nova.tests.test_network.rst -source/api/nova.tests.network.base.rst -source/api/nova.tests.declare_flags.rst -source/api/nova.tests.test_localization.rst -source/api/nova.tests.test_access.rst -source/api/nova.tests.test_libvirt.rst -source/api/nova.tests.image.test_glance.rst -source/api/nova.tests.test_direct.rst -source/api/nova.tests.fake_utils.rst -source/api/nova.tests.integrated.test_login.rst -source/api/nova.tests.integrated.test_extensions.rst -source/api/nova.tests.integrated.integrated_helpers.rst -source/api/nova.tests.integrated.test_servers.rst -source/api/nova.tests.integrated.test_xml.rst -source/api/nova.tests.integrated.api.client.rst -source/api/nova.tests.integrated.test_volumes.rst -source/api/nova.tests.test_rpc.rst -source/api/nova.tests.test_volume.rst -source/api/nova.tests.test_notifier.rst -source/api/nova.tests.fake_flags.rst -source/api/nova.tests.test_log.rst -source/api/nova.tests.test_service.rst -source/api/nova.tests.test_twistd.rst -source/api/nova.tests.test_misc.rst -source/api/nova.tests.test_cloud.rst -source/api/nova.tests.glance.stubs.rst -source/api/nova.tests.test_auth.rst -source/api/nova.tests.test_utils.rst -source/api/nova.tests.test_vmwareapi.rst -source/api/nova.tests.test_vlan_network.rst -source/api/nova.tests.test_zones.rst -source/api/nova.tests.test_middleware.rst -source/api/nova.tests.test_ipv6.rst -source/api/nova.tests.xenapi.stubs.rst -source/api/nova.tests.test_api.rst -source/api/nova.tests.scheduler.test_host_filter.rst -source/api/nova.tests.scheduler.test_zone_aware_scheduler.rst -source/api/nova.tests.scheduler.test_least_cost_scheduler.rst -source/api/nova.tests.scheduler.test_scheduler.rst -source/api/nova.tests.db.fakes.rst -source/api/nova.tests.test_instance_types.rst -source/api/nova.tests.test_console.rst -source/api/nova.tests.api.test_wsgi.rst -source/api/nova.tests.api.openstack.test_users.rst -source/api/nova.tests.api.openstack.fakes.rst -source/api/nova.tests.api.openstack.common.rst -source/api/nova.tests.api.openstack.test_wsgi.rst -source/api/nova.tests.api.openstack.test_accounts.rst -source/api/nova.tests.api.openstack.test_flavors.rst -source/api/nova.tests.api.openstack.test_extensions.rst -source/api/nova.tests.api.openstack.test_adminapi.rst -source/api/nova.tests.api.openstack.test_versions.rst -source/api/nova.tests.api.openstack.test_image_metadata.rst -source/api/nova.tests.api.openstack.test_auth.rst -source/api/nova.tests.api.openstack.test_servers.rst -source/api/nova.tests.api.openstack.test_zones.rst -source/api/nova.tests.api.openstack.test_images.rst -source/api/nova.tests.api.openstack.test_api.rst -source/api/nova.tests.api.openstack.test_faults.rst -source/api/nova.tests.api.openstack.test_limits.rst -source/api/nova.tests.api.openstack.test_server_metadata.rst -source/api/nova.tests.api.openstack.test_shared_ip_groups.rst -source/api/nova.tests.api.openstack.test_common.rst -source/api/nova.tests.api.openstack.extensions.foxinsocks.rst -source/api/nova.tests.test_xenapi.rst -source/api/nova.tests.hyperv_unittest.rst -source/api/nova.tests.test_test.rst -source/api/nova.tests.test_flat_network.rst -source/api/nova.network.linux_net.rst -source/api/nova.network.api.rst -source/api/nova.network.manager.rst -source/api/nova.network.vmwareapi_net.rst -source/api/nova.network.xenapi_net.rst -source/api/nova.volume.driver.rst -source/api/nova.volume.api.rst -source/api/nova.volume.san.rst -source/api/nova.volume.manager.rst -source/api/nova.virt.images.rst -source/api/nova.virt.driver.rst -source/api/nova.virt.vmwareapi.io_util.rst -source/api/nova.virt.vmwareapi.error_util.rst -source/api/nova.virt.vmwareapi.vmops.rst -source/api/nova.virt.vmwareapi.fake.rst -source/api/nova.virt.vmwareapi.vim.rst -source/api/nova.virt.vmwareapi.read_write_util.rst -source/api/nova.virt.vmwareapi.vmware_images.rst -source/api/nova.virt.vmwareapi.network_utils.rst -source/api/nova.virt.vmwareapi.vim_util.rst -source/api/nova.virt.vmwareapi.vm_util.rst -source/api/nova.virt.xenapi_conn.rst -source/api/nova.virt.fake.rst -source/api/nova.virt.vmwareapi_conn.rst -source/api/nova.virt.connection.rst -source/api/nova.virt.disk.rst -source/api/nova.virt.libvirt.connection.rst -source/api/nova.virt.libvirt.firewall.rst -source/api/nova.virt.libvirt.netutils.rst -source/api/nova.virt.hyperv.rst -source/api/nova.virt.xenapi.vmops.rst -source/api/nova.virt.xenapi.fake.rst -source/api/nova.virt.xenapi.volume_utils.rst -source/api/nova.virt.xenapi.network_utils.rst -source/api/nova.virt.xenapi.vm_utils.rst -source/api/nova.virt.xenapi.volumeops.rst -source/api/nova.exception.rst -source/api/nova.image.fake.rst -source/api/nova.image.local.rst -source/api/nova.image.glance.rst -source/api/nova.image.service.rst -source/api/nova.image.s3.rst -source/api/nova.objectstore.s3server.rst -source/api/nova.ipv6.account_identifier.rst -source/api/nova.ipv6.api.rst -source/api/nova.ipv6.rfc2462.rst -source/api/nova.notifier.no_op_notifier.rst -source/api/nova.notifier.log_notifier.rst -source/api/nova.notifier.rabbit_notifier.rst -source/api/nova.notifier.api.rst -source/api/nova.vcsversion.rst -source/api/nova.compute.instance_types.rst -source/api/nova.compute.power_state.rst -source/api/nova.compute.api.rst -source/api/nova.compute.manager.rst -source/api/nova.compute.monitor.rst -source/api/nova.wsgi.rst -source/api/nova.console.vmrc_manager.rst -source/api/nova.console.fake.rst -source/api/nova.console.vmrc.rst -source/api/nova.console.api.rst -source/api/nova.console.manager.rst -source/api/nova.console.xvp.rst -source/api/nova.version.rst -source/api/nova.utils.rst -source/api/nova.auth.dbdriver.rst -source/api/nova.auth.fakeldap.rst -source/api/nova.auth.ldapdriver.rst -source/api/nova.auth.signer.rst -source/api/nova.auth.manager.rst -source/api/nova.manager.rst -source/api/nova.scheduler.driver.rst -source/api/nova.scheduler.host_filter.rst -source/api/nova.scheduler.zone.rst -source/api/nova.scheduler.simple.rst -source/api/nova.scheduler.zone_aware_scheduler.rst -source/api/nova.scheduler.zone_manager.rst -source/api/nova.scheduler.api.rst -source/api/nova.scheduler.least_cost.rst -source/api/nova.scheduler.manager.rst -source/api/nova.scheduler.chance.rst -source/api/nova.vnc.auth.rst -source/api/nova.vnc.proxy.rst -source/api/nova.db.base.rst -source/api/nova.db.migration.rst -source/api/nova.db.sqlalchemy.session.rst -source/api/nova.db.sqlalchemy.migration.rst -source/api/nova.db.sqlalchemy.migrate_repo.manage.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.018_rename_server_management_url.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.017_make_instance_type_id_an_integer.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.010_add_os_type_to_instances.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.013_add_flavors_to_migrations.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.009_add_instance_migrations.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.002_bexar.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.020_add_snapshot_id_to_volumes.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.016_make_quotas_key_and_value.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.003_add_label_to_networks.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.021_rename_image_ids.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.006_add_provider_data_to_volumes.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.008_add_instance_types.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.019_add_volume_snapshot_support.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.001_austin.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.011_live_migration.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.005_add_instance_metadata.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.004_add_zone_tables.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.012_add_ipv6_flatmanager.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.015_add_auto_assign_to_floating_ips.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.007_add_ipv6_to_fixed_ips.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.014_add_instance_type_id_to_instances.rst -source/api/nova.db.sqlalchemy.api.rst -source/api/nova.db.sqlalchemy.models.rst -source/api/nova.db.api.rst -source/api/nova.twistd.rst -source/api/nova.test.rst -source/api/nova.fakerabbit.rst -source/api/nova.service.rst -source/api/nova.flags.rst -source/api/nova.api.ec2.ec2utils.rst -source/api/nova.api.ec2.metadatarequesthandler.rst -source/api/nova.api.ec2.cloud.rst -source/api/nova.api.ec2.admin.rst -source/api/nova.api.ec2.apirequest.rst -source/api/nova.api.openstack.images.rst -source/api/nova.api.openstack.faults.rst -source/api/nova.api.openstack.shared_ip_groups.rst -source/api/nova.api.openstack.common.rst -source/api/nova.api.openstack.ips.rst -source/api/nova.api.openstack.extensions.rst -source/api/nova.api.openstack.servers.rst -source/api/nova.api.openstack.consoles.rst -source/api/nova.api.openstack.users.rst -source/api/nova.api.openstack.auth.rst -source/api/nova.api.openstack.versions.rst -source/api/nova.api.openstack.zones.rst -source/api/nova.api.openstack.limits.rst -source/api/nova.api.openstack.flavors.rst -source/api/nova.api.openstack.image_metadata.rst -source/api/nova.api.openstack.contrib.volumes.rst -source/api/nova.api.openstack.wsgi.rst -source/api/nova.api.openstack.accounts.rst -source/api/nova.api.openstack.views.images.rst -source/api/nova.api.openstack.views.addresses.rst -source/api/nova.api.openstack.views.servers.rst -source/api/nova.api.openstack.views.versions.rst -source/api/nova.api.openstack.views.limits.rst -source/api/nova.api.openstack.views.flavors.rst -source/api/nova.api.openstack.server_metadata.rst -source/api/nova.api.openstack.backup_schedules.rst -source/api/nova.api.direct.rst -source/api/nova.log.rst -source/api/nova.rpc.rst -source/api/nova.fakememcache.rst -source/api/nova.crypto.rst -source/api/nova.cloudpipe.pipelib.rst -source/api/nova.context.rst -source/api/nova.quota.rst -source/api/nova.tests.test_compute.rst -source/api/nova.tests.test_quota.rst -source/api/nova.tests.test_flags.rst -source/api/nova.tests.test_objectstore.rst -source/api/nova.tests.test_crypto.rst -source/api/nova.tests.runtime_flags.rst -source/api/nova.tests.test_exception.rst -source/api/nova.tests.vmwareapi.db_fakes.rst -source/api/nova.tests.vmwareapi.stubs.rst -source/api/nova.tests.test_host_filter.rst -source/api/nova.tests.test_network.rst -source/api/nova.tests.network.base.rst -source/api/nova.tests.declare_flags.rst -source/api/nova.tests.test_localization.rst -source/api/nova.tests.test_access.rst -source/api/nova.tests.test_libvirt.rst -source/api/nova.tests.image.test_glance.rst -source/api/nova.tests.test_direct.rst -source/api/nova.tests.fake_utils.rst -source/api/nova.tests.integrated.test_login.rst -source/api/nova.tests.integrated.test_extensions.rst -source/api/nova.tests.integrated.integrated_helpers.rst -source/api/nova.tests.integrated.test_servers.rst -source/api/nova.tests.integrated.test_xml.rst -source/api/nova.tests.integrated.api.client.rst -source/api/nova.tests.integrated.test_volumes.rst -source/api/nova.tests.test_rpc.rst -source/api/nova.tests.test_volume.rst -source/api/nova.tests.test_notifier.rst -source/api/nova.tests.fake_flags.rst -source/api/nova.tests.test_log.rst -source/api/nova.tests.test_service.rst -source/api/nova.tests.test_twistd.rst -source/api/nova.tests.test_misc.rst -source/api/nova.tests.test_cloud.rst -source/api/nova.tests.glance.stubs.rst -source/api/nova.tests.test_auth.rst -source/api/nova.tests.test_utils.rst -source/api/nova.tests.test_vmwareapi.rst -source/api/nova.tests.test_vlan_network.rst -source/api/nova.tests.test_zones.rst -source/api/nova.tests.test_middleware.rst -source/api/nova.tests.test_ipv6.rst -source/api/nova.tests.xenapi.stubs.rst -source/api/nova.tests.test_api.rst -source/api/nova.tests.scheduler.test_host_filter.rst -source/api/nova.tests.scheduler.test_zone_aware_scheduler.rst -source/api/nova.tests.scheduler.test_least_cost_scheduler.rst -source/api/nova.tests.scheduler.test_scheduler.rst -source/api/nova.tests.db.fakes.rst -source/api/nova.tests.test_instance_types.rst -source/api/nova.tests.test_console.rst -source/api/nova.tests.api.test_wsgi.rst -source/api/nova.tests.api.openstack.test_users.rst -source/api/nova.tests.api.openstack.fakes.rst -source/api/nova.tests.api.openstack.common.rst -source/api/nova.tests.api.openstack.test_wsgi.rst -source/api/nova.tests.api.openstack.test_accounts.rst -source/api/nova.tests.api.openstack.test_flavors.rst -source/api/nova.tests.api.openstack.test_extensions.rst -source/api/nova.tests.api.openstack.test_adminapi.rst -source/api/nova.tests.api.openstack.test_versions.rst -source/api/nova.tests.api.openstack.test_image_metadata.rst -source/api/nova.tests.api.openstack.test_auth.rst -source/api/nova.tests.api.openstack.test_servers.rst -source/api/nova.tests.api.openstack.test_zones.rst -source/api/nova.tests.api.openstack.test_images.rst -source/api/nova.tests.api.openstack.test_api.rst -source/api/nova.tests.api.openstack.test_faults.rst -source/api/nova.tests.api.openstack.test_limits.rst -source/api/nova.tests.api.openstack.test_server_metadata.rst -source/api/nova.tests.api.openstack.test_shared_ip_groups.rst -source/api/nova.tests.api.openstack.test_common.rst -source/api/nova.tests.api.openstack.extensions.foxinsocks.rst -source/api/nova.tests.test_xenapi.rst -source/api/nova.tests.hyperv_unittest.rst -source/api/nova.tests.test_test.rst -source/api/nova.tests.test_flat_network.rst -source/api/nova.network.linux_net.rst -source/api/nova.network.api.rst -source/api/nova.network.manager.rst -source/api/nova.network.vmwareapi_net.rst -source/api/nova.network.xenapi_net.rst -source/api/nova.volume.driver.rst -source/api/nova.volume.api.rst -source/api/nova.volume.san.rst -source/api/nova.volume.manager.rst -source/api/nova.virt.images.rst -source/api/nova.virt.driver.rst -source/api/nova.virt.vmwareapi.io_util.rst -source/api/nova.virt.vmwareapi.error_util.rst -source/api/nova.virt.vmwareapi.vmops.rst -source/api/nova.virt.vmwareapi.fake.rst -source/api/nova.virt.vmwareapi.vim.rst -source/api/nova.virt.vmwareapi.read_write_util.rst -source/api/nova.virt.vmwareapi.vmware_images.rst -source/api/nova.virt.vmwareapi.network_utils.rst -source/api/nova.virt.vmwareapi.vim_util.rst -source/api/nova.virt.vmwareapi.vm_util.rst -source/api/nova.virt.xenapi_conn.rst -source/api/nova.virt.fake.rst -source/api/nova.virt.vmwareapi_conn.rst -source/api/nova.virt.connection.rst -source/api/nova.virt.disk.rst -source/api/nova.virt.libvirt.connection.rst -source/api/nova.virt.libvirt.firewall.rst -source/api/nova.virt.libvirt.netutils.rst -source/api/nova.virt.hyperv.rst -source/api/nova.virt.xenapi.vmops.rst -source/api/nova.virt.xenapi.fake.rst -source/api/nova.virt.xenapi.volume_utils.rst -source/api/nova.virt.xenapi.network_utils.rst -source/api/nova.virt.xenapi.vm_utils.rst -source/api/nova.virt.xenapi.volumeops.rst -source/api/nova.exception.rst -source/api/nova.image.fake.rst -source/api/nova.image.local.rst -source/api/nova.image.glance.rst -source/api/nova.image.service.rst -source/api/nova.image.s3.rst -source/api/nova.objectstore.s3server.rst -source/api/nova.ipv6.account_identifier.rst -source/api/nova.ipv6.api.rst -source/api/nova.ipv6.rfc2462.rst -source/api/nova.notifier.no_op_notifier.rst -source/api/nova.notifier.log_notifier.rst -source/api/nova.notifier.rabbit_notifier.rst -source/api/nova.notifier.api.rst -source/api/nova.vcsversion.rst -source/api/nova.compute.instance_types.rst -source/api/nova.compute.power_state.rst -source/api/nova.compute.api.rst -source/api/nova.compute.manager.rst -source/api/nova.compute.monitor.rst -source/api/nova.wsgi.rst -source/api/nova.console.vmrc_manager.rst -source/api/nova.console.fake.rst -source/api/nova.console.vmrc.rst -source/api/nova.console.api.rst -source/api/nova.console.manager.rst -source/api/nova.console.xvp.rst -source/api/nova.version.rst -source/api/nova.utils.rst -source/api/nova.auth.dbdriver.rst -source/api/nova.auth.fakeldap.rst -source/api/nova.auth.ldapdriver.rst -source/api/nova.auth.signer.rst -source/api/nova.auth.manager.rst -source/api/nova.manager.rst -source/api/nova.scheduler.driver.rst -source/api/nova.scheduler.host_filter.rst -source/api/nova.scheduler.zone.rst -source/api/nova.scheduler.simple.rst -source/api/nova.scheduler.zone_aware_scheduler.rst -source/api/nova.scheduler.zone_manager.rst -source/api/nova.scheduler.api.rst -source/api/nova.scheduler.least_cost.rst -source/api/nova.scheduler.manager.rst -source/api/nova.scheduler.chance.rst -source/api/nova.vnc.auth.rst -source/api/nova.vnc.proxy.rst -source/api/nova.db.base.rst -source/api/nova.db.migration.rst -source/api/nova.db.sqlalchemy.session.rst -source/api/nova.db.sqlalchemy.migration.rst -source/api/nova.db.sqlalchemy.migrate_repo.manage.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.018_rename_server_management_url.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.017_make_instance_type_id_an_integer.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.010_add_os_type_to_instances.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.013_add_flavors_to_migrations.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.009_add_instance_migrations.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.002_bexar.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.020_add_snapshot_id_to_volumes.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.016_make_quotas_key_and_value.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.003_add_label_to_networks.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.021_rename_image_ids.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.006_add_provider_data_to_volumes.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.008_add_instance_types.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.019_add_volume_snapshot_support.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.001_austin.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.011_live_migration.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.005_add_instance_metadata.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.004_add_zone_tables.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.012_add_ipv6_flatmanager.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.015_add_auto_assign_to_floating_ips.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.007_add_ipv6_to_fixed_ips.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.014_add_instance_type_id_to_instances.rst -source/api/nova.db.sqlalchemy.api.rst -source/api/nova.db.sqlalchemy.models.rst -source/api/nova.db.api.rst -source/api/nova.twistd.rst -source/api/nova.test.rst -source/api/nova.fakerabbit.rst -source/api/nova.service.rst -source/api/nova.flags.rst -source/api/nova.api.ec2.ec2utils.rst -source/api/nova.api.ec2.metadatarequesthandler.rst -source/api/nova.api.ec2.cloud.rst -source/api/nova.api.ec2.admin.rst -source/api/nova.api.ec2.apirequest.rst -source/api/nova.api.openstack.images.rst -source/api/nova.api.openstack.faults.rst -source/api/nova.api.openstack.shared_ip_groups.rst -source/api/nova.api.openstack.common.rst -source/api/nova.api.openstack.ips.rst -source/api/nova.api.openstack.extensions.rst -source/api/nova.api.openstack.servers.rst -source/api/nova.api.openstack.consoles.rst -source/api/nova.api.openstack.users.rst -source/api/nova.api.openstack.auth.rst -source/api/nova.api.openstack.versions.rst -source/api/nova.api.openstack.zones.rst -source/api/nova.api.openstack.limits.rst -source/api/nova.api.openstack.flavors.rst -source/api/nova.api.openstack.image_metadata.rst -source/api/nova.api.openstack.contrib.volumes.rst -source/api/nova.api.openstack.wsgi.rst -source/api/nova.api.openstack.accounts.rst -source/api/nova.api.openstack.views.images.rst -source/api/nova.api.openstack.views.addresses.rst -source/api/nova.api.openstack.views.servers.rst -source/api/nova.api.openstack.views.versions.rst -source/api/nova.api.openstack.views.limits.rst -source/api/nova.api.openstack.views.flavors.rst -source/api/nova.api.openstack.server_metadata.rst -source/api/nova.api.openstack.backup_schedules.rst -source/api/nova.api.direct.rst -source/api/nova.log.rst -source/api/nova.rpc.rst -source/api/nova.fakememcache.rst -source/api/nova.crypto.rst -source/api/nova.cloudpipe.pipelib.rst -source/api/nova.context.rst -source/api/nova.quota.rst -source/api/nova.tests.test_compute.rst -source/api/nova.tests.test_quota.rst -source/api/nova.tests.test_flags.rst -source/api/nova.tests.test_objectstore.rst -source/api/nova.tests.test_crypto.rst -source/api/nova.tests.runtime_flags.rst -source/api/nova.tests.test_exception.rst -source/api/nova.tests.vmwareapi.db_fakes.rst -source/api/nova.tests.vmwareapi.stubs.rst -source/api/nova.tests.test_host_filter.rst -source/api/nova.tests.test_network.rst -source/api/nova.tests.network.base.rst -source/api/nova.tests.declare_flags.rst -source/api/nova.tests.test_localization.rst -source/api/nova.tests.test_access.rst -source/api/nova.tests.test_libvirt.rst -source/api/nova.tests.image.test_glance.rst -source/api/nova.tests.test_direct.rst -source/api/nova.tests.fake_utils.rst -source/api/nova.tests.integrated.test_login.rst -source/api/nova.tests.integrated.test_extensions.rst -source/api/nova.tests.integrated.integrated_helpers.rst -source/api/nova.tests.integrated.test_servers.rst -source/api/nova.tests.integrated.test_xml.rst -source/api/nova.tests.integrated.api.client.rst -source/api/nova.tests.integrated.test_volumes.rst -source/api/nova.tests.test_rpc.rst -source/api/nova.tests.test_volume.rst -source/api/nova.tests.test_notifier.rst -source/api/nova.tests.fake_flags.rst -source/api/nova.tests.test_log.rst -source/api/nova.tests.test_service.rst -source/api/nova.tests.test_twistd.rst -source/api/nova.tests.test_misc.rst -source/api/nova.tests.test_cloud.rst -source/api/nova.tests.glance.stubs.rst -source/api/nova.tests.test_auth.rst -source/api/nova.tests.test_utils.rst -source/api/nova.tests.test_vmwareapi.rst -source/api/nova.tests.test_vlan_network.rst -source/api/nova.tests.test_zones.rst -source/api/nova.tests.test_middleware.rst -source/api/nova.tests.test_ipv6.rst -source/api/nova.tests.xenapi.stubs.rst -source/api/nova.tests.test_api.rst -source/api/nova.tests.scheduler.test_host_filter.rst -source/api/nova.tests.scheduler.test_zone_aware_scheduler.rst -source/api/nova.tests.scheduler.test_least_cost_scheduler.rst -source/api/nova.tests.scheduler.test_scheduler.rst -source/api/nova.tests.db.fakes.rst -source/api/nova.tests.test_instance_types.rst -source/api/nova.tests.test_console.rst -source/api/nova.tests.api.test_wsgi.rst -source/api/nova.tests.api.openstack.test_users.rst -source/api/nova.tests.api.openstack.fakes.rst -source/api/nova.tests.api.openstack.common.rst -source/api/nova.tests.api.openstack.test_wsgi.rst -source/api/nova.tests.api.openstack.test_accounts.rst -source/api/nova.tests.api.openstack.test_flavors.rst -source/api/nova.tests.api.openstack.test_extensions.rst -source/api/nova.tests.api.openstack.test_adminapi.rst -source/api/nova.tests.api.openstack.test_versions.rst -source/api/nova.tests.api.openstack.test_image_metadata.rst -source/api/nova.tests.api.openstack.test_auth.rst -source/api/nova.tests.api.openstack.test_servers.rst -source/api/nova.tests.api.openstack.test_zones.rst -source/api/nova.tests.api.openstack.test_images.rst -source/api/nova.tests.api.openstack.test_api.rst -source/api/nova.tests.api.openstack.test_faults.rst -source/api/nova.tests.api.openstack.test_limits.rst -source/api/nova.tests.api.openstack.test_server_metadata.rst -source/api/nova.tests.api.openstack.test_shared_ip_groups.rst -source/api/nova.tests.api.openstack.test_common.rst -source/api/nova.tests.api.openstack.extensions.foxinsocks.rst -source/api/nova.tests.test_xenapi.rst -source/api/nova.tests.hyperv_unittest.rst -source/api/nova.tests.test_test.rst -source/api/nova.tests.test_flat_network.rst -source/api/nova.network.linux_net.rst -source/api/nova.network.api.rst -source/api/nova.network.manager.rst -source/api/nova.network.vmwareapi_net.rst -source/api/nova.network.xenapi_net.rst -source/api/nova.volume.driver.rst -source/api/nova.volume.api.rst -source/api/nova.volume.san.rst -source/api/nova.volume.manager.rst -source/api/nova.virt.images.rst -source/api/nova.virt.driver.rst -source/api/nova.virt.vmwareapi.io_util.rst -source/api/nova.virt.vmwareapi.error_util.rst -source/api/nova.virt.vmwareapi.vmops.rst -source/api/nova.virt.vmwareapi.fake.rst -source/api/nova.virt.vmwareapi.vim.rst -source/api/nova.virt.vmwareapi.read_write_util.rst -source/api/nova.virt.vmwareapi.vmware_images.rst -source/api/nova.virt.vmwareapi.network_utils.rst -source/api/nova.virt.vmwareapi.vim_util.rst -source/api/nova.virt.vmwareapi.vm_util.rst -source/api/nova.virt.xenapi_conn.rst -source/api/nova.virt.fake.rst -source/api/nova.virt.vmwareapi_conn.rst -source/api/nova.virt.connection.rst -source/api/nova.virt.disk.rst -source/api/nova.virt.libvirt.connection.rst -source/api/nova.virt.libvirt.firewall.rst -source/api/nova.virt.libvirt.netutils.rst -source/api/nova.virt.hyperv.rst -source/api/nova.virt.xenapi.vmops.rst -source/api/nova.virt.xenapi.fake.rst -source/api/nova.virt.xenapi.volume_utils.rst -source/api/nova.virt.xenapi.network_utils.rst -source/api/nova.virt.xenapi.vm_utils.rst -source/api/nova.virt.xenapi.volumeops.rst -source/api/nova.exception.rst -source/api/nova.image.fake.rst -source/api/nova.image.local.rst -source/api/nova.image.glance.rst -source/api/nova.image.service.rst -source/api/nova.image.s3.rst -source/api/nova.objectstore.s3server.rst -source/api/nova.ipv6.account_identifier.rst -source/api/nova.ipv6.api.rst -source/api/nova.ipv6.rfc2462.rst -source/api/nova.notifier.no_op_notifier.rst -source/api/nova.notifier.log_notifier.rst -source/api/nova.notifier.rabbit_notifier.rst -source/api/nova.notifier.api.rst -source/api/nova.vcsversion.rst -source/api/nova.compute.instance_types.rst -source/api/nova.compute.power_state.rst -source/api/nova.compute.api.rst -source/api/nova.compute.manager.rst -source/api/nova.compute.monitor.rst -source/api/nova.wsgi.rst -source/api/nova.console.vmrc_manager.rst -source/api/nova.console.fake.rst -source/api/nova.console.vmrc.rst -source/api/nova.console.api.rst -source/api/nova.console.manager.rst -source/api/nova.console.xvp.rst -source/api/nova.version.rst -source/api/nova.utils.rst -source/api/nova.auth.dbdriver.rst -source/api/nova.auth.fakeldap.rst -source/api/nova.auth.ldapdriver.rst -source/api/nova.auth.signer.rst -source/api/nova.auth.manager.rst -source/api/nova.manager.rst -source/api/nova.scheduler.driver.rst -source/api/nova.scheduler.host_filter.rst -source/api/nova.scheduler.zone.rst -source/api/nova.scheduler.simple.rst -source/api/nova.scheduler.zone_aware_scheduler.rst -source/api/nova.scheduler.zone_manager.rst -source/api/nova.scheduler.api.rst -source/api/nova.scheduler.least_cost.rst -source/api/nova.scheduler.manager.rst -source/api/nova.scheduler.chance.rst -source/api/nova.vnc.auth.rst -source/api/nova.vnc.proxy.rst -source/api/nova.db.base.rst -source/api/nova.db.migration.rst -source/api/nova.db.sqlalchemy.session.rst -source/api/nova.db.sqlalchemy.migration.rst -source/api/nova.db.sqlalchemy.migrate_repo.manage.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.018_rename_server_management_url.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.017_make_instance_type_id_an_integer.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.010_add_os_type_to_instances.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.013_add_flavors_to_migrations.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.009_add_instance_migrations.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.002_bexar.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.020_add_snapshot_id_to_volumes.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.016_make_quotas_key_and_value.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.003_add_label_to_networks.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.021_rename_image_ids.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.006_add_provider_data_to_volumes.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.008_add_instance_types.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.019_add_volume_snapshot_support.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.001_austin.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.011_live_migration.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.005_add_instance_metadata.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.004_add_zone_tables.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.012_add_ipv6_flatmanager.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.015_add_auto_assign_to_floating_ips.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.007_add_ipv6_to_fixed_ips.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.014_add_instance_type_id_to_instances.rst -source/api/nova.db.sqlalchemy.api.rst -source/api/nova.db.sqlalchemy.models.rst -source/api/nova.db.api.rst -source/api/nova.twistd.rst -source/api/nova.test.rst -source/api/nova.fakerabbit.rst -source/api/nova.service.rst -source/api/nova.flags.rst -source/api/nova.api.ec2.ec2utils.rst -source/api/nova.api.ec2.metadatarequesthandler.rst -source/api/nova.api.ec2.cloud.rst -source/api/nova.api.ec2.admin.rst -source/api/nova.api.ec2.apirequest.rst -source/api/nova.api.openstack.images.rst -source/api/nova.api.openstack.faults.rst -source/api/nova.api.openstack.shared_ip_groups.rst -source/api/nova.api.openstack.common.rst -source/api/nova.api.openstack.ips.rst -source/api/nova.api.openstack.extensions.rst -source/api/nova.api.openstack.servers.rst -source/api/nova.api.openstack.consoles.rst -source/api/nova.api.openstack.users.rst -source/api/nova.api.openstack.auth.rst -source/api/nova.api.openstack.versions.rst -source/api/nova.api.openstack.zones.rst -source/api/nova.api.openstack.limits.rst -source/api/nova.api.openstack.flavors.rst -source/api/nova.api.openstack.image_metadata.rst -source/api/nova.api.openstack.contrib.volumes.rst -source/api/nova.api.openstack.wsgi.rst -source/api/nova.api.openstack.accounts.rst -source/api/nova.api.openstack.views.images.rst -source/api/nova.api.openstack.views.addresses.rst -source/api/nova.api.openstack.views.servers.rst -source/api/nova.api.openstack.views.versions.rst -source/api/nova.api.openstack.views.limits.rst -source/api/nova.api.openstack.views.flavors.rst -source/api/nova.api.openstack.server_metadata.rst -source/api/nova.api.openstack.backup_schedules.rst -source/api/nova.api.direct.rst -source/api/nova.log.rst -source/api/nova.rpc.rst -source/api/nova.fakememcache.rst -source/api/nova.crypto.rst -source/api/nova.cloudpipe.pipelib.rst -source/api/nova.context.rst -source/api/nova.quota.rst -source/api/nova.tests.test_compute.rst -source/api/nova.tests.test_quota.rst -source/api/nova.tests.test_flags.rst -source/api/nova.tests.test_objectstore.rst -source/api/nova.tests.test_crypto.rst -source/api/nova.tests.runtime_flags.rst -source/api/nova.tests.test_exception.rst -source/api/nova.tests.vmwareapi.db_fakes.rst -source/api/nova.tests.vmwareapi.stubs.rst -source/api/nova.tests.test_host_filter.rst -source/api/nova.tests.test_network.rst -source/api/nova.tests.network.base.rst -source/api/nova.tests.declare_flags.rst -source/api/nova.tests.test_localization.rst -source/api/nova.tests.test_access.rst -source/api/nova.tests.test_libvirt.rst -source/api/nova.tests.image.test_glance.rst -source/api/nova.tests.test_direct.rst -source/api/nova.tests.fake_utils.rst -source/api/nova.tests.integrated.test_login.rst -source/api/nova.tests.integrated.test_extensions.rst -source/api/nova.tests.integrated.integrated_helpers.rst -source/api/nova.tests.integrated.test_servers.rst -source/api/nova.tests.integrated.test_xml.rst -source/api/nova.tests.integrated.api.client.rst -source/api/nova.tests.integrated.test_volumes.rst -source/api/nova.tests.test_rpc.rst -source/api/nova.tests.test_volume.rst -source/api/nova.tests.test_notifier.rst -source/api/nova.tests.fake_flags.rst -source/api/nova.tests.test_log.rst -source/api/nova.tests.test_service.rst -source/api/nova.tests.test_twistd.rst -source/api/nova.tests.test_misc.rst -source/api/nova.tests.test_cloud.rst -source/api/nova.tests.glance.stubs.rst -source/api/nova.tests.test_auth.rst -source/api/nova.tests.test_utils.rst -source/api/nova.tests.test_vmwareapi.rst -source/api/nova.tests.test_vlan_network.rst -source/api/nova.tests.test_zones.rst -source/api/nova.tests.test_middleware.rst -source/api/nova.tests.test_ipv6.rst -source/api/nova.tests.xenapi.stubs.rst -source/api/nova.tests.test_api.rst -source/api/nova.tests.scheduler.test_host_filter.rst -source/api/nova.tests.scheduler.test_zone_aware_scheduler.rst -source/api/nova.tests.scheduler.test_least_cost_scheduler.rst -source/api/nova.tests.scheduler.test_scheduler.rst -source/api/nova.tests.db.fakes.rst -source/api/nova.tests.test_instance_types.rst -source/api/nova.tests.test_console.rst -source/api/nova.tests.api.test_wsgi.rst -source/api/nova.tests.api.openstack.test_users.rst -source/api/nova.tests.api.openstack.fakes.rst -source/api/nova.tests.api.openstack.common.rst -source/api/nova.tests.api.openstack.test_wsgi.rst -source/api/nova.tests.api.openstack.test_accounts.rst -source/api/nova.tests.api.openstack.test_flavors.rst -source/api/nova.tests.api.openstack.test_extensions.rst -source/api/nova.tests.api.openstack.test_adminapi.rst -source/api/nova.tests.api.openstack.test_versions.rst -source/api/nova.tests.api.openstack.test_image_metadata.rst -source/api/nova.tests.api.openstack.test_auth.rst -source/api/nova.tests.api.openstack.test_servers.rst -source/api/nova.tests.api.openstack.test_zones.rst -source/api/nova.tests.api.openstack.test_images.rst -source/api/nova.tests.api.openstack.test_api.rst -source/api/nova.tests.api.openstack.test_faults.rst -source/api/nova.tests.api.openstack.test_limits.rst -source/api/nova.tests.api.openstack.test_server_metadata.rst -source/api/nova.tests.api.openstack.test_shared_ip_groups.rst -source/api/nova.tests.api.openstack.test_common.rst -source/api/nova.tests.api.openstack.extensions.foxinsocks.rst -source/api/nova.tests.test_xenapi.rst -source/api/nova.tests.hyperv_unittest.rst -source/api/nova.tests.test_test.rst -source/api/nova.tests.test_flat_network.rst -source/api/nova.network.linux_net.rst -source/api/nova.network.api.rst -source/api/nova.network.manager.rst -source/api/nova.network.vmwareapi_net.rst -source/api/nova.network.xenapi_net.rst -source/api/nova.volume.driver.rst -source/api/nova.volume.api.rst -source/api/nova.volume.san.rst -source/api/nova.volume.manager.rst -source/api/nova.virt.images.rst -source/api/nova.virt.driver.rst -source/api/nova.virt.vmwareapi.io_util.rst -source/api/nova.virt.vmwareapi.error_util.rst -source/api/nova.virt.vmwareapi.vmops.rst -source/api/nova.virt.vmwareapi.fake.rst -source/api/nova.virt.vmwareapi.vim.rst -source/api/nova.virt.vmwareapi.read_write_util.rst -source/api/nova.virt.vmwareapi.vmware_images.rst -source/api/nova.virt.vmwareapi.network_utils.rst -source/api/nova.virt.vmwareapi.vim_util.rst -source/api/nova.virt.vmwareapi.vm_util.rst -source/api/nova.virt.xenapi_conn.rst -source/api/nova.virt.fake.rst -source/api/nova.virt.vmwareapi_conn.rst -source/api/nova.virt.connection.rst -source/api/nova.virt.disk.rst -source/api/nova.virt.libvirt.connection.rst -source/api/nova.virt.libvirt.firewall.rst -source/api/nova.virt.libvirt.netutils.rst -source/api/nova.virt.hyperv.rst -source/api/nova.virt.xenapi.vmops.rst -source/api/nova.virt.xenapi.fake.rst -source/api/nova.virt.xenapi.volume_utils.rst -source/api/nova.virt.xenapi.network_utils.rst -source/api/nova.virt.xenapi.vm_utils.rst -source/api/nova.virt.xenapi.volumeops.rst -source/api/nova.exception.rst -source/api/nova.image.fake.rst -source/api/nova.image.local.rst -source/api/nova.image.glance.rst -source/api/nova.image.service.rst -source/api/nova.image.s3.rst -source/api/nova.objectstore.s3server.rst -source/api/nova.ipv6.account_identifier.rst -source/api/nova.ipv6.api.rst -source/api/nova.ipv6.rfc2462.rst -source/api/nova.notifier.no_op_notifier.rst -source/api/nova.notifier.log_notifier.rst -source/api/nova.notifier.rabbit_notifier.rst -source/api/nova.notifier.api.rst -source/api/nova.vcsversion.rst -source/api/nova.compute.instance_types.rst -source/api/nova.compute.power_state.rst -source/api/nova.compute.api.rst -source/api/nova.compute.manager.rst -source/api/nova.compute.monitor.rst -source/api/nova.wsgi.rst -source/api/nova.console.vmrc_manager.rst -source/api/nova.console.fake.rst -source/api/nova.console.vmrc.rst -source/api/nova.console.api.rst -source/api/nova.console.manager.rst -source/api/nova.console.xvp.rst -source/api/nova.version.rst -source/api/nova.utils.rst -source/api/nova.auth.dbdriver.rst -source/api/nova.auth.fakeldap.rst -source/api/nova.auth.ldapdriver.rst -source/api/nova.auth.signer.rst -source/api/nova.auth.manager.rst -source/api/nova.manager.rst -source/api/nova.scheduler.driver.rst -source/api/nova.scheduler.host_filter.rst -source/api/nova.scheduler.zone.rst -source/api/nova.scheduler.simple.rst -source/api/nova.scheduler.zone_aware_scheduler.rst -source/api/nova.scheduler.zone_manager.rst -source/api/nova.scheduler.api.rst -source/api/nova.scheduler.least_cost.rst -source/api/nova.scheduler.manager.rst -source/api/nova.scheduler.chance.rst -source/api/nova.vnc.auth.rst -source/api/nova.vnc.proxy.rst -source/api/nova.db.base.rst -source/api/nova.db.migration.rst -source/api/nova.db.sqlalchemy.session.rst -source/api/nova.db.sqlalchemy.migration.rst -source/api/nova.db.sqlalchemy.migrate_repo.manage.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.018_rename_server_management_url.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.017_make_instance_type_id_an_integer.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.010_add_os_type_to_instances.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.013_add_flavors_to_migrations.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.009_add_instance_migrations.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.002_bexar.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.020_add_snapshot_id_to_volumes.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.016_make_quotas_key_and_value.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.003_add_label_to_networks.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.021_rename_image_ids.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.006_add_provider_data_to_volumes.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.008_add_instance_types.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.019_add_volume_snapshot_support.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.001_austin.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.011_live_migration.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.005_add_instance_metadata.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.004_add_zone_tables.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.012_add_ipv6_flatmanager.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.015_add_auto_assign_to_floating_ips.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.007_add_ipv6_to_fixed_ips.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.014_add_instance_type_id_to_instances.rst -source/api/nova.db.sqlalchemy.api.rst -source/api/nova.db.sqlalchemy.models.rst -source/api/nova.db.api.rst -source/api/nova.twistd.rst -source/api/nova.test.rst -source/api/nova.fakerabbit.rst -source/api/nova.service.rst -source/api/nova.flags.rst -source/api/nova.api.ec2.ec2utils.rst -source/api/nova.api.ec2.metadatarequesthandler.rst -source/api/nova.api.ec2.cloud.rst -source/api/nova.api.ec2.admin.rst -source/api/nova.api.ec2.apirequest.rst -source/api/nova.api.openstack.images.rst -source/api/nova.api.openstack.faults.rst -source/api/nova.api.openstack.shared_ip_groups.rst -source/api/nova.api.openstack.common.rst -source/api/nova.api.openstack.ips.rst -source/api/nova.api.openstack.extensions.rst -source/api/nova.api.openstack.servers.rst -source/api/nova.api.openstack.consoles.rst -source/api/nova.api.openstack.users.rst -source/api/nova.api.openstack.auth.rst -source/api/nova.api.openstack.versions.rst -source/api/nova.api.openstack.zones.rst -source/api/nova.api.openstack.limits.rst -source/api/nova.api.openstack.flavors.rst -source/api/nova.api.openstack.image_metadata.rst -source/api/nova.api.openstack.contrib.volumes.rst -source/api/nova.api.openstack.wsgi.rst -source/api/nova.api.openstack.accounts.rst -source/api/nova.api.openstack.views.images.rst -source/api/nova.api.openstack.views.addresses.rst -source/api/nova.api.openstack.views.servers.rst -source/api/nova.api.openstack.views.versions.rst -source/api/nova.api.openstack.views.limits.rst -source/api/nova.api.openstack.views.flavors.rst -source/api/nova.api.openstack.server_metadata.rst -source/api/nova.api.openstack.backup_schedules.rst -source/api/nova.api.direct.rst -source/api/nova.log.rst -source/api/nova.rpc.rst -source/api/nova.fakememcache.rst -source/api/nova.crypto.rst -source/api/nova.cloudpipe.pipelib.rst -source/api/nova.context.rst -source/api/nova.quota.rst -source/api/nova.tests.test_compute.rst -source/api/nova.tests.test_quota.rst -source/api/nova.tests.test_flags.rst -source/api/nova.tests.test_objectstore.rst -source/api/nova.tests.test_crypto.rst -source/api/nova.tests.runtime_flags.rst -source/api/nova.tests.test_exception.rst -source/api/nova.tests.vmwareapi.db_fakes.rst -source/api/nova.tests.vmwareapi.stubs.rst -source/api/nova.tests.test_host_filter.rst -source/api/nova.tests.test_network.rst -source/api/nova.tests.network.base.rst -source/api/nova.tests.declare_flags.rst -source/api/nova.tests.test_localization.rst -source/api/nova.tests.test_access.rst -source/api/nova.tests.test_libvirt.rst -source/api/nova.tests.image.test_glance.rst -source/api/nova.tests.test_direct.rst -source/api/nova.tests.fake_utils.rst -source/api/nova.tests.integrated.test_login.rst -source/api/nova.tests.integrated.test_extensions.rst -source/api/nova.tests.integrated.integrated_helpers.rst -source/api/nova.tests.integrated.test_servers.rst -source/api/nova.tests.integrated.test_xml.rst -source/api/nova.tests.integrated.api.client.rst -source/api/nova.tests.integrated.test_volumes.rst -source/api/nova.tests.test_rpc.rst -source/api/nova.tests.test_volume.rst -source/api/nova.tests.test_notifier.rst -source/api/nova.tests.fake_flags.rst -source/api/nova.tests.test_log.rst -source/api/nova.tests.test_service.rst -source/api/nova.tests.test_twistd.rst -source/api/nova.tests.test_misc.rst -source/api/nova.tests.test_cloud.rst -source/api/nova.tests.glance.stubs.rst -source/api/nova.tests.test_auth.rst -source/api/nova.tests.test_utils.rst -source/api/nova.tests.test_vmwareapi.rst -source/api/nova.tests.test_vlan_network.rst -source/api/nova.tests.test_zones.rst -source/api/nova.tests.test_middleware.rst -source/api/nova.tests.test_ipv6.rst -source/api/nova.tests.xenapi.stubs.rst -source/api/nova.tests.test_api.rst -source/api/nova.tests.scheduler.test_host_filter.rst -source/api/nova.tests.scheduler.test_zone_aware_scheduler.rst -source/api/nova.tests.scheduler.test_least_cost_scheduler.rst -source/api/nova.tests.scheduler.test_scheduler.rst -source/api/nova.tests.db.fakes.rst -source/api/nova.tests.test_instance_types.rst -source/api/nova.tests.test_console.rst -source/api/nova.tests.api.test_wsgi.rst -source/api/nova.tests.api.openstack.test_users.rst -source/api/nova.tests.api.openstack.fakes.rst -source/api/nova.tests.api.openstack.common.rst -source/api/nova.tests.api.openstack.test_wsgi.rst -source/api/nova.tests.api.openstack.test_accounts.rst -source/api/nova.tests.api.openstack.test_flavors.rst -source/api/nova.tests.api.openstack.test_extensions.rst -source/api/nova.tests.api.openstack.test_adminapi.rst -source/api/nova.tests.api.openstack.test_versions.rst -source/api/nova.tests.api.openstack.test_image_metadata.rst -source/api/nova.tests.api.openstack.test_auth.rst -source/api/nova.tests.api.openstack.test_servers.rst -source/api/nova.tests.api.openstack.test_zones.rst -source/api/nova.tests.api.openstack.test_images.rst -source/api/nova.tests.api.openstack.test_api.rst -source/api/nova.tests.api.openstack.test_faults.rst -source/api/nova.tests.api.openstack.test_limits.rst -source/api/nova.tests.api.openstack.test_server_metadata.rst -source/api/nova.tests.api.openstack.test_shared_ip_groups.rst -source/api/nova.tests.api.openstack.test_common.rst -source/api/nova.tests.api.openstack.extensions.foxinsocks.rst -source/api/nova.tests.test_xenapi.rst -source/api/nova.tests.hyperv_unittest.rst -source/api/nova.tests.test_test.rst -source/api/nova.tests.test_flat_network.rst -source/api/nova.network.linux_net.rst -source/api/nova.network.api.rst -source/api/nova.network.manager.rst -source/api/nova.network.vmwareapi_net.rst -source/api/nova.network.xenapi_net.rst -source/api/nova.volume.driver.rst -source/api/nova.volume.api.rst -source/api/nova.volume.san.rst -source/api/nova.volume.manager.rst -source/api/nova.virt.images.rst -source/api/nova.virt.driver.rst -source/api/nova.virt.vmwareapi.io_util.rst -source/api/nova.virt.vmwareapi.error_util.rst -source/api/nova.virt.vmwareapi.vmops.rst -source/api/nova.virt.vmwareapi.fake.rst -source/api/nova.virt.vmwareapi.vim.rst -source/api/nova.virt.vmwareapi.read_write_util.rst -source/api/nova.virt.vmwareapi.vmware_images.rst -source/api/nova.virt.vmwareapi.network_utils.rst -source/api/nova.virt.vmwareapi.vim_util.rst -source/api/nova.virt.vmwareapi.vm_util.rst -source/api/nova.virt.xenapi_conn.rst -source/api/nova.virt.fake.rst -source/api/nova.virt.vmwareapi_conn.rst -source/api/nova.virt.connection.rst -source/api/nova.virt.disk.rst -source/api/nova.virt.libvirt.connection.rst -source/api/nova.virt.libvirt.firewall.rst -source/api/nova.virt.libvirt.netutils.rst -source/api/nova.virt.hyperv.rst -source/api/nova.virt.xenapi.vmops.rst -source/api/nova.virt.xenapi.fake.rst -source/api/nova.virt.xenapi.volume_utils.rst -source/api/nova.virt.xenapi.network_utils.rst -source/api/nova.virt.xenapi.vm_utils.rst -source/api/nova.virt.xenapi.volumeops.rst -source/api/nova.exception.rst -source/api/nova.image.fake.rst -source/api/nova.image.local.rst -source/api/nova.image.glance.rst -source/api/nova.image.service.rst -source/api/nova.image.s3.rst -source/api/nova.objectstore.s3server.rst -source/api/nova.ipv6.account_identifier.rst -source/api/nova.ipv6.api.rst -source/api/nova.ipv6.rfc2462.rst -source/api/nova.notifier.no_op_notifier.rst -source/api/nova.notifier.log_notifier.rst -source/api/nova.notifier.rabbit_notifier.rst -source/api/nova.notifier.api.rst -source/api/nova.vcsversion.rst -source/api/nova.compute.instance_types.rst -source/api/nova.compute.power_state.rst -source/api/nova.compute.api.rst -source/api/nova.compute.manager.rst -source/api/nova.compute.monitor.rst -source/api/nova.wsgi.rst -source/api/nova.console.vmrc_manager.rst -source/api/nova.console.fake.rst -source/api/nova.console.vmrc.rst -source/api/nova.console.api.rst -source/api/nova.console.manager.rst -source/api/nova.console.xvp.rst -source/api/nova.version.rst -source/api/nova.utils.rst -source/api/nova.auth.dbdriver.rst -source/api/nova.auth.fakeldap.rst -source/api/nova.auth.ldapdriver.rst -source/api/nova.auth.signer.rst -source/api/nova.auth.manager.rst -source/api/nova.manager.rst -source/api/nova.scheduler.driver.rst -source/api/nova.scheduler.host_filter.rst -source/api/nova.scheduler.zone.rst -source/api/nova.scheduler.simple.rst -source/api/nova.scheduler.zone_aware_scheduler.rst -source/api/nova.scheduler.zone_manager.rst -source/api/nova.scheduler.api.rst -source/api/nova.scheduler.least_cost.rst -source/api/nova.scheduler.manager.rst -source/api/nova.scheduler.chance.rst -source/api/nova.vnc.auth.rst -source/api/nova.vnc.proxy.rst -source/api/nova.db.base.rst -source/api/nova.db.migration.rst -source/api/nova.db.sqlalchemy.session.rst -source/api/nova.db.sqlalchemy.migration.rst -source/api/nova.db.sqlalchemy.migrate_repo.manage.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.018_rename_server_management_url.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.017_make_instance_type_id_an_integer.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.010_add_os_type_to_instances.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.013_add_flavors_to_migrations.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.009_add_instance_migrations.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.002_bexar.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.020_add_snapshot_id_to_volumes.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.016_make_quotas_key_and_value.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.003_add_label_to_networks.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.021_rename_image_ids.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.006_add_provider_data_to_volumes.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.008_add_instance_types.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.019_add_volume_snapshot_support.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.001_austin.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.011_live_migration.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.005_add_instance_metadata.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.004_add_zone_tables.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.012_add_ipv6_flatmanager.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.015_add_auto_assign_to_floating_ips.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.007_add_ipv6_to_fixed_ips.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.014_add_instance_type_id_to_instances.rst -source/api/nova.db.sqlalchemy.api.rst -source/api/nova.db.sqlalchemy.models.rst -source/api/nova.db.api.rst -source/api/nova.twistd.rst -source/api/nova.test.rst -source/api/nova.fakerabbit.rst -source/api/nova.service.rst -source/api/nova.flags.rst -source/api/nova.api.ec2.ec2utils.rst -source/api/nova.api.ec2.metadatarequesthandler.rst -source/api/nova.api.ec2.cloud.rst -source/api/nova.api.ec2.admin.rst -source/api/nova.api.ec2.apirequest.rst -source/api/nova.api.openstack.images.rst -source/api/nova.api.openstack.faults.rst -source/api/nova.api.openstack.shared_ip_groups.rst -source/api/nova.api.openstack.common.rst -source/api/nova.api.openstack.ips.rst -source/api/nova.api.openstack.extensions.rst -source/api/nova.api.openstack.servers.rst -source/api/nova.api.openstack.consoles.rst -source/api/nova.api.openstack.users.rst -source/api/nova.api.openstack.auth.rst -source/api/nova.api.openstack.versions.rst -source/api/nova.api.openstack.zones.rst -source/api/nova.api.openstack.limits.rst -source/api/nova.api.openstack.flavors.rst -source/api/nova.api.openstack.image_metadata.rst -source/api/nova.api.openstack.contrib.volumes.rst -source/api/nova.api.openstack.wsgi.rst -source/api/nova.api.openstack.accounts.rst -source/api/nova.api.openstack.views.images.rst -source/api/nova.api.openstack.views.addresses.rst -source/api/nova.api.openstack.views.servers.rst -source/api/nova.api.openstack.views.versions.rst -source/api/nova.api.openstack.views.limits.rst -source/api/nova.api.openstack.views.flavors.rst -source/api/nova.api.openstack.server_metadata.rst -source/api/nova.api.openstack.backup_schedules.rst -source/api/nova.api.direct.rst -source/api/nova.log.rst -source/api/nova.rpc.rst -source/api/nova.fakememcache.rst -source/api/nova.crypto.rst -source/api/nova.cloudpipe.pipelib.rst -source/api/nova.context.rst -source/api/nova.quota.rst -source/api/nova.tests.test_compute.rst -source/api/nova.tests.test_quota.rst -source/api/nova.tests.test_flags.rst -source/api/nova.tests.test_objectstore.rst -source/api/nova.tests.test_crypto.rst -source/api/nova.tests.runtime_flags.rst -source/api/nova.tests.test_exception.rst -source/api/nova.tests.vmwareapi.db_fakes.rst -source/api/nova.tests.vmwareapi.stubs.rst -source/api/nova.tests.test_host_filter.rst -source/api/nova.tests.test_network.rst -source/api/nova.tests.network.base.rst -source/api/nova.tests.declare_flags.rst -source/api/nova.tests.test_localization.rst -source/api/nova.tests.test_access.rst -source/api/nova.tests.test_libvirt.rst -source/api/nova.tests.image.test_glance.rst -source/api/nova.tests.test_direct.rst -source/api/nova.tests.fake_utils.rst -source/api/nova.tests.integrated.test_login.rst -source/api/nova.tests.integrated.test_extensions.rst -source/api/nova.tests.integrated.integrated_helpers.rst -source/api/nova.tests.integrated.test_servers.rst -source/api/nova.tests.integrated.test_xml.rst -source/api/nova.tests.integrated.api.client.rst -source/api/nova.tests.integrated.test_volumes.rst -source/api/nova.tests.test_rpc.rst -source/api/nova.tests.test_volume.rst -source/api/nova.tests.test_notifier.rst -source/api/nova.tests.fake_flags.rst -source/api/nova.tests.test_log.rst -source/api/nova.tests.test_service.rst -source/api/nova.tests.test_twistd.rst -source/api/nova.tests.test_misc.rst -source/api/nova.tests.test_cloud.rst -source/api/nova.tests.glance.stubs.rst -source/api/nova.tests.test_auth.rst -source/api/nova.tests.test_utils.rst -source/api/nova.tests.test_vmwareapi.rst -source/api/nova.tests.test_vlan_network.rst -source/api/nova.tests.test_zones.rst -source/api/nova.tests.test_middleware.rst -source/api/nova.tests.test_ipv6.rst -source/api/nova.tests.xenapi.stubs.rst -source/api/nova.tests.test_api.rst -source/api/nova.tests.scheduler.test_host_filter.rst -source/api/nova.tests.scheduler.test_zone_aware_scheduler.rst -source/api/nova.tests.scheduler.test_least_cost_scheduler.rst -source/api/nova.tests.scheduler.test_scheduler.rst -source/api/nova.tests.db.fakes.rst -source/api/nova.tests.test_instance_types.rst -source/api/nova.tests.test_console.rst -source/api/nova.tests.api.test_wsgi.rst -source/api/nova.tests.api.openstack.test_users.rst -source/api/nova.tests.api.openstack.fakes.rst -source/api/nova.tests.api.openstack.common.rst -source/api/nova.tests.api.openstack.test_wsgi.rst -source/api/nova.tests.api.openstack.test_accounts.rst -source/api/nova.tests.api.openstack.test_flavors.rst -source/api/nova.tests.api.openstack.test_extensions.rst -source/api/nova.tests.api.openstack.test_adminapi.rst -source/api/nova.tests.api.openstack.test_versions.rst -source/api/nova.tests.api.openstack.test_image_metadata.rst -source/api/nova.tests.api.openstack.test_auth.rst -source/api/nova.tests.api.openstack.test_servers.rst -source/api/nova.tests.api.openstack.test_zones.rst -source/api/nova.tests.api.openstack.test_images.rst -source/api/nova.tests.api.openstack.test_api.rst -source/api/nova.tests.api.openstack.test_faults.rst -source/api/nova.tests.api.openstack.test_limits.rst -source/api/nova.tests.api.openstack.test_server_metadata.rst -source/api/nova.tests.api.openstack.test_shared_ip_groups.rst -source/api/nova.tests.api.openstack.test_common.rst -source/api/nova.tests.api.openstack.extensions.foxinsocks.rst -source/api/nova.tests.test_xenapi.rst -source/api/nova.tests.hyperv_unittest.rst -source/api/nova.tests.test_test.rst -source/api/nova.tests.test_flat_network.rst -source/api/nova.network.linux_net.rst -source/api/nova.network.api.rst -source/api/nova.network.manager.rst -source/api/nova.network.vmwareapi_net.rst -source/api/nova.network.xenapi_net.rst -source/api/nova.volume.driver.rst -source/api/nova.volume.api.rst -source/api/nova.volume.san.rst -source/api/nova.volume.manager.rst -source/api/nova.virt.images.rst -source/api/nova.virt.driver.rst -source/api/nova.virt.vmwareapi.io_util.rst -source/api/nova.virt.vmwareapi.error_util.rst -source/api/nova.virt.vmwareapi.vmops.rst -source/api/nova.virt.vmwareapi.fake.rst -source/api/nova.virt.vmwareapi.vim.rst -source/api/nova.virt.vmwareapi.read_write_util.rst -source/api/nova.virt.vmwareapi.vmware_images.rst -source/api/nova.virt.vmwareapi.network_utils.rst -source/api/nova.virt.vmwareapi.vim_util.rst -source/api/nova.virt.vmwareapi.vm_util.rst -source/api/nova.virt.xenapi_conn.rst -source/api/nova.virt.fake.rst -source/api/nova.virt.vmwareapi_conn.rst -source/api/nova.virt.connection.rst -source/api/nova.virt.disk.rst -source/api/nova.virt.libvirt.connection.rst -source/api/nova.virt.libvirt.firewall.rst -source/api/nova.virt.libvirt.netutils.rst -source/api/nova.virt.hyperv.rst -source/api/nova.virt.xenapi.vmops.rst -source/api/nova.virt.xenapi.fake.rst -source/api/nova.virt.xenapi.volume_utils.rst -source/api/nova.virt.xenapi.network_utils.rst -source/api/nova.virt.xenapi.vm_utils.rst -source/api/nova.virt.xenapi.volumeops.rst -source/api/nova.exception.rst -source/api/nova.image.fake.rst -source/api/nova.image.local.rst -source/api/nova.image.glance.rst -source/api/nova.image.service.rst -source/api/nova.image.s3.rst -source/api/nova.objectstore.s3server.rst -source/api/nova.ipv6.account_identifier.rst -source/api/nova.ipv6.api.rst -source/api/nova.ipv6.rfc2462.rst -source/api/nova.notifier.no_op_notifier.rst -source/api/nova.notifier.log_notifier.rst -source/api/nova.notifier.rabbit_notifier.rst -source/api/nova.notifier.api.rst -source/api/nova.vcsversion.rst -source/api/nova.compute.instance_types.rst -source/api/nova.compute.power_state.rst -source/api/nova.compute.api.rst -source/api/nova.compute.manager.rst -source/api/nova.compute.monitor.rst -source/api/nova.wsgi.rst -source/api/nova.console.vmrc_manager.rst -source/api/nova.console.fake.rst -source/api/nova.console.vmrc.rst -source/api/nova.console.api.rst -source/api/nova.console.manager.rst -source/api/nova.console.xvp.rst -source/api/nova.version.rst -source/api/nova.utils.rst -source/api/nova.auth.dbdriver.rst -source/api/nova.auth.fakeldap.rst -source/api/nova.auth.ldapdriver.rst -source/api/nova.auth.signer.rst -source/api/nova.auth.manager.rst -source/api/nova.manager.rst -source/api/nova.scheduler.driver.rst -source/api/nova.scheduler.host_filter.rst -source/api/nova.scheduler.zone.rst -source/api/nova.scheduler.simple.rst -source/api/nova.scheduler.zone_aware_scheduler.rst -source/api/nova.scheduler.zone_manager.rst -source/api/nova.scheduler.api.rst -source/api/nova.scheduler.least_cost.rst -source/api/nova.scheduler.manager.rst -source/api/nova.scheduler.chance.rst -source/api/nova.vnc.auth.rst -source/api/nova.vnc.proxy.rst -source/api/nova.db.base.rst -source/api/nova.db.migration.rst -source/api/nova.db.sqlalchemy.session.rst -source/api/nova.db.sqlalchemy.migration.rst -source/api/nova.db.sqlalchemy.migrate_repo.manage.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.018_rename_server_management_url.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.017_make_instance_type_id_an_integer.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.010_add_os_type_to_instances.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.013_add_flavors_to_migrations.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.009_add_instance_migrations.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.002_bexar.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.020_add_snapshot_id_to_volumes.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.016_make_quotas_key_and_value.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.003_add_label_to_networks.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.021_rename_image_ids.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.006_add_provider_data_to_volumes.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.008_add_instance_types.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.019_add_volume_snapshot_support.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.001_austin.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.011_live_migration.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.005_add_instance_metadata.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.004_add_zone_tables.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.012_add_ipv6_flatmanager.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.015_add_auto_assign_to_floating_ips.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.007_add_ipv6_to_fixed_ips.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.014_add_instance_type_id_to_instances.rst -source/api/nova.db.sqlalchemy.api.rst -source/api/nova.db.sqlalchemy.models.rst -source/api/nova.db.api.rst -source/api/nova.twistd.rst -source/api/nova.test.rst -source/api/nova.fakerabbit.rst -source/api/nova.service.rst -source/api/nova.flags.rst -source/api/nova.api.ec2.ec2utils.rst -source/api/nova.api.ec2.metadatarequesthandler.rst -source/api/nova.api.ec2.cloud.rst -source/api/nova.api.ec2.admin.rst -source/api/nova.api.ec2.apirequest.rst -source/api/nova.api.openstack.images.rst -source/api/nova.api.openstack.faults.rst -source/api/nova.api.openstack.shared_ip_groups.rst -source/api/nova.api.openstack.common.rst -source/api/nova.api.openstack.ips.rst -source/api/nova.api.openstack.extensions.rst -source/api/nova.api.openstack.servers.rst -source/api/nova.api.openstack.consoles.rst -source/api/nova.api.openstack.users.rst -source/api/nova.api.openstack.auth.rst -source/api/nova.api.openstack.versions.rst -source/api/nova.api.openstack.zones.rst -source/api/nova.api.openstack.limits.rst -source/api/nova.api.openstack.flavors.rst -source/api/nova.api.openstack.image_metadata.rst -source/api/nova.api.openstack.contrib.volumes.rst -source/api/nova.api.openstack.wsgi.rst -source/api/nova.api.openstack.accounts.rst -source/api/nova.api.openstack.views.images.rst -source/api/nova.api.openstack.views.addresses.rst -source/api/nova.api.openstack.views.servers.rst -source/api/nova.api.openstack.views.versions.rst -source/api/nova.api.openstack.views.limits.rst -source/api/nova.api.openstack.views.flavors.rst -source/api/nova.api.openstack.server_metadata.rst -source/api/nova.api.openstack.backup_schedules.rst -source/api/nova.api.direct.rst -source/api/nova.log.rst -source/api/nova.rpc.rst -source/api/nova.fakememcache.rst -source/api/nova.crypto.rst -source/api/nova.cloudpipe.pipelib.rst -source/api/nova.context.rst -source/api/nova.quota.rst -source/api/nova.tests.test_compute.rst -source/api/nova.tests.test_quota.rst -source/api/nova.tests.test_flags.rst -source/api/nova.tests.test_objectstore.rst -source/api/nova.tests.test_crypto.rst -source/api/nova.tests.runtime_flags.rst -source/api/nova.tests.test_exception.rst -source/api/nova.tests.vmwareapi.db_fakes.rst -source/api/nova.tests.vmwareapi.stubs.rst -source/api/nova.tests.test_host_filter.rst -source/api/nova.tests.test_network.rst -source/api/nova.tests.network.base.rst -source/api/nova.tests.declare_flags.rst -source/api/nova.tests.test_localization.rst -source/api/nova.tests.test_access.rst -source/api/nova.tests.test_libvirt.rst -source/api/nova.tests.image.test_glance.rst -source/api/nova.tests.test_direct.rst -source/api/nova.tests.fake_utils.rst -source/api/nova.tests.integrated.test_login.rst -source/api/nova.tests.integrated.test_extensions.rst -source/api/nova.tests.integrated.integrated_helpers.rst -source/api/nova.tests.integrated.test_servers.rst -source/api/nova.tests.integrated.test_xml.rst -source/api/nova.tests.integrated.api.client.rst -source/api/nova.tests.integrated.test_volumes.rst -source/api/nova.tests.test_rpc.rst -source/api/nova.tests.test_volume.rst -source/api/nova.tests.test_notifier.rst -source/api/nova.tests.fake_flags.rst -source/api/nova.tests.test_log.rst -source/api/nova.tests.test_service.rst -source/api/nova.tests.test_twistd.rst -source/api/nova.tests.test_misc.rst -source/api/nova.tests.test_cloud.rst -source/api/nova.tests.glance.stubs.rst -source/api/nova.tests.test_auth.rst -source/api/nova.tests.test_utils.rst -source/api/nova.tests.test_vmwareapi.rst -source/api/nova.tests.test_vlan_network.rst -source/api/nova.tests.test_zones.rst -source/api/nova.tests.test_middleware.rst -source/api/nova.tests.test_ipv6.rst -source/api/nova.tests.xenapi.stubs.rst -source/api/nova.tests.test_api.rst -source/api/nova.tests.scheduler.test_host_filter.rst -source/api/nova.tests.scheduler.test_zone_aware_scheduler.rst -source/api/nova.tests.scheduler.test_least_cost_scheduler.rst -source/api/nova.tests.scheduler.test_scheduler.rst -source/api/nova.tests.db.fakes.rst -source/api/nova.tests.test_instance_types.rst -source/api/nova.tests.test_console.rst -source/api/nova.tests.api.test_wsgi.rst -source/api/nova.tests.api.openstack.test_users.rst -source/api/nova.tests.api.openstack.fakes.rst -source/api/nova.tests.api.openstack.common.rst -source/api/nova.tests.api.openstack.test_wsgi.rst -source/api/nova.tests.api.openstack.test_accounts.rst -source/api/nova.tests.api.openstack.test_flavors.rst -source/api/nova.tests.api.openstack.test_extensions.rst -source/api/nova.tests.api.openstack.test_adminapi.rst -source/api/nova.tests.api.openstack.test_versions.rst -source/api/nova.tests.api.openstack.test_image_metadata.rst -source/api/nova.tests.api.openstack.test_auth.rst -source/api/nova.tests.api.openstack.test_servers.rst -source/api/nova.tests.api.openstack.test_zones.rst -source/api/nova.tests.api.openstack.test_images.rst -source/api/nova.tests.api.openstack.test_api.rst -source/api/nova.tests.api.openstack.test_faults.rst -source/api/nova.tests.api.openstack.test_limits.rst -source/api/nova.tests.api.openstack.test_server_metadata.rst -source/api/nova.tests.api.openstack.test_shared_ip_groups.rst -source/api/nova.tests.api.openstack.test_common.rst -source/api/nova.tests.api.openstack.extensions.foxinsocks.rst -source/api/nova.tests.test_xenapi.rst -source/api/nova.tests.hyperv_unittest.rst -source/api/nova.tests.test_test.rst -source/api/nova.tests.test_flat_network.rst -source/api/nova.network.linux_net.rst -source/api/nova.network.api.rst -source/api/nova.network.manager.rst -source/api/nova.network.vmwareapi_net.rst -source/api/nova.network.xenapi_net.rst -source/api/nova.volume.driver.rst -source/api/nova.volume.api.rst -source/api/nova.volume.san.rst -source/api/nova.volume.manager.rst -source/api/nova.virt.images.rst -source/api/nova.virt.driver.rst -source/api/nova.virt.vmwareapi.io_util.rst -source/api/nova.virt.vmwareapi.error_util.rst -source/api/nova.virt.vmwareapi.vmops.rst -source/api/nova.virt.vmwareapi.fake.rst -source/api/nova.virt.vmwareapi.vim.rst -source/api/nova.virt.vmwareapi.read_write_util.rst -source/api/nova.virt.vmwareapi.vmware_images.rst -source/api/nova.virt.vmwareapi.network_utils.rst -source/api/nova.virt.vmwareapi.vim_util.rst -source/api/nova.virt.vmwareapi.vm_util.rst -source/api/nova.virt.xenapi_conn.rst -source/api/nova.virt.fake.rst -source/api/nova.virt.vmwareapi_conn.rst -source/api/nova.virt.connection.rst -source/api/nova.virt.disk.rst -source/api/nova.virt.libvirt.connection.rst -source/api/nova.virt.libvirt.firewall.rst -source/api/nova.virt.libvirt.netutils.rst -source/api/nova.virt.hyperv.rst -source/api/nova.virt.xenapi.vmops.rst -source/api/nova.virt.xenapi.fake.rst -source/api/nova.virt.xenapi.volume_utils.rst -source/api/nova.virt.xenapi.network_utils.rst -source/api/nova.virt.xenapi.vm_utils.rst -source/api/nova.virt.xenapi.volumeops.rst -source/api/nova.exception.rst -source/api/nova.image.fake.rst -source/api/nova.image.local.rst -source/api/nova.image.glance.rst -source/api/nova.image.service.rst -source/api/nova.image.s3.rst -source/api/nova.objectstore.s3server.rst -source/api/nova.ipv6.account_identifier.rst -source/api/nova.ipv6.api.rst -source/api/nova.ipv6.rfc2462.rst -source/api/nova.notifier.no_op_notifier.rst -source/api/nova.notifier.log_notifier.rst -source/api/nova.notifier.rabbit_notifier.rst -source/api/nova.notifier.api.rst -source/api/nova.vcsversion.rst -source/api/nova.compute.instance_types.rst -source/api/nova.compute.power_state.rst -source/api/nova.compute.api.rst -source/api/nova.compute.manager.rst -source/api/nova.compute.monitor.rst -source/api/nova.wsgi.rst -source/api/nova.console.vmrc_manager.rst -source/api/nova.console.fake.rst -source/api/nova.console.vmrc.rst -source/api/nova.console.api.rst -source/api/nova.console.manager.rst -source/api/nova.console.xvp.rst -source/api/nova.version.rst -source/api/nova.utils.rst -source/api/nova.auth.dbdriver.rst -source/api/nova.auth.fakeldap.rst -source/api/nova.auth.ldapdriver.rst -source/api/nova.auth.signer.rst -source/api/nova.auth.manager.rst -source/api/nova.manager.rst -source/api/nova.scheduler.driver.rst -source/api/nova.scheduler.host_filter.rst -source/api/nova.scheduler.zone.rst -source/api/nova.scheduler.simple.rst -source/api/nova.scheduler.zone_aware_scheduler.rst -source/api/nova.scheduler.zone_manager.rst -source/api/nova.scheduler.api.rst -source/api/nova.scheduler.least_cost.rst -source/api/nova.scheduler.manager.rst -source/api/nova.scheduler.chance.rst -source/api/nova.vnc.auth.rst -source/api/nova.vnc.proxy.rst -source/api/nova.db.base.rst -source/api/nova.db.migration.rst -source/api/nova.db.sqlalchemy.session.rst -source/api/nova.db.sqlalchemy.migration.rst -source/api/nova.db.sqlalchemy.migrate_repo.manage.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.018_rename_server_management_url.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.017_make_instance_type_id_an_integer.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.010_add_os_type_to_instances.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.013_add_flavors_to_migrations.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.009_add_instance_migrations.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.002_bexar.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.020_add_snapshot_id_to_volumes.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.016_make_quotas_key_and_value.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.003_add_label_to_networks.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.021_rename_image_ids.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.006_add_provider_data_to_volumes.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.008_add_instance_types.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.019_add_volume_snapshot_support.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.001_austin.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.011_live_migration.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.005_add_instance_metadata.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.004_add_zone_tables.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.012_add_ipv6_flatmanager.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.015_add_auto_assign_to_floating_ips.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.007_add_ipv6_to_fixed_ips.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.014_add_instance_type_id_to_instances.rst -source/api/nova.db.sqlalchemy.api.rst -source/api/nova.db.sqlalchemy.models.rst -source/api/nova.db.api.rst -source/api/nova.twistd.rst -source/api/nova.test.rst -source/api/nova.fakerabbit.rst -source/api/nova.service.rst -source/api/nova.flags.rst -source/api/nova.api.ec2.ec2utils.rst -source/api/nova.api.ec2.metadatarequesthandler.rst -source/api/nova.api.ec2.cloud.rst -source/api/nova.api.ec2.admin.rst -source/api/nova.api.ec2.apirequest.rst -source/api/nova.api.openstack.images.rst -source/api/nova.api.openstack.faults.rst -source/api/nova.api.openstack.shared_ip_groups.rst -source/api/nova.api.openstack.common.rst -source/api/nova.api.openstack.ips.rst -source/api/nova.api.openstack.extensions.rst -source/api/nova.api.openstack.servers.rst -source/api/nova.api.openstack.consoles.rst -source/api/nova.api.openstack.users.rst -source/api/nova.api.openstack.auth.rst -source/api/nova.api.openstack.versions.rst -source/api/nova.api.openstack.zones.rst -source/api/nova.api.openstack.limits.rst -source/api/nova.api.openstack.flavors.rst -source/api/nova.api.openstack.image_metadata.rst -source/api/nova.api.openstack.contrib.volumes.rst -source/api/nova.api.openstack.wsgi.rst -source/api/nova.api.openstack.accounts.rst -source/api/nova.api.openstack.views.images.rst -source/api/nova.api.openstack.views.addresses.rst -source/api/nova.api.openstack.views.servers.rst -source/api/nova.api.openstack.views.versions.rst -source/api/nova.api.openstack.views.limits.rst -source/api/nova.api.openstack.views.flavors.rst -source/api/nova.api.openstack.server_metadata.rst -source/api/nova.api.openstack.backup_schedules.rst -source/api/nova.api.direct.rst -source/api/nova.log.rst -source/api/nova.rpc.rst -source/api/nova.fakememcache.rst -source/api/nova.crypto.rst -source/api/nova.cloudpipe.pipelib.rst -source/api/nova.context.rst -source/api/nova.quota.rst -source/api/nova.tests.test_compute.rst -source/api/nova.tests.test_quota.rst -source/api/nova.tests.test_flags.rst -source/api/nova.tests.test_objectstore.rst -source/api/nova.tests.test_crypto.rst -source/api/nova.tests.runtime_flags.rst -source/api/nova.tests.test_exception.rst -source/api/nova.tests.vmwareapi.db_fakes.rst -source/api/nova.tests.vmwareapi.stubs.rst -source/api/nova.tests.test_host_filter.rst -source/api/nova.tests.test_network.rst -source/api/nova.tests.network.base.rst -source/api/nova.tests.declare_flags.rst -source/api/nova.tests.test_localization.rst -source/api/nova.tests.test_access.rst -source/api/nova.tests.test_libvirt.rst -source/api/nova.tests.image.test_glance.rst -source/api/nova.tests.test_direct.rst -source/api/nova.tests.fake_utils.rst -source/api/nova.tests.integrated.test_login.rst -source/api/nova.tests.integrated.test_extensions.rst -source/api/nova.tests.integrated.integrated_helpers.rst -source/api/nova.tests.integrated.test_servers.rst -source/api/nova.tests.integrated.test_xml.rst -source/api/nova.tests.integrated.api.client.rst -source/api/nova.tests.integrated.test_volumes.rst -source/api/nova.tests.test_rpc.rst -source/api/nova.tests.test_volume.rst -source/api/nova.tests.test_notifier.rst -source/api/nova.tests.fake_flags.rst -source/api/nova.tests.test_log.rst -source/api/nova.tests.test_service.rst -source/api/nova.tests.test_twistd.rst -source/api/nova.tests.test_misc.rst -source/api/nova.tests.test_cloud.rst -source/api/nova.tests.glance.stubs.rst -source/api/nova.tests.test_auth.rst -source/api/nova.tests.test_utils.rst -source/api/nova.tests.test_vmwareapi.rst -source/api/nova.tests.test_vlan_network.rst -source/api/nova.tests.test_zones.rst -source/api/nova.tests.test_middleware.rst -source/api/nova.tests.test_ipv6.rst -source/api/nova.tests.xenapi.stubs.rst -source/api/nova.tests.test_api.rst -source/api/nova.tests.scheduler.test_host_filter.rst -source/api/nova.tests.scheduler.test_zone_aware_scheduler.rst -source/api/nova.tests.scheduler.test_least_cost_scheduler.rst -source/api/nova.tests.scheduler.test_scheduler.rst -source/api/nova.tests.db.fakes.rst -source/api/nova.tests.test_instance_types.rst -source/api/nova.tests.test_console.rst -source/api/nova.tests.api.test_wsgi.rst -source/api/nova.tests.api.openstack.test_users.rst -source/api/nova.tests.api.openstack.fakes.rst -source/api/nova.tests.api.openstack.common.rst -source/api/nova.tests.api.openstack.test_wsgi.rst -source/api/nova.tests.api.openstack.test_accounts.rst -source/api/nova.tests.api.openstack.test_flavors.rst -source/api/nova.tests.api.openstack.test_extensions.rst -source/api/nova.tests.api.openstack.test_adminapi.rst -source/api/nova.tests.api.openstack.test_versions.rst -source/api/nova.tests.api.openstack.test_image_metadata.rst -source/api/nova.tests.api.openstack.test_auth.rst -source/api/nova.tests.api.openstack.test_servers.rst -source/api/nova.tests.api.openstack.test_zones.rst -source/api/nova.tests.api.openstack.test_images.rst -source/api/nova.tests.api.openstack.test_api.rst -source/api/nova.tests.api.openstack.test_faults.rst -source/api/nova.tests.api.openstack.test_limits.rst -source/api/nova.tests.api.openstack.test_server_metadata.rst -source/api/nova.tests.api.openstack.test_shared_ip_groups.rst -source/api/nova.tests.api.openstack.test_common.rst -source/api/nova.tests.api.openstack.extensions.foxinsocks.rst -source/api/nova.tests.test_xenapi.rst -source/api/nova.tests.hyperv_unittest.rst -source/api/nova.tests.test_test.rst -source/api/nova.tests.test_flat_network.rst -source/api/nova.network.linux_net.rst -source/api/nova.network.api.rst -source/api/nova.network.manager.rst -source/api/nova.network.vmwareapi_net.rst -source/api/nova.network.xenapi_net.rst -source/api/nova.volume.driver.rst -source/api/nova.volume.api.rst -source/api/nova.volume.san.rst -source/api/nova.volume.manager.rst -source/api/nova.virt.images.rst -source/api/nova.virt.driver.rst -source/api/nova.virt.vmwareapi.io_util.rst -source/api/nova.virt.vmwareapi.error_util.rst -source/api/nova.virt.vmwareapi.vmops.rst -source/api/nova.virt.vmwareapi.fake.rst -source/api/nova.virt.vmwareapi.vim.rst -source/api/nova.virt.vmwareapi.read_write_util.rst -source/api/nova.virt.vmwareapi.vmware_images.rst -source/api/nova.virt.vmwareapi.network_utils.rst -source/api/nova.virt.vmwareapi.vim_util.rst -source/api/nova.virt.vmwareapi.vm_util.rst -source/api/nova.virt.xenapi_conn.rst -source/api/nova.virt.fake.rst -source/api/nova.virt.vmwareapi_conn.rst -source/api/nova.virt.connection.rst -source/api/nova.virt.disk.rst -source/api/nova.virt.libvirt.connection.rst -source/api/nova.virt.libvirt.firewall.rst -source/api/nova.virt.libvirt.netutils.rst -source/api/nova.virt.hyperv.rst -source/api/nova.virt.xenapi.vmops.rst -source/api/nova.virt.xenapi.fake.rst -source/api/nova.virt.xenapi.volume_utils.rst -source/api/nova.virt.xenapi.network_utils.rst -source/api/nova.virt.xenapi.vm_utils.rst -source/api/nova.virt.xenapi.volumeops.rst -source/api/nova.exception.rst -source/api/nova.image.fake.rst -source/api/nova.image.local.rst -source/api/nova.image.glance.rst -source/api/nova.image.service.rst -source/api/nova.image.s3.rst -source/api/nova.objectstore.s3server.rst -source/api/nova.ipv6.account_identifier.rst -source/api/nova.ipv6.api.rst -source/api/nova.ipv6.rfc2462.rst -source/api/nova.notifier.no_op_notifier.rst -source/api/nova.notifier.log_notifier.rst -source/api/nova.notifier.rabbit_notifier.rst -source/api/nova.notifier.api.rst -source/api/nova.vcsversion.rst -source/api/nova.compute.instance_types.rst -source/api/nova.compute.power_state.rst -source/api/nova.compute.api.rst -source/api/nova.compute.manager.rst -source/api/nova.compute.monitor.rst -source/api/nova.wsgi.rst -source/api/nova.console.vmrc_manager.rst -source/api/nova.console.fake.rst -source/api/nova.console.vmrc.rst -source/api/nova.console.api.rst -source/api/nova.console.manager.rst -source/api/nova.console.xvp.rst -source/api/nova.version.rst -source/api/nova.utils.rst -source/api/nova.auth.dbdriver.rst -source/api/nova.auth.fakeldap.rst -source/api/nova.auth.ldapdriver.rst -source/api/nova.auth.signer.rst -source/api/nova.auth.manager.rst -source/api/nova.manager.rst -source/api/nova.scheduler.driver.rst -source/api/nova.scheduler.host_filter.rst -source/api/nova.scheduler.zone.rst -source/api/nova.scheduler.simple.rst -source/api/nova.scheduler.zone_aware_scheduler.rst -source/api/nova.scheduler.zone_manager.rst -source/api/nova.scheduler.api.rst -source/api/nova.scheduler.least_cost.rst -source/api/nova.scheduler.manager.rst -source/api/nova.scheduler.chance.rst -source/api/nova.vnc.auth.rst -source/api/nova.vnc.proxy.rst -source/api/nova.db.base.rst -source/api/nova.db.migration.rst -source/api/nova.db.sqlalchemy.session.rst -source/api/nova.db.sqlalchemy.migration.rst -source/api/nova.db.sqlalchemy.migrate_repo.manage.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.018_rename_server_management_url.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.017_make_instance_type_id_an_integer.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.010_add_os_type_to_instances.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.013_add_flavors_to_migrations.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.009_add_instance_migrations.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.002_bexar.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.020_add_snapshot_id_to_volumes.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.016_make_quotas_key_and_value.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.003_add_label_to_networks.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.021_rename_image_ids.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.006_add_provider_data_to_volumes.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.008_add_instance_types.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.019_add_volume_snapshot_support.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.001_austin.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.011_live_migration.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.005_add_instance_metadata.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.004_add_zone_tables.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.012_add_ipv6_flatmanager.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.015_add_auto_assign_to_floating_ips.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.007_add_ipv6_to_fixed_ips.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.014_add_instance_type_id_to_instances.rst -source/api/nova.db.sqlalchemy.api.rst -source/api/nova.db.sqlalchemy.models.rst -source/api/nova.db.api.rst -source/api/nova.twistd.rst -source/api/nova.test.rst -source/api/nova.fakerabbit.rst -source/api/nova.service.rst -source/api/nova.flags.rst -source/api/nova.api.ec2.ec2utils.rst -source/api/nova.api.ec2.metadatarequesthandler.rst -source/api/nova.api.ec2.cloud.rst -source/api/nova.api.ec2.admin.rst -source/api/nova.api.ec2.apirequest.rst -source/api/nova.api.openstack.images.rst -source/api/nova.api.openstack.faults.rst -source/api/nova.api.openstack.shared_ip_groups.rst -source/api/nova.api.openstack.common.rst -source/api/nova.api.openstack.ips.rst -source/api/nova.api.openstack.extensions.rst -source/api/nova.api.openstack.servers.rst -source/api/nova.api.openstack.consoles.rst -source/api/nova.api.openstack.users.rst -source/api/nova.api.openstack.auth.rst -source/api/nova.api.openstack.versions.rst -source/api/nova.api.openstack.zones.rst -source/api/nova.api.openstack.limits.rst -source/api/nova.api.openstack.flavors.rst -source/api/nova.api.openstack.image_metadata.rst -source/api/nova.api.openstack.contrib.volumes.rst -source/api/nova.api.openstack.wsgi.rst -source/api/nova.api.openstack.accounts.rst -source/api/nova.api.openstack.views.images.rst -source/api/nova.api.openstack.views.addresses.rst -source/api/nova.api.openstack.views.servers.rst -source/api/nova.api.openstack.views.versions.rst -source/api/nova.api.openstack.views.limits.rst -source/api/nova.api.openstack.views.flavors.rst -source/api/nova.api.openstack.server_metadata.rst -source/api/nova.api.openstack.backup_schedules.rst -source/api/nova.api.direct.rst -source/api/nova.log.rst -source/api/nova.rpc.rst -source/api/nova.fakememcache.rst -source/api/nova.crypto.rst -source/api/nova.cloudpipe.pipelib.rst -source/api/nova.context.rst -source/api/nova.quota.rst -source/api/nova.tests.test_compute.rst -source/api/nova.tests.test_quota.rst -source/api/nova.tests.test_flags.rst -source/api/nova.tests.test_objectstore.rst -source/api/nova.tests.test_crypto.rst -source/api/nova.tests.runtime_flags.rst -source/api/nova.tests.test_exception.rst -source/api/nova.tests.vmwareapi.db_fakes.rst -source/api/nova.tests.vmwareapi.stubs.rst -source/api/nova.tests.test_host_filter.rst -source/api/nova.tests.test_network.rst -source/api/nova.tests.network.base.rst -source/api/nova.tests.declare_flags.rst -source/api/nova.tests.test_localization.rst -source/api/nova.tests.test_access.rst -source/api/nova.tests.test_libvirt.rst -source/api/nova.tests.image.test_glance.rst -source/api/nova.tests.test_direct.rst -source/api/nova.tests.fake_utils.rst -source/api/nova.tests.integrated.test_login.rst -source/api/nova.tests.integrated.test_extensions.rst -source/api/nova.tests.integrated.integrated_helpers.rst -source/api/nova.tests.integrated.test_servers.rst -source/api/nova.tests.integrated.test_xml.rst -source/api/nova.tests.integrated.api.client.rst -source/api/nova.tests.integrated.test_volumes.rst -source/api/nova.tests.test_rpc.rst -source/api/nova.tests.test_volume.rst -source/api/nova.tests.test_notifier.rst -source/api/nova.tests.fake_flags.rst -source/api/nova.tests.test_log.rst -source/api/nova.tests.test_service.rst -source/api/nova.tests.test_twistd.rst -source/api/nova.tests.test_misc.rst -source/api/nova.tests.test_cloud.rst -source/api/nova.tests.glance.stubs.rst -source/api/nova.tests.test_auth.rst -source/api/nova.tests.test_utils.rst -source/api/nova.tests.test_vmwareapi.rst -source/api/nova.tests.test_vlan_network.rst -source/api/nova.tests.test_zones.rst -source/api/nova.tests.test_middleware.rst -source/api/nova.tests.test_ipv6.rst -source/api/nova.tests.xenapi.stubs.rst -source/api/nova.tests.test_api.rst -source/api/nova.tests.scheduler.test_host_filter.rst -source/api/nova.tests.scheduler.test_zone_aware_scheduler.rst -source/api/nova.tests.scheduler.test_least_cost_scheduler.rst -source/api/nova.tests.scheduler.test_scheduler.rst -source/api/nova.tests.db.fakes.rst -source/api/nova.tests.test_instance_types.rst -source/api/nova.tests.test_console.rst -source/api/nova.tests.api.test_wsgi.rst -source/api/nova.tests.api.openstack.test_users.rst -source/api/nova.tests.api.openstack.fakes.rst -source/api/nova.tests.api.openstack.common.rst -source/api/nova.tests.api.openstack.test_wsgi.rst -source/api/nova.tests.api.openstack.test_accounts.rst -source/api/nova.tests.api.openstack.test_flavors.rst -source/api/nova.tests.api.openstack.test_extensions.rst -source/api/nova.tests.api.openstack.test_adminapi.rst -source/api/nova.tests.api.openstack.test_versions.rst -source/api/nova.tests.api.openstack.test_image_metadata.rst -source/api/nova.tests.api.openstack.test_auth.rst -source/api/nova.tests.api.openstack.test_servers.rst -source/api/nova.tests.api.openstack.test_zones.rst -source/api/nova.tests.api.openstack.test_images.rst -source/api/nova.tests.api.openstack.test_api.rst -source/api/nova.tests.api.openstack.test_faults.rst -source/api/nova.tests.api.openstack.test_limits.rst -source/api/nova.tests.api.openstack.test_server_metadata.rst -source/api/nova.tests.api.openstack.test_shared_ip_groups.rst -source/api/nova.tests.api.openstack.test_common.rst -source/api/nova.tests.api.openstack.extensions.foxinsocks.rst -source/api/nova.tests.test_xenapi.rst -source/api/nova.tests.hyperv_unittest.rst -source/api/nova.tests.test_test.rst -source/api/nova.tests.test_flat_network.rst -source/api/nova.network.linux_net.rst -source/api/nova.network.api.rst -source/api/nova.network.manager.rst -source/api/nova.network.vmwareapi_net.rst -source/api/nova.network.xenapi_net.rst -source/api/nova.volume.driver.rst -source/api/nova.volume.api.rst -source/api/nova.volume.san.rst -source/api/nova.volume.manager.rst -source/api/nova.virt.images.rst -source/api/nova.virt.driver.rst -source/api/nova.virt.vmwareapi.io_util.rst -source/api/nova.virt.vmwareapi.error_util.rst -source/api/nova.virt.vmwareapi.vmops.rst -source/api/nova.virt.vmwareapi.fake.rst -source/api/nova.virt.vmwareapi.vim.rst -source/api/nova.virt.vmwareapi.read_write_util.rst -source/api/nova.virt.vmwareapi.vmware_images.rst -source/api/nova.virt.vmwareapi.network_utils.rst -source/api/nova.virt.vmwareapi.vim_util.rst -source/api/nova.virt.vmwareapi.vm_util.rst -source/api/nova.virt.xenapi_conn.rst -source/api/nova.virt.fake.rst -source/api/nova.virt.vmwareapi_conn.rst -source/api/nova.virt.connection.rst -source/api/nova.virt.disk.rst -source/api/nova.virt.libvirt.connection.rst -source/api/nova.virt.libvirt.firewall.rst -source/api/nova.virt.libvirt.netutils.rst -source/api/nova.virt.hyperv.rst -source/api/nova.virt.xenapi.vmops.rst -source/api/nova.virt.xenapi.fake.rst -source/api/nova.virt.xenapi.volume_utils.rst -source/api/nova.virt.xenapi.network_utils.rst -source/api/nova.virt.xenapi.vm_utils.rst -source/api/nova.virt.xenapi.volumeops.rst -source/api/nova.exception.rst -source/api/nova.image.fake.rst -source/api/nova.image.local.rst -source/api/nova.image.glance.rst -source/api/nova.image.service.rst -source/api/nova.image.s3.rst -source/api/nova.objectstore.s3server.rst -source/api/nova.ipv6.account_identifier.rst -source/api/nova.ipv6.api.rst -source/api/nova.ipv6.rfc2462.rst -source/api/nova.notifier.no_op_notifier.rst -source/api/nova.notifier.log_notifier.rst -source/api/nova.notifier.rabbit_notifier.rst -source/api/nova.notifier.api.rst -source/api/nova.vcsversion.rst -source/api/nova.compute.instance_types.rst -source/api/nova.compute.power_state.rst -source/api/nova.compute.api.rst -source/api/nova.compute.manager.rst -source/api/nova.compute.monitor.rst -source/api/nova.wsgi.rst -source/api/nova.console.vmrc_manager.rst -source/api/nova.console.fake.rst -source/api/nova.console.vmrc.rst -source/api/nova.console.api.rst -source/api/nova.console.manager.rst -source/api/nova.console.xvp.rst -source/api/nova.version.rst -source/api/nova.utils.rst -source/api/nova.auth.dbdriver.rst -source/api/nova.auth.fakeldap.rst -source/api/nova.auth.ldapdriver.rst -source/api/nova.auth.signer.rst -source/api/nova.auth.manager.rst -source/api/nova.manager.rst -source/api/nova.scheduler.driver.rst -source/api/nova.scheduler.host_filter.rst -source/api/nova.scheduler.zone.rst -source/api/nova.scheduler.simple.rst -source/api/nova.scheduler.zone_aware_scheduler.rst -source/api/nova.scheduler.zone_manager.rst -source/api/nova.scheduler.api.rst -source/api/nova.scheduler.least_cost.rst -source/api/nova.scheduler.manager.rst -source/api/nova.scheduler.chance.rst -source/api/nova.vnc.auth.rst -source/api/nova.vnc.proxy.rst -source/api/nova.db.base.rst -source/api/nova.db.migration.rst -source/api/nova.db.sqlalchemy.session.rst -source/api/nova.db.sqlalchemy.migration.rst -source/api/nova.db.sqlalchemy.migrate_repo.manage.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.018_rename_server_management_url.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.017_make_instance_type_id_an_integer.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.010_add_os_type_to_instances.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.013_add_flavors_to_migrations.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.009_add_instance_migrations.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.002_bexar.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.020_add_snapshot_id_to_volumes.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.016_make_quotas_key_and_value.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.003_add_label_to_networks.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.021_rename_image_ids.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.006_add_provider_data_to_volumes.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.008_add_instance_types.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.019_add_volume_snapshot_support.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.001_austin.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.011_live_migration.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.005_add_instance_metadata.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.004_add_zone_tables.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.012_add_ipv6_flatmanager.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.015_add_auto_assign_to_floating_ips.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.007_add_ipv6_to_fixed_ips.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.014_add_instance_type_id_to_instances.rst -source/api/nova.db.sqlalchemy.api.rst -source/api/nova.db.sqlalchemy.models.rst -source/api/nova.db.api.rst -source/api/nova.twistd.rst -source/api/nova.test.rst -source/api/nova.fakerabbit.rst -source/api/nova.service.rst -source/api/nova.flags.rst -source/api/nova.api.ec2.ec2utils.rst -source/api/nova.api.ec2.metadatarequesthandler.rst -source/api/nova.api.ec2.cloud.rst -source/api/nova.api.ec2.admin.rst -source/api/nova.api.ec2.apirequest.rst -source/api/nova.api.openstack.images.rst -source/api/nova.api.openstack.faults.rst -source/api/nova.api.openstack.shared_ip_groups.rst -source/api/nova.api.openstack.common.rst -source/api/nova.api.openstack.ips.rst -source/api/nova.api.openstack.extensions.rst -source/api/nova.api.openstack.servers.rst -source/api/nova.api.openstack.consoles.rst -source/api/nova.api.openstack.users.rst -source/api/nova.api.openstack.auth.rst -source/api/nova.api.openstack.versions.rst -source/api/nova.api.openstack.zones.rst -source/api/nova.api.openstack.limits.rst -source/api/nova.api.openstack.flavors.rst -source/api/nova.api.openstack.image_metadata.rst -source/api/nova.api.openstack.contrib.volumes.rst -source/api/nova.api.openstack.wsgi.rst -source/api/nova.api.openstack.accounts.rst -source/api/nova.api.openstack.views.images.rst -source/api/nova.api.openstack.views.addresses.rst -source/api/nova.api.openstack.views.servers.rst -source/api/nova.api.openstack.views.versions.rst -source/api/nova.api.openstack.views.limits.rst -source/api/nova.api.openstack.views.flavors.rst -source/api/nova.api.openstack.server_metadata.rst -source/api/nova.api.openstack.backup_schedules.rst -source/api/nova.api.direct.rst -source/api/nova.log.rst -source/api/nova.rpc.rst -source/api/nova.fakememcache.rst -source/api/nova.crypto.rst -source/api/nova.cloudpipe.pipelib.rst -source/api/nova.context.rst -source/api/nova.quota.rst -source/api/nova.tests.test_compute.rst -source/api/nova.tests.test_quota.rst -source/api/nova.tests.test_flags.rst -source/api/nova.tests.test_objectstore.rst -source/api/nova.tests.test_crypto.rst -source/api/nova.tests.runtime_flags.rst -source/api/nova.tests.test_exception.rst -source/api/nova.tests.vmwareapi.db_fakes.rst -source/api/nova.tests.vmwareapi.stubs.rst -source/api/nova.tests.test_host_filter.rst -source/api/nova.tests.test_network.rst -source/api/nova.tests.network.base.rst -source/api/nova.tests.declare_flags.rst -source/api/nova.tests.test_localization.rst -source/api/nova.tests.test_access.rst -source/api/nova.tests.test_libvirt.rst -source/api/nova.tests.image.test_glance.rst -source/api/nova.tests.test_direct.rst -source/api/nova.tests.fake_utils.rst -source/api/nova.tests.integrated.test_login.rst -source/api/nova.tests.integrated.test_extensions.rst -source/api/nova.tests.integrated.integrated_helpers.rst -source/api/nova.tests.integrated.test_servers.rst -source/api/nova.tests.integrated.test_xml.rst -source/api/nova.tests.integrated.api.client.rst -source/api/nova.tests.integrated.test_volumes.rst -source/api/nova.tests.test_rpc.rst -source/api/nova.tests.test_volume.rst -source/api/nova.tests.test_notifier.rst -source/api/nova.tests.fake_flags.rst -source/api/nova.tests.test_log.rst -source/api/nova.tests.test_service.rst -source/api/nova.tests.test_twistd.rst -source/api/nova.tests.test_misc.rst -source/api/nova.tests.test_cloud.rst -source/api/nova.tests.glance.stubs.rst -source/api/nova.tests.test_auth.rst -source/api/nova.tests.test_utils.rst -source/api/nova.tests.test_vmwareapi.rst -source/api/nova.tests.test_vlan_network.rst -source/api/nova.tests.test_zones.rst -source/api/nova.tests.test_middleware.rst -source/api/nova.tests.test_ipv6.rst -source/api/nova.tests.xenapi.stubs.rst -source/api/nova.tests.test_api.rst -source/api/nova.tests.scheduler.test_host_filter.rst -source/api/nova.tests.scheduler.test_zone_aware_scheduler.rst -source/api/nova.tests.scheduler.test_least_cost_scheduler.rst -source/api/nova.tests.scheduler.test_scheduler.rst -source/api/nova.tests.db.fakes.rst -source/api/nova.tests.test_instance_types.rst -source/api/nova.tests.test_console.rst -source/api/nova.tests.api.test_wsgi.rst -source/api/nova.tests.api.openstack.test_users.rst -source/api/nova.tests.api.openstack.fakes.rst -source/api/nova.tests.api.openstack.common.rst -source/api/nova.tests.api.openstack.test_wsgi.rst -source/api/nova.tests.api.openstack.test_accounts.rst -source/api/nova.tests.api.openstack.test_flavors.rst -source/api/nova.tests.api.openstack.test_extensions.rst -source/api/nova.tests.api.openstack.test_adminapi.rst -source/api/nova.tests.api.openstack.test_versions.rst -source/api/nova.tests.api.openstack.test_image_metadata.rst -source/api/nova.tests.api.openstack.test_auth.rst -source/api/nova.tests.api.openstack.test_servers.rst -source/api/nova.tests.api.openstack.test_zones.rst -source/api/nova.tests.api.openstack.test_images.rst -source/api/nova.tests.api.openstack.test_api.rst -source/api/nova.tests.api.openstack.test_faults.rst -source/api/nova.tests.api.openstack.test_limits.rst -source/api/nova.tests.api.openstack.test_server_metadata.rst -source/api/nova.tests.api.openstack.test_shared_ip_groups.rst -source/api/nova.tests.api.openstack.test_common.rst -source/api/nova.tests.api.openstack.extensions.foxinsocks.rst -source/api/nova.tests.test_xenapi.rst -source/api/nova.tests.hyperv_unittest.rst -source/api/nova.tests.test_test.rst -source/api/nova.tests.test_flat_network.rst -source/api/nova.network.linux_net.rst -source/api/nova.network.api.rst -source/api/nova.network.manager.rst -source/api/nova.network.vmwareapi_net.rst -source/api/nova.network.xenapi_net.rst -source/api/nova.volume.driver.rst -source/api/nova.volume.api.rst -source/api/nova.volume.san.rst -source/api/nova.volume.manager.rst -source/api/nova.virt.images.rst -source/api/nova.virt.driver.rst -source/api/nova.virt.vmwareapi.io_util.rst -source/api/nova.virt.vmwareapi.error_util.rst -source/api/nova.virt.vmwareapi.vmops.rst -source/api/nova.virt.vmwareapi.fake.rst -source/api/nova.virt.vmwareapi.vim.rst -source/api/nova.virt.vmwareapi.read_write_util.rst -source/api/nova.virt.vmwareapi.vmware_images.rst -source/api/nova.virt.vmwareapi.network_utils.rst -source/api/nova.virt.vmwareapi.vim_util.rst -source/api/nova.virt.vmwareapi.vm_util.rst -source/api/nova.virt.xenapi_conn.rst -source/api/nova.virt.fake.rst -source/api/nova.virt.vmwareapi_conn.rst -source/api/nova.virt.connection.rst -source/api/nova.virt.disk.rst -source/api/nova.virt.libvirt.connection.rst -source/api/nova.virt.libvirt.firewall.rst -source/api/nova.virt.libvirt.netutils.rst -source/api/nova.virt.hyperv.rst -source/api/nova.virt.xenapi.vmops.rst -source/api/nova.virt.xenapi.fake.rst -source/api/nova.virt.xenapi.volume_utils.rst -source/api/nova.virt.xenapi.network_utils.rst -source/api/nova.virt.xenapi.vm_utils.rst -source/api/nova.virt.xenapi.volumeops.rst -source/api/nova.exception.rst -source/api/nova.image.fake.rst -source/api/nova.image.local.rst -source/api/nova.image.glance.rst -source/api/nova.image.service.rst -source/api/nova.image.s3.rst -source/api/nova.objectstore.s3server.rst -source/api/nova.ipv6.account_identifier.rst -source/api/nova.ipv6.api.rst -source/api/nova.ipv6.rfc2462.rst -source/api/nova.notifier.no_op_notifier.rst -source/api/nova.notifier.log_notifier.rst -source/api/nova.notifier.rabbit_notifier.rst -source/api/nova.notifier.api.rst -source/api/nova.vcsversion.rst -source/api/nova.compute.instance_types.rst -source/api/nova.compute.power_state.rst -source/api/nova.compute.api.rst -source/api/nova.compute.manager.rst -source/api/nova.compute.monitor.rst -source/api/nova.wsgi.rst -source/api/nova.console.vmrc_manager.rst -source/api/nova.console.fake.rst -source/api/nova.console.vmrc.rst -source/api/nova.console.api.rst -source/api/nova.console.manager.rst -source/api/nova.console.xvp.rst -source/api/nova.version.rst -source/api/nova.utils.rst -source/api/nova.auth.dbdriver.rst -source/api/nova.auth.fakeldap.rst -source/api/nova.auth.ldapdriver.rst -source/api/nova.auth.signer.rst -source/api/nova.auth.manager.rst -source/api/nova.manager.rst -source/api/nova.scheduler.driver.rst -source/api/nova.scheduler.host_filter.rst -source/api/nova.scheduler.zone.rst -source/api/nova.scheduler.simple.rst -source/api/nova.scheduler.zone_aware_scheduler.rst -source/api/nova.scheduler.zone_manager.rst -source/api/nova.scheduler.api.rst -source/api/nova.scheduler.least_cost.rst -source/api/nova.scheduler.manager.rst -source/api/nova.scheduler.chance.rst -source/api/nova.vnc.auth.rst -source/api/nova.vnc.proxy.rst -source/api/nova.db.base.rst -source/api/nova.db.migration.rst -source/api/nova.db.sqlalchemy.session.rst -source/api/nova.db.sqlalchemy.migration.rst -source/api/nova.db.sqlalchemy.migrate_repo.manage.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.018_rename_server_management_url.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.017_make_instance_type_id_an_integer.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.010_add_os_type_to_instances.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.013_add_flavors_to_migrations.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.009_add_instance_migrations.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.002_bexar.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.020_add_snapshot_id_to_volumes.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.016_make_quotas_key_and_value.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.003_add_label_to_networks.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.021_rename_image_ids.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.006_add_provider_data_to_volumes.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.008_add_instance_types.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.019_add_volume_snapshot_support.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.001_austin.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.011_live_migration.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.005_add_instance_metadata.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.004_add_zone_tables.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.012_add_ipv6_flatmanager.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.015_add_auto_assign_to_floating_ips.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.007_add_ipv6_to_fixed_ips.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.014_add_instance_type_id_to_instances.rst -source/api/nova.db.sqlalchemy.api.rst -source/api/nova.db.sqlalchemy.models.rst -source/api/nova.db.api.rst -source/api/nova.twistd.rst -source/api/nova.test.rst -source/api/nova.fakerabbit.rst -source/api/nova.service.rst -source/api/nova.flags.rst -source/api/nova.api.ec2.ec2utils.rst -source/api/nova.api.ec2.metadatarequesthandler.rst -source/api/nova.api.ec2.cloud.rst -source/api/nova.api.ec2.admin.rst -source/api/nova.api.ec2.apirequest.rst -source/api/nova.api.openstack.images.rst -source/api/nova.api.openstack.faults.rst -source/api/nova.api.openstack.shared_ip_groups.rst -source/api/nova.api.openstack.common.rst -source/api/nova.api.openstack.ips.rst -source/api/nova.api.openstack.extensions.rst -source/api/nova.api.openstack.servers.rst -source/api/nova.api.openstack.consoles.rst -source/api/nova.api.openstack.users.rst -source/api/nova.api.openstack.auth.rst -source/api/nova.api.openstack.versions.rst -source/api/nova.api.openstack.zones.rst -source/api/nova.api.openstack.limits.rst -source/api/nova.api.openstack.flavors.rst -source/api/nova.api.openstack.image_metadata.rst -source/api/nova.api.openstack.contrib.volumes.rst -source/api/nova.api.openstack.wsgi.rst -source/api/nova.api.openstack.accounts.rst -source/api/nova.api.openstack.views.images.rst -source/api/nova.api.openstack.views.addresses.rst -source/api/nova.api.openstack.views.servers.rst -source/api/nova.api.openstack.views.versions.rst -source/api/nova.api.openstack.views.limits.rst -source/api/nova.api.openstack.views.flavors.rst -source/api/nova.api.openstack.server_metadata.rst -source/api/nova.api.openstack.backup_schedules.rst -source/api/nova.api.direct.rst -source/api/nova.log.rst -source/api/nova.rpc.rst -source/api/nova.fakememcache.rst -source/api/nova.crypto.rst -source/api/nova.cloudpipe.pipelib.rst -source/api/nova.context.rst -source/api/nova.quota.rst -source/api/nova.tests.test_compute.rst -source/api/nova.tests.test_quota.rst -source/api/nova.tests.test_flags.rst -source/api/nova.tests.test_objectstore.rst -source/api/nova.tests.test_crypto.rst -source/api/nova.tests.runtime_flags.rst -source/api/nova.tests.test_exception.rst -source/api/nova.tests.vmwareapi.db_fakes.rst -source/api/nova.tests.vmwareapi.stubs.rst -source/api/nova.tests.test_host_filter.rst -source/api/nova.tests.test_network.rst -source/api/nova.tests.network.base.rst -source/api/nova.tests.declare_flags.rst -source/api/nova.tests.test_localization.rst -source/api/nova.tests.test_access.rst -source/api/nova.tests.test_libvirt.rst -source/api/nova.tests.image.test_glance.rst -source/api/nova.tests.test_direct.rst -source/api/nova.tests.fake_utils.rst -source/api/nova.tests.integrated.test_login.rst -source/api/nova.tests.integrated.test_extensions.rst -source/api/nova.tests.integrated.integrated_helpers.rst -source/api/nova.tests.integrated.test_servers.rst -source/api/nova.tests.integrated.test_xml.rst -source/api/nova.tests.integrated.api.client.rst -source/api/nova.tests.integrated.test_volumes.rst -source/api/nova.tests.test_rpc.rst -source/api/nova.tests.test_volume.rst -source/api/nova.tests.test_notifier.rst -source/api/nova.tests.fake_flags.rst -source/api/nova.tests.test_log.rst -source/api/nova.tests.test_service.rst -source/api/nova.tests.test_twistd.rst -source/api/nova.tests.test_misc.rst -source/api/nova.tests.test_cloud.rst -source/api/nova.tests.glance.stubs.rst -source/api/nova.tests.test_auth.rst -source/api/nova.tests.test_utils.rst -source/api/nova.tests.test_vmwareapi.rst -source/api/nova.tests.test_vlan_network.rst -source/api/nova.tests.test_zones.rst -source/api/nova.tests.test_middleware.rst -source/api/nova.tests.test_ipv6.rst -source/api/nova.tests.xenapi.stubs.rst -source/api/nova.tests.test_api.rst -source/api/nova.tests.scheduler.test_host_filter.rst -source/api/nova.tests.scheduler.test_zone_aware_scheduler.rst -source/api/nova.tests.scheduler.test_least_cost_scheduler.rst -source/api/nova.tests.scheduler.test_scheduler.rst -source/api/nova.tests.db.fakes.rst -source/api/nova.tests.test_instance_types.rst -source/api/nova.tests.test_console.rst -source/api/nova.tests.api.test_wsgi.rst -source/api/nova.tests.api.openstack.test_users.rst -source/api/nova.tests.api.openstack.fakes.rst -source/api/nova.tests.api.openstack.common.rst -source/api/nova.tests.api.openstack.test_wsgi.rst -source/api/nova.tests.api.openstack.test_accounts.rst -source/api/nova.tests.api.openstack.test_flavors.rst -source/api/nova.tests.api.openstack.test_extensions.rst -source/api/nova.tests.api.openstack.test_adminapi.rst -source/api/nova.tests.api.openstack.test_versions.rst -source/api/nova.tests.api.openstack.test_image_metadata.rst -source/api/nova.tests.api.openstack.test_auth.rst -source/api/nova.tests.api.openstack.test_servers.rst -source/api/nova.tests.api.openstack.test_zones.rst -source/api/nova.tests.api.openstack.test_images.rst -source/api/nova.tests.api.openstack.test_api.rst -source/api/nova.tests.api.openstack.test_faults.rst -source/api/nova.tests.api.openstack.test_limits.rst -source/api/nova.tests.api.openstack.test_server_metadata.rst -source/api/nova.tests.api.openstack.test_shared_ip_groups.rst -source/api/nova.tests.api.openstack.test_common.rst -source/api/nova.tests.api.openstack.extensions.foxinsocks.rst -source/api/nova.tests.test_xenapi.rst -source/api/nova.tests.hyperv_unittest.rst -source/api/nova.tests.test_test.rst -source/api/nova.tests.test_flat_network.rst -source/api/nova.network.linux_net.rst -source/api/nova.network.api.rst -source/api/nova.network.manager.rst -source/api/nova.network.vmwareapi_net.rst -source/api/nova.network.xenapi_net.rst -source/api/nova.volume.driver.rst -source/api/nova.volume.api.rst -source/api/nova.volume.san.rst -source/api/nova.volume.manager.rst -source/api/nova.virt.images.rst -source/api/nova.virt.driver.rst -source/api/nova.virt.vmwareapi.io_util.rst -source/api/nova.virt.vmwareapi.error_util.rst -source/api/nova.virt.vmwareapi.vmops.rst -source/api/nova.virt.vmwareapi.fake.rst -source/api/nova.virt.vmwareapi.vim.rst -source/api/nova.virt.vmwareapi.read_write_util.rst -source/api/nova.virt.vmwareapi.vmware_images.rst -source/api/nova.virt.vmwareapi.network_utils.rst -source/api/nova.virt.vmwareapi.vim_util.rst -source/api/nova.virt.vmwareapi.vm_util.rst -source/api/nova.virt.xenapi_conn.rst -source/api/nova.virt.fake.rst -source/api/nova.virt.vmwareapi_conn.rst -source/api/nova.virt.connection.rst -source/api/nova.virt.disk.rst -source/api/nova.virt.libvirt.connection.rst -source/api/nova.virt.libvirt.firewall.rst -source/api/nova.virt.libvirt.netutils.rst -source/api/nova.virt.hyperv.rst -source/api/nova.virt.xenapi.vmops.rst -source/api/nova.virt.xenapi.fake.rst -source/api/nova.virt.xenapi.volume_utils.rst -source/api/nova.virt.xenapi.network_utils.rst -source/api/nova.virt.xenapi.vm_utils.rst -source/api/nova.virt.xenapi.volumeops.rst -source/api/nova.exception.rst -source/api/nova.image.fake.rst -source/api/nova.image.local.rst -source/api/nova.image.glance.rst -source/api/nova.image.service.rst -source/api/nova.image.s3.rst -source/api/nova.objectstore.s3server.rst -source/api/nova.ipv6.account_identifier.rst -source/api/nova.ipv6.api.rst -source/api/nova.ipv6.rfc2462.rst -source/api/nova.notifier.no_op_notifier.rst -source/api/nova.notifier.log_notifier.rst -source/api/nova.notifier.rabbit_notifier.rst -source/api/nova.notifier.api.rst -source/api/nova.vcsversion.rst -source/api/nova.compute.instance_types.rst -source/api/nova.compute.power_state.rst -source/api/nova.compute.api.rst -source/api/nova.compute.manager.rst -source/api/nova.compute.monitor.rst -source/api/nova.wsgi.rst -source/api/nova.console.vmrc_manager.rst -source/api/nova.console.fake.rst -source/api/nova.console.vmrc.rst -source/api/nova.console.api.rst -source/api/nova.console.manager.rst -source/api/nova.console.xvp.rst -source/api/nova.version.rst -source/api/nova.utils.rst -source/api/nova.auth.dbdriver.rst -source/api/nova.auth.fakeldap.rst -source/api/nova.auth.ldapdriver.rst -source/api/nova.auth.signer.rst -source/api/nova.auth.manager.rst -source/api/nova.manager.rst -source/api/nova.scheduler.driver.rst -source/api/nova.scheduler.host_filter.rst -source/api/nova.scheduler.zone.rst -source/api/nova.scheduler.simple.rst -source/api/nova.scheduler.zone_aware_scheduler.rst -source/api/nova.scheduler.zone_manager.rst -source/api/nova.scheduler.api.rst -source/api/nova.scheduler.least_cost.rst -source/api/nova.scheduler.manager.rst -source/api/nova.scheduler.chance.rst -source/api/nova.vnc.auth.rst -source/api/nova.vnc.proxy.rst -source/api/nova.db.base.rst -source/api/nova.db.migration.rst -source/api/nova.db.sqlalchemy.session.rst -source/api/nova.db.sqlalchemy.migration.rst -source/api/nova.db.sqlalchemy.migrate_repo.manage.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.018_rename_server_management_url.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.017_make_instance_type_id_an_integer.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.010_add_os_type_to_instances.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.013_add_flavors_to_migrations.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.009_add_instance_migrations.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.002_bexar.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.020_add_snapshot_id_to_volumes.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.016_make_quotas_key_and_value.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.003_add_label_to_networks.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.021_rename_image_ids.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.006_add_provider_data_to_volumes.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.008_add_instance_types.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.019_add_volume_snapshot_support.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.001_austin.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.011_live_migration.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.005_add_instance_metadata.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.004_add_zone_tables.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.012_add_ipv6_flatmanager.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.015_add_auto_assign_to_floating_ips.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.007_add_ipv6_to_fixed_ips.rst -source/api/nova.db.sqlalchemy.migrate_repo.versions.014_add_instance_type_id_to_instances.rst -source/api/nova.db.sqlalchemy.api.rst -source/api/nova.db.sqlalchemy.models.rst -source/api/nova.db.api.rst -source/api/nova.twistd.rst -source/api/nova.test.rst -source/api/nova.fakerabbit.rst -source/api/nova.service.rst -source/api/nova.flags.rst -source/api/nova.api.ec2.ec2utils.rst -source/api/nova.api.ec2.metadatarequesthandler.rst -source/api/nova.api.ec2.cloud.rst -source/api/nova.api.ec2.admin.rst -source/api/nova.api.ec2.apirequest.rst -source/api/nova.api.openstack.images.rst -source/api/nova.api.openstack.faults.rst -source/api/nova.api.openstack.shared_ip_groups.rst -source/api/nova.api.openstack.common.rst -source/api/nova.api.openstack.ips.rst -source/api/nova.api.openstack.extensions.rst -source/api/nova.api.openstack.servers.rst -source/api/nova.api.openstack.consoles.rst -source/api/nova.api.openstack.users.rst -source/api/nova.api.openstack.auth.rst -source/api/nova.api.openstack.versions.rst -source/api/nova.api.openstack.zones.rst -source/api/nova.api.openstack.limits.rst -source/api/nova.api.openstack.flavors.rst -source/api/nova.api.openstack.image_metadata.rst -source/api/nova.api.openstack.contrib.volumes.rst -source/api/nova.api.openstack.wsgi.rst -source/api/nova.api.openstack.accounts.rst -source/api/nova.api.openstack.views.images.rst -source/api/nova.api.openstack.views.addresses.rst -source/api/nova.api.openstack.views.servers.rst -source/api/nova.api.openstack.views.versions.rst -source/api/nova.api.openstack.views.limits.rst -source/api/nova.api.openstack.views.flavors.rst -source/api/nova.api.openstack.server_metadata.rst -source/api/nova.api.openstack.backup_schedules.rst -source/api/nova.api.direct.rst -source/api/nova.log.rst -source/api/nova.rpc.rst -source/api/nova.fakememcache.rst From a66ae006e0a6103ee6db49ad2b8dc4506969178e Mon Sep 17 00:00:00 2001 From: Johannes Erdfelt Date: Wed, 8 Jun 2011 15:45:23 +0000 Subject: [PATCH 18/70] Look for vm_mode property on images and use that if it exists to determine if image should be run in PV or HVM mode. If it doesn't exist, fall back to existing logic --- nova/compute/api.py | 6 ++- .../versions/022_add_vm_mode_to_instances.py | 43 +++++++++++++++++++ nova/db/sqlalchemy/models.py | 1 + nova/virt/xenapi/vmops.py | 11 +++-- 4 files changed, 57 insertions(+), 4 deletions(-) create mode 100644 nova/db/sqlalchemy/migrate_repo/versions/022_add_vm_mode_to_instances.py diff --git a/nova/compute/api.py b/nova/compute/api.py index 4f327fab17..5ea0860882 100644 --- a/nova/compute/api.py +++ b/nova/compute/api.py @@ -166,6 +166,9 @@ class API(base.Base): os_type = None if 'properties' in image and 'os_type' in image['properties']: os_type = image['properties']['os_type'] + vm_mode = None + if 'properties' in image and 'vm_mode' in image['properties']: + vm_mode = image['properties']['vm_mode'] if kernel_id is None: kernel_id = image['properties'].get('kernel_id', None) @@ -224,7 +227,8 @@ class API(base.Base): 'locked': False, 'metadata': metadata, 'availability_zone': availability_zone, - 'os_type': os_type} + 'os_type': os_type, + 'vm_mode': vm_mode} elevated = context.elevated() instances = [] LOG.debug(_("Going to run %s instances..."), num_instances) diff --git a/nova/db/sqlalchemy/migrate_repo/versions/022_add_vm_mode_to_instances.py b/nova/db/sqlalchemy/migrate_repo/versions/022_add_vm_mode_to_instances.py new file mode 100644 index 0000000000..5b6a25e41b --- /dev/null +++ b/nova/db/sqlalchemy/migrate_repo/versions/022_add_vm_mode_to_instances.py @@ -0,0 +1,43 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 OpenStack LLC. +# +# 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 sqlalchemy import Column, Integer, MetaData, String, Table + +meta = MetaData() + +instances = Table('instances', meta, + Column('id', Integer(), primary_key=True, nullable=False), + ) + +instances_vm_mode = Column('vm_mode', + String(length=255, convert_unicode=False, + assert_unicode=None, unicode_error=None, + _warn_on_bytestring=False), + nullable=True) + + +def upgrade(migrate_engine): + # Upgrade operations go here. Don't create your own engine; + # bind migrate_engine to your metadata + meta.bind = migrate_engine + + instances.create_column(instances_vm_mode) + + +def downgrade(migrate_engine): + meta.bind = migrate_engine + + instances.drop_column('vm_mode') diff --git a/nova/db/sqlalchemy/models.py b/nova/db/sqlalchemy/models.py index 239f6e96ae..612ccc93f8 100644 --- a/nova/db/sqlalchemy/models.py +++ b/nova/db/sqlalchemy/models.py @@ -232,6 +232,7 @@ class Instance(BASE, NovaBase): locked = Column(Boolean) os_type = Column(String(255)) + vm_mode = Column(String(255)) # TODO(vish): see Ewan's email about state improvements, probably # should be in a driver base class or some such diff --git a/nova/virt/xenapi/vmops.py b/nova/virt/xenapi/vmops.py index 32dae97c28..3b793113f9 100644 --- a/nova/virt/xenapi/vmops.py +++ b/nova/virt/xenapi/vmops.py @@ -160,9 +160,14 @@ class VMOps(object): # Create the VM ref and attach the first disk first_vdi_ref = self._session.call_xenapi('VDI.get_by_uuid', vdis[0]['vdi_uuid']) - use_pv_kernel = VMHelper.determine_is_pv(self._session, - instance.id, first_vdi_ref, disk_image_type, - instance.os_type) + if instance.vm_mode in ('pv', 'PV'): + use_pv_kernel = True + elif instance.vm_mode in ('hv', 'HV', 'hvm', 'HVM'): + use_pv_kernel = False + else: + use_pv_kernel = VMHelper.determine_is_pv(self._session, + instance.id, first_vdi_ref, disk_image_type, + instance.os_type) vm_ref = VMHelper.create_vm(self._session, instance, kernel, ramdisk, use_pv_kernel) VMHelper.create_vbd(session=self._session, vm_ref=vm_ref, From e5fdcc315cc8c3993f0c37078cf4c89cacc34106 Mon Sep 17 00:00:00 2001 From: Sandy Walsh Date: Wed, 8 Jun 2011 11:04:41 -0700 Subject: [PATCH 19/70] tweaks --- tools/pip-requires | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/pip-requires b/tools/pip-requires index 8f8018765f..1fa69cd062 100644 --- a/tools/pip-requires +++ b/tools/pip-requires @@ -10,7 +10,7 @@ boto==1.9b carrot==0.10.5 eventlet==0.9.12 lockfile==0.8 -python-novaclient==2.3 +python-novaclient==2.5 python-daemon==1.5.5 python-gflags==1.3 redis==2.0.0 From 70e4d73778d448cb7f122bc0a2a0c43a78fff46a Mon Sep 17 00:00:00 2001 From: John Tran Date: Wed, 8 Jun 2011 15:23:33 -0700 Subject: [PATCH 20/70] added a test for allocate_address & added error handling for api instead of returning 'UnknownError', will give information 'AllocateAddressError: NoMoreAddresses --- nova/api/ec2/__init__.py | 6 ++++++ nova/tests/test_cloud.py | 10 ++++++++++ 2 files changed, 16 insertions(+) diff --git a/nova/api/ec2/__init__.py b/nova/api/ec2/__init__.py index 1915d007d8..459ecb442a 100644 --- a/nova/api/ec2/__init__.py +++ b/nova/api/ec2/__init__.py @@ -348,6 +348,12 @@ class Executor(wsgi.Application): LOG.debug(_('KeyPairExists raised: %s'), unicode(ex), context=context) return self._error(req, context, type(ex).__name__, unicode(ex)) + except rpc.RemoteError as ex: + LOG.debug(_('RemoteError raised: %s'), ex.exc_type, + context=context) + if ex.exc_type == 'NoMoreAddresses': + return self._error(req, context, 'AllocateAddressError', + ex.exc_type) except Exception as ex: extra = {'environment': req.environ} LOG.exception(_('Unexpected error raised: %s'), unicode(ex), diff --git a/nova/tests/test_cloud.py b/nova/tests/test_cloud.py index ba133c860b..d6d90e8730 100644 --- a/nova/tests/test_cloud.py +++ b/nova/tests/test_cloud.py @@ -115,6 +115,16 @@ class CloudTestCase(test.TestCase): public_ip=address) db.floating_ip_destroy(self.context, address) + def test_allocate_address(self): + address = "10.10.10.10" + allocate = self.cloud.allocate_address + db.floating_ip_create(self.context, + {'address': address, + 'host': self.network.host}) + self.assertEqual(allocate(self.context)['publicIp'], address) + db.floating_ip_destroy(self.context, address) + self.assertRaises(rpc.RemoteError, allocate, self.context) + def test_associate_disassociate_address(self): """Verifies associate runs cleanly without raising an exception""" address = "10.10.10.10" From f20c73bbe395a93c087562966b10ade3c9f32afc Mon Sep 17 00:00:00 2001 From: Johannes Erdfelt Date: Wed, 8 Jun 2011 22:28:28 +0000 Subject: [PATCH 21/70] Normalize and update database with used vm_mode --- nova/virt/xenapi/vmops.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/nova/virt/xenapi/vmops.py b/nova/virt/xenapi/vmops.py index 3b793113f9..99d2dc7586 100644 --- a/nova/virt/xenapi/vmops.py +++ b/nova/virt/xenapi/vmops.py @@ -160,14 +160,24 @@ class VMOps(object): # Create the VM ref and attach the first disk first_vdi_ref = self._session.call_xenapi('VDI.get_by_uuid', vdis[0]['vdi_uuid']) - if instance.vm_mode in ('pv', 'PV'): + + vm_mode = instance.vm_mode and instance.vm_mode.lower() + if vm_mode == 'pv': use_pv_kernel = True - elif instance.vm_mode in ('hv', 'HV', 'hvm', 'HVM'): + elif vm_mode in ('hv', 'hvm'): use_pv_kernel = False + vm_mode = 'hvm' # Normalize else: use_pv_kernel = VMHelper.determine_is_pv(self._session, instance.id, first_vdi_ref, disk_image_type, instance.os_type) + vm_mode = use_pv_kernel and 'pv' or 'hvm' + + if instance.vm_mode != vm_mode: + # Update database with normalized (or determined) value + db.instance_update(context.get_admin_context(), + instance['id'], {'vm_mode': vm_mode}) + vm_ref = VMHelper.create_vm(self._session, instance, kernel, ramdisk, use_pv_kernel) VMHelper.create_vbd(session=self._session, vm_ref=vm_ref, From 3764be9d65483a9e431b69f37e3516fa20961362 Mon Sep 17 00:00:00 2001 From: John Tran Date: Wed, 8 Jun 2011 17:15:35 -0700 Subject: [PATCH 22/70] raises exception.NoFloatingIpsDefined instead of UnknownError --- nova/api/ec2/cloud.py | 8 ++++++-- nova/tests/test_cloud.py | 3 ++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/nova/api/ec2/cloud.py b/nova/api/ec2/cloud.py index 316298c395..6c5dba8ede 100644 --- a/nova/api/ec2/cloud.py +++ b/nova/api/ec2/cloud.py @@ -39,6 +39,7 @@ from nova import flags from nova import ipv6 from nova import log as logging from nova import network +from nova import rpc from nova import utils from nova import volume from nova.api.ec2 import ec2utils @@ -872,8 +873,11 @@ class CloudController(object): def allocate_address(self, context, **kwargs): LOG.audit(_("Allocate address"), context=context) - public_ip = self.network_api.allocate_floating_ip(context) - return {'publicIp': public_ip} + try: + public_ip = self.network_api.allocate_floating_ip(context) + return {'publicIp': public_ip} + except rpc.RemoteError: + raise exception.NoFloatingIpsDefined def release_address(self, context, public_ip, **kwargs): LOG.audit(_("Release address %s"), public_ip, context=context) diff --git a/nova/tests/test_cloud.py b/nova/tests/test_cloud.py index d6d90e8730..7cb13c9195 100644 --- a/nova/tests/test_cloud.py +++ b/nova/tests/test_cloud.py @@ -123,7 +123,8 @@ class CloudTestCase(test.TestCase): 'host': self.network.host}) self.assertEqual(allocate(self.context)['publicIp'], address) db.floating_ip_destroy(self.context, address) - self.assertRaises(rpc.RemoteError, allocate, self.context) + self.assertRaises(exception.NoFloatingIpsDefined, allocate, + self.context) def test_associate_disassociate_address(self): """Verifies associate runs cleanly without raising an exception""" From b11cf9bc7b1b9792bdab77aa72dc6163f3e44ca1 Mon Sep 17 00:00:00 2001 From: John Tran Date: Wed, 8 Jun 2011 17:17:40 -0700 Subject: [PATCH 23/70] removing custom exception, instead using NoFloatingIpsDefined --- nova/api/ec2/__init__.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/nova/api/ec2/__init__.py b/nova/api/ec2/__init__.py index 459ecb442a..1915d007d8 100644 --- a/nova/api/ec2/__init__.py +++ b/nova/api/ec2/__init__.py @@ -348,12 +348,6 @@ class Executor(wsgi.Application): LOG.debug(_('KeyPairExists raised: %s'), unicode(ex), context=context) return self._error(req, context, type(ex).__name__, unicode(ex)) - except rpc.RemoteError as ex: - LOG.debug(_('RemoteError raised: %s'), ex.exc_type, - context=context) - if ex.exc_type == 'NoMoreAddresses': - return self._error(req, context, 'AllocateAddressError', - ex.exc_type) except Exception as ex: extra = {'environment': req.environ} LOG.exception(_('Unexpected error raised: %s'), unicode(ex), From 8096ee6c79c608fd84e016d5da7663549a95896f Mon Sep 17 00:00:00 2001 From: Rick Harris Date: Thu, 9 Jun 2011 03:35:59 +0000 Subject: [PATCH 24/70] Support multiple glance-api servers --- nova/flags.py | 6 ++++-- nova/image/__init__.py | 7 ++++++- nova/image/glance.py | 24 +++++++++++++++++------- nova/virt/images.py | 7 +++++-- nova/virt/xenapi/vm_utils.py | 13 +++++++++---- 5 files changed, 41 insertions(+), 16 deletions(-) diff --git a/nova/flags.py b/nova/flags.py index d5090edba2..51f0536e8a 100644 --- a/nova/flags.py +++ b/nova/flags.py @@ -270,8 +270,10 @@ DEFINE_list('region_list', DEFINE_string('connection_type', 'libvirt', 'libvirt, xenapi or fake') DEFINE_string('aws_access_key_id', 'admin', 'AWS Access ID') DEFINE_string('aws_secret_access_key', 'admin', 'AWS Access Key') -DEFINE_integer('glance_port', 9292, 'glance port') -DEFINE_string('glance_host', '$my_ip', 'glance host') +# NOTE(sirp): my_ip interpolation doesn't work within nested structures +DEFINE_list('glance_api_servers', + [('127.0.0.1', 9292)], + 'list of glance servers available to nova') DEFINE_integer('s3_port', 3333, 's3 port') DEFINE_string('s3_host', '$my_ip', 's3 host (for infrastructure)') DEFINE_string('s3_dmz', '$my_ip', 's3 dmz ip (for instances)') diff --git a/nova/image/__init__.py b/nova/image/__init__.py index 93d83df249..a27d649d44 100644 --- a/nova/image/__init__.py +++ b/nova/image/__init__.py @@ -22,6 +22,7 @@ import nova from nova import exception from nova import utils from nova import flags +from nova.image import glance as glance_image_service FLAGS = flags.FLAGS @@ -48,6 +49,8 @@ def get_default_image_service(): return ImageService() +# FIXME(sirp): perhaps this should be moved to nova/images/glance so that we +# keep Glance specific code together for the most part def get_glance_client(image_href): """Get the correct glance client and id for the given image_href. @@ -62,7 +65,9 @@ def get_glance_client(image_href): """ image_href = image_href or 0 if str(image_href).isdigit(): - glance_client = GlanceClient(FLAGS.glance_host, FLAGS.glance_port) + glance_host, glance_port = \ + glance_image_service.pick_glance_api_server() + glance_client = GlanceClient(glance_host, glance_port) return (glance_client, int(image_href)) try: diff --git a/nova/image/glance.py b/nova/image/glance.py index 61308431d1..b684158446 100644 --- a/nova/image/glance.py +++ b/nova/image/glance.py @@ -20,6 +20,7 @@ from __future__ import absolute_import import datetime +import random from glance.common import exception as glance_exception @@ -39,6 +40,15 @@ FLAGS = flags.FLAGS GlanceClient = utils.import_class('glance.client.Client') +def pick_glance_api_server(): + """Return which Glance API server to use for the request + + Returns (host, port) + """ + host, port = random.choice(FLAGS.glance_api_servers) + return host, port + + class GlanceImageService(service.BaseImageService): """Provides storage and retrieval of disk image objects within Glance.""" @@ -50,13 +60,13 @@ class GlanceImageService(service.BaseImageService): SERVICE_IMAGE_ATTRS = service.BaseImageService.BASE_IMAGE_ATTRS +\ GLANCE_ONLY_ATTRS - def __init__(self, client=None): - # FIXME(sirp): can we avoid dependency-injection here by using - # stubbing out a fake? - if client is None: - self.client = GlanceClient(FLAGS.glance_host, FLAGS.glance_port) - else: - self.client = client + @property + def client(self): + # NOTE(sirp): we want to load balance each request across glance + # servers. Since GlanceImageService is a long-lived object, `client` + # is made to choose a new server each time via this property. + glance_host, glance_port = pick_glance_api_server() + return GlanceClient(glance_host, glance_port) def index(self, context, filters=None, marker=None, limit=None): """Calls out to Glance for a list of images available.""" diff --git a/nova/virt/images.py b/nova/virt/images.py index de7ac61df2..e6f3d3c9e6 100644 --- a/nova/virt/images.py +++ b/nova/virt/images.py @@ -23,6 +23,7 @@ Handling of VM disk images. from nova import context from nova import flags +from nova.image import glance as glance_image_service import nova.image from nova import log as logging from nova import utils @@ -48,7 +49,9 @@ def fetch(image_href, path, _user, _project): # of retrieving the image using this method. def image_url(image): if FLAGS.image_service == "nova.image.glance.GlanceImageService": - return "http://%s:%s/images/%s" % (FLAGS.glance_host, - FLAGS.glance_port, image) + glance_host, glance_port = \ + glance_image_service.pick_glance_api_server() + return "http://%s:%s/images/%s" % (glance_host, glance_port, image) + return "http://%s:%s/_images/%s/image" % (FLAGS.s3_host, FLAGS.s3_port, image) diff --git a/nova/virt/xenapi/vm_utils.py b/nova/virt/xenapi/vm_utils.py index 98668e6aed..ccde6cbfeb 100644 --- a/nova/virt/xenapi/vm_utils.py +++ b/nova/virt/xenapi/vm_utils.py @@ -33,6 +33,7 @@ import glance.client from nova import exception from nova import flags import nova.image +from nova.image import glance as glance_image_service from nova import log as logging from nova import utils from nova.auth.manager import AuthManager @@ -358,10 +359,12 @@ class VMHelper(HelperBase): os_type = instance.os_type or FLAGS.default_os_type + glance_host, glance_port = \ + glance_image_service.pick_glance_api_server() params = {'vdi_uuids': vdi_uuids, 'image_id': image_id, - 'glance_host': FLAGS.glance_host, - 'glance_port': FLAGS.glance_port, + 'glance_host': glance_host, + 'glance_port': glance_port, 'sr_path': cls.get_sr_path(session), 'os_type': os_type} @@ -409,9 +412,11 @@ class VMHelper(HelperBase): # here (under Python 2.6+) and pass them as arguments uuid_stack = [str(uuid.uuid4()) for i in xrange(2)] + glance_host, glance_port = \ + glance_image_service.pick_glance_api_server() params = {'image_id': image, - 'glance_host': FLAGS.glance_host, - 'glance_port': FLAGS.glance_port, + 'glance_host': glance_host, + 'glance_port': glance_port, 'uuid_stack': uuid_stack, 'sr_path': cls.get_sr_path(session)} From 463e0388308760dbf3bf2b3fa901d8076d002f91 Mon Sep 17 00:00:00 2001 From: John Tran Date: Thu, 9 Jun 2011 00:01:42 -0700 Subject: [PATCH 25/70] matched the inner exception specifically, instead of catching all RemoteError exceptions --- nova/api/ec2/cloud.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/nova/api/ec2/cloud.py b/nova/api/ec2/cloud.py index 6c5dba8ede..84a83d8e69 100644 --- a/nova/api/ec2/cloud.py +++ b/nova/api/ec2/cloud.py @@ -876,8 +876,11 @@ class CloudController(object): try: public_ip = self.network_api.allocate_floating_ip(context) return {'publicIp': public_ip} - except rpc.RemoteError: - raise exception.NoFloatingIpsDefined + except rpc.RemoteError as ex: + if ex.exc_type == 'NoMoreAddresses': + raise exception.NoFloatingIpsDefined + else: + raise def release_address(self, context, public_ip, **kwargs): LOG.audit(_("Release address %s"), public_ip, context=context) From eda8a1aaa2cf7cc31c7fda4723849feee3bc6766 Mon Sep 17 00:00:00 2001 From: Rick Harris Date: Thu, 9 Jun 2011 14:43:24 +0000 Subject: [PATCH 26/70] Fixing the tests --- nova/image/glance.py | 12 ++++++++++-- nova/tests/image/test_glance.py | 11 ++++++++--- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/nova/image/glance.py b/nova/image/glance.py index b684158446..f82c0f4a39 100644 --- a/nova/image/glance.py +++ b/nova/image/glance.py @@ -60,14 +60,22 @@ class GlanceImageService(service.BaseImageService): SERVICE_IMAGE_ATTRS = service.BaseImageService.BASE_IMAGE_ATTRS +\ GLANCE_ONLY_ATTRS - @property - def client(self): + _client = None + + def _get_client(self): # NOTE(sirp): we want to load balance each request across glance # servers. Since GlanceImageService is a long-lived object, `client` # is made to choose a new server each time via this property. + if self._client is not None: + return self._client glance_host, glance_port = pick_glance_api_server() return GlanceClient(glance_host, glance_port) + def _set_client(self, client): + self._client = client + + client = property(_get_client, _set_client) + def index(self, context, filters=None, marker=None, limit=None): """Calls out to Glance for a list of images available.""" # NOTE(sirp): We need to use `get_images_detailed` and not diff --git a/nova/tests/image/test_glance.py b/nova/tests/image/test_glance.py index 041da1e131..033b8389c6 100644 --- a/nova/tests/image/test_glance.py +++ b/nova/tests/image/test_glance.py @@ -17,6 +17,7 @@ import datetime +import stubout import unittest from nova import context @@ -60,12 +61,16 @@ class BaseGlanceTest(unittest.TestCase): NOW_DATETIME = datetime.datetime(2010, 10, 11, 10, 30, 22) def setUp(self): - # FIXME(sirp): we can probably use stubs library here rather than - # dependency injection + self.stubs = stubout.StubOutForTesting() self.client = StubGlanceClient(None) - self.service = glance.GlanceImageService(self.client) + self.service = glance.GlanceImageService() + self.stubs.Set(self.service, 'client', self.client) self.context = context.RequestContext(None, None) + def tearDown(self): + self.stubs.UnsetAll() + super(BaseGlanceTest, self).tearDown() + def assertDateTimesFilled(self, image_meta): self.assertEqual(image_meta['created_at'], self.NOW_DATETIME) self.assertEqual(image_meta['updated_at'], self.NOW_DATETIME) From 467bda72a05a0fd9fa4d7d417da422eea04de220 Mon Sep 17 00:00:00 2001 From: Johannes Erdfelt Date: Thu, 9 Jun 2011 18:51:21 +0000 Subject: [PATCH 27/70] 022 migration has already been added, so make ours 023 now --- ...dd_vm_mode_to_instances.py => 023_add_vm_mode_to_instances.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename nova/db/sqlalchemy/migrate_repo/versions/{022_add_vm_mode_to_instances.py => 023_add_vm_mode_to_instances.py} (100%) diff --git a/nova/db/sqlalchemy/migrate_repo/versions/022_add_vm_mode_to_instances.py b/nova/db/sqlalchemy/migrate_repo/versions/023_add_vm_mode_to_instances.py similarity index 100% rename from nova/db/sqlalchemy/migrate_repo/versions/022_add_vm_mode_to_instances.py rename to nova/db/sqlalchemy/migrate_repo/versions/023_add_vm_mode_to_instances.py From e307bf5dd60dc84587f76d88956499ee1f1013fb Mon Sep 17 00:00:00 2001 From: Rick Harris Date: Thu, 9 Jun 2011 21:36:20 +0000 Subject: [PATCH 28/70] Fixing code per review comments --- nova/flags.py | 4 ++-- nova/image/glance.py | 7 +++++-- nova/tests/image/test_glance.py | 9 +-------- nova/virt/images.py | 12 ------------ nova/virt/xenapi/vm_utils.py | 3 ++- 5 files changed, 10 insertions(+), 25 deletions(-) diff --git a/nova/flags.py b/nova/flags.py index 545cf90fea..acfcf8d680 100644 --- a/nova/flags.py +++ b/nova/flags.py @@ -272,8 +272,8 @@ DEFINE_string('aws_access_key_id', 'admin', 'AWS Access ID') DEFINE_string('aws_secret_access_key', 'admin', 'AWS Access Key') # NOTE(sirp): my_ip interpolation doesn't work within nested structures DEFINE_list('glance_api_servers', - [('127.0.0.1', 9292)], - 'list of glance servers available to nova') + ['127.0.0.1:9292'], + 'list of glance api servers available to nova (host:port)') DEFINE_integer('s3_port', 3333, 's3 port') DEFINE_string('s3_host', '$my_ip', 's3 host (for infrastructure)') DEFINE_string('s3_dmz', '$my_ip', 's3 dmz ip (for instances)') diff --git a/nova/image/glance.py b/nova/image/glance.py index f82c0f4a39..5712215bb3 100644 --- a/nova/image/glance.py +++ b/nova/image/glance.py @@ -45,7 +45,9 @@ def pick_glance_api_server(): Returns (host, port) """ - host, port = random.choice(FLAGS.glance_api_servers) + host_port = random.choice(FLAGS.glance_api_servers) + host, port_str = host_port.split(':') + port = int(port_str) return host, port @@ -60,7 +62,8 @@ class GlanceImageService(service.BaseImageService): SERVICE_IMAGE_ATTRS = service.BaseImageService.BASE_IMAGE_ATTRS +\ GLANCE_ONLY_ATTRS - _client = None + def __init__(self, client=None): + self._client = client def _get_client(self): # NOTE(sirp): we want to load balance each request across glance diff --git a/nova/tests/image/test_glance.py b/nova/tests/image/test_glance.py index 033b8389c6..223e7ae578 100644 --- a/nova/tests/image/test_glance.py +++ b/nova/tests/image/test_glance.py @@ -17,7 +17,6 @@ import datetime -import stubout import unittest from nova import context @@ -61,16 +60,10 @@ class BaseGlanceTest(unittest.TestCase): NOW_DATETIME = datetime.datetime(2010, 10, 11, 10, 30, 22) def setUp(self): - self.stubs = stubout.StubOutForTesting() self.client = StubGlanceClient(None) - self.service = glance.GlanceImageService() - self.stubs.Set(self.service, 'client', self.client) + self.service = glance.GlanceImageService(client=self.client) self.context = context.RequestContext(None, None) - def tearDown(self): - self.stubs.UnsetAll() - super(BaseGlanceTest, self).tearDown() - def assertDateTimesFilled(self, image_meta): self.assertEqual(image_meta['created_at'], self.NOW_DATETIME) self.assertEqual(image_meta['updated_at'], self.NOW_DATETIME) diff --git a/nova/virt/images.py b/nova/virt/images.py index e6f3d3c9e6..40bf6107c9 100644 --- a/nova/virt/images.py +++ b/nova/virt/images.py @@ -43,15 +43,3 @@ def fetch(image_href, path, _user, _project): elevated = context.get_admin_context() metadata = image_service.get(elevated, image_id, image_file) return metadata - - -# TODO(vish): xenapi should use the glance client code directly instead -# of retrieving the image using this method. -def image_url(image): - if FLAGS.image_service == "nova.image.glance.GlanceImageService": - glance_host, glance_port = \ - glance_image_service.pick_glance_api_server() - return "http://%s:%s/images/%s" % (glance_host, glance_port, image) - - return "http://%s:%s/_images/%s/image" % (FLAGS.s3_host, FLAGS.s3_port, - image) diff --git a/nova/virt/xenapi/vm_utils.py b/nova/virt/xenapi/vm_utils.py index ccde6cbfeb..b9d4346e41 100644 --- a/nova/virt/xenapi/vm_utils.py +++ b/nova/virt/xenapi/vm_utils.py @@ -581,7 +581,8 @@ class VMHelper(HelperBase): Returns: A single filename if image_type is KERNEL_RAMDISK A list of dictionaries that describe VDIs, otherwise """ - url = images.image_url(image) + url = "http://%s:%s/_images/%s/image" % (FLAGS.s3_host, FLAGS.s3_port, + image) LOG.debug(_("Asking xapi to fetch %(url)s as %(access)s") % locals()) if image_type == ImageType.KERNEL_RAMDISK: fn = 'get_kernel' From 361fd763eb0cf3e62e0184dafd0f4a024e1871f5 Mon Sep 17 00:00:00 2001 From: Rick Harris Date: Thu, 9 Jun 2011 21:50:34 +0000 Subject: [PATCH 29/70] Adding caveat --- nova/image/glance.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/nova/image/glance.py b/nova/image/glance.py index 5712215bb3..6e058ab2ff 100644 --- a/nova/image/glance.py +++ b/nova/image/glance.py @@ -43,6 +43,10 @@ GlanceClient = utils.import_class('glance.client.Client') def pick_glance_api_server(): """Return which Glance API server to use for the request + This method provides a very primitive form of load-balancing suitable for + testing and sandbox environments. In production, it would be better to use + one IP and route that to a real load-balancer. + Returns (host, port) """ host_port = random.choice(FLAGS.glance_api_servers) From 810b580cb41b076b083ace1c4670c13b2f16c5a5 Mon Sep 17 00:00:00 2001 From: Sandy Walsh Date: Thu, 9 Jun 2011 16:19:24 -0700 Subject: [PATCH 30/70] forgot some debugging statements --- nova/api/openstack/create_instance_controller.py | 8 -------- nova/api/openstack/servers.py | 3 --- nova/compute/api.py | 1 - nova/image/__init__.py | 2 -- 4 files changed, 14 deletions(-) diff --git a/nova/api/openstack/create_instance_controller.py b/nova/api/openstack/create_instance_controller.py index 613a33b25d..cffd944f73 100644 --- a/nova/api/openstack/create_instance_controller.py +++ b/nova/api/openstack/create_instance_controller.py @@ -76,7 +76,6 @@ class OpenstackCreateInstanceController(object): [instance dicts] vs. reservation_id). So the handling of the return type from this method is left to the caller. """ - print "************************ A" if not body: return (None, faults.Fault(exc.HTTPUnprocessableEntity())) @@ -84,7 +83,6 @@ class OpenstackCreateInstanceController(object): password = self._get_server_admin_password(body['server']) - print "************************ B" key_name = None key_data = None key_pairs = auth_manager.AuthManager.get_key_pairs(context) @@ -93,15 +91,11 @@ class OpenstackCreateInstanceController(object): key_name = key_pair['name'] key_data = key_pair['public_key'] - print "************************ C" image_href = self._image_ref_from_req_data(body) try: - print "************************ Ca" image_service, image_id = nova.image.get_image_service(image_href) - print "************************ Cb" kernel_id, ramdisk_id = self._get_kernel_ramdisk_from_image( req, image_id) - print "************************ Ce" images = set([str(x['id']) for x in image_service.index(context)]) assert str(image_id) in images except Exception, e: @@ -109,7 +103,6 @@ class OpenstackCreateInstanceController(object): locals()) return (None, faults.Fault(exc.HTTPBadRequest(msg))) - print "************************ D" personality = body['server'].get('personality') injected_files = [] @@ -118,7 +111,6 @@ class OpenstackCreateInstanceController(object): flavor_id = self._flavor_id_from_req_data(body) - print "************************ E" if not 'name' in body['server']: msg = _("Server name is not defined") return (None, exc.HTTPBadRequest(msg)) diff --git a/nova/api/openstack/servers.py b/nova/api/openstack/servers.py index 23bb1c8691..387b0343a3 100644 --- a/nova/api/openstack/servers.py +++ b/nova/api/openstack/servers.py @@ -110,14 +110,11 @@ class Controller(base_controller.OpenstackCreateInstanceController): def create(self, req, body): """ Creates a new server for a given user """ - print "************************ 1" extra_values, result = \ self.create_instance(req, body, self.compute_api.create) - print "************************ 2" if extra_values is None: return result # a Fault. - print "************************ 3" instances = result (inst, ) = instances diff --git a/nova/compute/api.py b/nova/compute/api.py index 09ac7a2c64..c7db167c1a 100644 --- a/nova/compute/api.py +++ b/nova/compute/api.py @@ -361,7 +361,6 @@ class API(base.Base): for num in range(num_instances): instance = self.create_db_entry_for_new_instance(context, base_options, security_groups, num=num) - print "*********** INSTANCE = ", instance instances.append(instance) instance_id = instance['id'] diff --git a/nova/image/__init__.py b/nova/image/__init__.py index bde600f704..93d83df249 100644 --- a/nova/image/__init__.py +++ b/nova/image/__init__.py @@ -84,12 +84,10 @@ def get_image_service(image_href): :returns: a tuple of the form (image_service, image_id) """ - print "******** XX" image_href = image_href or 0 if str(image_href).isdigit(): return (get_default_image_service(), int(image_href)) - print "******** X" (glance_client, image_id) = get_glance_client(image_href) image_service = nova.image.glance.GlanceImageService(glance_client) return (image_service, image_id) From 1261d1340631206c8d47c6373ebd783e75f389ac Mon Sep 17 00:00:00 2001 From: Sandy Walsh Date: Fri, 10 Jun 2011 05:27:05 -0700 Subject: [PATCH 31/70] fixed reraise in trap_error --- nova/scheduler/api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nova/scheduler/api.py b/nova/scheduler/api.py index 789993890a..ffe59d2c1e 100644 --- a/nova/scheduler/api.py +++ b/nova/scheduler/api.py @@ -141,7 +141,7 @@ def call_zone_method(context, method_name, errors_to_ignore=None, except Exception as e: if type(e) in errors_to_ignore: return None - raise e + raise res = pool.spawn(_error_trap, *args, **kwargs) results.append((zone, res)) From c2ed9160e9aba986e98a32514cb27ab34be9bf0c Mon Sep 17 00:00:00 2001 From: Sandy Walsh Date: Fri, 10 Jun 2011 09:48:17 -0300 Subject: [PATCH 32/70] source illustrations added & spelling/grammar based on comstud's feedback --- doc/source/devref/distributed_scheduler.rst | 16 ++++++++++------ doc/source/devref/zone.rst | 4 ++-- .../zones_distsched_illustrations.odp | Bin 0 -> 182810 bytes 3 files changed, 12 insertions(+), 8 deletions(-) create mode 100755 doc/source/image_src/zones_distsched_illustrations.odp diff --git a/doc/source/devref/distributed_scheduler.rst b/doc/source/devref/distributed_scheduler.rst index cc9e789167..e33fda4d23 100644 --- a/doc/source/devref/distributed_scheduler.rst +++ b/doc/source/devref/distributed_scheduler.rst @@ -14,10 +14,14 @@ License for the specific language governing permissions and limitations under the License. + Source for illustrations in doc/source/image_src/zone_distsched_illustrations.odp + (OpenOffice Impress format) Illustrations are "exported" to png and then scaled + to 400x300 or 640x480 as needed and placed in the doc/source/images directory. + Distributed Scheduler ===================== -The Scheduler is akin to a Dating Service. Requests for the creation of new instances come in and the most applicable Compute nodes are selected from a large pool of potential candidates. In a small deployment we may be happy with the currently available Change Scheduler which randomly selects a Host from the available pool. Or if you need something a little more fancy you may want to use the Availability Zone Scheduler, which selects Compute hosts from a logical partitioning of available hosts (within a single Zone). +The Scheduler is akin to a Dating Service. Requests for the creation of new instances come in and the most applicable Compute nodes are selected from a large pool of potential candidates. In a small deployment we may be happy with the currently available Chance Scheduler which randomly selects a Host from the available pool. Or if you need something a little more fancy you may want to use the Availability Zone Scheduler, which selects Compute hosts from a logical partitioning of available hosts (within a single Zone). .. image:: /images/dating_service.png @@ -27,13 +31,13 @@ This is the purpose of the Distributed Scheduler (DS). The DS utilizes the Capab So, how does this all work? -This document will explain the strategy employed by the `ZoneAwareScheduler` and its derivations. You should read the Zones documentation before reading this. +This document will explain the strategy employed by the `ZoneAwareScheduler` and its derivations. You should read the :doc:`devguide/zones` documentation before reading this. .. image:: /images/zone_aware_scheduler.png Costs & Weights --------------- -When deciding where to place an Instance, we compare a Weighted Cost for each Host. The Weighting, currently, is just the sum of each Cost. Costs are nothing more than integers from `0 - max_int`. Costs are computed by looking at the various Capabilities of the Host relative to the specs of the Instance being asked for. Trying to putting a plain vanilla instance on a high performance host should have a very high cost. But putting a vanilla instance on a vanilla Host should have a low cost. +When deciding where to place an Instance, we compare a Weighted Cost for each Host. The Weighting, currently, is just the sum of each Cost. Costs are nothing more than integers from `0 - max_int`. Costs are computed by looking at the various Capabilities of the Host relative to the specs of the Instance being asked for. Trying to put a plain vanilla instance on a high performance host should have a very high cost. But putting a vanilla instance on a vanilla Host should have a low cost. Some Costs are more esoteric. Consider a rule that says we should prefer Hosts that don't already have an instance on it that is owned by the user requesting it (to mitigate against machine failures). Here we have to look at all the other Instances on the host to compute our cost. @@ -107,7 +111,7 @@ The Catch --------- This all seems pretty straightforward but, like most things, there's a catch. Zones are expected to operate in complete isolation from each other. Each Zone has its own AMQP service, database and set of Nova services. But, for security reasons Zones should never leak information about the architectural layout internally. That means Zones cannot leak information about hostnames or service IP addresses outside of its world. -When `POST /zones/select` is called to estimate which compute node to use, time passes until the `POST /servers` call is issued. If we only passed the weight back from the `select` we would have to re-compute the appropriate compute node for the create command ... and we could end up with a different host. Somehow we need to remember the results of our computations and pass them outside of the Zone. Now, we could store this information in the local database and return a reference to it, but remember that the vast majority of weights are going be ignored. Storing them in the database would result in a flood of disk access and then we have to clean up all these entries periodically. Recall that there are going to be many many `select` calls issued to child Zones asking for estimates. +When `POST /zones/select` is called to estimate which compute node to use, time passes until the `POST /servers` call is issued. If we only passed the weight back from the `select` we would have to re-compute the appropriate compute node for the create command ... and we could end up with a different host. Somehow we need to remember the results of our computations and pass them outside of the Zone. Now, we could store this information in the local database and return a reference to it, but remember that the vast majority of weights are going to be ignored. Storing them in the database would result in a flood of disk access and then we have to clean up all these entries periodically. Recall that there are going to be many many `select` calls issued to child Zones asking for estimates. Instead, we take a rather innovative approach to the problem. We encrypt all the child zone internal details and pass them back the to parent Zone. If the parent zone decides to use a child Zone for the instance it simply passes the encrypted data back to the child during the `POST /servers` call as an extra parameter. The child Zone can then decrypt the hint and go directly to the Compute node previously selected. If the estimate isn't used, it is simply discarded by the parent. It's for this reason that it is so important that each Zone defines a unique encryption key via `--build_plan_encryption_key` @@ -122,7 +126,7 @@ NOTE: The features described in this section are related to the up-coming 'merge The OpenStack API allows a user to list all the instances they own via the `GET /servers/` command or the details on a particular instance via `GET /servers/###`. This mechanism is usually sufficient since OS API only allows for creating one instance at a time, unlike the EC2 API which allows you to specify a quantity of instances to be created. -NOTE: currently the `GET /servers` command is not Zone-aware since all operations done in child Zones are done via a single administrative account. Therefore, asking a child Zone to `GET /servers` would return all the active instances ... and that would be what the user intended. Later, when the Keystone Auth system is integrated with Nova, this functionality will be enabled. +NOTE: currently the `GET /servers` command is not Zone-aware since all operations done in child Zones are done via a single administrative account. Therefore, asking a child Zone to `GET /servers` would return all the active instances ... and that would not be what the user intended. Later, when the Keystone Auth system is integrated with Nova, this functionality will be enabled. We could use the OS API 1.1 Extensions mechanism to accept a `num_instances` parameter, but this would result in a different return code. Instead of getting back an `Instance` record, we would be getting back a `reservation_id`. So, instead, we've implemented a new command `POST /zones/boot` command which is nearly identical to `POST /servers` except that it takes a `num_instances` parameter and returns a `reservation_id`. Perhaps in OS API 2.x we can unify these approaches. @@ -149,7 +153,7 @@ Every `ZoneAwareScheduler` derivation must also override the `weigh_hosts` metho Simple Zone Aware Scheduling ---------------------------- -The easiest way to get started with the `ZoneAwareScheduler` is to use the `nova.scheduler.host_filter.HostFilterScheduler`. This scheduler uses the default Host Filter as and the `weight_hosts` method simply returns a weight of 1 for all hosts. But, from this, you can see calls being routed from Zone to Zone and follow the flow of things. +The easiest way to get started with the `ZoneAwareScheduler` is to use the `nova.scheduler.host_filter.HostFilterScheduler`. This scheduler uses the default Host Filter and the `weight_hosts` method simply returns a weight of 1 for all hosts. But, from this, you can see calls being routed from Zone to Zone and follow the flow of things. The `--scheduler_driver` flag is how you specify the scheduler class name. diff --git a/doc/source/devref/zone.rst b/doc/source/devref/zone.rst index 263560ee24..3dc0f80fdd 100644 --- a/doc/source/devref/zone.rst +++ b/doc/source/devref/zone.rst @@ -21,7 +21,7 @@ A Nova deployment is called a Zone. A Zone allows you to partition your deployme The idea behind Zones is, if a particular deployment is not capable of servicing a particular request, the request may be forwarded to (child) Zones for possible processing. Zones may be nested in a tree fashion. -Zones only know about their immediate children, they do not know about their parent Zones and may in fact have more than one parent. Likewise, a Zone's children may themselves have child Zones. +Zones only know about their immediate children, they do not know about their parent Zones and may in fact have more than one parent. Likewise, a Zone's children may themselves have child Zones and, in those cases, the grandchild's internal structure would not be known to the grand-parent. Zones share nothing. They communicate via the public OpenStack API only. No database, queue, user or project definition is shared between Zones. @@ -99,7 +99,7 @@ You can get the `child zone api url`, `nova api key` and `username` from the `no export NOVA_URL="http://192.168.2.120:8774/v1.0/" -This equates to a POST operation to `.../zones/` to add a new zone. No connection attempt to the child zone is done when this command. It only puts an entry in the db at this point. After about 30 seconds the `ZoneManager` in the Scheduler services will attempt to talk to the child zone and get its information. +This equates to a POST operation to `.../zones/` to add a new zone. No connection attempt to the child zone is done with this command. It only puts an entry in the db at this point. After about 30 seconds the `ZoneManager` in the Scheduler services will attempt to talk to the child zone and get its information. Getting a list of child Zones ----------------------------- diff --git a/doc/source/image_src/zones_distsched_illustrations.odp b/doc/source/image_src/zones_distsched_illustrations.odp new file mode 100755 index 0000000000000000000000000000000000000000..8762a183b4ab5e3aee7d340656087b21be248164 GIT binary patch literal 182810 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�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

%1XZ^1GbB^RnHS9q(ld;7eM%){`%q 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

bYh*uo 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 Date: Fri, 10 Jun 2011 10:24:24 -0700 Subject: [PATCH 33/70] style change --- nova/tests/test_cloud.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/nova/tests/test_cloud.py b/nova/tests/test_cloud.py index 7cb13c9195..c8313a5d3a 100644 --- a/nova/tests/test_cloud.py +++ b/nova/tests/test_cloud.py @@ -123,7 +123,8 @@ class CloudTestCase(test.TestCase): 'host': self.network.host}) self.assertEqual(allocate(self.context)['publicIp'], address) db.floating_ip_destroy(self.context, address) - self.assertRaises(exception.NoFloatingIpsDefined, allocate, + self.assertRaises(exception.NoFloatingIpsDefined, + allocate, self.context) def test_associate_disassociate_address(self): From a86523d5ae17b4e5507b14fade0a87c5434f2cac Mon Sep 17 00:00:00 2001 From: Johannes Erdfelt Date: Fri, 10 Jun 2011 17:26:25 +0000 Subject: [PATCH 34/70] Fix copyright year --- .../migrate_repo/versions/023_add_vm_mode_to_instances.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nova/db/sqlalchemy/migrate_repo/versions/023_add_vm_mode_to_instances.py b/nova/db/sqlalchemy/migrate_repo/versions/023_add_vm_mode_to_instances.py index 5b6a25e41b..16b9826d96 100644 --- a/nova/db/sqlalchemy/migrate_repo/versions/023_add_vm_mode_to_instances.py +++ b/nova/db/sqlalchemy/migrate_repo/versions/023_add_vm_mode_to_instances.py @@ -1,6 +1,6 @@ # vim: tabstop=4 shiftwidth=4 softtabstop=4 -# Copyright 2010 OpenStack LLC. +# Copyright 2011 OpenStack LLC. # # 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 From 0e7a2042cc5922bb014a77080ec0bdb93bbf575c Mon Sep 17 00:00:00 2001 From: John Tran Date: Fri, 10 Jun 2011 10:28:03 -0700 Subject: [PATCH 35/70] raise instance instead of class --- nova/api/ec2/cloud.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nova/api/ec2/cloud.py b/nova/api/ec2/cloud.py index 84a83d8e69..5ed473b731 100644 --- a/nova/api/ec2/cloud.py +++ b/nova/api/ec2/cloud.py @@ -878,7 +878,7 @@ class CloudController(object): return {'publicIp': public_ip} except rpc.RemoteError as ex: if ex.exc_type == 'NoMoreAddresses': - raise exception.NoFloatingIpsDefined + raise exception.NoFloatingIpsDefined() else: raise From 05fecdf873a5c02dcb13c841304df872411d4183 Mon Sep 17 00:00:00 2001 From: John Tran Date: Fri, 10 Jun 2011 11:10:58 -0700 Subject: [PATCH 36/70] added new exception more descriptive of not having available floating addresses avail for allocation --- nova/api/ec2/cloud.py | 2 +- nova/exception.py | 4 ++++ nova/tests/test_cloud.py | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/nova/api/ec2/cloud.py b/nova/api/ec2/cloud.py index 5ed473b731..e1c65ae404 100644 --- a/nova/api/ec2/cloud.py +++ b/nova/api/ec2/cloud.py @@ -878,7 +878,7 @@ class CloudController(object): return {'publicIp': public_ip} except rpc.RemoteError as ex: if ex.exc_type == 'NoMoreAddresses': - raise exception.NoFloatingIpsDefined() + raise exception.NoMoreFloatingIps() else: raise diff --git a/nova/exception.py b/nova/exception.py index 69b3e03597..1571dd0323 100644 --- a/nova/exception.py +++ b/nova/exception.py @@ -376,6 +376,10 @@ class NoFloatingIpsDefinedForInstance(NoFloatingIpsDefined): message = _("Zero floating ips defined for instance %(instance_id)s.") +class NoMoreFloatingIps(NotFound): + message = _("Zero floating ips available.") + + class KeypairNotFound(NotFound): message = _("Keypair %(keypair_name)s not found for user %(user_id)s") diff --git a/nova/tests/test_cloud.py b/nova/tests/test_cloud.py index c8313a5d3a..13046f8614 100644 --- a/nova/tests/test_cloud.py +++ b/nova/tests/test_cloud.py @@ -123,7 +123,7 @@ class CloudTestCase(test.TestCase): 'host': self.network.host}) self.assertEqual(allocate(self.context)['publicIp'], address) db.floating_ip_destroy(self.context, address) - self.assertRaises(exception.NoFloatingIpsDefined, + self.assertRaises(exception.NoMoreFloatingIps, allocate, self.context) From e986887d513855d5a5fd6ca90998860f67fcb1d3 Mon Sep 17 00:00:00 2001 From: William Wolf Date: Fri, 10 Jun 2011 15:28:17 -0400 Subject: [PATCH 37/70] force utf-8 encoding on toprettyxml call for XMLDictSerializer --- nova/api/openstack/wsgi.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nova/api/openstack/wsgi.py b/nova/api/openstack/wsgi.py index ddf4e6fa9c..6760735c48 100644 --- a/nova/api/openstack/wsgi.py +++ b/nova/api/openstack/wsgi.py @@ -225,7 +225,7 @@ class XMLDictSerializer(DictSerializer): if not xmlns and self.xmlns: node.setAttribute('xmlns', self.xmlns) - return node.toprettyxml(indent=' ') + return node.toprettyxml(indent=' ', encoding='utf-8') def _to_xml_node(self, doc, metadata, nodename, data): """Recursive method to convert data members to XML nodes.""" From 92423564aa24124b0144264d6cd1c57c78eaf5dd Mon Sep 17 00:00:00 2001 From: William Wolf Date: Fri, 10 Jun 2011 16:41:14 -0400 Subject: [PATCH 38/70] return body correctly as object instead of a string, with tests, also check for empty body on requests that need a body --- nova/api/openstack/server_metadata.py | 11 ++++++-- nova/api/openstack/wsgi.py | 4 +++ .../api/openstack/test_server_metadata.py | 25 +++++++++++++++++++ 3 files changed, 38 insertions(+), 2 deletions(-) diff --git a/nova/api/openstack/server_metadata.py b/nova/api/openstack/server_metadata.py index b38b84a2a1..c17d77d46f 100644 --- a/nova/api/openstack/server_metadata.py +++ b/nova/api/openstack/server_metadata.py @@ -37,12 +37,18 @@ class Controller(object): meta_dict[key] = value return dict(metadata=meta_dict) + def _check_body(self, body): + if not body: + expl = _('No Request Body') + raise exc.HTTPBadRequest(explanation=expl) + def index(self, req, server_id): """ Returns the list of metadata for a given instance """ context = req.environ['nova.context'] return self._get_metadata(context, server_id) def create(self, req, server_id, body): + self._check_body(body) context = req.environ['nova.context'] metadata = body.get('metadata') try: @@ -51,9 +57,10 @@ class Controller(object): metadata) except quota.QuotaError as error: self._handle_quota_error(error) - return req.body + return body def update(self, req, server_id, id, body): + self._check_body(body) context = req.environ['nova.context'] if not id in body: expl = _('Request body and URI mismatch') @@ -68,7 +75,7 @@ class Controller(object): except quota.QuotaError as error: self._handle_quota_error(error) - return req.body + return body def show(self, req, server_id, id): """ Return a single metadata item """ diff --git a/nova/api/openstack/wsgi.py b/nova/api/openstack/wsgi.py index ddf4e6fa9c..8c30cdeb92 100644 --- a/nova/api/openstack/wsgi.py +++ b/nova/api/openstack/wsgi.py @@ -348,16 +348,20 @@ class Resource(wsgi.Application): LOG.debug("%(method)s %(url)s" % {"method": request.method, "url": request.url}) + print "CALL" try: action, action_args, accept = self.deserializer.deserialize( request) except exception.InvalidContentType: return webob.exc.HTTPBadRequest(_("Unsupported Content-Type")) + print "CALL2" action_result = self.dispatch(request, action, action_args) + print "ACTION RESULT:", action_result, isinstance(action_result, str) #TODO(bcwaldon): find a more elegant way to pass through non-dict types if type(action_result) is dict: + print "DICT" response = self.serializer.serialize(action_result, accept) else: response = action_result diff --git a/nova/tests/api/openstack/test_server_metadata.py b/nova/tests/api/openstack/test_server_metadata.py index c4d1d4fd81..b583d40fea 100644 --- a/nova/tests/api/openstack/test_server_metadata.py +++ b/nova/tests/api/openstack/test_server_metadata.py @@ -89,6 +89,7 @@ class ServerMetaDataTest(unittest.TestCase): res = req.get_response(fakes.wsgi_app()) res_dict = json.loads(res.body) self.assertEqual(200, res.status_int) + self.assertEqual('application/json', res.headers['Content-Type']) self.assertEqual('value1', res_dict['metadata']['key1']) def test_index_no_data(self): @@ -99,6 +100,7 @@ class ServerMetaDataTest(unittest.TestCase): res = req.get_response(fakes.wsgi_app()) res_dict = json.loads(res.body) self.assertEqual(200, res.status_int) + self.assertEqual('application/json', res.headers['Content-Type']) self.assertEqual(0, len(res_dict['metadata'])) def test_show(self): @@ -109,6 +111,7 @@ class ServerMetaDataTest(unittest.TestCase): res = req.get_response(fakes.wsgi_app()) res_dict = json.loads(res.body) self.assertEqual(200, res.status_int) + self.assertEqual('application/json', res.headers['Content-Type']) self.assertEqual('value5', res_dict['key5']) def test_show_meta_not_found(self): @@ -140,8 +143,19 @@ class ServerMetaDataTest(unittest.TestCase): res = req.get_response(fakes.wsgi_app()) res_dict = json.loads(res.body) self.assertEqual(200, res.status_int) + self.assertEqual('application/json', res.headers['Content-Type']) self.assertEqual('value1', res_dict['metadata']['key1']) + def test_create_empty_body(self): + self.stubs.Set(nova.db.api, 'instance_metadata_update_or_create', + return_create_instance_metadata) + req = webob.Request.blank('/v1.1/servers/1/meta') + req.environ['api.version'] = '1.1' + req.method = 'POST' + req.headers["content-type"] = "application/json" + res = req.get_response(fakes.wsgi_app()) + self.assertEqual(400, res.status_int) + def test_update_item(self): self.stubs.Set(nova.db.api, 'instance_metadata_update_or_create', return_create_instance_metadata) @@ -152,9 +166,20 @@ class ServerMetaDataTest(unittest.TestCase): req.headers["content-type"] = "application/json" res = req.get_response(fakes.wsgi_app()) self.assertEqual(200, res.status_int) + self.assertEqual('application/json', res.headers['Content-Type']) res_dict = json.loads(res.body) self.assertEqual('value1', res_dict['key1']) + def test_update_item_empty_body(self): + self.stubs.Set(nova.db.api, 'instance_metadata_update_or_create', + return_create_instance_metadata) + req = webob.Request.blank('/v1.1/servers/1/meta/key1') + req.environ['api.version'] = '1.1' + req.method = 'PUT' + req.headers["content-type"] = "application/json" + res = req.get_response(fakes.wsgi_app()) + self.assertEqual(400, res.status_int) + def test_update_item_too_many_keys(self): self.stubs.Set(nova.db.api, 'instance_metadata_update_or_create', return_create_instance_metadata) From cbaa94ac255cde729bae3257da6657a114755224 Mon Sep 17 00:00:00 2001 From: William Wolf Date: Fri, 10 Jun 2011 16:43:13 -0400 Subject: [PATCH 39/70] got rid of prints for debugging --- nova/api/openstack/wsgi.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/nova/api/openstack/wsgi.py b/nova/api/openstack/wsgi.py index 8c30cdeb92..ddf4e6fa9c 100644 --- a/nova/api/openstack/wsgi.py +++ b/nova/api/openstack/wsgi.py @@ -348,20 +348,16 @@ class Resource(wsgi.Application): LOG.debug("%(method)s %(url)s" % {"method": request.method, "url": request.url}) - print "CALL" try: action, action_args, accept = self.deserializer.deserialize( request) except exception.InvalidContentType: return webob.exc.HTTPBadRequest(_("Unsupported Content-Type")) - print "CALL2" action_result = self.dispatch(request, action, action_args) - print "ACTION RESULT:", action_result, isinstance(action_result, str) #TODO(bcwaldon): find a more elegant way to pass through non-dict types if type(action_result) is dict: - print "DICT" response = self.serializer.serialize(action_result, accept) else: response = action_result From fbf3f36bd2693ea0570af83a8ff68d433230fa80 Mon Sep 17 00:00:00 2001 From: Soren Hansen Date: Fri, 10 Jun 2011 22:51:57 +0200 Subject: [PATCH 40/70] A recent commit added a couple of directories that don't belong in version control. Remove them again. From 8146b92f7d81eada6408f939ef25cb5393650008 Mon Sep 17 00:00:00 2001 From: Brian Waldon Date: Fri, 10 Jun 2011 18:39:58 -0400 Subject: [PATCH 41/70] adding support for cusom serialization methods --- nova/api/openstack/wsgi.py | 11 +++++++---- nova/tests/api/openstack/test_wsgi.py | 8 ++++---- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/nova/api/openstack/wsgi.py b/nova/api/openstack/wsgi.py index ddf4e6fa9c..e71b80e2c1 100644 --- a/nova/api/openstack/wsgi.py +++ b/nova/api/openstack/wsgi.py @@ -189,7 +189,10 @@ class DictSerializer(object): def serialize(self, data, action='default'): """Find local serialization method and encode response body.""" - action_method = getattr(self, action, self.default) + if action is None: + action_method = self.default + else: + action_method = getattr(self, action, self.default) return action_method(data) def default(self, data): @@ -296,7 +299,7 @@ class ResponseSerializer(object): } self.serializers.update(serializers or {}) - def serialize(self, response_data, content_type): + def serialize(self, response_data, content_type, action='default'): """Serialize a dict into a string and wrap in a wsgi.Request object. :param response_data: dict produced by the Controller @@ -307,7 +310,7 @@ class ResponseSerializer(object): response.headers['Content-Type'] = content_type serializer = self.get_serializer(content_type) - response.body = serializer.serialize(response_data) + response.body = serializer.serialize(response_data, action) return response @@ -358,7 +361,7 @@ class Resource(wsgi.Application): #TODO(bcwaldon): find a more elegant way to pass through non-dict types if type(action_result) is dict: - response = self.serializer.serialize(action_result, accept) + response = self.serializer.serialize(action_result, accept, action) else: response = action_result diff --git a/nova/tests/api/openstack/test_wsgi.py b/nova/tests/api/openstack/test_wsgi.py index ebbdc94090..0329ab2184 100644 --- a/nova/tests/api/openstack/test_wsgi.py +++ b/nova/tests/api/openstack/test_wsgi.py @@ -171,11 +171,11 @@ class XMLDeserializerTest(test.TestCase): class ResponseSerializerTest(test.TestCase): def setUp(self): class JSONSerializer(object): - def serialize(self, data): + def serialize(self, data, action='default'): return 'pew_json' class XMLSerializer(object): - def serialize(self, data): + def serialize(self, data, action='default'): return 'pew_xml' self.serializers = { @@ -211,11 +211,11 @@ class ResponseSerializerTest(test.TestCase): class RequestDeserializerTest(test.TestCase): def setUp(self): class JSONDeserializer(object): - def deserialize(self, data): + def deserialize(self, data, action='default'): return 'pew_json' class XMLDeserializer(object): - def deserialize(self, data): + def deserialize(self, data, action='default'): return 'pew_xml' self.deserializers = { From 73303a34652c738064821ede0258a799435c63d1 Mon Sep 17 00:00:00 2001 From: Dan Prince Date: Sat, 11 Jun 2011 22:12:59 -0400 Subject: [PATCH 42/70] Updated so that we use a 'tmp' subdirectory under the Xen SR when staging migrations. Fixes an issue where you would get a 'File exists' error because the directory under 'images' already existed (created via the rsync copy). --- plugins/xenserver/xenapi/etc/xapi.d/plugins/migration | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/xenserver/xenapi/etc/xapi.d/plugins/migration b/plugins/xenserver/xenapi/etc/xapi.d/plugins/migration index 75c6534087..ac1c50ad9a 100644 --- a/plugins/xenserver/xenapi/etc/xapi.d/plugins/migration +++ b/plugins/xenserver/xenapi/etc/xapi.d/plugins/migration @@ -44,7 +44,7 @@ def move_vhds_into_sr(session, args): new_cow_uuid = params['new_cow_uuid'] sr_path = params['sr_path'] - sr_temp_path = "%s/images/" % sr_path + sr_temp_path = "%s/tmp/" % sr_path # Discover the copied VHDs locally, and then set up paths to copy # them to under the SR From bd31a85575ce53dfa80f414dd359b3bdb2855292 Mon Sep 17 00:00:00 2001 From: William Wolf Date: Mon, 13 Jun 2011 08:53:34 -0400 Subject: [PATCH 43/70] check for none and empty string, this way empty dicts/lists will be ok --- nova/api/openstack/server_metadata.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nova/api/openstack/server_metadata.py b/nova/api/openstack/server_metadata.py index c17d77d46f..57666f6b79 100644 --- a/nova/api/openstack/server_metadata.py +++ b/nova/api/openstack/server_metadata.py @@ -38,7 +38,7 @@ class Controller(object): return dict(metadata=meta_dict) def _check_body(self, body): - if not body: + if body == None or body == "": expl = _('No Request Body') raise exc.HTTPBadRequest(explanation=expl) From 67e11fa809c83f25af9d09eac1bbe1c69a22a311 Mon Sep 17 00:00:00 2001 From: Alex Meade Date: Mon, 13 Jun 2011 10:10:45 -0400 Subject: [PATCH 44/70] fixed bug 796619 --- nova/crypto.py | 3 +- nova/tests/test_crypto.py | 69 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+), 1 deletion(-) diff --git a/nova/crypto.py b/nova/crypto.py index bdc32482ab..8d535f426b 100644 --- a/nova/crypto.py +++ b/nova/crypto.py @@ -176,7 +176,8 @@ def revoke_certs_by_project(project_id): def revoke_certs_by_user_and_project(user_id, project_id): """Revoke certs for user in project.""" admin = context.get_admin_context() - for cert in db.certificate_get_all_by_user(admin, user_id, project_id): + for cert in db.certificate_get_all_by_user_and_project(admin, + user_id, project_id): revoke_cert(cert['project_id'], cert['file_name']) diff --git a/nova/tests/test_crypto.py b/nova/tests/test_crypto.py index 945d787948..1356ec8b88 100644 --- a/nova/tests/test_crypto.py +++ b/nova/tests/test_crypto.py @@ -16,7 +16,10 @@ Tests for Crypto module. """ +import mox + from nova import crypto +from nova import db from nova import test @@ -46,3 +49,69 @@ class SymmetricKeyTestCase(test.TestCase): plain = decrypt(cipher_text) self.assertEquals(plain_text, plain) + + +class RevokeCertsTest(test.TestCase): + + def test_revoke_certs_by_user_and_project(self): + user_id = 'test_user' + project_id = 2 + file_name = 'test_file' + + certificates = [{"user_id": user_id, "project_id": project_id, + "file_name": file_name}] + + self.mox.StubOutWithMock(db, 'certificate_get_all_by_user_and_project') + db.certificate_get_all_by_user_and_project(mox.IgnoreArg(), \ + user_id, project_id).AndReturn(certificates) + + self.mox.StubOutWithMock(crypto, 'revoke_cert') + crypto.revoke_cert(project_id, mox.IgnoreArg()) + + self.mox.ReplayAll() + + crypto.revoke_certs_by_user_and_project(user_id, project_id) + + self.mox.VerifyAll() + + def test_revoke_certs_by_user(self): + user_id = 'test_user' + project_id = 2 + file_name = 'test_file' + + certificates = [{"user_id": user_id, "project_id": project_id, + "file_name": file_name}] + + self.mox.StubOutWithMock(db, 'certificate_get_all_by_user') + db.certificate_get_all_by_user(mox.IgnoreArg(), \ + user_id).AndReturn(certificates) + + self.mox.StubOutWithMock(crypto, 'revoke_cert') + crypto.revoke_cert(project_id, mox.IgnoreArg()) + + self.mox.ReplayAll() + + crypto.revoke_certs_by_user(user_id) + + self.mox.VerifyAll() + + def test_revoke_certs_by_project(self): + user_id = 'test_user' + project_id = 2 + file_name = 'test_file' + + certificates = [{"user_id": user_id, "project_id": project_id, + "file_name": file_name}] + + self.mox.StubOutWithMock(db, 'certificate_get_all_by_project') + db.certificate_get_all_by_project(mox.IgnoreArg(), \ + project_id).AndReturn(certificates) + + self.mox.StubOutWithMock(crypto, 'revoke_cert') + crypto.revoke_cert(project_id, mox.IgnoreArg()) + + self.mox.ReplayAll() + + crypto.revoke_certs_by_project(project_id) + + self.mox.VerifyAll() From db3280e5177df92484bf0a52b5f6ed89dfea63dd Mon Sep 17 00:00:00 2001 From: Sandy Walsh Date: Mon, 13 Jun 2011 09:39:58 -0700 Subject: [PATCH 45/70] zones image_id/image_href support for 1.0/1.1 --- nova/api/openstack/__init__.py | 8 ++++---- .../openstack/create_instance_controller.py | 2 -- nova/api/openstack/servers.py | 2 -- nova/api/openstack/zones.py | 19 +++++++++++-------- 4 files changed, 15 insertions(+), 16 deletions(-) diff --git a/nova/api/openstack/__init__.py b/nova/api/openstack/__init__.py index 4650445d72..e0ae551051 100644 --- a/nova/api/openstack/__init__.py +++ b/nova/api/openstack/__init__.py @@ -81,7 +81,7 @@ class APIRouter(base_wsgi.Router): self._setup_routes(mapper) super(APIRouter, self).__init__(mapper) - def _setup_routes(self, mapper): + def _setup_routes(self, mapper, version='1.0'): server_members = self.server_members server_members['action'] = 'POST' if FLAGS.allow_admin_api: @@ -99,7 +99,7 @@ class APIRouter(base_wsgi.Router): server_members['inject_network_info'] = 'POST' mapper.resource("zone", "zones", - controller=zones.create_resource(), + controller=zones.create_resource(version), collection={'detail': 'GET', 'info': 'GET', 'select': 'POST', @@ -126,7 +126,7 @@ class APIRouterV10(APIRouter): """Define routes specific to OpenStack API V1.0.""" def _setup_routes(self, mapper): - super(APIRouterV10, self)._setup_routes(mapper) + super(APIRouterV10, self)._setup_routes(mapper, version='1.0') mapper.resource("server", "servers", controller=servers.create_resource('1.0'), collection={'detail': 'GET'}, @@ -162,7 +162,7 @@ class APIRouterV11(APIRouter): """Define routes specific to OpenStack API V1.1.""" def _setup_routes(self, mapper): - super(APIRouterV11, self)._setup_routes(mapper) + super(APIRouterV11, self)._setup_routes(mapper, version='1.1') mapper.resource("server", "servers", controller=servers.create_resource('1.1'), collection={'detail': 'GET'}, diff --git a/nova/api/openstack/create_instance_controller.py b/nova/api/openstack/create_instance_controller.py index cffd944f73..2d807470a8 100644 --- a/nova/api/openstack/create_instance_controller.py +++ b/nova/api/openstack/create_instance_controller.py @@ -19,7 +19,6 @@ import base64 import re import webob -from urlparse import urlparse from webob import exc from xml.dom import minidom @@ -31,7 +30,6 @@ from nova import quota from nova import utils from nova.compute import instance_types -from nova.api.openstack import common from nova.api.openstack import faults from nova.api.openstack import wsgi from nova.auth import manager as auth_manager diff --git a/nova/api/openstack/servers.py b/nova/api/openstack/servers.py index 387b0343a3..9799c3dea2 100644 --- a/nova/api/openstack/servers.py +++ b/nova/api/openstack/servers.py @@ -17,7 +17,6 @@ import base64 import traceback from webob import exc -from xml.dom import minidom from nova import compute from nova import exception @@ -32,7 +31,6 @@ import nova.api.openstack.views.flavors import nova.api.openstack.views.images import nova.api.openstack.views.servers from nova.api.openstack import wsgi -from nova.auth import manager as auth_manager import nova.api.openstack from nova.scheduler import api as scheduler_api diff --git a/nova/api/openstack/zones.py b/nova/api/openstack/zones.py index 2508481654..91b063cad1 100644 --- a/nova/api/openstack/zones.py +++ b/nova/api/openstack/zones.py @@ -69,8 +69,9 @@ class Controller(controller.OpenstackCreateInstanceController): doing that (shared with Servers). """ - def __init__(self): + def __init__(self, version): self.compute_api = compute.API() + self.version = version super(Controller, self).__init__() def index(self, req): @@ -160,16 +161,18 @@ class Controller(controller.OpenstackCreateInstanceController): blob=cipher_text)) return cooked - # Assume OS 1.0 functionality for these overrides. - - def _image_id_from_req_data(self, data): - return data['server']['imageId'] + def _image_ref_from_req_data(self, data): + if self.version == '1.0': + return data['server']['imageId'] + return data['server']['imageRef'] def _flavor_id_from_req_data(self, data): - return data['server']['flavorId'] + if self.version == '1.0': + return data['server']['flavorId'] + return data['server']['flavorRef'] -def create_resource(): +def create_resource(version): metadata = { "attributes": { "zone": ["id", "api_url", "name", "capabilities"], @@ -185,5 +188,5 @@ def create_resource(): 'application/xml': controller.ServerXMLDeserializer(), } - return wsgi.Resource(Controller(), serializers=serializers, + return wsgi.Resource(Controller(version), serializers=serializers, deserializers=deserializers) From e7e501a1a77f01247d84fa88275e858a338c6c95 Mon Sep 17 00:00:00 2001 From: Sandy Walsh Date: Mon, 13 Jun 2011 10:59:58 -0700 Subject: [PATCH 46/70] removed yucky None return types --- nova/api/openstack/create_instance_controller.py | 16 ++++++++++++---- nova/api/openstack/servers.py | 11 +++++++---- nova/api/openstack/zones.py | 8 +++++--- 3 files changed, 24 insertions(+), 11 deletions(-) diff --git a/nova/api/openstack/create_instance_controller.py b/nova/api/openstack/create_instance_controller.py index 2d807470a8..90f2542d91 100644 --- a/nova/api/openstack/create_instance_controller.py +++ b/nova/api/openstack/create_instance_controller.py @@ -39,6 +39,14 @@ LOG = logging.getLogger('nova.api.openstack.create_instance_controller') FLAGS = flags.FLAGS +class CreateFault(exception.NovaException): + message = _("Invalid parameters given to create_instance.") + + def __init__(self, fault): + self.fault = fault + super(CreateFault, self).__init__() + + class OpenstackCreateInstanceController(object): """This is the base class for OS API Controllers that are capable of creating instances (currently Servers and Zones). @@ -75,7 +83,7 @@ class OpenstackCreateInstanceController(object): return type from this method is left to the caller. """ if not body: - return (None, faults.Fault(exc.HTTPUnprocessableEntity())) + raise faults.Fault(exc.HTTPUnprocessableEntity()) context = req.environ['nova.context'] @@ -99,7 +107,7 @@ class OpenstackCreateInstanceController(object): except Exception, e: msg = _("Cannot find requested image %(image_href)s: %(e)s" % locals()) - return (None, faults.Fault(exc.HTTPBadRequest(msg))) + raise faults.Fault(exc.HTTPBadRequest(msg)) personality = body['server'].get('personality') @@ -111,7 +119,7 @@ class OpenstackCreateInstanceController(object): if not 'name' in body['server']: msg = _("Server name is not defined") - return (None, exc.HTTPBadRequest(msg)) + raise exc.HTTPBadRequest(msg) zone_blob = body['server'].get('blob') name = body['server']['name'] @@ -150,7 +158,7 @@ class OpenstackCreateInstanceController(object): self._handle_quota_error(error) except exception.ImageNotFound as error: msg = _("Can not find requested image") - return faults.Fault(exc.HTTPBadRequest(msg)) + raise faults.Fault(exc.HTTPBadRequest(msg)) # Let the caller deal with unhandled exceptions. diff --git a/nova/api/openstack/servers.py b/nova/api/openstack/servers.py index 9799c3dea2..1b18c4ecbc 100644 --- a/nova/api/openstack/servers.py +++ b/nova/api/openstack/servers.py @@ -108,10 +108,13 @@ class Controller(base_controller.OpenstackCreateInstanceController): def create(self, req, body): """ Creates a new server for a given user """ - extra_values, result = \ - self.create_instance(req, body, self.compute_api.create) - if extra_values is None: - return result # a Fault. + extra_values = None + result = None + try: + extra_values, result = \ + self.create_instance(req, body, self.compute_api.create) + except faults.Fault, f: + return f instances = result diff --git a/nova/api/openstack/zones.py b/nova/api/openstack/zones.py index 91b063cad1..7ccb8555bb 100644 --- a/nova/api/openstack/zones.py +++ b/nova/api/openstack/zones.py @@ -130,10 +130,12 @@ class Controller(controller.OpenstackCreateInstanceController): Returns a reservation ID (a UUID). """ - extra_values, result = self.create_instance(req, body, + result = None + try: + extra_values, result = self.create_instance(req, body, self.compute_api.create_all_at_once) - if extra_values is None: - return result # a Fault. + except faults.Fault, f: + return f reservation_id = result return {'reservation_id': reservation_id} From f2ca12fc5ea236bb8940acce80065a3bcbe37d2a Mon Sep 17 00:00:00 2001 From: Brian Waldon Date: Mon, 13 Jun 2011 15:03:26 -0400 Subject: [PATCH 47/70] wsgi can now handle dispatching action None more elegantly --- nova/api/openstack/wsgi.py | 13 ++++++------- nova/tests/api/openstack/test_wsgi.py | 13 +++++++++++++ 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/nova/api/openstack/wsgi.py b/nova/api/openstack/wsgi.py index e71b80e2c1..385ae46256 100644 --- a/nova/api/openstack/wsgi.py +++ b/nova/api/openstack/wsgi.py @@ -60,8 +60,9 @@ class TextDeserializer(object): def deserialize(self, datastring, action='default'): """Find local deserialization method and parse request body.""" - action_method = getattr(self, action, self.default) - return action_method(datastring) + action_method = getattr(self, str(action), self.default) + output = action_method(datastring) + return output def default(self, datastring): """Default deserialization code should live here""" @@ -189,11 +190,9 @@ class DictSerializer(object): def serialize(self, data, action='default'): """Find local serialization method and encode response body.""" - if action is None: - action_method = self.default - else: - action_method = getattr(self, action, self.default) - return action_method(data) + action_method = getattr(self, str(action), self.default) + output = action_method(data) + return output def default(self, data): """Default serialization code should live here""" diff --git a/nova/tests/api/openstack/test_wsgi.py b/nova/tests/api/openstack/test_wsgi.py index 0329ab2184..5ec7712dd2 100644 --- a/nova/tests/api/openstack/test_wsgi.py +++ b/nova/tests/api/openstack/test_wsgi.py @@ -89,6 +89,13 @@ class DictSerializerTest(test.TestCase): serializer.default = lambda x: 'trousers' self.assertEqual(serializer.serialize({}, 'update'), 'trousers') + def test_dispatch_action_None(self): + serializer = wsgi.DictSerializer() + serializer.create = lambda x: 'pants' + serializer.default = lambda x: 'trousers' + self.assertEqual(serializer.serialize({}, None), 'trousers') + + class XMLDictSerializerTest(test.TestCase): def test_xml(self): @@ -123,6 +130,12 @@ class TextDeserializerTest(test.TestCase): deserializer.default = lambda x: 'trousers' self.assertEqual(deserializer.deserialize({}, 'update'), 'trousers') + def test_dispatch_action_None(self): + deserializer = wsgi.TextDeserializer() + deserializer.create = lambda x: 'pants' + deserializer.default = lambda x: 'trousers' + self.assertEqual(deserializer.deserialize({}, None), 'trousers') + class JSONDeserializerTest(test.TestCase): def test_json(self): From 83df6e50fa90620dd7510e1a06d9128d4de7cb29 Mon Sep 17 00:00:00 2001 From: Brian Waldon Date: Mon, 13 Jun 2011 15:08:00 -0400 Subject: [PATCH 48/70] removing unnecessary lines --- nova/api/openstack/wsgi.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/nova/api/openstack/wsgi.py b/nova/api/openstack/wsgi.py index 385ae46256..6cb73d8bf9 100644 --- a/nova/api/openstack/wsgi.py +++ b/nova/api/openstack/wsgi.py @@ -61,8 +61,7 @@ class TextDeserializer(object): def deserialize(self, datastring, action='default'): """Find local deserialization method and parse request body.""" action_method = getattr(self, str(action), self.default) - output = action_method(datastring) - return output + return action_method(datastring) def default(self, datastring): """Default deserialization code should live here""" @@ -191,8 +190,7 @@ class DictSerializer(object): def serialize(self, data, action='default'): """Find local serialization method and encode response body.""" action_method = getattr(self, str(action), self.default) - output = action_method(data) - return output + return action_method(data) def default(self, data): """Default serialization code should live here""" From bdfded59fda6716adbbcf981a45d1ed90aa23f89 Mon Sep 17 00:00:00 2001 From: Alex Meade Date: Mon, 13 Jun 2011 15:18:55 -0400 Subject: [PATCH 49/70] Improved tests --- nova/tests/test_crypto.py | 46 +++++++++++++++++++++++++-------------- 1 file changed, 30 insertions(+), 16 deletions(-) diff --git a/nova/tests/test_crypto.py b/nova/tests/test_crypto.py index 1356ec8b88..8eaef32937 100644 --- a/nova/tests/test_crypto.py +++ b/nova/tests/test_crypto.py @@ -17,6 +17,7 @@ Tests for Crypto module. """ import mox +import stubout from nova import crypto from nova import db @@ -53,20 +54,31 @@ class SymmetricKeyTestCase(test.TestCase): class RevokeCertsTest(test.TestCase): + def setUp(self): + super(RevokeCertsTest, self).setUp() + self.stubs = stubout.StubOutForTesting() + + def tearDown(self): + self.stubs.UnsetAll() + super(RevokeCertsTest, self).tearDown() + def test_revoke_certs_by_user_and_project(self): user_id = 'test_user' project_id = 2 file_name = 'test_file' - certificates = [{"user_id": user_id, "project_id": project_id, - "file_name": file_name}] + def mock_certificate_get_all_by_user_and_project(context, + user_id, + project_id): - self.mox.StubOutWithMock(db, 'certificate_get_all_by_user_and_project') - db.certificate_get_all_by_user_and_project(mox.IgnoreArg(), \ - user_id, project_id).AndReturn(certificates) + return [{"user_id": user_id, "project_id": project_id, + "file_name": file_name}] + + self.stubs.Set(db, 'certificate_get_all_by_user_and_project', + mock_certificate_get_all_by_user_and_project) self.mox.StubOutWithMock(crypto, 'revoke_cert') - crypto.revoke_cert(project_id, mox.IgnoreArg()) + crypto.revoke_cert(project_id, file_name) self.mox.ReplayAll() @@ -79,12 +91,13 @@ class RevokeCertsTest(test.TestCase): project_id = 2 file_name = 'test_file' - certificates = [{"user_id": user_id, "project_id": project_id, - "file_name": file_name}] + def mock_certificate_get_all_by_user(context, user_id): - self.mox.StubOutWithMock(db, 'certificate_get_all_by_user') - db.certificate_get_all_by_user(mox.IgnoreArg(), \ - user_id).AndReturn(certificates) + return [{"user_id": user_id, "project_id": project_id, + "file_name": file_name}] + + self.stubs.Set(db, 'certificate_get_all_by_user', + mock_certificate_get_all_by_user) self.mox.StubOutWithMock(crypto, 'revoke_cert') crypto.revoke_cert(project_id, mox.IgnoreArg()) @@ -100,12 +113,13 @@ class RevokeCertsTest(test.TestCase): project_id = 2 file_name = 'test_file' - certificates = [{"user_id": user_id, "project_id": project_id, - "file_name": file_name}] + def mock_certificate_get_all_by_project(context, project_id): - self.mox.StubOutWithMock(db, 'certificate_get_all_by_project') - db.certificate_get_all_by_project(mox.IgnoreArg(), \ - project_id).AndReturn(certificates) + return [{"user_id": user_id, "project_id": project_id, + "file_name": file_name}] + + self.stubs.Set(db, 'certificate_get_all_by_project', + mock_certificate_get_all_by_project) self.mox.StubOutWithMock(crypto, 'revoke_cert') crypto.revoke_cert(project_id, mox.IgnoreArg()) From 431b9d52f2eb325c8be90d45d102c9e238d02325 Mon Sep 17 00:00:00 2001 From: Alex Meade Date: Mon, 13 Jun 2011 15:24:02 -0400 Subject: [PATCH 50/70] pep8 --- nova/tests/test_crypto.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/nova/tests/test_crypto.py b/nova/tests/test_crypto.py index 8eaef32937..6c25b396e4 100644 --- a/nova/tests/test_crypto.py +++ b/nova/tests/test_crypto.py @@ -67,15 +67,15 @@ class RevokeCertsTest(test.TestCase): project_id = 2 file_name = 'test_file' - def mock_certificate_get_all_by_user_and_project(context, + def mock_certificate_get_all_by_user_and_project(context, user_id, project_id): - return [{"user_id": user_id, "project_id": project_id, + return [{"user_id": user_id, "project_id": project_id, "file_name": file_name}] - self.stubs.Set(db, 'certificate_get_all_by_user_and_project', - mock_certificate_get_all_by_user_and_project) + self.stubs.Set(db, 'certificate_get_all_by_user_and_project', + mock_certificate_get_all_by_user_and_project) self.mox.StubOutWithMock(crypto, 'revoke_cert') crypto.revoke_cert(project_id, file_name) @@ -91,12 +91,12 @@ class RevokeCertsTest(test.TestCase): project_id = 2 file_name = 'test_file' - def mock_certificate_get_all_by_user(context, user_id): + def mock_certificate_get_all_by_user(context, user_id): - return [{"user_id": user_id, "project_id": project_id, + return [{"user_id": user_id, "project_id": project_id, "file_name": file_name}] - self.stubs.Set(db, 'certificate_get_all_by_user', + self.stubs.Set(db, 'certificate_get_all_by_user', mock_certificate_get_all_by_user) self.mox.StubOutWithMock(crypto, 'revoke_cert') @@ -115,10 +115,10 @@ class RevokeCertsTest(test.TestCase): def mock_certificate_get_all_by_project(context, project_id): - return [{"user_id": user_id, "project_id": project_id, + return [{"user_id": user_id, "project_id": project_id, "file_name": file_name}] - self.stubs.Set(db, 'certificate_get_all_by_project', + self.stubs.Set(db, 'certificate_get_all_by_project', mock_certificate_get_all_by_project) self.mox.StubOutWithMock(crypto, 'revoke_cert') From bebeaa6b0bf69c0a4017d429e79174401df28550 Mon Sep 17 00:00:00 2001 From: Josh Kearney Date: Mon, 13 Jun 2011 15:20:43 -0500 Subject: [PATCH 51/70] Removed clocksource=jiffies from PV_args. --- nova/tests/test_xenapi.py | 2 +- nova/virt/xenapi/vm_utils.py | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/nova/tests/test_xenapi.py b/nova/tests/test_xenapi.py index 3a175b106b..d1c88287a1 100644 --- a/nova/tests/test_xenapi.py +++ b/nova/tests/test_xenapi.py @@ -331,7 +331,7 @@ class XenAPIVMTestCase(test.TestCase): def check_vm_params_for_linux(self): self.assertEquals(self.vm['platform']['nx'], 'false') - self.assertEquals(self.vm['PV_args'], 'clocksource=jiffies') + self.assertEquals(self.vm['PV_args'], '') self.assertEquals(self.vm['PV_bootloader'], 'pygrub') # check that these are not set diff --git a/nova/virt/xenapi/vm_utils.py b/nova/virt/xenapi/vm_utils.py index b9d4346e41..11da221f2d 100644 --- a/nova/virt/xenapi/vm_utils.py +++ b/nova/virt/xenapi/vm_utils.py @@ -157,7 +157,6 @@ class VMHelper(HelperBase): rec['PV_ramdisk'] = ramdisk else: # 2. Use kernel within the image - rec['PV_args'] = 'clocksource=jiffies' rec['PV_bootloader'] = 'pygrub' else: # 3. Using hardware virtualization From d9c2a7112ba239fb64ecc76ce844caed9146a5dc Mon Sep 17 00:00:00 2001 From: Johannes Erdfelt Date: Mon, 13 Jun 2011 20:46:25 +0000 Subject: [PATCH 52/70] Load table schema automatically instead of stubbing out --- .../migrate_repo/versions/023_add_vm_mode_to_instances.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/nova/db/sqlalchemy/migrate_repo/versions/023_add_vm_mode_to_instances.py b/nova/db/sqlalchemy/migrate_repo/versions/023_add_vm_mode_to_instances.py index 16b9826d96..2f7bfddcb3 100644 --- a/nova/db/sqlalchemy/migrate_repo/versions/023_add_vm_mode_to_instances.py +++ b/nova/db/sqlalchemy/migrate_repo/versions/023_add_vm_mode_to_instances.py @@ -18,9 +18,7 @@ from sqlalchemy import Column, Integer, MetaData, String, Table meta = MetaData() -instances = Table('instances', meta, - Column('id', Integer(), primary_key=True, nullable=False), - ) +instances = Table('instances', meta, autoload=True) instances_vm_mode = Column('vm_mode', String(length=255, convert_unicode=False, From f3381ee03355d8800d229efb7f799df9e6c915e2 Mon Sep 17 00:00:00 2001 From: Alex Meade Date: Mon, 13 Jun 2011 21:14:26 -0400 Subject: [PATCH 53/70] pep8 --- nova/api/openstack/limits.py | 2 +- nova/compute/api.py | 2 +- nova/tests/scheduler/test_host_filter.py | 8 ++++---- nova/tests/scheduler/test_least_cost_scheduler.py | 8 ++++---- nova/tests/scheduler/test_zone_aware_scheduler.py | 2 +- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/nova/api/openstack/limits.py b/nova/api/openstack/limits.py index dc2bc6bbc9..fede96e33e 100644 --- a/nova/api/openstack/limits.py +++ b/nova/api/openstack/limits.py @@ -99,7 +99,7 @@ def create_resource(version='1.0'): serializers = { 'application/xml': wsgi.XMLDictSerializer(xmlns=xmlns, - metadata=metadata) + metadata=metadata), } return wsgi.Resource(controller, serializers=serializers) diff --git a/nova/compute/api.py b/nova/compute/api.py index b0949a7294..5afc0480aa 100644 --- a/nova/compute/api.py +++ b/nova/compute/api.py @@ -281,7 +281,7 @@ class API(base.Base): 'instance_type': instance_type, 'filter': filter_class, 'blob': zone_blob, - 'num_instances': num_instances + 'num_instances': num_instances, } rpc.cast(context, diff --git a/nova/tests/scheduler/test_host_filter.py b/nova/tests/scheduler/test_host_filter.py index 07817cc5a3..10eafde082 100644 --- a/nova/tests/scheduler/test_host_filter.py +++ b/nova/tests/scheduler/test_host_filter.py @@ -133,11 +133,11 @@ class HostFilterTestCase(test.TestCase): raw = ['or', ['and', ['<', '$compute.host_memory_free', 30], - ['<', '$compute.disk_available', 300] + ['<', '$compute.disk_available', 300], ], ['and', ['>', '$compute.host_memory_free', 70], - ['>', '$compute.disk_available', 700] + ['>', '$compute.disk_available', 700], ] ] cooked = json.dumps(raw) @@ -183,12 +183,12 @@ class HostFilterTestCase(test.TestCase): self.assertTrue(hf.filter_hosts(self.zone_manager, json.dumps([]))) self.assertTrue(hf.filter_hosts(self.zone_manager, json.dumps({}))) self.assertTrue(hf.filter_hosts(self.zone_manager, json.dumps( - ['not', True, False, True, False] + ['not', True, False, True, False], ))) try: hf.filter_hosts(self.zone_manager, json.dumps( - 'not', True, False, True, False + 'not', True, False, True, False, )) self.fail("Should give KeyError") except KeyError, e: diff --git a/nova/tests/scheduler/test_least_cost_scheduler.py b/nova/tests/scheduler/test_least_cost_scheduler.py index 506fa62fbd..9a5318aee9 100644 --- a/nova/tests/scheduler/test_least_cost_scheduler.py +++ b/nova/tests/scheduler/test_least_cost_scheduler.py @@ -44,7 +44,7 @@ class WeightedSumTestCase(test.TestCase): hosts = [ FakeHost(1, 512 * MB, 100), FakeHost(2, 256 * MB, 400), - FakeHost(3, 512 * MB, 100) + FakeHost(3, 512 * MB, 100), ] weighted_fns = [ @@ -96,7 +96,7 @@ class LeastCostSchedulerTestCase(test.TestCase): def test_noop_cost_fn(self): FLAGS.least_cost_scheduler_cost_functions = [ - 'nova.scheduler.least_cost.noop_cost_fn' + 'nova.scheduler.least_cost.noop_cost_fn', ] FLAGS.noop_cost_fn_weight = 1 @@ -110,7 +110,7 @@ class LeastCostSchedulerTestCase(test.TestCase): def test_cost_fn_weights(self): FLAGS.least_cost_scheduler_cost_functions = [ - 'nova.scheduler.least_cost.noop_cost_fn' + 'nova.scheduler.least_cost.noop_cost_fn', ] FLAGS.noop_cost_fn_weight = 2 @@ -124,7 +124,7 @@ class LeastCostSchedulerTestCase(test.TestCase): def test_fill_first_cost_fn(self): FLAGS.least_cost_scheduler_cost_functions = [ - 'nova.scheduler.least_cost.fill_first_cost_fn' + 'nova.scheduler.least_cost.fill_first_cost_fn', ] FLAGS.fill_first_cost_fn_weight = 1 diff --git a/nova/tests/scheduler/test_zone_aware_scheduler.py b/nova/tests/scheduler/test_zone_aware_scheduler.py index 9f70b9dbc4..37c6488ccb 100644 --- a/nova/tests/scheduler/test_zone_aware_scheduler.py +++ b/nova/tests/scheduler/test_zone_aware_scheduler.py @@ -201,7 +201,7 @@ class ZoneAwareSchedulerTestCase(test.TestCase): 'instance_properties': {}, 'instance_type': {}, 'filter_driver': 'nova.scheduler.host_filter.AllHostsFilter', - 'blob': "Non-None blob data" + 'blob': "Non-None blob data", } result = sched.schedule_run_instance(None, 1, request_spec) From 00071a6e0bd9bf70d7e7afd1656fea39d5149e68 Mon Sep 17 00:00:00 2001 From: Rick Harris Date: Tue, 14 Jun 2011 01:21:08 +0000 Subject: [PATCH 54/70] Adds --show-elapsed option for run_tests --- run_tests.py | 82 ++++++++++++++++++++++++++++++++++++++++------------ run_tests.sh | 1 + 2 files changed, 64 insertions(+), 19 deletions(-) diff --git a/run_tests.py b/run_tests.py index d5d8acd162..ace916535b 100644 --- a/run_tests.py +++ b/run_tests.py @@ -56,9 +56,11 @@ To run a single test module: """ import gettext +import heapq import os import unittest import sys +import time gettext.install('nova', unicode=1) @@ -185,7 +187,10 @@ class _NullColorizer(object): class NovaTestResult(result.TextTestResult): def __init__(self, *args, **kw): + self.show_elapsed = kw.pop('show_elapsed') result.TextTestResult.__init__(self, *args, **kw) + self.num_slow_tests = 5 + self.slow_tests = [] # this is a fixed-sized heap self._last_case = None self.colorizer = None # NOTE(vish): reset stdout for the terminal check @@ -200,25 +205,48 @@ class NovaTestResult(result.TextTestResult): def getDescription(self, test): return str(test) + def _handleElapsedTime(self, test): + self.elapsed_time = time.time() - self.start_time + item = (self.elapsed_time, test) + # Record only the n-slowest tests using heap + if len(self.slow_tests) >= self.num_slow_tests: + heapq.heappushpop(self.slow_tests, item) + else: + heapq.heappush(self.slow_tests, item) + + def _writeElapsedTime(self, test): + if self.elapsed_time >= 3.0: + color = 'red' + elif self.elapsed_time >= 1.0: + color = 'yellow' + else: + color = 'green' + + self.stream.write(' ' * 10) + self.colorizer.write("%.2f" % self.elapsed_time, color) + self.stream.write(' secs') + + def _writeResult(self, test, long_result, color, short_result): + if self.showAll: + self.colorizer.write(long_result, color) + if self.show_elapsed: + self._writeElapsedTime(test) + self.stream.writeln() + elif self.dots: + self.stream.write(short_result) + self.stream.flush() + # NOTE(vish): copied from unittest with edit to add color def addSuccess(self, test): unittest.TestResult.addSuccess(self, test) - if self.showAll: - self.colorizer.write("OK", 'green') - self.stream.writeln() - elif self.dots: - self.stream.write('.') - self.stream.flush() + self._handleElapsedTime(test) + self._writeResult(test, 'OK', 'green', '.') # NOTE(vish): copied from unittest with edit to add color def addFailure(self, test, err): unittest.TestResult.addFailure(self, test, err) - if self.showAll: - self.colorizer.write("FAIL", 'red') - self.stream.writeln() - elif self.dots: - self.stream.write('F') - self.stream.flush() + self._handleElapsedTime(test) + self._writeResult(test, 'FAIL', 'red', 'F') # NOTE(vish): copied from nose with edit to add color def addError(self, test, err): @@ -226,6 +254,7 @@ class NovaTestResult(result.TextTestResult): errorClasses. If the exception is a registered class, the error will be added to the list for that class, not errors. """ + self._handleElapsedTime(test) stream = getattr(self, 'stream', None) ec, ev, tb = err try: @@ -252,14 +281,11 @@ class NovaTestResult(result.TextTestResult): self.errors.append((test, exc_info)) test.passed = False if stream is not None: - if self.showAll: - self.colorizer.write("ERROR", 'red') - self.stream.writeln() - elif self.dots: - stream.write('E') + self._writeResult(test, 'ERROR', 'red', 'E') def startTest(self, test): unittest.TestResult.startTest(self, test) + self.start_time = time.time() current_case = test.test.__class__.__name__ if self.showAll: @@ -273,21 +299,38 @@ class NovaTestResult(result.TextTestResult): class NovaTestRunner(core.TextTestRunner): + def __init__(self, *args, **kwargs): + self.show_elapsed = kwargs.pop('show_elapsed') + core.TextTestRunner.__init__(self, *args, **kwargs) + def _makeResult(self): return NovaTestResult(self.stream, self.descriptions, self.verbosity, - self.config) + self.config, + show_elapsed=self.show_elapsed) + + def run(self, test): + result_ = core.TextTestRunner.run(self, test) + if self.show_elapsed: + self.stream.writeln("Slowest %i tests:" % result_.num_slow_tests) + for elapsed_time, test in reversed(sorted(result_.slow_tests)): + time_str = "%.2f secs" % elapsed_time + self.stream.writeln(" %s %s" % (time_str.ljust(10), test)) + return result_ if __name__ == '__main__': logging.setup() # If any argument looks like a test name but doesn't have "nova.tests" in # front of it, automatically add that so we don't have to type as much + show_elapsed = False argv = [] for x in sys.argv: if x.startswith('test_'): argv.append('nova.tests.%s' % x) + elif x.startswith('--show-elapsed'): + show_elapsed = True else: argv.append(x) @@ -300,5 +343,6 @@ if __name__ == '__main__': runner = NovaTestRunner(stream=c.stream, verbosity=c.verbosity, - config=c) + config=c, + show_elapsed=show_elapsed) sys.exit(not core.run(config=c, testRunner=runner, argv=argv)) diff --git a/run_tests.sh b/run_tests.sh index c7bcd5d67a..5fc4060351 100755 --- a/run_tests.sh +++ b/run_tests.sh @@ -10,6 +10,7 @@ function usage { echo " -f, --force Force a clean re-build of the virtual environment. Useful when dependencies have been added." echo " -p, --pep8 Just run pep8" echo " -h, --help Print this usage message" + echo " --show-elapsed Print elapsed time for tests along with slowest tests" echo "" echo "Note: with no options specified, the script will try to run the tests in a virtual environment," echo " If no virtualenv is found, the script will ask if you would like to create one. If you " From a3ddb45464204464c93b1deb692414c44ce99376 Mon Sep 17 00:00:00 2001 From: Alex Meade Date: Tue, 14 Jun 2011 10:16:51 -0400 Subject: [PATCH 55/70] Created new exception for handling malformed requests Wrote tests Raise httpBadRequest on malformed request bodies --- nova/api/openstack/wsgi.py | 16 +++++++++++++--- nova/exception.py | 4 ++++ nova/tests/api/openstack/test_api.py | 21 +++++++++++++++++++++ 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/nova/api/openstack/wsgi.py b/nova/api/openstack/wsgi.py index b0e2cab2c2..7f17471c47 100644 --- a/nova/api/openstack/wsgi.py +++ b/nova/api/openstack/wsgi.py @@ -2,6 +2,7 @@ import json import webob from xml.dom import minidom +from xml.parsers.expat import ExpatError from nova import exception from nova import log as logging @@ -71,7 +72,10 @@ class TextDeserializer(object): class JSONDeserializer(TextDeserializer): def default(self, datastring): - return utils.loads(datastring) + try: + return utils.loads(datastring) + except ValueError: + raise exception.MalformedRequestBody() class XMLDeserializer(TextDeserializer): @@ -86,8 +90,12 @@ class XMLDeserializer(TextDeserializer): def default(self, datastring): plurals = set(self.metadata.get('plurals', {})) - node = minidom.parseString(datastring).childNodes[0] - return {node.nodeName: self._from_xml_node(node, plurals)} + + try: + node = minidom.parseString(datastring).childNodes[0] + return {node.nodeName: self._from_xml_node(node, plurals)} + except ExpatError: + raise exception.MalformedRequestBody() def _from_xml_node(self, node, listnames): """Convert a minidom node to a simple Python type. @@ -353,6 +361,8 @@ class Resource(wsgi.Application): request) except exception.InvalidContentType: return webob.exc.HTTPBadRequest(_("Unsupported Content-Type")) + except exception.MalformedRequestBody: + return webob.exc.HTTPBadRequest(_("Malformed request")) action_result = self.dispatch(request, action, action_args) diff --git a/nova/exception.py b/nova/exception.py index 1571dd0323..ffd88fbe79 100644 --- a/nova/exception.py +++ b/nova/exception.py @@ -585,3 +585,7 @@ class InstanceExists(Duplicate): class MigrationError(NovaException): message = _("Migration error") + ": %(reason)s" + + +class MalformedRequestBody(NovaException): + message = _("Malformed message body") + ": %(reason)s" diff --git a/nova/tests/api/openstack/test_api.py b/nova/tests/api/openstack/test_api.py index c63431a455..7321c329f4 100644 --- a/nova/tests/api/openstack/test_api.py +++ b/nova/tests/api/openstack/test_api.py @@ -15,6 +15,8 @@ # License for the specific language governing permissions and limitations # under the License. +import json + import webob.exc import webob.dec @@ -23,6 +25,7 @@ from webob import Request from nova import test from nova.api import openstack from nova.api.openstack import faults +from nova.tests.api.openstack import fakes class APITest(test.TestCase): @@ -31,6 +34,24 @@ class APITest(test.TestCase): # simpler version of the app than fakes.wsgi_app return openstack.FaultWrapper(inner_app) + def test_malformed_json(self): + req = webob.Request.blank('/') + req.method = 'POST' + req.body = '{' + req.headers["content-type"] = "application/json" + + res = req.get_response(fakes.wsgi_app()) + self.assertEqual(res.status_int, 400) + + def test_malformed_xml(self): + req = webob.Request.blank('/') + req.method = 'POST' + req.body = '' + req.headers["content-type"] = "application/xml" + + res = req.get_response(fakes.wsgi_app()) + self.assertEqual(res.status_int, 400) + def test_exceptions_are_converted_to_faults(self): @webob.dec.wsgify From 70bb9494639ec26f12b71dc22052d3e5b343890f Mon Sep 17 00:00:00 2001 From: Johannes Erdfelt Date: Tue, 14 Jun 2011 15:36:07 +0000 Subject: [PATCH 56/70] autoload with the appropriate engine during upgrade/downgrade --- .../migrate_repo/versions/023_add_vm_mode_to_instances.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/nova/db/sqlalchemy/migrate_repo/versions/023_add_vm_mode_to_instances.py b/nova/db/sqlalchemy/migrate_repo/versions/023_add_vm_mode_to_instances.py index 2f7bfddcb3..0c587f5693 100644 --- a/nova/db/sqlalchemy/migrate_repo/versions/023_add_vm_mode_to_instances.py +++ b/nova/db/sqlalchemy/migrate_repo/versions/023_add_vm_mode_to_instances.py @@ -18,8 +18,6 @@ from sqlalchemy import Column, Integer, MetaData, String, Table meta = MetaData() -instances = Table('instances', meta, autoload=True) - instances_vm_mode = Column('vm_mode', String(length=255, convert_unicode=False, assert_unicode=None, unicode_error=None, @@ -32,10 +30,16 @@ def upgrade(migrate_engine): # bind migrate_engine to your metadata meta.bind = migrate_engine + instances = Table('instances', meta, autoload=True, + autoload_with=migrate_engine) + instances.create_column(instances_vm_mode) def downgrade(migrate_engine): meta.bind = migrate_engine + instances = Table('instances', meta, autoload=True, + autoload_with=migrate_engine) + instances.drop_column('vm_mode') From 9806dacb03023d1db22e9cf833845ba8498657a3 Mon Sep 17 00:00:00 2001 From: Alex Meade Date: Tue, 14 Jun 2011 12:02:15 -0400 Subject: [PATCH 57/70] Added faults wrapper --- nova/api/openstack/wsgi.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/nova/api/openstack/wsgi.py b/nova/api/openstack/wsgi.py index 7f17471c47..affc781dcc 100644 --- a/nova/api/openstack/wsgi.py +++ b/nova/api/openstack/wsgi.py @@ -5,6 +5,7 @@ from xml.dom import minidom from xml.parsers.expat import ExpatError from nova import exception +import faults from nova import log as logging from nova import utils from nova import wsgi @@ -362,7 +363,9 @@ class Resource(wsgi.Application): except exception.InvalidContentType: return webob.exc.HTTPBadRequest(_("Unsupported Content-Type")) except exception.MalformedRequestBody: - return webob.exc.HTTPBadRequest(_("Malformed request")) + explanation = _("Malformed request") + return faults.Fault(webob.exc.HTTPBadRequest( + explanation=explanation)) action_result = self.dispatch(request, action, action_args) From e9f6e47a92090a9a7867c2a117ae6cf58db394ac Mon Sep 17 00:00:00 2001 From: Alex Meade Date: Tue, 14 Jun 2011 12:36:46 -0400 Subject: [PATCH 58/70] Improved errors --- nova/api/openstack/wsgi.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/nova/api/openstack/wsgi.py b/nova/api/openstack/wsgi.py index affc781dcc..0b749e115e 100644 --- a/nova/api/openstack/wsgi.py +++ b/nova/api/openstack/wsgi.py @@ -76,7 +76,8 @@ class JSONDeserializer(TextDeserializer): try: return utils.loads(datastring) except ValueError: - raise exception.MalformedRequestBody() + raise exception.MalformedRequestBody( + "malformed JSON in request body") class XMLDeserializer(TextDeserializer): @@ -96,7 +97,8 @@ class XMLDeserializer(TextDeserializer): node = minidom.parseString(datastring).childNodes[0] return {node.nodeName: self._from_xml_node(node, plurals)} except ExpatError: - raise exception.MalformedRequestBody() + raise exception.MalformedRequestBody( + "malformed XML in request Body") def _from_xml_node(self, node, listnames): """Convert a minidom node to a simple Python type. @@ -363,7 +365,7 @@ class Resource(wsgi.Application): except exception.InvalidContentType: return webob.exc.HTTPBadRequest(_("Unsupported Content-Type")) except exception.MalformedRequestBody: - explanation = _("Malformed request") + explanation = _("Malformed request body") return faults.Fault(webob.exc.HTTPBadRequest( explanation=explanation)) From f46c9d7c96d591d1fffe2f45aee3e8d437e016bf Mon Sep 17 00:00:00 2001 From: Rick Harris Date: Tue, 14 Jun 2011 16:39:37 +0000 Subject: [PATCH 59/70] Making timing points stricter, only show slow/sluggish tests in summary --- run_tests.py | 44 +++++++++++++++++++++++++++++++------------- 1 file changed, 31 insertions(+), 13 deletions(-) diff --git a/run_tests.py b/run_tests.py index ace916535b..3ecc146fd3 100644 --- a/run_tests.py +++ b/run_tests.py @@ -185,6 +185,22 @@ class _NullColorizer(object): self.stream.write(text) +def classify_test_speed(elapsed_time): + if elapsed_time > 1.0: + return 'slow' + elif elapsed_time > 0.25: + return 'sluggish' + else: + return 'fast' + + +def get_elapsed_time_color(elapsed_time): + color_map = {'slow': 'red', 'sluggish': 'yellow', 'fast': 'green'} + slowness = classify_test_speed(elapsed_time) + color = color_map[slowness] + return color + + class NovaTestResult(result.TextTestResult): def __init__(self, *args, **kw): self.show_elapsed = kw.pop('show_elapsed') @@ -215,15 +231,8 @@ class NovaTestResult(result.TextTestResult): heapq.heappush(self.slow_tests, item) def _writeElapsedTime(self, test): - if self.elapsed_time >= 3.0: - color = 'red' - elif self.elapsed_time >= 1.0: - color = 'yellow' - else: - color = 'green' - - self.stream.write(' ' * 10) - self.colorizer.write("%.2f" % self.elapsed_time, color) + color = get_elapsed_time_color(self.elapsed_time) + self.colorizer.write(" %.2f" % self.elapsed_time, color) self.stream.write(' secs') def _writeResult(self, test, long_result, color, short_result): @@ -310,13 +319,22 @@ class NovaTestRunner(core.TextTestRunner): self.config, show_elapsed=self.show_elapsed) + def _writeSlowTests(self, result_): + # Pare out 'fast' tests + slow_tests = [item for item in result_.slow_tests + if classify_test_speed(item[0]) != 'fast'] + + slow_total_time = sum(item[0] for item in slow_tests) + self.stream.writeln("Slowest %i tests took %.2f secs:" + % (len(slow_tests), slow_total_time)) + for elapsed_time, test in sorted(slow_tests, reverse=True): + time_str = "%.2f secs" % elapsed_time + self.stream.writeln(" %s %s" % (time_str.ljust(10), test)) + def run(self, test): result_ = core.TextTestRunner.run(self, test) if self.show_elapsed: - self.stream.writeln("Slowest %i tests:" % result_.num_slow_tests) - for elapsed_time, test in reversed(sorted(result_.slow_tests)): - time_str = "%.2f secs" % elapsed_time - self.stream.writeln(" %s %s" % (time_str.ljust(10), test)) + self._writeSlowTests(result_) return result_ From e89aad7ca0ba7ab5e9b83fa6fd9cde7fb22924bf Mon Sep 17 00:00:00 2001 From: Johannes Erdfelt Date: Tue, 14 Jun 2011 17:22:33 +0000 Subject: [PATCH 60/70] Really PEP8? A tab is inferior to 2 spaces? --- nova/virt/xenapi/vmops.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nova/virt/xenapi/vmops.py b/nova/virt/xenapi/vmops.py index 624588b6b4..d105cf3002 100644 --- a/nova/virt/xenapi/vmops.py +++ b/nova/virt/xenapi/vmops.py @@ -166,7 +166,7 @@ class VMOps(object): use_pv_kernel = True elif vm_mode in ('hv', 'hvm'): use_pv_kernel = False - vm_mode = 'hvm' # Normalize + vm_mode = 'hvm' # Normalize else: use_pv_kernel = VMHelper.determine_is_pv(self._session, instance.id, first_vdi_ref, disk_image_type, From cf66a99314d6420725e32daf6a08404c98239107 Mon Sep 17 00:00:00 2001 From: Alex Meade Date: Tue, 14 Jun 2011 13:27:28 -0400 Subject: [PATCH 61/70] mp fixes --- nova/api/openstack/wsgi.py | 4 ++-- nova/exception.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/nova/api/openstack/wsgi.py b/nova/api/openstack/wsgi.py index 0b749e115e..43b51b64ac 100644 --- a/nova/api/openstack/wsgi.py +++ b/nova/api/openstack/wsgi.py @@ -77,7 +77,7 @@ class JSONDeserializer(TextDeserializer): return utils.loads(datastring) except ValueError: raise exception.MalformedRequestBody( - "malformed JSON in request body") + reason=_("malformed JSON in request body")) class XMLDeserializer(TextDeserializer): @@ -98,7 +98,7 @@ class XMLDeserializer(TextDeserializer): return {node.nodeName: self._from_xml_node(node, plurals)} except ExpatError: raise exception.MalformedRequestBody( - "malformed XML in request Body") + reason=_("malformed XML in request body")) def _from_xml_node(self, node, listnames): """Convert a minidom node to a simple Python type. diff --git a/nova/exception.py b/nova/exception.py index ffd88fbe79..f3a452228c 100644 --- a/nova/exception.py +++ b/nova/exception.py @@ -588,4 +588,4 @@ class MigrationError(NovaException): class MalformedRequestBody(NovaException): - message = _("Malformed message body") + ": %(reason)s" + message = _("Malformed message body: %(reason)s") From a3282ac30255a63f166947a052af0fcda4992621 Mon Sep 17 00:00:00 2001 From: Sandy Walsh Date: Tue, 14 Jun 2011 11:40:15 -0700 Subject: [PATCH 62/70] refactored out controller base class to use aggregation over inheritance --- ...ontroller.py => create_instance_helper.py} | 46 +++++++++--------- nova/api/openstack/servers.py | 33 +++++++------ nova/api/openstack/zones.py | 48 ++++++++++++------- nova/tests/api/openstack/test_servers.py | 14 +++--- 4 files changed, 82 insertions(+), 59 deletions(-) rename nova/api/openstack/{create_instance_controller.py => create_instance_helper.py} (92%) diff --git a/nova/api/openstack/create_instance_controller.py b/nova/api/openstack/create_instance_helper.py similarity index 92% rename from nova/api/openstack/create_instance_controller.py rename to nova/api/openstack/create_instance_helper.py index 90f2542d91..fbc6318ef2 100644 --- a/nova/api/openstack/create_instance_controller.py +++ b/nova/api/openstack/create_instance_helper.py @@ -1,6 +1,4 @@ -# vim: tabstop=4 shiftwidth=4 softtabstop=4 - -# Copyright 2010 OpenStack LLC. +# Copyright 2011 OpenStack LLC. # All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); you may @@ -35,7 +33,7 @@ from nova.api.openstack import wsgi from nova.auth import manager as auth_manager -LOG = logging.getLogger('nova.api.openstack.create_instance_controller') +LOG = logging.getLogger('nova.api.openstack.create_instance_helper') FLAGS = flags.FLAGS @@ -47,7 +45,7 @@ class CreateFault(exception.NovaException): super(CreateFault, self).__init__() -class OpenstackCreateInstanceController(object): +class CreateInstanceHelper(object): """This is the base class for OS API Controllers that are capable of creating instances (currently Servers and Zones). @@ -55,22 +53,11 @@ class OpenstackCreateInstanceController(object): to move this code back into servers.py """ - def __init__(self): + def __init__(self, controller): """We need the image service to create an instance.""" + self.controller = controller self._image_service = utils.import_object(FLAGS.image_service) - super(OpenstackCreateInstanceController, self).__init__() - - # Default to the 1.0 naming scheme. - - def _image_ref_from_req_data(self, data): - return data['server']['imageId'] - - def _flavor_id_from_req_data(self, data): - return data['server']['flavorId'] - - def _get_server_admin_password(self, server): - """ Determine the admin password for a server on creation """ - return utils.generate_password(16) + super(CreateInstanceHelper, self).__init__() def create_instance(self, req, body, create_method): """Creates a new server for the given user. The approach @@ -87,7 +74,7 @@ class OpenstackCreateInstanceController(object): context = req.environ['nova.context'] - password = self._get_server_admin_password(body['server']) + password = self.controller._get_server_admin_password(body['server']) key_name = None key_data = None @@ -97,7 +84,7 @@ class OpenstackCreateInstanceController(object): key_name = key_pair['name'] key_data = key_pair['public_key'] - image_href = self._image_ref_from_req_data(body) + image_href = self.controller._image_ref_from_req_data(body) try: image_service, image_id = nova.image.get_image_service(image_href) kernel_id, ramdisk_id = self._get_kernel_ramdisk_from_image( @@ -115,7 +102,7 @@ class OpenstackCreateInstanceController(object): if personality: injected_files = self._get_injected_files(personality) - flavor_id = self._flavor_id_from_req_data(body) + flavor_id = self.controller._flavor_id_from_req_data(body) if not 'name' in body['server']: msg = _("Server name is not defined") @@ -266,6 +253,21 @@ class OpenstackCreateInstanceController(object): injected_files.append((path, contents)) return injected_files + def _get_server_admin_password_old_style(self, server): + """ Determine the admin password for a server on creation """ + return utils.generate_password(16) + + def _get_server_admin_password_new_style(self, server): + """ Determine the admin password for a server on creation """ + password = server.get('adminPass') + + if password is None: + return utils.generate_password(16) + if not isinstance(password, basestring) or password == '': + msg = _("Invalid adminPass") + raise exc.HTTPBadRequest(msg) + return password + class ServerXMLDeserializer(wsgi.XMLDeserializer): """ diff --git a/nova/api/openstack/servers.py b/nova/api/openstack/servers.py index 1b18c4ecbc..5c967c40f1 100644 --- a/nova/api/openstack/servers.py +++ b/nova/api/openstack/servers.py @@ -24,7 +24,7 @@ from nova import flags from nova import log as logging from nova import utils from nova.api.openstack import common -from nova.api.openstack import create_instance_controller as base_controller +from nova.api.openstack import create_instance_helper as helper from nova.api.openstack import faults import nova.api.openstack.views.addresses import nova.api.openstack.views.flavors @@ -39,11 +39,12 @@ LOG = logging.getLogger('nova.api.openstack.servers') FLAGS = flags.FLAGS -class Controller(base_controller.OpenstackCreateInstanceController): +class Controller(object): """ The Server API controller for the OpenStack API """ def __init__(self): self.compute_api = compute.API() + self.helper = helper.CreateInstanceHelper(self) super(Controller, self).__init__() def index(self, req): @@ -111,8 +112,8 @@ class Controller(base_controller.OpenstackCreateInstanceController): extra_values = None result = None try: - extra_values, result = \ - self.create_instance(req, body, self.compute_api.create) + extra_values, result = self.helper.create_instance( + req, body, self.compute_api.create) except faults.Fault, f: return f @@ -141,7 +142,7 @@ class Controller(base_controller.OpenstackCreateInstanceController): if 'name' in body['server']: name = body['server']['name'] - self._validate_server_name(name) + self.helper._validate_server_name(name) update_dict['display_name'] = name.strip() self._parse_update(ctxt, id, body, update_dict) @@ -403,6 +404,13 @@ class Controller(base_controller.OpenstackCreateInstanceController): class ControllerV10(Controller): + + def _image_ref_from_req_data(self, data): + return data['server']['imageId'] + + def _flavor_id_from_req_data(self, data): + return data['server']['flavorId'] + def _get_view_builder(self, req): addresses_builder = nova.api.openstack.views.addresses.ViewBuilderV10() return nova.api.openstack.views.servers.ViewBuilderV10( @@ -453,6 +461,10 @@ class ControllerV10(Controller): response.empty_body = True return response + def _get_server_admin_password(self, server): + """ Determine the admin password for a server on creation """ + return self.helper._get_server_admin_password_old_style(server) + class ControllerV11(Controller): def _image_ref_from_req_data(self, data): @@ -567,14 +579,7 @@ class ControllerV11(Controller): def _get_server_admin_password(self, server): """ Determine the admin password for a server on creation """ - password = server.get('adminPass') - - if password is None: - return utils.generate_password(16) - if not isinstance(password, basestring) or password == '': - msg = _("Invalid adminPass") - raise exc.HTTPBadRequest(msg) - return password + return self.helper._get_server_admin_password_new_style(server) def create_resource(version='1.0'): @@ -610,7 +615,7 @@ def create_resource(version='1.0'): } deserializers = { - 'application/xml': base_controller.ServerXMLDeserializer(), + 'application/xml': helper.ServerXMLDeserializer(), } return wsgi.Resource(controller, serializers=serializers, diff --git a/nova/api/openstack/zones.py b/nova/api/openstack/zones.py index 7ccb8555bb..c34360e018 100644 --- a/nova/api/openstack/zones.py +++ b/nova/api/openstack/zones.py @@ -25,8 +25,9 @@ from nova import log as logging from nova.compute import api as compute from nova.scheduler import api -from nova.api.openstack import create_instance_controller as controller +from nova.api.openstack import create_instance_helper as helper from nova.api.openstack import common +from nova.api.openstack import faults from nova.api.openstack import wsgi @@ -62,16 +63,12 @@ def check_encryption_key(func): return wrapped -class Controller(controller.OpenstackCreateInstanceController): - """Controller for Zone resources. Since we can also create instances - via /zone/boot, this controller is derived from - OpenstackCreateInstanceController, which contains all the logic for - doing that (shared with Servers). - """ +class Controller(object): + """Controller for Zone resources.""" - def __init__(self, version): + def __init__(self): self.compute_api = compute.API() - self.version = version + self.helper = helper.CreateInstanceHelper(self) super(Controller, self).__init__() def index(self, req): @@ -132,7 +129,7 @@ class Controller(controller.OpenstackCreateInstanceController): """ result = None try: - extra_values, result = self.create_instance(req, body, + extra_values, result = self.helper.create_instance(req, body, self.compute_api.create_all_at_once) except faults.Fault, f: return f @@ -164,17 +161,36 @@ class Controller(controller.OpenstackCreateInstanceController): return cooked def _image_ref_from_req_data(self, data): - if self.version == '1.0': - return data['server']['imageId'] + return data['server']['imageId'] + + def _flavor_id_from_req_data(self, data): + return data['server']['flavorId'] + + def _get_server_admin_password(self, server): + """ Determine the admin password for a server on creation """ + return self.helper._get_server_admin_password_old_style(server) + + +class ControllerV11(object): + """Controller for 1.1 Zone resources.""" + + def _get_server_admin_password(self, server): + """ Determine the admin password for a server on creation """ + return self.helper._get_server_admin_password_new_style(server) + + def _image_ref_from_req_data(self, data): return data['server']['imageRef'] def _flavor_id_from_req_data(self, data): - if self.version == '1.0': - return data['server']['flavorId'] return data['server']['flavorRef'] def create_resource(version): + controller = { + '1.0': Controller, + '1.1': ControllerV11, + }[version]() + metadata = { "attributes": { "zone": ["id", "api_url", "name", "capabilities"], @@ -187,8 +203,8 @@ def create_resource(version): } deserializers = { - 'application/xml': controller.ServerXMLDeserializer(), + 'application/xml': helper.ServerXMLDeserializer(), } - return wsgi.Resource(Controller(version), serializers=serializers, + return wsgi.Resource(controller, serializers=serializers, deserializers=deserializers) diff --git a/nova/tests/api/openstack/test_servers.py b/nova/tests/api/openstack/test_servers.py index 529ca83c52..8357df594f 100644 --- a/nova/tests/api/openstack/test_servers.py +++ b/nova/tests/api/openstack/test_servers.py @@ -31,7 +31,7 @@ from nova import test from nova import utils import nova.api.openstack from nova.api.openstack import servers -from nova.api.openstack import create_instance_controller +from nova.api.openstack import create_instance_helper import nova.compute.api from nova.compute import instance_types from nova.compute import power_state @@ -570,8 +570,7 @@ class ServersTest(test.TestCase): self.stubs.Set(nova.network.manager.VlanManager, 'allocate_fixed_ip', fake_method) self.stubs.Set( - nova.api.openstack.create_instance_controller.\ - OpenstackCreateInstanceController, + nova.api.openstack.create_instance_helper.CreateInstanceHelper, "_get_kernel_ramdisk_from_image", kernel_ramdisk_mapping) self.stubs.Set(nova.compute.api.API, "_find_host", find_host) @@ -1531,7 +1530,7 @@ class ServersTest(test.TestCase): class TestServerCreateRequestXMLDeserializer(unittest.TestCase): def setUp(self): - self.deserializer = create_instance_controller.ServerXMLDeserializer() + self.deserializer = create_instance_helper.ServerXMLDeserializer() def test_minimal_request(self): serial_request = """ @@ -1863,7 +1862,8 @@ class TestServerInstanceCreation(test.TestCase): compute_api = MockComputeAPI() self.stubs.Set(nova.compute, 'API', make_stub_method(compute_api)) - self.stubs.Set(nova.api.openstack.servers.Controller, + self.stubs.Set( + nova.api.openstack.create_instance_helper.CreateInstanceHelper, '_get_kernel_ramdisk_from_image', make_stub_method((1, 1))) return compute_api @@ -2119,6 +2119,6 @@ class TestGetKernelRamdiskFromImage(test.TestCase): @staticmethod def _get_k_r(image_meta): """Rebinding function to a shorter name for convenience""" - kernel_id, ramdisk_id = \ - servers.Controller._do_get_kernel_ramdisk_from_image(image_meta) + kernel_id, ramdisk_id = create_instance_helper.CreateInstanceHelper. \ + _do_get_kernel_ramdisk_from_image(image_meta) return kernel_id, ramdisk_id From b331ae15cfaa0bfbe06bb4b1947f12e56033c333 Mon Sep 17 00:00:00 2001 From: Sandy Walsh Date: Tue, 14 Jun 2011 11:55:43 -0700 Subject: [PATCH 63/70] version passing cleanup --- nova/api/openstack/__init__.py | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/nova/api/openstack/__init__.py b/nova/api/openstack/__init__.py index e0ae551051..a22889e833 100644 --- a/nova/api/openstack/__init__.py +++ b/nova/api/openstack/__init__.py @@ -81,7 +81,9 @@ class APIRouter(base_wsgi.Router): self._setup_routes(mapper) super(APIRouter, self).__init__(mapper) - def _setup_routes(self, mapper, version='1.0'): + def _setup_routes(self, mapper, version): + """Routes common to all versions.""" + server_members = self.server_members server_members['action'] = 'POST' if FLAGS.allow_admin_api: @@ -98,14 +100,6 @@ class APIRouter(base_wsgi.Router): server_members['reset_network'] = 'POST' server_members['inject_network_info'] = 'POST' - mapper.resource("zone", "zones", - controller=zones.create_resource(version), - collection={'detail': 'GET', - 'info': 'GET', - 'select': 'POST', - 'boot': 'POST' - }) - mapper.resource("user", "users", controller=users.create_resource(), collection={'detail': 'GET'}) @@ -114,11 +108,19 @@ class APIRouter(base_wsgi.Router): controller=accounts.create_resource(), collection={'detail': 'GET'}) - mapper.resource("console", "consoles", + mapper.resource("console", "consoles", controller=consoles.create_resource(), parent_resource=dict(member_name='server', collection_name='servers')) + mapper.resource("zone", "zones", + controller=zones.create_resource(version), + collection={'detail': 'GET', + 'info': 'GET', + 'select': 'POST', + 'boot': 'POST' + }) + super(APIRouter, self).__init__(mapper) @@ -126,7 +128,7 @@ class APIRouterV10(APIRouter): """Define routes specific to OpenStack API V1.0.""" def _setup_routes(self, mapper): - super(APIRouterV10, self)._setup_routes(mapper, version='1.0') + super(APIRouterV10, self)._setup_routes(mapper, '1.0') mapper.resource("server", "servers", controller=servers.create_resource('1.0'), collection={'detail': 'GET'}, @@ -162,7 +164,7 @@ class APIRouterV11(APIRouter): """Define routes specific to OpenStack API V1.1.""" def _setup_routes(self, mapper): - super(APIRouterV11, self)._setup_routes(mapper, version='1.1') + super(APIRouterV11, self)._setup_routes(mapper, '1.1') mapper.resource("server", "servers", controller=servers.create_resource('1.1'), collection={'detail': 'GET'}, From 60a89dda55258bd7212e09e2113dca92ebd67a08 Mon Sep 17 00:00:00 2001 From: Sandy Walsh Date: Tue, 14 Jun 2011 12:34:10 -0700 Subject: [PATCH 64/70] duplicate routes moved to base class --- nova/api/openstack/__init__.py | 54 +++++++++++++--------------------- 1 file changed, 21 insertions(+), 33 deletions(-) diff --git a/nova/api/openstack/__init__.py b/nova/api/openstack/__init__.py index a22889e833..ddd9580d7d 100644 --- a/nova/api/openstack/__init__.py +++ b/nova/api/openstack/__init__.py @@ -108,11 +108,6 @@ class APIRouter(base_wsgi.Router): controller=accounts.create_resource(), collection={'detail': 'GET'}) - mapper.resource("console", "consoles", - controller=consoles.create_resource(), - parent_resource=dict(member_name='server', - collection_name='servers')) - mapper.resource("zone", "zones", controller=zones.create_resource(version), collection={'detail': 'GET', @@ -121,6 +116,27 @@ class APIRouter(base_wsgi.Router): 'boot': 'POST' }) + mapper.resource("console", "consoles", + controller=consoles.create_resource(), + parent_resource=dict(member_name='server', + collection_name='servers')) + + mapper.resource("server", "servers", + controller=servers.create_resource(version), + collection={'detail': 'GET'}, + member=self.server_members) + + mapper.resource("image", "images", + controller=images.create_resource(version), + collection={'detail': 'GET'}) + + mapper.resource("limit", "limits", + controller=limits.create_resource(version)) + + mapper.resource("flavor", "flavors", + controller=flavors.create_resource(version), + collection={'detail': 'GET'}) + super(APIRouter, self).__init__(mapper) @@ -129,19 +145,10 @@ class APIRouterV10(APIRouter): def _setup_routes(self, mapper): super(APIRouterV10, self)._setup_routes(mapper, '1.0') - mapper.resource("server", "servers", - controller=servers.create_resource('1.0'), - collection={'detail': 'GET'}, - member=self.server_members) - mapper.resource("image", "images", controller=images.create_resource('1.0'), collection={'detail': 'GET'}) - mapper.resource("flavor", "flavors", - controller=flavors.create_resource('1.0'), - collection={'detail': 'GET'}) - mapper.resource("shared_ip_group", "shared_ip_groups", collection={'detail': 'GET'}, controller=shared_ip_groups.create_resource()) @@ -151,9 +158,6 @@ class APIRouterV10(APIRouter): parent_resource=dict(member_name='server', collection_name='servers')) - mapper.resource("limit", "limits", - controller=limits.create_resource('1.0')) - mapper.resource("ip", "ips", controller=ips.create_resource(), collection=dict(public='GET', private='GET'), parent_resource=dict(member_name='server', @@ -165,15 +169,6 @@ class APIRouterV11(APIRouter): def _setup_routes(self, mapper): super(APIRouterV11, self)._setup_routes(mapper, '1.1') - mapper.resource("server", "servers", - controller=servers.create_resource('1.1'), - collection={'detail': 'GET'}, - member=self.server_members) - - mapper.resource("image", "images", - controller=images.create_resource('1.1'), - collection={'detail': 'GET'}) - mapper.resource("image_meta", "meta", controller=image_metadata.create_resource(), parent_resource=dict(member_name='image', @@ -183,10 +178,3 @@ class APIRouterV11(APIRouter): controller=server_metadata.create_resource(), parent_resource=dict(member_name='server', collection_name='servers')) - - mapper.resource("flavor", "flavors", - controller=flavors.create_resource('1.1'), - collection={'detail': 'GET'}) - - mapper.resource("limit", "limits", - controller=limits.create_resource('1.1')) From 6d960ff50d4cf8e6b2dc59aff0e8dea17498a9f0 Mon Sep 17 00:00:00 2001 From: Alex Meade Date: Tue, 14 Jun 2011 15:51:22 -0400 Subject: [PATCH 65/70] fixed HACKING --- nova/api/openstack/wsgi.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/nova/api/openstack/wsgi.py b/nova/api/openstack/wsgi.py index 43b51b64ac..27d19db53f 100644 --- a/nova/api/openstack/wsgi.py +++ b/nova/api/openstack/wsgi.py @@ -2,10 +2,10 @@ import json import webob from xml.dom import minidom -from xml.parsers.expat import ExpatError +from xml.parsers import expat -from nova import exception import faults +from nova import exception from nova import log as logging from nova import utils from nova import wsgi @@ -96,7 +96,7 @@ class XMLDeserializer(TextDeserializer): try: node = minidom.parseString(datastring).childNodes[0] return {node.nodeName: self._from_xml_node(node, plurals)} - except ExpatError: + except expat.ExpatError: raise exception.MalformedRequestBody( reason=_("malformed XML in request body")) From 0ce3e2af1b2d48d53c7ae6f59caca745946c6198 Mon Sep 17 00:00:00 2001 From: Sandy Walsh Date: Tue, 14 Jun 2011 12:59:16 -0700 Subject: [PATCH 66/70] removed extra init calls --- nova/api/openstack/servers.py | 1 - nova/api/openstack/zones.py | 1 - 2 files changed, 2 deletions(-) diff --git a/nova/api/openstack/servers.py b/nova/api/openstack/servers.py index 5c967c40f1..798fdd7f7c 100644 --- a/nova/api/openstack/servers.py +++ b/nova/api/openstack/servers.py @@ -45,7 +45,6 @@ class Controller(object): def __init__(self): self.compute_api = compute.API() self.helper = helper.CreateInstanceHelper(self) - super(Controller, self).__init__() def index(self, req): """ Returns a list of server names and ids for a given user """ diff --git a/nova/api/openstack/zones.py b/nova/api/openstack/zones.py index c34360e018..8864f825ba 100644 --- a/nova/api/openstack/zones.py +++ b/nova/api/openstack/zones.py @@ -69,7 +69,6 @@ class Controller(object): def __init__(self): self.compute_api = compute.API() self.helper = helper.CreateInstanceHelper(self) - super(Controller, self).__init__() def index(self, req): """Return all zones in brief""" From 3368a35ff9c06d74ec4b8fdb58d37771fc1a4f0d Mon Sep 17 00:00:00 2001 From: Rick Harris Date: Wed, 15 Jun 2011 00:08:19 +0000 Subject: [PATCH 67/70] Removing seconds unit --- run_tests.py | 24 ++++++++---------------- run_tests.sh | 2 +- 2 files changed, 9 insertions(+), 17 deletions(-) diff --git a/run_tests.py b/run_tests.py index 3ecc146fd3..c29a3da43f 100644 --- a/run_tests.py +++ b/run_tests.py @@ -185,20 +185,13 @@ class _NullColorizer(object): self.stream.write(text) -def classify_test_speed(elapsed_time): - if elapsed_time > 1.0: - return 'slow' - elif elapsed_time > 0.25: - return 'sluggish' - else: - return 'fast' - - def get_elapsed_time_color(elapsed_time): - color_map = {'slow': 'red', 'sluggish': 'yellow', 'fast': 'green'} - slowness = classify_test_speed(elapsed_time) - color = color_map[slowness] - return color + if elapsed_time > 1.0: + return 'red' + elif elapsed_time > 0.25: + return 'yellow' + else: + return 'green' class NovaTestResult(result.TextTestResult): @@ -233,7 +226,6 @@ class NovaTestResult(result.TextTestResult): def _writeElapsedTime(self, test): color = get_elapsed_time_color(self.elapsed_time) self.colorizer.write(" %.2f" % self.elapsed_time, color) - self.stream.write(' secs') def _writeResult(self, test, long_result, color, short_result): if self.showAll: @@ -322,13 +314,13 @@ class NovaTestRunner(core.TextTestRunner): def _writeSlowTests(self, result_): # Pare out 'fast' tests slow_tests = [item for item in result_.slow_tests - if classify_test_speed(item[0]) != 'fast'] + if get_elapsed_time_color(item[0]) != 'green'] slow_total_time = sum(item[0] for item in slow_tests) self.stream.writeln("Slowest %i tests took %.2f secs:" % (len(slow_tests), slow_total_time)) for elapsed_time, test in sorted(slow_tests, reverse=True): - time_str = "%.2f secs" % elapsed_time + time_str = "%.2f" % elapsed_time self.stream.writeln(" %s %s" % (time_str.ljust(10), test)) def run(self, test): diff --git a/run_tests.sh b/run_tests.sh index 5fc4060351..90af355791 100755 --- a/run_tests.sh +++ b/run_tests.sh @@ -10,7 +10,7 @@ function usage { echo " -f, --force Force a clean re-build of the virtual environment. Useful when dependencies have been added." echo " -p, --pep8 Just run pep8" echo " -h, --help Print this usage message" - echo " --show-elapsed Print elapsed time for tests along with slowest tests" + echo " --show-elapsed Print elapsed time in seconds for tests along with slowest tests" echo "" echo "Note: with no options specified, the script will try to run the tests in a virtual environment," echo " If no virtualenv is found, the script will ask if you would like to create one. If you " From e20444542af9136c330d1cf469eb0e065860ded1 Mon Sep 17 00:00:00 2001 From: Rick Harris Date: Wed, 15 Jun 2011 01:16:53 +0000 Subject: [PATCH 68/70] Ensuring pep8 runs even when nose optons are passed --- run_tests.sh | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/run_tests.sh b/run_tests.sh index 90af355791..b90e1e837f 100755 --- a/run_tests.sh +++ b/run_tests.sh @@ -25,6 +25,7 @@ function process_option { -N|--no-virtual-env) let always_venv=0; let never_venv=1;; -f|--force) let force=1;; -p|--pep8) let just_pep8=1;; + -*) noseopts="$noseopts $1";; *) noseargs="$noseargs $1" esac } @@ -35,6 +36,7 @@ always_venv=0 never_venv=0 force=0 noseargs= +noseopts= wrapper="" just_pep8=0 @@ -73,7 +75,7 @@ function run_pep8 { --exclude=vcsversion.py ${srcfiles} } -NOSETESTS="python run_tests.py $noseargs" +NOSETESTS="python run_tests.py $noseopts $noseargs" if [ $never_venv -eq 0 ] then @@ -108,7 +110,10 @@ fi run_tests || exit -# Also run pep8 if no options were provided. +# NOTE(sirp): we only want to run pep8 when we're running the full-test suite, +# not when we're running tests individually. To handle this, we need to +# distinguish between options (noseopts), which begin with a '-', and +# arguments (noseargs). if [ -z "$noseargs" ]; then run_pep8 fi From 43dd1ec6089497b6e977c49f9006d03c3e7a4117 Mon Sep 17 00:00:00 2001 From: Rick Harris Date: Wed, 15 Jun 2011 01:21:11 +0000 Subject: [PATCH 69/70] Showing elapsed time is now default --- run_tests.py | 6 +++--- run_tests.sh | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/run_tests.py b/run_tests.py index c29a3da43f..601c41e407 100644 --- a/run_tests.py +++ b/run_tests.py @@ -334,13 +334,13 @@ if __name__ == '__main__': logging.setup() # If any argument looks like a test name but doesn't have "nova.tests" in # front of it, automatically add that so we don't have to type as much - show_elapsed = False + show_elapsed = True argv = [] for x in sys.argv: if x.startswith('test_'): argv.append('nova.tests.%s' % x) - elif x.startswith('--show-elapsed'): - show_elapsed = True + elif x.startswith('--hide-elapsed'): + show_elapsed = False else: argv.append(x) diff --git a/run_tests.sh b/run_tests.sh index b90e1e837f..c3f06f8372 100755 --- a/run_tests.sh +++ b/run_tests.sh @@ -10,7 +10,7 @@ function usage { echo " -f, --force Force a clean re-build of the virtual environment. Useful when dependencies have been added." echo " -p, --pep8 Just run pep8" echo " -h, --help Print this usage message" - echo " --show-elapsed Print elapsed time in seconds for tests along with slowest tests" + echo " --hide-elapsed Don't print the elapsed time for each test along with slow test list" echo "" echo "Note: with no options specified, the script will try to run the tests in a virtual environment," echo " If no virtualenv is found, the script will ask if you would like to create one. If you " From 4d5a73bf7cc61d94ac1f29a7566def853d0efb1b Mon Sep 17 00:00:00 2001 From: Rick Harris Date: Wed, 15 Jun 2011 04:05:37 +0000 Subject: [PATCH 70/70] Show only if we have slow tests, elapsed only if test success --- run_tests.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/run_tests.py b/run_tests.py index 601c41e407..0944bb5853 100644 --- a/run_tests.py +++ b/run_tests.py @@ -227,10 +227,10 @@ class NovaTestResult(result.TextTestResult): color = get_elapsed_time_color(self.elapsed_time) self.colorizer.write(" %.2f" % self.elapsed_time, color) - def _writeResult(self, test, long_result, color, short_result): + def _writeResult(self, test, long_result, color, short_result, success): if self.showAll: self.colorizer.write(long_result, color) - if self.show_elapsed: + if self.show_elapsed and success: self._writeElapsedTime(test) self.stream.writeln() elif self.dots: @@ -241,13 +241,13 @@ class NovaTestResult(result.TextTestResult): def addSuccess(self, test): unittest.TestResult.addSuccess(self, test) self._handleElapsedTime(test) - self._writeResult(test, 'OK', 'green', '.') + self._writeResult(test, 'OK', 'green', '.', True) # NOTE(vish): copied from unittest with edit to add color def addFailure(self, test, err): unittest.TestResult.addFailure(self, test, err) self._handleElapsedTime(test) - self._writeResult(test, 'FAIL', 'red', 'F') + self._writeResult(test, 'FAIL', 'red', 'F', False) # NOTE(vish): copied from nose with edit to add color def addError(self, test, err): @@ -282,7 +282,7 @@ class NovaTestResult(result.TextTestResult): self.errors.append((test, exc_info)) test.passed = False if stream is not None: - self._writeResult(test, 'ERROR', 'red', 'E') + self._writeResult(test, 'ERROR', 'red', 'E', False) def startTest(self, test): unittest.TestResult.startTest(self, test) @@ -315,13 +315,13 @@ class NovaTestRunner(core.TextTestRunner): # Pare out 'fast' tests slow_tests = [item for item in result_.slow_tests if get_elapsed_time_color(item[0]) != 'green'] - - slow_total_time = sum(item[0] for item in slow_tests) - self.stream.writeln("Slowest %i tests took %.2f secs:" - % (len(slow_tests), slow_total_time)) - for elapsed_time, test in sorted(slow_tests, reverse=True): - time_str = "%.2f" % elapsed_time - self.stream.writeln(" %s %s" % (time_str.ljust(10), test)) + if slow_tests: + slow_total_time = sum(item[0] for item in slow_tests) + self.stream.writeln("Slowest %i tests took %.2f secs:" + % (len(slow_tests), slow_total_time)) + for elapsed_time, test in sorted(slow_tests, reverse=True): + time_str = "%.2f" % elapsed_time + self.stream.writeln(" %s %s" % (time_str.ljust(10), test)) def run(self, test): result_ = core.TextTestRunner.run(self, test)