Octavia Controller Worker specification

Initial draft of a spec for the Controller Worker, formerly known as
deploy-worker.

Change-Id: If17bac321275b6cc1137574f37837dfe220606d8
This commit is contained in:
Michael Johnson 2015-01-24 02:00:04 +00:00
parent 9ff7290078
commit e19428eea4
4 changed files with 307 additions and 36 deletions

View File

@ -0,0 +1,270 @@
..
This work is licensed under a Creative Commons Attribution 3.0 Unported
License.
http://creativecommons.org/licenses/by/3.0/legalcode
==================================
Controller Worker (deploy-worker)
==================================
Launchpad blueprint:
https://blueprints.launchpad.net/octavia/+spec/controller-worker
Octavia is an operator-grade reference implementation for Load Balancing as a
Service (LBaaS) for OpenStack. The component of Octavia that does the load
balancing is known as Amphora.
The component of Octavia that provides command and control of the Amphora is
the Octavia controller.
Problem description
===================
Components of the Octavia controller require a shared library that provides
the orchestration of create/update/delete actions for Octavia objects such as
load balancers and listeners.
It is expected that this library will be used by the Queue Consumer to service
API requests, by the Housekeeping Manager to manage the spare Amphora pool,
and by the Health Manager to fail over failed objects.
Proposed change
===============
The Controller Worker will be implemented as a class that provides methods to
facilitate the create/update/delete actions. This class will be responsible
for managing the number of simultaneous operations being executed by
coordinating through the Octavia database.
The Controller Worker will provide a base class that sets up and initilizes
the TaskFlow engines required to complete the action. Users of the library
will then call the appropriate method for the action. These methods setup
and launch the appropriate flow. Each flow will be contained in a seperate
class for code reuse and supportability.
The Controller Worker library will provide the following methods:
.. code:: python
def create_amphora(self):
"""
Creates an Amphora.
:returns: amphora_id
"""
raise NotImplementedError
def delete_amphora(self, amphora_id):
"""
Deletes an existing Amphora.
:returns: None
:raises AmphoraNotFound: The referenced Amphora was not found
"""
raise NotImplementedError
def create_load_balancer(self, load_balancer_id):
"""
Creates a load balancer by allocating Amphorae.
:returns: None
:raises NoSuitableAmphora: Unable to allocate an Amphora.
"""
raise NotImplementedError
def update_load_balancer(self, load_balancer_updates, load_balancer_id):
"""
Updates a load balancer.
:returns: None
:raises LBNotFound: The referenced load balancer was not found
"""
raise NotImplementedError
def delete_load_balancer(self, load_balancer_id):
"""
Deletes a load balancer by de-allocating Amphorae.
:returns: None
:raises LBNotFound: The referenced load balancer was not found
"""
raise NotImplementedError
def create_listener(self, listener_id):
"""
Creates a listener.
:returns: None
:raises NoSuitableLB: Unable to find the load balancer
"""
raise NotImplementedError
def update_listener(self, listener_updates, listener_id):
"""
Updates a listener.
:returns: None
:raises ListenerNotFound: The referenced listener was not found
"""
raise NotImplementedError
def delete_listener(self, listener_id):
"""
Deletes a listener.
:returns: None
:raises ListenerNotFound: The referenced listener was not found
"""
raise NotImplementedError
def create_pool(self, pool_id):
"""
Creates a node pool.
:returns: None
:raises NoSuitableLB: Unable to find the load balancer
"""
raise NotImplementedError
def update_pool(self, pool_updates, pool_id):
"""
Updates a node pool.
:returns: None
:raises PoolNotFound: The referenced pool was not found
"""
raise NotImplementedError
def delete_pool(self, pool_id):
"""
Deletes a node pool.
:returns: None
:raises PoolNotFound: The referenced pool was not found
"""
raise NotImplementedError
def create_health_monitor(self, health_monitor_id):
"""
Creates a health monitor.
:returns: None
:raises NoSuitablePool: Unable to find the node pool
"""
raise NotImplementedError
def update_health_monitor(self, health_monitor_updates, health_monitor_id):
"""
Updates a health monitor.
:returns: None
:raises HMNotFound: The referenced health monitor was not found
"""
raise NotImplementedError
def delete_health_monitor(self, health_monitor_id):
"""
Deletes a health monitor.
:returns: None
:raises HMNotFound: The referenced health monitor was not found
"""
raise NotImplementedError
def create_member(self, member_id):
"""
Creates a pool member.
:returns: None
:raises NoSuitablePool: Unable to find the node pool
"""
raise NotImplementedError
def update_member(self, member_updates, member_id):
"""
Updates a pool member.
:returns: None
:raises MemberNotFound: The referenced member was not found
"""
raise NotImplementedError
def delete_member(self, member_id):
"""
Deletes a pool member.
:returns: None
:raises MemberNotFound: The referenced member was not found
"""
raise NotImplementedError
Alternatives
------------
This code could be included in the Queue Consumer component of the controller.
However this would not allow the library to be shared with other components of
the controller, such as the Health Manager
Data model impact
-----------------
REST API impact
---------------
None
Security impact
---------------
Notifications impact
--------------------
Other end user impact
---------------------
Performance Impact
------------------
Other deployer impact
---------------------
Developer impact
----------------
Implementation
==============
Assignee(s)
-----------
Michael Johnson <johnsom>
Work Items
----------
Dependencies
============
https://blueprints.launchpad.net/octavia/+spec/amphora-driver-interface
https://blueprints.launchpad.net/octavia/+spec/neutron-network-driver
https://blueprints.launchpad.net/octavia/+spec/nova-compute-driver
Testing
=======
Unit tests
Documentation Impact
====================
None
References
==========
https://blueprints.launchpad.net/octavia/+spec/health-manager
https://blueprints.launchpad.net/octavia/+spec/housekeeping-manager
https://blueprints.launchpad.net/octavia/+spec/queue-consumer

