Пример #1
0
    def create_image_with_vm_disk(self, datastore_id, tmp_dir, image_id,
                                  vm_disk_os_path):
        """ Fills a temp image directory with a disk from a VM,
            then installs directory in the shared image folder.
        """
        dst_vmdk_path = os_datastore_path(datastore_id,
                                          "%s/%s.vmdk" % (tmp_dir, image_id))
        if os.path.exists(dst_vmdk_path):
            self._logger.warning("Unexpected disk %s present, overwriting" %
                                 dst_vmdk_path)
        dst_vmdk_ds_path = os_to_datastore_path(dst_vmdk_path)

        _vd_spec = self._prepare_virtual_disk_spec(
            vim.VirtualDiskManager.VirtualDiskType.thin,
            vim.VirtualDiskManager.VirtualDiskAdapterType.lsiLogic)

        self._manage_disk(vim.VirtualDiskManager.CopyVirtualDisk_Task,
                          sourceName=os_to_datastore_path(vm_disk_os_path),
                          destName=dst_vmdk_ds_path,
                          destSpec=_vd_spec)

        try:
            self.create_image(datastore_id, tmp_dir, image_id)
        except:
            self._logger.warning("Delete copied disk %s" % dst_vmdk_ds_path)
            self._manage_disk(vim.VirtualDiskManager.DeleteVirtualDisk_Task,
                              name=dst_vmdk_ds_path)
            raise
    def create_image_with_vm_disk(self, datastore_id, tmp_dir, image_id,
                                  vm_disk_os_path):
        """ Fills a temp image directory with a disk from a VM,
            then installs directory in the shared image folder.
        """
        dst_vmdk_path = os_datastore_path(datastore_id,
                                          "%s/%s.vmdk" % (tmp_dir, image_id))
        if os.path.exists(dst_vmdk_path):
            self._logger.warning(
                "Unexpected disk %s present, overwriting" % dst_vmdk_path)
        dst_vmdk_ds_path = os_to_datastore_path(dst_vmdk_path)

        _vd_spec = self._prepare_virtual_disk_spec(
            vim.VirtualDiskManager.VirtualDiskType.thin,
            vim.VirtualDiskManager.VirtualDiskAdapterType.lsiLogic)

        self._manage_disk(vim.VirtualDiskManager.CopyVirtualDisk_Task,
                          sourceName=os_to_datastore_path(vm_disk_os_path),
                          destName=dst_vmdk_ds_path,
                          destSpec=_vd_spec)

        try:
            self.create_image(datastore_id, tmp_dir, image_id)
        except:
            self._logger.warning("Delete copied disk %s" % dst_vmdk_ds_path)
            self._manage_disk(vim.VirtualDiskManager.DeleteVirtualDisk_Task,
                              name=dst_vmdk_ds_path)
            raise
Пример #3
0
 def move_file(self, src, dest):
     """Move directory or file using vim.fileManager.MoveFile
     """
     vim_task = self.file_manager.MoveFile(
         sourceName=os_to_datastore_path(src),
         destinationName=os_to_datastore_path(dest))
     self.wait_for_task(vim_task)
Пример #4
0
 def make_directory(self, path):
     """Make directory using vim.fileManager.MakeDirectory
     """
     try:
         self.file_manager.MakeDirectory(os_to_datastore_path(path), createParentDirectories=True)
     except vim.fault.FileAlreadyExists:
         pass
Пример #5
0
 def delete_file(self, path):
     """Delete directory or file using vim.fileManager.DeleteFile
     """
     try:
         vim_task = self.file_manager.DeleteFile(os_to_datastore_path(path))
         self.wait_for_task(vim_task)
     except vim.fault.FileNotFound:
         pass
Пример #6
0
 def make_directory(self, path):
     """Make directory using vim.fileManager.MakeDirectory
     """
     try:
         self.file_manager.MakeDirectory(os_to_datastore_path(path),
                                         createParentDirectories=True)
     except vim.fault.FileAlreadyExists:
         pass
Пример #7
0
 def delete_file(self, path):
     """Delete directory or file using vim.fileManager.DeleteFile
     """
     try:
         vim_task = self.file_manager.DeleteFile(os_to_datastore_path(path))
         self.wait_for_task(vim_task)
     except vim.fault.FileNotFound:
         pass
