in src/terraform/providers/terraform-provider-avere/resource_vfxt.go [1390:1464]
func updateUsers(d *schema.ResourceData, avereVfxt *AvereVfxt) error {
if d.HasChange(user) {
old, new := d.GetChange(user)
oldUsers, err := expandUsers(old.(*schema.Set).List())
if err != nil {
return err
}
newUsers, err := expandUsers(new.(*schema.Set).List())
if err != nil {
return err
}
existingUsers, err := avereVfxt.ListNonAdminUsers()
if err != nil {
return err
}
removalList := make(map[string]*User)
additionList := make(map[string]*User)
// compare the old model to new
for key, oldVal := range oldUsers {
existingVal, existingOK := existingUsers[key]
// check if user was removed and still exists
if newVal, ok := newUsers[key]; !ok && existingOK {
removalList[key] = oldVal
// check if user was modified
} else if ok && (!newVal.IsEqual(oldVal) || (existingOK && !newVal.IsEqualNoPassword(existingVal))) {
if existingOK {
removalList[key] = oldVal
}
additionList[key] = newVal
// add if the user was missing
} else if ok && !existingOK {
additionList[key] = newVal
}
}
// compare cluster existing to new
for key, existingVal := range existingUsers {
if _, oldOK := oldUsers[key]; oldOK {
// this was in the model, and already evaluated
continue
}
// check if the user exists on Avere and is removed in the model
if newVal, ok := newUsers[key]; !ok {
removalList[key] = existingVal
// check if user exists on Avere and is modified from the model's values
} else if !newVal.IsEqualNoPassword(existingVal) {
removalList[key] = existingVal
additionList[key] = newVal
}
}
// find the new users
for key, newVal := range newUsers {
_, existingOK := existingUsers[key]
if _, ok := oldUsers[key]; !ok && !existingOK {
additionList[key] = newVal
}
}
if err := removeUsers(removalList, avereVfxt); err != nil {
return err
}
if err := addUsers(additionList, avereVfxt); err != nil {
return err
}
}
return nil
}