private VirtualMachineRelocateSpec createRelocateSpec(
      PrintStream jLogger,
      boolean linkedClone,
      String resourcePoolName,
      String cluster,
      String datastoreName,
      boolean isResourcePoolRequired)
      throws RemoteException, MalformedURLException, VSphereException {
    VirtualMachineRelocateSpec rel = new VirtualMachineRelocateSpec();

    if (linkedClone) {
      rel.setDiskMoveType("createNewChildDiskBacking");
    } else {
      rel.setDiskMoveType("moveAllDiskBackingsAndDisallowSharing");
    }

    ClusterComputeResource clusterResource = getClusterByName(cluster);

    // probably only of interest if someone actually entered a cluster name
    if (clusterResource == null && StringUtils.isNotBlank(cluster)) {
      logMessage(
          jLogger,
          "Cluster resource "
              + cluster
              + " does not exist, root folder will be used for getting resource pool and datastore");
    }

    if (resourcePoolName != null && !resourcePoolName.isEmpty()) {
      ResourcePool resourcePool = getResourcePoolByName(resourcePoolName, clusterResource);

      if (resourcePool == null) {
        throw new VSphereException("Resource pool \"" + resourcePoolName + "\" not found");
      }

      rel.setPool(resourcePool.getMOR());
    } else if (isResourcePoolRequired) {
      throw new VSphereException("You must specify a resource  pool  when using a template");
    }

    if (datastoreName != null && !datastoreName.isEmpty()) {
      Datastore datastore = getDatastoreByName(datastoreName, clusterResource);
      if (datastore == null) {
        throw new VSphereException("Datastore \"" + datastoreName + "\" not found!");
      }
      rel.setDatastore(datastore.getMOR());
    }

    return rel;
  }