def manage_sliver(self): # Each VCPE object owns exactly one sliver. if self.deleted: return if (self.sliver is not None) and (self.sliver.image != self.image): self.sliver.delete() self.sliver = None if self.sliver is None: if not self.provider_service.slices.count(): raise XOSConfigurationError("The VCPE service has no slices") flavors = Flavor.objects.filter(name="m1.small") if not flavors: raise XOSConfigurationError("No m1.small flavor") node =self.pick_node() sliver = Sliver(slice = self.provider_service.slices.all()[0], node = node, image = self.image, creator = self.creator, deployment = node.site_deployment.deployment, flavor = flavors[0]) sliver.save() try: self.sliver = sliver super(VCPETenant, self).save() except: sliver.delete() raise
def adjust_scale(self, slice_hint, scale, max_per_node=None, exclusive_slices=[]): from core.models import Sliver # late import to get around order-of-imports constraint in __init__.py slices = [x for x in self.slices.all() if slice_hint in x.name] for slice in slices: while slice.slivers.all().count() > scale: s = slice.slivers.all()[0] # print "drop sliver", s s.delete() while slice.slivers.all().count() < scale: node = self.pick_node(slice, max_per_node, exclusive_slices) if not node: # no more available nodes break image = slice.default_image if not image: raise XOSConfigurationError("No default_image for slice %s" % slice.name) flavor = slice.default_flavor if not flavor: raise XOSConfigurationError("No default_flavor for slice %s" % slice.name) s = Sliver(slice=slice, node=node, creator=slice.creator, image=image, flavor=flavor, deployment=node.site_deployment.deployment) s.save()
def create(self, name = None): xos_args = self.get_xos_args(name=name) sliver = Sliver(**xos_args) sliver.caller = self.user sliver.save() self.info("Created Sliver '%s' on node '%s' using flavor '%s' and image '%s'" % (str(sliver), str(sliver.node), str(sliver.flavor), str(sliver.image)))
def save_site_allocation(self, noAct=False, reset=False): print "save_site_allocation, reset=", reset if (not self._site_allocation): # Must be a sliver that was just created, and has not site_allocation # field. return all_slice_slivers = self.slivers.all() for site_name in self._site_allocation.keys(): desired_allocation = self._site_allocation[site_name] # make a list of the slivers for this site slivers = [] for sliver in all_slice_slivers: if sliver.node.site_deployment.site.name == site_name: slivers.append(sliver) # delete extra slivers while (reset and len(slivers) > 0) or (len(slivers) > desired_allocation): sliver = slivers.pop() if (not noAct): print "deleting sliver", sliver sliver.delete() else: print "would delete sliver", sliver # add more slivers if (len(slivers) < desired_allocation): site = Site.objects.get(name=site_name) nodes = self.get_node_allocation([site]) if (not nodes): raise APIException(detail="no nodes in site %s" % site_name) while (len(slivers) < desired_allocation): # pick the least allocated node nodes = sorted(nodes, key=attrgetter("sliverCount")) node = nodes[0] sliver = Sliver(name=node.name, slice=self, node=node, image=self.default_image, flavor=self.default_flavor, creator=self.creator, deployment=node.site_deployment.deployment) sliver.caller = self.caller slivers.append(sliver) if (not noAct): print "added sliver", sliver sliver.save() else: print "would add sliver", sliver node.sliverCount = node.sliverCount + 1
def save_site_allocation(self, noAct = False, reset=False): print "save_site_allocation, reset=",reset if (not self._site_allocation): # Must be a sliver that was just created, and has not site_allocation # field. return all_slice_slivers = self.slivers.all() for site_name in self._site_allocation.keys(): desired_allocation = self._site_allocation[site_name] # make a list of the slivers for this site slivers = [] for sliver in all_slice_slivers: if sliver.node.site_deployment.site.name == site_name: slivers.append(sliver) # delete extra slivers while (reset and len(slivers)>0) or (len(slivers) > desired_allocation): sliver = slivers.pop() if (not noAct): print "deleting sliver", sliver sliver.delete() else: print "would delete sliver", sliver # add more slivers if (len(slivers) < desired_allocation): site = Site.objects.get(name = site_name) nodes = self.get_node_allocation([site]) if (not nodes): raise APIException(detail="no nodes in site %s" % site_name) while (len(slivers) < desired_allocation): # pick the least allocated node nodes = sorted(nodes, key=attrgetter("sliverCount")) node = nodes[0] sliver = Sliver(name=node.name, slice=self, node=node, image = self.default_image, flavor = self.default_flavor, creator = self.creator, deployment = node.site_deployment.deployment) sliver.caller = self.caller slivers.append(sliver) if (not noAct): print "added sliver", sliver sliver.save() else: print "would add sliver", sliver node.sliverCount = node.sliverCount + 1
def test_slice2(self): slice2Name = self.make_slice_name() slice2 = Slice(name = slice2Name, omf_friendly=True, site=self.testSite, creator=self.testUser) slice2=self.save_and_wait_for_enacted(slice2, nonempty_fields=["tenant_id"]) network2 = Network(name = slice2Name + "-pvt", template = self.get_network_template("private"), owner = slice2) network2=self.save_and_wait_for_enacted(network2, nonempty_fields=["network_id", "subnet_id", "router_id", "subnet"]) network2_slice2 = NetworkSlice(network=network2, slice=slice2) network2_slice2.save() # does not need to be enacted sliver2_1 = Sliver(image = self.testImage, creator=self.testUser, slice=slice2, node=self.testNode, deploymentNetwork=self.testDeployment) sliver2_1=self.save_and_wait_for_enacted(sliver2_1, nonempty_fields=["instance_id", "ip"]) ports = self.wait_for_ports(sliver2_1, count=2) self.verify_network_names(ports, [slice2.name, network2.name]) self.slice2 = slice2 self.network2 = network2
def select_by_user(user): if user.is_admin: qs = ReservedResource.objects.all() else: sliver_ids = [s.id for s in Sliver.select_by_user(user)] qs = ReservedResource.objects.filter(id__in=sliver_ids) return qs
def test_nat_net(self): slice3Name = self.make_slice_name() slice3 = Slice(name = slice3Name, omf_friendly=True, site=self.testSite, creator=self.testUser) slice3=self.save_and_wait_for_enacted(slice3, nonempty_fields=["tenant_id"]) network3 = Network(name = slice3Name + "-nat", template = self.get_network_template("private-nat"), owner = slice3) # note that router_id will not be filled in for nat-net, since nat-net has no routers network3=self.save_and_wait_for_enacted(network3, nonempty_fields=["network_id", "subnet_id", "subnet"]) network3_slice3 = NetworkSlice(network=network3, slice=slice3) network3_slice3.save() # does not need to be enacted sliver3_1 = Sliver(image = self.testImage, creator=self.testUser, slice=slice3, node=self.testNode, deploymentNetwork=self.testDeployment) sliver3_1=self.save_and_wait_for_enacted(sliver3_1, nonempty_fields=["instance_id", "ip"]) ports = self.wait_for_ports(sliver3_1, count=2) self.verify_network_names(ports, [slice3.name, "nat-net"])
def add_sliver(auth, fields): user = authenticate(username=auth.get('username'), password=auth.get('password')) images = _get_images(fields.get('image')) slices = _get_slices(fields.get('slice')) deployment_networks = _get_deployment_networks(fields.get('deploymentNetwork')) nodes = _get_nodes(fields.get('node')) if images: fields['image'] = images[0] if slices: fields['slice'] = slices[0] if deployment_networks: fields['deploymentNetwork'] = deployment_networks[0] if nodes: fields['node'] = nodes[0] sliver = Sliver(**fields) auth['tenant'] = sliver.slice.name sliver.os_manager = OpenStackManager(auth=auth, caller = user) sliver.save() return sliver
def add_sliver(auth, fields): user = authenticate(username=auth.get('username'), password=auth.get('password')) images = _get_images(fields.get('image')) slices = _get_slices(fields.get('slice')) deployment_networks = _get_deployment_networks( fields.get('deploymentNetwork')) nodes = _get_nodes(fields.get('node')) if images: fields['image'] = images[0] if slices: fields['slice'] = slices[0] if deployment_networks: fields['deploymentNetwork'] = deployment_networks[0] if nodes: fields['node'] = nodes[0] sliver = Sliver(**fields) auth['tenant'] = sliver.slice.name sliver.os_manager = OpenStackManager(auth=auth, caller=user) sliver.save() return sliver
def increase_slivers(self, site_name, count): site = self.get_site(site_name) hpc_slice = self.get_hpc_slices()[0] while (len(site.availNodes) > 0) and (count > 0): node = site.availNodes.pop() hostname = node.name sliver = Sliver(name=node.name, slice=hpc_slice, node=node, image = Image.objects.all()[0], creator = User.objects.get(email="*****@*****.**"), deploymentNetwork=node.deployment, numberCores = 1, ip=socket.gethostbyname(hostname)) sliver.save() print "created sliver", sliver site.hpcNodes.append(node) count = count - 1
def manage_sliver(self): # Each VCPE object owns exactly one sliver. if self.deleted: return if (self.sliver is not None) and (self.sliver.image != self.image): self.sliver.delete() self.sliver = None if self.sliver is None: if not self.provider_service.slices.count(): raise XOSConfigurationError("The VCPE service has no slices") flavors = Flavor.objects.filter(name="m1.small") if not flavors: raise XOSConfigurationError("No m1.small flavor") node = self.pick_node() sliver = Sliver(slice=self.provider_service.slices.all()[0], node=node, image=self.image, creator=self.creator, deployment=node.site_deployment.deployment, flavor=flavors[0]) sliver.save() try: self.sliver = sliver super(VCPETenant, self).save() except: sliver.delete() raise
def test_slice1(self): slice1Name = self.make_slice_name() slice1 = Slice(name = slice1Name, omf_friendly=True, site=self.testSite, creator=self.testUser) slice1=self.save_and_wait_for_enacted(slice1, nonempty_fields=["tenant_id"]) sliver1 = Sliver(image = self.testImage, creator=self.testUser, slice=slice1, node=self.testNode, deploymentNetwork=self.testDeployment) sliver1=self.save_and_wait_for_enacted(sliver1, nonempty_fields=["instance_id", "ip"]) # sliver1 should have only one port, its private network ports = self.wait_for_ports(sliver1, count=1) self.verify_network_names(ports, [slice1.name]) network1 = Network(name = slice1Name + "-pvt", template = self.get_network_template("private"), owner = slice1) network1=self.save_and_wait_for_enacted(network1, nonempty_fields=["network_id", "subnet_id", "router_id", "subnet"]) network1_slice1 = NetworkSlice(network=network1, slice=slice1) network1_slice1.save() # does not need to be enacted sliver1_2 = Sliver(image = self.testImage, creator=self.testUser, slice=slice1, node=self.testNode, deploymentNetwork=self.testDeployment) sliver1_2=self.save_and_wait_for_enacted(sliver1_2, nonempty_fields=["instance_id", "ip"]) ports = self.wait_for_ports(sliver1_2, count=2) self.verify_network_names(ports, [slice1.name, network1.name]) self.slice1 = slice1 self.network1 = network1
def adjust_scale(self, slice_hint, scale, max_per_node=None, exclusive_slices=[]): from core.models import Sliver # late import to get around order-of-imports constraint in __init__.py slices = [x for x in self.slices.all() if slice_hint in x.name] for slice in slices: while slice.slivers.all().count() > scale: s = slice.slivers.all()[0] # print "drop sliver", s s.delete() while slice.slivers.all().count() < scale: node = self.pick_node(slice, max_per_node, exclusive_slices) if not node: # no more available nodes break image = slice.default_image if not image: raise XOSConfigurationError( "No default_image for slice %s" % slice.name) flavor = slice.default_flavor if not flavor: raise XOSConfigurationError( "No default_flavor for slice %s" % slice.name) s = Sliver(slice=slice, node=node, creator=slice.creator, image=image, flavor=flavor, deployment=node.site_deployment.deployment) s.save()
def test_shared_private_net(self): # connect network2 to slice1 self.network2.permittedSlices.add(self.slice1) network2_slice1 = NetworkSlice(network=self.network2, slice=self.slice1) network2_slice1.save() sliver1_3 = Sliver(image = self.testImage, creator=self.testUser, slice=self.slice1, node=self.testNode, deploymentNetwork=self.testDeployment) sliver1_3=self.save_and_wait_for_enacted(sliver1_3, nonempty_fields=["instance_id", "ip"]) ports = self.wait_for_ports(sliver1_3, count=3) self.verify_network_names(ports, [self.slice1.name, self.network1.name, self.network2.name])
def run_sliver1(self): slice1Name = self.make_slice_name() slice1 = Slice(name=slice1Name, omf_friendly=True, site=self.testSite, creator=self.testUser) slice1 = self.save_and_wait_for_enacted(slice1, nonempty_fields=["tenant_id"]) sliver1 = Sliver(image=self.testImage, creator=self.testUser, slice=slice1, node=self.testNode, deploymentNetwork=self.testDeployment) sliver1 = self.save_and_wait_for_enacted( sliver1, nonempty_fields=["instance_id", "ip"])
def create(self, name=None, index=None): xos_args = self.get_xos_args(name=name, index=index) sliver = Sliver(**xos_args) sliver.caller = self.user sliver.no_sync = True sliver.save() self.deferred_sync.append(sliver) self.info( "Created Sliver '%s' on node '%s' using flavor '%s' and image '%s'" % (str(sliver), str(sliver.node), str( sliver.flavor), str(sliver.image)))