private static void reconfigVirtualMachine() throws Exception { System.out.println("ReConfigure The Virtual Machine .........."); VirtualMachineFileInfo vmFileInfo = new VirtualMachineFileInfo(); vmFileInfo.setLogDirectory("[" + datastore + "] " + vmName); vmFileInfo.setSnapshotDirectory("[" + datastore + "] " + vmName); vmFileInfo.setSuspendDirectory("[" + datastore + "] " + vmName); vmFileInfo.setVmPathName("[" + datastore + "] " + vmName + "/" + vmName + ".vmx"); VirtualMachineConfigSpec vmConfigSpec = new VirtualMachineConfigSpec(); vmConfigSpec.setFiles(vmFileInfo); ManagedObjectReference taskmor = vimPort.reconfigVMTask(getVmByVMname(vmName), vmConfigSpec); Object[] result = waitForValues( taskmor, new String[] {"info.state", "info.error"}, new String[] {"state"}, new Object[][] {new Object[] {TaskInfoState.SUCCESS, TaskInfoState.ERROR}}); if (result[0].equals(TaskInfoState.SUCCESS)) { System.out.println("ReConfigure The Virtual Machine .......... Done"); } else { System.out.println("Some Exception While Reconfiguring The VM " + result[0]); } }
/** * Creates the virtual machine. * * @throws RemoteException the remote exception * @throws Exception the exception */ void createVirtualMachine() throws RemoteException, RuntimeFaultFaultMsg, InvalidPropertyFaultMsg, InvalidCollectorVersionFaultMsg, OutOfBoundsFaultMsg, DuplicateNameFaultMsg, VmConfigFaultFaultMsg, InsufficientResourcesFaultFaultMsg, AlreadyExistsFaultMsg, InvalidDatastoreFaultMsg, FileFaultFaultMsg, InvalidStateFaultMsg, InvalidNameFaultMsg, TaskInProgressFaultMsg { ManagedObjectReference dcmor = getMOREFsInContainerByType(serviceContent.getRootFolder(), "Datacenter") .get(dataCenterName); if (dcmor == null) { System.out.println("Datacenter " + dataCenterName + " not found."); return; } ManagedObjectReference hostmor = getMOREFsInContainerByType(dcmor, "HostSystem").get(hostname); if (hostmor == null) { System.out.println("Host " + hostname + " not found"); return; } ManagedObjectReference crmor = (ManagedObjectReference) getMOREFs.entityProps(hostmor, new String[] {"parent"}).get("parent"); if (crmor == null) { System.out.println("No Compute Resource Found On Specified Host"); return; } ManagedObjectReference resourcepoolmor = (ManagedObjectReference) getMOREFs.entityProps(crmor, new String[] {"resourcePool"}).get("resourcePool"); ManagedObjectReference vmFolderMor = (ManagedObjectReference) getMOREFs.entityProps(dcmor, new String[] {"vmFolder"}).get("vmFolder"); VirtualMachineConfigSpec vmConfigSpec = createVmConfigSpec(virtualMachineName, dataStore, diskSize, crmor, hostmor); vmConfigSpec.setName(virtualMachineName); vmConfigSpec.setAnnotation("VirtualMachine Annotation"); vmConfigSpec.setMemoryMB(new Long(vmMemory)); vmConfigSpec.setNumCPUs(numCpus); vmConfigSpec.setGuestId(guestOsId); ManagedObjectReference taskmor = vimPort.createVMTask(vmFolderMor, vmConfigSpec, resourcepoolmor, hostmor); if (getTaskResultAfterDone(taskmor)) { System.out.printf("Success: Creating VM - [ %s ] %n", virtualMachineName); } else { String msg = "Failure: Creating [ " + virtualMachineName + "] VM"; throw new RuntimeException(msg); } ManagedObjectReference vmMor = (ManagedObjectReference) getMOREFs.entityProps(taskmor, new String[] {"info.result"}).get("info.result"); System.out.println("Powering on the newly created VM " + virtualMachineName); // Start the Newly Created VM. powerOnVM(vmMor); }
/** * Creates the vm config spec object. * * @param vmName the vm name * @param datastoreName the datastore name * @param diskSizeMB the disk size in mb * @param computeResMor the compute res moref * @param hostMor the host mor * @return the virtual machine config spec object * @throws Exception the exception */ VirtualMachineConfigSpec createVmConfigSpec( String vmName, String datastoreName, int diskSizeMB, ManagedObjectReference computeResMor, ManagedObjectReference hostMor) throws RuntimeFaultFaultMsg, InvalidPropertyFaultMsg { ConfigTarget configTarget = getConfigTargetForHost(computeResMor, hostMor); List<VirtualDevice> defaultDevices = getDefaultDevices(computeResMor, hostMor); VirtualMachineConfigSpec configSpec = new VirtualMachineConfigSpec(); String networkName = null; if (configTarget.getNetwork() != null) { for (int i = 0; i < configTarget.getNetwork().size(); i++) { VirtualMachineNetworkInfo netInfo = configTarget.getNetwork().get(i); NetworkSummary netSummary = netInfo.getNetwork(); if (netSummary.isAccessible()) { networkName = netSummary.getName(); break; } } } ManagedObjectReference datastoreRef = null; if (datastoreName != null) { boolean flag = false; for (int i = 0; i < configTarget.getDatastore().size(); i++) { VirtualMachineDatastoreInfo vdsInfo = configTarget.getDatastore().get(i); DatastoreSummary dsSummary = vdsInfo.getDatastore(); if (dsSummary.getName().equals(datastoreName)) { flag = true; if (dsSummary.isAccessible()) { datastoreRef = dsSummary.getDatastore(); } else { throw new RuntimeException("Specified Datastore is not accessible"); } break; } } if (!flag) { throw new RuntimeException("Specified Datastore is not Found"); } } else { boolean flag = false; for (int i = 0; i < configTarget.getDatastore().size(); i++) { VirtualMachineDatastoreInfo vdsInfo = configTarget.getDatastore().get(i); DatastoreSummary dsSummary = vdsInfo.getDatastore(); if (dsSummary.isAccessible()) { datastoreName = dsSummary.getName(); datastoreRef = dsSummary.getDatastore(); flag = true; break; } } if (!flag) { throw new RuntimeException("No Datastore found on host"); } } String datastoreVolume = getVolumeName(datastoreName); VirtualMachineFileInfo vmfi = new VirtualMachineFileInfo(); vmfi.setVmPathName(datastoreVolume); configSpec.setFiles(vmfi); // Add a scsi controller int diskCtlrKey = 1; VirtualDeviceConfigSpec scsiCtrlSpec = new VirtualDeviceConfigSpec(); scsiCtrlSpec.setOperation(VirtualDeviceConfigSpecOperation.ADD); VirtualLsiLogicController scsiCtrl = new VirtualLsiLogicController(); scsiCtrl.setBusNumber(0); scsiCtrlSpec.setDevice(scsiCtrl); scsiCtrl.setKey(diskCtlrKey); scsiCtrl.setSharedBus(VirtualSCSISharing.NO_SHARING); String ctlrType = scsiCtrl.getClass().getName(); ctlrType = ctlrType.substring(ctlrType.lastIndexOf(".") + 1); // Find the IDE controller VirtualDevice ideCtlr = null; for (int di = 0; di < defaultDevices.size(); di++) { if (defaultDevices.get(di) instanceof VirtualIDEController) { ideCtlr = defaultDevices.get(di); break; } } // Add a floppy VirtualDeviceConfigSpec floppySpec = new VirtualDeviceConfigSpec(); floppySpec.setOperation(VirtualDeviceConfigSpecOperation.ADD); VirtualFloppy floppy = new VirtualFloppy(); VirtualFloppyDeviceBackingInfo flpBacking = new VirtualFloppyDeviceBackingInfo(); flpBacking.setDeviceName("/dev/fd0"); floppy.setBacking(flpBacking); floppy.setKey(3); floppySpec.setDevice(floppy); // Add a cdrom based on a physical device VirtualDeviceConfigSpec cdSpec = null; if (ideCtlr != null) { cdSpec = new VirtualDeviceConfigSpec(); cdSpec.setOperation(VirtualDeviceConfigSpecOperation.ADD); VirtualCdrom cdrom = new VirtualCdrom(); VirtualCdromIsoBackingInfo cdDeviceBacking = new VirtualCdromIsoBackingInfo(); cdDeviceBacking.setDatastore(datastoreRef); cdDeviceBacking.setFileName(datastoreVolume + "testcd.iso"); cdrom.setBacking(cdDeviceBacking); cdrom.setKey(20); cdrom.setControllerKey(new Integer(ideCtlr.getKey())); cdrom.setUnitNumber(new Integer(0)); cdSpec.setDevice(cdrom); } // Create a new disk - file based - for the vm VirtualDeviceConfigSpec diskSpec = null; diskSpec = createVirtualDisk(datastoreName, diskCtlrKey, datastoreRef, diskSizeMB); // Add a NIC. the network Name must be set as the device name to create the NIC. VirtualDeviceConfigSpec nicSpec = new VirtualDeviceConfigSpec(); if (networkName != null) { nicSpec.setOperation(VirtualDeviceConfigSpecOperation.ADD); VirtualEthernetCard nic = new VirtualPCNet32(); VirtualEthernetCardNetworkBackingInfo nicBacking = new VirtualEthernetCardNetworkBackingInfo(); nicBacking.setDeviceName(networkName); nic.setAddressType("generated"); nic.setBacking(nicBacking); nic.setKey(4); nicSpec.setDevice(nic); } List<VirtualDeviceConfigSpec> deviceConfigSpec = new ArrayList<VirtualDeviceConfigSpec>(); deviceConfigSpec.add(scsiCtrlSpec); deviceConfigSpec.add(floppySpec); deviceConfigSpec.add(diskSpec); if (ideCtlr != null) { deviceConfigSpec.add(cdSpec); deviceConfigSpec.add(nicSpec); } else { deviceConfigSpec = new ArrayList<VirtualDeviceConfigSpec>(); deviceConfigSpec.add(nicSpec); } configSpec.getDeviceChange().addAll(deviceConfigSpec); return configSpec; }