tenant_ids.pop() != original.tenant_id):
raise q_exc.InvalidSharedSetting(network=original.name)
- def _make_network_dict(self, network, fields=None):
+ def _make_network_dict(self, network, fields=None,
+ process_extensions=True):
res = {'id': network['id'],
'name': network['name'],
'tenant_id': network['tenant_id'],
'shared': network['shared'],
'subnets': [subnet['id']
for subnet in network['subnets']]}
-
+ # Call auxiliary extend functions, if any
+ if process_extensions:
+ for func in self._dict_extend_functions.get(attributes.NETWORKS,
+ []):
+ func(self, res, network)
return self._fields(res, fields)
def _make_subnet_dict(self, subnet, fields=None):
sa.ForeignKey('networks.id', ondelete="CASCADE"),
primary_key=True)
+ # Add a relationship to the Network model in order to instruct
+ # SQLAlchemy to eagerly load this association
+ network = orm.relationship(
+ models_v2.Network,
+ backref=orm.backref("external", lazy='joined',
+ uselist=False, cascade='delete'))
+
class FloatingIP(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):
"""Represents a floating IP address.
# network_id attribute is required by API, so it must be present
network_id = info['network_id'] if info else None
if network_id:
- self._get_network(context, network_id)
- if not self._network_is_external(context, network_id):
+ network_db = self._get_network(context, network_id)
+ if not network_db.external:
msg = _("Network %s is not a valid external "
"network") % network_id
raise q_exc.BadRequest(resource='router', msg=msg)
except exc.NoResultFound:
return False
- def _extend_network_dict_l3(self, context, network):
- network[l3.EXTERNAL] = self._network_is_external(
- context, network['id'])
+ def _extend_network_dict_l3(self, network_res, network_db):
+ # Comparing with None for converting uuid into bool
+ network_res[l3.EXTERNAL] = network_db.external is not None
+ return network_res
+
+ # Register dict extend functions for networks
+ db_base_plugin_v2.QuantumDbPluginV2.register_dict_extend_funcs(
+ attributes.NETWORKS, [_extend_network_dict_l3])
- def _process_l3_create(self, context, net_data, net_id):
- external = net_data.get(l3.EXTERNAL)
+ def _process_l3_create(self, context, net_data, req_data):
+ external = req_data.get(l3.EXTERNAL)
external_set = attributes.is_attr_set(external)
if not external_set:
if external:
# expects to be called within a plugin's session
- context.session.add(ExternalNetwork(network_id=net_id))
+ context.session.add(ExternalNetwork(network_id=net_data['id']))
+ net_data[l3.EXTERNAL] = external
- def _process_l3_update(self, context, net_data, net_id):
+ def _process_l3_update(self, context, net_data, req_data):
- new_value = net_data.get(l3.EXTERNAL)
+ new_value = req_data.get(l3.EXTERNAL)
+ net_id = net_data['id']
if not attributes.is_attr_set(new_value):
return
- existing_value = self._network_is_external(context, net_id)
-
- if existing_value == new_value:
+ if net_data.get(l3.EXTERNAL) == new_value:
return
if new_value:
context.session.add(ExternalNetwork(network_id=net_id))
+ net_data[l3.EXTERNAL] = True
else:
# must make sure we do not have any external gateway ports
# (and thus, possible floating IPs) on this network before
# allow it to be update to external=False
port = context.session.query(models_v2.Port).filter_by(
device_owner=DEVICE_OWNER_ROUTER_GW,
- network_id=net_id).first()
+ network_id=net_data['id']).first()
if port:
raise l3.ExternalNetworkInUse(net_id=net_id)
context.session.query(ExternalNetwork).filter_by(
network_id=net_id).delete()
+ net_data[l3.EXTERNAL] = False
def _filter_nets_l3(self, context, nets, filters):
vals = filters and filters.get('router:external', [])
# create network in DB
new_net = super(QuantumRestProxyV2, self).create_network(context,
network)
- self._process_l3_create(context, network['network'], new_net['id'])
- self._extend_network_dict_l3(context, new_net)
+ self._process_l3_create(context, new_net, network['network'])
# create network on the network controller
try:
new_net = super(QuantumRestProxyV2, self).update_network(context,
net_id,
network)
- self._process_l3_update(context, network['network'], net_id)
- self._extend_network_dict_l3(context, new_net)
+ self._process_l3_update(context, new_net, network['network'])
# update network on network controller
try:
"network: %s"), e.message)
raise
- def get_network(self, context, id, fields=None):
- session = context.session
- with session.begin(subtransactions=True):
- net = super(QuantumRestProxyV2, self).get_network(context,
- id, None)
- self._extend_network_dict_l3(context, net)
- return self._fields(net, fields)
-
- def get_networks(self, context, filters=None, fields=None,
- sorts=None,
- limit=None, marker=None, page_reverse=False):
- session = context.session
- with session.begin(subtransactions=True):
- nets = super(QuantumRestProxyV2,
- self).get_networks(context, filters, None, sorts,
- limit, marker, page_reverse)
- for net in nets:
- self._extend_network_dict_l3(context, net)
-
- return [self._fields(net, fields) for net in nets]
-
def create_port(self, context, port):
"""Create a port, which is a connection point of a device
(e.g., a VM NIC) to attach to a L2 Quantum network.
raise Exception("Brocade plugin raised exception, check logs")
brocade_db.create_network(context, net_uuid, vlan_id)
- self._process_l3_create(context, network['network'], net['id'])
- self._extend_network_dict_l3(context, net)
+ self._process_l3_create(context, net, network['network'])
LOG.info(_("Allocated vlan (%d) from the pool"), vlan_id)
return net
with session.begin(subtransactions=True):
net = super(BrocadePluginV2, self).update_network(context, id,
network)
- self._process_l3_update(context, network['network'], id)
- self._extend_network_dict_l3(context, net)
+ self._process_l3_update(context, net, network['network'])
return net
- def get_network(self, context, id, fields=None):
- session = context.session
- with session.begin(subtransactions=True):
- net = super(BrocadePluginV2, self).get_network(context,
- id, None)
- self._extend_network_dict_l3(context, net)
-
- return self._fields(net, fields)
-
- def get_networks(self, context, filters=None, fields=None,
- sorts=None, limit=None, marker=None, page_reverse=False):
- session = context.session
- with session.begin(subtransactions=True):
- nets = super(BrocadePluginV2,
- self).get_networks(context, filters, None, sorts,
- limit, marker, page_reverse)
- for net in nets:
- self._extend_network_dict_l3(context, net)
-
- return [self._fields(net, fields) for net in nets]
-
def create_port(self, context, port):
"""Create logical port on the switch."""
session, net['id'], network_type,
physical_network, segmentation_id)
- self._process_l3_create(context, network['network'], net['id'])
+ self._process_l3_create(context, net, network['network'])
self._extend_network_dict_provider(context, net)
- self._extend_network_dict_l3(context, net)
LOG.debug(_("Created network: %s"), net['id'])
return net
with session.begin(subtransactions=True):
net = super(HyperVQuantumPlugin, self).update_network(context, id,
network)
- self._process_l3_update(context, network['network'], id)
+ self._process_l3_update(context, net, network['network'])
self._extend_network_dict_provider(context, net)
- self._extend_network_dict_l3(context, net)
return net
def delete_network(self, context, id):
def get_network(self, context, id, fields=None):
net = super(HyperVQuantumPlugin, self).get_network(context, id, None)
self._extend_network_dict_provider(context, net)
- self._extend_network_dict_l3(context, net)
return self._fields(net, fields)
def get_networks(self, context, filters=None, fields=None):
context, filters, None)
for net in nets:
self._extend_network_dict_provider(context, net)
- self._extend_network_dict_l3(context, net)
return [self._fields(net, fields) for net in nets]
network)
db.add_network_binding(session, net['id'],
physical_network, vlan_id)
- self._process_l3_create(context, network['network'], net['id'])
+ self._process_l3_create(context, net, network['network'])
self._extend_network_dict_provider(context, net)
- self._extend_network_dict_l3(context, net)
# note - exception will rollback entire transaction
return net
with session.begin(subtransactions=True):
net = super(LinuxBridgePluginV2, self).update_network(context, id,
network)
- self._process_l3_update(context, network['network'], id)
+ self._process_l3_update(context, net, network['network'])
self._extend_network_dict_provider(context, net)
- self._extend_network_dict_l3(context, net)
return net
def delete_network(self, context, id):
net = super(LinuxBridgePluginV2, self).get_network(context,
id, None)
self._extend_network_dict_provider(context, net)
- self._extend_network_dict_l3(context, net)
return self._fields(net, fields)
def get_networks(self, context, filters=None, fields=None,
limit, marker, page_reverse)
for net in nets:
self._extend_network_dict_provider(context, net)
- self._extend_network_dict_l3(context, net)
return [self._fields(net, fields) for net in nets]
with context.session.begin(subtransactions=True):
net = plugin.create_network(context, network)
if not self._is_l3_plugin(plugin):
- self._process_l3_create(context, network['network'], net['id'])
- self._extend_network_dict_l3(context, net)
+ self._process_l3_create(context, net, network['network'])
LOG.debug(_("Created network: %(net_id)s with flavor "
"%(flavor)s"), {'net_id': net['id'], 'flavor': flavor})
try:
with context.session.begin(subtransactions=True):
net = plugin.update_network(context, id, network)
if not self._is_l3_plugin(plugin):
- self._process_l3_update(context, network['network'], id)
- self._extend_network_dict_l3(context, net)
+ self._process_l3_update(context, net, network['network'])
return net
def delete_network(self, context, id):
plugin = self._get_plugin(flavor)
net = plugin.get_network(context, id, fields)
net['id'] = id
- if not fields or 'router:external' in fields:
- self._extend_network_dict_l3(context, net)
if not fields or FLAVOR_NETWORK in fields:
self._extend_network_dict(context, net)
if fields and 'id' not in fields:
prefix)
# For external network, link the bridge to the provider router.
- self._extend_network_dict_l3(context, net)
if net['router:external']:
gateway_ip = sn_entry['gateway_ip']
network_address, length = sn_entry['cidr'].split('/')
self.client.delete_dhcp(bridge)
# If the network is external, clean up routes, links, ports.
- self._extend_network_dict_l3(context, net)
if net['router:external']:
self.client.unlink_bridge_from_provider_router(
bridge, self.provider_router)
net = super(MidonetPluginV2, self).create_network(context, network)
# to handle l3 related data in DB
- self._process_l3_create(context, network['network'], net['id'])
- self._extend_network_dict_l3(context, net)
+ self._process_l3_create(context, net, network['network'])
LOG.debug(_("MidonetPluginV2.create_network exiting: net=%r"), net)
return net
context, id, network)
self.client.update_bridge(id, net['name'])
- self._extend_network_dict_l3(context, net)
LOG.debug(_("MidonetPluginV2.update_network exiting: net=%r"), net)
return net
LOG.debug(_("MidonetPluginV2.get_network called: id=%(id)r, "
"fields=%(fields)r"), {'id': id, 'fields': fields})
- # NOTE: Get network data with all fields (fields=None) for
- # _extend_network_dict_l3() method, which needs 'id' field
- qnet = super(MidonetPluginV2, self).get_network(context, id, None)
+ qnet = super(MidonetPluginV2, self).get_network(context, id, fields)
self.client.get_bridge(id)
- self._extend_network_dict_l3(context, qnet)
LOG.debug(_("MidonetPluginV2.get_network exiting: qnet=%r"), qnet)
- return self._fields(qnet, fields)
-
- def get_networks(self, context, filters=None, fields=None):
- """List quantum networks and verify that all exist in MidoNet."""
- LOG.debug(_("MidonetPluginV2.get_networks called: "
- "filters=%(filters)r, fields=%(fields)r"),
- {'filters': filters, 'fields': fields})
-
- # NOTE: Get network data with all fields (fields=None) for
- # _extend_network_dict_l3() method, which needs 'id' field
- qnets = super(MidonetPluginV2, self).get_networks(context, filters,
- None)
- for n in qnets:
- self._extend_network_dict_l3(context, n)
-
- return [self._fields(net, fields) for net in qnets]
+ return qnet
def delete_network(self, context, id):
"""Delete a network and its corresponding MidoNet bridge."""
segment = self.type_manager.allocate_tenant_segment(session)
result = super(Ml2Plugin, self).create_network(context, network)
id = result['id']
- self._process_l3_create(context, attrs, id)
+ self._process_l3_create(context, result, attrs)
# REVISIT(rkukura): Consider moving all segment management
# to TypeManager.
db.add_network_segment(session, id, segment)
self._extend_network_dict_provider(context, result)
- self._extend_network_dict_l3(context, result)
return result
with session.begin(subtransactions=True):
result = super(Ml2Plugin, self).update_network(context, id,
network)
- self._process_l3_update(context, network['network'], id)
+ self._process_l3_update(context, result, network['network'])
self._extend_network_dict_provider(context, result)
- self._extend_network_dict_l3(context, result)
return result
with session.begin(subtransactions=True):
result = super(Ml2Plugin, self).get_network(context, id, None)
self._extend_network_dict_provider(context, result)
- self._extend_network_dict_l3(context, result)
return self._fields(result, fields)
limit, marker, page_reverse)
for net in nets:
self._extend_network_dict_provider(context, net)
- self._extend_network_dict_l3(context, net)
nets = self._filter_nets_provider(context, nets, filters)
nets = self._filter_nets_l3(context, nets, filters)
physical_network,
vlan_id)
- self._process_l3_create(context, network['network'], net['id'])
+ self._process_l3_create(context, net, network['network'])
self._extend_network_dict_provider(context, net)
- self._extend_network_dict_l3(context, net)
# note - exception will rollback entire transaction
LOG.debug(_("Created network: %s"), net['id'])
return net
net = super(MellanoxEswitchPlugin, self).update_network(context,
net_id,
network)
- self._process_l3_update(context, network['network'], net_id)
+ self._process_l3_update(context, net, network['network'])
self._extend_network_dict_provider(context, net)
- self._extend_network_dict_l3(context, net)
return net
def delete_network(self, context, net_id):
net_id,
None)
self._extend_network_dict_provider(context, net)
- self._extend_network_dict_l3(context, net)
return self._fields(net, fields)
def get_networks(self, context, filters=None, fields=None):
None)
for net in nets:
self._extend_network_dict_provider(context, net)
- self._extend_network_dict_l3(context, net)
# TODO(rkukura): Filter on extended provider attributes.
nets = self._filter_nets_l3(context, nets, filters)
return [self._fields(net, fields) for net in nets]
with context.session.begin(subtransactions=True):
new_net = super(NECPluginV2, self).create_network(context, network)
- self._process_l3_create(context, network['network'], new_net['id'])
- self._extend_network_dict_l3(context, new_net)
+ self._process_l3_create(context, new_net, network['network'])
self._update_resource_status(context, "network", new_net['id'],
OperationalStatus.BUILD)
old_net = super(NECPluginV2, self).get_network(context, id)
new_net = super(NECPluginV2, self).update_network(context, id,
network)
- self._process_l3_update(context, network['network'], id)
- self._extend_network_dict_l3(context, new_net)
+ self._process_l3_update(context, new_net, network['network'])
changed = (old_net['admin_state_up'] is not new_net['admin_state_up'])
if changed and not new_net['admin_state_up']:
reason = _("delete_ofc_tenant() failed due to %s") % exc
LOG.warn(reason)
- def get_network(self, context, id, fields=None):
- net = super(NECPluginV2, self).get_network(context, id, None)
- self._extend_network_dict_l3(context, net)
- return self._fields(net, fields)
-
- def get_networks(self, context, filters=None, fields=None):
- nets = super(NECPluginV2, self).get_networks(context, filters, None)
- for net in nets:
- self._extend_network_dict_l3(context, net)
- return [self._fields(net, fields) for net in nets]
-
def _extend_port_dict_binding(self, context, port):
port[portbindings.VIF_TYPE] = portbindings.VIF_TYPE_OVS
port[portbindings.CAPABILITIES] = {
# Process port security extension
self._process_network_create_port_security(context, net_data)
# DB Operations for setting the network as external
- self._process_l3_create(context, net_data, new_net['id'])
+ self._process_l3_create(context, new_net, net_data)
# Process QoS queue extension
if network['network'].get(ext_qos.QUEUE):
new_net[ext_qos.QUEUE] = network['network'][ext_qos.QUEUE]
self._extend_network_dict_provider(context, new_net,
net_binding)
self._extend_network_port_security_dict(context, new_net)
- self._extend_network_dict_l3(context, new_net)
self.schedule_network(context, new_net)
return new_net
# goto to the plugin DB and fetch the network
network = self._get_network(context, id)
# if the network is external, do not go to NVP
- if not self._network_is_external(context, id):
+ if not network.external:
# verify the fabric status of the corresponding
# logical switch(es) in nvp
try:
net_result = self._make_network_dict(network, None)
self._extend_network_dict_provider(context, net_result)
self._extend_network_port_security_dict(context, net_result)
- self._extend_network_dict_l3(context, net_result)
self._extend_network_qos_queue(context, net_result)
return self._fields(net_result, fields)
for net in quantum_lswitches:
self._extend_network_dict_provider(context, net)
self._extend_network_port_security_dict(context, net)
- self._extend_network_dict_l3(context, net)
self._extend_network_qos_queue(context, net)
tenant_ids = filters and filters.get('tenant_id') or None
self._delete_network_queue_mapping(context, id)
self._process_network_queue_mapping(context, net)
self._extend_network_port_security_dict(context, net)
- self._process_l3_update(context, network['network'], id)
+ self._process_l3_update(context, net, network['network'])
self._extend_network_dict_provider(context, net)
- self._extend_network_dict_l3(context, net)
self._extend_network_qos_queue(context, net)
return net
else None)
if network_id:
ext_net = self._get_network(context, network_id)
- if not self._network_is_external(context, network_id):
+ if not ext_net.external:
msg = (_("Network '%s' is not a valid external "
"network") % network_id)
raise q_exc.BadRequest(resource='router', msg=msg)
else None)
if network_id:
ext_net = self._get_network(context, network_id)
- if not self._network_is_external(context, network_id):
+ if not ext_net.external:
msg = (_("Network '%s' is not a valid external "
"network") % network_id)
raise q_exc.BadRequest(resource='router', msg=msg)
ovs_db_v2.add_network_binding(session, net['id'], network_type,
physical_network, segmentation_id)
- self._process_l3_create(context, network['network'], net['id'])
+ self._process_l3_create(context, net, network['network'])
self._extend_network_dict_provider(context, net)
- self._extend_network_dict_l3(context, net)
# note - exception will rollback entire transaction
LOG.debug(_("Created network: %s"), net['id'])
return net
with session.begin(subtransactions=True):
net = super(OVSQuantumPluginV2, self).update_network(context, id,
network)
- self._process_l3_update(context, network['network'], id)
+ self._process_l3_update(context, net, network['network'])
self._extend_network_dict_provider(context, net)
- self._extend_network_dict_l3(context, net)
return net
def delete_network(self, context, id):
net = super(OVSQuantumPluginV2, self).get_network(context,
id, None)
self._extend_network_dict_provider(context, net)
- self._extend_network_dict_l3(context, net)
return self._fields(net, fields)
def get_networks(self, context, filters=None, fields=None,
limit, marker, page_reverse)
for net in nets:
self._extend_network_dict_provider(context, net)
- self._extend_network_dict_l3(context, net)
return [self._fields(net, fields) for net in nets]
net = super(RyuQuantumPluginV2, self).create_network(context,
network)
- self._process_l3_create(context, network['network'], net['id'])
- self._extend_network_dict_l3(context, net)
+ self._process_l3_create(context, net, network['network'])
tunnel_key = self.tunnel_key.allocate(session, net['id'])
try:
with session.begin(subtransactions=True):
net = super(RyuQuantumPluginV2, self).update_network(context, id,
network)
- self._process_l3_update(context, network['network'], id)
- self._extend_network_dict_l3(context, net)
+ self._process_l3_update(context, net, network['network'])
return net
def delete_network(self, context, id):
self.tunnel_key.delete(session, id)
super(RyuQuantumPluginV2, self).delete_network(context, id)
- def get_network(self, context, id, fields=None):
- net = super(RyuQuantumPluginV2, self).get_network(context, id, None)
- self._extend_network_dict_l3(context, net)
- return self._fields(net, fields)
-
- def get_networks(self, context, filters=None, fields=None):
- nets = super(RyuQuantumPluginV2, self).get_networks(context, filters,
- None)
- for net in nets:
- self._extend_network_dict_l3(context, net)
-
- return [self._fields(net, fields) for net in nets]
-
def create_port(self, context, port):
session = context.session
with session.begin(subtransactions=True):
session = context.session
with session.begin(subtransactions=True):
net = super(Fake1, self).create_network(context, network)
- self._process_l3_create(context, network['network'], net['id'])
- self._extend_network_dict_l3(context, net)
+ self._process_l3_create(context, net, network['network'])
return net
def update_network(self, context, id, network):
with session.begin(subtransactions=True):
net = super(Fake1, self).update_network(context, id,
network)
- self._process_l3_update(context, network['network'], id)
- self._extend_network_dict_l3(context, net)
+ self._process_l3_update(context, net, network['network'])
return net
def delete_network(self, context, id):
with session.begin(subtransactions=True):
net = super(TestL3NatPlugin, self).create_network(context,
network)
- self._process_l3_create(context, network['network'], net['id'])
- self._extend_network_dict_l3(context, net)
+ self._process_l3_create(context, net, network['network'])
return net
def update_network(self, context, id, network):
with session.begin(subtransactions=True):
net = super(TestL3NatPlugin, self).update_network(context, id,
network)
- self._process_l3_update(context, network['network'], id)
- self._extend_network_dict_l3(context, net)
+ self._process_l3_update(context, net, network['network'])
return net
- def delete_network(self, context, id):
- session = context.session
- with session.begin(subtransactions=True):
- super(TestL3NatPlugin, self).delete_network(context, id)
-
- def get_network(self, context, id, fields=None):
- net = super(TestL3NatPlugin, self).get_network(context, id, None)
- self._extend_network_dict_l3(context, net)
- return self._fields(net, fields)
-
- def get_networks(self, context, filters=None, fields=None,
- sorts=[], limit=None, marker=None,
- page_reverse=False):
- nets = super(TestL3NatPlugin, self).get_networks(
- context, filters=filters, fields=fields, sorts=sorts, limit=limit,
- marker=marker, page_reverse=page_reverse)
- for net in nets:
- self._extend_network_dict_l3(context, net)
- return [self._fields(net, fields) for net in nets]
-
def delete_port(self, context, id, l3_port_check=True):
if l3_port_check:
self.prevent_l3_port_deletion(context, id)