VMware {code} Community
yitianli
Contributor
Contributor

Using ReconfigVM_Task modify disk size

Hello

I modify the disk size problems
Return success but did not actually modify
my code
--------------------------------------------------C#

else if (ops.Equals("edit"))
            {
                VirtualDisk disk = null;
                VirtualDiskFlatVer2BackingInfo diskfileBacking = new VirtualDiskFlatVer2BackingInfo();
                VirtualDevice[] test = vmConfigInfo.hardware.device;
                for (int k = 0; k < test.Length; k++)
                {
                    if (test[k].deviceInfo.label.Equals(cb.get_option("value")))
                    {
                        disk = (VirtualDisk)test[k];
                    }
                }
                if (disk != null)
                {
                    int size = 1024 * 1024 * (int.Parse(cb.get_option("disksize")));
                    disk.capacityInKB = size;
                    diskSpec.operation = VirtualDeviceConfigSpecOperation.edit;
                    //diskSpec.setFileOperation(VirtualDeviceConfigSpecFileOperation.replace);
                    diskSpec.device = disk;
                }
            }
            return diskSpec;

------------------------------------------------------
Thank

Tags (1)
0 Kudos
5 Replies
njain
Expert
Expert

You are missing "operationSpecified" parameter for diskSpec which is generated by C# stubs. The disk size modification should appear after including below code snippet:

diskSpec.operationSpecified = true;

0 Kudos
yitianli
Contributor
Contributor

Oh
I went under test
Thank you
0 Kudos
yitianli
Contributor
Contributor

Now the error occurs a change

The operation of the device to the "0" is invalid.

I come from China

0 Kudos
yitianli
Contributor
Contributor

Thank you very much
You are right.
I share with my code

0 Kudos
yitianli
Contributor
Contributor

using System;
using System.Text;
using System.Collections;
using System.Text.RegularExpressions;
using System.Security.Cryptography.X509Certificates;
using System.Net;
using System.IO;
using AppUtil;
using VimApi;
namespace VMware
{
    public class VMReconfig
    {
        private static VMUtils vmUtils = null;
        private static AppUtil.AppUtil cb = null;
        private ManagedObjectReference _virtualMachine = null;
        /// <summary>
        /// 获取vm
        /// </summary>
        /// <param name="vmName"></param>
        private void getVmMor(String vmName)
        {
            _virtualMachine = cb.getServiceUtil().GetDecendentMoRef(null, "VirtualMachine", vmName);
        }
       
