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
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)
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
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
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)
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
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)
def delete_file(self, path): """Delete directory or file using vim.fileManager.DeleteFile """ self.file_manager.DeleteFile(os_to_datastore_path(path))
def make_directory(self, path): """Make directory using vim.fileManager.MakeDirectory """ self.file_manager.MakeDirectory(os_to_datastore_path(path), createParentDirectories=True)
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)