public static String getNetworkName(
      VMwareClient vmw, ManagedObjectReference vmwInstance, int numNic) throws Exception {
    logger.debug("");

    List<ManagedObjectReference> networkList =
        (List<ManagedObjectReference>)
            vmw.getServiceUtil().getDynamicProperty(vmwInstance, "network");

    String name = null;
    if (networkList != null && networkList.size() >= numNic) {
      name = (String) vmw.getServiceUtil().getDynamicProperty(networkList.get(numNic - 1), "name");
      NetworkSummary summary =
          (NetworkSummary)
              vmw.getServiceUtil().getDynamicProperty(networkList.get(numNic - 1), "summary");

      logger.debug(
          "name: "
              + name
              + " ipPoolId: "
              + summary.getIpPoolName()
              + " ipPoolName: "
              + summary.getName());
    }

    if (name == null) {
      throw new Exception("Failed to retrieve network name from template.");
    }
    return name;
  }
  private static ManagedObjectReference getNetworkFromHost(
      VMwareClient vmw, ManagedObjectReference vmwInstance, String networkName) throws Exception {
    logger.debug("networkName: " + networkName);

    VirtualMachineRuntimeInfo vmRuntimeInfo =
        (VirtualMachineRuntimeInfo) vmw.getServiceUtil().getDynamicProperty(vmwInstance, "runtime");
    ManagedObjectReference hostRef = vmRuntimeInfo.getHost();
    List<ManagedObjectReference> networkRefList =
        (List<ManagedObjectReference>) vmw.getServiceUtil().getDynamicProperty(hostRef, "network");
    ManagedObjectReference netCard = null;
    StringBuffer networks = new StringBuffer();
    for (ManagedObjectReference networkRef : networkRefList) {
      String netCardName = (String) vmw.getServiceUtil().getDynamicProperty(networkRef, "name");
      networks.append(netCardName + " ");
      if (netCardName.equalsIgnoreCase(networkName)) {
        netCard = networkRef;
        break;
      }
    }

    if (netCard == null) {
      String hostName = (String) vmw.getServiceUtil().getDynamicProperty(hostRef, "name");
      logger.error("Network " + networkName + " not found on host " + hostName);
      logger.debug("available networks are: " + networks.toString());
      throw new Exception("Network card " + networkName + " not found on host " + hostName);
    }

    return netCard;
  }
  public static int getNumberOfNICs(VMwareClient vmw, ManagedObjectReference vmwInstance)
      throws Exception {
    logger.debug("");

    VirtualMachineConfigInfo configInfo =
        (VirtualMachineConfigInfo) vmw.getServiceUtil().getDynamicProperty(vmwInstance, "config");
    List<VirtualEthernetCard> vmNics = getNetworkAdapter(configInfo);
    return vmNics.size();
  }
  /**
   * Replaces the NICs in the given VM.
   *
   * @param vmw connected VMware client entity
   * @param paramHandler entity which holds all properties of the instance
   * @param vmwInstance the virtual machine that gets reconfigured
   */
  public static void configureNetworkAdapter(
      VMwareClient vmw,
      VirtualMachineConfigSpec vmConfigSpec,
      VMPropertyHandler paramHandler,
      ManagedObjectReference vmwInstance)
      throws Exception {
    logger.debug("");

    VirtualMachineConfigInfo configInfo =
        (VirtualMachineConfigInfo) vmw.getServiceUtil().getDynamicProperty(vmwInstance, "config");
    List<VirtualEthernetCard> vmNics = getNetworkAdapter(configInfo);

    int numberOfNICs =
        Integer.parseInt(paramHandler.getServiceSetting(VMPropertyHandler.TS_NUMBER_OF_NICS));

    if (numberOfNICs != vmNics.size()) {
      throw new Exception(
          "the number of NICs in virtual machine does not match the service parameter. VM: "
              + configInfo.getName()
              + " NICs: "
              + vmNics.size()
              + " "
              + VMPropertyHandler.TS_NUMBER_OF_NICS
              + ": "
              + numberOfNICs);
    }

    for (int i = 1; i <= numberOfNICs; i++) {
      String newNetworkName = paramHandler.getNetworkAdapter(i);
      VirtualEthernetCard vmNic = vmNics.get(i - 1);
      String vmNetworkName = getNetworkName(vmw, vmwInstance, i);
      if (newNetworkName != null
          && newNetworkName.length() > 0
          && !newNetworkName.equals(vmNetworkName)) {
        ManagedObjectReference newNetworkRef = getNetworkFromHost(vmw, vmwInstance, newNetworkName);

        replaceNetworkAdapter(vmConfigSpec, vmNic, newNetworkRef, newNetworkName);
      } else {
        connectNIC(vmConfigSpec, vmNic, vmNetworkName);
      }
    }
  }