Hi, how can I serialize multiple iam.NewUser crea...
# golang
m
Hi, how can I serialize multiple iam.NewUser creation with iam.NewGroupMembership? The following code works most of the time but I’d like to implement a better serialization between these two resources:
Copy code
func createUsers(ctx *pulumi.Context,
	group mcfg.Group,
	globalTags map[string]string) ([]pulumi.StringOutput, error) {

	// the order of users in the list is important to avoid
	// unnecessary updates of GroupMembership and to serialize its update
	// with NewUsers exectued in a loop.
	sort.Strings(group.Users)

	var newUsersNames []pulumi.StringOutput
	var newUser *iam.User
	var err error
	for _, user := range group.Users {

		newUser, err = iam.NewUser(ctx, user, &iam.UserArgs{
			Name: pulumi.String(user),
			Path: pulumi.String("/perf/"),
			Tags: pulumi.ToStringMap(globalTags),
		})
		if err != nil {
			return nil, err
		}

		newUsersNames = append(newUsersNames, newUser.Name)
	}

	if len(newUsersNames) > 0 {

		ngMemberName := fmt.Sprintf("%s-%s", group.Name, "mozart")

		// a hack to serialize NewUsers with NewGroupMembership
		_, err := iam.NewGroupMembership(ctx, ngMemberName, &iam.GroupMembershipArgs{
			Users: pulumi.ToStringArray(group.Users),
			Group: pulumi.String(group.Name),
		}, pulumi.DependsOn([]pulumi.Resource{newUser}))

		if err != nil {
			return nil, err
		}
	}

	return newUsersNames, nil
}
My initial attempt was to convert
newUsersNames - []pulumi.StringOutput
to
[]string
using ApplyT on each of the list elements. It works but then the creation of
NewUsers
and
NewGroupMembership
is not serialized. In the above version I just pass the list of users which is provided by a function argument to
GroupMembershipArgs
and try to create a dependency on the last
NewUser
resource created in the loop. Is there a better way of doing this?