def cloudlet_create_overlay_finish(self, context, instance, overlay_name, extra_properties=None): project_id, user_id = quotas_obj.ids_from_instance(context, instance) original_task_state = instance.task_state quotas = self._create_reservations(context,instance, original_task_state,project_id, user_id) overlay_meta_properties = { CloudletAPI.PROPERTY_KEY_CLOUDLET: True, CloudletAPI.PROPERTY_KEY_CLOUDLET_TYPE: CloudletAPI.IMAGE_TYPE_OVERLAY, } overlay_meta_properties.update(extra_properties or {}) recv_overlay_meta = self._cloudlet_create_image( context, instance, overlay_name, 'snapshot', extra_properties=overlay_meta_properties) instance.task_state = task_states.IMAGE_SNAPSHOT instance.save(expected_task_state=[None]) # api request version = self.client.target.version cctxt = self.client.prepare( server=nova_rpc._compute_host(None, instance), version=version ) cctxt.cast(context, 'cloudlet_overlay_finish', instance=instance,reservations=quotas.reservations, overlay_name=overlay_name, overlay_id=recv_overlay_meta['id']) return recv_overlay_meta
def cloudlet_handoff(self, context, instance, handoff_url, dest_token=None, dest_vmname=None, extra_properties=None): project_id, user_id = quotas_obj.ids_from_instance(context, instance) original_task_state = instance.task_state quotas = self._create_reservations(context, instance, original_task_state, project_id, user_id) recv_residue_meta = None parsed_handoff_url = urlsplit(handoff_url) residue_glance_id = None if parsed_handoff_url.scheme == "file": # save the VM residue to glance file dest_vm_name = parsed_handoff_url.netloc residue_meta_properties = { CloudletAPI.PROPERTY_KEY_CLOUDLET: True, CloudletAPI.PROPERTY_KEY_CLOUDLET_TYPE: CloudletAPI.IMAGE_TYPE_OVERLAY, } residue_meta_properties.update(extra_properties or {}) recv_residue_meta = self._cloudlet_create_image( context, instance, dest_vm_name, 'snapshot', extra_properties=residue_meta_properties) instance.task_state = task_states.IMAGE_SNAPSHOT instance.save(expected_task_state=[None]) residue_glance_id = recv_residue_meta['id'] elif parsed_handoff_url.scheme == "http": # handoff to other OpenStack # Send message to the destination ret_value = self._prepare_handoff_dest(urlparse(handoff_url), dest_token, instance, dest_vmname) # parse handoff URL from the return handoff_dest_addr = ret_value.get("handoff", None) if handoff_dest_addr is None: msg = "Cannot get handoff URL from the destination message" raise HandoffError(msg) handoff_url = "tcp://%s:%s" % (handoff_dest_addr['server_ip'], handoff_dest_addr['server_port']) # api request version = self.client.target.version cctxt = self.client.prepare(server=nova_rpc._compute_host( None, instance), version=version) cctxt.cast(context, 'cloudlet_handoff', instance=instance, reservations=quotas.reservations, handoff_url=handoff_url, residue_glance_id=residue_glance_id) return residue_glance_id
def get_ssh_console(self, ctxt, instance, console_type): # if self.client.can_send_version('3.2'): # version = '3.2' # else: # # NOTE(russellb) Havana compat # version = self._get_compat_version('3.0', '2.0') # instance = jsonutils.to_primitive(instance) version = self._get_compat_version('3.0', '2.0') instance = jsonutils.to_primitive(instance) cctxt = self.client.prepare(server=base_rpcapi._compute_host(None, instance), version=version) return cctxt.call(ctxt, 'get_ssh_console', instance=instance, console_type=console_type)
def cloudlet_handoff(self, context, instance, handoff_url, dest_token=None, dest_vmname=None, extra_properties=None): project_id, user_id = quotas_obj.ids_from_instance(context, instance) original_task_state = instance.task_state quotas = self._create_reservations(context,instance, original_task_state,project_id, user_id) recv_residue_meta = None parsed_handoff_url = urlsplit(handoff_url) residue_glance_id = None if parsed_handoff_url.scheme == "file": # save the VM residue to glance file dest_vm_name = parsed_handoff_url.netloc residue_meta_properties = { CloudletAPI.PROPERTY_KEY_CLOUDLET: True, CloudletAPI.PROPERTY_KEY_CLOUDLET_TYPE: CloudletAPI.IMAGE_TYPE_OVERLAY, } residue_meta_properties.update(extra_properties or {}) recv_residue_meta = self._cloudlet_create_image( context, instance, dest_vm_name, 'snapshot', extra_properties=residue_meta_properties ) instance.task_state = task_states.IMAGE_SNAPSHOT instance.save(expected_task_state=[None]) residue_glance_id = recv_residue_meta['id'] elif parsed_handoff_url.scheme == "http": # handoff to other OpenStack # Send message to the destination ret_value = self._prepare_handoff_dest(urlparse(handoff_url), dest_token, instance, dest_vmname) # parse handoff URL from the return handoff_dest_addr = ret_value.get("handoff", None) if handoff_dest_addr is None: msg = "Cannot get handoff URL from the destination message" raise HandoffError(msg) handoff_url = "tcp://%s:%s" % (handoff_dest_addr['server_ip'], handoff_dest_addr['server_port']) # api request version = self.client.target.version cctxt = self.client.prepare( server=nova_rpc._compute_host(None, instance), version=version ) cctxt.cast(context, 'cloudlet_handoff', instance=instance,reservations=quotas.reservations, handoff_url=handoff_url, residue_glance_id=residue_glance_id) return residue_glance_id
def cloudlet_create_base(self, context, instance, base_name, extra_properties=None): # add network info vifs = self.nova_api.network_api.get_vifs_by_instance(context, instance) net_info = [] for vif in vifs: vif_info = {'id': vif['uuid'], 'mac_address': vif['address']} net_info.append(vif_info) # add instance resource info base_sha256_uuid = sha256(str(instance['uuid'])).hexdigest() disk_properties = { CloudletAPI.PROPERTY_KEY_CLOUDLET: True, CloudletAPI.PROPERTY_KEY_CLOUDLET_TYPE: CloudletAPI.IMAGE_TYPE_BASE_DISK, CloudletAPI.PROPERTY_KEY_NETWORK_INFO: net_info, CloudletAPI.PROPERTY_KEY_BASE_UUID: base_sha256_uuid, } mem_properties = { CloudletAPI.PROPERTY_KEY_CLOUDLET: True, CloudletAPI.PROPERTY_KEY_CLOUDLET_TYPE: CloudletAPI.IMAGE_TYPE_BASE_MEM, CloudletAPI.PROPERTY_KEY_NETWORK_INFO: net_info, CloudletAPI.PROPERTY_KEY_BASE_UUID: base_sha256_uuid, } diskhash_properties = { CloudletAPI.PROPERTY_KEY_CLOUDLET: True, CloudletAPI.PROPERTY_KEY_CLOUDLET_TYPE: CloudletAPI.IMAGE_TYPE_BASE_DISK_HASH, CloudletAPI.PROPERTY_KEY_NETWORK_INFO: net_info, CloudletAPI.PROPERTY_KEY_BASE_UUID: base_sha256_uuid, } memhash_properties = { CloudletAPI.PROPERTY_KEY_CLOUDLET: True, CloudletAPI.PROPERTY_KEY_CLOUDLET_TYPE: CloudletAPI.IMAGE_TYPE_BASE_MEM_HASH, CloudletAPI.PROPERTY_KEY_NETWORK_INFO: net_info, CloudletAPI.PROPERTY_KEY_BASE_UUID: base_sha256_uuid, } disk_properties.update(extra_properties or {}) mem_properties.update(extra_properties or {}) diskhash_properties.update(extra_properties or {}) memhash_properties.update(extra_properties or {}) disk_name = base_name+'-disk' diskhash_name = base_name+'-disk-meta' mem_name = base_name+'-mem' memhash_name = base_name+'-mem-meta' snapshot = 'snapshot' recv_mem_meta = self._cloudlet_create_image( context, instance, mem_name, snapshot, extra_properties=mem_properties) recv_diskhash_meta = self._cloudlet_create_image( context, instance, diskhash_name, snapshot, extra_properties=diskhash_properties) recv_memhash_meta = self._cloudlet_create_image( context, instance, memhash_name, snapshot, extra_properties=memhash_properties) # add reference for the other base vm information to get it later disk_properties.update({ CloudletAPI.IMAGE_TYPE_BASE_MEM: recv_mem_meta['id'], CloudletAPI.IMAGE_TYPE_BASE_DISK_HASH: recv_diskhash_meta['id'], CloudletAPI.IMAGE_TYPE_BASE_MEM_HASH: recv_memhash_meta['id'], }) recv_disk_meta = self._cloudlet_create_image( context, instance, disk_name, snapshot, extra_properties=disk_properties) instance.task_state = task_states.IMAGE_SNAPSHOT instance.save(expected_task_state=[None]) # api request version = self.client.target.version cctxt = self.client.prepare( server=nova_rpc._compute_host(None, instance), version=version ) cctxt.call(context, 'cloudlet_create_base', instance=instance, vm_name=base_name, disk_meta_id=recv_disk_meta['id'], memory_meta_id=recv_mem_meta['id'], diskhash_meta_id=recv_diskhash_meta['id'], memoryhash_meta_id=recv_memhash_meta['id'] ) return recv_disk_meta, recv_mem_meta
def cloudlet_create_base(self, context, instance, base_name, extra_properties=None): # add network info vifs = self.nova_api.network_api.get_vifs_by_instance( context, instance) net_info = [] for vif in vifs: vif_info = {'id': vif['uuid'], 'mac_address': vif['address']} net_info.append(vif_info) # add instance resource info base_sha256_uuid = sha256(str(instance['uuid'])).hexdigest() disk_properties = { CloudletAPI.PROPERTY_KEY_CLOUDLET: True, CloudletAPI.PROPERTY_KEY_CLOUDLET_TYPE: CloudletAPI.IMAGE_TYPE_BASE_DISK, CloudletAPI.PROPERTY_KEY_NETWORK_INFO: net_info, CloudletAPI.PROPERTY_KEY_BASE_UUID: base_sha256_uuid, } mem_properties = { CloudletAPI.PROPERTY_KEY_CLOUDLET: True, CloudletAPI.PROPERTY_KEY_CLOUDLET_TYPE: CloudletAPI.IMAGE_TYPE_BASE_MEM, CloudletAPI.PROPERTY_KEY_NETWORK_INFO: net_info, CloudletAPI.PROPERTY_KEY_BASE_UUID: base_sha256_uuid, } diskhash_properties = { CloudletAPI.PROPERTY_KEY_CLOUDLET: True, CloudletAPI.PROPERTY_KEY_CLOUDLET_TYPE: CloudletAPI.IMAGE_TYPE_BASE_DISK_HASH, CloudletAPI.PROPERTY_KEY_NETWORK_INFO: net_info, CloudletAPI.PROPERTY_KEY_BASE_UUID: base_sha256_uuid, } memhash_properties = { CloudletAPI.PROPERTY_KEY_CLOUDLET: True, CloudletAPI.PROPERTY_KEY_CLOUDLET_TYPE: CloudletAPI.IMAGE_TYPE_BASE_MEM_HASH, CloudletAPI.PROPERTY_KEY_NETWORK_INFO: net_info, CloudletAPI.PROPERTY_KEY_BASE_UUID: base_sha256_uuid, } disk_properties.update(extra_properties or {}) mem_properties.update(extra_properties or {}) diskhash_properties.update(extra_properties or {}) memhash_properties.update(extra_properties or {}) disk_name = base_name + '-disk' diskhash_name = base_name + '-disk-meta' mem_name = base_name + '-mem' memhash_name = base_name + '-mem-meta' snapshot = 'snapshot' recv_mem_meta = self._cloudlet_create_image( context, instance, mem_name, snapshot, extra_properties=mem_properties) recv_diskhash_meta = self._cloudlet_create_image( context, instance, diskhash_name, snapshot, extra_properties=diskhash_properties) recv_memhash_meta = self._cloudlet_create_image( context, instance, memhash_name, snapshot, extra_properties=memhash_properties) # add reference for the other base vm information to get it later disk_properties.update({ CloudletAPI.IMAGE_TYPE_BASE_MEM: recv_mem_meta['id'], CloudletAPI.IMAGE_TYPE_BASE_DISK_HASH: recv_diskhash_meta['id'], CloudletAPI.IMAGE_TYPE_BASE_MEM_HASH: recv_memhash_meta['id'], }) recv_disk_meta = self._cloudlet_create_image( context, instance, disk_name, snapshot, extra_properties=disk_properties) instance.task_state = task_states.IMAGE_SNAPSHOT instance.save(expected_task_state=[None]) # api request version = self.client.target.version cctxt = self.client.prepare(server=nova_rpc._compute_host( None, instance), version=version) cctxt.call(context, 'cloudlet_create_base', instance=instance, vm_name=base_name, disk_meta_id=recv_disk_meta['id'], memory_meta_id=recv_mem_meta['id'], diskhash_meta_id=recv_diskhash_meta['id'], memoryhash_meta_id=recv_memhash_meta['id']) return recv_disk_meta, recv_mem_meta