I’m trying to automate a practical scenario with vConverter SDK. I have hosted vConverter Server at port 443 so that I can access the Converter Service via SOAP API. I have compiled the WSDL into C# stubs using wsdl.exe, and I’m trying to use the original .NET samples that come shipped with Converter SDK (in folder samples/DotNet). Everything is VMware v5.5.
Below, I have modified the BuildCloningParams method with manual Volume Cloning parameters for the Target Disk parameters. My objective is take the total space of the source volume and if it is beyond a certain size (60GB), then shrink it to its used space plus 2GB for buffer. This code below makes the changes, and I can see in the VS watch, that the conversion params in the Job Spec object have been updated to consider the highlighted. I have two 1TB disks and two small (5G) disks.
private ConverterCloningParams BuildCloningParams() { ConverterCloningParams cloningParams = new ConverterCloningParams(); ConverterStorageParams converterStorageParams = new ConverterStorageParams(); converterStorageParams.cloningMode = "volumeBasedCloning"; List targetDisks = new List(); string diskId = null; var computerInfo = _converterServer._converterService.ConverterQuery(_converterServer._converterServerContent.queryManager, _liveSourceSpec); List targetVolumes = new List(); foreach (var volume in computerInfo.hardwareInfo.storage.volume) { if (diskId == null) diskId = volume.diskId[0]; ConverterStorageParamsVolumeCloningParams targetVolume = new ConverterStorageParamsVolumeCloningParams { sourceVolumeId = volume.volumeId }; if (volume.capacityInBytes > (60L * (long)Math.Pow(1024, 3))) { targetVolume.newCapacityInBytes = volume.spaceUsedInBytes + (2L * (long)Math.Pow(1024,3)); targetVolume.resize = true; } targetVolumes.Add(targetVolume); } ConverterStorageParamsManagedTargetDiskParams targetDisk = new ConverterStorageParamsManagedTargetDiskParams { volumesToClone = targetVolumes.ToArray(), datastoreName = _datastore }; targetDisk.sourceDiskId = diskId; converterStorageParams.skipUnwantedFiles = true; targetDisk.diskType = "vmfsMonolithicFlat"; targetDisks.Add(targetDisk); converterStorageParams.vmxDatastoreName = _datastore; converterStorageParams.targetDiskParams = targetDisks.ToArray(); converterStorageParams.optimizedPartitionAlignment = true; cloningParams.storageParams = converterStorageParams; ConverterTargetVmSpec targetVMSpec = new ConverterTargetVmSpec(); targetVMSpec.name = _vcVMToCreate; targetVMSpec.location = BuildTargetVMLocation(); targetVMSpec.productVersion = "P2V'ed v0.1"; cloningParams.target = targetVMSpec; ConverterBasicHardwareParams hardwareParams = new ConverterBasicHardwareParams(); if (_vmMem > 0) { hardwareParams.memoryMB = _vmMem; hardwareParams.memoryMBSpecified = true; } if (_vmvCPUs > 0) { hardwareParams.numCPUs = _vmvCPUs; hardwareParams.numCPUsSpecified = true; } cloningParams.basicHardwareParams = hardwareParams; cloningParams.ovfParams = new ConverterOvfParams(); return cloningParams; }
BUT the SubmitJob errors out with ‘insufficient space’ message. This is because my source disk is 1TB and the target ESXi host is only 224GB. However, because I resized my two disks to 60GB odd, total should have been 120GB and this error shouldn’t have occurred. I dug into the logs created by Converter Service, and found out that the highlighted parameters are not being set.
conversionParams = (converter.params.ConversionParams) { --> dynamicType = , --> osInstanceBootLoaderEntry = (converter.info.BootConfigInfo.BootLoaderEntrySpec) null, --> doClone = true, --> cloningParams = (converter.params.CloningParams) { --> dynamicType = , --> target = (converter.params.TargetVmSpec) { --> dynamicType = , --> name = "VM1", --> location = (converter.params.TargetVmSpec.ManagedVmLocation) { --> dynamicType = , --> vimConnect = (converter.VimConnectionSpec) { --> dynamicType = , --> hostname = "10.17.136.65", --> port = , --> credentials = (converter.VimConnectionSpec.LoginVimCredentials) { --> dynamicType = , --> username = "root", --> password = (not shown), --> }, --> verifyPeer = true, --> sslThumbprint = "", --> }, --> vmFolder = , --> host = , --> resourcePool = , --> computeResource = , --> vmFolderName = , --> hostName = , --> resourcePoolName = , --> computeResourceName = , --> }, --> productVersion = "P2V'ed v0.1", --> hardwareVersion = , --> }, --> storageParams = (converter.params.StorageParams) { --> dynamicType = , --> cloningMode = "volumeBasedCloning", --> diskControllerType = , --> targetDiskParams = (converter.params.StorageParams.TargetDiskParams) [ --> (converter.params.StorageParams.ManagedTargetDiskParams) { --> dynamicType = , --> sourceDiskId = "disk-1002", --> volumesToClone = (converter.params.StorageParams.VolumeCloningParams) [ --> (converter.params.StorageParams.VolumeCloningParams) { --> dynamicType = , --> sourceVolumeId = "\WindowsBitmapDriverVolumeId=[DC-0C-9E-E5-00-00-10-00-00-00-00-00]", --> resize = , --> newCapacityInBytes = , --> newClusterSizeInBytes = , --> }, --> (converter.params.StorageParams.VolumeCloningParams) { --> dynamicType = , --> sourceVolumeId = "\WindowsBitmapDriverVolumeId=[DC-0C-9E-E5-00-00-40-1F-00-00-00-00]", --> resize = , --> newCapacityInBytes = , --> newClusterSizeInBytes = , --> }, --> (converter.params.StorageParams.VolumeCloningParams) { --> dynamicType = , --> sourceVolumeId = "\WindowsBitmapDriverVolumeId=[FE-35-CF-6D-00-00-10-00-00-00-00-00]", --> resize = , --> newCapacityInBytes = , --> newClusterSizeInBytes = , --> }, --> (converter.params.StorageParams.VolumeCloningParams) { --> dynamicType = , --> sourceVolumeId = "\WindowsBitmapDriverVolumeId=[FE-35-CF-6D-00-00-F0-BF-DE-00-00-00]", --> resize = , --> newCapacityInBytes = , --> newClusterSizeInBytes = , --> } --> ], --> diskType = "vmfsMonolithicFlat", --> lvg = , --> gpt = , --> datastoreName = "datastore1", --> } --> ]
Interestingly, if I do the same thing via Converter UI, the parameters are set correctly, and the job succeeds.
(converter.params.StorageParams) { --> dynamicType = , --> cloningMode = "volumeBasedCloning", --> diskControllerType = "scsiLsiLogicSAS", --> targetDiskParams = (converter.params.StorageParams.TargetDiskParams) [ --> (converter.params.StorageParams.ManagedTargetDiskParams) { --> dynamicType = , --> sourceDiskId = "disk-1001", --> volumesToClone = (converter.params.StorageParams.VolumeCloningParams) [ --> (converter.params.StorageParams.VolumeCloningParams) { --> dynamicType = , --> sourceVolumeId = "Disk#0_Partition#1", --> resize = false, --> newCapacityInBytes = , --> newClusterSizeInBytes = , --> }, --> (converter.params.StorageParams.VolumeCloningParams) { --> dynamicType = , --> sourceVolumeId = "\WindowsBitmapDriverVolumeId=[BA-A5-93-3F-00-00-80-02-00-00-00-00]", --> resize = false, --> newCapacityInBytes = , --> newClusterSizeInBytes = , --> }, --> (converter.params.StorageParams.VolumeCloningParams) { --> dynamicType = , --> sourceVolumeId = "\WindowsBitmapDriverVolumeId=[BA-A5-93-3F-00-00-20-6D-05-00-00-00]", --> resize = true, --> newCapacityInBytes = 62070537830, --> newClusterSizeInBytes = , --> }, --> (converter.params.StorageParams.VolumeCloningParams) { --> dynamicType = , --> sourceVolumeId = "Disk#0_Partition#4", --> resize = false, --> newCapacityInBytes = , --> newClusterSizeInBytes = , --> } --> ], --> diskType = "vmfsMonolithicFlat", --> lvg = false, --> gpt = false, --> datastoreName = "datastore1", --> } --> ], -->
I’m attaching both the server (SDK) and client (UI) logs for you to compare. Plus I’m attaching my sample project (VS 2012) as well.