View File

@ -27,7 +27,7 @@ digraph G {
queue [label="Queue\nConsumer", fontcolor=white, color=forestgreen, style=filled]; queue [label="Queue\nConsumer", fontcolor=white, color=forestgreen, style=filled];
health [label="Health\nManager", fontcolor=white, color=forestgreen, style=filled]; health [label="Health\nManager", fontcolor=white, color=forestgreen, style=filled];
house [label="Housekeeping\n(Spares/Cleanup)\nManager", fontcolor=white, color=forestgreen, style=filled]; house [label="Housekeeping\n(Spares/Cleanup)\nManager", fontcolor=white, color=forestgreen, style=filled];
deploy [label="Deploy\nWorker", fontcolor=white, color=forestgreen, style=filled, shape=hexagon]; ctrl [label="Controller\nWorker", fontcolor=white, color=forestgreen, style=filled, shape=hexagon];
proxy [label="Services\nProxy", fontcolor=white, color=forestgreen, style=filled]; proxy [label="Services\nProxy", fontcolor=white, color=forestgreen, style=filled];
@ -61,20 +61,20 @@ digraph G {
amp [label="Amphorae", fontcolor=black, color=coral2, style=filled]; amp [label="Amphorae", fontcolor=black, color=coral2, style=filled];
deploy -> queue [dir="both"]; ctrl -> queue [dir="both"];
db -> api -> oslo -> queue [dir="both"]; db -> api -> oslo -> queue [dir="both"];
db -> deploy [dir="both"]; db -> ctrl [dir="both"];
db -> queue [dir="both"]; db -> queue [dir="both"];
db -> health [dir="both"]; db -> health [dir="both"];
db -> house [dir="both"]; db -> house [dir="both"];
db -> msg [dir="both"]; db -> msg [dir="both"];
nova -> deploy [dir="both"]; nova -> ctrl [dir="both"];
nova -> house [dir="both"]; nova -> house [dir="both"];
neutron -> deploy [dir="both"]; neutron -> ctrl [dir="both"];
neutron -> house [dir="both"]; neutron -> house [dir="both"];
proxy -> swift [dir="both"]; proxy -> swift [dir="both"];
proxy -> amp [dir="both"]; proxy -> amp [dir="both"];
cert -> deploy [dir="both"]; cert -> ctrl [dir="both"];
cert -> bbq [dir="both"]; cert -> bbq [dir="both"];
stats -> ceilo [dir="both"]; stats -> ceilo [dir="both"];
msg -> amp [ltail=cluster1]; msg -> amp [ltail=cluster1];

View File

@ -50,7 +50,7 @@ The Octavia controller will consist of the following components:
* Queue Consumer * Queue Consumer
* Certificate Library * Certificate Library
* Compute Driver * Compute Driver
* Deploy Worker * Controller Worker
* Health Manager * Health Manager
* Housekeeping Manager * Housekeeping Manager
* Network Driver * Network Driver
@ -85,7 +85,7 @@ The Queue Consumer is event driven and tasked with servicing requests from the
API components via an Oslo messaging. It is also the primary lifecycle API components via an Oslo messaging. It is also the primary lifecycle
management component for Amphora. management component for Amphora.
To service requests the Queue Consumer will spawn a Deploy Worker process. To service requests the Queue Consumer will spawn a Controller Worker process.
Spawning a separate process makes sure that the Queue Consumer can continue to Spawning a separate process makes sure that the Queue Consumer can continue to
service API requests while the longer running deployment process is service API requests while the longer running deployment process is
progressing. progressing.
@ -103,31 +103,31 @@ complete the requested action.
The Compute Driver abstracts the implementation of instantiating the virtual The Compute Driver abstracts the implementation of instantiating the virtual
machine, container, appliance, or device that the Amphora will run in. machine, container, appliance, or device that the Amphora will run in.
**Deploy Worker** **Controller Worker**
The Deploy Worker is spawned from the Queue Consumer or the Health The Controller Worker is spawned from the Queue Consumer or the Health
Manager. It interfaces with the compute driver (in some deployment scenarios), Manager. It interfaces with the compute driver (in some deployment scenarios),
network driver, and Amphora driver to activate Amphora instances, network driver, and Amphora driver to activate Amphora instances,
load balancers, and listeners. load balancers, and listeners.
When a request for a new instance or failover is received the Deploy Worker When a request for a new instance or failover is received the Controller Worker
will have responsibility for connecting the appropriate networking ports to the will have responsibility for connecting the appropriate networking ports to the
Amphora via the network driver and triggering a configuration push via the Amphora via the network driver and triggering a configuration push via the
Amphora driver. This will include validating that the targeted Amphora Amphora driver. This will include validating that the targeted Amphora
has the required networks plumbed to the Amphora. has the required networks plumbed to the Amphora.
The Amphora configured by the Deploy Worker may be an existing Amphora The Amphora configured by the Controller Worker may be an existing Amphora
instance, a new Amphora from the spares pool, or a newly created Amphora. instance, a new Amphora from the spares pool, or a newly created Amphora.
This determination will be made based on the apolocation requirements of This determination will be made based on the apolocation requirements of
the load balancer, the load balancer count on the existing Amphora, and the load balancer, the load balancer count on the existing Amphora, and
the availability of ready spare Amphora in the spares pool. the availability of ready spare Amphora in the spares pool.
The Deploy Worker will be responsible for passing in the required metadata The Controller Worker will be responsible for passing in the required metadata
via config drive when deploying an Amphora. This metadata will include: via config drive when deploying an Amphora. This metadata will include:
a list of controller IP addresses, controller certificate authority a list of controller IP addresses, controller certificate authority
certificate, and the Amphora certificate and key file. certificate, and the Amphora certificate and key file.
The main flow of the Deploy Worker is described in the The main flow of the Controller Worker is described in the
amphora-lifecycle-management specification as the Activate Amphora sequence. amphora-lifecycle-management specification as the Activate Amphora sequence.
**Certificate Library** **Certificate Library**

View File

@ -10,16 +10,16 @@ Queue Consumer
https://blueprints.launchpad.net/octavia/+spec/queue-consumer https://blueprints.launchpad.net/octavia/+spec/queue-consumer
This blueprint describes how Oslo messages are consumed, processed and This blueprint describes how Oslo messages are consumed, processed and
delegated from the API-controller queue to the deploy worker component of delegated from the API-controller queue to the controller worker component of
Octavia. The component that is responsible for these activities is called the Octavia. The component that is responsible for these activities is called the
Queue Consumer. Queue Consumer.
Problem description Problem description
=================== ===================
Oslo messages need to be consumed by the controller and delegated to the proper Oslo messages need to be consumed by the controller and delegated to the proper
deploy worker. Something needs to interface with the API-controller queue and controller worker. Something needs to interface with the API-controller queue
spawn the deploy workers. That "something" is what we are calling the Queue and spawn the controller workers. That "something" is what we are calling the
Consumer. Queue Consumer.
Proposed change Proposed change
=============== ===============
@ -27,15 +27,15 @@ The major component of the Queue Consumer will be be a class that acts as a
consumer to Oslo messages. It will be responsible for configuring and starting consumer to Oslo messages. It will be responsible for configuring and starting
a server that is then able to receive messages. There will be a one-to-one a server that is then able to receive messages. There will be a one-to-one
mapping between API methods and consumer methods (see code snippet below). mapping between API methods and consumer methods (see code snippet below).
Corresponding deploy workers will be spawned depending on which consumer Corresponding controller workers will be spawned depending on which consumer
methods are called. methods are called.
The threading will be handled by Oslo messaging using the 'eventlet' executor. The threading will be handled by Oslo messaging using the 'eventlet' executor.
Using the 'eventlet' executor will allow for message throttling and removes Using the 'eventlet' executor will allow for message throttling and removes
the need for the deploy workers to manage threads. The benefit of using the the need for the controller workers to manage threads. The benefit of using the
'eventlet' executor is that the Queue Consumer will not have to spawn threads 'eventlet' executor is that the Queue Consumer will not have to spawn threads
at all, since every message received will be in its own thread already. This at all, since every message received will be in its own thread already. This
means that the Queue Consumer doesn't spawn a deploy worker, rather it just means that the Queue Consumer doesn't spawn a controller worker, rather it just
starts the execution of the deploy code. starts the execution of the deploy code.
An 'oslo_messaging' configuration section will need to be added to octavia.conf An 'oslo_messaging' configuration section will need to be added to octavia.conf
@ -43,9 +43,10 @@ for Oslo messaging options. For the Queue Consumer, the 'rpc_thread_pool_size'
config option will need to be added. This option will determine how many config option will need to be added. This option will determine how many
consumer threads will be able to read from the queue at any given time (per consumer threads will be able to read from the queue at any given time (per
consumer instance) and serve as a throttling mechanism for message consumption. consumer instance) and serve as a throttling mechanism for message consumption.
For example, if 'rpc_thread_pool_size' is set to 1 thread then only one deploy For example, if 'rpc_thread_pool_size' is set to 1 thread then only one
worker will be able to conduct work. When that deploy worker completes its controller worker will be able to conduct work. When that controller worker
task then a new message can be consumed and a new deploy worker flow started. completes its task then a new message can be consumed and a new controller
worker flow started.
Below are the planned interface methods for the queue consumer. The Queue Below are the planned interface methods for the queue consumer. The Queue
Consumer will be listening on the **OCTAVIA_PROV** (short for octavia Consumer will be listening on the **OCTAVIA_PROV** (short for octavia
@ -55,12 +56,12 @@ particular interface method. The *context* parameter is a dictionary and is
reserved for metadata. For example, the Neutron LBaaS agent leverages this reserved for metadata. For example, the Neutron LBaaS agent leverages this
parameter to send additional request information. Additionally, update methods parameter to send additional request information. Additionally, update methods
include a *\*_updates* parameter than includes the changes that need to be include a *\*_updates* parameter than includes the changes that need to be
made. Thus, the deploy workers responsible for the update actions will need to made. Thus, the controller workers responsible for the update actions will
query the database to retrieve the old state and combine it with the updates to need to query the database to retrieve the old state and combine it with the
provision appropriately. If a rollback or exception occur, then the deploy updates to provision appropriately. If a rollback or exception occur, then the
worker will only need to update the provisioning status to **ERROR** and will controller worker will only need to update the provisioning status to **ERROR**
not need to worry about making database changes to attributes of the object and will not need to worry about making database changes to attributes of the
being updated. object being updated.
.. code:: python .. code:: python
@ -116,16 +117,16 @@ Alternatives
There are a variety of ways to consume from Oslo messaging. For example, There are a variety of ways to consume from Oslo messaging. For example,
instead of having a single consumer on the controller we could have multiple instead of having a single consumer on the controller we could have multiple
consumers (i.e. one for CREATE messages, one for UPDATE messages, etc.). consumers (i.e. one for CREATE messages, one for UPDATE messages, etc.).
However, since we merely need something to pass messages off to deploy workers However, since we merely need something to pass messages off to controller
other options are overkill. workers other options are overkill.
Data model impact Data model impact
----------------- -----------------
While there is no direct data model impact it is worth noting that the API While there is no direct data model impact it is worth noting that the API
will not be persisting updates to the database. Rather, delta updates will pass will not be persisting updates to the database. Rather, delta updates will pass
from the user all the way to the deploy worker. Thus, when the deploy worker from the user all the way to the controller worker. Thus, when the controller
successfully completes the prescribed action, only then will it persist the worker successfully completes the prescribed action, only then will it persist
updates to the database. No API changes are necessary for create and update the updates to the database. No API changes are necessary for create and update
actions. actions.
REST API impact REST API impact
@ -173,7 +174,7 @@ Work Items
Dependencies Dependencies
============ ============
https://blueprints.launchpad.net/octavia/+spec/deploy-worker https://blueprints.launchpad.net/octavia/+spec/controller-worker
Testing Testing
======= =======