vmware-nsx/vmware_nsx/services/lbaas/lb_helper.py

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)