bb0ea37a57
The LBaaS V2 plugin expects the driver to update the LB objects operating status from a separate process/thread. When the user requests the LB status (or just the LB object itself with GET), the operating status is retrived from the LBaaS DB, without calling the driver. To avoid adding a process to actively query and update all objects statuses, this patch creates a new LBaaSV2 plugin, to be used instead of the default one. This plugin (vmware_nsx_lbaasv2) will issue a get-statuses call to the driver, update the current statuses in the DB, and call the original plugin. Depends-on: I71a56b87144aad743795ad1295ec636b17429035 Change-Id: I3c4e75d92a1bacdb14292a8db727deb4923a85d9
119 lines
4.9 KiB
Python
119 lines
4.9 KiB
Python
# Copyright 2015 VMware, Inc.
|
|
# 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.
|
|
|
|
from oslo_log import helpers as log_helpers
|
|
|
|
from neutron_lib import exceptions as n_exc
|
|
from neutron_lib.plugins import constants as plugin_const
|
|
from neutron_lib.plugins import directory
|
|
|
|
from vmware_nsx.extensions import projectpluginmap
|
|
|
|
|
|
class LBaaSNSXObjectManagerWrapper(object):
|
|
"""Wrapper class to connect the LB api with the NSX-V/V3 implementations
|
|
|
|
This class will call the actual NSX-V LBaaS logic after translating
|
|
the LB object into a dictionary, and will also handle success/failure cases
|
|
"""
|
|
_core_plugin = None
|
|
|
|
@log_helpers.log_method_call
|
|
def __init__(self, object_type, implementor, translator, get_completor):
|
|
super(LBaaSNSXObjectManagerWrapper, self).__init__()
|
|
self.object_type = object_type
|
|
self.implementor = implementor
|
|
self.translator = translator
|
|
self.get_completor = get_completor
|
|
|
|
def _get_plugin(self, plugin_type):
|
|
return directory.get_plugin(plugin_type)
|
|
|
|
@property
|
|
def core_plugin(self):
|
|
if not self._core_plugin:
|
|
self._core_plugin = (
|
|
self._get_plugin(plugin_const.CORE))
|
|
if self._core_plugin.is_tvd_plugin():
|
|
# get the plugin that match this driver
|
|
self._core_plugin = self._core_plugin.get_plugin_by_type(
|
|
projectpluginmap.NsxPlugins.NSX_T)
|
|
return self._core_plugin
|
|
|
|
def get_completor_func(self, context, obj, delete=False):
|
|
# return a method that will be called on success/failure completion
|
|
def completor_func(success=True):
|
|
completor = self.get_completor()
|
|
if completor:
|
|
if success:
|
|
return completor.successful_completion(
|
|
context, obj, delete=delete)
|
|
else:
|
|
return completor.failed_completion(
|
|
context, obj)
|
|
|
|
return completor_func
|
|
|
|
@log_helpers.log_method_call
|
|
def create(self, context, obj, **args):
|
|
obj_dict = self.translator(obj)
|
|
completor_func = self.get_completor_func(context, obj)
|
|
return self.implementor.create(context, obj_dict, completor_func,
|
|
**args)
|
|
|
|
@log_helpers.log_method_call
|
|
def update(self, context, old_obj, new_obj, **args):
|
|
old_obj_dict = self.translator(old_obj)
|
|
new_obj_dict = self.translator(new_obj)
|
|
completor_func = self.get_completor_func(context, new_obj)
|
|
return self.implementor.update(context, old_obj_dict, new_obj_dict,
|
|
completor_func, **args)
|
|
|
|
@log_helpers.log_method_call
|
|
def delete(self, context, obj, **args):
|
|
obj_dict = self.translator(obj)
|
|
completor_func = self.get_completor_func(context, obj, delete=True)
|
|
return self.implementor.delete(context, obj_dict, completor_func,
|
|
**args)
|
|
|
|
@log_helpers.log_method_call
|
|
def refresh(self, context, obj):
|
|
# verify that this api exists (supported only for loadbalancer)
|
|
if not hasattr(self.implementor, 'refresh'):
|
|
msg = (_("LBaaS object %s does not support refresh api") %
|
|
self.object_type)
|
|
raise n_exc.BadRequest(resource='edge', msg=msg)
|
|
obj_dict = self.translator(obj)
|
|
return self.implementor.refresh(context, obj_dict)
|
|
|
|
@log_helpers.log_method_call
|
|
def stats(self, context, obj):
|
|
# verify that this api exists (supported only for loadbalancer)
|
|
if not hasattr(self.implementor, 'stats'):
|
|
msg = (_("LBaaS object %s does not support stats api") %
|
|
self.object_type)
|
|
raise n_exc.BadRequest(resource='edge', msg=msg)
|
|
obj_dict = self.translator(obj)
|
|
return self.implementor.stats(context, obj_dict)
|
|
|
|
@log_helpers.log_method_call
|
|
def get_operating_status(self, context, id, **args):
|
|
# verify that this api exists (supported only for loadbalancer)
|
|
if not hasattr(self.implementor, 'get_operating_status'):
|
|
msg = (_("LBaaS object %s does not support get_operating_status "
|
|
"api") % self.object_type)
|
|
raise n_exc.BadRequest(resource='edge', msg=msg)
|
|
return self.implementor.get_operating_status(context, id, **args)
|