180
186
handled, by adding support for extended attributes to the
181
187
QuantumDbPluginV2 base class. When that occurs, this class should
182
188
be updated to take advantage of it.
190
The port binding extension enables an external application relay
191
information to and from the plugin.
185
194
# This attribute specifies whether the plugin supports or not
186
195
# bulk operations. Name mangling is used in order to ensure it
187
196
# is qualified by class
188
197
__native_bulk_support = True
189
supported_extension_aliases = ["provider", "router"]
198
supported_extension_aliases = ["provider", "router", "binding", "quotas"]
200
network_view = "extension:provider_network:view"
201
network_set = "extension:provider_network:set"
202
binding_view = "extension:port_binding:view"
203
binding_set = "extension:port_binding:set"
191
205
def __init__(self, configfile=None):
192
206
ovs_db_v2.initialize()
237
251
except ValueError as ex:
238
LOG.error("Invalid network VLAN range: '%s' - %s. "
252
LOG.error(_("Invalid network VLAN range: "
253
"'%(range)s' - %(e)s. Agent terminated!"),
254
{'range': entry, 'e': ex})
243
257
self._add_network(entry)
244
LOG.info("Network VLAN ranges: %s", self.network_vlan_ranges)
258
LOG.info(_("Network VLAN ranges: %s"), self.network_vlan_ranges)
246
260
def _add_network_vlan_range(self, physical_network, vlan_min, vlan_max):
247
261
self._add_network(physical_network)
258
272
tun_min, tun_max = entry.split(':')
259
273
self.tunnel_id_ranges.append((int(tun_min), int(tun_max)))
260
274
except ValueError as ex:
261
LOG.error("Invalid tunnel ID range: '%s' - %s. "
262
"Agent terminated!", entry, ex)
275
LOG.error(_("Invalid tunnel ID range: "
276
"'%(range)s' - %(e)s. Agent terminated!"),
277
{'range': entry, 'e': ex})
264
LOG.info("Tunnel ID ranges: %s", self.tunnel_id_ranges)
279
LOG.info(_("Tunnel ID ranges: %s"), self.tunnel_id_ranges)
266
281
# TODO(rkukura) Use core mechanism for attribute authorization
267
282
# when available.
269
def _check_provider_view_auth(self, context, network):
270
return policy.check(context,
271
"extension:provider_network:view",
284
def _check_view_auth(self, context, resource, action):
285
return policy.check(context, action, resource)
274
def _enforce_provider_set_auth(self, context, network):
275
return policy.enforce(context,
276
"extension:provider_network:set",
287
def _enforce_set_auth(self, context, resource, action):
288
policy.enforce(context, action, resource)
279
290
def _extend_network_dict_provider(self, context, network):
280
if self._check_provider_view_auth(context, network):
291
if self._check_view_auth(context, network, self.network_view):
281
292
binding = ovs_db_v2.get_network_binding(context.session,
283
294
network[provider.NETWORK_TYPE] = binding.network_type
355
366
segmentation_id = None
357
msg = _("provider:network_type %s not supported" % network_type)
368
msg = _("provider:network_type %s not supported") % network_type
358
369
raise q_exc.InvalidInput(error_message=msg)
360
371
if network_type in [constants.TYPE_VLAN, constants.TYPE_FLAT]:
361
372
if physical_network_set:
362
373
if physical_network not in self.network_vlan_ranges:
363
msg = _("unknown provider:physical_network %s" %
374
msg = _("Unknown provider:physical_network "
375
"%s") % physical_network
365
376
raise q_exc.InvalidInput(error_message=msg)
366
377
elif 'default' in self.network_vlan_ranges:
367
378
physical_network = 'default'
458
469
self.notifier.network_delete(context, id)
460
471
def get_network(self, context, id, fields=None):
461
net = super(OVSQuantumPluginV2, self).get_network(context, id, None)
462
self._extend_network_dict_provider(context, net)
463
self._extend_network_dict_l3(context, net)
472
session = context.session
473
with session.begin(subtransactions=True):
474
net = super(OVSQuantumPluginV2, self).get_network(context,
476
self._extend_network_dict_provider(context, net)
477
self._extend_network_dict_l3(context, net)
464
478
return self._fields(net, fields)
466
480
def get_networks(self, context, filters=None, fields=None):
467
nets = super(OVSQuantumPluginV2, self).get_networks(context, filters,
470
self._extend_network_dict_provider(context, net)
471
self._extend_network_dict_l3(context, net)
481
session = context.session
482
with session.begin(subtransactions=True):
483
nets = super(OVSQuantumPluginV2, self).get_networks(context,
487
self._extend_network_dict_provider(context, net)
488
self._extend_network_dict_l3(context, net)
473
# TODO(rkukura): Filter on extended provider attributes.
474
nets = self._filter_nets_l3(context, nets, filters)
490
# TODO(rkukura): Filter on extended provider attributes.
491
nets = self._filter_nets_l3(context, nets, filters)
476
493
return [self._fields(net, fields) for net in nets]
495
def _extend_port_dict_binding(self, context, port):
496
if self._check_view_auth(context, port, self.binding_view):
497
port[portbindings.VIF_TYPE] = portbindings.VIF_TYPE_OVS
500
def create_port(self, context, port):
501
port = super(OVSQuantumPluginV2, self).create_port(context, port)
502
return self._extend_port_dict_binding(context, port)
504
def get_port(self, context, id, fields=None):
505
port = super(OVSQuantumPluginV2, self).get_port(context, id, fields)
506
return self._fields(self._extend_port_dict_binding(context, port),
509
def get_ports(self, context, filters=None, fields=None):
510
ports = super(OVSQuantumPluginV2, self).get_ports(context, filters,
512
return [self._fields(self._extend_port_dict_binding(context, port),
513
fields) for port in ports]
478
515
def update_port(self, context, id, port):
479
516
original_port = super(OVSQuantumPluginV2, self).get_port(context,