根据vim25.jar 提供的虚拟机创建任务接口 VimPortType.createVMTask(),可以实现满足自己配置需求的一个虚拟机, 而且 VMware 在其提供的 vSphereSDK 提供了创建虚拟机的 sample(详见 ~\VMware-vSphereSDK-6.5.0-4571253\SDK\vsphere-ws\java\JAXWS\samples\com\vmware\vm\VMCreate.java)。
虚拟机的创建包括虚拟机的基本资源的配置(cpu、内存、网络等)、虚拟机所属主机、datacenter 及虚拟机磁盘的创建。使用 vSphere API 创建虚拟机还是比较简单的,配置好虚拟机的参数,调用 VimPortType.createVMTask() 接口即可。
以下为根据vim.jar 及参考 VMCreate.java 创建虚拟机的代码,此处虚拟机的配置取自于一个已经存在的虚拟机,目的是还原一个虚拟机,并为新建的虚拟机启动了CBT功能:
// 虚拟机客机连接session
private AbstractVmClientSessionVmApi vmClientSession = null;
public VMOptApiSupport(AbstractVmClientSessionVmApi vmClientSession) {
this.vmClientSession = vmClientSession;
}
private static final Logger LOG = LoggerFactory.getLogger(VMOptApiSupport.class);
/**
* @Title: createVM
* @Description: 创建虚拟机
* @param vm 虚拟机对象VirtualMachine
* @param vmNameNew 新建的虚拟机名称
* @throws Exception
* @see cn.xxx.vms.api.VMOptApi#createVM(java.lang.String)
*/
@Override
public void createVM(VirtualMachine vm, String vmNameNew) throws Exception {
try {
VMCreate vmCreate = new VMCreate(vmClientSession);
// 获取原虚拟机所在主机名
String hostName = vm.getHostName();
vmCreate.setHostName(hostName);
// 获取vm folder 的父对象 数据中心对象
String dataCenterName = vm.getDatacenter();
// 设置创建虚拟机所需信息
VirtualMachineConfigInfo configInfo = vm.getConfig();
VirtualMachineConfigSummary summary = vm.getSummary().getConfig();
vmCreate.setDataCenterName(dataCenterName);
vmCreate.setVirtualMachineName(vmNameNew);
vmCreate.setAnnotation(configInfo.getAnnotation());
vmCreate.setDataStore(configInfo.getDatastoreUrl().get(0).getName());
vmCreate.setChangeTrackingEnabled(configInfo.isChangeTrackingEnabled());
vmCreate.setMemorySize(summary.getMemorySizeMB().toString());
vmCreate.setCpuCount(summary.getNumCpu().toString());
vmCreate.setGuestFullName(configInfo.getAlternateGuestName());
vmCreate.setGuestOsId(configInfo.getGuestId());
vmCreate.setFirmware(configInfo.getFirmware());
vmCreate.setTools(configInfo.getTools());
// 虚拟机版本,ESXi 5.5 最大支持 vmx-8
String hostVersion = vmClientSession.getServiceContent().getAbout().getApiVersion();
String vmVersion = vm.getVersion();
if (hostVersion != null && vmVersion != null) {
if ("6.0".compareTo(hostVersion) > 0 && vmVersion.compareTo("vmx-08") > 0) {
vmCreate.setVersion("vmx-08");
} else {
vmCreate.setVersion(vm.getVersion());
}
}
// 获取磁盘大小
vmCreate.setDiskSize(String.valueOf(vm.getDiskSizeMB()));
// 创建虚拟机
vmCreate.run();
} catch (RemoteException e) {
e.printStackTrace();
throw new Exception("远程连接服务器异常", e);
} catch (InvalidPropertyFaultMsg e) {
e.printStackTrace();
throw new Exception("无效的检索属性", e);
} catch (RuntimeFaultFaultMsg e) {
e.printStackTrace();
throw new Exception("虚拟机创建失败", e);
} catch (VmConfigFaultFaultMsg e) {
e.printStackTrace();
throw new Exception("虚拟机配置错误", e);
} catch (AlreadyExistsFaultMsg e) {
e.printStackTrace();
throw new Exception("虚拟机已存在", e);
} catch (InvalidDatastoreFaultMsg e) {
e.printStackTrace();
throw new Exception("无效的数据存储", e);
} catch (FileFaultFaultMsg e) {
e.printStackTrace();
throw new Exception("文件错误", e);
} catch (InvalidStateFaultMsg e) {
e.printStackTrace();
throw new Exception("无效状态异常", e);
} catch (InvalidCollectorVersionFaultMsg e) {
e.printStackTrace();
} catch (InvalidNameFaultMsg e) {
e.printStackTrace();
throw new Exception("无效名称", e);
} catch (OutOfBoundsFaultMsg e) {
e.printStackTrace();
throw new Exception("溢出错误", e);
} catch (DuplicateNameFaultMsg e) {
e.printStackTrace();
throw new Exception("虚拟机名称重复", e);
} catch (InsufficientResourcesFaultFaultMsg e) {
e.printStackTrace();
throw new Exception("没有足够的资源分配", e);
} catch (TaskInProgressFaultMsg e) {
e.printStackTrace();
throw new Exception("任务已在进程中", e);
} catch (Exception e) {
e.printStackTrace();
throw new Exception("虚拟机创建失败", e);
}
}
附
VMware-vSphereSDK-6.5.0 下载地址:
https://my.vmware.com/zh/group/vmware/get-download?downloadGroup=VS-MGMT-SDK65