From: Scott Baker Date: Fri, 9 Aug 2013 21:32:04 +0000 (-0700) Subject: abstract out get_network_subnet, support for sharedNetwork X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=8a9d474885bb531ce1eabd4808650639916d8109;hp=45f3efab84028fe878fdfae907e0c250d2518bb7;p=plstackapi.git abstract out get_network_subnet, support for sharedNetwork --- diff --git a/planetstack/openstack/driver.py b/planetstack/openstack/driver.py index c4f2fd6..a6addba 100644 --- a/planetstack/openstack/driver.py +++ b/planetstack/openstack/driver.py @@ -343,6 +343,21 @@ class OpenStackDriver: shared_networks = self.shell.quantum.list_networks(**search_opts) return shared_networks + def get_network_subnet(self, network_id): + subnet_id = None + subnet = None + if network_id: + os_networks = self.shell.quantum.list_networks(id=network_id)["networks"] + if os_networks: + os_network = os_networks[0] + if os_network['subnets']: + subnet_id = os_network['subnets'][0] + os_subnets = self.shell.quantum.list_subnets(id=subnet_id)['subnets'] + if os_subnets: + subnet = os_subnets[0]['cidr'] + + return (subnet_id, subnet) + def spawn_instance(self, name, key_name=None, hostname=None, image_id=None, security_group=None, pubkeys=[], networks=None): flavor_name = self.config.nova_default_flavor flavor = self.shell.nova.flavors.find(name=flavor_name) diff --git a/planetstack/openstack/manager.py b/planetstack/openstack/manager.py index af458f2..6838aea 100644 --- a/planetstack/openstack/manager.py +++ b/planetstack/openstack/manager.py @@ -412,34 +412,38 @@ class OpenStackManager: @require_enabled def save_network(self, network): if not network.network_id: - network_name = network.name - - # create network - os_network = self.driver.create_network(network_name) - network.network_id = os_network['id'] - - # create router - router = self.driver.create_router(network_name) - network.router_id = router['id'] - - # create subnet - next_subnet = self.get_next_subnet() - cidr = str(next_subnet.cidr) - ip_version = next_subnet.version - start = str(next_subnet[2]) - end = str(next_subnet[-2]) - subnet = self.driver.create_subnet(name=network_name, - network_id = network.network_id, - cidr_ip = cidr, - ip_version = ip_version, - start = start, - end = end) - network.subnet = cidr - network.subnet_id = subnet['id'] - # add subnet as interface to slice's router - self.driver.add_router_interface(router['id'], subnet['id']) - # add external route - self.driver.add_external_route(subnet) + if network.template.sharedNetworkName: + network.network_id = network.template.sharedNetworkId + (network.subnet_id, network.subnet) = self.driver.get_network_subnet(network.network_id) + else: + network_name = network.name + + # create network + os_network = self.driver.create_network(network_name) + network.network_id = os_network['id'] + + # create router + router = self.driver.create_router(network_name) + network.router_id = router['id'] + + # create subnet + next_subnet = self.get_next_subnet() + cidr = str(next_subnet.cidr) + ip_version = next_subnet.version + start = str(next_subnet[2]) + end = str(next_subnet[-2]) + subnet = self.driver.create_subnet(name=network_name, + network_id = network.network_id, + cidr_ip = cidr, + ip_version = ip_version, + start = start, + end = end) + network.subnet = cidr + network.subnet_id = subnet['id'] + # add subnet as interface to slice's router + self.driver.add_router_interface(router['id'], subnet['id']) + # add external route + self.driver.add_external_route(subnet) network.save() network.enacted = datetime.now() @@ -527,15 +531,7 @@ class OpenStackManager: # this network type. continue - # Make a best-effort attempt to figure out the subnet. If we - # cannot determine the subnet, then leave those fields blank. - subnet_id = None - subnet = None - if os_network['subnets']: - subnet_id = os_network['subnets'][0] - os_subnets = self.driver.shell.quantum.list_subnets(id=subnet_id)['subnets'] - if os_subnets: - subnet = os_subnets[0]['cidr'] + (subnet_id, subnet) = self.driver.get_network_subnet(os_network['id']) if owner_slice: #print "creating model object for OS network", os_network['name']