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
Exemple #2
0
    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
Exemple #3
0
    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
Exemple #4
0
    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
Exemple #7
0
    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