Пример #1
0
  /**
   * 克隆虚拟机,CloneVM_Task<br>
   * <br>
   * 是否转换为模板
   *
   * @param resultMap
   * @param url
   * @param username
   * @param password
   * @param dcId
   * @param vmMor
   * @param cloneName
   * @param isTemplate
   * @param rpId
   * @return
   */
  private static void cloneVM(
      HashMap<String, Object> resultMap,
      String url,
      String username,
      String password,
      String dcId,
      ManagedObjectReference vmMor,
      String cloneName,
      boolean isTemplate,
      String rpId) {
    try {
      VIMCache cache = VIMCache.getInstance(url, username, password);

      ManagedObjectReference dcMor = cache.getDatacenter(dcId);
      // ManagedObjectReference vmMor = cache.getVirtualMachine(vmId);
      ManagedObjectReference vmFolderMor = cache.getVMFolder(dcId);
      ManagedObjectReference rpMor = null;
      if (!Util.normalizeString(rpId).equals("")) {
        rpMor = cache.getResourcePool(rpId);
      }

      if ((dcMor != null) && (vmMor != null) && (vmFolderMor != null)) {
        ExtendedAppUtil ecb = getECB(url, username, password);

        VirtualMachineCloneSpec cloneSpec = new VirtualMachineCloneSpec();
        VirtualMachineRelocateSpec relocSpec = new VirtualMachineRelocateSpec();
        cloneSpec.setLocation(relocSpec);
        cloneSpec.setPowerOn(false);
        cloneSpec.setTemplate(isTemplate);
        // 如果是从模板部署为虚拟机需要指定资源池
        if (rpMor != null) {
          relocSpec.setPool(rpMor);
        }

        ManagedObjectReference taskMor =
            ecb.getServiceConnection3()
                .getService()
                .cloneVM_Task(vmMor, vmFolderMor, cloneName, cloneSpec);

        execTaskAndRecordResultMap(ecb, taskMor, resultMap);
      } else {
        if (dcMor == null) {
          recordResultMapError(resultMap, "数据中心'" + dcId + "'不存在");
        }
        if (vmMor == null) {
          // recordResultMapError(resultMap, "虚拟机'" + vmId
          // + "'不存在");
          recordResultMapError(resultMap, "虚拟机'" + "'不存在");
        }
        if (vmFolderMor == null) {
          recordResultMapError(resultMap, "数据中心'" + dcId + "'的vmFolder不存在");
        }
      }
    } catch (Exception e) {
      LOGGER.error("cloneVM error, ", e);
      recordResultMapException(resultMap, e);
    }
  }
Пример #2
0
  /**
   * 将模板转换为虚拟机<br>
   * 模板的操作:转换成虚拟机(markAsVirtualMachine)<br>
   *
   * @param url
   * @param username
   * @param password
   * @param dcId
   * @param vmId
   * @param rpId
   * @return
   */
  public static Map<String, Object> markAsVirtualMachine(
      String url, String username, String password, String dcId, String vmId, String rpId) {
    HashMap<String, Object> resultMap = new HashMap<String, Object>();

    try {
      VIMCache cache = VIMCache.getInstance(url, username, password);
      ManagedObjectReference vmMor = cache.getVirtualMachine(vmId);
      ManagedObjectReference rpMor = cache.getResourcePool(rpId);

      if ((vmMor != null) && (rpMor != null)) {
        ExtendedAppUtil ecb = getECB(url, username, password);

        // VirtualMachine.config(VirtualMachineConfigInfo).template标识虚拟机是否为模板
        // VirtualMachine.summary(VirtualMachineSummary).config(VirtualMachineConfigSummary).template标识虚拟机是否为模板

        ecb.getServiceConnection3().getService().markAsVirtualMachine(vmMor, rpMor, null);

        // 记录处理正确的标识
        recordResultMapSuccess(resultMap);
      } else {
        if (vmMor == null) {
          recordResultMapError(resultMap, "虚拟机'" + vmId + "'不存在");
        }
        if (rpMor == null) {
          recordResultMapError(resultMap, "'资源池" + rpId + "'不存在");
        }
      }
    } catch (FileFault ff) {
      LOGGER.error("markAsTemplate error, ", ff);
      recordResultMapError(resultMap, "访问虚拟机文件错误");
    } catch (InvalidDatastore ids) {
      LOGGER.error("markAsTemplate error, ", ids);
      recordResultMapError(resultMap, "在目标存储上无法执行当前操作");
    } catch (InvalidState is) {
      LOGGER.error("markAsTemplate error, ", is);
      recordResultMapError(resultMap, "虚拟机当前状态异常");
    } catch (NotSupported ns) {
      LOGGER.error("markAsTemplate error, ", ns);
      recordResultMapError(resultMap, "虚拟机不支持");
    } catch (RuntimeFault rf) {
      LOGGER.error("markAsTemplate error, ", rf);
      recordResultMapError(resultMap, "出现运行态故障");
    } catch (VmConfigFault vcf) {
      LOGGER.error("markAsTemplate error, ", vcf);
      recordResultMapError(resultMap, "模板不兼容");
    } catch (Exception e) {
      LOGGER.error("markAsTemplate error, ", e);
      recordResultMapException(resultMap, e);
    }
    return resultMap;
  }
Пример #3
0
  /**
   * 创建虚拟机,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;
  }