        /// <summary>
        /// 重置开始
        /// </summary>
        private void reConfig()
        {
            String deviceType = cb.get_option("device");
            VirtualMachineConfigSpec vmConfigSpec = new VirtualMachineConfigSpec();
            if (deviceType.Equals("memory"))
            {
                Console.WriteLine("Reconfiguring The Virtual Machine For Memory Update "
                                  + cb.get_option("vmname"));
                try
                {
                    vmConfigSpec.memoryAllocation = getShares();
                }
                catch (Exception nfe)
                {
                    Console.WriteLine("Value of Memory update must "
                                      + "be either Custom or Integer");
                    return;
                }
            }
            else if (deviceType.Equals("cpu"))
            {
                Console.WriteLine("Reconfiguring The Virtual Machine For CPU Update "
                                  + cb.get_option("vmname"));
                try
                {
                    vmConfigSpec.cpuAllocation = getShares();
                }
                catch (Exception nfe)
                {
                    Console.WriteLine("Value of CPU update must "
                                      + "be either Custom or Integer");
                    return;
                }
            }
            else if (deviceType.Equals("disk"))
            {
                Console.WriteLine("Reconfiguring The Virtual Machine For Disk Update "
                                  + cb.get_option("vmname"));
                VirtualDeviceConfigSpec vdiskSpec = getDiskDeviceConfigSpec();//获取磁盘配置规格
                if (vdiskSpec != null)
                {
                    VirtualMachineConfigInfo vmConfigInfo = (VirtualMachineConfigInfo)cb.getServiceUtil().GetDynamicProperty(_virtualMachine, "config");//获取vm配置信息
                    int ckey = -1;
                    VirtualDevice[] test = vmConfigInfo.hardware.device;
                    for (int k = 0; k < test.Length; k++)
                    {
                        if (test[k].deviceInfo.label.Contains("SCSI"))//注意不稳定(硬盘父)
                        {
                            ckey = test[k].key;
                        }
                    }
                    if (ckey == -1)
                    {
                        int diskCtlrKey = 1;
                        VirtualDeviceConfigSpec scsiCtrlSpec = new VirtualDeviceConfigSpec();
                        scsiCtrlSpec.operation = VirtualDeviceConfigSpecOperation.add;
                        scsiCtrlSpec.operationSpecified = true;
                        VirtualLsiLogicController scsiCtrl = new VirtualLsiLogicController();
                        scsiCtrl.busNumber = 0;
                        scsiCtrlSpec.device = scsiCtrl;
                        scsiCtrl.key = diskCtlrKey;
                        scsiCtrl.sharedBus = VirtualSCSISharing.physicalSharing;
                        String ctlrType = scsiCtrl.GetType().Name;
                        vdiskSpec.device.controllerKey = scsiCtrl.key;
                        VirtualDeviceConfigSpec[] vdiskSpecArray = { scsiCtrlSpec, vdiskSpec };
                        vmConfigSpec.deviceChange = vdiskSpecArray;
                    }
                    else
                    {
                        vdiskSpec.device.controllerKey = ckey;
                        VirtualDeviceConfigSpec[] vdiskSpecArray = { vdiskSpec };
                        vmConfigSpec.deviceChange = vdiskSpecArray;
                    }
                }
                else
                {
                    return;
                }
            }
            else if (deviceType.Equals("nic"))
            {
                Console.WriteLine("Reconfiguring The Virtual Machine For NIC Update "
                                  + cb.get_option("vmname"));
                VirtualDeviceConfigSpec nicSpec = getNICDeviceConfigSpec();
                if (nicSpec != null)
                {
                    VirtualDeviceConfigSpec[] nicSpecArray = { nicSpec };
                    vmConfigSpec.deviceChange = nicSpecArray;
                }
                else
                {
                    return;
                }
            }
            else if (deviceType.Equals("cd"))
            {
                Console.WriteLine("Reconfiguring The Virtual Machine For CD Update "
                                  + cb.get_option("vmname"));
                VirtualDeviceConfigSpec cdSpec = getCDDeviceConfigSpec();
                if (cdSpec != null)
                {
                    VirtualDeviceConfigSpec[] cdSpecArray = { cdSpec };
                    vmConfigSpec.deviceChange = cdSpecArray;
                }
                else
                {
                    return;
                }
            }
            else
            {
                Console.WriteLine("Invlaid device type [memory|cpu|disk|nic|cd]");
                return;
            }
            ManagedObjectReference tmor = cb.getConnection()._service.ReconfigVM_Task(_virtualMachine, vmConfigSpec);
            monitorTask(tmor);
        }
        private void monitorTask(ManagedObjectReference tmor)
        {
            if (tmor != null)
            {
                String result = cb.getServiceUtil().WaitForTask(tmor);
                if (result.Equals("sucess"))
                {
                    Console.WriteLine("Task Completed Sucessfully");
                }
                else
                {
                    Console.WriteLine("Failure " + result);
                }
            }
        }
        private VirtualDeviceConfigSpec getCDDeviceConfigSpec()
        {
            String ops = cb.get_option("operation");
            VirtualDeviceConfigSpec cdSpec = new VirtualDeviceConfigSpec();
            VirtualMachineConfigInfo vmConfigInfo
               = (VirtualMachineConfigInfo)cb.getServiceUtil().GetDynamicProperty(
                   _virtualMachine, "config");
            if (ops.Equals("add"))
            {
                cdSpec.operation = VirtualDeviceConfigSpecOperation.add;
                cdSpec.operationSpecified = true;
                VirtualCdrom cdrom = new VirtualCdrom();
                VirtualCdromIsoBackingInfo cdDeviceBacking
                   = new VirtualCdromIsoBackingInfo();
                DatastoreSummary dsum = getDataStoreSummary();
                cdDeviceBacking.datastore = dsum.datastore;
                cdDeviceBacking.fileName = "[" + dsum.name + "] " + cb.get_option("value") + ".iso";
                VirtualDevice vd = getIDEController();
                cdrom.backing = cdDeviceBacking;
                cdrom.controllerKey = vd.key;
                cdrom.controllerKeySpecified = true;
                cdrom.unitNumber = -1;
                cdrom.unitNumberSpecified = true;
                cdrom.key = -100;
                cdSpec.device = cdrom;
                return cdSpec;
            }
            else
            {
                VirtualCdrom cdRemove = null;
                VirtualDevice[] test = vmConfigInfo.hardware.device;
                cdSpec.operation = VirtualDeviceConfigSpecOperation.remove;
                cdSpec.operationSpecified = true;
                for (int k = 0; k < test.Length; k++)
                {
                    if (test[k].deviceInfo.label.Equals(
                       cb.get_option("value")))
                    {
                        cdRemove = (VirtualCdrom)test[k];
                    }
                }
                if (cdRemove != null)
                {
                    cdSpec.device = cdRemove;
                }
                else
                {
                    Console.WriteLine("No device available " + cb.get_option("value"));
                    return null;
                }
            }
            return cdSpec;
        }
        private DatastoreSummary getDataStoreSummary()
        {
            DatastoreSummary dsSum = null;
            VirtualMachineRuntimeInfo vmRuntimeInfo
               = (VirtualMachineRuntimeInfo)cb.getServiceUtil().GetDynamicProperty(
                   _virtualMachine, "runtime");
            ManagedObjectReference envBrowser
               = (ManagedObjectReference)cb.getServiceUtil().GetDynamicProperty(
                   _virtualMachine, "environmentBrowser");
            ManagedObjectReference hmor = vmRuntimeInfo.host;
            if (hmor != null)
            {
                ConfigTarget configTarget
                   = cb.getConnection()._service.QueryConfigTarget(envBrowser, null);
                if (configTarget.datastore != null)
                {
                    for (int i = 0; i < configTarget.datastore.Length; i++)
                    {
                        VirtualMachineDatastoreInfo vdsInfo = configTarget.datastore[i];
                        DatastoreSummary dsSummary = vdsInfo.datastore;
                        if (dsSummary.accessible)
                        {
                            dsSum = dsSummary;
                            break;
                        }
                    }
                }
                return dsSum;
            }
            else
            {
                Console.WriteLine("No Datastore found");
                return null;
            }
        }
        private VirtualDevice getIDEController()
        {
            VirtualDevice ideCtlr = null;
            VirtualDevice[] defaultDevices = getDefaultDevices();
            for (int di = 0; di < defaultDevices.Length; di++)
            {
                if (defaultDevices[di].GetType().Name.Equals("VirtualIDEController"))
                {
                    ideCtlr = defaultDevices[di];
                    break;
                }
            }
            return ideCtlr;
        }
        private VirtualDevice[] getDefaultDevices()
        {
            VirtualMachineRuntimeInfo vmRuntimeInfo
               = (VirtualMachineRuntimeInfo)cb.getServiceUtil().GetDynamicProperty(
                     _virtualMachine, "runtime");
            ManagedObjectReference envBrowser
               = (ManagedObjectReference)cb.getServiceUtil().GetDynamicProperty(
                    _virtualMachine, "environmentBrowser");
            ManagedObjectReference hmor = vmRuntimeInfo.host;
            VirtualMachineConfigOption cfgOpt
               = cb.getConnection()._service.QueryConfigOption(envBrowser, null, null);
            VirtualDevice[] defaultDevs = null;
            if (cfgOpt == null)
            {
                throw new Exception("No VirtualHardwareInfo found in ComputeResource");
            }
            else
            {
                defaultDevs = cfgOpt.defaultDevice;
                if (defaultDevs == null)
                {
                    throw new Exception("No Datastore found in ComputeResource");
                }
            }
            return defaultDevs;
        }
        private VirtualDeviceConfigSpec getNICDeviceConfigSpec()
        {
            String ops = cb.get_option("operation");
            VirtualDeviceConfigSpec nicSpec = new VirtualDeviceConfigSpec();
            VirtualMachineConfigInfo vmConfigInfo
               = (VirtualMachineConfigInfo)cb.getServiceUtil().GetDynamicProperty(
                    _virtualMachine, "config");
            if (ops.Equals("add"))
            {
                String networkName = getNetworkName();
                if (networkName != null)
                {
                    nicSpec.operation = VirtualDeviceConfigSpecOperation.add;
                    nicSpec.operationSpecified = true;
                    VirtualEthernetCard nic = new VirtualPCNet32();
                    VirtualEthernetCardNetworkBackingInfo nicBacking
                       = new VirtualEthernetCardNetworkBackingInfo();
                    nicBacking.deviceName = networkName;
                    nic.addressType = "generated";
                    nic.backing = nicBacking;
                    nic.key = 4;
                    nicSpec.device = nic;
                }
                else
                {
                    return null;
                }
            }
            else if (ops.Equals("remove"))
            {
                VirtualEthernetCard nic = null;
                VirtualDevice[] test = vmConfigInfo.hardware.device;
                nicSpec.operation = VirtualDeviceConfigSpecOperation.remove;
                nicSpec.operationSpecified = true;
                for (int k = 0; k < test.Length; k++)
                {
                    if (test[k].deviceInfo.label.Equals(
                          cb.get_option("value")))
                    {
                        nic = (VirtualEthernetCard)test[k];
                    }
                }
                if (nic != null)
                {
                    nicSpec.device = nic;
                }
                else
                {
                    Console.WriteLine("No device available " + cb.get_option("value"));
                    return null;
                }
            }
            return nicSpec;
        }
        private String getNetworkName()
        {
            String networkName = null;
            VirtualMachineRuntimeInfo vmRuntimeInfo
               = (VirtualMachineRuntimeInfo)cb.getServiceUtil().GetDynamicProperty(
                   _virtualMachine, "runtime");
            ManagedObjectReference envBrowser
               = (ManagedObjectReference)cb.getServiceUtil().GetDynamicProperty(
                   _virtualMachine, "environmentBrowser");
            ManagedObjectReference hmor = vmRuntimeInfo.host;
            if (hmor != null)
            {
                ConfigTarget configTarget
                   = cb.getConnection()._service.QueryConfigTarget(envBrowser, null);
                if (configTarget.network != null)
                {
                    for (int i = 0; i < configTarget.network.Length; i++)
                    {
                        VirtualMachineNetworkInfo netInfo = configTarget.network[i];
                        NetworkSummary netSummary = netInfo.network;
                        if (netSummary.accessible)
                        {
                            if (netSummary.name.Equals(
                                  cb.get_option("value")))
                            {
                                networkName = netSummary.name;
                                break;
                            }
                        }
                    }
                    if (networkName == null)
                    {
                        Console.WriteLine("Specify the Correct Network Name");
                        return null;
                    }
                }
                Console.WriteLine("network Name " + networkName);
                return networkName;
            }
            else
            {
                Console.WriteLine("No Host is responsible to run this VM");
                return null;
            }
        }
        /// <summary>
        /// 获取硬盘设备的配置规格
        /// </summary>
        /// <returns></returns>
        private VirtualDeviceConfigSpec getDiskDeviceConfigSpec()
        {
            String ops = cb.get_option("operation");
            VirtualDeviceConfigSpec diskSpec = new VirtualDeviceConfigSpec();
            VirtualMachineConfigInfo vmConfigInfo
               = (VirtualMachineConfigInfo)cb.getServiceUtil().GetDynamicProperty(
                   _virtualMachine, "config");
            if (ops.Equals("add"))
            {
                VirtualDisk disk = new VirtualDisk();
                VirtualDiskFlatVer2BackingInfo diskfileBacking
                   = new VirtualDiskFlatVer2BackingInfo();
                String dsName
                   = getDataStoreName(int.Parse(cb.get_option("disksize")));
                int ckey = -1;
                int unitNumber = 0;
                VirtualDevice[] test = vmConfigInfo.hardware.device;
                for (int k = 0; k < test.Length; k++)
                {
                    if (test[k].deviceInfo.label.Contains("SCSI"))
                    {
                        ckey = test[k].key;
                    }
                }
                unitNumber = test.Length + 1;
                String fileName = "[" + dsName + "] " + cb.get_option("vmname")
                                + "/" + cb.get_option("value") + ".vmdk";
                diskfileBacking.fileName = fileName;
                diskfileBacking.diskMode = cb.get_option("diskmode");
                disk.controllerKey = ckey;
                disk.unitNumber = unitNumber;
                disk.controllerKeySpecified = true;
                disk.unitNumberSpecified = true;
                disk.backing = diskfileBacking;
                int size = 1024 * (int.Parse(cb.get_option("disksize")));
                disk.capacityInKB = size;
                disk.key = 0;
                diskSpec.operation = VirtualDeviceConfigSpecOperation.add;
                diskSpec.fileOperation = VirtualDeviceConfigSpecFileOperation.create;
                diskSpec.fileOperationSpecified = true;
                diskSpec.operationSpecified = true;
                diskSpec.device = disk;
            }
            else if (ops.Equals("remove"))
            {
                VirtualDisk disk = null;
                VirtualDiskFlatVer2BackingInfo diskfileBacking
                   = new VirtualDiskFlatVer2BackingInfo();
                VirtualDevice[] test = vmConfigInfo.hardware.device;
                for (int k = 0; k < test.Length; k++)
                {
                    if (test[k].deviceInfo.label.Equals(
                            cb.get_option("value")))
                    {
                        disk = (VirtualDisk)test[k];
                    }
                }
                if (disk != null)
                {
                    diskSpec.operation = VirtualDeviceConfigSpecOperation.remove;
                    diskSpec.operationSpecified = true;
                    diskSpec.fileOperation = VirtualDeviceConfigSpecFileOperation.destroy;
                    diskSpec.fileOperationSpecified = true;
                    diskSpec.device = disk;
                }
                else
                {
                    Console.WriteLine("No device found " + cb.get_option("value"));
                    return null;
                }
            }
           
            else if (ops.Equals("edit"))
            {
                VirtualDisk disk = null;
                VirtualDiskFlatVer2BackingInfo diskfileBacking = new VirtualDiskFlatVer2BackingInfo();
                VirtualDevice[] test = vmConfigInfo.hardware.device;
                for (int k = 0; k < test.Length; k++)
                {
                    if (test[k].deviceInfo.label.Equals(cb.get_option("value")))
                    {
                        disk = (VirtualDisk)test[k];
                    }
                }
                if (disk != null)
                {
                    int size = 1024 * 1024 * (int.Parse(cb.get_option("disksize")));
                    disk.capacityInKB = size;
                    diskSpec.operation = VirtualDeviceConfigSpecOperation.edit;
                    diskSpec.operationSpecified = true;
                    diskSpec.device = disk;
                }
            }
            return diskSpec;
        }
        private String getDataStoreName(int size)
        {
            String dsName = null;
            ManagedObjectReference[] datastores
               = (ManagedObjectReference[])cb.getServiceUtil().GetDynamicProperty(
                     _virtualMachine, "datastore");
            for (int i = 0; i < datastores.Length; i++)
            {
                DatastoreSummary ds
                   = (DatastoreSummary)cb.getServiceUtil().GetDynamicProperty(datastores[i],
                                                                             "summary");
                if (ds.freeSpace > size)
                {
                    dsName = ds.name;
                    i = datastores.Length + 1;
                }
            }
            return dsName;
        }
        private ResourceAllocationInfo getShares()
        {
            ResourceAllocationInfo raInfo = new ResourceAllocationInfo();
            SharesInfo sharesInfo = new SharesInfo();
            String val = cb.get_option("value");
            if (val.Equals(SharesLevel.high.ToString()))
            {
                sharesInfo.level = SharesLevel.high;
            }
            else if (val.Equals(SharesLevel.normal.ToString()))
            {
                sharesInfo.level = SharesLevel.normal;
            }
            else if (val.Equals(SharesLevel.low.ToString()))
            {
                sharesInfo.level = SharesLevel.low;
            }
            else
            {
                sharesInfo.level = SharesLevel.custom;
                sharesInfo.shares = int.Parse(val);
            }
            raInfo.shares = sharesInfo;
            return raInfo;
        }
        private Boolean customValidation()
        {
            Boolean flag = true;
            String device = cb.get_option("device");
            if (device.Equals("disk"))
            {
                if ((!cb.option_is_set("operation")) || (!cb.option_is_set("disksize"))
                      || (!cb.option_is_set("diskmode")))
                {
                    Console.WriteLine("For update disk operation, disksize "
                       + "and diskmode are the Mandatory options");
                    flag = false;
                }
                else if (int.Parse(cb.get_option("disksize")) <= 0)
                {
                    Console.WriteLine("Disksize must be a greater than zero");
                    flag = false;
                }
            }
            if (device.Equals("nic"))
            {
                if ((!cb.option_is_set("operation")))
                {
                    Console.WriteLine("For update nic operation is the Mandatory options");
                    flag = false;
                }
            }
            if (device.Equals("cd"))
            {
                if ((!cb.option_is_set("operation")))
                {
                    Console.WriteLine("For update cd operation is the Mandatory options");
                    flag = false;
                }
            }
            if (device.Equals("cpu") || device.Equals("memory"))
            {
                int val;
                Boolean b = int.TryParse(cb.get_option("value"), out val);
                if (!b)
                {
                }
                else if (int.Parse(cb.get_option("value")) <= 0)
                {
                    Console.WriteLine("CPU and Memory shares must be a greater than zero");
                    flag = false;
                }
            }
            if (cb.option_is_set("operation"))
            {
                if (cb.get_option("operation").Equals("add") || cb.get_option("operation").Equals("remove") || cb.get_option("operation").Equals("edit")) { }
                else
                {
                    Console.WriteLine("Operation must be either add or remove");
                    flag = false;
                }
            }
            return flag;
        }
        private static OptionSpec[] constructOptions()
        {
            OptionSpec[] useroptions = new OptionSpec[6];
            useroptions[0] = new OptionSpec("vmname", "String", 1
                                            , "Name of the virtual machine"
                                            , null);
            useroptions[1] = new OptionSpec("device", "String", 1,
                                            "Type of device {cpu|memory|disk|cd|nic}",
                                            null);
            useroptions[2] = new OptionSpec("operation", "String", 0
                                            , "{add|remove}"
                                            , null);
            useroptions[3] = new OptionSpec("value", "String", 1,
                                            "{numeric(For Memory and CPU) (high|"
                                           + "low|normal|numeric value|deviceId}",
                                            null);
            useroptions[4] = new OptionSpec("disksize", "Integer", 0
                                            , "Size of virtual disk"
                                            , null);
            useroptions[5] = new OptionSpec("diskmode", "String", 0,
                                            "{persistent|independent_persistent,"
                                            + "independent_nonpersistent}",
                                            null);
            return useroptions;
        }
        public static void Reconfig(String[] args)
        {
            VMReconfig obj = new VMReconfig();
            cb = AppUtil.AppUtil.initialize("VMReconfig"
                                    , VMReconfig.constructOptions()
                                   , args);
            Boolean valid = obj.customValidation();
            if (valid)
            {
                cb.connect();
                obj.getVmMor(cb.get_option("vmname"));
                if (obj._virtualMachine != null)
                {
                    vmUtils = new VMUtils(cb);
                    obj.reConfig();
                }
                else
                {
                    Console.WriteLine("Virtual Machine " + cb.get_option("vmname")
                                    + " Not Found");
                }
                cb.disConnect();
            }
            Console.WriteLine("Press enter to exit.");
            Console.Read();
        }
    }
}
0 Kudos