Пример #8
0
    def register_vm(self, datastore_id, vm_id):
        os_path = os_vmx_path(datastore_id, vm_id)
        if not os.path.isfile(os_path):
            raise VmNotFoundException("vmx path %s not found" % os_path)

        folder = self.vim_client.vm_folder
        resource_pool = self.vim_client.root_resource_pool
        vmx_datastore_path = os_to_datastore_path(os_path)

        task = folder.RegisterVM_Task(vmx_datastore_path, vm_id, False,
                                      resource_pool)
        self.vim_client.wait_for_task(task)
        self.vim_client.wait_for_vm_create(vm_id)
Пример #9
0
    def register_vm(self, datastore_id, vm_id):
        os_path = os_vmx_path(datastore_id, vm_id)
        if not os.path.isfile(os_path):
            raise VmNotFoundException("vmx path %s not found" % os_path)

        folder = self.vim_client.vm_folder
        resource_pool = self.vim_client.root_resource_pool
        vmx_datastore_path = os_to_datastore_path(os_path)

        task = folder.RegisterVM_Task(vmx_datastore_path, vm_id, False,
                                      resource_pool)
        self.vim_client.wait_for_task(task)
        self.vim_client.wait_for_vm_create(vm_id)
Пример #10
0
    def _copy_to_tmp_image(self, source_datastore, source_id, dest_datastore, dest_id):
        """ Copy an image into a temp location.
            1. Lock a tmp image destination file with an exclusive lock. This
            is to prevent the GC thread from garbage collecting directories
            that are actively being used.
            The temp directory name contains a random UUID to prevent
            collisions with concurrent copies
            2. Create the temp directory.
            3. Copy the metadata file over.
            4. Copy the vmdk over.

            @return the tmp image directory on success.
        """
        ds_type = self._get_datastore_type(dest_datastore)
        if ds_type == DatastoreType.VSAN:
            tmp_image_dir = os_datastore_path(dest_datastore,
                                              compond_path_join(IMAGE_FOLDER_NAME_PREFIX, dest_id),
                                              compond_path_join(TMP_IMAGE_FOLDER_NAME_PREFIX, str(uuid.uuid4())))
        else:
            tmp_image_dir = os_datastore_path(dest_datastore,
                                              compond_path_join(TMP_IMAGE_FOLDER_NAME_PREFIX, str(uuid.uuid4())))

        # Create the temp directory
        self._vim_client.make_directory(tmp_image_dir)

        # Copy the metadata file if it exists.
        source_meta = os_metadata_path(source_datastore, source_id, IMAGE_FOLDER_NAME_PREFIX)
        if os.path.exists(source_meta):
            try:
                dest_meta = os.path.join(tmp_image_dir, metadata_filename(dest_id))
                shutil.copy(source_meta, dest_meta)
            except:
                self._logger.exception("Failed to copy metadata file %s", source_meta)
                raise

        # Create the timestamp file
        self._create_image_timestamp_file(tmp_image_dir)

        _vd_spec = self._prepare_virtual_disk_spec(
            vim.VirtualDiskManager.VirtualDiskType.thin,
            vim.VirtualDiskManager.VirtualDiskAdapterType.lsiLogic)

        self._manage_disk(vim.VirtualDiskManager.CopyVirtualDisk_Task,
                          sourceName=vmdk_path(source_datastore, source_id, IMAGE_FOLDER_NAME_PREFIX),
                          destName=os_to_datastore_path(os.path.join(tmp_image_dir, "%s.vmdk" % dest_id)),
                          destSpec=_vd_spec)
        return tmp_image_dir
