Creation of networks with embedded subnets now functional, though a bit hacky.
This commit is contained in:
@@ -3,10 +3,11 @@ from sqlalchemy import orm
|
||||
|
||||
from quantum.db.model_base import BASEV2
|
||||
from quantum.db.models_v2 import HasTenant, HasId
|
||||
from quantum.openstack.common import timeutils
|
||||
|
||||
|
||||
class CreatedAt(object):
|
||||
created_at = sa.Column(sa.DateTime())
|
||||
created_at = sa.Column(sa.DateTime(), default=timeutils.utcnow)
|
||||
|
||||
|
||||
# TODO(mdietz): discuss any IP reservation policies ala Melange with the nerds
|
||||
|
||||
@@ -22,6 +22,7 @@ import uuid
|
||||
|
||||
from sqlalchemy import func as sql_func
|
||||
|
||||
from quantum.api.v2 import attributes as q_attr
|
||||
from quantum import quantum_plugin_base_v2
|
||||
from quantum.common import exceptions
|
||||
from quantum.db import api as db_api
|
||||
@@ -44,6 +45,13 @@ quark_opts = [
|
||||
|
||||
CONF.register_opts(quark_opts, "QUARK")
|
||||
|
||||
#NOTE(mdietz): hacking this for now because disallowing subnets on a network
|
||||
# create is absurd. Might be useful to implement the ability
|
||||
# upstream to add a "mask" on the attributes to override
|
||||
|
||||
|
||||
q_attr.RESOURCE_ATTRIBUTE_MAP["networks"]["subnets"]["allow_post"] = True
|
||||
|
||||
|
||||
class Plugin(quantum_plugin_base_v2.QuantumPluginBaseV2):
|
||||
def __init__(self):
|
||||
@@ -68,21 +76,19 @@ class Plugin(quantum_plugin_base_v2.QuantumPluginBaseV2):
|
||||
return str(uuid.uuid1())
|
||||
|
||||
def _make_network_dict(self, network, fields=None):
|
||||
network['subnets'] = network.get("subnets") or {}
|
||||
res = {'id': network.get('id'),
|
||||
'name': network.get('name'),
|
||||
'tenant_id': network.get('tenant_id'),
|
||||
'admin_state_up': network.get('admin_state_up'),
|
||||
'status': network.get('status'),
|
||||
'shared': network.get('shared'),
|
||||
'subnets': [subnet.get('id')
|
||||
'subnets': [self._make_subnet_dict(subnet)
|
||||
for subnet in network.get('subnets', [])]}
|
||||
return res
|
||||
|
||||
def _make_subnet_dict(self, subnet, fields=None):
|
||||
subnet['allocation_pools'] = subnet.get('allocation_pools') or {}
|
||||
subnet['dns_nameservers'] = subnet.get('dns_nameservers') or {}
|
||||
subnet['routes'] = subnet.get('routes') or {}
|
||||
|
||||
res = {'id': subnet.get('id'),
|
||||
'name': subnet.get('name'),
|
||||
@@ -99,7 +105,7 @@ class Plugin(quantum_plugin_base_v2.QuantumPluginBaseV2):
|
||||
for dns in subnet.get('dns_nameservers')],
|
||||
'host_routes': [{'destination': route.get('destination'),
|
||||
'nexthop': route.get('nexthop')}
|
||||
for route in subnet.get('routes')],
|
||||
for route in subnet.get('routes', [])],
|
||||
'shared': subnet.get('shared')
|
||||
}
|
||||
if subnet.get('gateway_ip'):
|
||||
@@ -122,6 +128,13 @@ class Plugin(quantum_plugin_base_v2.QuantumPluginBaseV2):
|
||||
"device_owner": port.get("device_owner")}
|
||||
return res
|
||||
|
||||
def _create_subnet(self, context, subnet, session=None):
|
||||
s = models.Subnet()
|
||||
s.update(subnet["subnet"])
|
||||
s["tenant_id"] = context.tenant_id
|
||||
session.add(s)
|
||||
return s
|
||||
|
||||
def create_subnet(self, context, subnet):
|
||||
"""
|
||||
Create a subnet, which represents a range of IP addresses
|
||||
@@ -131,8 +144,10 @@ class Plugin(quantum_plugin_base_v2.QuantumPluginBaseV2):
|
||||
as listed in the RESOURCE_ATTRIBUTE_MAP object in
|
||||
quantum/api/v2/attributes.py. All keys will be populated.
|
||||
"""
|
||||
subnet = {'id': self._gen_uuid()}
|
||||
return self._make_subnet_dict(subnet)
|
||||
session = context.session
|
||||
new_subnet = self._create_subnet(context, subnet, session)
|
||||
session.flush()
|
||||
return self._make_subnet_dict(new_subnet)
|
||||
|
||||
def update_subnet(self, context, id, subnet):
|
||||
"""
|
||||
@@ -229,8 +244,21 @@ class Plugin(quantum_plugin_base_v2.QuantumPluginBaseV2):
|
||||
as listed in the RESOURCE_ATTRIBUTE_MAP object in
|
||||
quantum/api/v2/attributes.py. All keys will be populated.
|
||||
"""
|
||||
network = {'id': self._gen_uuid()}
|
||||
return self._make_network_dict(network)
|
||||
lswitch = self.nvp_driver.create_network(context.tenant_id,
|
||||
network["network"]["name"])
|
||||
|
||||
with context.session.begin(subtransactions=True):
|
||||
if network["network"].get("subnets"):
|
||||
subnets = network["network"].pop("subnets")
|
||||
for sub in subnets:
|
||||
sub["subnet"]["network_id"] = lswitch["uuid"]
|
||||
self._create_subnet(context, sub, context.session)
|
||||
new_net = models.Network()
|
||||
new_net.update(network["network"])
|
||||
new_net["id"] = lswitch["uuid"]
|
||||
context.session.add(new_net)
|
||||
|
||||
return self._make_network_dict(new_net)
|
||||
|
||||
def update_network(self, context, id, network):
|
||||
"""
|
||||
|
||||
Reference in New Issue
Block a user