1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
# Copyright (C) 2015 Huawei Technologies India Pvt Ltd.
# 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_config import cfg
from neutron.api.rpc.agentnotifiers import l3_rpc_agent_api
from neutron.api.rpc.handlers import l3_rpc
from neutron.common import constants as q_const
from neutron.common import rpc as n_rpc
from neutron.common import topics
from neutron.db import db_base_plugin_v2
from neutron.db import extraroute_db
from neutron.db import l3_agentschedulers_db
from neutron.db import l3_gwmode_db
from neutron.plugins.common import constants
from networking_onos.common import config # noqa
from networking_onos.plugins.l3 import floating_ip as onos_fip
from networking_onos.plugins.l3 import router as onos_router
class ONOSL3Plugin(db_base_plugin_v2.NeutronDbPluginV2,
extraroute_db.ExtraRoute_db_mixin,
l3_gwmode_db.L3_NAT_db_mixin,
l3_agentschedulers_db.L3AgentSchedulerDbMixin,
onos_router.ONOSRouter,
onos_fip.ONOSFloatingIP):
"""Implementation of the ONOS L3 Router Service Plugin.
This class implements a L3 service plugin that provides
router and floatingip resources and manages associated
request/response.
"""
supported_extension_aliases = ["router", "ext-gw-mode", "extraroute"]
def __init__(self):
self.setup_rpc()
self.onos_path = cfg.CONF.onos.url_path
self.onos_auth = (cfg.CONF.onos.username, cfg.CONF.onos.password)
def setup_rpc(self):
self.topic = topics.L3PLUGIN
self.conn = n_rpc.create_connection(new=True)
self.agent_notifiers.update(
{q_const.AGENT_TYPE_L3: l3_rpc_agent_api.L3AgentNotifyAPI()})
self.endpoints = [l3_rpc.L3RpcCallback()]
self.conn.create_consumer(self.topic, self.endpoints, fanout=False)
self.conn.consume_in_threads()
def get_plugin_type(self):
return constants.L3_ROUTER_NAT
def get_plugin_description(self):
"""returns plug-in description"""
return ("L3 Router Service Plug-in for basic L3 forwarding using ONOS")
def create_router(self, context, router):
router_dict = super(ONOSL3Plugin, self).create_router(context, router)
self.handle_create_router(router_dict)
return router_dict
def update_router(self, context, id, router):
router_dict = super(ONOSL3Plugin, self).update_router(context, id,
router)
self.handle_update_router(router_dict, id)
return router_dict
def delete_router(self, context, id):
super(ONOSL3Plugin, self).delete_router(context, id)
self.handle_delete_router(id)
def create_floatingip(self, context, floatingip,
initial_status=q_const.FLOATINGIP_STATUS_ACTIVE):
fip_dict = super(ONOSL3Plugin, self).create_floatingip(context,
floatingip,
initial_status)
self.handle_create_floatingip(fip_dict)
return fip_dict
def update_floatingip(self, context, id, floatingip):
fip_dict = super(ONOSL3Plugin, self).update_floatingip(context, id,
floatingip)
self.handle_update_floatingip(id, fip_dict)
return fip_dict
def delete_floatingip(self, context, id):
super(ONOSL3Plugin, self).delete_floatingip(context, id)
self.handle_delete_floatingip(id)
def add_router_interface(self, context, router_id, interface_info):
router = super(ONOSL3Plugin, self).add_router_interface(context,
router_id,
interface_info)
intf_add_type = self._get_intf_add_type(router, interface_info)
self.handle_add_router_interface(router, router_id,
interface_info, intf_add_type)
return router
def remove_router_interface(self, context, router_id, interface_info):
router = super(ONOSL3Plugin, self).remove_router_interface(
context, router_id, interface_info)
intf_add_type = self._get_intf_add_type(router, interface_info)
self.handle_remove_router_interface(router, router_id,
interface_info, intf_add_type)
return router
def _get_intf_add_type(self, router_info, intf_info):
add_by_port, add_by_sub = self._validate_interface_info(intf_info)
if add_by_sub:
return onos_router.ADD_INTF_BY_SUBNET
return onos_router.ADD_INTF_BY_PORT
|