Merge "Add common api handlers for v1 and v2"
This commit is contained in:
commit
8d7f95ffda
@ -24,7 +24,7 @@ import time
|
|||||||
|
|
||||||
from oslo_log import log as logging
|
from oslo_log import log as logging
|
||||||
|
|
||||||
from octavia.api.v1.handlers import abstract_handler
|
from octavia.api.handlers import abstract_handler
|
||||||
from octavia.common import constants
|
from octavia.common import constants
|
||||||
from octavia.common import data_models
|
from octavia.common import data_models
|
||||||
from octavia.db import api as db_api
|
from octavia.db import api as db_api
|
@ -30,7 +30,7 @@ from oslo_config import cfg
|
|||||||
import oslo_messaging as messaging
|
import oslo_messaging as messaging
|
||||||
import six
|
import six
|
||||||
|
|
||||||
from octavia.api.v2.handlers import abstract_handler
|
from octavia.api.handlers import abstract_handler
|
||||||
from octavia.common import constants
|
from octavia.common import constants
|
||||||
from octavia.common import data_models
|
from octavia.common import data_models
|
||||||
|
|
@ -1,204 +0,0 @@
|
|||||||
# Copyright 2014 Rackspace
|
|
||||||
#
|
|
||||||
# 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.# Copyright 2014 Rackspace
|
|
||||||
#
|
|
||||||
# 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
|
|
||||||
|
|
||||||
from oslo_config import cfg
|
|
||||||
import oslo_messaging as messaging
|
|
||||||
import six
|
|
||||||
|
|
||||||
from octavia.api.v1.handlers import abstract_handler
|
|
||||||
from octavia.common import constants
|
|
||||||
from octavia.common import data_models
|
|
||||||
|
|
||||||
cfg.CONF.import_group('oslo_messaging', 'octavia.common.config')
|
|
||||||
|
|
||||||
|
|
||||||
@six.add_metaclass(abc.ABCMeta)
|
|
||||||
class BaseProducer(abstract_handler.BaseObjectHandler):
|
|
||||||
"""Base queue producer class."""
|
|
||||||
@abc.abstractproperty
|
|
||||||
def payload_class(self):
|
|
||||||
"""returns a string representing the container class."""
|
|
||||||
pass
|
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
topic = cfg.CONF.oslo_messaging.topic
|
|
||||||
self.transport = messaging.get_transport(cfg.CONF)
|
|
||||||
self.target = messaging.Target(
|
|
||||||
namespace=constants.RPC_NAMESPACE_CONTROLLER_AGENT,
|
|
||||||
topic=topic, version="1.0", fanout=False)
|
|
||||||
self.client = messaging.RPCClient(self.transport, target=self.target)
|
|
||||||
|
|
||||||
def create(self, model):
|
|
||||||
"""Sends a create message to the controller via oslo.messaging
|
|
||||||
|
|
||||||
:param model:
|
|
||||||
"""
|
|
||||||
model_id = getattr(model, 'id', None)
|
|
||||||
p_class = self.payload_class
|
|
||||||
if isinstance(model, data_models.HealthMonitor):
|
|
||||||
model_id = model.pool_id
|
|
||||||
p_class = PoolProducer.PAYLOAD_CLASS
|
|
||||||
kw = {"{0}_id".format(p_class): model_id}
|
|
||||||
method_name = "create_{0}".format(self.payload_class)
|
|
||||||
self.client.cast({}, method_name, **kw)
|
|
||||||
|
|
||||||
def update(self, data_model, updated_model):
|
|
||||||
"""sends an update message to the controller via oslo.messaging
|
|
||||||
|
|
||||||
:param updated_model:
|
|
||||||
:param data_model:
|
|
||||||
"""
|
|
||||||
model_id = getattr(data_model, 'id', None)
|
|
||||||
p_class = self.payload_class
|
|
||||||
if isinstance(data_model, data_models.HealthMonitor):
|
|
||||||
model_id = data_model.pool_id
|
|
||||||
p_class = PoolProducer.PAYLOAD_CLASS
|
|
||||||
kw = {"{0}_updates".format(self.payload_class):
|
|
||||||
updated_model.to_dict(render_unsets=False),
|
|
||||||
"{0}_id".format(p_class): model_id}
|
|
||||||
method_name = "update_{0}".format(self.payload_class)
|
|
||||||
self.client.cast({}, method_name, **kw)
|
|
||||||
|
|
||||||
def delete(self, data_model):
|
|
||||||
"""sends a delete message to the controller via oslo.messaging
|
|
||||||
|
|
||||||
:param data_model:
|
|
||||||
"""
|
|
||||||
model_id = getattr(data_model, 'id', None)
|
|
||||||
p_class = self.payload_class
|
|
||||||
if isinstance(data_model, data_models.HealthMonitor):
|
|
||||||
model_id = data_model.pool_id
|
|
||||||
p_class = PoolProducer.PAYLOAD_CLASS
|
|
||||||
kw = {"{0}_id".format(p_class): model_id}
|
|
||||||
method_name = "delete_{0}".format(self.payload_class)
|
|
||||||
self.client.cast({}, method_name, **kw)
|
|
||||||
|
|
||||||
|
|
||||||
class LoadBalancerProducer(BaseProducer):
|
|
||||||
"""Sends updates,deletes and creates to the RPC end of the queue consumer
|
|
||||||
|
|
||||||
"""
|
|
||||||
PAYLOAD_CLASS = "load_balancer"
|
|
||||||
|
|
||||||
@property
|
|
||||||
def payload_class(self):
|
|
||||||
return self.PAYLOAD_CLASS
|
|
||||||
|
|
||||||
def delete(self, data_model, cascade):
|
|
||||||
"""sends a delete message to the controller via oslo.messaging
|
|
||||||
|
|
||||||
:param data_model:
|
|
||||||
:param: cascade: delete listeners, etc. as well
|
|
||||||
"""
|
|
||||||
model_id = getattr(data_model, 'id', None)
|
|
||||||
p_class = self.payload_class
|
|
||||||
kw = {"{0}_id".format(p_class): model_id, "cascade": cascade}
|
|
||||||
method_name = "delete_{0}".format(self.payload_class)
|
|
||||||
self.client.cast({}, method_name, **kw)
|
|
||||||
|
|
||||||
|
|
||||||
class ListenerProducer(BaseProducer):
|
|
||||||
"""Sends updates,deletes and creates to the RPC end of the queue consumer
|
|
||||||
|
|
||||||
"""
|
|
||||||
PAYLOAD_CLASS = "listener"
|
|
||||||
|
|
||||||
@property
|
|
||||||
def payload_class(self):
|
|
||||||
return self.PAYLOAD_CLASS
|
|
||||||
|
|
||||||
|
|
||||||
class PoolProducer(BaseProducer):
|
|
||||||
"""Sends updates,deletes and creates to the RPC end of the queue consumer
|
|
||||||
|
|
||||||
"""
|
|
||||||
PAYLOAD_CLASS = "pool"
|
|
||||||
|
|
||||||
@property
|
|
||||||
def payload_class(self):
|
|
||||||
return self.PAYLOAD_CLASS
|
|
||||||
|
|
||||||
|
|
||||||
class HealthMonitorProducer(BaseProducer):
|
|
||||||
"""Sends updates,deletes and creates to the RPC end of the queue consumer
|
|
||||||
|
|
||||||
"""
|
|
||||||
PAYLOAD_CLASS = "health_monitor"
|
|
||||||
|
|
||||||
@property
|
|
||||||
def payload_class(self):
|
|
||||||
return self.PAYLOAD_CLASS
|
|
||||||
|
|
||||||
|
|
||||||
class MemberProducer(BaseProducer):
|
|
||||||
"""Sends updates,deletes and creates to the RPC end of the queue consumer
|
|
||||||
|
|
||||||
"""
|
|
||||||
PAYLOAD_CLASS = "member"
|
|
||||||
|
|
||||||
@property
|
|
||||||
def payload_class(self):
|
|
||||||
return self.PAYLOAD_CLASS
|
|
||||||
|
|
||||||
|
|
||||||
class L7PolicyProducer(BaseProducer):
|
|
||||||
"""Sends updates,deletes and creates to the RPC end of the queue consumer
|
|
||||||
|
|
||||||
"""
|
|
||||||
PAYLOAD_CLASS = "l7policy"
|
|
||||||
|
|
||||||
@property
|
|
||||||
def payload_class(self):
|
|
||||||
return self.PAYLOAD_CLASS
|
|
||||||
|
|
||||||
|
|
||||||
class L7RuleProducer(BaseProducer):
|
|
||||||
"""Sends updates,deletes and creates to the RPC end of the queue consumer
|
|
||||||
|
|
||||||
"""
|
|
||||||
PAYLOAD_CLASS = "l7rule"
|
|
||||||
|
|
||||||
@property
|
|
||||||
def payload_class(self):
|
|
||||||
return self.PAYLOAD_CLASS
|
|
||||||
|
|
||||||
|
|
||||||
class ProducerHandler(abstract_handler.BaseHandler):
|
|
||||||
"""Base class for all QueueProducers.
|
|
||||||
|
|
||||||
used to send messages via the Class variables load_balancer, listener,
|
|
||||||
health_monitor, and member.
|
|
||||||
"""
|
|
||||||
|
|
||||||
load_balancer = LoadBalancerProducer()
|
|
||||||
listener = ListenerProducer()
|
|
||||||
pool = PoolProducer()
|
|
||||||
health_monitor = HealthMonitorProducer()
|
|
||||||
member = MemberProducer()
|
|
||||||
l7policy = L7PolicyProducer()
|
|
||||||
l7rule = L7RuleProducer()
|
|
@ -1,67 +0,0 @@
|
|||||||
# Copyright 2014 Rackspace
|
|
||||||
#
|
|
||||||
# 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
|
|
||||||
|
|
||||||
|
|
||||||
@six.add_metaclass(abc.ABCMeta)
|
|
||||||
class BaseObjectHandler(object):
|
|
||||||
"""Base class for any object handler."""
|
|
||||||
@abc.abstractmethod
|
|
||||||
def create(self, model_id):
|
|
||||||
"""Begins process of actually creating data_model."""
|
|
||||||
pass
|
|
||||||
|
|
||||||
@abc.abstractmethod
|
|
||||||
def update(self, model_id, updated_dict):
|
|
||||||
"""Begins process of actually updating data_model."""
|
|
||||||
pass
|
|
||||||
|
|
||||||
@abc.abstractmethod
|
|
||||||
def delete(self, model_id):
|
|
||||||
"""Begins process of actually deleting data_model."""
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class NotImplementedObjectHandler(BaseObjectHandler):
|
|
||||||
"""Default Object Handler to force implementation of subclasses.
|
|
||||||
|
|
||||||
Helper class to make any subclass of AbstractHandler explode if it
|
|
||||||
is missing any of the required object managers.
|
|
||||||
"""
|
|
||||||
@staticmethod
|
|
||||||
def update(model_id, updated_dict):
|
|
||||||
raise NotImplementedError()
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def delete(model_id):
|
|
||||||
raise NotImplementedError()
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def create(model_id):
|
|
||||||
raise NotImplementedError()
|
|
||||||
|
|
||||||
|
|
||||||
@six.add_metaclass(abc.ABCMeta)
|
|
||||||
class BaseHandler(object):
|
|
||||||
"""Base class for all handlers."""
|
|
||||||
load_balancer = NotImplementedObjectHandler()
|
|
||||||
listener = NotImplementedObjectHandler()
|
|
||||||
pool = NotImplementedObjectHandler()
|
|
||||||
health_monitor = NotImplementedObjectHandler()
|
|
||||||
member = NotImplementedObjectHandler()
|
|
||||||
l7policy = NotImplementedObjectHandler()
|
|
||||||
l7rule = NotImplementedObjectHandler()
|
|
@ -1,449 +0,0 @@
|
|||||||
# Copyright 2014 Rackspace
|
|
||||||
# Copyright 2016 Blue Box, an IBM Company
|
|
||||||
#
|
|
||||||
# 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.
|
|
||||||
|
|
||||||
"""
|
|
||||||
This is just a handler that will simulate successful operations a controller
|
|
||||||
should perform. There is nothing useful about this other than database
|
|
||||||
entity status management.
|
|
||||||
"""
|
|
||||||
|
|
||||||
import threading
|
|
||||||
import time
|
|
||||||
|
|
||||||
from oslo_log import log as logging
|
|
||||||
|
|
||||||
from octavia.api.v2.handlers import abstract_handler
|
|
||||||
from octavia.common import constants
|
|
||||||
from octavia.common import data_models
|
|
||||||
from octavia.db import api as db_api
|
|
||||||
import octavia.db.repositories as repos
|
|
||||||
from octavia.i18n import _LI
|
|
||||||
|
|
||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
|
||||||
ASYNC_TIME = 1
|
|
||||||
|
|
||||||
|
|
||||||
def validate_input(expected, actual):
|
|
||||||
if not isinstance(actual, expected):
|
|
||||||
raise InvalidHandlerInputObject(obj_type=actual.__class__)
|
|
||||||
|
|
||||||
|
|
||||||
def simulate_controller(data_model, delete=False, update=False, create=False):
|
|
||||||
"""Simulates a successful controller operator for a data model.
|
|
||||||
|
|
||||||
:param data_model: data model to simulate controller operation
|
|
||||||
:param delete: deletes from the database
|
|
||||||
"""
|
|
||||||
repo = repos.Repositories()
|
|
||||||
|
|
||||||
def member_controller(member, delete=False, update=False, create=False):
|
|
||||||
time.sleep(ASYNC_TIME)
|
|
||||||
LOG.info(_LI("Simulating controller operation for member..."))
|
|
||||||
|
|
||||||
db_mem = None
|
|
||||||
if delete:
|
|
||||||
db_mem = repo.member.get(db_api.get_session(), member.id)
|
|
||||||
repo.member.delete(db_api.get_session(), id=member.id)
|
|
||||||
elif update:
|
|
||||||
db_mem = repo.member.get(db_api.get_session(), member.id)
|
|
||||||
member_dict = member.to_dict()
|
|
||||||
member_dict['operating_status'] = db_mem.operating_status
|
|
||||||
repo.member.update(db_api.get_session(), member.id, **member_dict)
|
|
||||||
elif create:
|
|
||||||
repo.member.update(db_api.get_session(), member.id,
|
|
||||||
operating_status=constants.ONLINE)
|
|
||||||
listeners = []
|
|
||||||
if db_mem:
|
|
||||||
for listener in db_mem.pool.listeners:
|
|
||||||
if listener not in listeners:
|
|
||||||
listeners.append(listener)
|
|
||||||
if member.pool.listeners:
|
|
||||||
for listener in member.pool.listeners:
|
|
||||||
if listener not in listeners:
|
|
||||||
listeners.append(listener)
|
|
||||||
if listeners:
|
|
||||||
for listener in listeners:
|
|
||||||
repo.listener.update(db_api.get_session(), listener.id,
|
|
||||||
operating_status=constants.ONLINE,
|
|
||||||
provisioning_status=constants.ACTIVE)
|
|
||||||
repo.load_balancer.update(db_api.get_session(),
|
|
||||||
member.pool.load_balancer.id,
|
|
||||||
operating_status=constants.ONLINE,
|
|
||||||
provisioning_status=constants.ACTIVE)
|
|
||||||
LOG.info(_LI("Simulated Controller Handler Thread Complete"))
|
|
||||||
|
|
||||||
def l7policy_controller(l7policy, delete=False, update=False,
|
|
||||||
create=False):
|
|
||||||
time.sleep(ASYNC_TIME)
|
|
||||||
LOG.info(_LI("Simulating controller operation for l7policy..."))
|
|
||||||
|
|
||||||
db_l7policy = None
|
|
||||||
if delete:
|
|
||||||
db_l7policy = repo.l7policy.get(db_api.get_session(), l7policy.id)
|
|
||||||
repo.l7policy.delete(db_api.get_session(), id=l7policy.id)
|
|
||||||
elif update:
|
|
||||||
db_l7policy = repo.l7policy.get(db_api.get_session(), l7policy.id)
|
|
||||||
l7policy_dict = l7policy.to_dict()
|
|
||||||
repo.l7policy.update(db_api.get_session(), l7policy.id,
|
|
||||||
**l7policy_dict)
|
|
||||||
elif create:
|
|
||||||
db_l7policy = repo.l7policy.create(db_api.get_session(),
|
|
||||||
**l7policy_dict)
|
|
||||||
if db_l7policy.listener:
|
|
||||||
repo.listener.update(db_api.get_session(), db_l7policy.listener.id,
|
|
||||||
operating_status=constants.ONLINE,
|
|
||||||
provisioning_status=constants.ACTIVE)
|
|
||||||
repo.load_balancer.update(db_api.get_session(),
|
|
||||||
db_l7policy.listener.load_balancer.id,
|
|
||||||
operating_status=constants.ONLINE,
|
|
||||||
provisioning_status=constants.ACTIVE)
|
|
||||||
LOG.info(_LI("Simulated Controller Handler Thread Complete"))
|
|
||||||
|
|
||||||
def l7rule_controller(l7rule, delete=False, update=False, create=False):
|
|
||||||
time.sleep(ASYNC_TIME)
|
|
||||||
LOG.info(_LI("Simulating controller operation for l7rule..."))
|
|
||||||
|
|
||||||
db_l7rule = None
|
|
||||||
if delete:
|
|
||||||
db_l7rule = repo.l7rule.get(db_api.get_session(), l7rule.id)
|
|
||||||
repo.l7rule.delete(db_api.get_session(), id=l7rule.id)
|
|
||||||
elif update:
|
|
||||||
db_l7rule = repo.l7rule.get(db_api.get_session(), l7rule.id)
|
|
||||||
l7rule_dict = l7rule.to_dict()
|
|
||||||
repo.l7rule.update(db_api.get_session(), l7rule.id, **l7rule_dict)
|
|
||||||
elif create:
|
|
||||||
db_l7rule = repo.l7rule.create(db_api.get_session(), **l7rule_dict)
|
|
||||||
if db_l7rule.l7policy.listener:
|
|
||||||
listener = db_l7rule.l7policy.listener
|
|
||||||
repo.listener.update(db_api.get_session(), listener.id,
|
|
||||||
operating_status=constants.ONLINE,
|
|
||||||
provisioning_status=constants.ACTIVE)
|
|
||||||
repo.load_balancer.update(db_api.get_session(),
|
|
||||||
listener.load_balancer.id,
|
|
||||||
operating_status=constants.ONLINE,
|
|
||||||
provisioning_status=constants.ACTIVE)
|
|
||||||
LOG.info(_LI("Simulated Controller Handler Thread Complete"))
|
|
||||||
|
|
||||||
def health_monitor_controller(health_monitor, delete=False, update=False,
|
|
||||||
create=False):
|
|
||||||
time.sleep(ASYNC_TIME)
|
|
||||||
LOG.info(_LI("Simulating controller operation for health monitor..."))
|
|
||||||
|
|
||||||
db_hm = None
|
|
||||||
if delete:
|
|
||||||
db_hm = repo.health_monitor.get(db_api.get_session(),
|
|
||||||
pool_id=health_monitor.pool.id)
|
|
||||||
repo.health_monitor.delete(db_api.get_session(),
|
|
||||||
pool_id=health_monitor.pool.id)
|
|
||||||
elif update:
|
|
||||||
db_hm = repo.health_monitor.get(db_api.get_session(),
|
|
||||||
health_monitor.pool_id)
|
|
||||||
hm_dict = health_monitor.to_dict()
|
|
||||||
hm_dict['operating_status'] = db_hm.operating_status()
|
|
||||||
repo.health_monitor.update(db_api.get_session(), **hm_dict)
|
|
||||||
elif create:
|
|
||||||
repo.pool.update(db_api.get_session(), health_monitor.pool_id,
|
|
||||||
operating_status=constants.ONLINE)
|
|
||||||
listeners = []
|
|
||||||
if db_hm:
|
|
||||||
for listener in db_hm.pool.listeners:
|
|
||||||
if listener not in listeners:
|
|
||||||
listeners.append(listener)
|
|
||||||
if health_monitor.pool.listeners:
|
|
||||||
for listener in health_monitor.pool.listeners:
|
|
||||||
if listener not in listeners:
|
|
||||||
listeners.append(listener)
|
|
||||||
if listeners:
|
|
||||||
for listener in listeners:
|
|
||||||
repo.test_and_set_lb_and_listener_prov_status(
|
|
||||||
db_api.get_session(),
|
|
||||||
health_monitor.pool.load_balancer.id,
|
|
||||||
listener.id, constants.ACTIVE,
|
|
||||||
constants.ACTIVE)
|
|
||||||
repo.listener.update(db_api.get_session(),
|
|
||||||
listener.id,
|
|
||||||
operating_status=constants.ONLINE,
|
|
||||||
provisioning_status=constants.ACTIVE)
|
|
||||||
repo.load_balancer.update(
|
|
||||||
db_api.get_session(),
|
|
||||||
health_monitor.pool.load_balancer.id,
|
|
||||||
operating_status=constants.ONLINE,
|
|
||||||
provisioning_status=constants.ACTIVE)
|
|
||||||
LOG.info(_LI("Simulated Controller Handler Thread Complete"))
|
|
||||||
|
|
||||||
def pool_controller(pool, delete=False, update=False, create=False):
|
|
||||||
time.sleep(ASYNC_TIME)
|
|
||||||
LOG.info(_LI("Simulating controller operation for pool..."))
|
|
||||||
|
|
||||||
db_pool = None
|
|
||||||
if delete:
|
|
||||||
db_pool = repo.pool.get(db_api.get_session(), id=pool.id)
|
|
||||||
repo.pool.delete(db_api.get_session(), id=pool.id)
|
|
||||||
elif update:
|
|
||||||
db_pool = repo.pool.get(db_api.get_session(), id=pool.id)
|
|
||||||
pool_dict = pool.to_dict()
|
|
||||||
pool_dict['operating_status'] = db_pool.operating_status
|
|
||||||
repo.update_pool_and_sp(db_api.get_session(), pool.id, pool_dict)
|
|
||||||
elif create:
|
|
||||||
repo.pool.update(db_api.get_session(), pool.id,
|
|
||||||
operating_status=constants.ONLINE)
|
|
||||||
listeners = []
|
|
||||||
if db_pool:
|
|
||||||
for listener in db_pool.listeners:
|
|
||||||
if listener not in listeners:
|
|
||||||
listeners.append(listener)
|
|
||||||
if pool.listeners:
|
|
||||||
for listener in pool.listeners:
|
|
||||||
if listener not in listeners:
|
|
||||||
listeners.append(listener)
|
|
||||||
if listeners:
|
|
||||||
for listener in listeners:
|
|
||||||
repo.listener.update(db_api.get_session(), listener.id,
|
|
||||||
operating_status=constants.ONLINE,
|
|
||||||
provisioning_status=constants.ACTIVE)
|
|
||||||
repo.load_balancer.update(db_api.get_session(),
|
|
||||||
pool.load_balancer.id,
|
|
||||||
operating_status=constants.ONLINE,
|
|
||||||
provisioning_status=constants.ACTIVE)
|
|
||||||
LOG.info(_LI("Simulated Controller Handler Thread Complete"))
|
|
||||||
|
|
||||||
def listener_controller(listener, delete=False, update=False,
|
|
||||||
create=False):
|
|
||||||
time.sleep(ASYNC_TIME)
|
|
||||||
LOG.info(_LI("Simulating controller operation for listener..."))
|
|
||||||
|
|
||||||
if delete:
|
|
||||||
repo.listener.update(db_api.get_session(), listener.id,
|
|
||||||
operating_status=constants.OFFLINE,
|
|
||||||
provisioning_status=constants.DELETED)
|
|
||||||
elif update:
|
|
||||||
db_listener = repo.listener.get(db_api.get_session(),
|
|
||||||
id=listener.id)
|
|
||||||
listener_dict = listener.to_dict()
|
|
||||||
listener_dict['operating_status'] = db_listener.operating_status
|
|
||||||
repo.listener.update(db_api.get_session(), listener.id,
|
|
||||||
**listener_dict)
|
|
||||||
elif create:
|
|
||||||
repo.listener.update(db_api.get_session(), listener.id,
|
|
||||||
operating_status=constants.ONLINE,
|
|
||||||
provisioning_status=constants.ACTIVE)
|
|
||||||
repo.load_balancer.update(db_api.get_session(),
|
|
||||||
listener.load_balancer.id,
|
|
||||||
operating_status=constants.ONLINE,
|
|
||||||
provisioning_status=constants.ACTIVE)
|
|
||||||
LOG.info(_LI("Simulated Controller Handler Thread Complete"))
|
|
||||||
|
|
||||||
def loadbalancer_controller(loadbalancer, delete=False, update=False,
|
|
||||||
create=False):
|
|
||||||
time.sleep(ASYNC_TIME)
|
|
||||||
LOG.info(_LI("Simulating controller operation for loadbalancer..."))
|
|
||||||
|
|
||||||
if delete:
|
|
||||||
repo.load_balancer.update(
|
|
||||||
db_api.get_session(), id=loadbalancer.id,
|
|
||||||
operating_status=constants.OFFLINE,
|
|
||||||
provisioning_status=constants.DELETED)
|
|
||||||
elif update:
|
|
||||||
db_lb = repo.listener.get(db_api.get_session(), id=loadbalancer.id)
|
|
||||||
lb_dict = loadbalancer.to_dict()
|
|
||||||
lb_dict['operating_status'] = db_lb.operating_status
|
|
||||||
repo.load_balancer.update(db_api.get_session(), loadbalancer.id,
|
|
||||||
**lb_dict)
|
|
||||||
elif create:
|
|
||||||
repo.load_balancer.update(db_api.get_session(), id=loadbalancer.id,
|
|
||||||
operating_status=constants.ONLINE,
|
|
||||||
provisioning_status=constants.ACTIVE)
|
|
||||||
LOG.info(_LI("Simulated Controller Handler Thread Complete"))
|
|
||||||
|
|
||||||
controller = loadbalancer_controller
|
|
||||||
if isinstance(data_model, data_models.Member):
|
|
||||||
controller = member_controller
|
|
||||||
elif isinstance(data_model, data_models.HealthMonitor):
|
|
||||||
controller = health_monitor_controller
|
|
||||||
elif isinstance(data_model, data_models.Pool):
|
|
||||||
controller = pool_controller
|
|
||||||
elif isinstance(data_model, data_models.Listener):
|
|
||||||
controller = listener_controller
|
|
||||||
|
|
||||||
thread = threading.Thread(target=controller, args=(data_model, delete,
|
|
||||||
update, create))
|
|
||||||
thread.start()
|
|
||||||
|
|
||||||
|
|
||||||
class InvalidHandlerInputObject(Exception):
|
|
||||||
message = "Invalid Input Object %(obj_type)"
|
|
||||||
|
|
||||||
def __init__(self, **kwargs):
|
|
||||||
message = self.message % kwargs
|
|
||||||
super(InvalidHandlerInputObject, self).__init__(message=message)
|
|
||||||
|
|
||||||
|
|
||||||
class LoadBalancerHandler(abstract_handler.BaseObjectHandler):
|
|
||||||
|
|
||||||
def create(self, load_balancer_id):
|
|
||||||
LOG.info(_LI("%(entity)s handling the creation of "
|
|
||||||
"load balancer %(id)s"),
|
|
||||||
{"entity": self.__class__.__name__, "id": load_balancer_id})
|
|
||||||
simulate_controller(load_balancer_id, create=True)
|
|
||||||
|
|
||||||
def update(self, old_lb, load_balancer):
|
|
||||||
validate_input(data_models.LoadBalancer, load_balancer)
|
|
||||||
LOG.info(_LI("%(entity)s handling the update of "
|
|
||||||
"load balancer %(id)s"),
|
|
||||||
{"entity": self.__class__.__name__, "id": old_lb.id})
|
|
||||||
load_balancer.id = old_lb.id
|
|
||||||
simulate_controller(load_balancer, update=True)
|
|
||||||
|
|
||||||
def delete(self, load_balancer_id):
|
|
||||||
LOG.info(_LI("%(entity)s handling the deletion of "
|
|
||||||
"load balancer %(id)s"),
|
|
||||||
{"entity": self.__class__.__name__, "id": load_balancer_id})
|
|
||||||
simulate_controller(load_balancer_id, delete=True)
|
|
||||||
|
|
||||||
|
|
||||||
class ListenerHandler(abstract_handler.BaseObjectHandler):
|
|
||||||
|
|
||||||
def create(self, listener_id):
|
|
||||||
LOG.info(_LI("%(entity)s handling the creation of listener %(id)s"),
|
|
||||||
{"entity": self.__class__.__name__, "id": listener_id})
|
|
||||||
simulate_controller(listener_id, create=True)
|
|
||||||
|
|
||||||
def update(self, old_listener, listener):
|
|
||||||
validate_input(data_models.Listener, listener)
|
|
||||||
LOG.info(_LI("%(entity)s handling the update of listener %(id)s"),
|
|
||||||
{"entity": self.__class__.__name__, "id": old_listener.id})
|
|
||||||
listener.id = old_listener.id
|
|
||||||
simulate_controller(listener, update=True)
|
|
||||||
|
|
||||||
def delete(self, listener_id):
|
|
||||||
LOG.info(_LI("%(entity)s handling the deletion of listener %(id)s"),
|
|
||||||
{"entity": self.__class__.__name__, "id": listener_id})
|
|
||||||
simulate_controller(listener_id, delete=True)
|
|
||||||
|
|
||||||
|
|
||||||
class PoolHandler(abstract_handler.BaseObjectHandler):
|
|
||||||
|
|
||||||
def create(self, pool_id):
|
|
||||||
LOG.info(_LI("%(entity)s handling the creation of pool %(id)s"),
|
|
||||||
{"entity": self.__class__.__name__, "id": pool_id})
|
|
||||||
simulate_controller(pool_id, create=True)
|
|
||||||
|
|
||||||
def update(self, old_pool, pool):
|
|
||||||
validate_input(data_models.Pool, pool)
|
|
||||||
LOG.info(_LI("%(entity)s handling the update of pool %(id)s"),
|
|
||||||
{"entity": self.__class__.__name__, "id": old_pool.id})
|
|
||||||
pool.id = old_pool.id
|
|
||||||
simulate_controller(pool, update=True)
|
|
||||||
|
|
||||||
def delete(self, pool_id):
|
|
||||||
LOG.info(_LI("%(entity)s handling the deletion of pool %(id)s"),
|
|
||||||
{"entity": self.__class__.__name__, "id": pool_id})
|
|
||||||
simulate_controller(pool_id, delete=True)
|
|
||||||
|
|
||||||
|
|
||||||
class HealthMonitorHandler(abstract_handler.BaseObjectHandler):
|
|
||||||
|
|
||||||
def create(self, pool_id):
|
|
||||||
LOG.info(_LI("%(entity)s handling the creation of health monitor "
|
|
||||||
"on pool %(id)s"),
|
|
||||||
{"entity": self.__class__.__name__, "id": pool_id})
|
|
||||||
simulate_controller(pool_id, create=True)
|
|
||||||
|
|
||||||
def update(self, old_health_monitor, health_monitor):
|
|
||||||
validate_input(data_models.HealthMonitor, health_monitor)
|
|
||||||
LOG.info(_LI("%(entity)s handling the update of health monitor "
|
|
||||||
"on pool %(id)s"),
|
|
||||||
{"entity": self.__class__.__name__,
|
|
||||||
"id": old_health_monitor.pool_id})
|
|
||||||
health_monitor.pool_id = old_health_monitor.pool_id
|
|
||||||
simulate_controller(health_monitor, update=True)
|
|
||||||
|
|
||||||
def delete(self, pool_id):
|
|
||||||
LOG.info(_LI("%(entity)s handling the deletion of health monitor "
|
|
||||||
"on pool %(id)s"),
|
|
||||||
{"entity": self.__class__.__name__, "id": pool_id})
|
|
||||||
simulate_controller(pool_id, delete=True)
|
|
||||||
|
|
||||||
|
|
||||||
class MemberHandler(abstract_handler.BaseObjectHandler):
|
|
||||||
|
|
||||||
def create(self, member_id):
|
|
||||||
LOG.info(_LI("%(entity)s handling the creation of member %(id)s"),
|
|
||||||
{"entity": self.__class__.__name__, "id": member_id})
|
|
||||||
simulate_controller(member_id, create=True)
|
|
||||||
|
|
||||||
def update(self, old_member, member):
|
|
||||||
validate_input(data_models.Member, member)
|
|
||||||
LOG.info(_LI("%(entity)s handling the update of member %(id)s"),
|
|
||||||
{"entity": self.__class__.__name__, "id": old_member.id})
|
|
||||||
member.id = old_member.id
|
|
||||||
simulate_controller(member, update=True)
|
|
||||||
|
|
||||||
def delete(self, member_id):
|
|
||||||
LOG.info(_LI("%(entity)s handling the deletion of member %(id)s"),
|
|
||||||
{"entity": self.__class__.__name__, "id": member_id})
|
|
||||||
simulate_controller(member_id, delete=True)
|
|
||||||
|
|
||||||
|
|
||||||
class L7PolicyHandler(abstract_handler.BaseObjectHandler):
|
|
||||||
|
|
||||||
def create(self, l7policy_id):
|
|
||||||
LOG.info(_LI("%(entity)s handling the creation of l7policy %(id)s"),
|
|
||||||
{"entity": self.__class__.__name__, "id": l7policy_id})
|
|
||||||
simulate_controller(l7policy_id, create=True)
|
|
||||||
|
|
||||||
def update(self, old_l7policy, l7policy):
|
|
||||||
validate_input(data_models.L7Policy, l7policy)
|
|
||||||
LOG.info(_LI("%(entity)s handling the update of l7policy %(id)s"),
|
|
||||||
{"entity": self.__class__.__name__, "id": old_l7policy.id})
|
|
||||||
l7policy.id = old_l7policy.id
|
|
||||||
simulate_controller(l7policy, update=True)
|
|
||||||
|
|
||||||
def delete(self, l7policy_id):
|
|
||||||
LOG.info(_LI("%(entity)s handling the deletion of l7policy %(id)s"),
|
|
||||||
{"entity": self.__class__.__name__, "id": l7policy_id})
|
|
||||||
simulate_controller(l7policy_id, delete=True)
|
|
||||||
|
|
||||||
|
|
||||||
class L7RuleHandler(abstract_handler.BaseObjectHandler):
|
|
||||||
|
|
||||||
def create(self, l7rule):
|
|
||||||
LOG.info(_LI("%(entity)s handling the creation of l7rule %(id)s"),
|
|
||||||
{"entity": self.__class__.__name__, "id": l7rule.id})
|
|
||||||
simulate_controller(l7rule, create=True)
|
|
||||||
|
|
||||||
def update(self, old_l7rule, l7rule):
|
|
||||||
validate_input(data_models.L7Rule, l7rule)
|
|
||||||
LOG.info(_LI("%(entity)s handling the update of l7rule %(id)s"),
|
|
||||||
{"entity": self.__class__.__name__, "id": old_l7rule.id})
|
|
||||||
l7rule.id = old_l7rule.id
|
|
||||||
simulate_controller(l7rule, update=True)
|
|
||||||
|
|
||||||
def delete(self, l7rule):
|
|
||||||
LOG.info(_LI("%(entity)s handling the deletion of l7rule %(id)s"),
|
|
||||||
{"entity": self.__class__.__name__, "id": l7rule.id})
|
|
||||||
simulate_controller(l7rule, delete=True)
|
|
||||||
|
|
||||||
|
|
||||||
class SimulatedControllerHandler(abstract_handler.BaseHandler):
|
|
||||||
"""Handler that simulates database calls of a successful controller."""
|
|
||||||
load_balancer = LoadBalancerHandler()
|
|
||||||
listener = ListenerHandler()
|
|
||||||
pool = PoolHandler()
|
|
||||||
health_monitor = HealthMonitorHandler()
|
|
||||||
member = MemberHandler()
|
|
||||||
l7policy = L7PolicyHandler()
|
|
||||||
l7rule = L7RuleHandler()
|
|
@ -66,7 +66,7 @@ class BaseAPITest(base_db_test.OctaviaDBTestBase):
|
|||||||
self.pool_repo = repositories.PoolRepository()
|
self.pool_repo = repositories.PoolRepository()
|
||||||
self.member_repo = repositories.MemberRepository()
|
self.member_repo = repositories.MemberRepository()
|
||||||
self.amphora_repo = repositories.AmphoraRepository()
|
self.amphora_repo = repositories.AmphoraRepository()
|
||||||
patcher = mock.patch('octavia.api.v1.handlers.controller_simulator.'
|
patcher = mock.patch('octavia.api.handlers.controller_simulator.'
|
||||||
'handler.SimulatedControllerHandler')
|
'handler.SimulatedControllerHandler')
|
||||||
self.handler_mock = patcher.start()
|
self.handler_mock = patcher.start()
|
||||||
self.check_quota_met_true_mock = mock.patch(
|
self.check_quota_met_true_mock = mock.patch(
|
||||||
|
@ -71,7 +71,7 @@ class BaseAPITest(base_db_test.OctaviaDBTestBase):
|
|||||||
self.pool_repo = repositories.PoolRepository()
|
self.pool_repo = repositories.PoolRepository()
|
||||||
self.member_repo = repositories.MemberRepository()
|
self.member_repo = repositories.MemberRepository()
|
||||||
self.amphora_repo = repositories.AmphoraRepository()
|
self.amphora_repo = repositories.AmphoraRepository()
|
||||||
patcher = mock.patch('octavia.api.v1.handlers.controller_simulator.'
|
patcher = mock.patch('octavia.api.handlers.controller_simulator.'
|
||||||
'handler.SimulatedControllerHandler')
|
'handler.SimulatedControllerHandler')
|
||||||
self.handler_mock = patcher.start()
|
self.handler_mock = patcher.start()
|
||||||
self.app = self._make_app()
|
self.app = self._make_app()
|
||||||
|
@ -29,7 +29,7 @@ from oslo_config import cfg
|
|||||||
from oslo_config import fixture as oslo_fixture
|
from oslo_config import fixture as oslo_fixture
|
||||||
import oslo_messaging as messaging
|
import oslo_messaging as messaging
|
||||||
|
|
||||||
from octavia.api.v1.handlers.queue import producer
|
from octavia.api.handlers.queue import producer
|
||||||
from octavia.api.v1.types import health_monitor
|
from octavia.api.v1.types import health_monitor
|
||||||
from octavia.api.v1.types import l7policy
|
from octavia.api.v1.types import l7policy
|
||||||
from octavia.api.v1.types import l7rule
|
from octavia.api.v1.types import l7rule
|
||||||
@ -49,12 +49,12 @@ class TestProducer(base.TestCase):
|
|||||||
conf = self.useFixture(oslo_fixture.Config(cfg.CONF))
|
conf = self.useFixture(oslo_fixture.Config(cfg.CONF))
|
||||||
conf.config(group="oslo_messaging", topic='OCTAVIA_PROV')
|
conf.config(group="oslo_messaging", topic='OCTAVIA_PROV')
|
||||||
mck_target = mock.patch(
|
mck_target = mock.patch(
|
||||||
'octavia.api.v1.handlers.queue.producer.messaging.Target')
|
'octavia.api.handlers.queue.producer.messaging.Target')
|
||||||
mck_transport = mock.patch(
|
mck_transport = mock.patch(
|
||||||
'octavia.api.v1.handlers.queue.producer.messaging.get_transport')
|
'octavia.api.handlers.queue.producer.messaging.get_transport')
|
||||||
self.mck_client = mock.create_autospec(messaging.RPCClient)
|
self.mck_client = mock.create_autospec(messaging.RPCClient)
|
||||||
mck_client = mock.patch(
|
mck_client = mock.patch(
|
||||||
'octavia.api.v1.handlers.queue.producer.messaging.RPCClient',
|
'octavia.api.handlers.queue.producer.messaging.RPCClient',
|
||||||
return_value=self.mck_client)
|
return_value=self.mck_client)
|
||||||
mck_target.start()
|
mck_target.start()
|
||||||
mck_transport.start()
|
mck_transport.start()
|
@ -1,236 +0,0 @@
|
|||||||
# Copyright 2014 Rackspace
|
|
||||||
#
|
|
||||||
# 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.# Copyright 2014 Rackspace
|
|
||||||
#
|
|
||||||
# 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 mock
|
|
||||||
from oslo_config import cfg
|
|
||||||
from oslo_config import fixture as oslo_fixture
|
|
||||||
import oslo_messaging as messaging
|
|
||||||
|
|
||||||
from octavia.api.v1.types import health_monitor
|
|
||||||
from octavia.api.v1.types import l7policy
|
|
||||||
from octavia.api.v1.types import l7rule
|
|
||||||
from octavia.api.v1.types import listener
|
|
||||||
from octavia.api.v1.types import load_balancer
|
|
||||||
from octavia.api.v1.types import member
|
|
||||||
from octavia.api.v1.types import pool
|
|
||||||
from octavia.api.v2.handlers.queue import producer
|
|
||||||
from octavia.common import data_models
|
|
||||||
from octavia.tests.unit import base
|
|
||||||
|
|
||||||
|
|
||||||
class TestProducer(base.TestCase):
|
|
||||||
def setUp(self):
|
|
||||||
super(TestProducer, self).setUp()
|
|
||||||
self.mck_model = mock.Mock()
|
|
||||||
self.mck_model.id = '10'
|
|
||||||
conf = self.useFixture(oslo_fixture.Config(cfg.CONF))
|
|
||||||
conf.config(group="oslo_messaging", topic='OCTAVIA_PROV')
|
|
||||||
mck_target = mock.patch(
|
|
||||||
'octavia.api.v1.handlers.queue.producer.messaging.Target')
|
|
||||||
mck_transport = mock.patch(
|
|
||||||
'octavia.api.v1.handlers.queue.producer.messaging.get_transport')
|
|
||||||
self.mck_client = mock.create_autospec(messaging.RPCClient)
|
|
||||||
mck_client = mock.patch(
|
|
||||||
'octavia.api.v1.handlers.queue.producer.messaging.RPCClient',
|
|
||||||
return_value=self.mck_client)
|
|
||||||
mck_target.start()
|
|
||||||
mck_transport.start()
|
|
||||||
mck_client.start()
|
|
||||||
self.addCleanup(mck_target.stop)
|
|
||||||
self.addCleanup(mck_transport.stop)
|
|
||||||
self.addCleanup(mck_client.stop)
|
|
||||||
|
|
||||||
def test_create_loadbalancer(self):
|
|
||||||
p = producer.LoadBalancerProducer()
|
|
||||||
p.create(self.mck_model)
|
|
||||||
kw = {'load_balancer_id': self.mck_model.id}
|
|
||||||
self.mck_client.cast.assert_called_once_with(
|
|
||||||
{}, 'create_load_balancer', **kw)
|
|
||||||
|
|
||||||
def test_delete_loadbalancer(self):
|
|
||||||
p = producer.LoadBalancerProducer()
|
|
||||||
p.delete(self.mck_model, False)
|
|
||||||
kw = {'load_balancer_id': self.mck_model.id,
|
|
||||||
'cascade': False}
|
|
||||||
self.mck_client.cast.assert_called_once_with(
|
|
||||||
{}, 'delete_load_balancer', **kw)
|
|
||||||
|
|
||||||
def test_update_loadbalancer(self):
|
|
||||||
p = producer.LoadBalancerProducer()
|
|
||||||
lb = data_models.LoadBalancer(id=10)
|
|
||||||
lb_updates = load_balancer.LoadBalancerPUT(enabled=False)
|
|
||||||
p.update(lb, lb_updates)
|
|
||||||
kw = {'load_balancer_id': lb.id,
|
|
||||||
'load_balancer_updates': lb_updates.to_dict(render_unsets=False)}
|
|
||||||
self.mck_client.cast.assert_called_once_with(
|
|
||||||
{}, 'update_load_balancer', **kw)
|
|
||||||
|
|
||||||
def test_create_listener(self):
|
|
||||||
p = producer.ListenerProducer()
|
|
||||||
p.create(self.mck_model)
|
|
||||||
kw = {'listener_id': self.mck_model.id}
|
|
||||||
self.mck_client.cast.assert_called_once_with(
|
|
||||||
{}, 'create_listener', **kw)
|
|
||||||
|
|
||||||
def test_delete_listener(self):
|
|
||||||
p = producer.ListenerProducer()
|
|
||||||
p.delete(self.mck_model)
|
|
||||||
kw = {'listener_id': self.mck_model.id}
|
|
||||||
self.mck_client.cast.assert_called_once_with(
|
|
||||||
{}, 'delete_listener', **kw)
|
|
||||||
|
|
||||||
def test_update_listener(self):
|
|
||||||
p = producer.ListenerProducer()
|
|
||||||
listener_model = data_models.LoadBalancer(id=10)
|
|
||||||
listener_updates = listener.ListenerPUT(enabled=False)
|
|
||||||
p.update(listener_model, listener_updates)
|
|
||||||
kw = {'listener_id': listener_model.id,
|
|
||||||
'listener_updates': listener_updates.to_dict(
|
|
||||||
render_unsets=False)}
|
|
||||||
self.mck_client.cast.assert_called_once_with(
|
|
||||||
{}, 'update_listener', **kw)
|
|
||||||
|
|
||||||
def test_create_pool(self):
|
|
||||||
p = producer.PoolProducer()
|
|
||||||
p.create(self.mck_model)
|
|
||||||
kw = {'pool_id': self.mck_model.id}
|
|
||||||
self.mck_client.cast.assert_called_once_with(
|
|
||||||
{}, 'create_pool', **kw)
|
|
||||||
|
|
||||||
def test_delete_pool(self):
|
|
||||||
p = producer.PoolProducer()
|
|
||||||
p.delete(self.mck_model)
|
|
||||||
kw = {'pool_id': self.mck_model.id}
|
|
||||||
self.mck_client.cast.assert_called_once_with(
|
|
||||||
{}, 'delete_pool', **kw)
|
|
||||||
|
|
||||||
def test_update_pool(self):
|
|
||||||
p = producer.PoolProducer()
|
|
||||||
pool_model = data_models.Pool(id=10)
|
|
||||||
pool_updates = pool.PoolPUT(enabled=False)
|
|
||||||
p.update(pool_model, pool_updates)
|
|
||||||
kw = {'pool_id': pool_model.id,
|
|
||||||
'pool_updates': pool_updates.to_dict(render_unsets=False)}
|
|
||||||
self.mck_client.cast.assert_called_once_with(
|
|
||||||
{}, 'update_pool', **kw)
|
|
||||||
|
|
||||||
def test_create_healthmonitor(self):
|
|
||||||
p = producer.HealthMonitorProducer()
|
|
||||||
p.create(self.mck_model)
|
|
||||||
kw = {'health_monitor_id': self.mck_model.id}
|
|
||||||
self.mck_client.cast.assert_called_once_with(
|
|
||||||
{}, 'create_health_monitor', **kw)
|
|
||||||
|
|
||||||
def test_delete_healthmonitor(self):
|
|
||||||
p = producer.HealthMonitorProducer()
|
|
||||||
p.delete(self.mck_model)
|
|
||||||
kw = {'health_monitor_id': self.mck_model.id}
|
|
||||||
self.mck_client.cast.assert_called_once_with(
|
|
||||||
{}, 'delete_health_monitor', **kw)
|
|
||||||
|
|
||||||
def test_update_healthmonitor(self):
|
|
||||||
p = producer.HealthMonitorProducer()
|
|
||||||
hm = data_models.HealthMonitor(pool_id=10)
|
|
||||||
hm_updates = health_monitor.HealthMonitorPUT(enabled=False)
|
|
||||||
p.update(hm, hm_updates)
|
|
||||||
kw = {'pool_id': hm.pool_id,
|
|
||||||
'health_monitor_updates': hm_updates.to_dict(
|
|
||||||
render_unsets=False)}
|
|
||||||
self.mck_client.cast.assert_called_once_with(
|
|
||||||
{}, 'update_health_monitor', **kw)
|
|
||||||
|
|
||||||
def test_create_member(self):
|
|
||||||
p = producer.MemberProducer()
|
|
||||||
p.create(self.mck_model)
|
|
||||||
kw = {'member_id': self.mck_model.id}
|
|
||||||
self.mck_client.cast.assert_called_once_with(
|
|
||||||
{}, 'create_member', **kw)
|
|
||||||
|
|
||||||
def test_delete_member(self):
|
|
||||||
p = producer.MemberProducer()
|
|
||||||
p.delete(self.mck_model)
|
|
||||||
kw = {'member_id': self.mck_model.id}
|
|
||||||
self.mck_client.cast.assert_called_once_with(
|
|
||||||
{}, 'delete_member', **kw)
|
|
||||||
|
|
||||||
def test_update_member(self):
|
|
||||||
p = producer.MemberProducer()
|
|
||||||
member_model = data_models.Member(id=10)
|
|
||||||
member_updates = member.MemberPUT(enabled=False)
|
|
||||||
p.update(member_model, member_updates)
|
|
||||||
kw = {'member_id': member_model.id,
|
|
||||||
'member_updates': member_updates.to_dict(render_unsets=False)}
|
|
||||||
self.mck_client.cast.assert_called_once_with(
|
|
||||||
{}, 'update_member', **kw)
|
|
||||||
|
|
||||||
def test_create_l7policy(self):
|
|
||||||
p = producer.L7PolicyProducer()
|
|
||||||
p.create(self.mck_model)
|
|
||||||
kw = {'l7policy_id': self.mck_model.id}
|
|
||||||
self.mck_client.cast.assert_called_once_with(
|
|
||||||
{}, 'create_l7policy', **kw)
|
|
||||||
|
|
||||||
def test_delete_l7policy(self):
|
|
||||||
p = producer.L7PolicyProducer()
|
|
||||||
p.delete(self.mck_model)
|
|
||||||
kw = {'l7policy_id': self.mck_model.id}
|
|
||||||
self.mck_client.cast.assert_called_once_with(
|
|
||||||
{}, 'delete_l7policy', **kw)
|
|
||||||
|
|
||||||
def test_update_l7policy(self):
|
|
||||||
p = producer.L7PolicyProducer()
|
|
||||||
l7policy_model = data_models.L7Policy(id=10)
|
|
||||||
l7policy_updates = l7policy.L7PolicyPUT(enabled=False)
|
|
||||||
p.update(l7policy_model, l7policy_updates)
|
|
||||||
kw = {'l7policy_id': l7policy_model.id,
|
|
||||||
'l7policy_updates': l7policy_updates.to_dict(
|
|
||||||
render_unsets=False)}
|
|
||||||
self.mck_client.cast.assert_called_once_with(
|
|
||||||
{}, 'update_l7policy', **kw)
|
|
||||||
|
|
||||||
def test_create_l7rule(self):
|
|
||||||
p = producer.L7RuleProducer()
|
|
||||||
p.create(self.mck_model)
|
|
||||||
kw = {'l7rule_id': self.mck_model.id}
|
|
||||||
self.mck_client.cast.assert_called_once_with(
|
|
||||||
{}, 'create_l7rule', **kw)
|
|
||||||
|
|
||||||
def test_delete_l7rule(self):
|
|
||||||
p = producer.L7RuleProducer()
|
|
||||||
p.delete(self.mck_model)
|
|
||||||
kw = {'l7rule_id': self.mck_model.id}
|
|
||||||
self.mck_client.cast.assert_called_once_with(
|
|
||||||
{}, 'delete_l7rule', **kw)
|
|
||||||
|
|
||||||
def test_update_l7rule(self):
|
|
||||||
p = producer.L7RuleProducer()
|
|
||||||
l7rule_model = data_models.L7Rule(id=10)
|
|
||||||
l7rule_updates = l7rule.L7RulePUT(enabled=False)
|
|
||||||
p.update(l7rule_model, l7rule_updates)
|
|
||||||
kw = {'l7rule_id': l7rule_model.id,
|
|
||||||
'l7rule_updates': l7rule_updates.to_dict(render_unsets=False)}
|
|
||||||
self.mck_client.cast.assert_called_once_with(
|
|
||||||
{}, 'update_l7rule', **kw)
|
|
@ -58,8 +58,8 @@ console_scripts =
|
|||||||
amphora-agent = octavia.cmd.agent:main
|
amphora-agent = octavia.cmd.agent:main
|
||||||
haproxy-vrrp-check = octavia.cmd.haproxy_vrrp_check:main
|
haproxy-vrrp-check = octavia.cmd.haproxy_vrrp_check:main
|
||||||
octavia.api.handlers =
|
octavia.api.handlers =
|
||||||
simulated_handler = octavia.api.v1.handlers.controller_simulator.handler:SimulatedControllerHandler
|
simulated_handler = octavia.api.handlers.controller_simulator.handler:SimulatedControllerHandler
|
||||||
queue_producer = octavia.api.v1.handlers.queue.producer:ProducerHandler
|
queue_producer = octavia.api.handlers.queue.producer:ProducerHandler
|
||||||
octavia.amphora.drivers =
|
octavia.amphora.drivers =
|
||||||
amphora_noop_driver = octavia.amphorae.drivers.noop_driver.driver:NoopAmphoraLoadBalancerDriver
|
amphora_noop_driver = octavia.amphorae.drivers.noop_driver.driver:NoopAmphoraLoadBalancerDriver
|
||||||
amphora_haproxy_rest_driver = octavia.amphorae.drivers.haproxy.rest_api_driver:HaproxyAmphoraLoadBalancerDriver
|
amphora_haproxy_rest_driver = octavia.amphorae.drivers.haproxy.rest_api_driver:HaproxyAmphoraLoadBalancerDriver
|
||||||
|
Loading…
Reference in New Issue
Block a user