Пример #11
0
    def _copy_to_tmp_image(self, source_datastore, source_id, dest_datastore, dest_id):
        """ Copy an image into a temp location.
            1. Lock a tmp image destination file with an exclusive lock. This
            is to prevent the GC thread from garbage collecting directories
            that are actively being used.
            The temp directory name contains a random UUID to prevent
            collisions with concurrent copies
            2. Create the temp directory.
            3. Copy the metadata file over.
            4. Copy the vmdk over.

            @return the tmp image directory on success.
        """
        ds_type = self._get_datastore_type(dest_datastore)
        if ds_type == DatastoreType.VSAN:
            tmp_image_dir = os_datastore_path(dest_datastore,
                                              compond_path_join(IMAGE_FOLDER_NAME_PREFIX, dest_id),
                                              compond_path_join(TMP_IMAGE_FOLDER_NAME_PREFIX, str(uuid.uuid4())))
        else:
            tmp_image_dir = os_datastore_path(dest_datastore,
                                              compond_path_join(TMP_IMAGE_FOLDER_NAME_PREFIX, str(uuid.uuid4())))

        # Create the temp directory
        self._vim_client.make_directory(tmp_image_dir)

        # Copy the metadata file if it exists.
        source_meta = os_metadata_path(source_datastore, source_id, IMAGE_FOLDER_NAME_PREFIX)
        if os.path.exists(source_meta):
            try:
                dest_meta = os.path.join(tmp_image_dir, metadata_filename(dest_id))
                shutil.copy(source_meta, dest_meta)
            except:
                self._logger.exception("Failed to copy metadata file %s", source_meta)
                raise

        # Create the timestamp file
        self._create_image_timestamp_file(tmp_image_dir)

        _vd_spec = self._prepare_virtual_disk_spec(
            vim.VirtualDiskManager.VirtualDiskType.thin,
            vim.VirtualDiskManager.VirtualDiskAdapterType.lsiLogic)

        self._manage_disk(vim.VirtualDiskManager.CopyVirtualDisk_Task,
                          sourceName=vmdk_path(source_datastore, source_id, IMAGE_FOLDER_NAME_PREFIX),
                          destName=os_to_datastore_path(os.path.join(tmp_image_dir, "%s.vmdk" % dest_id)),
                          destSpec=_vd_spec)
        return tmp_image_dir
Пример #12
0
    def create_image(self, image_id, datastore_id):
        """ Create a temp image on given datastore, return its path.
        """
        datastore_type = self._get_datastore_type(datastore_id)
        if datastore_type == DatastoreType.VSAN:
            # on VSAN, tmp_dir is [datastore]/image_[image_id]/tmp_image_[uuid]
            # Because VSAN does not allow moving top-level directories, we place tmp_image
            # under image's dir.
            relative_path = os.path.join(compond_path_join(IMAGE_FOLDER_NAME_PREFIX, image_id),
                                         compond_path_join(TMP_IMAGE_FOLDER_NAME_PREFIX, str(uuid.uuid4())))
            tmp_dir = os_datastore_path(datastore_id, relative_path)
        else:
            # on VMFS/NFS/etc, tmp_dir is [datastore]/tmp_image_[uuid]
            tmp_dir = os_datastore_path(datastore_id,
                                        compond_path_join(TMP_IMAGE_FOLDER_NAME_PREFIX, str(uuid.uuid4())))

        self._vim_client.make_directory(tmp_dir)
        # return datastore path, so that it can be passed to nfc client
        return os_to_datastore_path(tmp_dir)
Пример #13
0
    def create_image(self, image_id, datastore_id):
        """ Create a temp image on given datastore, return its path.
        """
        datastore_type = self._get_datastore_type(datastore_id)
        if datastore_type == DatastoreType.VSAN:
            # on VSAN, tmp_dir is [datastore]/image_[image_id]/tmp_image_[uuid]
            # Because VSAN does not allow moving top-level directories, we place tmp_image
            # under image's dir.
            relative_path = os.path.join(compond_path_join(IMAGE_FOLDER_NAME_PREFIX, image_id),
                                         compond_path_join(TMP_IMAGE_FOLDER_NAME_PREFIX, str(uuid.uuid4())))
            tmp_dir = os_datastore_path(datastore_id, relative_path)
        else:
            # on VMFS/NFS/etc, tmp_dir is [datastore]/tmp_image_[uuid]
            tmp_dir = os_datastore_path(datastore_id,
                                        compond_path_join(TMP_IMAGE_FOLDER_NAME_PREFIX, str(uuid.uuid4())))

        self._vim_client.make_directory(tmp_dir)
        # return datastore path, so that it can be passed to nfc client
        return os_to_datastore_path(tmp_dir)
Пример #14
0
 def delete_file(self, path):
     """Delete directory or file using vim.fileManager.DeleteFile
     """
     self.file_manager.DeleteFile(os_to_datastore_path(path))
Пример #15
0
 def make_directory(self, path):
     """Make directory using vim.fileManager.MakeDirectory
     """
     self.file_manager.MakeDirectory(os_to_datastore_path(path),
                                     createParentDirectories=True)
Пример #16
0
 def move_file(self, src, dest):
     """Move directory or file using vim.fileManager.MoveFile
     """
     vim_task = self.file_manager.MoveFile(sourceName=os_to_datastore_path(src),
                                           destinationName=os_to_datastore_path(dest))
     self.wait_for_task(vim_task)