Skip to content
This repository was archived by the owner on Jan 21, 2026. It is now read-only.

Commit cf08cfd

Browse files
Add pagination to Terraform Cloud team adapter's Get request
1 parent f8a7b77 commit cf08cfd

2 files changed

Lines changed: 54 additions & 12 deletions

File tree

adapters/terraformcloud/team/team.go

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -48,20 +48,45 @@ type Team struct {
4848
Logger *log.Logger
4949
}
5050

51+
// getOrgIDsFromEmails takes a slice of emails, and returns a slice of Organisational Membership IDs.
52+
func (t *Team) getTeams(ctx context.Context) ([]string, error) {
53+
pageNumber := 1
54+
teams := make([]string, 0)
55+
56+
t.Logger.Printf("Fetching first page")
57+
58+
for {
59+
tfeTeams, err := t.teams.List(ctx, t.organisation, &tfe.TeamListOptions{
60+
ListOptions: tfe.ListOptions{PageNumber: pageNumber},
61+
})
62+
if err != nil {
63+
return nil, fmt.Errorf("teams.list(%s) -> %w", t.organisation, err)
64+
}
65+
66+
t.Logger.Printf("Fetched page %v in %v", tfeTeams.CurrentPage, tfeTeams.TotalPages)
67+
68+
for _, team := range tfeTeams.Items {
69+
teams = append(teams, team.Name)
70+
t.cache[team.Name] = team.ID
71+
}
72+
73+
pageNumber = tfeTeams.NextPage
74+
75+
if tfeTeams.CurrentPage >= tfeTeams.TotalPages {
76+
break
77+
}
78+
}
79+
80+
return teams, nil
81+
}
82+
5183
// Get teams in a Terraform Cloud organisation.
5284
func (t *Team) Get(ctx context.Context) ([]string, error) {
5385
t.Logger.Printf("Fetching teams in Terraform Cloud organisation %s", t.organisation)
5486

55-
tfeTeams, err := t.teams.List(ctx, t.organisation, &tfe.TeamListOptions{})
87+
teams, err := t.getTeams(ctx)
5688
if err != nil {
57-
return nil, fmt.Errorf("terraformcloud.team.get.list -> %w", err)
58-
}
59-
60-
teams := make([]string, 0, len(tfeTeams.Items))
61-
62-
for _, team := range tfeTeams.Items {
63-
teams = append(teams, team.Name)
64-
t.cache[team.Name] = team.ID
89+
return nil, fmt.Errorf("terraformcloud.team.get.getteams -> %w", err)
6590
}
6691

6792
t.Logger.Println("Fetched teams successfully")

adapters/terraformcloud/team/team_internal_test.go

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import (
66

77
"github.com/hashicorp/go-tfe"
88
"github.com/stretchr/testify/assert"
9-
"github.com/stretchr/testify/mock"
109

1110
gosync "github.com/ovotech/go-sync"
1211
)
@@ -24,14 +23,32 @@ func TestTeam_Get(t *testing.T) {
2423
adapter := New(&tfe.Client{}, "test")
2524
adapter.teams = iTeamsClient
2625

27-
iTeamsClient.EXPECT().List(ctx, "test", mock.Anything).Return(&tfe.TeamList{
26+
iTeamsClient.EXPECT().List(ctx, "test", &tfe.TeamListOptions{
27+
ListOptions: tfe.ListOptions{PageNumber: 1},
28+
}).Return(&tfe.TeamList{
29+
Pagination: &tfe.Pagination{
30+
CurrentPage: 1,
31+
NextPage: 2,
32+
TotalPages: 2,
33+
},
2834
Items: []*tfe.Team{{Name: "foo"}, {Name: "bar"}},
2935
}, nil)
3036

37+
iTeamsClient.EXPECT().List(ctx, "test", &tfe.TeamListOptions{
38+
ListOptions: tfe.ListOptions{PageNumber: 2},
39+
}).Return(&tfe.TeamList{
40+
Pagination: &tfe.Pagination{
41+
CurrentPage: 2,
42+
NextPage: 2,
43+
TotalPages: 2,
44+
},
45+
Items: []*tfe.Team{{Name: "fizz"}, {Name: "buzz"}},
46+
}, nil)
47+
3148
things, err := adapter.Get(ctx)
3249

3350
assert.NoError(t, err)
34-
assert.ElementsMatch(t, things, []string{"foo", "bar"})
51+
assert.ElementsMatch(t, things, []string{"foo", "bar", "fizz", "buzz"})
3552
}
3653

3754
func TestTeam_Add(t *testing.T) {

0 commit comments

Comments
 (0)