From 60c82177da9c4ebbb89e5534959d0d5a52bfa49a Mon Sep 17 00:00:00 2001 From: Eric Day Date: Wed, 3 Nov 2010 12:38:15 -0700 Subject: Fix for bug#613264, allowing hosts to be specified for nova-api and objectstore listeners. --- bin/nova-api | 6 ++++-- nova/objectstore/handler.py | 3 ++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/bin/nova-api b/bin/nova-api index a9002ae2d..a9c53dbcd 100755 --- a/bin/nova-api +++ b/bin/nova-api @@ -38,15 +38,17 @@ from nova import server FLAGS = flags.FLAGS flags.DEFINE_integer('osapi_port', 8774, 'OpenStack API port') +flags.DEFINE_string('osapi_host', '0.0.0.0', 'OpenStack API host') flags.DEFINE_integer('ec2api_port', 8773, 'EC2 API port') +flags.DEFINE_string('ec2api_host', '0.0.0.0', 'EC2 API host') def main(_args): from nova import api from nova import wsgi server = wsgi.Server() - server.start(api.API('os'), FLAGS.osapi_port) - server.start(api.API('ec2'), FLAGS.ec2api_port) + server.start(api.API('os'), FLAGS.osapi_port, host=FLAGS.osapi_host) + server.start(api.API('ec2'), FLAGS.ec2api_port, host=FLAGS.ec2api_host) server.wait() diff --git a/nova/objectstore/handler.py b/nova/objectstore/handler.py index b26906001..aaf207db4 100644 --- a/nova/objectstore/handler.py +++ b/nova/objectstore/handler.py @@ -438,6 +438,7 @@ def get_application(): # Disabled because of lack of proper introspection in Twisted # or possibly different versions of twisted? # pylint: disable-msg=E1101 - objectStoreService = internet.TCPServer(FLAGS.s3_port, factory) + objectStoreService = internet.TCPServer(FLAGS.s3_port, factory, + interface=FLAGS.s3_host) objectStoreService.setServiceParent(application) return application -- cgit From d65c35bcadc6cc4e4d1fc61502d43fd001ce2f0e Mon Sep 17 00:00:00 2001 From: Eric Day Date: Wed, 3 Nov 2010 13:13:59 -0700 Subject: Added an extra argument to the objectstore listen to separate out the listening host from the connecting host. --- nova/objectstore/handler.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/nova/objectstore/handler.py b/nova/objectstore/handler.py index aaf207db4..c8920b00c 100644 --- a/nova/objectstore/handler.py +++ b/nova/objectstore/handler.py @@ -61,6 +61,7 @@ from nova.objectstore import image FLAGS = flags.FLAGS +flags.DEFINE_string('s3_listen_host', '', 'Host to listen on.') def render_xml(request, value): @@ -439,6 +440,6 @@ def get_application(): # or possibly different versions of twisted? # pylint: disable-msg=E1101 objectStoreService = internet.TCPServer(FLAGS.s3_port, factory, - interface=FLAGS.s3_host) + interface=FLAGS.s3_listen_host) objectStoreService.setServiceParent(application) return application -- cgit From 3b695e11da34247123ea919e71096e53393f227b Mon Sep 17 00:00:00 2001 From: Soren Hansen Date: Thu, 11 Nov 2010 19:52:36 -0600 Subject: Added a .mailmap that maps addresses in bzr to people's real, preferred e-mail addresses. (I made a few guesses along the way, feel free to adjust according to what is actually the preferred e-mail) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Added a couple of methods to nova.utils to parse said .mailmap and do the appropriate (though highly naïve) replacement. Apply mailmap replacement in changelog generation in setup.py. Add a unit test that checks everyone is properly listed in Authors. Add sleepsonthefloor to Authors. If anyone knows the real name, please add it. --- .mailmap | 24 +++++++++++++++++++++++ Authors | 1 + nova/tests/misc_unittest.py | 48 +++++++++++++++++++++++++++++++++++++++++++++ nova/utils.py | 16 +++++++++++++++ run_tests.py | 5 +++-- setup.py | 10 ++++++---- 6 files changed, 98 insertions(+), 6 deletions(-) create mode 100644 .mailmap create mode 100644 nova/tests/misc_unittest.py diff --git a/.mailmap b/.mailmap new file mode 100644 index 000000000..cf79dc95c --- /dev/null +++ b/.mailmap @@ -0,0 +1,24 @@ +# Format is: +# + + + + + + + + + + + + + + + + + + + + + + diff --git a/Authors b/Authors index ec3a1cbd8..87ebb55d7 100644 --- a/Authors +++ b/Authors @@ -19,3 +19,4 @@ Rick Clark Soren Hansen Todd Willey Vishvananda Ishaya +¿¿¿??? diff --git a/nova/tests/misc_unittest.py b/nova/tests/misc_unittest.py new file mode 100644 index 000000000..856060afa --- /dev/null +++ b/nova/tests/misc_unittest.py @@ -0,0 +1,48 @@ +# 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. + +import os +import subprocess + +from nova import test +from nova.utils import parse_mailmap, str_dict_replace + + +class ProjectTestCase(test.TrialTestCase): + def test_authors_up_to_date(self): + if os.path.exists('../.bzr'): + log_cmd = subprocess.Popen(["bzr", "log", "-n0"], + stdout=subprocess.PIPE) + changelog = log_cmd.communicate()[0] + mailmap = parse_mailmap('../.mailmap') + + contributors = set() + for l in changelog.split('\n'): + l = l.strip() + if (l.startswith('author:') or l.startswith('committer:') + and not l == 'committer: Tarmac'): + email = l.split(' ')[-1] + contributors.add(str_dict_replace(email, mailmap)) + + authors_file = open('../Authors', 'r').read() + + missing = set() + for contributor in contributors: + if not contributor in authors_file: + missing.add(contributor) + + self.assertTrue(len(missing) == 0, + '%r not listed in Authors' % missing) diff --git a/nova/utils.py b/nova/utils.py index e7892a212..b63237c10 100644 --- a/nova/utils.py +++ b/nova/utils.py @@ -173,6 +173,22 @@ def isotime(at=None): def parse_isotime(timestr): return datetime.datetime.strptime(timestr, TIME_FORMAT) +def parse_mailmap(mailmap='.mailmap'): + mapping = {} + if os.path.exists(mailmap): + fp = open(mailmap, 'r') + for l in fp: + l = l.strip() + if not l.startswith('#') and ' ' in l: + canonical_email, alias = l.split(' ') + mapping[alias] = canonical_email + return mapping + +def str_dict_replace(s, mapping): + for s1, s2 in mapping.iteritems(): + s = s.replace(s1, s2) + return s + class LazyPluggable(object): """A pluggable backend loaded lazily based on some value.""" diff --git a/run_tests.py b/run_tests.py index 9a2f40dc9..3d427d8af 100644 --- a/run_tests.py +++ b/run_tests.py @@ -49,11 +49,12 @@ from nova import flags from nova import twistd from nova.tests.access_unittest import * -from nova.tests.auth_unittest import * from nova.tests.api_unittest import * +from nova.tests.auth_unittest import * from nova.tests.cloud_unittest import * from nova.tests.compute_unittest import * from nova.tests.flags_unittest import * +from nova.tests.misc_unittest import * from nova.tests.network_unittest import * from nova.tests.objectstore_unittest import * from nova.tests.process_unittest import * @@ -64,8 +65,8 @@ from nova.tests.service_unittest import * from nova.tests.twistd_unittest import * from nova.tests.validator_unittest import * from nova.tests.virt_unittest import * -from nova.tests.volume_unittest import * from nova.tests.virt_unittest import * +from nova.tests.volume_unittest import * FLAGS = flags.FLAGS diff --git a/setup.py b/setup.py index a333fbf64..da1e5f8c9 100644 --- a/setup.py +++ b/setup.py @@ -16,12 +16,13 @@ # License for the specific language governing permissions and limitations # under the License. -from setuptools import setup, find_packages -from setuptools.command.sdist import sdist - import os import subprocess +from setuptools import setup, find_packages +from setuptools.command.sdist import sdist + +from nova.util import parse_mailmap, str_dict_replace class local_sdist(sdist): """Customized sdist hook - builds the ChangeLog file from VC first""" @@ -34,8 +35,9 @@ class local_sdist(sdist): log_cmd = subprocess.Popen(["bzr", "log", "--novalog"], stdout=subprocess.PIPE, env=env) changelog = log_cmd.communicate()[0] + mailmap = parse_mailmap() with open("ChangeLog", "w") as changelog_file: - changelog_file.write(changelog) + changelog_file.write(str_dict_replace(changelog, mailmap)) sdist.run(self) setup(name='nova', -- cgit From 6c142b844ac3269633414d235a8a7bd83c2ecca5 Mon Sep 17 00:00:00 2001 From: Armando Migliaccio Date: Fri, 12 Nov 2010 18:50:10 +0000 Subject: getting started --- doc/source/devref/rabbit.rst | 1 + 1 file changed, 1 insertion(+) create mode 100644 doc/source/devref/rabbit.rst diff --git a/doc/source/devref/rabbit.rst b/doc/source/devref/rabbit.rst new file mode 100644 index 000000000..48cdce852 --- /dev/null +++ b/doc/source/devref/rabbit.rst @@ -0,0 +1 @@ +placeholder -- cgit From c4a8768583bdce6af64aef6ed2563956f5c84a1a Mon Sep 17 00:00:00 2001 From: Anne Gentle Date: Mon, 15 Nov 2010 13:15:48 -0600 Subject: Adding contributors and names --- Authors | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Authors b/Authors index 87ebb55d7..5b1d29036 100644 --- a/Authors +++ b/Authors @@ -1,5 +1,7 @@ Andy Smith Anne Gentle +Anthony Young +Armando Migliaccio Chris Behrens Devin Carlen Eric Day @@ -8,7 +10,7 @@ Hisaki Ohara Jay Pipes Jesse Andrews Joe Heck -Joel Moore joelbm24@gmail.com +Joel Moore Joshua McKenty Justin Santa Barbara Matt Dietz @@ -19,4 +21,5 @@ Rick Clark Soren Hansen Todd Willey Vishvananda Ishaya -¿¿¿??? +Youcef Laribi +Zhixue Wu -- cgit From a1cdb02360cc18acb1b7836ce6a07dffd2481635 Mon Sep 17 00:00:00 2001 From: Armando Migliaccio Date: Tue, 16 Nov 2010 18:37:19 +0000 Subject: First dump of content related to Nova RPC and RabbitMQ --- doc/source/devref/rabbit.rst | 114 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 113 insertions(+), 1 deletion(-) diff --git a/doc/source/devref/rabbit.rst b/doc/source/devref/rabbit.rst index 48cdce852..a58f838a4 100644 --- a/doc/source/devref/rabbit.rst +++ b/doc/source/devref/rabbit.rst @@ -1 +1,113 @@ -placeholder +.. + Copyright 2010 United States Government as represented by the + Administrator of the National Aeronautics and Space Administration. + Figures and content Copyright 2010 Citrix + 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. + +RabbitMQ and Nova +================= + +RabbitMQ is the messaging component chosen by the OpenStack cloud. RabbitMQ sits between any two Nova components and allows them to communicate in a loosely coupled fashion. More precisely, Nova components (the compute fabric of OpenStack) use Remote Procedure Calls to communicate to one another; however such a paradigm is built atop the publish/subscribe paradigm so that the following benefits can be achieved: + + * Decoupling between client and servant (i.e. the client does not need to know where the servant's reference is); + * Full a-synchronism between client and servant (i.e. the client does not need the servant to run at the same time of the remote call); + * Random balancing of remote calls (i.e. if more servants are up and running, one-way calls are transparently dispatched to the first available servant); + +Nova (Austin release) uses both direct and topic-based exchanges. The architecture looks like the one depicted in the Figure 1: + +.. todo:: Figure 1 + +Nova implements RPC calls (both request/response - named call - and one-way - named cast -) over AMQP by providing an adapter class which take cares of marshalling and unmarshalling of messages into function calls. Each Nova service (e.g. Compute, Volume, etc.) create two queues at the initialization time, one which accepts messages with routing keys 'NODE-TYPE.NODE-ID' (e.g. compute.hostname) and another, which accepts messages with routing keys as generic 'NODE-TYPE' (e.g. compute). The former is used specifically when Nova-API needs to redirect commands to a specific node like 'euca-terminate instance'. In this case, only the compute node whose host's hypervisor is running the virtual machine can kill the instance. The API acts as a consumer when RPC calls are request/response, otherwise is acts as publisher only. + +Nova RPC Mappings +================= + +Figure 2 shows the internals of a RabbitMQ node when a single instance is deployed and shared in an OpenStack cloud. Every Nova component connects to the RabbitMQ instance and, depending on its personality (e.g. a compute node or a network node), may use the queue either as an Invoker (such as API or Scheduler) or a Worker (such as Compute, Volume or Network). Invokers and Workers do not actually exist in the Nova object model, but we are going to use them as an abstraction for sake of clarity. An Invoker is a component that sends messages in the queuing system via two operations: i) rpc.call (request/response) and ii) rpc.cast (one-way); a Worker is a component that receives messages from the queuing system and reply accordingly to rcp.call operations. Figure 2 shows the following internal elements: + + * Topic Publisher: a Topic Publisher comes to life when an rpc.call or an rpc.cast operation is executed; this object is instantiated and used to push a message to the queuing system. Every publisher connects always to the same topic-based exchange; its life-cycle is limited to the message delivery; + * Direct Consumer: a Direct Consumer comes to life if (an only if) a rpc.call operation is executed; this object is instantiated and used to receive a response message from the queuing system; Every consumer connects to a unique direct-based exchange via a unique exclusive queue; its life-cycle is limited to the message delivery; the exchange and queue identifiers are determined by a UUID generator, and are marshalled in the message sent by the Topic Publisher (only rpc.call operations); + * Topic Consumer: a Topic Consumer comes to life as soon as a Worker is instantiated and exists throughout its life-cycle; this object is used to receive messages from the queue and it invokes the appropriate action as defined by the Worker role. A Topic Consumer connects to the same topic-based exchange either via a shared queue or via a unique exclusive queue. Every Worker has two topic consumers, one that is addressed only during rpc.cast operations (and it connects to a shared queue whose exchange key is 'topic') and the other that is addressed only during rpc.call operations (and it connects to a unique queue whose exchange key is 'topic.host'). + * Direct Publisher: a Direct Publisher comes to life only during rpc.call operations and it is instantiated to return the message required by the request/response operation. The object connects to a direct-based exchange whose identity is dictated by the incoming message. + * Topic Exchange: The Exchange is a routing table that exists in the context of a virtual host (the multi-tenancy mechanism provided by RabbitMQ); its type (i.e. topic vs. direct) determines the routing policy; a RabbitMQ node will have only one topic-based exchange for every topic in Nova; + * Direct Exchange: this is a routing table that is created during rpc.call operations; there are many instances of this kind of exchange throughout the life-cycle of a RabbitMQ node, one for each rpc.call invoked; + * Queue Element: A Queue is a message bucket. Messages are kept in the queue until a Consumer (either Topic or Direct Consumer) connects to the queue and fetch it. Queues can be shared or can be exclusive. Queues whose routing key is 'topic' are shared amongst Workers of the same personality; + +.. todo:: Figure 2 + +RPC Calls +========= + +Figure 3 shows the message flow during an rp.call operation: i) a Topic Publisher is instantiated to send the message request to the queuing system; immediately before the publishing operation, a Direct Consumer is instantiated to wait for the response message; ii) once the message is dispatched by the exchange, it is fetched by the Topic Consumer dictated by the routing key (i.e. 'topic.host') and passed to the Worker in charge of the task; iii) once the task is completed, a Direct Publisher is allocated to send the response message to the queuing system; iv) once the message is dispatched by the exchange, it is fetched by the Direct Consumer dictated by the routing key (i.e. 'msg_id') and passed to the Invoker; + +.. todo:: Figure 3 + +RPC Casts +========= + +Figure 4 shows the message flow during an rp.cast operation: i) a Topic Publisher is instantiated to send the message request to the queuing system; ii) once the message is dispatched by the exchange, it is fetched by the Topic Consumer dictated by the routing key (i.e. 'topic) and passed to the Worker in charge of the task; + +.. todo:: Figure 4 + +RabbitMQ Load +============= + +At any given time the load of a RabbitMQ node is function of the following parameters: + + * Throughput of API calls: the number of API calls (more precisely rpc.call ops) being served by the OpenStack cloud dictates the number of direct-based exchanges, related queues and direct consumers connected to them; + * Number of Workers: there is one queue shared amongst workers with the same personality; however there are as many exclusive queues as the number of workers; the number of workers dictates also the number of routing keys within the +topic-based exchange, which is shared amongst all workers; + +Figure 5 shows the status of the RabbitMQ node after Nova components' bootstrap in a test environment. Queues being created by Nova components are: i) nova-exchange; ii) volume; iii) compute; iv) cloud; v) network; vi) network.phonic; +vii) volume.phonic; viii) compute.phonic; ix) compute.scheduler. Figure 6 shows the status of the RabbitMQ node after an rpc.call operation. In the latter case there is a direct exchange and a queue with the same name. + +.. todo:: Figure 5 + +RabbitMQ Gotchas +================ + +Nova uses Carrot to connect to the RabbitMQ environment. Carrot is a Python library that in turn uses AMQPLib, a library that implements the standard AMQP 0.8 at the time of writing. When using Carrot, Invokers and Workers need the following parameters in order to instantiate a Connection object that connects to the RabbitMQ server: + + * Hostname: The hostname to the AMQP server; + * Userid: A valid username used to authenticate to the server; + * Password: The password used to authenticate to the server; + * Virtual_host: The name of the virtual host to work with. This virtual host must exist on the server, and the user must have access to it. Default is "/"; + * Port: The port of the AMQP server. Default is 5672 (amqp); + +The following parameters are default: + + * Insist: insist on connecting to a server. In a configuration with multiple load-sharing servers, the Insist option tells the server that the client is insisting on a connection to the specified server. Default is False; + * Connect_timeout: the timeout in seconds before the client gives up connecting to the server. The default is no timeout; + * SSL: use SSL to connect to the server. The default is False; + More precisely Consumers need the following parameters: + * Connection: the above mentioned Connection object; + * Queue: name of the queue; + * Exchange: name of the exchange the queue binds to; + * Routing_key: the interpretation of the routing key depends on the value of the exchange_type attribute: + * Direct exchange: if the routing key property of the message and the routing_key attribute of the queue are identical, then the message is forwarded to the queue; + * Fanout exchange: messages are forwarded to the queues bound the exchange, even if the binding does not have a key; + * Topic exchange: if the routing key property of the message matches the routing key of the key according to a primitive pattern matching scheme, then the message is forwarded to the queue. The message routing key then consists of words separated by dots (".", like domain names), and two special characters are available; star ("") and hash ("#"). The star matches any word, and the hash matches zero or more words. For example ".stock.#" matches the routing keys "usd.stock" and "eur.stock.db" but not "stock.nasdaq"; + * Durable: this flag determines the durability of both exchanges and queues; durable exchanges and queues remain active when a RabbitMQ server restarts. Non-durable exchanges/queues (transient exchanges/queues) are purged when a server restarts. It is worth noting that AMQP specifies that durable queues cannot bind to transient exchanges. Default is True; + * Auto_delete: if set, the exchange is deleted when all queues have finished using it. Default is False. + * Exclusive: exclusive queues (i.e. non-shared) may only be consumed from by the current connection. When exclusive is on, this also implies auto_delete. Default is False; + * Exchange_type: AMQP defines several default exchange types (routing algorithms) that covers most of the common messaging use cases; + * Auto_ack: acknowledgement is handled automatically once messages are received. By default auto_ack is set to False, and the receiver is required to manually handle acknowledgment; + * No_ack: it disable acknowledgement on the server-side. This is different from auto_ack in that acknowledgement is turned off altogether. This functionality increases performance but at the cost of reliability. Messages can get lost if a client dies before it can deliver them to the application; + * Auto_declare: if this is True and the exchange name is set, the exchange will be automatically declared at instantiation. Auto declare is on by default; + Publishers specify most the parameters of Consumers (i.e. they do not specify a queue name), but they can also specify the following: + * Delivery_mode: the default delivery mode used for messages. The value is an integer. The following delivery modes are supported by RabbitMQ: + o 1 or "transient": the message is transient. Which means it is stored in memory only, and is lost if the server dies or restarts. + o 2 or "persistent": the message is persistent. Which means the message is stored both in-memory, and on disk, and therefore preserved if the server dies or restarts. + +The default value is 2 (persistent). During a send operation, Publishers can override the delivery mode of messages so that, for example, transient messages can be sent over a durable queue. -- cgit From 56c2df202d89f0954ab5a10284b3ee4d6111bc8b Mon Sep 17 00:00:00 2001 From: Armando Migliaccio Date: Wed, 17 Nov 2010 13:20:55 +0000 Subject: Further editing and added images --- doc/source/devref/index.rst | 7 ++ doc/source/devref/rabbit.rst | 148 +++++++++++++++++++++++-------------- doc/source/images/rabbit/arch.png | Bin 0 -> 26690 bytes doc/source/images/rabbit/flow1.png | Bin 0 -> 40982 bytes doc/source/images/rabbit/flow2.png | Bin 0 -> 30650 bytes doc/source/images/rabbit/rabt.png | Bin 0 -> 44964 bytes doc/source/images/rabbit/state.png | Bin 0 -> 38543 bytes 7 files changed, 99 insertions(+), 56 deletions(-) create mode 100644 doc/source/images/rabbit/arch.png create mode 100644 doc/source/images/rabbit/flow1.png create mode 100644 doc/source/images/rabbit/flow2.png create mode 100644 doc/source/images/rabbit/rabt.png create mode 100644 doc/source/images/rabbit/state.png diff --git a/doc/source/devref/index.rst b/doc/source/devref/index.rst index 6a93e3e18..e9c28305c 100644 --- a/doc/source/devref/index.rst +++ b/doc/source/devref/index.rst @@ -26,6 +26,13 @@ Programming HowTos and Tutorials .. todo:: Add some programming howtos and tuts +Programming Concepts +-------------------- +.. toctree:: + :maxdepth: 3 + + rabbit + API Reference ------------- .. toctree:: diff --git a/doc/source/devref/rabbit.rst b/doc/source/devref/rabbit.rst index a58f838a4..d285e3198 100644 --- a/doc/source/devref/rabbit.rst +++ b/doc/source/devref/rabbit.rst @@ -1,9 +1,6 @@ .. - Copyright 2010 United States Government as represented by the - Administrator of the National Aeronautics and Space Administration. - Figures and content Copyright 2010 Citrix - All Rights Reserved. - + Copyright (c) 2010 Citrix Systems, Inc. + 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 @@ -19,95 +16,134 @@ RabbitMQ and Nova ================= -RabbitMQ is the messaging component chosen by the OpenStack cloud. RabbitMQ sits between any two Nova components and allows them to communicate in a loosely coupled fashion. More precisely, Nova components (the compute fabric of OpenStack) use Remote Procedure Calls to communicate to one another; however such a paradigm is built atop the publish/subscribe paradigm so that the following benefits can be achieved: +RabbitMQ is the messaging component chosen by the OpenStack cloud. RabbitMQ sits between any two Nova components and allows them to communicate in a loosely coupled fashion. More precisely, Nova components (the compute fabric of OpenStack) use Remote Procedure Calls (RPC hereinafter) to communicate to one another; however such a paradigm is built atop the publish/subscribe paradigm so that the following benefits can be achieved: + + * Decoupling between client and servant (such as the client does not need to know where the servant's reference is). + * Full a-synchronism between client and servant (such as the client does not need the servant to run at the same time of the remote call). + * Random balancing of remote calls (such as if more servants are up and running, one-way calls are transparently dispatched to the first available servant). - * Decoupling between client and servant (i.e. the client does not need to know where the servant's reference is); - * Full a-synchronism between client and servant (i.e. the client does not need the servant to run at the same time of the remote call); - * Random balancing of remote calls (i.e. if more servants are up and running, one-way calls are transparently dispatched to the first available servant); +Nova (Austin release) uses both direct and topic-based exchanges. The architecture looks like the one depicted in the figure below: -Nova (Austin release) uses both direct and topic-based exchanges. The architecture looks like the one depicted in the Figure 1: +.. image:: /images/rabbit/arch.png + :width: 100% -.. todo:: Figure 1 +.. -Nova implements RPC calls (both request/response - named call - and one-way - named cast -) over AMQP by providing an adapter class which take cares of marshalling and unmarshalling of messages into function calls. Each Nova service (e.g. Compute, Volume, etc.) create two queues at the initialization time, one which accepts messages with routing keys 'NODE-TYPE.NODE-ID' (e.g. compute.hostname) and another, which accepts messages with routing keys as generic 'NODE-TYPE' (e.g. compute). The former is used specifically when Nova-API needs to redirect commands to a specific node like 'euca-terminate instance'. In this case, only the compute node whose host's hypervisor is running the virtual machine can kill the instance. The API acts as a consumer when RPC calls are request/response, otherwise is acts as publisher only. +Nova implements RPC (both request+response, and one-way, respectively nicknamed 'rpc.call' and 'rpc.cast') over AMQP by providing an adapter class which take cares of marshalling and unmarshalling of messages into function calls. Each Nova service (for example Compute, Volume, etc.) create two queues at the initialization time, one which accepts messages with routing keys 'NODE-TYPE.NODE-ID' (for example compute.hostname) and another, which accepts messages with routing keys as generic 'NODE-TYPE' (for example compute). The former is used specifically when Nova-API needs to redirect commands to a specific node like 'euca-terminate instance'. In this case, only the compute node whose host's hypervisor is running the virtual machine can kill the instance. The API acts as a consumer when RPC calls are request/response, otherwise is acts as publisher only. Nova RPC Mappings ================= -Figure 2 shows the internals of a RabbitMQ node when a single instance is deployed and shared in an OpenStack cloud. Every Nova component connects to the RabbitMQ instance and, depending on its personality (e.g. a compute node or a network node), may use the queue either as an Invoker (such as API or Scheduler) or a Worker (such as Compute, Volume or Network). Invokers and Workers do not actually exist in the Nova object model, but we are going to use them as an abstraction for sake of clarity. An Invoker is a component that sends messages in the queuing system via two operations: i) rpc.call (request/response) and ii) rpc.cast (one-way); a Worker is a component that receives messages from the queuing system and reply accordingly to rcp.call operations. Figure 2 shows the following internal elements: +The figure below shows the internals of a RabbitMQ node when a single instance is deployed and shared in an OpenStack cloud. Every Nova component connects to the RabbitMQ instance and, depending on its personality (for example a compute node or a network node), may use the queue either as an Invoker (such as API or Scheduler) or a Worker (such as Compute, Volume or Network). Invokers and Workers do not actually exist in the Nova object model, but we are going to use them as an abstraction for sake of clarity. An Invoker is a component that sends messages in the queuing system via two operations: 1) rpc.call and ii) rpc.cast; a Worker is a component that receives messages from the queuing system and reply accordingly to rcp.call operations. + +Figure 2 shows the following internal elements: - * Topic Publisher: a Topic Publisher comes to life when an rpc.call or an rpc.cast operation is executed; this object is instantiated and used to push a message to the queuing system. Every publisher connects always to the same topic-based exchange; its life-cycle is limited to the message delivery; - * Direct Consumer: a Direct Consumer comes to life if (an only if) a rpc.call operation is executed; this object is instantiated and used to receive a response message from the queuing system; Every consumer connects to a unique direct-based exchange via a unique exclusive queue; its life-cycle is limited to the message delivery; the exchange and queue identifiers are determined by a UUID generator, and are marshalled in the message sent by the Topic Publisher (only rpc.call operations); + * Topic Publisher: a Topic Publisher comes to life when an rpc.call or an rpc.cast operation is executed; this object is instantiated and used to push a message to the queuing system. Every publisher connects always to the same topic-based exchange; its life-cycle is limited to the message delivery. + * Direct Consumer: a Direct Consumer comes to life if (an only if) a rpc.call operation is executed; this object is instantiated and used to receive a response message from the queuing system; Every consumer connects to a unique direct-based exchange via a unique exclusive queue; its life-cycle is limited to the message delivery; the exchange and queue identifiers are determined by a UUID generator, and are marshalled in the message sent by the Topic Publisher (only rpc.call operations). * Topic Consumer: a Topic Consumer comes to life as soon as a Worker is instantiated and exists throughout its life-cycle; this object is used to receive messages from the queue and it invokes the appropriate action as defined by the Worker role. A Topic Consumer connects to the same topic-based exchange either via a shared queue or via a unique exclusive queue. Every Worker has two topic consumers, one that is addressed only during rpc.cast operations (and it connects to a shared queue whose exchange key is 'topic') and the other that is addressed only during rpc.call operations (and it connects to a unique queue whose exchange key is 'topic.host'). * Direct Publisher: a Direct Publisher comes to life only during rpc.call operations and it is instantiated to return the message required by the request/response operation. The object connects to a direct-based exchange whose identity is dictated by the incoming message. - * Topic Exchange: The Exchange is a routing table that exists in the context of a virtual host (the multi-tenancy mechanism provided by RabbitMQ); its type (i.e. topic vs. direct) determines the routing policy; a RabbitMQ node will have only one topic-based exchange for every topic in Nova; - * Direct Exchange: this is a routing table that is created during rpc.call operations; there are many instances of this kind of exchange throughout the life-cycle of a RabbitMQ node, one for each rpc.call invoked; - * Queue Element: A Queue is a message bucket. Messages are kept in the queue until a Consumer (either Topic or Direct Consumer) connects to the queue and fetch it. Queues can be shared or can be exclusive. Queues whose routing key is 'topic' are shared amongst Workers of the same personality; + * Topic Exchange: The Exchange is a routing table that exists in the context of a virtual host (the multi-tenancy mechanism provided by RabbitMQ); its type (such as topic vs. direct) determines the routing policy; a RabbitMQ node will have only one topic-based exchange for every topic in Nova. + * Direct Exchange: this is a routing table that is created during rpc.call operations; there are many instances of this kind of exchange throughout the life-cycle of a RabbitMQ node, one for each rpc.call invoked. + * Queue Element: A Queue is a message bucket. Messages are kept in the queue until a Consumer (either Topic or Direct Consumer) connects to the queue and fetch it. Queues can be shared or can be exclusive. Queues whose routing key is 'topic' are shared amongst Workers of the same personality. -.. todo:: Figure 2 +.. image:: /images/rabbit/rabt.png + :width: 100% + +.. RPC Calls ========= -Figure 3 shows the message flow during an rp.call operation: i) a Topic Publisher is instantiated to send the message request to the queuing system; immediately before the publishing operation, a Direct Consumer is instantiated to wait for the response message; ii) once the message is dispatched by the exchange, it is fetched by the Topic Consumer dictated by the routing key (i.e. 'topic.host') and passed to the Worker in charge of the task; iii) once the task is completed, a Direct Publisher is allocated to send the response message to the queuing system; iv) once the message is dispatched by the exchange, it is fetched by the Direct Consumer dictated by the routing key (i.e. 'msg_id') and passed to the Invoker; +The diagram below shows the message flow during an rp.call operation: + + 1. a Topic Publisher is instantiated to send the message request to the queuing system; immediately before the publishing operation, a Direct Consumer is instantiated to wait for the response message. + 2. once the message is dispatched by the exchange, it is fetched by the Topic Consumer dictated by the routing key (such as 'topic.host') and passed to the Worker in charge of the task. + 3. once the task is completed, a Direct Publisher is allocated to send the response message to the queuing system. + 4. once the message is dispatched by the exchange, it is fetched by the Direct Consumer dictated by the routing key (such as 'msg_id') and passed to the Invoker. -.. todo:: Figure 3 +.. image:: /images/rabbit/flow1.png + :width: 100% + +.. RPC Casts ========= -Figure 4 shows the message flow during an rp.cast operation: i) a Topic Publisher is instantiated to send the message request to the queuing system; ii) once the message is dispatched by the exchange, it is fetched by the Topic Consumer dictated by the routing key (i.e. 'topic) and passed to the Worker in charge of the task; +The diagram below the message flow during an rp.cast operation: -.. todo:: Figure 4 + 1. a Topic Publisher is instantiated to send the message request to the queuing system. + 2. once the message is dispatched by the exchange, it is fetched by the Topic Consumer dictated by the routing key (such as 'topic') and passed to the Worker in charge of the task. + +.. image:: /images/rabbit/flow2.png + :width: 100% + +.. RabbitMQ Load ============= At any given time the load of a RabbitMQ node is function of the following parameters: - * Throughput of API calls: the number of API calls (more precisely rpc.call ops) being served by the OpenStack cloud dictates the number of direct-based exchanges, related queues and direct consumers connected to them; - * Number of Workers: there is one queue shared amongst workers with the same personality; however there are as many exclusive queues as the number of workers; the number of workers dictates also the number of routing keys within the -topic-based exchange, which is shared amongst all workers; - -Figure 5 shows the status of the RabbitMQ node after Nova components' bootstrap in a test environment. Queues being created by Nova components are: i) nova-exchange; ii) volume; iii) compute; iv) cloud; v) network; vi) network.phonic; -vii) volume.phonic; viii) compute.phonic; ix) compute.scheduler. Figure 6 shows the status of the RabbitMQ node after an rpc.call operation. In the latter case there is a direct exchange and a queue with the same name. + * Throughput of API calls: the number of API calls (more precisely rpc.call ops) being served by the OpenStack cloud dictates the number of direct-based exchanges, related queues and direct consumers connected to them. + * Number of Workers: there is one queue shared amongst workers with the same personality; however there are as many exclusive queues as the number of workers; the number of workers dictates also the number of routing keys within the topic-based exchange, which is shared amongst all workers. + +The figure below shows the status of the RabbitMQ node after Nova components' bootstrap in a test environment. Queues being created by Nova components are: + + * Exchanges + 1. nova (topic exchange) + * Queues + 1. compute.phantom (phantom is hostname) + 2. compute + 3. network.phantom (phantom is hostname) + 4. network + 5. volume.phantom (phantom is hostname) + 6. volume + 7. scheduler.phantom (phantom is hostname) + 8. scheduler + +.. image:: /images/rabbit/state.png + :width: 100% -.. todo:: Figure 5 +.. RabbitMQ Gotchas ================ -Nova uses Carrot to connect to the RabbitMQ environment. Carrot is a Python library that in turn uses AMQPLib, a library that implements the standard AMQP 0.8 at the time of writing. When using Carrot, Invokers and Workers need the following parameters in order to instantiate a Connection object that connects to the RabbitMQ server: +Nova uses Carrot to connect to the RabbitMQ environment. Carrot is a Python library that in turn uses AMQPLib, a library that implements the standard AMQP 0.8 at the time of writing. When using Carrot, Invokers and Workers need the following parameters in order to instantiate a Connection object that connects to the RabbitMQ server (please note that most of the following material can be also found in the Carrot documentation; it has been summarized and revised here for sake of clarity): - * Hostname: The hostname to the AMQP server; - * Userid: A valid username used to authenticate to the server; - * Password: The password used to authenticate to the server; - * Virtual_host: The name of the virtual host to work with. This virtual host must exist on the server, and the user must have access to it. Default is "/"; - * Port: The port of the AMQP server. Default is 5672 (amqp); + * Hostname: The hostname to the AMQP server. + * Userid: A valid username used to authenticate to the server. + * Password: The password used to authenticate to the server. + * Virtual_host: The name of the virtual host to work with. This virtual host must exist on the server, and the user must have access to it. Default is "/". + * Port: The port of the AMQP server. Default is 5672 (amqp). The following parameters are default: - * Insist: insist on connecting to a server. In a configuration with multiple load-sharing servers, the Insist option tells the server that the client is insisting on a connection to the specified server. Default is False; - * Connect_timeout: the timeout in seconds before the client gives up connecting to the server. The default is no timeout; - * SSL: use SSL to connect to the server. The default is False; - More precisely Consumers need the following parameters: - * Connection: the above mentioned Connection object; - * Queue: name of the queue; - * Exchange: name of the exchange the queue binds to; - * Routing_key: the interpretation of the routing key depends on the value of the exchange_type attribute: - * Direct exchange: if the routing key property of the message and the routing_key attribute of the queue are identical, then the message is forwarded to the queue; - * Fanout exchange: messages are forwarded to the queues bound the exchange, even if the binding does not have a key; - * Topic exchange: if the routing key property of the message matches the routing key of the key according to a primitive pattern matching scheme, then the message is forwarded to the queue. The message routing key then consists of words separated by dots (".", like domain names), and two special characters are available; star ("") and hash ("#"). The star matches any word, and the hash matches zero or more words. For example ".stock.#" matches the routing keys "usd.stock" and "eur.stock.db" but not "stock.nasdaq"; - * Durable: this flag determines the durability of both exchanges and queues; durable exchanges and queues remain active when a RabbitMQ server restarts. Non-durable exchanges/queues (transient exchanges/queues) are purged when a server restarts. It is worth noting that AMQP specifies that durable queues cannot bind to transient exchanges. Default is True; + * Insist: insist on connecting to a server. In a configuration with multiple load-sharing servers, the Insist option tells the server that the client is insisting on a connection to the specified server. Default is False. + * Connect_timeout: the timeout in seconds before the client gives up connecting to the server. The default is no timeout. + * SSL: use SSL to connect to the server. The default is False. + +More precisely Consumers need the following parameters: + + * Connection: the above mentioned Connection object. + * Queue: name of the queue. + * Exchange: name of the exchange the queue binds to. + * Routing_key: the interpretation of the routing key depends on the value of the exchange_type attribute. + + ** Direct exchange: if the routing key property of the message and the routing_key attribute of the queue are identical, then the message is forwarded to the queue. + ** Fanout exchange: messages are forwarded to the queues bound the exchange, even if the binding does not have a key. + ** Topic exchange: if the routing key property of the message matches the routing key of the key according to a primitive pattern matching scheme, then the message is forwarded to the queue. The message routing key then consists of words separated by dots (".", like domain names), and two special characters are available; star ("") and hash ("#"). The star matches any word, and the hash matches zero or more words. For example ".stock.#" matches the routing keys "usd.stock" and "eur.stock.db" but not "stock.nasdaq". + + * Durable: this flag determines the durability of both exchanges and queues; durable exchanges and queues remain active when a RabbitMQ server restarts. Non-durable exchanges/queues (transient exchanges/queues) are purged when a server restarts. It is worth noting that AMQP specifies that durable queues cannot bind to transient exchanges. Default is True. * Auto_delete: if set, the exchange is deleted when all queues have finished using it. Default is False. - * Exclusive: exclusive queues (i.e. non-shared) may only be consumed from by the current connection. When exclusive is on, this also implies auto_delete. Default is False; - * Exchange_type: AMQP defines several default exchange types (routing algorithms) that covers most of the common messaging use cases; - * Auto_ack: acknowledgement is handled automatically once messages are received. By default auto_ack is set to False, and the receiver is required to manually handle acknowledgment; - * No_ack: it disable acknowledgement on the server-side. This is different from auto_ack in that acknowledgement is turned off altogether. This functionality increases performance but at the cost of reliability. Messages can get lost if a client dies before it can deliver them to the application; - * Auto_declare: if this is True and the exchange name is set, the exchange will be automatically declared at instantiation. Auto declare is on by default; - Publishers specify most the parameters of Consumers (i.e. they do not specify a queue name), but they can also specify the following: + * Exclusive: exclusive queues (such as non-shared) may only be consumed from by the current connection. When exclusive is on, this also implies auto_delete. Default is False. + * Exchange_type: AMQP defines several default exchange types (routing algorithms) that covers most of the common messaging use cases. + * Auto_ack: acknowledgement is handled automatically once messages are received. By default auto_ack is set to False, and the receiver is required to manually handle acknowledgment. + * No_ack: it disable acknowledgement on the server-side. This is different from auto_ack in that acknowledgement is turned off altogether. This functionality increases performance but at the cost of reliability. Messages can get lost if a client dies before it can deliver them to the application. + * Auto_declare: if this is True and the exchange name is set, the exchange will be automatically declared at instantiation. Auto declare is on by default. + Publishers specify most the parameters of Consumers (such as they do not specify a queue name), but they can also specify the following: * Delivery_mode: the default delivery mode used for messages. The value is an integer. The following delivery modes are supported by RabbitMQ: - o 1 or "transient": the message is transient. Which means it is stored in memory only, and is lost if the server dies or restarts. - o 2 or "persistent": the message is persistent. Which means the message is stored both in-memory, and on disk, and therefore preserved if the server dies or restarts. + ** 1 or "transient": the message is transient. Which means it is stored in memory only, and is lost if the server dies or restarts. + ** 2 or "persistent": the message is persistent. Which means the message is stored both in-memory, and on disk, and therefore preserved if the server dies or restarts. The default value is 2 (persistent). During a send operation, Publishers can override the delivery mode of messages so that, for example, transient messages can be sent over a durable queue. diff --git a/doc/source/images/rabbit/arch.png b/doc/source/images/rabbit/arch.png new file mode 100644 index 000000000..8f7d535b6 Binary files /dev/null and b/doc/source/images/rabbit/arch.png differ diff --git a/doc/source/images/rabbit/flow1.png b/doc/source/images/rabbit/flow1.png new file mode 100644 index 000000000..ea325ad08 Binary files /dev/null and b/doc/source/images/rabbit/flow1.png differ diff --git a/doc/source/images/rabbit/flow2.png b/doc/source/images/rabbit/flow2.png new file mode 100644 index 000000000..19de2aafd Binary files /dev/null and b/doc/source/images/rabbit/flow2.png differ diff --git a/doc/source/images/rabbit/rabt.png b/doc/source/images/rabbit/rabt.png new file mode 100644 index 000000000..e3923b9a7 Binary files /dev/null and b/doc/source/images/rabbit/rabt.png differ diff --git a/doc/source/images/rabbit/state.png b/doc/source/images/rabbit/state.png new file mode 100644 index 000000000..76ce675a9 Binary files /dev/null and b/doc/source/images/rabbit/state.png differ -- cgit From 0c19386f7c4ca063edbf8c10ffb86b399884e457 Mon Sep 17 00:00:00 2001 From: Armando Migliaccio Date: Wed, 17 Nov 2010 16:20:50 +0000 Subject: small edit --- doc/source/devref/rabbit.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/source/devref/rabbit.rst b/doc/source/devref/rabbit.rst index d285e3198..9720b8bc2 100644 --- a/doc/source/devref/rabbit.rst +++ b/doc/source/devref/rabbit.rst @@ -87,7 +87,7 @@ At any given time the load of a RabbitMQ node is function of the following param * Throughput of API calls: the number of API calls (more precisely rpc.call ops) being served by the OpenStack cloud dictates the number of direct-based exchanges, related queues and direct consumers connected to them. * Number of Workers: there is one queue shared amongst workers with the same personality; however there are as many exclusive queues as the number of workers; the number of workers dictates also the number of routing keys within the topic-based exchange, which is shared amongst all workers. -The figure below shows the status of the RabbitMQ node after Nova components' bootstrap in a test environment. Queues being created by Nova components are: +The figure below shows the status of the RabbitMQ node after Nova components' bootstrap in a test environment. Exchanges and queues being created by Nova components are: * Exchanges 1. nova (topic exchange) -- cgit From 37fcda35e7e409b746e0d99ca4392dcb4fc8ed01 Mon Sep 17 00:00:00 2001 From: Armando Migliaccio Date: Wed, 17 Nov 2010 19:17:51 +0000 Subject: adjusting images size and bulleted list --- doc/source/devref/rabbit.rst | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/doc/source/devref/rabbit.rst b/doc/source/devref/rabbit.rst index 9720b8bc2..4468e575b 100644 --- a/doc/source/devref/rabbit.rst +++ b/doc/source/devref/rabbit.rst @@ -25,7 +25,7 @@ RabbitMQ is the messaging component chosen by the OpenStack cloud. RabbitMQ sit Nova (Austin release) uses both direct and topic-based exchanges. The architecture looks like the one depicted in the figure below: .. image:: /images/rabbit/arch.png - :width: 100% + :width: 60% .. @@ -47,7 +47,7 @@ Figure 2 shows the following internal elements: * Queue Element: A Queue is a message bucket. Messages are kept in the queue until a Consumer (either Topic or Direct Consumer) connects to the queue and fetch it. Queues can be shared or can be exclusive. Queues whose routing key is 'topic' are shared amongst Workers of the same personality. .. image:: /images/rabbit/rabt.png - :width: 100% + :width: 60% .. @@ -62,7 +62,7 @@ The diagram below shows the message flow during an rp.call operation: 4. once the message is dispatched by the exchange, it is fetched by the Direct Consumer dictated by the routing key (such as 'msg_id') and passed to the Invoker. .. image:: /images/rabbit/flow1.png - :width: 100% + :width: 60% .. @@ -75,7 +75,7 @@ The diagram below the message flow during an rp.cast operation: 2. once the message is dispatched by the exchange, it is fetched by the Topic Consumer dictated by the routing key (such as 'topic') and passed to the Worker in charge of the task. .. image:: /images/rabbit/flow2.png - :width: 100% + :width: 60% .. @@ -102,7 +102,7 @@ The figure below shows the status of the RabbitMQ node after Nova components' bo 8. scheduler .. image:: /images/rabbit/state.png - :width: 100% + :width: 60% .. @@ -130,9 +130,9 @@ More precisely Consumers need the following parameters: * Exchange: name of the exchange the queue binds to. * Routing_key: the interpretation of the routing key depends on the value of the exchange_type attribute. - ** Direct exchange: if the routing key property of the message and the routing_key attribute of the queue are identical, then the message is forwarded to the queue. - ** Fanout exchange: messages are forwarded to the queues bound the exchange, even if the binding does not have a key. - ** Topic exchange: if the routing key property of the message matches the routing key of the key according to a primitive pattern matching scheme, then the message is forwarded to the queue. The message routing key then consists of words separated by dots (".", like domain names), and two special characters are available; star ("") and hash ("#"). The star matches any word, and the hash matches zero or more words. For example ".stock.#" matches the routing keys "usd.stock" and "eur.stock.db" but not "stock.nasdaq". + * Direct exchange: if the routing key property of the message and the routing_key attribute of the queue are identical, then the message is forwarded to the queue. + * Fanout exchange: messages are forwarded to the queues bound the exchange, even if the binding does not have a key. + * Topic exchange: if the routing key property of the message matches the routing key of the key according to a primitive pattern matching scheme, then the message is forwarded to the queue. The message routing key then consists of words separated by dots (".", like domain names), and two special characters are available; star ("") and hash ("#"). The star matches any word, and the hash matches zero or more words. For example ".stock.#" matches the routing keys "usd.stock" and "eur.stock.db" but not "stock.nasdaq". * Durable: this flag determines the durability of both exchanges and queues; durable exchanges and queues remain active when a RabbitMQ server restarts. Non-durable exchanges/queues (transient exchanges/queues) are purged when a server restarts. It is worth noting that AMQP specifies that durable queues cannot bind to transient exchanges. Default is True. * Auto_delete: if set, the exchange is deleted when all queues have finished using it. Default is False. @@ -143,7 +143,8 @@ More precisely Consumers need the following parameters: * Auto_declare: if this is True and the exchange name is set, the exchange will be automatically declared at instantiation. Auto declare is on by default. Publishers specify most the parameters of Consumers (such as they do not specify a queue name), but they can also specify the following: * Delivery_mode: the default delivery mode used for messages. The value is an integer. The following delivery modes are supported by RabbitMQ: - ** 1 or "transient": the message is transient. Which means it is stored in memory only, and is lost if the server dies or restarts. - ** 2 or "persistent": the message is persistent. Which means the message is stored both in-memory, and on disk, and therefore preserved if the server dies or restarts. + + * 1 or "transient": the message is transient. Which means it is stored in memory only, and is lost if the server dies or restarts. + * 2 or "persistent": the message is persistent. Which means the message is stored both in-memory, and on disk, and therefore preserved if the server dies or restarts. The default value is 2 (persistent). During a send operation, Publishers can override the delivery mode of messages so that, for example, transient messages can be sent over a durable queue. -- cgit From aa433547ff797678cd2aad17d70c1c0b569d1e37 Mon Sep 17 00:00:00 2001 From: Armando Migliaccio Date: Fri, 19 Nov 2010 17:32:38 +0000 Subject: first cut of fixes for bug #676128 --- nova/virt/xenapi.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/nova/virt/xenapi.py b/nova/virt/xenapi.py index 0f563aa41..2f115c14b 100644 --- a/nova/virt/xenapi.py +++ b/nova/virt/xenapi.py @@ -286,11 +286,21 @@ class XenAPIConnection(object): # Don't complain, just return. This lets us clean up instances # that have already disappeared from the underlying platform. defer.returnValue(None) + # Get the VDIs related to the VM + vdis = yield self._lookup_vm_vdis(vm) try: task = yield self._call_xenapi('Async.VM.hard_shutdown', vm) yield self._wait_for_task(task) except Exception, exc: logging.warn(exc) + # Disk clean-up + if vdis: + for vdi in vdis: + try: + task = yield self._call_xenapi('Async.VDI.destroy', vdi) + yield self._wait_for_task(task) + except Exception, exc: + logging.warn(exc) try: task = yield self._call_xenapi('Async.VM.destroy', vm) yield self._wait_for_task(task) @@ -325,6 +335,24 @@ class XenAPIConnection(object): else: return vms[0] + @utils.deferredToThread + def _lookup_vm_vdis(self, vm): + return self._lookup_vm_vdis_blocking(vm) + + def _lookup_vm_vdis_blocking(self, vm): + # Firstly we get the VBDs, then the VDIs. + # TODO: do we leave the read-only devices? + vbds = self._conn.xenapi.VM.get_VBDs(vm) + vdis = [] + if vbds: + for vbd in vbds: + vdis.append(self._conn.xenapi.VBD.get_VDI(vbd)) + if len(vdis) > 0: + return vdis + else: + return None + + def _wait_for_task(self, task): """Return a Deferred that will give the result of the given task. The task is polled until it completes.""" -- cgit From 89cb1e32da33815d5f8e6eb34380ca3401bfad28 Mon Sep 17 00:00:00 2001 From: Soren Hansen Date: Sat, 20 Nov 2010 22:26:15 +0100 Subject: Make sure all templates are included (at least rescue tempaltes didn't used to be included). --- MANIFEST.in | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/MANIFEST.in b/MANIFEST.in index 4fe5f0b34..982b727aa 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -13,9 +13,7 @@ include nova/cloudpipe/client.ovpn.template include nova/compute/fakevirtinstance.xml include nova/compute/interfaces.template include nova/virt/interfaces.template -include nova/virt/libvirt.qemu.xml.template -include nova/virt/libvirt.uml.xml.template -include nova/virt/libvirt.xen.xml.template +include nova/virt/libvirt.*.xml.template include nova/tests/CA/ include nova/tests/CA/cacert.pem include nova/tests/CA/private/ -- cgit From 958591ab2996443ffb6d2f92f928eaad277aa2db Mon Sep 17 00:00:00 2001 From: Armando Migliaccio Date: Mon, 22 Nov 2010 13:11:00 +0000 Subject: pep8 violations fix --- nova/virt/xenapi.py | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/nova/virt/xenapi.py b/nova/virt/xenapi.py index c3a0c2c7a..3169562a5 100644 --- a/nova/virt/xenapi.py +++ b/nova/virt/xenapi.py @@ -338,28 +338,27 @@ class XenAPIConnection(object): @utils.deferredToThread def _lookup_vm_vdis(self, vm): return self._lookup_vm_vdis_blocking(vm) - + def _lookup_vm_vdis_blocking(self, vm): # Firstly we get the VBDs, then the VDIs. # TODO: do we leave the read-only devices? vbds = self._conn.xenapi.VM.get_VBDs(vm) vdis = [] if vbds: - for vbd in vbds: - try: - vdi = self._conn.xenapi.VBD.get_VDI(vbd) - # Test valid VDI - record = self._conn.xenapi.VDI.get_record(vdi) - except Exception, exc: - logging.warn(exc) - else: - vdis.append(vdi) - if len(vdis) > 0: - return vdis - else: - return None - - + for vbd in vbds: + try: + vdi = self._conn.xenapi.VBD.get_VDI(vbd) + # Test valid VDI + record = self._conn.xenapi.VDI.get_record(vdi) + except Exception, exc: + logging.warn(exc) + else: + vdis.append(vdi) + if len(vdis) > 0: + return vdis + else: + return None + def _wait_for_task(self, task): """Return a Deferred that will give the result of the given task. The task is polled until it completes.""" -- cgit From 51be7159574d3e0cba8a81b8ea3e9706ce74ac3a Mon Sep 17 00:00:00 2001 From: Josh Kearney Date: Mon, 22 Nov 2010 14:45:05 -0600 Subject: Set and use AMQP retry interval and max retry constants --- nova/rpc.py | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/nova/rpc.py b/nova/rpc.py index 9938b0838..c2d18cb61 100644 --- a/nova/rpc.py +++ b/nova/rpc.py @@ -38,8 +38,11 @@ from nova import fakerabbit from nova import flags from nova import context + FLAGS = flags.FLAGS +AMQP_RETRY_INT = 10 +AMQP_MAX_RETRIES = 12 LOG = logging.getLogger('amqplib') LOG.setLevel(logging.DEBUG) @@ -85,17 +88,23 @@ class Consumer(messaging.Consumer): def __init__(self, *args, **kwargs): self.failed_connection = False - while True: + for i in range(AMQP_MAX_RETRIES): try: super(Consumer, self).__init__(*args, **kwargs) break except: # Catching all because carrot sucks - logging.exception("AMQP server on %s:%d is unreachable. " \ - "Trying again in 30 seconds." % ( - FLAGS.rabbit_host, - FLAGS.rabbit_port)) - time.sleep(30) - continue + if i + 1 == AMQP_MAX_RETRIES: + logging.exception("Unable to connect to AMQP server" \ + " after %d tries. Shutting down." % AMQP_MAX_RETRIES) + sys.exit(1) + else: + logging.exception("AMQP server on %s:%d is unreachable." \ + " Trying again in %d seconds." % ( + FLAGS.rabbit_host, + FLAGS.rabbit_port, + AMQP_RETRY_INT)) + time.sleep(AMQP_RETRY_INT) + continue def fetch(self, no_ack=None, auto_ack=None, enable_callbacks=False): """Wraps the parent fetch with some logic for failed connections""" @@ -103,7 +112,7 @@ class Consumer(messaging.Consumer): # refactored into some sort of connection manager object try: if self.failed_connection: - # NOTE(vish): conn is defined in the parent class, we can + # NOTE(vish): connection is defined in the parent class, we can # recreate it as long as we create the backend too # pylint: disable-msg=W0201 self.connection = Connection.recreate() -- cgit From 14e4ba7f0e10fc3c2f532b445c1f656f53c8aa95 Mon Sep 17 00:00:00 2001 From: Josh Kearney Date: Mon, 22 Nov 2010 15:22:02 -0600 Subject: Refactor AMQP retry loop --- nova/rpc.py | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/nova/rpc.py b/nova/rpc.py index c2d18cb61..961b56de6 100644 --- a/nova/rpc.py +++ b/nova/rpc.py @@ -86,25 +86,25 @@ class Consumer(messaging.Consumer): Contains methods for connecting the fetch method to async loops """ def __init__(self, *args, **kwargs): - self.failed_connection = False - - for i in range(AMQP_MAX_RETRIES): + for i in xrange(AMQP_MAX_RETRIES): + if i > 0: + time.sleep(AMQP_RETRY_INT) try: super(Consumer, self).__init__(*args, **kwargs) + self.failed_connection = False break except: # Catching all because carrot sucks - if i + 1 == AMQP_MAX_RETRIES: - logging.exception("Unable to connect to AMQP server" \ - " after %d tries. Shutting down." % AMQP_MAX_RETRIES) - sys.exit(1) - else: - logging.exception("AMQP server on %s:%d is unreachable." \ - " Trying again in %d seconds." % ( - FLAGS.rabbit_host, - FLAGS.rabbit_port, - AMQP_RETRY_INT)) - time.sleep(AMQP_RETRY_INT) - continue + logging.exception("AMQP server on %s:%d is unreachable." \ + " Trying again in %d seconds." % ( + FLAGS.rabbit_host, + FLAGS.rabbit_port, + AMQP_RETRY_INT)) + self.failed_connection = True + continue + if self.failed_connection: + logging.exception("Unable to connect to AMQP server" \ + " after %d tries. Shutting down." % AMQP_MAX_RETRIES) + sys.exit(1) def fetch(self, no_ack=None, auto_ack=None, enable_callbacks=False): """Wraps the parent fetch with some logic for failed connections""" -- cgit From a8497abaf24436a92a85129d9771a12f046f2f42 Mon Sep 17 00:00:00 2001 From: Josh Kearney Date: Mon, 22 Nov 2010 16:04:21 -0600 Subject: Removed unnecessary continue --- nova/rpc.py | 1 - 1 file changed, 1 deletion(-) diff --git a/nova/rpc.py b/nova/rpc.py index 961b56de6..57e522ad3 100644 --- a/nova/rpc.py +++ b/nova/rpc.py @@ -100,7 +100,6 @@ class Consumer(messaging.Consumer): FLAGS.rabbit_port, AMQP_RETRY_INT)) self.failed_connection = True - continue if self.failed_connection: logging.exception("Unable to connect to AMQP server" \ " after %d tries. Shutting down." % AMQP_MAX_RETRIES) -- cgit From deac609ceb1cd6e081445bfc4d8f8c3222b97774 Mon Sep 17 00:00:00 2001 From: Josh Kearney Date: Mon, 22 Nov 2010 16:28:28 -0600 Subject: Make time.sleep() non-blocking --- nova/wsgi.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nova/wsgi.py b/nova/wsgi.py index b04b487ea..c7ee9ed14 100644 --- a/nova/wsgi.py +++ b/nova/wsgi.py @@ -28,7 +28,7 @@ from xml.dom import minidom import eventlet import eventlet.wsgi -eventlet.patcher.monkey_patch(all=False, socket=True) +eventlet.patcher.monkey_patch(all=False, socket=True, time=True) import routes import routes.middleware import webob -- cgit From f0f990495428c028401ba9a4740e6b7a0441213c Mon Sep 17 00:00:00 2001 From: Josh Kearney Date: Mon, 22 Nov 2010 16:48:44 -0600 Subject: Use FLAGS instead of constants --- nova/flags.py | 2 ++ nova/rpc.py | 11 ++++------- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/nova/flags.py b/nova/flags.py index 4ae86d9b2..a39f22273 100644 --- a/nova/flags.py +++ b/nova/flags.py @@ -196,6 +196,8 @@ DEFINE_integer('rabbit_port', 5672, 'rabbit port') DEFINE_string('rabbit_userid', 'guest', 'rabbit userid') DEFINE_string('rabbit_password', 'guest', 'rabbit password') DEFINE_string('rabbit_virtual_host', '/', 'rabbit virtual host') +DEFINE_integer('rabbit_retry_interval', 10, 'rabbit connection retry interval') +DEFINE_integer('rabbit_max_retries', 12, 'rabbit connection attempts') DEFINE_string('control_exchange', 'nova', 'the main exchange to connect to') DEFINE_string('cc_host', '127.0.0.1', 'ip of api server') DEFINE_integer('cc_port', 8773, 'cloud controller port') diff --git a/nova/rpc.py b/nova/rpc.py index 57e522ad3..86a29574f 100644 --- a/nova/rpc.py +++ b/nova/rpc.py @@ -41,9 +41,6 @@ from nova import context FLAGS = flags.FLAGS -AMQP_RETRY_INT = 10 -AMQP_MAX_RETRIES = 12 - LOG = logging.getLogger('amqplib') LOG.setLevel(logging.DEBUG) @@ -86,9 +83,9 @@ class Consumer(messaging.Consumer): Contains methods for connecting the fetch method to async loops """ def __init__(self, *args, **kwargs): - for i in xrange(AMQP_MAX_RETRIES): + for i in xrange(FLAGS.rabbit_max_retries): if i > 0: - time.sleep(AMQP_RETRY_INT) + time.sleep(FLAGS.rabbit_retry_interval) try: super(Consumer, self).__init__(*args, **kwargs) self.failed_connection = False @@ -98,11 +95,11 @@ class Consumer(messaging.Consumer): " Trying again in %d seconds." % ( FLAGS.rabbit_host, FLAGS.rabbit_port, - AMQP_RETRY_INT)) + FLAGS.rabbit_retry_interval)) self.failed_connection = True if self.failed_connection: logging.exception("Unable to connect to AMQP server" \ - " after %d tries. Shutting down." % AMQP_MAX_RETRIES) + " after %d tries. Shutting down." % FLAGS.rabbit_max_retries) sys.exit(1) def fetch(self, no_ack=None, auto_ack=None, enable_callbacks=False): -- cgit From 981927385193b95f532dbf03c3e350f65c1b9005 Mon Sep 17 00:00:00 2001 From: Soren Hansen Date: Tue, 23 Nov 2010 11:45:56 +0100 Subject: Unify the location of the default flagfile. Not all workers called utils.default_flagfile, and nova-manage explicitly said to use the one in /etc/nova/nova-manage.conf. This made development awkward since everything but nova-manage would use defaults for everything, but nova-manage would use whatever config was in /etc/nova/nova-manage.conf which was likely put there by a package of some sort. --- bin/nova-compute | 2 ++ bin/nova-instancemonitor | 2 ++ bin/nova-manage | 2 +- bin/nova-network | 2 ++ bin/nova-scheduler | 2 ++ bin/nova-volume | 2 ++ 6 files changed, 11 insertions(+), 1 deletion(-) diff --git a/bin/nova-compute b/bin/nova-compute index 1724e9659..a66477af5 100755 --- a/bin/nova-compute +++ b/bin/nova-compute @@ -34,10 +34,12 @@ if os.path.exists(os.path.join(possible_topdir, 'nova', '__init__.py')): from nova import service from nova import twistd +from nova import utils if __name__ == '__main__': twistd.serve(__file__) if __name__ == '__builtin__': + utils.default_flagfile() application = service.Service.create() # pylint: disable=C0103 diff --git a/bin/nova-instancemonitor b/bin/nova-instancemonitor index 094da4033..a7b7fb0c6 100755 --- a/bin/nova-instancemonitor +++ b/bin/nova-instancemonitor @@ -34,6 +34,7 @@ possible_topdir = os.path.normpath(os.path.join(os.path.abspath(sys.argv[0]), if os.path.exists(os.path.join(possible_topdir, 'nova', '__init__.py')): sys.path.insert(0, possible_topdir) +from nova import utils from nova import twistd from nova.compute import monitor @@ -44,6 +45,7 @@ if __name__ == '__main__': twistd.serve(__file__) if __name__ == '__builtin__': + utils.default_flagfile() logging.warn('Starting instance monitor') # pylint: disable-msg=C0103 monitor = monitor.InstanceMonitor() diff --git a/bin/nova-manage b/bin/nova-manage index 08b3da123..eb7c6b87b 100755 --- a/bin/nova-manage +++ b/bin/nova-manage @@ -467,7 +467,7 @@ def methods_of(obj): def main(): """Parse options and call the appropriate class/method.""" - utils.default_flagfile('/etc/nova/nova-manage.conf') + utils.default_flagfile() argv = FLAGS(sys.argv) if FLAGS.verbose: diff --git a/bin/nova-network b/bin/nova-network index fa88aeb47..342a63058 100755 --- a/bin/nova-network +++ b/bin/nova-network @@ -34,10 +34,12 @@ if os.path.exists(os.path.join(possible_topdir, 'nova', '__init__.py')): from nova import service from nova import twistd +from nova import utils if __name__ == '__main__': twistd.serve(__file__) if __name__ == '__builtin__': + utils.default_flagfile() application = service.Service.create() # pylint: disable-msg=C0103 diff --git a/bin/nova-scheduler b/bin/nova-scheduler index 38a8f213f..069b5a6fa 100755 --- a/bin/nova-scheduler +++ b/bin/nova-scheduler @@ -34,10 +34,12 @@ if os.path.exists(os.path.join(possible_topdir, 'nova', '__init__.py')): from nova import service from nova import twistd +from nova import utils if __name__ == '__main__': twistd.serve(__file__) if __name__ == '__builtin__': + utils.default_flagfile() application = service.Service.create() diff --git a/bin/nova-volume b/bin/nova-volume index b9e235717..26148b0ec 100755 --- a/bin/nova-volume +++ b/bin/nova-volume @@ -34,10 +34,12 @@ if os.path.exists(os.path.join(possible_topdir, 'nova', '__init__.py')): from nova import service from nova import twistd +from nova import utils if __name__ == '__main__': twistd.serve(__file__) if __name__ == '__builtin__': + utils.default_flagfile() application = service.Service.create() # pylint: disable-msg=C0103 -- cgit From 01c5ce00381e2b08d907385d752bc42b496bf4af Mon Sep 17 00:00:00 2001 From: Armando Migliaccio Date: Tue, 23 Nov 2010 12:11:15 +0000 Subject: added svg files (state.svg is missing because its source is a screen snapshot) --- doc/source/images/rabbit/arch.svg | 292 ++++++++++++++++++ doc/source/images/rabbit/flow1.svg | 617 +++++++++++++++++++++++++++++++++++++ doc/source/images/rabbit/flow2.svg | 423 +++++++++++++++++++++++++ doc/source/images/rabbit/rabt.svg | 581 ++++++++++++++++++++++++++++++++++ 4 files changed, 1913 insertions(+) create mode 100644 doc/source/images/rabbit/arch.svg create mode 100644 doc/source/images/rabbit/flow1.svg create mode 100644 doc/source/images/rabbit/flow2.svg create mode 100644 doc/source/images/rabbit/rabt.svg diff --git a/doc/source/images/rabbit/arch.svg b/doc/source/images/rabbit/arch.svg new file mode 100644 index 000000000..efed6e981 --- /dev/null +++ b/doc/source/images/rabbit/arch.svg @@ -0,0 +1,292 @@ + + + + + + + + + + + + + + + + + + + + + Page-1 + + + + Box.8 + Compute + + + + + + + Compute + + Box.2 + Volume Storage + + + + + + + VolumeStorage + + Box + Auth Manager + + + + + + + Auth Manager + + Box.4 + Cloud Controller + + + + + + + CloudController + + Box.3 + API Server + + + + + + + API Server + + Box.6 + Object Store + + + + + + + ObjectStore + + Box.7 + Node Controller + + + + + + + NodeController + + Dynamic connector + + + + Dynamic connector.11 + + + + Dynamic connector.12 + http + + + + + http + + Circle + Nova-Manage + + + + + + + Nova-Manage + + Circle.15 + Euca2ools + + + + + + + Euca2ools + + Dynamic connector.16 + + + + Dynamic connector.17 + + + + Sheet.15 + Project User Role Network VPN + + + + ProjectUserRoleNetworkVPN + + Sheet.16 + VM instance Security group Volume Snapshot VM image IP addres... + + + + VM instanceSecurity groupVolumeSnapshotVM imageIP addressSSH keyAvailability zone + + Box.20 + Network Controller + + + + + + + Network Controller + + Box.5 + Storage Controller + + + + + + + Storage Controller + + Dot & arrow + + + + + + + + + + + + + Dot & arrow.14 + + + + + + + + + + + + + Dynamic connector.13 + + + + Sheet.22 + AMQP + + + + AMQP + + Sheet.23 + AMQP + + + + AMQP + + Sheet.24 + AMQP + + + + AMQP + + Sheet.25 + REST + + + + REST + + Sheet.26 + local method + + + + local method + + Sheet.27 + local method + + + + local method + + Sheet.28 + local method + + + + local method + + diff --git a/doc/source/images/rabbit/flow1.svg b/doc/source/images/rabbit/flow1.svg new file mode 100644 index 000000000..6d8f7e280 --- /dev/null +++ b/doc/source/images/rabbit/flow1.svg @@ -0,0 +1,617 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Page-1 + + + Rounded rectangle + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ATM switch + name: control_exchange (type: topic) + + Sheet.3 + + + + Sheet.4 + + + + Sheet.5 + + + + Sheet.6 + + + + Sheet.7 + + + + Sheet.8 + + + + + + name: control_exchange(type: topic) + + + Sheet.9 + + Rectangle + + + + + + + Rectangle.10 + + + + + + + Rectangle.11 + + + + + + + Rectangle.12 + + + + + + + Rectangle.13 + + + + + + + Rectangle.14 + + + + + + + Rectangle.15 + + + + + + + + Sheet.17 + + Rectangle + + + + + + + Rectangle.10 + + + + + + + Rectangle.11 + + + + + + + Rectangle.12 + + + + + + + Rectangle.13 + + + + + + + Rectangle.14 + + + + + + + Rectangle.15 + + + + + + + + Sheet.25 + + + + Sheet.26 + key: topic + + + + key: topic + + Sheet.27 + key: topic.host + + + + key: topic.host + + Sheet.28 + + + + Rectangle + Topic Consumer + + + + + + + Topic Consumer + + Rectangle.30 + Topic Consumer + + + + + + + Topic Consumer + + Sheet.31 + + + + Sheet.32 + + + + Sheet.33 + + + + Rectangle.34 + + + + + + + Rectangle.35 + Direct Publisher + + + + + + + DirectPublisher + + Sheet.36 + Worker (e.g. compute) + + + + Worker(e.g. compute) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ATM switch.37 + name: msg_id (type: direct) + + Sheet.38 + + + + Sheet.39 + + + + Sheet.40 + + + + Sheet.41 + + + + Sheet.42 + + + + Sheet.43 + + + + + + name: msg_id(type: direct) + + + Sheet.44 + + Rectangle + + + + + + + Rectangle.10 + + + + + + + Rectangle.11 + + + + + + + Rectangle.12 + + + + + + + Rectangle.13 + + + + + + + Rectangle.14 + + + + + + + Rectangle.15 + + + + + + + + Sheet.52 + key: msg_id + + + + key: msg_id + + Sheet.53 + + + + Sheet.54 + + + + Rectangle.57 + + + + + + + Rectangle.56 + Direct Consumer + + + + + + + DirectConsumer + + Sheet.57 + Invoker (e.g. api) + + + + Invoker(e.g. api) + + Rectangle.55 + Topic Publisher + + + + + + + Topic Publisher + + Sheet.59 + + + + Sheet.60 + + + + Sheet.61 + RabbitMQ Node + + + + RabbitMQ Node + + Sheet.62 + + + + Sheet.64 + rpc.call (topic.host) + + + + rpc.call(topic.host) + + Sheet.63 + + + + Sheet.66 + + + + Sheet.67 + + + + Sheet.68 + + + + diff --git a/doc/source/images/rabbit/flow2.svg b/doc/source/images/rabbit/flow2.svg new file mode 100644 index 000000000..fe4cdf341 --- /dev/null +++ b/doc/source/images/rabbit/flow2.svg @@ -0,0 +1,423 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Page-1 + + + Rounded rectangle + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ATM switch + name: control_exchange (type: topic) + + Sheet.3 + + + + Sheet.4 + + + + Sheet.5 + + + + Sheet.6 + + + + Sheet.7 + + + + Sheet.8 + + + + + + name: control_exchange(type: topic) + + + Sheet.9 + + Rectangle + + + + + + + Rectangle.10 + + + + + + + Rectangle.11 + + + + + + + Rectangle.12 + + + + + + + Rectangle.13 + + + + + + + Rectangle.14 + + + + + + + Rectangle.15 + + + + + + + + Sheet.17 + + Rectangle + + + + + + + Rectangle.10 + + + + + + + Rectangle.11 + + + + + + + Rectangle.12 + + + + + + + Rectangle.13 + + + + + + + Rectangle.14 + + + + + + + Rectangle.15 + + + + + + + + Sheet.25 + + + + Sheet.26 + key: topic + + + + key: topic + + Sheet.27 + key: topic.host + + + + key: topic.host + + Sheet.28 + + + + Rectangle + Topic Consumer + + + + + + + Topic Consumer + + Rectangle.30 + Topic Consumer + + + + + + + Topic Consumer + + Sheet.31 + + + + Sheet.32 + + + + Sheet.33 + + + + Rectangle.34 + + + + + + + Sheet.36 + Worker (e.g. compute) + + + + Worker(e.g. compute) + + Rectangle.57 + + + + + + + Sheet.57 + Invoker (e.g. api) + + + + Invoker(e.g. api) + + Rectangle.55 + Topic Publisher + + + + + + + Topic Publisher + + Sheet.59 + + + + Sheet.61 + RabbitMQ Node + + + + RabbitMQ Node + + Sheet.62 + + + + Sheet.63 + rpc.cast(topic) + + + + rpc.cast(topic) + + Sheet.64 + + + + Sheet.65 + + + + diff --git a/doc/source/images/rabbit/rabt.svg b/doc/source/images/rabbit/rabt.svg new file mode 100644 index 000000000..142a33ce0 --- /dev/null +++ b/doc/source/images/rabbit/rabt.svg @@ -0,0 +1,581 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Page-1 + + + Rounded rectangle + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ATM switch + name: control_exchange (type: topic) + + Sheet.3 + + + + Sheet.4 + + + + Sheet.5 + + + + Sheet.6 + + + + Sheet.7 + + + + Sheet.8 + + + + + + name: control_exchange(type: topic) + + + Sheet.17 + + Rectangle + + + + + + + Rectangle.10 + + + + + + + Rectangle.11 + + + + + + + Rectangle.12 + + + + + + + Rectangle.13 + + + + + + + Rectangle.14 + + + + + + + Rectangle.15 + + + + + + + + Sheet.9 + + Rectangle + + + + + + + Rectangle.10 + + + + + + + Rectangle.11 + + + + + + + Rectangle.12 + + + + + + + Rectangle.13 + + + + + + + Rectangle.14 + + + + + + + Rectangle.15 + + + + + + + + Sheet.25 + + + + Sheet.27 + key: topic + + + + key: topic + + Sheet.28 + key: topic.host + + + + key: topic.host + + Sheet.26 + + + + Rectangle + Topic Consumer + + + + + + + Topic Consumer + + Rectangle.30 + Topic Consumer + + + + + + + Topic Consumer + + Sheet.31 + + + + Sheet.32 + + + + Sheet.33 + + + + Rectangle.34 + + + + + + + Rectangle.35 + Direct Publisher + + + + + + + DirectPublisher + + Sheet.36 + Worker (e.g. compute) + + + + Worker(e.g. compute) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ATM switch.37 + name: msg_id (type: direct) + + Sheet.38 + + + + Sheet.39 + + + + Sheet.40 + + + + Sheet.41 + + + + Sheet.42 + + + + Sheet.43 + + + + + + name: msg_id(type: direct) + + + Sheet.44 + + Rectangle + + + + + + + Rectangle.10 + + + + + + + Rectangle.11 + + + + + + + Rectangle.12 + + + + + + + Rectangle.13 + + + + + + + Rectangle.14 + + + + + + + Rectangle.15 + + + + + + + + Sheet.52 + key: msg_id + + + + key: msg_id + + Sheet.53 + + + + Sheet.54 + + + + Rectangle.57 + + + + + + + Rectangle.58 + Direct Consumer + + + + + + + DirectConsumer + + Sheet.59 + Invoker (e.g. api) + + + + Invoker(e.g. api) + + Rectangle.55 + Topic Publisher + + + + + + + Topic Publisher + + Sheet.56 + + + + Sheet.60 + + + + Sheet.62 + RabbitMQ Node (single virtual host context) + + + + RabbitMQ Node(single virtual host context) + + -- cgit From 89f56207de1ffe2f1f9d5c3cad3ab71ba324d133 Mon Sep 17 00:00:00 2001 From: Soren Hansen Date: Tue, 23 Nov 2010 13:48:57 +0100 Subject: Add a --logdir flag that will be prepended to the logfile setting. This makes it easier to share a flagfile between multiple workers while still having separate log files. --- nova/server.py | 3 +++ nova/twistd.py | 4 +++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/nova/server.py b/nova/server.py index cb424caa1..4d0f6e4da 100644 --- a/nova/server.py +++ b/nova/server.py @@ -42,6 +42,7 @@ flags.DEFINE_bool('daemonize', False, 'daemonize this process') # clutter. flags.DEFINE_bool('use_syslog', True, 'output to syslog when daemonizing') flags.DEFINE_string('logfile', None, 'log file to output to') +flags.DEFINE_string('logdir', None, 'directory to keep log files in (will be prepended to $logfile)') flags.DEFINE_string('pidfile', None, 'pid file to output to') flags.DEFINE_string('working_directory', './', 'working directory...') flags.DEFINE_integer('uid', os.getuid(), 'uid under which to run') @@ -119,6 +120,8 @@ def daemonize(args, name, main): else: if not FLAGS.logfile: FLAGS.logfile = '%s.log' % name + if FLAGS.logdir: + FLAGS.logfile = os.path.join(FLAGS.logdir, FLAGS.logfile) logfile = logging.FileHandler(FLAGS.logfile) logfile.setFormatter(formatter) logger.addHandler(logfile) diff --git a/nova/twistd.py b/nova/twistd.py index 3ec0ff61e..6c6cb955f 100644 --- a/nova/twistd.py +++ b/nova/twistd.py @@ -43,7 +43,7 @@ else: FLAGS = flags.FLAGS - +flags.DEFINE_string('logdir', None, 'directory to keep log files in (will be prepended to $logfile)') class TwistdServerOptions(ServerOptions): def parseArgs(self, *args): @@ -246,6 +246,8 @@ def serve(filename): FLAGS.logfile = '%s.log' % name elif FLAGS.logfile.endswith('twistd.log'): FLAGS.logfile = FLAGS.logfile.replace('twistd.log', '%s.log' % name) + if FLAGS.logdir: + FLAGS.logfile = os.path.join(FLAGS.logdir, FLAGS.logfile) if not FLAGS.prefix: FLAGS.prefix = name elif FLAGS.prefix.endswith('twisted'): -- cgit From 513e4eb76a8d21108484bbc08e3ff755190cb2d9 Mon Sep 17 00:00:00 2001 From: Josh Kearney Date: Tue, 23 Nov 2010 12:04:34 -0600 Subject: Make aws_access_key_id and aws_secret_access_key configurable --- nova/adminclient.py | 16 +++++++++++----- nova/compute/monitor.py | 4 ++-- nova/flags.py | 2 ++ 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/nova/adminclient.py b/nova/adminclient.py index af55197fc..5a62cce7d 100644 --- a/nova/adminclient.py +++ b/nova/adminclient.py @@ -22,13 +22,15 @@ Nova User API client library. import base64 import boto import httplib + +from nova import flags from boto.ec2.regioninfo import RegionInfo +FLAGS = flags.FLAGS + DEFAULT_CLC_URL = 'http://127.0.0.1:8773' DEFAULT_REGION = 'nova' -DEFAULT_ACCESS_KEY = 'admin' -DEFAULT_SECRET_KEY = 'admin' class UserInfo(object): @@ -192,9 +194,13 @@ class HostInfo(object): class NovaAdminClient(object): - def __init__(self, clc_url=DEFAULT_CLC_URL, region=DEFAULT_REGION, - access_key=DEFAULT_ACCESS_KEY, secret_key=DEFAULT_SECRET_KEY, - **kwargs): + def __init__( + self, + clc_url=DEFAULT_CLC_URL, + region=DEFAULT_REGION, + access_key=FLAGS.aws_access_key_id, + secret_key=FLAGS.aws_secret_access_key, + **kwargs): parts = self.split_clc_url(clc_url) self.clc_url = clc_url diff --git a/nova/compute/monitor.py b/nova/compute/monitor.py index d0154600f..ce45b14f6 100644 --- a/nova/compute/monitor.py +++ b/nova/compute/monitor.py @@ -211,8 +211,8 @@ def store_graph(instance_id, filename): # the response we can make our own client that does the actual # request and hands it off to the response parser. s3 = boto.s3.connection.S3Connection( - aws_access_key_id='admin', - aws_secret_access_key='admin', + aws_access_key_id=FLAGS.aws_access_key_id, + aws_secret_access_key=FLAGS.aws_secret_access_key, is_secure=False, calling_format=boto.s3.connection.OrdinaryCallingFormat(), port=FLAGS.s3_port, diff --git a/nova/flags.py b/nova/flags.py index 121b9ca25..f7ae26050 100644 --- a/nova/flags.py +++ b/nova/flags.py @@ -179,6 +179,8 @@ DEFINE_list('region_list', [], 'list of region=url pairs separated by commas') 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('s3_port', 3333, 's3 port') DEFINE_string('s3_host', '127.0.0.1', 's3 host') DEFINE_string('compute_topic', 'compute', 'the topic compute nodes listen on') -- cgit From 9c57e5ce37c1f2405fcf7a1ba322946e6d84efeb Mon Sep 17 00:00:00 2001 From: Josh Kearney Date: Tue, 23 Nov 2010 12:46:07 -0600 Subject: Remove FAKE_subdomain from docs --- contrib/nova.sh | 1 - contrib/puppet/templates/production/nova-common.conf.erb | 1 - doc/source/adminguide/getting.started.rst | 1 - doc/source/adminguide/multi.node.install.rst | 11 ++--------- nova/api/__init__.py | 1 - 5 files changed, 2 insertions(+), 13 deletions(-) diff --git a/contrib/nova.sh b/contrib/nova.sh index 9bc36d6fb..f47d972ab 100755 --- a/contrib/nova.sh +++ b/contrib/nova.sh @@ -40,7 +40,6 @@ cat >/etc/nova/nova-manage.conf << NOVA_CONF_EOF --verbose --nodaemon --dhcpbridge_flagfile=/etc/nova/nova-manage.conf ---FAKE_subdomain=ec2 --cc_host=$HOST_IP --routing_source_ip=$HOST_IP --sql_connection=$SQL_CONN diff --git a/contrib/puppet/templates/production/nova-common.conf.erb b/contrib/puppet/templates/production/nova-common.conf.erb index 00c110781..23ee0c5e8 100644 --- a/contrib/puppet/templates/production/nova-common.conf.erb +++ b/contrib/puppet/templates/production/nova-common.conf.erb @@ -46,7 +46,6 @@ --quota_gigabytes=100 --use_nova_chains=True --input_chain=services ---FAKE_subdomain=ec2 --use_project_ca=True --fixed_ip_disassociate_timeout=300 --api_max_requests=1 diff --git a/doc/source/adminguide/getting.started.rst b/doc/source/adminguide/getting.started.rst index 7075a0b02..3e8073606 100644 --- a/doc/source/adminguide/getting.started.rst +++ b/doc/source/adminguide/getting.started.rst @@ -140,7 +140,6 @@ A sample configuration to test the system follows:: --verbose --nodaemon - --FAKE_subdomain=ec2 --auth_driver=nova.auth.dbdriver.DbDriver Running diff --git a/doc/source/adminguide/multi.node.install.rst b/doc/source/adminguide/multi.node.install.rst index fa0652bc8..dcceb539b 100644 --- a/doc/source/adminguide/multi.node.install.rst +++ b/doc/source/adminguide/multi.node.install.rst @@ -92,7 +92,6 @@ Note: CC_ADDR= :: - --FAKE_subdomain=ec2 # workaround for ec2/euca api --fixed_range= # ip network to use for VM guests, ex 192.168.2.64/26 --network_size=<# of addrs> # number of ip addrs to use for VM guests, ex 64 @@ -104,19 +103,13 @@ Note: CC_ADDR= --fixed_range= # ip network to use for VM guests, ex 192.168.2.64/26 --network_size=<# of addrs> # number of ip addrs to use for VM guests, ex 64 -4. nova-api specific flags - -:: - - --FAKE_subdomain=ec2 # workaround for ec2/euca api - -5. Create a nova group +4. Create a nova group :: sudo addgroup nova -6. nova-objectstore specific flags < no specific config needed > +5. nova-objectstore specific flags < no specific config needed > Config files should be have their owner set to root:nova, and mode set to 0640, since they contain your MySQL server's root password. diff --git a/nova/api/__init__.py b/nova/api/__init__.py index 7e75445a8..80f9f2109 100644 --- a/nova/api/__init__.py +++ b/nova/api/__init__.py @@ -22,7 +22,6 @@ Root WSGI middleware for all API controllers. :osapi_subdomain: subdomain running the OpenStack API (default: api) :ec2api_subdomain: subdomain running the EC2 API (default: ec2) -:FAKE_subdomain: set to 'api' or 'ec2', requests default to that endpoint """ -- cgit From 1bf3c29df39a6c0f4a82cceb2ea698081a7e3274 Mon Sep 17 00:00:00 2001 From: Anne Gentle Date: Tue, 23 Nov 2010 12:49:28 -0600 Subject: Adding developer howtos --- doc/build/.placeholder | 0 doc/build/doctrees/adminguide/binaries.doctree | Bin 11915 -> 0 bytes .../doctrees/adminguide/distros/others.doctree | Bin 13777 -> 0 bytes .../adminguide/distros/ubuntu.10.04.doctree | Bin 8787 -> 0 bytes .../adminguide/distros/ubuntu.10.10.doctree | Bin 9906 -> 0 bytes doc/build/doctrees/adminguide/euca2ools.doctree | Bin 15156 -> 0 bytes doc/build/doctrees/adminguide/flags.doctree | Bin 4917 -> 0 bytes .../doctrees/adminguide/getting.started.doctree | Bin 37699 -> 0 bytes doc/build/doctrees/adminguide/index.doctree | Bin 16133 -> 0 bytes .../doctrees/adminguide/managing.images.doctree | Bin 4991 -> 0 bytes .../doctrees/adminguide/managing.instances.doctree | Bin 8530 -> 0 bytes .../doctrees/adminguide/managing.networks.doctree | Bin 23566 -> 0 bytes .../doctrees/adminguide/managing.projects.doctree | Bin 24817 -> 0 bytes .../doctrees/adminguide/managing.users.doctree | Bin 34523 -> 0 bytes .../doctrees/adminguide/managingsecurity.doctree | Bin 7476 -> 0 bytes doc/build/doctrees/adminguide/monitoring.doctree | Bin 5600 -> 0 bytes .../doctrees/adminguide/multi.node.install.doctree | Bin 49860 -> 0 bytes doc/build/doctrees/adminguide/network.flat.doctree | Bin 12519 -> 0 bytes doc/build/doctrees/adminguide/network.vlan.doctree | Bin 43599 -> 0 bytes doc/build/doctrees/adminguide/nova.manage.doctree | Bin 40316 -> 0 bytes .../adminguide/single.node.install.doctree | Bin 41777 -> 0 bytes doc/build/doctrees/api/autoindex.doctree | Bin 6648 -> 0 bytes doc/build/doctrees/api/nova..adminclient.doctree | Bin 3469 -> 0 bytes doc/build/doctrees/api/nova..api.cloud.doctree | Bin 3449 -> 0 bytes doc/build/doctrees/api/nova..api.ec2.admin.doctree | Bin 3489 -> 0 bytes .../doctrees/api/nova..api.ec2.apirequest.doctree | Bin 3539 -> 0 bytes doc/build/doctrees/api/nova..api.ec2.cloud.doctree | Bin 3489 -> 0 bytes .../doctrees/api/nova..api.ec2.images.doctree | Bin 3499 -> 0 bytes .../nova..api.ec2.metadatarequesthandler.doctree | Bin 3659 -> 0 bytes .../doctrees/api/nova..api.openstack.auth.doctree | Bin 3539 -> 0 bytes .../nova..api.openstack.backup_schedules.doctree | Bin 3659 -> 0 bytes .../api/nova..api.openstack.faults.doctree | Bin 3559 -> 0 bytes .../api/nova..api.openstack.flavors.doctree | Bin 3569 -> 0 bytes .../api/nova..api.openstack.images.doctree | Bin 3559 -> 0 bytes .../api/nova..api.openstack.servers.doctree | Bin 3569 -> 0 bytes .../api/nova..api.openstack.sharedipgroups.doctree | Bin 3639 -> 0 bytes doc/build/doctrees/api/nova..auth.dbdriver.doctree | Bin 3489 -> 0 bytes doc/build/doctrees/api/nova..auth.fakeldap.doctree | Bin 3489 -> 0 bytes .../doctrees/api/nova..auth.ldapdriver.doctree | Bin 3509 -> 0 bytes doc/build/doctrees/api/nova..auth.manager.doctree | Bin 3479 -> 0 bytes doc/build/doctrees/api/nova..auth.signer.doctree | Bin 3469 -> 0 bytes .../doctrees/api/nova..cloudpipe.pipelib.doctree | Bin 3529 -> 0 bytes doc/build/doctrees/api/nova..compute.disk.doctree | Bin 3479 -> 0 bytes .../api/nova..compute.instance_types.doctree | Bin 3579 -> 0 bytes .../doctrees/api/nova..compute.manager.doctree | Bin 3509 -> 0 bytes .../doctrees/api/nova..compute.monitor.doctree | Bin 3509 -> 0 bytes .../doctrees/api/nova..compute.power_state.doctree | Bin 3549 -> 0 bytes doc/build/doctrees/api/nova..context.doctree | Bin 3429 -> 0 bytes doc/build/doctrees/api/nova..crypto.doctree | Bin 3419 -> 0 bytes doc/build/doctrees/api/nova..db.api.doctree | Bin 3419 -> 0 bytes .../doctrees/api/nova..db.sqlalchemy.api.doctree | Bin 3529 -> 0 bytes .../api/nova..db.sqlalchemy.models.doctree | Bin 3559 -> 0 bytes .../api/nova..db.sqlalchemy.session.doctree | Bin 3569 -> 0 bytes doc/build/doctrees/api/nova..exception.doctree | Bin 3449 -> 0 bytes doc/build/doctrees/api/nova..fakerabbit.doctree | Bin 3459 -> 0 bytes doc/build/doctrees/api/nova..flags.doctree | Bin 3409 -> 0 bytes doc/build/doctrees/api/nova..image.service.doctree | Bin 3489 -> 0 bytes doc/build/doctrees/api/nova..manager.doctree | Bin 3429 -> 0 bytes .../doctrees/api/nova..network.linux_net.doctree | Bin 3529 -> 0 bytes .../doctrees/api/nova..network.manager.doctree | Bin 3509 -> 0 bytes .../doctrees/api/nova..objectstore.bucket.doctree | Bin 3539 -> 0 bytes .../doctrees/api/nova..objectstore.handler.doctree | Bin 3549 -> 0 bytes .../doctrees/api/nova..objectstore.image.doctree | Bin 3529 -> 0 bytes .../doctrees/api/nova..objectstore.stored.doctree | Bin 3539 -> 0 bytes doc/build/doctrees/api/nova..process.doctree | Bin 3429 -> 0 bytes doc/build/doctrees/api/nova..quota.doctree | Bin 3409 -> 0 bytes doc/build/doctrees/api/nova..rpc.doctree | Bin 3389 -> 0 bytes .../doctrees/api/nova..scheduler.chance.doctree | Bin 3519 -> 0 bytes .../doctrees/api/nova..scheduler.driver.doctree | Bin 3519 -> 0 bytes .../doctrees/api/nova..scheduler.manager.doctree | Bin 3529 -> 0 bytes .../doctrees/api/nova..scheduler.simple.doctree | Bin 3519 -> 0 bytes doc/build/doctrees/api/nova..server.doctree | Bin 3419 -> 0 bytes doc/build/doctrees/api/nova..service.doctree | Bin 3429 -> 0 bytes doc/build/doctrees/api/nova..test.doctree | Bin 3399 -> 0 bytes .../api/nova..tests.access_unittest.doctree | Bin 3569 -> 0 bytes .../doctrees/api/nova..tests.api.fakes.doctree | Bin 3509 -> 0 bytes .../api/nova..tests.api.openstack.fakes.doctree | Bin 3609 -> 0 bytes .../api/nova..tests.api.openstack.test_api.doctree | Bin 3639 -> 0 bytes .../nova..tests.api.openstack.test_auth.doctree | Bin 3649 -> 0 bytes .../nova..tests.api.openstack.test_faults.doctree | Bin 3669 -> 0 bytes .../nova..tests.api.openstack.test_flavors.doctree | Bin 3679 -> 0 bytes .../nova..tests.api.openstack.test_images.doctree | Bin 3669 -> 0 bytes .....tests.api.openstack.test_ratelimiting.doctree | Bin 3729 -> 0 bytes .../nova..tests.api.openstack.test_servers.doctree | Bin 3679 -> 0 bytes ...tests.api.openstack.test_sharedipgroups.doctree | Bin 3749 -> 0 bytes .../doctrees/api/nova..tests.api.test_wsgi.doctree | Bin 3549 -> 0 bytes .../api/nova..tests.api_integration.doctree | Bin 3569 -> 0 bytes .../doctrees/api/nova..tests.api_unittest.doctree | Bin 3539 -> 0 bytes .../doctrees/api/nova..tests.auth_unittest.doctree | Bin 3549 -> 0 bytes .../api/nova..tests.cloud_unittest.doctree | Bin 3559 -> 0 bytes .../api/nova..tests.compute_unittest.doctree | Bin 3579 -> 0 bytes .../doctrees/api/nova..tests.declare_flags.doctree | Bin 3549 -> 0 bytes .../doctrees/api/nova..tests.fake_flags.doctree | Bin 3519 -> 0 bytes .../api/nova..tests.flags_unittest.doctree | Bin 3559 -> 0 bytes .../api/nova..tests.network_unittest.doctree | Bin 3579 -> 0 bytes .../api/nova..tests.objectstore_unittest.doctree | Bin 3619 -> 0 bytes .../api/nova..tests.process_unittest.doctree | Bin 3579 -> 0 bytes .../api/nova..tests.quota_unittest.doctree | Bin 3559 -> 0 bytes .../doctrees/api/nova..tests.real_flags.doctree | Bin 3519 -> 0 bytes .../doctrees/api/nova..tests.rpc_unittest.doctree | Bin 3539 -> 0 bytes .../doctrees/api/nova..tests.runtime_flags.doctree | Bin 3549 -> 0 bytes .../api/nova..tests.scheduler_unittest.doctree | Bin 3599 -> 0 bytes .../api/nova..tests.service_unittest.doctree | Bin 3579 -> 0 bytes .../api/nova..tests.twistd_unittest.doctree | Bin 3569 -> 0 bytes .../api/nova..tests.validator_unittest.doctree | Bin 3599 -> 0 bytes .../doctrees/api/nova..tests.virt_unittest.doctree | Bin 3549 -> 0 bytes .../api/nova..tests.volume_unittest.doctree | Bin 3569 -> 0 bytes doc/build/doctrees/api/nova..twistd.doctree | Bin 3419 -> 0 bytes doc/build/doctrees/api/nova..utils.doctree | Bin 3409 -> 0 bytes doc/build/doctrees/api/nova..validate.doctree | Bin 3439 -> 0 bytes .../doctrees/api/nova..virt.connection.doctree | Bin 3509 -> 0 bytes doc/build/doctrees/api/nova..virt.fake.doctree | Bin 3449 -> 0 bytes doc/build/doctrees/api/nova..virt.images.doctree | Bin 3469 -> 0 bytes .../doctrees/api/nova..virt.libvirt_conn.doctree | Bin 3529 -> 0 bytes doc/build/doctrees/api/nova..virt.xenapi.doctree | Bin 3469 -> 0 bytes doc/build/doctrees/api/nova..volume.driver.doctree | Bin 3489 -> 0 bytes .../doctrees/api/nova..volume.manager.doctree | Bin 3499 -> 0 bytes doc/build/doctrees/api/nova..wsgi.doctree | Bin 3399 -> 0 bytes doc/build/doctrees/cloud101.doctree | Bin 16806 -> 0 bytes doc/build/doctrees/code.doctree | Bin 11873 -> 0 bytes doc/build/doctrees/community.doctree | Bin 24317 -> 0 bytes doc/build/doctrees/devref/api.doctree | Bin 44655 -> 0 bytes doc/build/doctrees/devref/architecture.doctree | Bin 11727 -> 0 bytes doc/build/doctrees/devref/auth.doctree | Bin 52150 -> 0 bytes doc/build/doctrees/devref/cloudpipe.doctree | Bin 18597 -> 0 bytes doc/build/doctrees/devref/compute.doctree | Bin 68876 -> 0 bytes doc/build/doctrees/devref/database.doctree | Bin 10449 -> 0 bytes .../devref/development.environment.doctree | Bin 5035 -> 0 bytes doc/build/doctrees/devref/fakes.doctree | Bin 58479 -> 0 bytes doc/build/doctrees/devref/glance.doctree | Bin 5457 -> 0 bytes doc/build/doctrees/devref/index.doctree | Bin 10079 -> 0 bytes doc/build/doctrees/devref/modules.doctree | Bin 3166 -> 0 bytes doc/build/doctrees/devref/network.doctree | Bin 22897 -> 0 bytes doc/build/doctrees/devref/nova.doctree | Bin 56579 -> 0 bytes doc/build/doctrees/devref/objectstore.doctree | Bin 11101 -> 0 bytes doc/build/doctrees/devref/scheduler.doctree | Bin 10942 -> 0 bytes doc/build/doctrees/devref/services.doctree | Bin 10756 -> 0 bytes doc/build/doctrees/devref/volume.doctree | Bin 11687 -> 0 bytes doc/build/doctrees/environment.pickle | Bin 1803754 -> 0 bytes doc/build/doctrees/index.doctree | Bin 18401 -> 0 bytes doc/build/doctrees/installer.doctree | Bin 4868 -> 0 bytes doc/build/doctrees/livecd.doctree | Bin 2484 -> 0 bytes doc/build/doctrees/man/novamanage.doctree | Bin 38822 -> 0 bytes doc/build/doctrees/nova.concepts.doctree | Bin 42051 -> 0 bytes doc/build/doctrees/object.model.doctree | Bin 6809 -> 0 bytes doc/build/doctrees/quickstart.doctree | Bin 28924 -> 0 bytes doc/build/doctrees/service.architecture.doctree | Bin 17800 -> 0 bytes doc/source/devref/addmethod.openstackapi.rst | 56 ++++++++++++++ doc/source/devref/development.environment.rst | 83 ++++++++++++++++++++- doc/source/devref/index.rst | 6 +- doc/source/devref/rabbit.rst | 10 +-- 151 files changed, 147 insertions(+), 8 deletions(-) delete mode 100644 doc/build/.placeholder delete mode 100644 doc/build/doctrees/adminguide/binaries.doctree delete mode 100644 doc/build/doctrees/adminguide/distros/others.doctree delete mode 100644 doc/build/doctrees/adminguide/distros/ubuntu.10.04.doctree delete mode 100644 doc/build/doctrees/adminguide/distros/ubuntu.10.10.doctree delete mode 100644 doc/build/doctrees/adminguide/euca2ools.doctree delete mode 100644 doc/build/doctrees/adminguide/flags.doctree delete mode 100644 doc/build/doctrees/adminguide/getting.started.doctree delete mode 100644 doc/build/doctrees/adminguide/index.doctree delete mode 100644 doc/build/doctrees/adminguide/managing.images.doctree delete mode 100644 doc/build/doctrees/adminguide/managing.instances.doctree delete mode 100644 doc/build/doctrees/adminguide/managing.networks.doctree delete mode 100644 doc/build/doctrees/adminguide/managing.projects.doctree delete mode 100644 doc/build/doctrees/adminguide/managing.users.doctree delete mode 100644 doc/build/doctrees/adminguide/managingsecurity.doctree delete mode 100644 doc/build/doctrees/adminguide/monitoring.doctree delete mode 100644 doc/build/doctrees/adminguide/multi.node.install.doctree delete mode 100644 doc/build/doctrees/adminguide/network.flat.doctree delete mode 100644 doc/build/doctrees/adminguide/network.vlan.doctree delete mode 100644 doc/build/doctrees/adminguide/nova.manage.doctree delete mode 100644 doc/build/doctrees/adminguide/single.node.install.doctree delete mode 100644 doc/build/doctrees/api/autoindex.doctree delete mode 100644 doc/build/doctrees/api/nova..adminclient.doctree delete mode 100644 doc/build/doctrees/api/nova..api.cloud.doctree delete mode 100644 doc/build/doctrees/api/nova..api.ec2.admin.doctree delete mode 100644 doc/build/doctrees/api/nova..api.ec2.apirequest.doctree delete mode 100644 doc/build/doctrees/api/nova..api.ec2.cloud.doctree delete mode 100644 doc/build/doctrees/api/nova..api.ec2.images.doctree delete mode 100644 doc/build/doctrees/api/nova..api.ec2.metadatarequesthandler.doctree delete mode 100644 doc/build/doctrees/api/nova..api.openstack.auth.doctree delete mode 100644 doc/build/doctrees/api/nova..api.openstack.backup_schedules.doctree delete mode 100644 doc/build/doctrees/api/nova..api.openstack.faults.doctree delete mode 100644 doc/build/doctrees/api/nova..api.openstack.flavors.doctree delete mode 100644 doc/build/doctrees/api/nova..api.openstack.images.doctree delete mode 100644 doc/build/doctrees/api/nova..api.openstack.servers.doctree delete mode 100644 doc/build/doctrees/api/nova..api.openstack.sharedipgroups.doctree delete mode 100644 doc/build/doctrees/api/nova..auth.dbdriver.doctree delete mode 100644 doc/build/doctrees/api/nova..auth.fakeldap.doctree delete mode 100644 doc/build/doctrees/api/nova..auth.ldapdriver.doctree delete mode 100644 doc/build/doctrees/api/nova..auth.manager.doctree delete mode 100644 doc/build/doctrees/api/nova..auth.signer.doctree delete mode 100644 doc/build/doctrees/api/nova..cloudpipe.pipelib.doctree delete mode 100644 doc/build/doctrees/api/nova..compute.disk.doctree delete mode 100644 doc/build/doctrees/api/nova..compute.instance_types.doctree delete mode 100644 doc/build/doctrees/api/nova..compute.manager.doctree delete mode 100644 doc/build/doctrees/api/nova..compute.monitor.doctree delete mode 100644 doc/build/doctrees/api/nova..compute.power_state.doctree delete mode 100644 doc/build/doctrees/api/nova..context.doctree delete mode 100644 doc/build/doctrees/api/nova..crypto.doctree delete mode 100644 doc/build/doctrees/api/nova..db.api.doctree delete mode 100644 doc/build/doctrees/api/nova..db.sqlalchemy.api.doctree delete mode 100644 doc/build/doctrees/api/nova..db.sqlalchemy.models.doctree delete mode 100644 doc/build/doctrees/api/nova..db.sqlalchemy.session.doctree delete mode 100644 doc/build/doctrees/api/nova..exception.doctree delete mode 100644 doc/build/doctrees/api/nova..fakerabbit.doctree delete mode 100644 doc/build/doctrees/api/nova..flags.doctree delete mode 100644 doc/build/doctrees/api/nova..image.service.doctree delete mode 100644 doc/build/doctrees/api/nova..manager.doctree delete mode 100644 doc/build/doctrees/api/nova..network.linux_net.doctree delete mode 100644 doc/build/doctrees/api/nova..network.manager.doctree delete mode 100644 doc/build/doctrees/api/nova..objectstore.bucket.doctree delete mode 100644 doc/build/doctrees/api/nova..objectstore.handler.doctree delete mode 100644 doc/build/doctrees/api/nova..objectstore.image.doctree delete mode 100644 doc/build/doctrees/api/nova..objectstore.stored.doctree delete mode 100644 doc/build/doctrees/api/nova..process.doctree delete mode 100644 doc/build/doctrees/api/nova..quota.doctree delete mode 100644 doc/build/doctrees/api/nova..rpc.doctree delete mode 100644 doc/build/doctrees/api/nova..scheduler.chance.doctree delete mode 100644 doc/build/doctrees/api/nova..scheduler.driver.doctree delete mode 100644 doc/build/doctrees/api/nova..scheduler.manager.doctree delete mode 100644 doc/build/doctrees/api/nova..scheduler.simple.doctree delete mode 100644 doc/build/doctrees/api/nova..server.doctree delete mode 100644 doc/build/doctrees/api/nova..service.doctree delete mode 100644 doc/build/doctrees/api/nova..test.doctree delete mode 100644 doc/build/doctrees/api/nova..tests.access_unittest.doctree delete mode 100644 doc/build/doctrees/api/nova..tests.api.fakes.doctree delete mode 100644 doc/build/doctrees/api/nova..tests.api.openstack.fakes.doctree delete mode 100644 doc/build/doctrees/api/nova..tests.api.openstack.test_api.doctree delete mode 100644 doc/build/doctrees/api/nova..tests.api.openstack.test_auth.doctree delete mode 100644 doc/build/doctrees/api/nova..tests.api.openstack.test_faults.doctree delete mode 100644 doc/build/doctrees/api/nova..tests.api.openstack.test_flavors.doctree delete mode 100644 doc/build/doctrees/api/nova..tests.api.openstack.test_images.doctree delete mode 100644 doc/build/doctrees/api/nova..tests.api.openstack.test_ratelimiting.doctree delete mode 100644 doc/build/doctrees/api/nova..tests.api.openstack.test_servers.doctree delete mode 100644 doc/build/doctrees/api/nova..tests.api.openstack.test_sharedipgroups.doctree delete mode 100644 doc/build/doctrees/api/nova..tests.api.test_wsgi.doctree delete mode 100644 doc/build/doctrees/api/nova..tests.api_integration.doctree delete mode 100644 doc/build/doctrees/api/nova..tests.api_unittest.doctree delete mode 100644 doc/build/doctrees/api/nova..tests.auth_unittest.doctree delete mode 100644 doc/build/doctrees/api/nova..tests.cloud_unittest.doctree delete mode 100644 doc/build/doctrees/api/nova..tests.compute_unittest.doctree delete mode 100644 doc/build/doctrees/api/nova..tests.declare_flags.doctree delete mode 100644 doc/build/doctrees/api/nova..tests.fake_flags.doctree delete mode 100644 doc/build/doctrees/api/nova..tests.flags_unittest.doctree delete mode 100644 doc/build/doctrees/api/nova..tests.network_unittest.doctree delete mode 100644 doc/build/doctrees/api/nova..tests.objectstore_unittest.doctree delete mode 100644 doc/build/doctrees/api/nova..tests.process_unittest.doctree delete mode 100644 doc/build/doctrees/api/nova..tests.quota_unittest.doctree delete mode 100644 doc/build/doctrees/api/nova..tests.real_flags.doctree delete mode 100644 doc/build/doctrees/api/nova..tests.rpc_unittest.doctree delete mode 100644 doc/build/doctrees/api/nova..tests.runtime_flags.doctree delete mode 100644 doc/build/doctrees/api/nova..tests.scheduler_unittest.doctree delete mode 100644 doc/build/doctrees/api/nova..tests.service_unittest.doctree delete mode 100644 doc/build/doctrees/api/nova..tests.twistd_unittest.doctree delete mode 100644 doc/build/doctrees/api/nova..tests.validator_unittest.doctree delete mode 100644 doc/build/doctrees/api/nova..tests.virt_unittest.doctree delete mode 100644 doc/build/doctrees/api/nova..tests.volume_unittest.doctree delete mode 100644 doc/build/doctrees/api/nova..twistd.doctree delete mode 100644 doc/build/doctrees/api/nova..utils.doctree delete mode 100644 doc/build/doctrees/api/nova..validate.doctree delete mode 100644 doc/build/doctrees/api/nova..virt.connection.doctree delete mode 100644 doc/build/doctrees/api/nova..virt.fake.doctree delete mode 100644 doc/build/doctrees/api/nova..virt.images.doctree delete mode 100644 doc/build/doctrees/api/nova..virt.libvirt_conn.doctree delete mode 100644 doc/build/doctrees/api/nova..virt.xenapi.doctree delete mode 100644 doc/build/doctrees/api/nova..volume.driver.doctree delete mode 100644 doc/build/doctrees/api/nova..volume.manager.doctree delete mode 100644 doc/build/doctrees/api/nova..wsgi.doctree delete mode 100644 doc/build/doctrees/cloud101.doctree delete mode 100644 doc/build/doctrees/code.doctree delete mode 100644 doc/build/doctrees/community.doctree delete mode 100644 doc/build/doctrees/devref/api.doctree delete mode 100644 doc/build/doctrees/devref/architecture.doctree delete mode 100644 doc/build/doctrees/devref/auth.doctree delete mode 100644 doc/build/doctrees/devref/cloudpipe.doctree delete mode 100644 doc/build/doctrees/devref/compute.doctree delete mode 100644 doc/build/doctrees/devref/database.doctree delete mode 100644 doc/build/doctrees/devref/development.environment.doctree delete mode 100644 doc/build/doctrees/devref/fakes.doctree delete mode 100644 doc/build/doctrees/devref/glance.doctree delete mode 100644 doc/build/doctrees/devref/index.doctree delete mode 100644 doc/build/doctrees/devref/modules.doctree delete mode 100644 doc/build/doctrees/devref/network.doctree delete mode 100644 doc/build/doctrees/devref/nova.doctree delete mode 100644 doc/build/doctrees/devref/objectstore.doctree delete mode 100644 doc/build/doctrees/devref/scheduler.doctree delete mode 100644 doc/build/doctrees/devref/services.doctree delete mode 100644 doc/build/doctrees/devref/volume.doctree delete mode 100644 doc/build/doctrees/environment.pickle delete mode 100644 doc/build/doctrees/index.doctree delete mode 100644 doc/build/doctrees/installer.doctree delete mode 100644 doc/build/doctrees/livecd.doctree delete mode 100644 doc/build/doctrees/man/novamanage.doctree delete mode 100644 doc/build/doctrees/nova.concepts.doctree delete mode 100644 doc/build/doctrees/object.model.doctree delete mode 100644 doc/build/doctrees/quickstart.doctree delete mode 100644 doc/build/doctrees/service.architecture.doctree create mode 100644 doc/source/devref/addmethod.openstackapi.rst diff --git a/doc/build/.placeholder b/doc/build/.placeholder deleted file mode 100644 index e69de29bb..000000000 diff --git a/doc/build/doctrees/adminguide/binaries.doctree b/doc/build/doctrees/adminguide/binaries.doctree deleted file mode 100644 index 8006245a9..000000000 Binary files a/doc/build/doctrees/adminguide/binaries.doctree and /dev/null differ diff --git a/doc/build/doctrees/adminguide/distros/others.doctree b/doc/build/doctrees/adminguide/distros/others.doctree deleted file mode 100644 index c7f14fb91..000000000 Binary files a/doc/build/doctrees/adminguide/distros/others.doctree and /dev/null differ diff --git a/doc/build/doctrees/adminguide/distros/ubuntu.10.04.doctree b/doc/build/doctrees/adminguide/distros/ubuntu.10.04.doctree deleted file mode 100644 index 135763bf7..000000000 Binary files a/doc/build/doctrees/adminguide/distros/ubuntu.10.04.doctree and /dev/null differ diff --git a/doc/build/doctrees/adminguide/distros/ubuntu.10.10.doctree b/doc/build/doctrees/adminguide/distros/ubuntu.10.10.doctree deleted file mode 100644 index 2005aa78c..000000000 Binary files a/doc/build/doctrees/adminguide/distros/ubuntu.10.10.doctree and /dev/null differ diff --git a/doc/build/doctrees/adminguide/euca2ools.doctree b/doc/build/doctrees/adminguide/euca2ools.doctree deleted file mode 100644 index 390845265..000000000 Binary files a/doc/build/doctrees/adminguide/euca2ools.doctree and /dev/null differ diff --git a/doc/build/doctrees/adminguide/flags.doctree b/doc/build/doctrees/adminguide/flags.doctree deleted file mode 100644 index 0fd0522b8..000000000 Binary files a/doc/build/doctrees/adminguide/flags.doctree and /dev/null differ diff --git a/doc/build/doctrees/adminguide/getting.started.doctree b/doc/build/doctrees/adminguide/getting.started.doctree deleted file mode 100644 index a4d1fce7a..000000000 Binary files a/doc/build/doctrees/adminguide/getting.started.doctree and /dev/null differ diff --git a/doc/build/doctrees/adminguide/index.doctree b/doc/build/doctrees/adminguide/index.doctree deleted file mode 100644 index 43791ff9d..000000000 Binary files a/doc/build/doctrees/adminguide/index.doctree and /dev/null differ diff --git a/doc/build/doctrees/adminguide/managing.images.doctree b/doc/build/doctrees/adminguide/managing.images.doctree deleted file mode 100644 index 764bc8ace..000000000 Binary files a/doc/build/doctrees/adminguide/managing.images.doctree and /dev/null differ diff --git a/doc/build/doctrees/adminguide/managing.instances.doctree b/doc/build/doctrees/adminguide/managing.instances.doctree deleted file mode 100644 index 3bd9917de..000000000 Binary files a/doc/build/doctrees/adminguide/managing.instances.doctree and /dev/null differ diff --git a/doc/build/doctrees/adminguide/managing.networks.doctree b/doc/build/doctrees/adminguide/managing.networks.doctree deleted file mode 100644 index e34f6ae28..000000000 Binary files a/doc/build/doctrees/adminguide/managing.networks.doctree and /dev/null differ diff --git a/doc/build/doctrees/adminguide/managing.projects.doctree b/doc/build/doctrees/adminguide/managing.projects.doctree deleted file mode 100644 index 041c1dd61..000000000 Binary files a/doc/build/doctrees/adminguide/managing.projects.doctree and /dev/null differ diff --git a/doc/build/doctrees/adminguide/managing.users.doctree b/doc/build/doctrees/adminguide/managing.users.doctree deleted file mode 100644 index c21f05487..000000000 Binary files a/doc/build/doctrees/adminguide/managing.users.doctree and /dev/null differ diff --git a/doc/build/doctrees/adminguide/managingsecurity.doctree b/doc/build/doctrees/adminguide/managingsecurity.doctree deleted file mode 100644 index 8d5a35097..000000000 Binary files a/doc/build/doctrees/adminguide/managingsecurity.doctree and /dev/null differ diff --git a/doc/build/doctrees/adminguide/monitoring.doctree b/doc/build/doctrees/adminguide/monitoring.doctree deleted file mode 100644 index c0c83f29a..000000000 Binary files a/doc/build/doctrees/adminguide/monitoring.doctree and /dev/null differ diff --git a/doc/build/doctrees/adminguide/multi.node.install.doctree b/doc/build/doctrees/adminguide/multi.node.install.doctree deleted file mode 100644 index 0b24939e6..000000000 Binary files a/doc/build/doctrees/adminguide/multi.node.install.doctree and /dev/null differ diff --git a/doc/build/doctrees/adminguide/network.flat.doctree b/doc/build/doctrees/adminguide/network.flat.doctree deleted file mode 100644 index 99b60132e..000000000 Binary files a/doc/build/doctrees/adminguide/network.flat.doctree and /dev/null differ diff --git a/doc/build/doctrees/adminguide/network.vlan.doctree b/doc/build/doctrees/adminguide/network.vlan.doctree deleted file mode 100644 index 02e6e7ef1..000000000 Binary files a/doc/build/doctrees/adminguide/network.vlan.doctree and /dev/null differ diff --git a/doc/build/doctrees/adminguide/nova.manage.doctree b/doc/build/doctrees/adminguide/nova.manage.doctree deleted file mode 100644 index b06b1fc48..000000000 Binary files a/doc/build/doctrees/adminguide/nova.manage.doctree and /dev/null differ diff --git a/doc/build/doctrees/adminguide/single.node.install.doctree b/doc/build/doctrees/adminguide/single.node.install.doctree deleted file mode 100644 index a0a0c9271..000000000 Binary files a/doc/build/doctrees/adminguide/single.node.install.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/autoindex.doctree b/doc/build/doctrees/api/autoindex.doctree deleted file mode 100644 index ca690eeab..000000000 Binary files a/doc/build/doctrees/api/autoindex.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..adminclient.doctree b/doc/build/doctrees/api/nova..adminclient.doctree deleted file mode 100644 index 5fc153196..000000000 Binary files a/doc/build/doctrees/api/nova..adminclient.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..api.cloud.doctree b/doc/build/doctrees/api/nova..api.cloud.doctree deleted file mode 100644 index 21d8011be..000000000 Binary files a/doc/build/doctrees/api/nova..api.cloud.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..api.ec2.admin.doctree b/doc/build/doctrees/api/nova..api.ec2.admin.doctree deleted file mode 100644 index 3fec631a4..000000000 Binary files a/doc/build/doctrees/api/nova..api.ec2.admin.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..api.ec2.apirequest.doctree b/doc/build/doctrees/api/nova..api.ec2.apirequest.doctree deleted file mode 100644 index b212d15a7..000000000 Binary files a/doc/build/doctrees/api/nova..api.ec2.apirequest.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..api.ec2.cloud.doctree b/doc/build/doctrees/api/nova..api.ec2.cloud.doctree deleted file mode 100644 index 16d7ad90a..000000000 Binary files a/doc/build/doctrees/api/nova..api.ec2.cloud.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..api.ec2.images.doctree b/doc/build/doctrees/api/nova..api.ec2.images.doctree deleted file mode 100644 index 340a4bc04..000000000 Binary files a/doc/build/doctrees/api/nova..api.ec2.images.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..api.ec2.metadatarequesthandler.doctree b/doc/build/doctrees/api/nova..api.ec2.metadatarequesthandler.doctree deleted file mode 100644 index c1da3eaf9..000000000 Binary files a/doc/build/doctrees/api/nova..api.ec2.metadatarequesthandler.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..api.openstack.auth.doctree b/doc/build/doctrees/api/nova..api.openstack.auth.doctree deleted file mode 100644 index b5e4e32ae..000000000 Binary files a/doc/build/doctrees/api/nova..api.openstack.auth.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..api.openstack.backup_schedules.doctree b/doc/build/doctrees/api/nova..api.openstack.backup_schedules.doctree deleted file mode 100644 index 3e063ce80..000000000 Binary files a/doc/build/doctrees/api/nova..api.openstack.backup_schedules.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..api.openstack.faults.doctree b/doc/build/doctrees/api/nova..api.openstack.faults.doctree deleted file mode 100644 index e2c149b4b..000000000 Binary files a/doc/build/doctrees/api/nova..api.openstack.faults.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..api.openstack.flavors.doctree b/doc/build/doctrees/api/nova..api.openstack.flavors.doctree deleted file mode 100644 index 0df3200c1..000000000 Binary files a/doc/build/doctrees/api/nova..api.openstack.flavors.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..api.openstack.images.doctree b/doc/build/doctrees/api/nova..api.openstack.images.doctree deleted file mode 100644 index e2f83944b..000000000 Binary files a/doc/build/doctrees/api/nova..api.openstack.images.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..api.openstack.servers.doctree b/doc/build/doctrees/api/nova..api.openstack.servers.doctree deleted file mode 100644 index 64bf16c45..000000000 Binary files a/doc/build/doctrees/api/nova..api.openstack.servers.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..api.openstack.sharedipgroups.doctree b/doc/build/doctrees/api/nova..api.openstack.sharedipgroups.doctree deleted file mode 100644 index 144e9472b..000000000 Binary files a/doc/build/doctrees/api/nova..api.openstack.sharedipgroups.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..auth.dbdriver.doctree b/doc/build/doctrees/api/nova..auth.dbdriver.doctree deleted file mode 100644 index 6fdcc725e..000000000 Binary files a/doc/build/doctrees/api/nova..auth.dbdriver.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..auth.fakeldap.doctree b/doc/build/doctrees/api/nova..auth.fakeldap.doctree deleted file mode 100644 index 2723a22ff..000000000 Binary files a/doc/build/doctrees/api/nova..auth.fakeldap.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..auth.ldapdriver.doctree b/doc/build/doctrees/api/nova..auth.ldapdriver.doctree deleted file mode 100644 index 1698a7a67..000000000 Binary files a/doc/build/doctrees/api/nova..auth.ldapdriver.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..auth.manager.doctree b/doc/build/doctrees/api/nova..auth.manager.doctree deleted file mode 100644 index e323006e1..000000000 Binary files a/doc/build/doctrees/api/nova..auth.manager.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..auth.signer.doctree b/doc/build/doctrees/api/nova..auth.signer.doctree deleted file mode 100644 index fe4dd3f67..000000000 Binary files a/doc/build/doctrees/api/nova..auth.signer.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..cloudpipe.pipelib.doctree b/doc/build/doctrees/api/nova..cloudpipe.pipelib.doctree deleted file mode 100644 index 5027c13bb..000000000 Binary files a/doc/build/doctrees/api/nova..cloudpipe.pipelib.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..compute.disk.doctree b/doc/build/doctrees/api/nova..compute.disk.doctree deleted file mode 100644 index ac3a5478e..000000000 Binary files a/doc/build/doctrees/api/nova..compute.disk.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..compute.instance_types.doctree b/doc/build/doctrees/api/nova..compute.instance_types.doctree deleted file mode 100644 index 2a7c03553..000000000 Binary files a/doc/build/doctrees/api/nova..compute.instance_types.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..compute.manager.doctree b/doc/build/doctrees/api/nova..compute.manager.doctree deleted file mode 100644 index bc7446484..000000000 Binary files a/doc/build/doctrees/api/nova..compute.manager.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..compute.monitor.doctree b/doc/build/doctrees/api/nova..compute.monitor.doctree deleted file mode 100644 index 34cad0354..000000000 Binary files a/doc/build/doctrees/api/nova..compute.monitor.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..compute.power_state.doctree b/doc/build/doctrees/api/nova..compute.power_state.doctree deleted file mode 100644 index b2424de7b..000000000 Binary files a/doc/build/doctrees/api/nova..compute.power_state.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..context.doctree b/doc/build/doctrees/api/nova..context.doctree deleted file mode 100644 index b8352dfd5..000000000 Binary files a/doc/build/doctrees/api/nova..context.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..crypto.doctree b/doc/build/doctrees/api/nova..crypto.doctree deleted file mode 100644 index e40b776f1..000000000 Binary files a/doc/build/doctrees/api/nova..crypto.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..db.api.doctree b/doc/build/doctrees/api/nova..db.api.doctree deleted file mode 100644 index e8ffeed71..000000000 Binary files a/doc/build/doctrees/api/nova..db.api.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..db.sqlalchemy.api.doctree b/doc/build/doctrees/api/nova..db.sqlalchemy.api.doctree deleted file mode 100644 index a67a57d41..000000000 Binary files a/doc/build/doctrees/api/nova..db.sqlalchemy.api.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..db.sqlalchemy.models.doctree b/doc/build/doctrees/api/nova..db.sqlalchemy.models.doctree deleted file mode 100644 index 42a1e51fe..000000000 Binary files a/doc/build/doctrees/api/nova..db.sqlalchemy.models.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..db.sqlalchemy.session.doctree b/doc/build/doctrees/api/nova..db.sqlalchemy.session.doctree deleted file mode 100644 index 1253924b5..000000000 Binary files a/doc/build/doctrees/api/nova..db.sqlalchemy.session.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..exception.doctree b/doc/build/doctrees/api/nova..exception.doctree deleted file mode 100644 index 53f4b6889..000000000 Binary files a/doc/build/doctrees/api/nova..exception.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..fakerabbit.doctree b/doc/build/doctrees/api/nova..fakerabbit.doctree deleted file mode 100644 index b63c50cd8..000000000 Binary files a/doc/build/doctrees/api/nova..fakerabbit.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..flags.doctree b/doc/build/doctrees/api/nova..flags.doctree deleted file mode 100644 index ca1115625..000000000 Binary files a/doc/build/doctrees/api/nova..flags.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..image.service.doctree b/doc/build/doctrees/api/nova..image.service.doctree deleted file mode 100644 index 9798631ae..000000000 Binary files a/doc/build/doctrees/api/nova..image.service.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..manager.doctree b/doc/build/doctrees/api/nova..manager.doctree deleted file mode 100644 index 59c20c56c..000000000 Binary files a/doc/build/doctrees/api/nova..manager.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..network.linux_net.doctree b/doc/build/doctrees/api/nova..network.linux_net.doctree deleted file mode 100644 index 850b1fe46..000000000 Binary files a/doc/build/doctrees/api/nova..network.linux_net.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..network.manager.doctree b/doc/build/doctrees/api/nova..network.manager.doctree deleted file mode 100644 index 5a17fa2a6..000000000 Binary files a/doc/build/doctrees/api/nova..network.manager.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..objectstore.bucket.doctree b/doc/build/doctrees/api/nova..objectstore.bucket.doctree deleted file mode 100644 index c4c5cfa86..000000000 Binary files a/doc/build/doctrees/api/nova..objectstore.bucket.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..objectstore.handler.doctree b/doc/build/doctrees/api/nova..objectstore.handler.doctree deleted file mode 100644 index dd22550ad..000000000 Binary files a/doc/build/doctrees/api/nova..objectstore.handler.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..objectstore.image.doctree b/doc/build/doctrees/api/nova..objectstore.image.doctree deleted file mode 100644 index 89e80c8b7..000000000 Binary files a/doc/build/doctrees/api/nova..objectstore.image.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..objectstore.stored.doctree b/doc/build/doctrees/api/nova..objectstore.stored.doctree deleted file mode 100644 index 37eb82db0..000000000 Binary files a/doc/build/doctrees/api/nova..objectstore.stored.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..process.doctree b/doc/build/doctrees/api/nova..process.doctree deleted file mode 100644 index ca306d07e..000000000 Binary files a/doc/build/doctrees/api/nova..process.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..quota.doctree b/doc/build/doctrees/api/nova..quota.doctree deleted file mode 100644 index ea7e87026..000000000 Binary files a/doc/build/doctrees/api/nova..quota.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..rpc.doctree b/doc/build/doctrees/api/nova..rpc.doctree deleted file mode 100644 index d774f13ac..000000000 Binary files a/doc/build/doctrees/api/nova..rpc.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..scheduler.chance.doctree b/doc/build/doctrees/api/nova..scheduler.chance.doctree deleted file mode 100644 index 0d65dbd82..000000000 Binary files a/doc/build/doctrees/api/nova..scheduler.chance.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..scheduler.driver.doctree b/doc/build/doctrees/api/nova..scheduler.driver.doctree deleted file mode 100644 index cdd709e09..000000000 Binary files a/doc/build/doctrees/api/nova..scheduler.driver.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..scheduler.manager.doctree b/doc/build/doctrees/api/nova..scheduler.manager.doctree deleted file mode 100644 index 04d6d7a02..000000000 Binary files a/doc/build/doctrees/api/nova..scheduler.manager.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..scheduler.simple.doctree b/doc/build/doctrees/api/nova..scheduler.simple.doctree deleted file mode 100644 index 0831a51dc..000000000 Binary files a/doc/build/doctrees/api/nova..scheduler.simple.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..server.doctree b/doc/build/doctrees/api/nova..server.doctree deleted file mode 100644 index 3afb0e8ec..000000000 Binary files a/doc/build/doctrees/api/nova..server.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..service.doctree b/doc/build/doctrees/api/nova..service.doctree deleted file mode 100644 index 7f7ae945f..000000000 Binary files a/doc/build/doctrees/api/nova..service.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..test.doctree b/doc/build/doctrees/api/nova..test.doctree deleted file mode 100644 index 4c387d9a6..000000000 Binary files a/doc/build/doctrees/api/nova..test.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..tests.access_unittest.doctree b/doc/build/doctrees/api/nova..tests.access_unittest.doctree deleted file mode 100644 index 62425af2b..000000000 Binary files a/doc/build/doctrees/api/nova..tests.access_unittest.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..tests.api.fakes.doctree b/doc/build/doctrees/api/nova..tests.api.fakes.doctree deleted file mode 100644 index dda086c3e..000000000 Binary files a/doc/build/doctrees/api/nova..tests.api.fakes.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..tests.api.openstack.fakes.doctree b/doc/build/doctrees/api/nova..tests.api.openstack.fakes.doctree deleted file mode 100644 index 326af55b7..000000000 Binary files a/doc/build/doctrees/api/nova..tests.api.openstack.fakes.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..tests.api.openstack.test_api.doctree b/doc/build/doctrees/api/nova..tests.api.openstack.test_api.doctree deleted file mode 100644 index 16f344192..000000000 Binary files a/doc/build/doctrees/api/nova..tests.api.openstack.test_api.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..tests.api.openstack.test_auth.doctree b/doc/build/doctrees/api/nova..tests.api.openstack.test_auth.doctree deleted file mode 100644 index 7fccdda3d..000000000 Binary files a/doc/build/doctrees/api/nova..tests.api.openstack.test_auth.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..tests.api.openstack.test_faults.doctree b/doc/build/doctrees/api/nova..tests.api.openstack.test_faults.doctree deleted file mode 100644 index 6b82c60b2..000000000 Binary files a/doc/build/doctrees/api/nova..tests.api.openstack.test_faults.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..tests.api.openstack.test_flavors.doctree b/doc/build/doctrees/api/nova..tests.api.openstack.test_flavors.doctree deleted file mode 100644 index 7339f03fc..000000000 Binary files a/doc/build/doctrees/api/nova..tests.api.openstack.test_flavors.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..tests.api.openstack.test_images.doctree b/doc/build/doctrees/api/nova..tests.api.openstack.test_images.doctree deleted file mode 100644 index 30849418b..000000000 Binary files a/doc/build/doctrees/api/nova..tests.api.openstack.test_images.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..tests.api.openstack.test_ratelimiting.doctree b/doc/build/doctrees/api/nova..tests.api.openstack.test_ratelimiting.doctree deleted file mode 100644 index ba40cd2f0..000000000 Binary files a/doc/build/doctrees/api/nova..tests.api.openstack.test_ratelimiting.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..tests.api.openstack.test_servers.doctree b/doc/build/doctrees/api/nova..tests.api.openstack.test_servers.doctree deleted file mode 100644 index 37017584f..000000000 Binary files a/doc/build/doctrees/api/nova..tests.api.openstack.test_servers.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..tests.api.openstack.test_sharedipgroups.doctree b/doc/build/doctrees/api/nova..tests.api.openstack.test_sharedipgroups.doctree deleted file mode 100644 index 6febac045..000000000 Binary files a/doc/build/doctrees/api/nova..tests.api.openstack.test_sharedipgroups.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..tests.api.test_wsgi.doctree b/doc/build/doctrees/api/nova..tests.api.test_wsgi.doctree deleted file mode 100644 index f4fc78f11..000000000 Binary files a/doc/build/doctrees/api/nova..tests.api.test_wsgi.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..tests.api_integration.doctree b/doc/build/doctrees/api/nova..tests.api_integration.doctree deleted file mode 100644 index 1a85b2439..000000000 Binary files a/doc/build/doctrees/api/nova..tests.api_integration.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..tests.api_unittest.doctree b/doc/build/doctrees/api/nova..tests.api_unittest.doctree deleted file mode 100644 index de15e69c2..000000000 Binary files a/doc/build/doctrees/api/nova..tests.api_unittest.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..tests.auth_unittest.doctree b/doc/build/doctrees/api/nova..tests.auth_unittest.doctree deleted file mode 100644 index 262beefbc..000000000 Binary files a/doc/build/doctrees/api/nova..tests.auth_unittest.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..tests.cloud_unittest.doctree b/doc/build/doctrees/api/nova..tests.cloud_unittest.doctree deleted file mode 100644 index 69bbe7456..000000000 Binary files a/doc/build/doctrees/api/nova..tests.cloud_unittest.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..tests.compute_unittest.doctree b/doc/build/doctrees/api/nova..tests.compute_unittest.doctree deleted file mode 100644 index 71874bbe8..000000000 Binary files a/doc/build/doctrees/api/nova..tests.compute_unittest.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..tests.declare_flags.doctree b/doc/build/doctrees/api/nova..tests.declare_flags.doctree deleted file mode 100644 index 33d1e29d8..000000000 Binary files a/doc/build/doctrees/api/nova..tests.declare_flags.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..tests.fake_flags.doctree b/doc/build/doctrees/api/nova..tests.fake_flags.doctree deleted file mode 100644 index cc925c70e..000000000 Binary files a/doc/build/doctrees/api/nova..tests.fake_flags.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..tests.flags_unittest.doctree b/doc/build/doctrees/api/nova..tests.flags_unittest.doctree deleted file mode 100644 index d53aa0854..000000000 Binary files a/doc/build/doctrees/api/nova..tests.flags_unittest.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..tests.network_unittest.doctree b/doc/build/doctrees/api/nova..tests.network_unittest.doctree deleted file mode 100644 index 721e3eb5e..000000000 Binary files a/doc/build/doctrees/api/nova..tests.network_unittest.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..tests.objectstore_unittest.doctree b/doc/build/doctrees/api/nova..tests.objectstore_unittest.doctree deleted file mode 100644 index a012c0699..000000000 Binary files a/doc/build/doctrees/api/nova..tests.objectstore_unittest.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..tests.process_unittest.doctree b/doc/build/doctrees/api/nova..tests.process_unittest.doctree deleted file mode 100644 index 284e15b3d..000000000 Binary files a/doc/build/doctrees/api/nova..tests.process_unittest.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..tests.quota_unittest.doctree b/doc/build/doctrees/api/nova..tests.quota_unittest.doctree deleted file mode 100644 index cd2dc5588..000000000 Binary files a/doc/build/doctrees/api/nova..tests.quota_unittest.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..tests.real_flags.doctree b/doc/build/doctrees/api/nova..tests.real_flags.doctree deleted file mode 100644 index 9f338dfe8..000000000 Binary files a/doc/build/doctrees/api/nova..tests.real_flags.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..tests.rpc_unittest.doctree b/doc/build/doctrees/api/nova..tests.rpc_unittest.doctree deleted file mode 100644 index 9499865f1..000000000 Binary files a/doc/build/doctrees/api/nova..tests.rpc_unittest.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..tests.runtime_flags.doctree b/doc/build/doctrees/api/nova..tests.runtime_flags.doctree deleted file mode 100644 index a652947c3..000000000 Binary files a/doc/build/doctrees/api/nova..tests.runtime_flags.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..tests.scheduler_unittest.doctree b/doc/build/doctrees/api/nova..tests.scheduler_unittest.doctree deleted file mode 100644 index 22ff4eaf5..000000000 Binary files a/doc/build/doctrees/api/nova..tests.scheduler_unittest.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..tests.service_unittest.doctree b/doc/build/doctrees/api/nova..tests.service_unittest.doctree deleted file mode 100644 index c5a225518..000000000 Binary files a/doc/build/doctrees/api/nova..tests.service_unittest.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..tests.twistd_unittest.doctree b/doc/build/doctrees/api/nova..tests.twistd_unittest.doctree deleted file mode 100644 index a52f8dcf3..000000000 Binary files a/doc/build/doctrees/api/nova..tests.twistd_unittest.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..tests.validator_unittest.doctree b/doc/build/doctrees/api/nova..tests.validator_unittest.doctree deleted file mode 100644 index d81dde843..000000000 Binary files a/doc/build/doctrees/api/nova..tests.validator_unittest.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..tests.virt_unittest.doctree b/doc/build/doctrees/api/nova..tests.virt_unittest.doctree deleted file mode 100644 index 62b642b63..000000000 Binary files a/doc/build/doctrees/api/nova..tests.virt_unittest.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..tests.volume_unittest.doctree b/doc/build/doctrees/api/nova..tests.volume_unittest.doctree deleted file mode 100644 index c99f33eb8..000000000 Binary files a/doc/build/doctrees/api/nova..tests.volume_unittest.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..twistd.doctree b/doc/build/doctrees/api/nova..twistd.doctree deleted file mode 100644 index 893f4864b..000000000 Binary files a/doc/build/doctrees/api/nova..twistd.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..utils.doctree b/doc/build/doctrees/api/nova..utils.doctree deleted file mode 100644 index 4c164066c..000000000 Binary files a/doc/build/doctrees/api/nova..utils.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..validate.doctree b/doc/build/doctrees/api/nova..validate.doctree deleted file mode 100644 index 3098bc6fd..000000000 Binary files a/doc/build/doctrees/api/nova..validate.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..virt.connection.doctree b/doc/build/doctrees/api/nova..virt.connection.doctree deleted file mode 100644 index ea4dbaba1..000000000 Binary files a/doc/build/doctrees/api/nova..virt.connection.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..virt.fake.doctree b/doc/build/doctrees/api/nova..virt.fake.doctree deleted file mode 100644 index a028d10ec..000000000 Binary files a/doc/build/doctrees/api/nova..virt.fake.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..virt.images.doctree b/doc/build/doctrees/api/nova..virt.images.doctree deleted file mode 100644 index db2353d42..000000000 Binary files a/doc/build/doctrees/api/nova..virt.images.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..virt.libvirt_conn.doctree b/doc/build/doctrees/api/nova..virt.libvirt_conn.doctree deleted file mode 100644 index 3ae5410cb..000000000 Binary files a/doc/build/doctrees/api/nova..virt.libvirt_conn.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..virt.xenapi.doctree b/doc/build/doctrees/api/nova..virt.xenapi.doctree deleted file mode 100644 index 5173a3338..000000000 Binary files a/doc/build/doctrees/api/nova..virt.xenapi.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..volume.driver.doctree b/doc/build/doctrees/api/nova..volume.driver.doctree deleted file mode 100644 index a31cf96c0..000000000 Binary files a/doc/build/doctrees/api/nova..volume.driver.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..volume.manager.doctree b/doc/build/doctrees/api/nova..volume.manager.doctree deleted file mode 100644 index dceea1808..000000000 Binary files a/doc/build/doctrees/api/nova..volume.manager.doctree and /dev/null differ diff --git a/doc/build/doctrees/api/nova..wsgi.doctree b/doc/build/doctrees/api/nova..wsgi.doctree deleted file mode 100644 index 1b5467242..000000000 Binary files a/doc/build/doctrees/api/nova..wsgi.doctree and /dev/null differ diff --git a/doc/build/doctrees/cloud101.doctree b/doc/build/doctrees/cloud101.doctree deleted file mode 100644 index e7667f866..000000000 Binary files a/doc/build/doctrees/cloud101.doctree and /dev/null differ diff --git a/doc/build/doctrees/code.doctree b/doc/build/doctrees/code.doctree deleted file mode 100644 index ce5ad4485..000000000 Binary files a/doc/build/doctrees/code.doctree and /dev/null differ diff --git a/doc/build/doctrees/community.doctree b/doc/build/doctrees/community.doctree deleted file mode 100644 index 6837addb6..000000000 Binary files a/doc/build/doctrees/community.doctree and /dev/null differ diff --git a/doc/build/doctrees/devref/api.doctree b/doc/build/doctrees/devref/api.doctree deleted file mode 100644 index 8151a68da..000000000 Binary files a/doc/build/doctrees/devref/api.doctree and /dev/null differ diff --git a/doc/build/doctrees/devref/architecture.doctree b/doc/build/doctrees/devref/architecture.doctree deleted file mode 100644 index b5de0bc69..000000000 Binary files a/doc/build/doctrees/devref/architecture.doctree and /dev/null differ diff --git a/doc/build/doctrees/devref/auth.doctree b/doc/build/doctrees/devref/auth.doctree deleted file mode 100644 index 97d880a5e..000000000 Binary files a/doc/build/doctrees/devref/auth.doctree and /dev/null differ diff --git a/doc/build/doctrees/devref/cloudpipe.doctree b/doc/build/doctrees/devref/cloudpipe.doctree deleted file mode 100644 index d7f9a48a4..000000000 Binary files a/doc/build/doctrees/devref/cloudpipe.doctree and /dev/null differ diff --git a/doc/build/doctrees/devref/compute.doctree b/doc/build/doctrees/devref/compute.doctree deleted file mode 100644 index d74e49f5a..000000000 Binary files a/doc/build/doctrees/devref/compute.doctree and /dev/null differ diff --git a/doc/build/doctrees/devref/database.doctree b/doc/build/doctrees/devref/database.doctree deleted file mode 100644 index 7c57de72a..000000000 Binary files a/doc/build/doctrees/devref/database.doctree and /dev/null differ diff --git a/doc/build/doctrees/devref/development.environment.doctree b/doc/build/doctrees/devref/development.environment.doctree deleted file mode 100644 index 4862bd192..000000000 Binary files a/doc/build/doctrees/devref/development.environment.doctree and /dev/null differ diff --git a/doc/build/doctrees/devref/fakes.doctree b/doc/build/doctrees/devref/fakes.doctree deleted file mode 100644 index 8c07eced6..000000000 Binary files a/doc/build/doctrees/devref/fakes.doctree and /dev/null differ diff --git a/doc/build/doctrees/devref/glance.doctree b/doc/build/doctrees/devref/glance.doctree deleted file mode 100644 index 124d77771..000000000 Binary files a/doc/build/doctrees/devref/glance.doctree and /dev/null differ diff --git a/doc/build/doctrees/devref/index.doctree b/doc/build/doctrees/devref/index.doctree deleted file mode 100644 index 8c155355e..000000000 Binary files a/doc/build/doctrees/devref/index.doctree and /dev/null differ diff --git a/doc/build/doctrees/devref/modules.doctree b/doc/build/doctrees/devref/modules.doctree deleted file mode 100644 index e6dcde834..000000000 Binary files a/doc/build/doctrees/devref/modules.doctree and /dev/null differ diff --git a/doc/build/doctrees/devref/network.doctree b/doc/build/doctrees/devref/network.doctree deleted file mode 100644 index 57724103b..000000000 Binary files a/doc/build/doctrees/devref/network.doctree and /dev/null differ diff --git a/doc/build/doctrees/devref/nova.doctree b/doc/build/doctrees/devref/nova.doctree deleted file mode 100644 index 3e243c00b..000000000 Binary files a/doc/build/doctrees/devref/nova.doctree and /dev/null differ diff --git a/doc/build/doctrees/devref/objectstore.doctree b/doc/build/doctrees/devref/objectstore.doctree deleted file mode 100644 index 112c6856e..000000000 Binary files a/doc/build/doctrees/devref/objectstore.doctree and /dev/null differ diff --git a/doc/build/doctrees/devref/scheduler.doctree b/doc/build/doctrees/devref/scheduler.doctree deleted file mode 100644 index a82138866..000000000 Binary files a/doc/build/doctrees/devref/scheduler.doctree and /dev/null differ diff --git a/doc/build/doctrees/devref/services.doctree b/doc/build/doctrees/devref/services.doctree deleted file mode 100644 index b5bdb8f34..000000000 Binary files a/doc/build/doctrees/devref/services.doctree and /dev/null differ diff --git a/doc/build/doctrees/devref/volume.doctree b/doc/build/doctrees/devref/volume.doctree deleted file mode 100644 index 77ccc2f28..000000000 Binary files a/doc/build/doctrees/devref/volume.doctree and /dev/null differ diff --git a/doc/build/doctrees/environment.pickle b/doc/build/doctrees/environment.pickle deleted file mode 100644 index 6c3552ddc..000000000 Binary files a/doc/build/doctrees/environment.pickle and /dev/null differ diff --git a/doc/build/doctrees/index.doctree b/doc/build/doctrees/index.doctree deleted file mode 100644 index 0ce64eaea..000000000 Binary files a/doc/build/doctrees/index.doctree and /dev/null differ diff --git a/doc/build/doctrees/installer.doctree b/doc/build/doctrees/installer.doctree deleted file mode 100644 index b193cbe32..000000000 Binary files a/doc/build/doctrees/installer.doctree and /dev/null differ diff --git a/doc/build/doctrees/livecd.doctree b/doc/build/doctrees/livecd.doctree deleted file mode 100644 index 7e9ae7f3e..000000000 Binary files a/doc/build/doctrees/livecd.doctree and /dev/null differ diff --git a/doc/build/doctrees/man/novamanage.doctree b/doc/build/doctrees/man/novamanage.doctree deleted file mode 100644 index cccfa3e65..000000000 Binary files a/doc/build/doctrees/man/novamanage.doctree and /dev/null differ diff --git a/doc/build/doctrees/nova.concepts.doctree b/doc/build/doctrees/nova.concepts.doctree deleted file mode 100644 index 71fcc46bf..000000000 Binary files a/doc/build/doctrees/nova.concepts.doctree and /dev/null differ diff --git a/doc/build/doctrees/object.model.doctree b/doc/build/doctrees/object.model.doctree deleted file mode 100644 index 16500b8e9..000000000 Binary files a/doc/build/doctrees/object.model.doctree and /dev/null differ diff --git a/doc/build/doctrees/quickstart.doctree b/doc/build/doctrees/quickstart.doctree deleted file mode 100644 index fad66f8dd..000000000 Binary files a/doc/build/doctrees/quickstart.doctree and /dev/null differ diff --git a/doc/build/doctrees/service.architecture.doctree b/doc/build/doctrees/service.architecture.doctree deleted file mode 100644 index 4fc09dd05..000000000 Binary files a/doc/build/doctrees/service.architecture.doctree and /dev/null differ diff --git a/doc/source/devref/addmethod.openstackapi.rst b/doc/source/devref/addmethod.openstackapi.rst new file mode 100644 index 000000000..6484613df --- /dev/null +++ b/doc/source/devref/addmethod.openstackapi.rst @@ -0,0 +1,56 @@ +.. + 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. + +Adding a Method to the OpenStack API +==================================== + +The interface is a mostly RESTful API. REST stands for Representational State Transfer and provides an architecture "style" for distributed systems using HTTP for transport. Figure out a way to express your request and response in terms of resources that are being created, modified, read, or destroyed. + +Routing +------- + +To map URLs to controllers+actions, OpenStack uses the Routes package, a clone of Rails routes for Python implementations. See http://routes.groovie.org/ fore more information. + +URLs are mapped to "action" methods on "controller" classes in nova/api/openstack/__init__/ApiRouter.__init__ . + +See http://routes.groovie.org/manual.html for all syntax, but you'll probably just need these two: + - mapper.connect() lets you map a single URL to a single action on a controller. + - mapper.resource() connects many standard URLs to actions on a controller. + +Controllers and actions +----------------------- + +Controllers live in nova/api/openstack, and inherit from nova.wsgi.Controller. + +See nova/api/openstack/servers.py for an example. + +Action methods take parameters that are sucked out of the URL by mapper.connect() or .resource(). The first two parameters are self and the WebOb request, from which you can get the req.environ, req.body, req.headers, etc. + +Serialization +------------- + +Actions return a dictionary, and wsgi.Controller serializes that to JSON or XML based on the request's content-type. + +If you define a new controller, you'll need to define a _serialization_metadata attribute on the class, to tell wsgi.Controller how to convert your dictionary to XML. It needs to know the singular form of any list tag (e.g. list contains tags) and which dictionary keys are to be XML attributes as opposed to subtags (e.g. instead of 4). + +See nova/api/openstack/servers.py for an example. + +Faults +------ + +If you need to return a non-200, you should +return faults.Fault(webob.exc.HTTPNotFound()) +replacing the exception as appropriate. diff --git a/doc/source/devref/development.environment.rst b/doc/source/devref/development.environment.rst index 34104c964..893519807 100644 --- a/doc/source/devref/development.environment.rst +++ b/doc/source/devref/development.environment.rst @@ -15,7 +15,86 @@ License for the specific language governing permissions and limitations under the License. -Setting up a development environment +Setting Up a Development Environment ==================================== -.. todo:: write this +This page describes how to setup a working Python development environment that can be used in developing on OpenStack on Ubuntu or Mac OSX. These instructions assume you're already familiar with bzr and can pull down the code with an existing Launchpad account. Refer to http://wiki.openstack.org/LifeWithBzrAndLaunchpad for additional information. + +Linux Systems +------------- + + '' At present, this section is tested for Nova on Ubuntu 10.10-64. Feel free to add notes and change according to your experiences or operating system.'' + +Bring down the Nova source with bzr, then: +:: + cd /nova + sudo apt-get install python-dev swig libssl-dev python-pip + sudo easy_install nose + pip install virtualenv + python tools/install_venv.py + +If all goes well, you should get a message something like this: + + :: + Nova development environment setup is complete. + +Nova development uses virtualenv to track and manage Python dependencies while in development and testing. + +To activate the Nova virtualenv for the extent of your current shell session + you can run: + + :: + $ source .nova-venv/bin/activate + + Or, if you prefer, you can run commands in the virtualenv on a case by case + basis by running: + :: + $ tools/with_venv.sh + + Also, make test will automatically use the virtualenv. + +If you don't want to create a virtualenv every time you branch (which takes a while as long as we have the large Twisted project as a dependency) you can reuse a single virtualenv for all branches. + + 1. If you don't have a nova/ directory containing trunk/ and other branches, do so now. + 2. Go into nova/trunk and install a virtualenv. + 3. Move it up a level: mv nova/trunk/.nova-venv nova/.nova-venv + 4. Symlink the ../nova/.nova-venv directory from your branch + :: + ~/openstack/nova/my_branch$ ln -s ../.nova-venv .nova-venv + +This works with run_tests.sh and nosetests -w nova/tests/api + +MacOSX Systems +-------------- + +First, install Virtual Env, which creates an isolated "standalone" Python environment. + + :: + sudo easy_install virtualenv + + +Initial Code Setup: + :: + bzr branch lp:nova + cd nova + python tools/install_venv.py + source .nova_venv/bin/activate + pip install pep8 # submitting patch so that Nova has pep8 and pylint in PIP requirements file + pip install pylint + +If you have installed OpenSSL 1.0.0a on MacOS, which can happen when installing a MacPorts package for OpenSSL, you will see an error when running nova.tests.auth_unittest.AuthTestCase.test_209_can_generate_x509. The version that functions correctly is OpenSSL 0.9.8l 5, installed with MacOS 10.6 as a base element. + + :: + cd nova + bzr pull # get the latest stuff... + source .nova_venv/bin/activate + ./run_tests.sh + +#... do cleaning work or hack hack hack with a branched named cleaning + +bzr push lp:~launchpaduserid/nova/cleaning + + +To submit the merge/patch: + * navigate to https://code.launchpad.net/~launchpaduserid/nova/cleaning + * click on the link "Propose for merging" diff --git a/doc/source/devref/index.rst b/doc/source/devref/index.rst index e9c28305c..589609ace 100644 --- a/doc/source/devref/index.rst +++ b/doc/source/devref/index.rst @@ -23,8 +23,12 @@ In this section you will find information on Nova's lower level programming APIs Programming HowTos and Tutorials -------------------------------- +.. toctree:: + :maxdepth: 3 + + development.environment + addmethod.openstackapi -.. todo:: Add some programming howtos and tuts Programming Concepts -------------------- diff --git a/doc/source/devref/rabbit.rst b/doc/source/devref/rabbit.rst index 4468e575b..423284a55 100644 --- a/doc/source/devref/rabbit.rst +++ b/doc/source/devref/rabbit.rst @@ -32,7 +32,7 @@ Nova (Austin release) uses both direct and topic-based exchanges. The architectu Nova implements RPC (both request+response, and one-way, respectively nicknamed 'rpc.call' and 'rpc.cast') over AMQP by providing an adapter class which take cares of marshalling and unmarshalling of messages into function calls. Each Nova service (for example Compute, Volume, etc.) create two queues at the initialization time, one which accepts messages with routing keys 'NODE-TYPE.NODE-ID' (for example compute.hostname) and another, which accepts messages with routing keys as generic 'NODE-TYPE' (for example compute). The former is used specifically when Nova-API needs to redirect commands to a specific node like 'euca-terminate instance'. In this case, only the compute node whose host's hypervisor is running the virtual machine can kill the instance. The API acts as a consumer when RPC calls are request/response, otherwise is acts as publisher only. Nova RPC Mappings -================= +----------------- The figure below shows the internals of a RabbitMQ node when a single instance is deployed and shared in an OpenStack cloud. Every Nova component connects to the RabbitMQ instance and, depending on its personality (for example a compute node or a network node), may use the queue either as an Invoker (such as API or Scheduler) or a Worker (such as Compute, Volume or Network). Invokers and Workers do not actually exist in the Nova object model, but we are going to use them as an abstraction for sake of clarity. An Invoker is a component that sends messages in the queuing system via two operations: 1) rpc.call and ii) rpc.cast; a Worker is a component that receives messages from the queuing system and reply accordingly to rcp.call operations. @@ -52,7 +52,7 @@ Figure 2 shows the following internal elements: .. RPC Calls -========= +--------- The diagram below shows the message flow during an rp.call operation: @@ -67,7 +67,7 @@ The diagram below shows the message flow during an rp.call operation: .. RPC Casts -========= +--------- The diagram below the message flow during an rp.cast operation: @@ -80,7 +80,7 @@ The diagram below the message flow during an rp.cast operation: .. RabbitMQ Load -============= +------------- At any given time the load of a RabbitMQ node is function of the following parameters: @@ -107,7 +107,7 @@ The figure below shows the status of the RabbitMQ node after Nova components' bo .. RabbitMQ Gotchas -================ +---------------- Nova uses Carrot to connect to the RabbitMQ environment. Carrot is a Python library that in turn uses AMQPLib, a library that implements the standard AMQP 0.8 at the time of writing. When using Carrot, Invokers and Workers need the following parameters in order to instantiate a Connection object that connects to the RabbitMQ server (please note that most of the following material can be also found in the Carrot documentation; it has been summarized and revised here for sake of clarity): -- cgit From 8cd5381c528de6819e2d4b9c112bd3df9529e8f3 Mon Sep 17 00:00:00 2001 From: Anne Gentle Date: Tue, 23 Nov 2010 12:58:08 -0600 Subject: Adding more polish --- doc/source/devref/development.environment.rst | 69 +++++++++++++-------------- 1 file changed, 33 insertions(+), 36 deletions(-) diff --git a/doc/source/devref/development.environment.rst b/doc/source/devref/development.environment.rst index 893519807..6344c5382 100644 --- a/doc/source/devref/development.environment.rst +++ b/doc/source/devref/development.environment.rst @@ -23,7 +23,7 @@ This page describes how to setup a working Python development environment that c Linux Systems ------------- - '' At present, this section is tested for Nova on Ubuntu 10.10-64. Feel free to add notes and change according to your experiences or operating system.'' +Note: This section is tested for Nova on Ubuntu 10.10-64. Feel free to add notes and change according to your experiences or operating system. Bring down the Nova source with bzr, then: :: @@ -34,67 +34,64 @@ Bring down the Nova source with bzr, then: python tools/install_venv.py If all goes well, you should get a message something like this: +:: + Nova development environment setup is complete. - :: - Nova development environment setup is complete. - -Nova development uses virtualenv to track and manage Python dependencies while in development and testing. +Nova development uses virtualenv to track and manage Python dependencies while in development and testing. Virtual env gives you an independent Python environment. To activate the Nova virtualenv for the extent of your current shell session - you can run: - - :: - $ source .nova-venv/bin/activate + you can run:: + + $ source .nova-venv/bin/activate Or, if you prefer, you can run commands in the virtualenv on a case by case - basis by running: - :: - $ tools/with_venv.sh + basis by running:: + + $ tools/with_venv.sh Also, make test will automatically use the virtualenv. If you don't want to create a virtualenv every time you branch (which takes a while as long as we have the large Twisted project as a dependency) you can reuse a single virtualenv for all branches. - 1. If you don't have a nova/ directory containing trunk/ and other branches, do so now. - 2. Go into nova/trunk and install a virtualenv. - 3. Move it up a level: mv nova/trunk/.nova-venv nova/.nova-venv - 4. Symlink the ../nova/.nova-venv directory from your branch - :: - ~/openstack/nova/my_branch$ ln -s ../.nova-venv .nova-venv + #. If you don't have a nova/ directory containing trunk/ and other branches, do so now. + #. Go into nova/trunk and install a virtualenv. + #. Move it up a level: mv nova/trunk/.nova-venv nova/.nova-venv. + #. Symlink the ../nova/.nova-venv directory from your branch:: + + ~/openstack/nova/my_branch$ ln -s ../.nova-venv .nova-venv This works with run_tests.sh and nosetests -w nova/tests/api MacOSX Systems -------------- -First, install Virtual Env, which creates an isolated "standalone" Python environment. +First, install Virtual Env, which creates an isolated "standalone" Python environment.:: - :: - sudo easy_install virtualenv + sudo easy_install virtualenv -Initial Code Setup: - :: - bzr branch lp:nova - cd nova - python tools/install_venv.py - source .nova_venv/bin/activate - pip install pep8 # submitting patch so that Nova has pep8 and pylint in PIP requirements file - pip install pylint +Here's how to setup the code initially:: + + bzr branch lp:nova + cd nova + python tools/install_venv.py + source .nova_venv/bin/activate + pip install pep8 # submitting patch so that Nova has pep8 and pylint in PIP requirements file + pip install pylint If you have installed OpenSSL 1.0.0a on MacOS, which can happen when installing a MacPorts package for OpenSSL, you will see an error when running nova.tests.auth_unittest.AuthTestCase.test_209_can_generate_x509. The version that functions correctly is OpenSSL 0.9.8l 5, installed with MacOS 10.6 as a base element. - :: +Here's how to get the latest code:: + cd nova bzr pull # get the latest stuff... source .nova_venv/bin/activate ./run_tests.sh -#... do cleaning work or hack hack hack with a branched named cleaning - -bzr push lp:~launchpaduserid/nova/cleaning +And then you can do cleaning work or hack hack hack with a branched named cleaning:: + bzr push lp:~launchpaduserid/nova/cleaning -To submit the merge/patch: - * navigate to https://code.launchpad.net/~launchpaduserid/nova/cleaning - * click on the link "Propose for merging" +To submit the merge/patch that you hacked upon: + * Navigate to https://code.launchpad.net/~launchpaduserid/nova/cleaning. + * Click on the link "Propose for merging". -- cgit From edd7e3ed3bee6c11156569ab13b4eb5b3a1f7152 Mon Sep 17 00:00:00 2001 From: Soren Hansen Date: Tue, 23 Nov 2010 21:52:00 +0100 Subject: Address PEP8 complaints. --- nova/server.py | 3 ++- nova/twistd.py | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/nova/server.py b/nova/server.py index 4d0f6e4da..a0ee54681 100644 --- a/nova/server.py +++ b/nova/server.py @@ -42,7 +42,8 @@ flags.DEFINE_bool('daemonize', False, 'daemonize this process') # clutter. flags.DEFINE_bool('use_syslog', True, 'output to syslog when daemonizing') flags.DEFINE_string('logfile', None, 'log file to output to') -flags.DEFINE_string('logdir', None, 'directory to keep log files in (will be prepended to $logfile)') +flags.DEFINE_string('logdir', None, 'directory to keep log files in ' + '(will be prepended to $logfile)') flags.DEFINE_string('pidfile', None, 'pid file to output to') flags.DEFINE_string('working_directory', './', 'working directory...') flags.DEFINE_integer('uid', os.getuid(), 'uid under which to run') diff --git a/nova/twistd.py b/nova/twistd.py index 6c6cb955f..cb5648ce6 100644 --- a/nova/twistd.py +++ b/nova/twistd.py @@ -43,7 +43,9 @@ else: FLAGS = flags.FLAGS -flags.DEFINE_string('logdir', None, 'directory to keep log files in (will be prepended to $logfile)') +flags.DEFINE_string('logdir', None, 'directory to keep log files in ' + '(will be prepended to $logfile)') + class TwistdServerOptions(ServerOptions): def parseArgs(self, *args): -- cgit From 3df7b85265b123080387f1a844e067026410a9bc Mon Sep 17 00:00:00 2001 From: Soren Hansen Date: Tue, 23 Nov 2010 21:58:46 +0100 Subject: Address pep8 complaints. --- nova/utils.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/nova/utils.py b/nova/utils.py index 820d5bb8a..142584df8 100644 --- a/nova/utils.py +++ b/nova/utils.py @@ -174,6 +174,7 @@ def isotime(at=None): def parse_isotime(timestr): return datetime.datetime.strptime(timestr, TIME_FORMAT) + def parse_mailmap(mailmap='.mailmap'): mapping = {} if os.path.exists(mailmap): @@ -185,6 +186,7 @@ def parse_mailmap(mailmap='.mailmap'): mapping[alias] = canonical_email return mapping + def str_dict_replace(s, mapping): for s1, s2 in mapping.iteritems(): s = s.replace(s1, s2) -- cgit From 2aa1fb1c7994d07a335e31121ae0b98db0a90667 Mon Sep 17 00:00:00 2001 From: Soren Hansen Date: Tue, 23 Nov 2010 22:34:53 +0100 Subject: Add an alias for Armando. --- .mailmap | 1 + 1 file changed, 1 insertion(+) diff --git a/.mailmap b/.mailmap index ab4906067..2a6eb8d7d 100644 --- a/.mailmap +++ b/.mailmap @@ -2,6 +2,7 @@ # + -- cgit -- cgit From 3779635945df10669fdf28358e39ae8c74eace00 Mon Sep 17 00:00:00 2001 From: Soren Hansen Date: Wed, 24 Nov 2010 10:09:18 +0100 Subject: Add a placeholder in doc/build. Although bzr handles empty directories just fine, setuptools does not, so to actually ship this directory in the tarball, we need a file in it. --- doc/build/.placeholder | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 doc/build/.placeholder diff --git a/doc/build/.placeholder b/doc/build/.placeholder new file mode 100644 index 000000000..e69de29bb -- cgit From d3be61f2548758fedcaa77e74bfd779d941966a6 Mon Sep 17 00:00:00 2001 From: Soren Hansen Date: Wed, 24 Nov 2010 15:14:55 +0100 Subject: Fix typo "nova.util" -> "nova.utils" --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 8d0a8d070..ec0014478 100644 --- a/setup.py +++ b/setup.py @@ -23,7 +23,7 @@ from setuptools import setup, find_packages from setuptools.command.sdist import sdist from sphinx.setup_command import BuildDoc -from nova.util import parse_mailmap, str_dict_replace +from nova.utils import parse_mailmap, str_dict_replace class local_BuildDoc(BuildDoc): def run(self): -- cgit