/** * 创建虚拟机,CreateVM_Task * * @param url * @param username * @param password * @param dcId * @param haId * @param rpId * @param name * @param descr * @param guestId * @param numCpus * @param numCores * @param memoryMB * @param dsId * @param diskSizeMB * @return */ public static Map<String, Object> createVM( String url, String username, String password, String dcId, String haId, String rpId, String name, String descr, String guestId, int numCpus, int numCores, long memoryMB, String dsId, long diskSizeMB) { // CreateVM_Task // http://pubs.vmware.com/vsphere-50/index.jsp?topic=%2Fcom.vmware.wssdk.apiref.doc_50%2Fvim.Folder.html&path=5_0_2_5_3_75 // VirtualMachineConfigSpec // http://pubs.vmware.com/vsphere-50/index.jsp?topic=%2Fcom.vmware.wssdk.apiref.doc_50%2Fvim.vm.ConfigSpec.html // 1.VimBindingStub对象执行createVM_Task方法 // 共4个参数,_this,config,pool,host // 其中host可以不指定,但是pool需要有权限Resource.AssignVMToPool // 1._this:从dc获取一下vmFolder // 公司环境的vmFolder树形结构itimsDC(datacenter-2)-->vm(group-v3) // 公司环境中的主机群集属性结果itimsDC(datacenter-2)-->host,group-h4(datacenter-2)-->itimsHA(domain-c73) // 在管理系统中的云对应主机群集,在保存主机群集的id同时也保存dc的id // ManagedObjectReference vmFolderMor = // cb.getServiceUtil().getMoRefProp( // dcmor, "vmFolder"); // 2.config:VirtualMachineConfigSpec虚拟机配置 // 3.pool:从dc的hostFolder对象下获取ComputeResource // 公司环境的ComputeResource树形结构itimsDC(datacenter-2)-->host(group-h4)-->itimsHA(domain-c73)-->Resources(resgroup-74)-->testRP(resgroup-121) // vim代码:从主机目录中获取计算资源 // ManagedObjectReference hfmor = // cb.getServiceUtil().getMoRefProp(dcmor, // "hostFolder"); // ArrayList crmors = cb.getServiceUtil().getDecendentMoRefs(hfmor, // "ComputeResource"); // 4.host:主机不指定,由计算资源自动分配 HashMap<String, Object> resultMap = new HashMap<String, Object>(); try { VIMCache cache = VIMCache.getInstance(url, username, password); // 获取_this和pool ManagedObjectReference dcMor = cache.getDatacenter(dcId); // 获取数据中心下的虚拟机文件夹 ManagedObjectReference vmFolderMor = cache.getVMFolder(dcId); // 获取主机群集 ManagedObjectReference haMor = cache.getComputeResource(haId); if (haMor == null) { haMor = cache.getClusterComputeResource(haId); } // 获取资源池 ManagedObjectReference rpMor = cache.getResourcePool(rpId); // 获取数据存储 ManagedObjectReference dsMor = cache.getDatastore(dsId); if ((dcMor != null) && (vmFolderMor != null) && (haMor != null) && (rpMor != null) && (dsMor != null)) { ExtendedAppUtil ecb = getECB(url, username, password); // 创建VirtualMachineConfigSpec // http://pubs.vmware.com/vsphere-50/topic/com.vmware.wssdk.apiref.doc_50/vim.vm.ConfigSpec.html VirtualMachineConfigSpec vmConfig = createVmConfigSpec( ecb, dcMor, haMor, name, descr, guestId, numCpus, numCores, memoryMB, dsMor, diskSizeMB); ManagedObjectReference taskMor = ecb.getServiceConnection3() .getService() .createVM_Task(vmFolderMor, vmConfig, rpMor, null); execTaskAndRecordResultMap(ecb, taskMor, resultMap); // 如果虚拟机创建成功,获取虚拟机对应的主机id if (Util.normalizeObject(resultMap.get(INFO_STATE)).toString().equals(STATE_OK)) { String vmId = Util.normalizeObject(resultMap.get(INFO_RESULT)).toString(); if (!vmId.equals("")) { ManagedObjectReference vmMor = cache.getVirtualMachine(vmId); Object runtime = getDynamicProperty(ecb, vmMor, DYNAMICPROPERTY_RUNTIME); if ((runtime != null) && (runtime instanceof VirtualMachineRuntimeInfo)) { VirtualMachineRuntimeInfo runtimeInfo = (VirtualMachineRuntimeInfo) runtime; if (runtimeInfo.getHost() != null) { String hoId = runtimeInfo.getHost().get_value(); resultMap.put(INFO_RESULT2, hoId); } } } } } else { if (dcMor == null) { recordResultMapError(resultMap, "数据中心'" + dcId + "'不存在"); } if (vmFolderMor == null) { recordResultMapError(resultMap, "数据中心'" + dcId + "'的vmFolder不存在"); } if (haMor == null) { recordResultMapError(resultMap, "主机群集'" + haId + "'不存在"); } if (rpMor == null) { recordResultMapError(resultMap, "'资源池" + rpId + "'不存在"); } if (dsMor == null) { recordResultMapError(resultMap, "'数据存储" + dsId + "'不存在"); } } } catch (Exception e) { LOGGER.error("createVM error, ", e); recordResultMapException(resultMap, e); } return resultMap; }