# Copyright (c) 2016 Cisco Systems 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 gbpservice._i18n import _LE from gbpservice._i18n import _LI from gbpservice.neutron.plugins.ml2plus import driver_api from neutron.plugins.ml2.common import exceptions as ml2_exc from neutron.plugins.ml2 import managers from oslo_log import log from oslo_utils import excutils LOG = log.getLogger(__name__) class MechanismManager(managers.MechanismManager): def __init__(self): super(MechanismManager, self).__init__() def _call_on_extended_drivers(self, method_name, context, continue_on_failure=False): """Call a method on all extended mechanism drivers. :param method_name: name of the method to call :param context: context parameter to pass to each method call :param continue_on_failure: whether or not to continue to call all mechanism drivers once one has raised an exception :raises: neutron.plugins.ml2.common.MechanismDriverError if any mechanism driver call fails. """ error = False for driver in self.ordered_mech_drivers: if isinstance(driver.obj, driver_api.MechanismDriver): try: getattr(driver.obj, method_name)(context) except Exception: LOG.exception( _LE("Mechanism driver '%(name)s' failed in " "%(method)s"), {'name': driver.name, 'method': method_name} ) error = True if not continue_on_failure: break if error: raise ml2_exc.MechanismDriverError( method=method_name ) def ensure_tenant(self, plugin_context, tenant_id): for driver in self.ordered_mech_drivers: if isinstance(driver.obj, driver_api.MechanismDriver): try: driver.obj.ensure_tenant(plugin_context, tenant_id) except Exception: LOG.exception(_LE("Mechanism driver '%s' failed in " "ensure_tenant"), driver.name) raise ml2_exc.MechanismDriverError(method="ensure_tenant") def create_subnetpool_precommit(self, context): self._call_on_extended_drivers("create_subnetpool_precommit", context) def create_subnetpool_postcommit(self, context): self._call_on_extended_drivers("create_subnetpool_postcommit", context) def update_subnetpool_precommit(self, context): self._call_on_extended_drivers("update_subnetpool_precommit", context) def update_subnetpool_postcommit(self, context): self._call_on_extended_drivers("update_subnetpool_postcommit", context) def delete_subnetpool_precommit(self, context): self._call_on_extended_drivers("delete_subnetpool_precommit", context) def delete_subnetpool_postcommit(self, context): self._call_on_extended_drivers("delete_subnetpool_postcommit", context) def create_address_scope_precommit(self, context): self._call_on_extended_drivers("create_address_scope_precommit", context) def create_address_scope_postcommit(self, context): self._call_on_extended_drivers("create_address_scope_postcommit", context) def update_address_scope_precommit(self, context): self._call_on_extended_drivers("update_address_scope_precommit", context) def update_address_scope_postcommit(self, context): self._call_on_extended_drivers("update_address_scope_postcommit", context) def delete_address_scope_precommit(self, context): self._call_on_extended_drivers("delete_address_scope_precommit", context) def delete_address_scope_postcommit(self, context): self._call_on_extended_drivers("delete_address_scope_postcommit", context) class ExtensionManager(managers.ExtensionManager): def __init__(self): super(ExtensionManager, self).__init__() def _call_on_extended_drivers(self, method_name, plugin_context, data, result): """Call a method on all extended extension drivers.""" for driver in self.ordered_ext_drivers: if isinstance(driver.obj, driver_api.ExtensionDriver): try: getattr(driver.obj, method_name)(plugin_context, data, result) except Exception: with excutils.save_and_reraise_exception(): LOG.info(_LI("Extension driver '%(name)s' failed in " "%(method)s"), {'name': driver.name, 'method': method_name}) def _call_on_dict_extended_drivers(self, method_name, session, base_model, result): for driver in self.ordered_ext_drivers: if isinstance(driver.obj, driver_api.ExtensionDriver): try: getattr(driver.obj, method_name)(session, base_model, result) except Exception: LOG.error(_LE("Extension driver '%(name)s' failed in " "%(method)s"), {'name': driver.name, 'method': method_name}) raise ml2_exc.ExtensionDriverError(driver=driver.name) def process_create_subnetpool(self, plugin_context, data, result): self._call_on_extended_drivers("process_create_subnetpool", plugin_context, data, result) def process_update_subnetpool(self, plugin_context, data, result): self._call_on_extended_drivers("process_update_subnetpool", plugin_context, data, result) def extend_subnetpool_dict(self, session, base_model, result): self._call_on_dict_extended_drivers("extend_subnetpool_dict", session, base_model, result) def process_create_address_scope(self, plugin_context, data, result): self._call_on_extended_drivers("process_create_address_scope", plugin_context, data, result) def process_update_address_scope(self, plugin_context, data, result): self._call_on_extended_drivers("process_update_address_scope", plugin_context, data, result) def extend_address_scope_dict(self, session, base_model, result): self._call_on_dict_extended_drivers("extend_address_scope_dict", session, base_model, result)