vsphere/internal/virtualdevice/virtual_machine_disk_subresource.go
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
}
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
}
func ( r * DiskSubresource ) normalizeDiskDatastore ( ) error { podID := r . rdd . Get ( " " ) . ( string ) dsID , _ := r . GetChange ( " " ) 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 ( " " , dsID ) return nil } log . Printf ( " " , r ) pod , err := storagepod . FromID ( r . client , podID ) if err != nil { return fmt . Errorf ( " " , podID , err ) } ds , err := datastore . FromID ( r . client , dsID . ( string ) ) if err != nil { return fmt . Errorf ( " " , dsID , err ) } isMember , err := storagepod . IsMember ( pod , ds ) if err != nil { return fmt . Errorf ( " " , err ) } if ! isMember { log . Printf ( " " , r , ds . Name ( ) , pod . Name ( ) , ) dsID = diskDatastoreComputedName } r . Set ( " " , dsID ) return nil }
// 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.
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 .