From c772a1dbc7ace58d099570d41a889adf851c8ba8 Mon Sep 17 00:00:00 2001 From: Ulas Kozat Date: Mon, 28 Dec 2015 16:05:13 -0800 Subject: Added networking-sfc from openstack project with merge date Dec 23 2015 Added patch 13 for subject "add missing db migration files" Change-Id: Id51a160335a14870c1dd816a44baf9b1958b9ac6 --- networking_sfc/services/flowclassifier/plugin.py | 113 +++++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 networking_sfc/services/flowclassifier/plugin.py (limited to 'networking_sfc/services/flowclassifier/plugin.py') diff --git a/networking_sfc/services/flowclassifier/plugin.py b/networking_sfc/services/flowclassifier/plugin.py new file mode 100644 index 0000000..692e1d8 --- /dev/null +++ b/networking_sfc/services/flowclassifier/plugin.py @@ -0,0 +1,113 @@ +# Copyright 2015 Futurewei. 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 oslo_log import log as logging +from oslo_utils import excutils + +from neutron.i18n import _LE +from neutron import manager + +from networking_sfc.db import flowclassifier_db as fc_db +from networking_sfc.extensions import flowclassifier as fc_ext +from networking_sfc.services.flowclassifier.common import context as fc_ctx +from networking_sfc.services.flowclassifier.common import exceptions as fc_exc +from networking_sfc.services.flowclassifier import driver_manager as fc_driver + + +LOG = logging.getLogger(__name__) + + +class FlowClassifierPlugin(fc_db.FlowClassifierDbPlugin): + + """Implementation of the Plugin.""" + supported_extension_aliases = [fc_ext.FLOW_CLASSIFIER_EXT] + path_prefix = fc_ext.FLOW_CLASSIFIER_PREFIX + + def __init__(self): + self.driver_manager = fc_driver.FlowClassifierDriverManager() + super(FlowClassifierPlugin, self).__init__() + self.driver_manager.initialize() + + def _get_port(self, context, id): + port = super(FlowClassifierPlugin, self)._get_port(context, id) + core_plugin = manager.NeutronManager.get_plugin() + return core_plugin.get_port(context, port['id']) + + def _get_fixed_ip_from_port(self, context, logical_port, ip_prefix): + if logical_port is not None: + port = self._get_port(context, logical_port) + if ( + ip_prefix is None and + 'fixed_ips' in port and + port['fixed_ips'] + ): + for fixed_ip in port['fixed_ips']: + ip_prefix = ( + '%s/32' % fixed_ip['ip_address'] + ) + break + return ip_prefix + + @log_helpers.log_method_call + def create_flow_classifier(self, context, flow_classifier): + fc_db = super(FlowClassifierPlugin, self).create_flow_classifier( + context, flow_classifier) + fc_db_context = fc_ctx.FlowClassifierContext(self, context, fc_db) + try: + self.driver_manager.create_flow_classifier(fc_db_context) + except fc_exc.FlowClassifierDriverError as e: + LOG.exception(e) + with excutils.save_and_reraise_exception(): + LOG.error(_LE("Create flow classifier failed, " + "deleting flow_classifier '%s'"), + fc_db['id']) + self.delete_flow_classifier(context, fc_db['id']) + return fc_db + + @log_helpers.log_method_call + def update_flow_classifier(self, context, id, flow_classifier): + original_flowclassifier = self.get_flow_classifier(context, id) + updated_fc = super(FlowClassifierPlugin, self).update_flow_classifier( + context, id, flow_classifier) + fc_db_context = fc_ctx.FlowClassifierContext( + self, context, updated_fc, + original_flowclassifier=original_flowclassifier) + + try: + self.driver_manager.update_flow_classifier(fc_db_context) + except fc_exc.FlowClassifierDriverError as e: + LOG.exception(e) + with excutils.save_and_reraise_exception(): + LOG.error(_LE("Update flow classifier failed, " + "flow_classifier '%s'"), + updated_fc['id']) + + return updated_fc + + @log_helpers.log_method_call + def delete_flow_classifier(self, context, fc_id): + fc = self.get_flow_classifier(context, fc_id) + fc_context = fc_ctx.FlowClassifierContext(self, context, fc) + try: + self.driver_manager.delete_flow_classifier(fc_context) + except fc_exc.FlowClassfierDriverError as e: + LOG.exception(e) + with excutils.save_and_reraise_exception(): + LOG.error(_LE("Delete port pair group failed, " + "flow_classifier '%s'"), + fc_id) + + super(FlowClassifierPlugin, self).delete_flow_classifier( + context, fc_id) -- cgit 1.2.3-korg