Skip to content

Commit a12d594

Browse files
authored
hubclient: minor bug fixes (#118)
- update org client to use common pagination helper - when a request fails, don't print the full request body. just the first 100 chars. otherwise it's a bit overwhelming. - add an acceptance test for an org that requires pagination this was useful when i was investigating #117 Signed-off-by: Nick Santos <nick.santos@docker.com>
1 parent a47d754 commit a12d594

File tree

5 files changed

+50
-36
lines changed

5 files changed

+50
-36
lines changed

internal/hubclient/client.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,12 @@ func (c *Client) sendRequest(ctx context.Context, method string, url string, bod
9696
if readErr != nil {
9797
return readErr
9898
}
99+
100+
// Limit the size of the error message body to avoid excessive logs
101+
if len(bodyBytes) > 500 {
102+
bodyBytes = bodyBytes[:500]
103+
}
104+
99105
return fmt.Errorf("server response %s: %s", path, string(bodyBytes))
100106
}
101107

internal/hubclient/client_organization.go

Lines changed: 25 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import (
2020
"context"
2121
"encoding/json"
2222
"fmt"
23-
"strings"
2423
)
2524

2625
type Org struct {
@@ -185,21 +184,19 @@ func (c *Client) GetOrg(ctx context.Context, orgName string) (Org, error) {
185184
}
186185

187186
func (c *Client) ListOrgMembers(ctx context.Context, orgName string) ([]OrgMember, error) {
188-
org := OrgMemberListResponse{}
189-
err := c.sendRequest(ctx, "GET", fmt.Sprintf("/orgs/%s/members", orgName), nil, &org)
190-
if err != nil {
191-
return nil, err
192-
}
193-
members := org.Results
194-
for org.Next != "" {
195-
nextOrg := OrgMemberListResponse{}
196-
nextURL := strings.TrimPrefix(org.Next, c.BaseURL)
197-
err := c.sendRequest(ctx, "GET", nextURL, nil, &nextOrg)
198-
if err != nil {
187+
var members []OrgMember
188+
initialURL := fmt.Sprintf("/orgs/%s/members", orgName)
189+
err := c.paginate(ctx, initialURL, func(url string) (interface{}, error) {
190+
var page OrgMemberListResponse
191+
if err := c.sendRequest(ctx, "GET", url, nil, &page); err != nil {
199192
return nil, err
200193
}
201-
members = append(members, nextOrg.Results...)
202-
org = nextOrg
194+
195+
members = append(members, page.Results...)
196+
return page.Next, nil
197+
})
198+
if err != nil {
199+
return nil, err
203200
}
204201
return members, nil
205202
}
@@ -258,27 +255,22 @@ func (c *Client) AddOrgTeamMember(ctx context.Context, orgName string, teamName
258255
return c.sendRequest(ctx, "POST", fmt.Sprintf("/orgs/%s/groups/%s/members/", orgName, teamName), memberRequestJSON, nil)
259256
}
260257

261-
func (c *Client) ListOrgTeamMembers(ctx context.Context, orgName string, teamName string) (OrgTeamMembersResponse, error) {
262-
membersResponse := OrgTeamMembersResponse{}
263-
err := c.sendRequest(ctx, "GET", fmt.Sprintf("/orgs/%s/groups/%s/members/", orgName, teamName), nil, &membersResponse)
264-
if err != nil {
265-
return membersResponse, err
266-
}
267-
268-
members := membersResponse.Results
269-
for membersResponse.Next != "" {
270-
nextResponse := OrgTeamMembersResponse{}
271-
nextURL := strings.TrimPrefix(membersResponse.Next, c.BaseURL)
272-
err := c.sendRequest(ctx, "GET", nextURL, nil, &nextResponse)
273-
if err != nil {
274-
return membersResponse, err
258+
func (c *Client) ListOrgTeamMembers(ctx context.Context, orgName string, teamName string) ([]OrgTeamMember, error) {
259+
var members []OrgTeamMember
260+
initialURL := fmt.Sprintf("/orgs/%s/groups/%s/members/", orgName, teamName)
261+
err := c.paginate(ctx, initialURL, func(url string) (interface{}, error) {
262+
var page OrgTeamMembersResponse
263+
if err := c.sendRequest(ctx, "GET", url, nil, &page); err != nil {
264+
return nil, err
275265
}
276-
members = append(members, nextResponse.Results...)
277-
membersResponse = nextResponse
278-
}
279266

280-
membersResponse.Results = members
281-
return membersResponse, nil
267+
members = append(members, page.Results...)
268+
return page.Next, nil
269+
})
270+
if err != nil {
271+
return nil, err
272+
}
273+
return members, nil
282274
}
283275

284276
func (c *Client) GetOrgSettingImageAccessManagement(ctx context.Context, orgName string) (OrgSettingImageAccessManagement, error) {

internal/provider/data_source_org_members_test.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,3 +53,19 @@ output "self" {
5353
}
5454
`, orgName, username)
5555
}
56+
57+
func TestAccOrgMembersDataSourceLargeOrg(t *testing.T) {
58+
username := os.Getenv("DOCKER_USERNAME")
59+
resource.Test(t, resource.TestCase{
60+
PreCheck: func() { testAccPreCheck(t) },
61+
ProtoV6ProviderFactories: testAccProtoV6ProviderFactories,
62+
Steps: []resource.TestStep{
63+
{
64+
Config: testAccOrgMembersDataSourceConfig("docker", username),
65+
Check: resource.ComposeAggregateTestCheckFunc(
66+
resource.TestCheckOutput("self", username),
67+
),
68+
},
69+
},
70+
})
71+
}

internal/provider/data_source_org_team_member.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ func (d *OrgTeamMemberDataSource) Read(ctx context.Context, req datasource.ReadR
204204
}
205205

206206
var memberList []Member
207-
for _, member := range members.Results {
207+
for _, member := range members {
208208
memberGroups := make([]attr.Value, len(member.Groups))
209209
for i, group := range member.Groups {
210210
memberGroups[i] = types.StringValue(group)

internal/provider/resource_org_team_member.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -158,15 +158,15 @@ func (r *OrgTeamMemberResource) Read(ctx context.Context, req resource.ReadReque
158158
}
159159

160160
// Call the new API to list members of the team
161-
membersResponse, err := r.client.ListOrgTeamMembers(ctx, data.OrgName.ValueString(), data.TeamName.ValueString())
161+
members, err := r.client.ListOrgTeamMembers(ctx, data.OrgName.ValueString(), data.TeamName.ValueString())
162162
if err != nil {
163163
resp.Diagnostics.AddError("Unable to read org_team_member resource", fmt.Sprintf("Error retrieving team members: %v", err))
164164
return
165165
}
166166

167167
// Check if the specified user is in the team
168168
found := false
169-
for _, member := range membersResponse.Results {
169+
for _, member := range members {
170170
if member.Username == data.UserName.ValueString() {
171171
found = true
172172
break

0 commit comments

Comments
 (0)