Merge "ACTIVE-ACTIVE: Initial distributor driver"
This commit is contained in:
commit
30b46175b3
@ -222,6 +222,11 @@
|
|||||||
#
|
#
|
||||||
# network_driver = network_noop_driver
|
# network_driver = network_noop_driver
|
||||||
#
|
#
|
||||||
|
# Distributor driver options are distributor_noop_driver
|
||||||
|
# single_VIP_amphora
|
||||||
|
#
|
||||||
|
# distributor_driver = distributor_noop_driver
|
||||||
|
#
|
||||||
# Load balancer topology options are SINGLE, ACTIVE_STANDBY
|
# Load balancer topology options are SINGLE, ACTIVE_STANDBY
|
||||||
# loadbalancer_topology = SINGLE
|
# loadbalancer_topology = SINGLE
|
||||||
# user_data_config_drive = False
|
# user_data_config_drive = False
|
||||||
|
@ -331,6 +331,9 @@ controller_worker_opts = [
|
|||||||
cfg.StrOpt('network_driver',
|
cfg.StrOpt('network_driver',
|
||||||
default='network_noop_driver',
|
default='network_noop_driver',
|
||||||
help=_('Name of the network driver to use')),
|
help=_('Name of the network driver to use')),
|
||||||
|
cfg.StrOpt('distributor_driver',
|
||||||
|
default='distributor_noop_driver',
|
||||||
|
help=_('Name of the distributor driver to use')),
|
||||||
cfg.StrOpt('loadbalancer_topology',
|
cfg.StrOpt('loadbalancer_topology',
|
||||||
default=constants.TOPOLOGY_SINGLE,
|
default=constants.TOPOLOGY_SINGLE,
|
||||||
choices=constants.SUPPORTED_LB_TOPOLOGIES,
|
choices=constants.SUPPORTED_LB_TOPOLOGIES,
|
||||||
|
0
octavia/distributor/__init__.py
Normal file
0
octavia/distributor/__init__.py
Normal file
0
octavia/distributor/drivers/__init__.py
Normal file
0
octavia/distributor/drivers/__init__.py
Normal file
144
octavia/distributor/drivers/driver_base.py
Normal file
144
octavia/distributor/drivers/driver_base.py
Normal file
@ -0,0 +1,144 @@
|
|||||||
|
# Copyright 2016 IBM Corp.
|
||||||
|
# Copyright 2017 Rackspace, US 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
|
||||||
|
#
|
||||||
|
# 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 abc
|
||||||
|
|
||||||
|
import six
|
||||||
|
|
||||||
|
# This class describes the abstraction of a distributor interface.
|
||||||
|
# Distributor implementations may be: a noop, a single hardware device,
|
||||||
|
# a single amphora, or multiple amphora among other options.
|
||||||
|
|
||||||
|
|
||||||
|
@six.add_metaclass(abc.ABCMeta)
|
||||||
|
class DistributorDriver(object):
|
||||||
|
@abc.abstractmethod
|
||||||
|
def get_create_distributor_subflow(self):
|
||||||
|
"""Get a subflow to create a distributor
|
||||||
|
|
||||||
|
:requires: **load_balancer** (object) - Load balancer object
|
||||||
|
associated with this distributor
|
||||||
|
:provides: **distributor_id** (string) - The created distributor ID
|
||||||
|
:returns: A TaskFlow Flow that will create the distributor
|
||||||
|
|
||||||
|
This method will setup the TaskFlow Flow required to setup the
|
||||||
|
database fields and create a distributor should the driver need to
|
||||||
|
instantiate one.
|
||||||
|
The flow must store the generated distibutor ID in the flow.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abc.abstractmethod
|
||||||
|
def get_delete_distributor_subflow(self):
|
||||||
|
"""Get a subflow that deletes a distributor
|
||||||
|
|
||||||
|
:requires: **distributor_id** (string) - The ID of the distributor
|
||||||
|
to delete
|
||||||
|
:returns: A TaskFlow Flow that will delete the distributor
|
||||||
|
|
||||||
|
This method will return a TaskFlow Flow that deletes the distributor
|
||||||
|
(if applicable for the driver) and cleans up any associated database
|
||||||
|
records.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abc.abstractmethod
|
||||||
|
def get_add_vip_subflow(self):
|
||||||
|
"""Get a subflow that adds a VIP to a distributor
|
||||||
|
|
||||||
|
:requires: **distributor_id** (string) - The ID of the distributor
|
||||||
|
to create the VIP on.
|
||||||
|
:requires: **vip** (object) - The VIP object to create on the
|
||||||
|
distributor.
|
||||||
|
:requires: **vip_alg** (string) - The optional algorithm to use for
|
||||||
|
this VIP.
|
||||||
|
:requires: **vip_persistence** (string) - The persistence type for
|
||||||
|
this VIP.
|
||||||
|
:returns: A TaskFlow Flow that will add a VIP to the distributor
|
||||||
|
|
||||||
|
This method will return a TaskFlow Flow that adds a VIP to the
|
||||||
|
distributor by perfoming the necessary steps to plug the VIP and
|
||||||
|
configure the distributor to start receiving requests on this VIP.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abc.abstractmethod
|
||||||
|
def get_remove_vip_subflow(self):
|
||||||
|
"""Get a subflow that removes a VIP from a distributor
|
||||||
|
|
||||||
|
:requires: **distributor_id** (string) - The ID of the distributor
|
||||||
|
to remove the VIP from.
|
||||||
|
:requires: **vip** (object) - The VIP object to remove from the
|
||||||
|
distributor.
|
||||||
|
:returns: A TaskFlow Flow that will remove a VIP from the distributor
|
||||||
|
|
||||||
|
This method will return a TaskFlow Flow that removes the VIP from the
|
||||||
|
distributor by reconfiguring the distributor and unplugging the
|
||||||
|
associated port.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abc.abstractmethod
|
||||||
|
def get_register_amphorae_subflow(self):
|
||||||
|
"""Get a subflow that Registers amphorae with the distributor
|
||||||
|
|
||||||
|
:requires: **distributor_id** (string) - The ID of the distributor
|
||||||
|
to register the amphora on
|
||||||
|
:requires: **amphorae** (tuple) - Tuple of amphora objects to
|
||||||
|
register with the distributor.
|
||||||
|
:returns: A TaskFlow Flow that will register amphorae with the
|
||||||
|
distributor
|
||||||
|
|
||||||
|
This method will return a TaskFlow Flow that registers amphorae with
|
||||||
|
the distributor so it can begin to receive requests from the
|
||||||
|
distributor. Amphora should be ready to receive requests prior to
|
||||||
|
this call being made.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abc.abstractmethod
|
||||||
|
def get_drain_amphorae_subflow(self):
|
||||||
|
"""Get a subflow that drains connections from amphorae
|
||||||
|
|
||||||
|
:requires: **distributor_id** (string) - The ID of the distributor
|
||||||
|
to drain amphorae from
|
||||||
|
:requires: **amphorae** (tuple) - Tuple of amphora objects to drain
|
||||||
|
from distributor.
|
||||||
|
:returns: A TaskFlow Flow that will drain the listed amphorae on the
|
||||||
|
distributor
|
||||||
|
|
||||||
|
This method will return a TaskFlow Flow that configures the
|
||||||
|
distributor to stop sending new connections to the amphorae in the
|
||||||
|
list. Existing connections will continue to pass traffic to the
|
||||||
|
amphorae in this list.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abc.abstractmethod
|
||||||
|
def get_unregister_amphorae_subflow(self):
|
||||||
|
"""Get a subflow that unregisters amphorae from a distributor
|
||||||
|
|
||||||
|
:requires: **distributor_id** (string) - The ID of the distributor
|
||||||
|
to unregister amphorae from
|
||||||
|
:requires: **amphorae** (tuple) - Tuple of amphora objects to
|
||||||
|
unregister from distributor.
|
||||||
|
:returns: A TaskFlow Flow that will unregister amphorae from the
|
||||||
|
distributor
|
||||||
|
|
||||||
|
This method will return a TaskFlow Flow that unregisters amphorae
|
||||||
|
from the distributor. Amphorae in this list will immediately stop
|
||||||
|
receiving traffic.
|
||||||
|
"""
|
||||||
|
pass
|
0
octavia/distributor/drivers/noop_driver/__init__.py
Normal file
0
octavia/distributor/drivers/noop_driver/__init__.py
Normal file
124
octavia/distributor/drivers/noop_driver/driver.py
Normal file
124
octavia/distributor/drivers/noop_driver/driver.py
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
# Copyright 2016 IBM Corp.
|
||||||
|
# Copyright 2017 Rackspace, US 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
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
|
||||||
|
from taskflow.patterns import linear_flow
|
||||||
|
from taskflow import task
|
||||||
|
|
||||||
|
from oslo_log import log as logging
|
||||||
|
from oslo_utils import uuidutils
|
||||||
|
|
||||||
|
from octavia.distributor.drivers import driver_base
|
||||||
|
|
||||||
|
LOG = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
class NoopProvidesRequiresTask(task.Task):
|
||||||
|
def __init__(self, name, provides_dicts=None, requires=None):
|
||||||
|
if provides_dicts is None:
|
||||||
|
provides_dicts = {}
|
||||||
|
super(NoopProvidesRequiresTask, self).__init__(
|
||||||
|
name=name,
|
||||||
|
provides=list(provides_dicts),
|
||||||
|
requires=requires)
|
||||||
|
self.provides_dict = provides_dicts
|
||||||
|
|
||||||
|
def execute(self, *args, **kwargs):
|
||||||
|
return self.provides_dict.values()
|
||||||
|
|
||||||
|
|
||||||
|
class NoopManager(object):
|
||||||
|
def __init__(self):
|
||||||
|
super(NoopManager, self).__init__()
|
||||||
|
|
||||||
|
def get_create_distributor_subflow(self):
|
||||||
|
LOG.debug('Distributor %s create_distributor', self.__class__.__name__)
|
||||||
|
create_distributor_flow = linear_flow.Flow('create-distributor')
|
||||||
|
create_distributor_flow.add(NoopProvidesRequiresTask(
|
||||||
|
'create-distributor-task',
|
||||||
|
requires=('load_balancer'),
|
||||||
|
provides_dicts={'distributor_id': uuidutils.generate_uuid()}))
|
||||||
|
return create_distributor_flow
|
||||||
|
|
||||||
|
def get_delete_distributor_subflow(self):
|
||||||
|
LOG.debug('Distributor %s delete_distributor', self.__class__.__name__)
|
||||||
|
delete_distributor_flow = linear_flow.Flow('delete-distributor')
|
||||||
|
delete_distributor_flow.add(NoopProvidesRequiresTask(
|
||||||
|
'delete-distributor-task', requires=('distributor_id')))
|
||||||
|
return delete_distributor_flow
|
||||||
|
|
||||||
|
def get_add_vip_subflow(self):
|
||||||
|
LOG.debug('Distributor %s add_vip', self.__class__.__name__)
|
||||||
|
add_vip_flow = linear_flow.Flow('add-vip')
|
||||||
|
add_vip_flow.add(NoopProvidesRequiresTask(
|
||||||
|
'add-vip-task', requires=('distributor_id', 'vip',
|
||||||
|
'vip_alg', 'vip_persistence')))
|
||||||
|
return add_vip_flow
|
||||||
|
|
||||||
|
def get_remove_vip_subflow(self):
|
||||||
|
LOG.debug('Distributor %s remove_vip', self.__class__.__name__)
|
||||||
|
remove_vip_flow = linear_flow.Flow('remove-vip')
|
||||||
|
remove_vip_flow.add(NoopProvidesRequiresTask('remove-vip-task',
|
||||||
|
requires=('distributor_id', 'vip')))
|
||||||
|
return remove_vip_flow
|
||||||
|
|
||||||
|
def get_register_amphorae_subflow(self):
|
||||||
|
LOG.debug('Distributor %s register_amphorae', self.__class__.__name__)
|
||||||
|
register_amphorae_flow = linear_flow.Flow('register_amphorae')
|
||||||
|
register_amphorae_flow.add(NoopProvidesRequiresTask(
|
||||||
|
'register_amphorae_task', requires=('distributor_id', 'amphorae')))
|
||||||
|
return register_amphorae_flow
|
||||||
|
|
||||||
|
def get_drain_amphorae_subflow(self):
|
||||||
|
LOG.debug('Distributor %s drain_amphorae', self.__class__.__name__)
|
||||||
|
drain_amphorae_flow = linear_flow.Flow('drain-amphorae')
|
||||||
|
drain_amphorae_flow.add(NoopProvidesRequiresTask(
|
||||||
|
'drain_amphorae_task', requires=('distributor_id', 'amphorae')))
|
||||||
|
return drain_amphorae_flow
|
||||||
|
|
||||||
|
def get_unregister_amphorae_subflow(self):
|
||||||
|
LOG.debug('Distributor %s unregister_amphorae',
|
||||||
|
self.__class__.__name__)
|
||||||
|
unregister_amphorae_flow = linear_flow.Flow('unregister_amphora')
|
||||||
|
unregister_amphorae_flow.add(NoopProvidesRequiresTask(
|
||||||
|
'unregister_amphorae_task', requires=('distributor_id',
|
||||||
|
'amphorae')))
|
||||||
|
return unregister_amphorae_flow
|
||||||
|
|
||||||
|
|
||||||
|
class NoopDistributorDriver(driver_base.DistributorDriver):
|
||||||
|
def __init__(self):
|
||||||
|
super(NoopDistributorDriver, self).__init__()
|
||||||
|
self.driver = NoopManager()
|
||||||
|
|
||||||
|
def get_create_distributor_subflow(self):
|
||||||
|
return self.driver.get_create_distributor_subflow()
|
||||||
|
|
||||||
|
def get_delete_distributor_subflow(self):
|
||||||
|
return self.driver.get_delete_distributor_subflow()
|
||||||
|
|
||||||
|
def get_add_vip_flow(self):
|
||||||
|
return self.driver.get_add_vip_subflow()
|
||||||
|
|
||||||
|
def get_remove_vip_subflow(self):
|
||||||
|
return self.driver.get_remove_vip_subflow()
|
||||||
|
|
||||||
|
def get_register_amphorae_subflow(self):
|
||||||
|
return self.driver.get_register_amphorae_subflow()
|
||||||
|
|
||||||
|
def get_drain_amphorae_subflow(self):
|
||||||
|
self.driver.get_drain_amphorae_subflow()
|
||||||
|
|
||||||
|
def get_unregister_amphorae_subflow(self):
|
||||||
|
self.driver.get_unregister_amphorae_subflow()
|
@ -85,6 +85,9 @@ octavia.network.drivers =
|
|||||||
network_noop_driver = octavia.network.drivers.noop_driver.driver:NoopNetworkDriver
|
network_noop_driver = octavia.network.drivers.noop_driver.driver:NoopNetworkDriver
|
||||||
allowed_address_pairs_driver = octavia.network.drivers.neutron.allowed_address_pairs:AllowedAddressPairsDriver
|
allowed_address_pairs_driver = octavia.network.drivers.neutron.allowed_address_pairs:AllowedAddressPairsDriver
|
||||||
containers_driver = octavia.network.drivers.neutron.containers:ContainersDriver
|
containers_driver = octavia.network.drivers.neutron.containers:ContainersDriver
|
||||||
|
octavia.distributor.drivers =
|
||||||
|
distributor_noop_driver = octavia.distributor.drivers.noop_driver.driver:NoopDistributorDriver
|
||||||
|
single_VIP_amphora = octavia.distributor.drivers.single_VIP_amphora.driver:SingleVIPAmpDistributorDriver
|
||||||
octavia.cert_generator =
|
octavia.cert_generator =
|
||||||
local_cert_generator = octavia.certificates.generator.local:LocalCertGenerator
|
local_cert_generator = octavia.certificates.generator.local:LocalCertGenerator
|
||||||
anchor_cert_generator = octavia.certificates.generator.anchor:AnchorCertGenerator
|
anchor_cert_generator = octavia.certificates.generator.anchor:AnchorCertGenerator
|
||||||
|
Loading…
x
Reference in New Issue
Block a user