code: func (r *DiskSubresource) normalizeDiskDatastore() error {
  	podID := r.rdd.Get("datastore_cluster_id").(string)
  	dsID, _ := r.GetChange("datastore_id")
  
  	if podID == "" {
  		// We don't have a storage pod, just set the old ID and exit. We don't need
  		// to worry about whether or not the storage pod is computed here as if it
  		// is, the VM datastore will have been marked as computed and this function
  		// will have never ran.
  		r.Set("datastore_id", dsID)
  		return nil
  	}
  
  	log.Printf("[DEBUG] %s: Checking datastore cluster membership of disk", r)
  
  	pod, err := storagepod.FromID(r.client, podID)
  	if err != nil {
  		return fmt.Errorf("error fetching datastore cluster ID %q: %s", podID, err)
  	}
  
  	ds, err := datastore.FromID(r.client, dsID.(string))
  	if err != nil {
  		return fmt.Errorf("error fetching datastore ID %q: %s", dsID, err)
  	}
  
  	isMember, err := storagepod.IsMember(pod, ds)
  	if err != nil {
  		return fmt.Errorf("error checking storage pod membership: %s", err)
  	}
  	if !isMember {
  		log.Printf(
  			"[DEBUG] %s: Disk's datastore %q not a member of cluster %q, marking datastore ID as computed",
  			r,
  			ds.Name(),
  			pod.Name(),
  		)
  		dsID = diskDatastoreComputedName
  	}
  
  	r.Set("datastore_id", dsID)
  	return nil
  }
docs: // normalizeDiskDatastore normalizes the datastore_id field in a disk
  // sub-resource. If the VM has a datastore cluster defined, it checks to make
  // sure the datastore in the current state of the disk is a member of the
  // currently defined datastore cluster, and if it is not, it marks the disk as
  // computed so that it can be migrated back to the datastore cluster on the
  // next update.