networks = []
for network_id in network_ids:
- networks.append({"uuid": network_id})
+ networks.append({"net-id": network_id})
return networks
@require_enabled
def save_sliver(self, sliver):
+ metadata_update = {}
+ if ("numberCores" in sliver.changed_fields):
+ metadata_update["cpu_cores"] = str(sliver.numberCores)
+
+ for tag in sliver.slice.tags.all():
+ if tag.name.startswith("sysctl-"):
+ metadata_update[tag.name] = tag.value
+
if not sliver.instance_id:
- if (sliver.slice.name == "smbaker-slice-8") or (sliver.slice.name.startswith("smbaker-slice-net")):
- # only inflict this pain on myself, for now...
- requested_networks = self.get_requested_networks(sliver.slice)
- else:
- requested_networks = None
+ nics = self.get_requested_networks(sliver.slice)
+ for nic in nics:
+ # If a network hasn't been instantiated yet, then we'll fail
+ # during slice creation. Defer saving the sliver for now.
+ if not nic.get("net-id", None):
+ sliver.save() # in case it hasn't been saved yet
+ return
slice_memberships = SliceMembership.objects.filter(slice=sliver.slice)
pubkeys = [sm.user.public_key for sm in slice_memberships if sm.user.public_key]
pubkeys.append(sliver.creator.public_key)
image_id = sliver.image.image_id,
hostname = sliver.node.name,
pubkeys = pubkeys,
- networks = requested_networks )
+ nics = nics,
+ metadata = metadata_update )
sliver.instance_id = instance.id
sliver.instance_name = getattr(instance, 'OS-EXT-SRV-ATTR:instance_name')
-
- if sliver.instance_id and ("numberCores" in sliver.changed_fields):
- self.driver.update_instance_metadata(sliver.instance_id, {"cpu_cores": str(sliver.numberCores)})
+ else:
+ if metadata_update:
+ self.driver.update_instance_metadata(sliver.instance_id, metadata_update)
sliver.save()
sliver.enacted = datetime.now()
@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.shared_network_name:
+ network.network_id = network.template.shared_network_id
+ (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, shared=True)
+ 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()
if network.network_id:
self.driver.delete_network(network.network_id)
+ def save_network_template(self, template):
+ if (template.shared_network_name) and (not template.shared_network_id):
+ os_networks = self.driver.shell.quantum.list_networks(name=template.shared_network_name)['networks']
+ if os_networks:
+ template.shared_network_id = os_networks[0]["id"]
+
+ template.save()
+ template.enacted = datetime.now()
+ template.save(update_fields=['enacted'])
+
def find_or_make_template_for_network(self, name):
""" Given a network name, try to guess the right template for it """
# templates for networks we may encounter
if name=='nat-net':
- template_dict = {"name": "private-nat", "visibility": "private", "translation": "nat"}
+ template_dict = None # {"name": "private-nat", "visibility": "private", "translation": "nat"}
elif name=='sharednet1':
template_dict = {"name": "dedicated-public", "visibility": "public", "translation": "none"}
else:
if templates:
return templates[0]
+ if template_dict == None:
+ return None
+
template = NetworkTemplate(**template_dict)
template.save()
return template
+ def refresh_network_templates(self):
+ for template in NetworkTemplate.objects.all():
+ if (template.shared_network_name) and (not template.shared_network_id):
+ # this will cause us to try to fill in the shared_network_id
+ self.save_network_template(template)
+
def refresh_networks(self):
# get a list of all networks in the model
owner_slice = Slice.objects.get(tenant_id = os_network['tenant_id'])
template = self.find_or_make_template_for_network(os_network['name'])
- # 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']
+ if (template is None):
+ # This is our way of saying we don't want to auto-instantiate
+ # this network type.
+ continue
+
+ (subnet_id, subnet) = self.driver.get_network_subnet(os_network['id'])
if owner_slice:
#print "creating model object for OS network", os_network['name']