Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 3 additions & 6 deletions internal/services/groups/group_data_source.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,6 @@ import (
"github.com/hashicorp/go-azure-sdk/microsoft-graph/common-types/beta"
"github.com/hashicorp/go-azure-sdk/microsoft-graph/common-types/stable"
groupBeta "github.com/hashicorp/go-azure-sdk/microsoft-graph/groups/beta/group"
memberBeta "github.com/hashicorp/go-azure-sdk/microsoft-graph/groups/beta/member"
ownerBeta "github.com/hashicorp/go-azure-sdk/microsoft-graph/groups/beta/owner"
transitivememberBeta "github.com/hashicorp/go-azure-sdk/microsoft-graph/groups/beta/transitivemember"
"github.com/hashicorp/terraform-provider-azuread/internal/clients"
"github.com/hashicorp/terraform-provider-azuread/internal/helpers/tf"
"github.com/hashicorp/terraform-provider-azuread/internal/helpers/tf/pluginsdk"
Expand Down Expand Up @@ -458,7 +455,7 @@ func groupDataSourceRead(ctx context.Context, d *pluginsdk.ResourceData, meta in
includeTransitiveMembers := d.Get("include_transitive_members").(bool)
var members *[]string
if includeTransitiveMembers {
resp, err := transitiveMemberClient.ListTransitiveMembers(ctx, beta.GroupId(id), transitivememberBeta.DefaultListTransitiveMembersOperationOptions())
resp, err := transitiveMemberClient.ListTransitiveMembers(ctx, beta.GroupId(id), listTransitiveMembersOptions())
if err != nil {
return tf.ErrorDiagF(err, "Could not retrieve transitive group members for group with object ID: %q", d.Id())
}
Expand All @@ -470,7 +467,7 @@ func groupDataSourceRead(ctx context.Context, d *pluginsdk.ResourceData, meta in
members = &transitiveMembers
}
} else {
resp, err := memberClient.ListMembers(ctx, beta.GroupId(id), memberBeta.DefaultListMembersOperationOptions())
resp, err := memberClient.ListMembers(ctx, beta.GroupId(id), listMembersOptions())
if err != nil {
return tf.ErrorDiagF(err, "Could not retrieve group members for group with object ID: %q", d.Id())
}
Expand All @@ -484,7 +481,7 @@ func groupDataSourceRead(ctx context.Context, d *pluginsdk.ResourceData, meta in
}
tf.Set(d, "members", members)

resp, err := ownerClient.ListOwners(ctx, beta.GroupId(id), ownerBeta.DefaultListOwnersOperationOptions())
resp, err := ownerClient.ListOwners(ctx, beta.GroupId(id), listOwnersOptions())
if err != nil {
return tf.ErrorDiagF(err, "Could not retrieve group owners for group with object ID: %q", d.Id())
}
Expand Down
2 changes: 1 addition & 1 deletion internal/services/groups/group_member_resource.go
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ func groupMemberResourceCreate(ctx context.Context, d *pluginsdk.ResourceData, m
return tf.ErrorDiagPathF(err, "object_id", "Retrieving %s", groupId)
}

resp, err := memberClient.ListMembers(ctx, groupId, memberBeta.DefaultListMembersOperationOptions())
resp, err := memberClient.ListMembers(ctx, groupId, listMembersOptions())
if err != nil {
return tf.ErrorDiagF(err, "Listing existing members for %s", groupId)
}
Expand Down
8 changes: 4 additions & 4 deletions internal/services/groups/group_resource.go
Original file line number Diff line number Diff line change
Expand Up @@ -1089,7 +1089,7 @@ func groupResourceUpdate(ctx context.Context, d *pluginsdk.ResourceData, meta in
}

if d.HasChange("members") {
resp, err := memberClient.ListMembers(ctx, *id, memberBeta.DefaultListMembersOperationOptions())
resp, err := memberClient.ListMembers(ctx, *id, listMembersOptions())
if err != nil {
return tf.ErrorDiagF(err, "Could not retrieve members for %s", id)
}
Expand Down Expand Up @@ -1123,7 +1123,7 @@ func groupResourceUpdate(ctx context.Context, d *pluginsdk.ResourceData, meta in
}

if v, ok := d.GetOk("owners"); ok && d.HasChange("owners") {
resp, err := ownerClient.ListOwners(ctx, *id, ownerBeta.DefaultListOwnersOperationOptions())
resp, err := ownerClient.ListOwners(ctx, *id, listOwnersOptions())
if err != nil {
return tf.ErrorDiagF(err, "Could not retrieve members for %s", id)
}
Expand Down Expand Up @@ -1313,7 +1313,7 @@ func groupResourceReadFunc(enableRetries bool) pluginsdk.ReadContextFunc {
tf.Set(d, "hide_from_outlook_clients", hideFromOutlookClients)

owners := make([]string, 0)
if resp, err := ownerClient.ListOwners(ctx, *id, ownerBeta.DefaultListOwnersOperationOptions()); err != nil {
if resp, err := ownerClient.ListOwners(ctx, *id, listOwnersOptions()); err != nil {
return tf.ErrorDiagPathF(err, "owners", "Could not retrieve owners for %s", id)
} else if resp.Model != nil {
for _, o := range *resp.Model {
Expand All @@ -1323,7 +1323,7 @@ func groupResourceReadFunc(enableRetries bool) pluginsdk.ReadContextFunc {
tf.Set(d, "owners", owners)

members := make([]string, 0)
if resp, err := memberClient.ListMembers(ctx, *id, memberBeta.DefaultListMembersOperationOptions()); err != nil {
if resp, err := memberClient.ListMembers(ctx, *id, listMembersOptions()); err != nil {
return tf.ErrorDiagPathF(err, "members", "Could not retrieve members for %s", id)
} else if resp.Model != nil {
for _, o := range *resp.Model {
Expand Down
4 changes: 2 additions & 2 deletions internal/services/groups/group_without_members_resource.go
Original file line number Diff line number Diff line change
Expand Up @@ -1050,7 +1050,7 @@ func groupWithoutMembersResourceUpdate(ctx context.Context, d *pluginsdk.Resourc
}

if v, ok := d.GetOk("owners"); ok && d.HasChange("owners") {
resp, err := ownerClient.ListOwners(ctx, *id, ownerBeta.DefaultListOwnersOperationOptions())
resp, err := ownerClient.ListOwners(ctx, *id, listOwnersOptions())
if err != nil {
return tf.ErrorDiagF(err, "Could not retrieve members for %s", id)
}
Expand Down Expand Up @@ -1239,7 +1239,7 @@ func groupWithoutMembersResourceReadFunc(enableRetries bool) pluginsdk.ReadConte
tf.Set(d, "hide_from_outlook_clients", hideFromOutlookClients)

owners := make([]string, 0)
if resp, err := ownerClient.ListOwners(ctx, *id, ownerBeta.DefaultListOwnersOperationOptions()); err != nil {
if resp, err := ownerClient.ListOwners(ctx, *id, listOwnersOptions()); err != nil {
return tf.ErrorDiagPathF(err, "owners", "Could not retrieve owners for %s", id)
} else if resp.Model != nil {
for _, o := range *resp.Model {
Expand Down
33 changes: 30 additions & 3 deletions internal/services/groups/groups.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,36 @@ import (
"github.com/hashicorp/go-azure-sdk/microsoft-graph/common-types/beta"
groupBeta "github.com/hashicorp/go-azure-sdk/microsoft-graph/groups/beta/group"
memberBeta "github.com/hashicorp/go-azure-sdk/microsoft-graph/groups/beta/member"
ownerBeta "github.com/hashicorp/go-azure-sdk/microsoft-graph/groups/beta/owner"
transitivememberBeta "github.com/hashicorp/go-azure-sdk/microsoft-graph/groups/beta/transitivemember"
)

// Group members and owners are only ever read for their object IDs, so ask Graph for nothing
// else. Besides the saving on the wire (a 39-user group returns 819KB of directory objects
// unfiltered, 694 bytes with $select=id), the unfiltered projection is what trips a beta
// serialization bug for app-only callers lacking User.Read.All: the member's non-nullable
// isProvisionedToOnPremises comes back null, Graph aborts mid-object, and the truncated body
// fails to unmarshal.
var listMemberFields = pointer.To([]string{"id"})

func listMembersOptions() memberBeta.ListMembersOperationOptions {
options := memberBeta.DefaultListMembersOperationOptions()
options.Select = listMemberFields
return options
}

func listOwnersOptions() ownerBeta.ListOwnersOperationOptions {
options := ownerBeta.DefaultListOwnersOperationOptions()
options.Select = listMemberFields
return options
}

func listTransitiveMembersOptions() transitivememberBeta.ListTransitiveMembersOperationOptions {
options := transitivememberBeta.DefaultListTransitiveMembersOperationOptions()
options.Select = listMemberFields
return options
}

func groupDefaultMailNickname() string {
charSet := "0123456789abcdef"
result := make([]byte, 9)
Expand Down Expand Up @@ -73,9 +101,8 @@ func groupGetAdditional(ctx context.Context, client *groupBeta.GroupClient, id b
}

func groupGetMember(ctx context.Context, client *memberBeta.MemberClient, id beta.GroupIdMemberId) (*beta.DirectoryObject, error) {
options := memberBeta.ListMembersOperationOptions{
Filter: pointer.To(fmt.Sprintf("id eq '%s'", id.DirectoryObjectId)),
}
options := listMembersOptions()
options.Filter = pointer.To(fmt.Sprintf("id eq '%s'", id.DirectoryObjectId))

resp, err := client.ListMembers(ctx, beta.NewGroupID(id.GroupId), options)
if err != nil {
Expand Down
Loading