pythonvmwareesxipyvmomi

How do you delete a virtual disk with pyvmomi


I am trying to write a Python program using the pyvmomi library to "erase" a virtual hard drive associated with a VM. The way this is done manually is to remove the virtual disk and create a new virtual disk with the same specs. I am expecting that I will need to do the same thing with pyvmomi so I have started down that path. My issue is that I can use ReconfigVM_Task to remove the virtual drive but that leaves the VMDK file itself.

I originally tried using DeleteVStorageObject_Task (since DeleteVirtualDisk_Task is deprecated) to remove the virtual disk file but that requires the ID of the object (the VMDK file) which I am unable to find anywhere. Theoretically that's available from the VirtualDisk property vDiskId but that is null. In further research it seems to only be populated for first class disks.

So I am instead trying to delete the VMDK file directly using DeleteDatastoreFile_Task but when I do that I end up with a XXXX-flat.vmdk file in the datastore so it seems to not actually delete the file.

Any idea on where I'm going wrong here or how to better do this? The VMWare SDK documentation for pyvmomi is...lacking.

Thanks!


Solution

  • You'll have to perform a ReconfigVM_Task operation. The keypoint for this is that the file operation should be destroy. Here's the raw output from performing the operation in the UI:

    spec = vim.vm.ConfigSpec()
    spec_deviceChange_0 = vim.vm.device.VirtualDeviceSpec()
    spec_deviceChange_0.fileOperation = 'destroy'
    spec_deviceChange_0.device = vim.vm.device.VirtualDisk()
    spec_deviceChange_0.device.shares = vim.SharesInfo()
    spec_deviceChange_0.device.shares.shares = 1000
    spec_deviceChange_0.device.shares.level = 'normal'
    spec_deviceChange_0.device.capacityInBytes = 8589934592
    spec_deviceChange_0.device.storageIOAllocation = vim.StorageResourceManager.IOAllocationInfo()
    spec_deviceChange_0.device.storageIOAllocation.shares = vim.SharesInfo()
    spec_deviceChange_0.device.storageIOAllocation.shares.shares = 1000
    spec_deviceChange_0.device.storageIOAllocation.shares.level = 'normal'
    spec_deviceChange_0.device.storageIOAllocation.limit = -1
    spec_deviceChange_0.device.storageIOAllocation.reservation = 0
    spec_deviceChange_0.device.backing = vim.vm.device.VirtualDisk.FlatVer2BackingInfo()
    spec_deviceChange_0.device.backing.backingObjectId = ''
    spec_deviceChange_0.device.backing.fileName = '[kruddy_2TB_01] web01/web01_2.vmdk'
    spec_deviceChange_0.device.backing.split = False
    spec_deviceChange_0.device.backing.writeThrough = False
    spec_deviceChange_0.device.backing.datastore = search_index.FindByUuid(None, "datastore-14", True, True)
    spec_deviceChange_0.device.backing.eagerlyScrub = True
    spec_deviceChange_0.device.backing.contentId = 'e26f44020e7897006bec81b1fffffffe'
    spec_deviceChange_0.device.backing.thinProvisioned = False
    spec_deviceChange_0.device.backing.diskMode = 'persistent'
    spec_deviceChange_0.device.backing.digestEnabled = False
    spec_deviceChange_0.device.backing.sharing = 'sharingNone'
    spec_deviceChange_0.device.backing.uuid = '6000C292-7895-54ee-a55c-49d0036ef1bb'
    spec_deviceChange_0.device.controllerKey = 200
    spec_deviceChange_0.device.unitNumber = 0
    spec_deviceChange_0.device.nativeUnmanagedLinkedClone = False
    spec_deviceChange_0.device.capacityInKB = 8388608
    spec_deviceChange_0.device.deviceInfo = vim.Description()
    spec_deviceChange_0.device.deviceInfo.summary = '8,388,608 KB'
    spec_deviceChange_0.device.deviceInfo.label = 'Hard disk 2'
    spec_deviceChange_0.device.diskObjectId = '148-3000'
    spec_deviceChange_0.device.key = 3000
    spec_deviceChange_0.operation = 'remove'
    spec.deviceChange = [spec_deviceChange_0]
    spec.cpuFeatureMask = []
    managedObject.ReconfigVM_Task(spec)