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 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 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)))
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 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()