java 实现VMware虚拟机创建

根据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

猜你喜欢

转载自blog.csdn.net/zhouxukun123/article/details/80304423