Skip to content

Commit f85db4b

Browse files
committed
datasource/gitlab_group_membership: support pagination. Closes #466
Closes #466
1 parent 88f82db commit f85db4b

File tree

2 files changed

+50
-5
lines changed

2 files changed

+50
-5
lines changed

internal/provider/data_source_gitlab_group_membership.go

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,6 @@ var _ = registerDataSource("gitlab_group_membership", func() *schema.Resource {
101101
func dataSourceGitlabGroupMembershipRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
102102
client := meta.(*gitlab.Client)
103103

104-
var gm []*gitlab.GroupMember
105104
var group *gitlab.Group
106105
var err error
107106

@@ -129,15 +128,32 @@ func dataSourceGitlabGroupMembershipRead(ctx context.Context, d *schema.Resource
129128
log.Printf("[INFO] Reading Gitlab group memberships")
130129

131130
// Get group memberships
132-
gm, _, err = client.Groups.ListGroupMembers(group.ID, &gitlab.ListGroupMembersOptions{}, gitlab.WithContext(ctx))
133-
if err != nil {
134-
return diag.FromErr(err)
131+
listOptions := &gitlab.ListGroupMembersOptions{
132+
ListOptions: gitlab.ListOptions{
133+
PerPage: 20,
134+
Page: 1,
135+
},
136+
}
137+
138+
var allGms []*gitlab.GroupMember
139+
for {
140+
gms, resp, err := client.Groups.ListGroupMembers(group.ID, listOptions, gitlab.WithContext(ctx))
141+
if err != nil {
142+
return diag.FromErr(err)
143+
}
144+
145+
allGms = append(allGms, gms...)
146+
147+
if resp.NextPage == 0 {
148+
break
149+
}
150+
listOptions.Page = resp.NextPage
135151
}
136152

137153
d.Set("group_id", group.ID)
138154
d.Set("full_path", group.FullPath)
139155

140-
d.Set("members", flattenGitlabMembers(d, gm)) // lintignore: XR004 // TODO: Resolve this tfproviderlint issue
156+
d.Set("members", flattenGitlabMembers(d, allGms)) // lintignore: XR004 // TODO: Resolve this tfproviderlint issue
141157

142158
var optionsHash strings.Builder
143159
optionsHash.WriteString(strconv.Itoa(group.ID))

internal/provider/data_source_gitlab_group_membership_test.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,27 @@ func TestAccDataSourceGitlabMembership_basic(t *testing.T) {
4444
})
4545
}
4646

47+
func TestAccDataSourceGitlabMembership_pagination(t *testing.T) {
48+
testAccPreCheck(t)
49+
50+
userCount := 21
51+
52+
group := testAccCreateGroups(t, 1)[0]
53+
users := testAccCreateUsers(t, userCount)
54+
testAccAddGroupMembers(t, group.ID, users)
55+
56+
resource.Test(t, resource.TestCase{
57+
PreCheck: func() { testAccPreCheck(t) },
58+
ProviderFactories: providerFactories,
59+
Steps: []resource.TestStep{
60+
{
61+
Config: testAccDataSourceGitlabGroupMembershipPagination(group.ID),
62+
Check: resource.TestCheckResourceAttr("data.gitlab_group_membership.this", "members.#", fmt.Sprintf("%d", userCount)),
63+
},
64+
},
65+
})
66+
}
67+
4768
func testAccDataSourceGitlabGroupMembershipConfig(rInt int) string {
4869
return fmt.Sprintf(`
4970
resource "gitlab_group" "foo" {
@@ -89,3 +110,11 @@ data "gitlab_group_membership" "foomaintainers" {
89110
access_level = "maintainer"
90111
}`, rInt, rInt)
91112
}
113+
114+
func testAccDataSourceGitlabGroupMembershipPagination(groupId int) string {
115+
return fmt.Sprintf(`
116+
data "gitlab_group_membership" "this" {
117+
group_id = "%d"
118+
access_level = "developer"
119+
}`, groupId)
120+
}

0 commit comments

Comments
 (0)