35
37
from neutron.db import dhcp_rpc_base
36
38
from neutron.db import external_net_db
37
39
from neutron.db import extraroute_db
38
from neutron.db import l3_db
40
from neutron.db import l3_agentschedulers_db
39
41
from neutron.db import l3_rpc_base
40
42
from neutron.db import portbindings_db
41
43
from neutron.extensions import portbindings
42
44
from neutron.extensions import providernet
45
from neutron.openstack.common import excutils
46
from neutron.openstack.common import importutils
43
47
from neutron.openstack.common import log as logging
44
48
from neutron.openstack.common import rpc
45
49
from neutron.openstack.common import uuidutils as uuidutils
78
82
class N1kvNeutronPluginV2(db_base_plugin_v2.NeutronDbPluginV2,
79
83
external_net_db.External_net_db_mixin,
80
84
extraroute_db.ExtraRoute_db_mixin,
81
l3_db.L3_NAT_db_mixin,
82
85
portbindings_db.PortBindingMixin,
83
86
n1kv_db_v2.NetworkProfile_db_mixin,
84
87
n1kv_db_v2.PolicyProfile_db_mixin,
85
88
network_db_v2.Credential_db_mixin,
86
agentschedulers_db.AgentSchedulerDbMixin):
89
l3_agentschedulers_db.L3AgentSchedulerDbMixin,
90
agentschedulers_db.DhcpAgentSchedulerDbMixin):
89
93
Implement the Neutron abstractions using Cisco Nexus1000V.
99
103
supported_extension_aliases = ["provider", "agent",
100
104
"n1kv", "network_profile",
101
105
"policy_profile", "external-net", "router",
102
"binding", "credential"]
106
"binding", "credential",
107
"l3_agent_scheduler",
108
"dhcp_agent_scheduler"]
104
110
def __init__(self, configfile=None):
119
125
c_cred.Store.initialize()
120
126
self._setup_vsm()
121
127
self._setup_rpc()
128
self.network_scheduler = importutils.import_object(
129
q_conf.CONF.network_scheduler_driver
131
self.router_scheduler = importutils.import_object(
132
q_conf.CONF.router_scheduler_driver
123
135
def _setup_rpc(self):
967
979
self._send_create_network_request(context, net, segment_pairs)
968
980
except(cisco_exceptions.VSMError,
969
981
cisco_exceptions.VSMConnectionFailed):
970
super(N1kvNeutronPluginV2, self).delete_network(context, net['id'])
982
with excutils.save_and_reraise_exception():
983
self._delete_network_db(context, net['id'])
972
985
LOG.debug(_("Created network: %s"), net['id'])
1040
1053
session = context.session
1041
1054
with session.begin(subtransactions=True):
1042
binding = n1kv_db_v2.get_network_binding(session, id)
1043
1055
network = self.get_network(context, id)
1044
1056
if n1kv_db_v2.is_trunk_member(session, id):
1045
1057
msg = _("Cannot delete network '%s' "
1049
1061
msg = _("Cannot delete network '%s' that is a member of a "
1050
1062
"multi-segment network") % network['name']
1051
1063
raise n_exc.InvalidInput(error_message=msg)
1064
self._delete_network_db(context, id)
1065
# the network_binding record is deleted via cascade from
1066
# the network record, so explicit removal is not necessary
1067
self._send_delete_network_request(context, network)
1068
LOG.debug("Deleted network: %s", id)
1070
def _delete_network_db(self, context, id):
1071
session = context.session
1072
with session.begin(subtransactions=True):
1073
binding = n1kv_db_v2.get_network_binding(session, id)
1052
1074
if binding.network_type == c_const.NETWORK_TYPE_OVERLAY:
1053
1075
n1kv_db_v2.release_vxlan(session, binding.segmentation_id)
1054
1076
elif binding.network_type == c_const.NETWORK_TYPE_VLAN:
1055
1077
n1kv_db_v2.release_vlan(session, binding.physical_network,
1056
1078
binding.segmentation_id)
1057
1079
super(N1kvNeutronPluginV2, self).delete_network(context, id)
1058
# the network_binding record is deleted via cascade from
1059
# the network record, so explicit removal is not necessary
1060
self._send_delete_network_request(context, network)
1061
LOG.debug(_("Deleted network: %s"), id)
1063
1081
def get_network(self, context, id, fields=None):
1114
1132
p_profile = None
1115
1133
port_count = None
1116
1135
vm_network_name = None
1117
1136
profile_id_set = False
1119
1138
# Set the network policy profile id for auto generated L3/DHCP ports
1120
1139
if ('device_id' in port['port'] and port['port']['device_owner'] in
1121
[constants.DEVICE_OWNER_DHCP, constants.DEVICE_OWNER_ROUTER_INTF]):
1140
[constants.DEVICE_OWNER_DHCP, constants.DEVICE_OWNER_ROUTER_INTF,
1141
constants.DEVICE_OWNER_ROUTER_GW,
1142
constants.DEVICE_OWNER_FLOATINGIP]):
1122
1143
p_profile_name = c_conf.CISCO_N1K.network_node_policy_profile
1123
1144
p_profile = self._get_policy_profile_by_name(p_profile_name)
1157
1178
pt['network_id'])
1159
n1kv_db_v2.add_vm_network(context.session,
1180
vm_network = n1kv_db_v2.add_vm_network(context.session,
1165
1186
# Update port count of the VM network.
1166
1187
vm_network_name = vm_network['name']
1182
1203
vm_network_name)
1183
1204
except(cisco_exceptions.VSMError,
1184
1205
cisco_exceptions.VSMConnectionFailed):
1185
super(N1kvNeutronPluginV2, self).delete_port(context, pt['id'])
1206
with excutils.save_and_reraise_exception():
1207
self._delete_port_db(context, pt, vm_network)
1187
1209
LOG.debug(_("Created port: %s"), pt)
1221
1243
vm_network = n1kv_db_v2.get_vm_network(context.session,
1222
1244
port[n1kv.PROFILE_ID],
1223
1245
port['network_id'])
1246
router_ids = self.disassociate_floatingips(
1247
context, id, do_notify=False)
1248
self._delete_port_db(context, port, vm_network)
1250
# now that we've left db transaction, we are safe to notify
1251
self.notify_routers_updated(context, router_ids)
1252
self._send_delete_port_request(context, port, vm_network)
1254
def _delete_port_db(self, context, port, vm_network):
1255
with context.session.begin(subtransactions=True):
1224
1256
vm_network['port_count'] -= 1
1225
1257
n1kv_db_v2.update_vm_network_port_count(context.session,
1226
1258
vm_network['name'],
1229
1261
n1kv_db_v2.delete_vm_network(context.session,
1230
1262
port[n1kv.PROFILE_ID],
1231
1263
port['network_id'])
1232
router_ids = self.disassociate_floatingips(
1233
context, id, do_notify=False)
1234
super(N1kvNeutronPluginV2, self).delete_port(context, id)
1236
# now that we've left db transaction, we are safe to notify
1237
self.notify_routers_updated(context, router_ids)
1239
self._send_delete_port_request(context, port, vm_network)
1264
super(N1kvNeutronPluginV2, self).delete_port(context, port['id'])
1241
1266
def get_port(self, context, id, fields=None):
1289
1314
self._send_create_subnet_request(context, sub)
1290
1315
except(cisco_exceptions.VSMError,
1291
1316
cisco_exceptions.VSMConnectionFailed):
1292
super(N1kvNeutronPluginV2, self).delete_subnet(context, sub['id'])
1317
with excutils.save_and_reraise_exception():
1318
super(N1kvNeutronPluginV2,
1319
self).delete_subnet(context, sub['id'])
1294
1321
LOG.debug(_("Created subnet: %s"), sub['id'])
1380
1407
context.tenant_id)
1381
1408
except(cisco_exceptions.VSMError,
1382
1409
cisco_exceptions.VSMConnectionFailed):
1383
n1kv_db_v2.delete_profile_binding(context.session,
1410
with excutils.save_and_reraise_exception():
1411
super(N1kvNeutronPluginV2,
1412
self).delete_network_profile(context, net_p['id'])
1387
1414
self._send_create_network_profile_request(context, net_p)
1388
1415
except(cisco_exceptions.VSMError,
1389
1416
cisco_exceptions.VSMConnectionFailed):
1390
n1kv_db_v2.delete_profile_binding(context.session,
1393
self._send_delete_logical_network_request(net_p)
1417
with excutils.save_and_reraise_exception():
1418
super(N1kvNeutronPluginV2,
1419
self).delete_network_profile(context, net_p['id'])
1420
self._send_delete_logical_network_request(net_p)
1396
1423
def delete_network_profile(self, context, id):
1423
1450
network_profile))
1424
1451
self._send_update_network_profile_request(net_p)
1454
def create_router(self, context, router):
1456
Handle creation of router.
1458
Schedule router to L3 agent as part of the create handling.
1459
:param context: neutron api request context
1460
:param router: router dictionary
1461
:returns: router object
1463
session = context.session
1464
with session.begin(subtransactions=True):
1465
rtr = (super(N1kvNeutronPluginV2, self).
1466
create_router(context, router))
1467
LOG.debug(_("Scheduling router %s"), rtr['id'])
1468
self.schedule_router(context, rtr['id'])