
This has the service driver part of the vendor specific VPNaaS plugin. This version DOES NOT rely on the Service Type Framework code, which is presently under review (client 53602, server 41827) and on hold due to discussion over flavors. As a result, this changeset has modifications so that the service driver is not hard-coded in the VPN plugin. The device driver will be under a separate review and has the REST client that talks to the Cisco CSR (running out-of-band). Note: See review 74156 for more details on device driver portion of this blueprint. Change-Id: I39b1475c992b594256f5a28be0caa1ee9398050e Partially-implements: blueprint vpnaas-cisco-driver
92 lines
3.0 KiB
Python
92 lines
3.0 KiB
Python
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
|
#
|
|
# Copyright 2013, Nachi Ueno, NTT I3, 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.
|
|
|
|
import abc
|
|
|
|
import six
|
|
|
|
from neutron import manager
|
|
from neutron.openstack.common import log as logging
|
|
from neutron.openstack.common.rpc import proxy
|
|
from neutron.plugins.common import constants
|
|
|
|
LOG = logging.getLogger(__name__)
|
|
|
|
|
|
@six.add_metaclass(abc.ABCMeta)
|
|
class VpnDriver(object):
|
|
|
|
def __init__(self, service_plugin):
|
|
self.service_plugin = service_plugin
|
|
|
|
@property
|
|
def service_type(self):
|
|
pass
|
|
|
|
@abc.abstractmethod
|
|
def create_vpnservice(self, context, vpnservice):
|
|
pass
|
|
|
|
@abc.abstractmethod
|
|
def update_vpnservice(
|
|
self, context, old_vpnservice, vpnservice):
|
|
pass
|
|
|
|
@abc.abstractmethod
|
|
def delete_vpnservice(self, context, vpnservice):
|
|
pass
|
|
|
|
|
|
class BaseIPsecVpnAgentApi(proxy.RpcProxy):
|
|
"""Base class for IPSec API to agent."""
|
|
|
|
def __init__(self, to_agent_topic, topic, default_version):
|
|
self.to_agent_topic = to_agent_topic
|
|
super(BaseIPsecVpnAgentApi, self).__init__(topic, default_version)
|
|
|
|
def _agent_notification(self, context, method, router_id,
|
|
version=None, **kwargs):
|
|
"""Notify update for the agent.
|
|
|
|
This method will find where is the router, and
|
|
dispatch notification for the agent.
|
|
"""
|
|
admin_context = context.is_admin and context or context.elevated()
|
|
plugin = manager.NeutronManager.get_service_plugins().get(
|
|
constants.L3_ROUTER_NAT)
|
|
if not version:
|
|
version = self.RPC_API_VERSION
|
|
l3_agents = plugin.get_l3_agents_hosting_routers(
|
|
admin_context, [router_id],
|
|
admin_state_up=True,
|
|
active=True)
|
|
for l3_agent in l3_agents:
|
|
LOG.debug(_('Notify agent at %(topic)s.%(host)s the message '
|
|
'%(method)s'),
|
|
{'topic': self.to_agent_topic,
|
|
'host': l3_agent.host,
|
|
'method': method,
|
|
'args': kwargs})
|
|
self.cast(
|
|
context, self.make_msg(method, **kwargs),
|
|
version=version,
|
|
topic='%s.%s' % (self.to_agent_topic, l3_agent.host))
|
|
|
|
def vpnservice_updated(self, context, router_id):
|
|
"""Send update event of vpnservices."""
|
|
self._agent_notification(context, 'vpnservice_updated', router_id)
|