def reserve_vms(self, slice_urn, reservation, expiration=None, users=list()): # URNs of foreign RMs are not served current_cm_hrn = self.__config.CM_HRN cm_id = getattr(reservation, "get_component_manager_id") if callable(cm_id): cm_id = urn_to_hrn(cm_id())[0] if current_cm_hrn != cm_id: # No reservation is provided for URNs of other CMs return None # VMs are dynamic resource -> no collision will happen slice_hrn, hrn_type = urn_to_hrn(slice_urn) if not reservation.get_component_id() == None: server_hrn, hrn_type = urn_to_hrn(reservation.get_component_id()) server_name = server_hrn.split(".")[-1] VTAMDriver.logger.debug("server_name = " + server_name + ", server_hrn = " + server_hrn) else: server_name = self.__get_best_server() server_hrn = self.__config.CM_HRN + "." + server_name VTAMDriver.logger.debug("server_name = " + server_name + ", server_hrn = " + server_hrn) server = VTServer.objects.get(name=server_name).getChildObject() server_id = server.id if reservation.get_id(): if Reservation.objects.filter(sliceName=slice_hrn, projectName=slice_hrn, name=reservation.get_id()) or VirtualMachine.objects.filter(sliceName=slice_hrn, projectName=slice_hrn, name=reservation.get_id()): raise Exception("There is another VM with client id %s on this slice already <GENI PROVISIONED> or <GENI ALLOCATED>" %reservation.get_id()) reservation_name = reservation.get_id() else: reservation_name = str(random.randint(0,1000*1000)) if expiration == None: expiration = datetime.utcnow() + timedelta(hours=168) reserved_vm = Reservation() #reserved_vm.reservation_id = random.randint(0,1000) reserved_vm.server_id = server_id reserved_vm.set_slice_name(slice_hrn) reserved_vm.set_project_name(slice_hrn) reserved_vm.set_name(reservation_name) reserved_vm.set_valid_until(str(expiration)) reserved_vm.uuid = str(uuid.uuid4()) reserved_vm.set_disk_image(reservation.get_disk_image()) reserved_vm.save() if not reservation.get_sliver(): reservation.set_sliver(Sliver()) # Set information for sliver sliver_urn = hrn_to_urn(server_hrn+"." + slice_hrn.split(".")[-1] + "." +str(reservation_name), "sliver") VTAMDriver.logger.debug("XXX sliver_urn = " + sliver_urn) reservation.get_sliver().set_urn(sliver_urn) reservation.get_sliver().set_allocation_status(self.GENI_ALLOCATED) reservation.get_sliver().set_expiration(expiration) reservation.get_sliver().set_operational_status(self.GENI_NOT_READY) reservation.get_sliver().set_client_id(reservation_name) reservation.set_allocation_status = self.GENI_ALLOCATED #vm_params = self.__urn_to_vm_params(slice_urn) #self.__store_user_keys(users, vm_params) return reservation
def __vm_to_ssh_keys_params_list(self, vm, users=[]): params_list = list() params = {"project_uuid": vm.projectId, "slice_uuid": vm.sliceId, "vm_uuid": vm.uuid, } if not users: params_list.append(params) for user in users: # Reuse "params" structure by operating on a new structure params_user = copy.deepcopy(params) # Retrieve user string from URN user_id_key = "urn" if user_id_key not in user: # Get the other key that's not the user's keys # Depending on client: "urn", "name", ... user_id_key = set(user.keys()) - set(["keys"]) user_id_key = user_id_key.pop() try: user_name = urn_to_hrn(user[user_id_key])[0].split(".")[-1] except: user_name = user[user_id_key] params_user.update({"user_name": user_name,}) for key in user["keys"]: params_user_keys = copy.deepcopy(params_user) params_user_keys.update({"ssh_key": key,}) params_list.append(params_user_keys) return params_list
def __urn_to_vm_params(self, urn): #XXX For now, I prefer to have the same slice name as project name hrn, hrn_type = urn_to_hrn(urn) if hrn_type == "sliver": value = hrn.split(".")[-1] try: # XXX Why the int() conversion in the "sliver_part" return {"id":int(value)} except: # E.g. VMs from jFed slice_name = hrn.split(".")[-2] # Partial matching (RegEx...) return {"name":value, "sliceName__iregex":slice_name} elif hrn_type == "slice": return {"projectName":hrn, "sliceName":hrn} else: return None
def test_should_get_hrn_component_manager(self): cm_hrn, hrn_type = urn_to_hrn(self.component_manager_urn_template) print cm_hrn, hrn_type
def test_should_get_hrn_node(self): node_hrn, hrn_type = urn_to_hrn(self.node_urn_template) self.assertEquals(self.node_hrn, node_hrn) self.assertEquals(self.node_type, hrn_type)
def test_should_get_hrn_sliver(self): sliver_hrn, hrn_type = urn_to_hrn(self.sliver_urn_template) self.assertEquals(self.sliver_hrn, sliver_hrn) self.assertEquals(self.sliver_type, hrn_type)
def test_should_get_hrn_authority(self): authority_hrn, hrn_type = urn_to_hrn(self.authority_urn_template) self.assertEquals(self.authority_hrn, authority_hrn) self.assertEquals(self.authority_type, hrn_type)