Skip to content

Commit 4cd5611

Browse files
authored
Add pagination support for listing namespaces (#483)
1 parent cea8e19 commit 4cd5611

2 files changed

Lines changed: 65 additions & 4 deletions

File tree

app/namespace.go

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,11 @@ const (
6161
AuthMethodAPIKeyOrMTLS = "api_key_or_mtls"
6262
)
6363

64+
const (
65+
MaxPageSize = 1000
66+
DefaultPageSize = 100
67+
)
68+
6469
var (
6570
AuthMethods = []string{
6671
AuthMethodRestricted,
@@ -121,7 +126,7 @@ var (
121126
pageSizeFlag = &cli.IntFlag{
122127
Name: "page-size",
123128
Usage: "The page size for list operations",
124-
Value: 100,
129+
Value: DefaultPageSize,
125130
}
126131
pageTokenFlag = &cli.StringFlag{
127132
Name: "page-token",
@@ -335,7 +340,20 @@ func (c *NamespaceClient) deleteRegion(ctx *cli.Context) error {
335340
return PrintProto(res.GetAsyncOperation())
336341
}
337342

338-
func (c *NamespaceClient) listNamespaces() error {
343+
func (c *NamespaceClient) listNamespaces(requestedPageToken string, pageSize int) error {
344+
// Fetch a single page of namespaces.
345+
if len(requestedPageToken) > 0 || pageSize > 0 {
346+
res, err := c.client.ListNamespaces(c.ctx, &namespaceservice.ListNamespacesRequest{
347+
PageToken: requestedPageToken,
348+
PageSize: int32(pageSize),
349+
})
350+
if err != nil {
351+
return err
352+
}
353+
return PrintProto(res)
354+
}
355+
356+
// Fetch all namespaces.
339357
totalRes := &namespaceservice.ListNamespacesResponse{}
340358
pageToken := ""
341359
for {
@@ -1033,8 +1051,23 @@ func NewNamespaceCommand(getNamespaceClientFn GetNamespaceClientFn) (CommandOut,
10331051
Name: "list",
10341052
Usage: "List all known namespaces",
10351053
Aliases: []string{"l"},
1054+
Flags: []cli.Flag{
1055+
pageTokenFlag,
1056+
&cli.IntFlag{
1057+
Name: pageSizeFlagName,
1058+
Usage: "Number of namespaces to list per page",
1059+
},
1060+
},
10361061
Action: func(ctx *cli.Context) error {
1037-
return c.listNamespaces()
1062+
if ctx.IsSet(pageSizeFlagName) {
1063+
if ctx.Int(pageSizeFlagName) <= 0 {
1064+
return fmt.Errorf("page size cannot be less than or equal to 0")
1065+
}
1066+
if ctx.Int(pageSizeFlagName) > MaxPageSize {
1067+
return fmt.Errorf("page size cannot be greater than %d", MaxPageSize)
1068+
}
1069+
}
1070+
return c.listNamespaces(ctx.String(pageTokenFlagName), ctx.Int(pageSizeFlagName))
10381071
},
10391072
},
10401073
{

app/namespace_test.go

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"encoding/base64"
66
"errors"
77
"os"
8+
"strconv"
89
"strings"
910
"testing"
1011

@@ -105,6 +106,9 @@ func (s *NamespaceTestSuite) TestGet() {
105106
}
106107

107108
func (s *NamespaceTestSuite) TestList() {
109+
s.Error(s.RunCmd("namespace", "list", "--page-size", "0"))
110+
s.Error(s.RunCmd("namespace", "list", "--page-size", "-1"))
111+
s.Error(s.RunCmd("namespace", "list", "--page-size", strconv.Itoa(MaxPageSize+1)))
108112

109113
s.mockService.EXPECT().ListNamespaces(gomock.Any(), &namespaceservice.ListNamespacesRequest{}).Return(nil, errors.New("some error")).Times(1)
110114
s.Error(s.RunCmd("namespace", "list"))
@@ -144,8 +148,32 @@ func (s *NamespaceTestSuite) TestList() {
144148
s.mockService.EXPECT().ListNamespaces(gomock.Any(), &namespaceservice.ListNamespacesRequest{
145149
PageToken: "token3",
146150
}).Return(&namespaceservice.ListNamespacesResponse{}, nil).Times(1)
147-
148151
s.NoError(s.RunCmd("namespace", "list"))
152+
153+
s.mockService.EXPECT().ListNamespaces(gomock.Any(), &namespaceservice.ListNamespacesRequest{
154+
PageToken: "foo",
155+
}).Return(&namespaceservice.ListNamespacesResponse{
156+
Namespaces: []string{"ns1", "ns2"},
157+
NextPageToken: "bar",
158+
}, nil).Times(1)
159+
s.NoError(s.RunCmd("namespace", "list", "--page-token", "foo"))
160+
161+
s.mockService.EXPECT().ListNamespaces(gomock.Any(), &namespaceservice.ListNamespacesRequest{
162+
PageSize: 10,
163+
}).Return(&namespaceservice.ListNamespacesResponse{
164+
Namespaces: []string{"ns1", "ns2"},
165+
NextPageToken: "foo",
166+
}, nil).Times(1)
167+
s.NoError(s.RunCmd("namespace", "list", "--page-size", "10"))
168+
169+
s.mockService.EXPECT().ListNamespaces(gomock.Any(), &namespaceservice.ListNamespacesRequest{
170+
PageToken: "foo",
171+
PageSize: 10,
172+
}).Return(&namespaceservice.ListNamespacesResponse{
173+
Namespaces: []string{"ns1", "ns2"},
174+
NextPageToken: "bar",
175+
}, nil).Times(1)
176+
s.NoError(s.RunCmd("namespace", "list", "--page-token", "foo", "--page-size", "10"))
149177
}
150178

151179
func (s *NamespaceTestSuite) TestDeleteProtection() {

0 commit comments

Comments
 (0)