code: func resourceVSphereComputeClusterApplyFolderChange(
  	d *schema.ResourceData,
  	meta interface{},
  	cluster *object.ClusterComputeResource,
  ) (*object.ClusterComputeResource, error) {
  	log.Printf(
  		"[DEBUG] %s: Applying any folder changes (old path = %q)",
  		resourceVSphereComputeClusterIDString(d),
  		cluster.InventoryPath,
  	)
  
  	var changed bool
  	var err error
  
  	if d.HasChange("folder") {
  		f := d.Get("folder").(string)
  		client := meta.(*VSphereClient).vimClient
  		if err = clustercomputeresource.MoveToFolder(client, cluster, f); err != nil {
  			return nil, fmt.Errorf("could not move cluster to folder %q: %s", f, err)
  		}
  		changed = true
  	}
  
  	if changed {
  		// Update the cluster so that we have the new inventory path for logging and
  		// other things
  		cluster, err = resourceVSphereComputeClusterGetCluster(d, meta)
  		if err != nil {
  			return nil, fmt.Errorf("error refreshing cluster after folder change: %s", err)
  		}
  		log.Printf(
  			"[DEBUG] %s: Folder changed, new path = %q",
  			resourceVSphereComputeClusterIDString(d),
  			cluster.InventoryPath,
  		)
  	}
  
  	return cluster, nil
  }
docs: // resourceVSphereComputeClusterApplyFolderChange applies any changes to a
  // ClusterComputeResource's folder location.