From 9146a4866159e751bcd8e531b6ea6116b7fba28a Mon Sep 17 00:00:00 2001 From: Shakeel Rao Date: Wed, 29 Oct 2025 14:12:26 -0400 Subject: [PATCH 1/5] impl --- app/namespace.go | 23 +++++++++++++++++++++-- app/namespace_test.go | 26 +++++++++++++++++++++++++- 2 files changed, 46 insertions(+), 3 deletions(-) diff --git a/app/namespace.go b/app/namespace.go index d48bdb8c..33e0e6be 100644 --- a/app/namespace.go +++ b/app/namespace.go @@ -335,7 +335,19 @@ func (c *NamespaceClient) deleteRegion(ctx *cli.Context) error { return PrintProto(res.GetAsyncOperation()) } -func (c *NamespaceClient) listNamespaces() error { +func (c *NamespaceClient) listNamespaces(requestedPageToken string, pageSize int) error { + if len(requestedPageToken) > 0 || pageSize > 0 { + res, err := c.client.ListNamespaces(c.ctx, &namespaceservice.ListNamespacesRequest{ + PageToken: requestedPageToken, + PageSize: int32(pageSize), + }) + if err != nil { + return err + } + return PrintProto(res) + } + + // Fetch all namespaces. totalRes := &namespaceservice.ListNamespacesResponse{} pageToken := "" for { @@ -1033,8 +1045,15 @@ func NewNamespaceCommand(getNamespaceClientFn GetNamespaceClientFn) (CommandOut, Name: "list", Usage: "List all known namespaces", Aliases: []string{"l"}, + Flags: []cli.Flag{ + pageTokenFlag, + &cli.IntFlag{ + Name: pageSizeFlagName, + Usage: "Number of namespaces to list per page", + }, + }, Action: func(ctx *cli.Context) error { - return c.listNamespaces() + return c.listNamespaces(ctx.String(pageTokenFlagName), ctx.Int(pageSizeFlagName)) }, }, { diff --git a/app/namespace_test.go b/app/namespace_test.go index 7fe9be00..c5412819 100644 --- a/app/namespace_test.go +++ b/app/namespace_test.go @@ -144,8 +144,32 @@ func (s *NamespaceTestSuite) TestList() { s.mockService.EXPECT().ListNamespaces(gomock.Any(), &namespaceservice.ListNamespacesRequest{ PageToken: "token3", }).Return(&namespaceservice.ListNamespacesResponse{}, nil).Times(1) - s.NoError(s.RunCmd("namespace", "list")) + + s.mockService.EXPECT().ListNamespaces(gomock.Any(), &namespaceservice.ListNamespacesRequest{ + PageToken: "foo", + }).Return(&namespaceservice.ListNamespacesResponse{ + Namespaces: []string{"ns1", "ns2"}, + NextPageToken: "bar", + }, nil).Times(1) + s.NoError(s.RunCmd("namespace", "list", "--page-token", "foo")) + + s.mockService.EXPECT().ListNamespaces(gomock.Any(), &namespaceservice.ListNamespacesRequest{ + PageSize: 10, + }).Return(&namespaceservice.ListNamespacesResponse{ + Namespaces: []string{"ns1", "ns2"}, + NextPageToken: "foo", + }, nil).Times(1) + s.NoError(s.RunCmd("namespace", "list", "--page-size", "10")) + + s.mockService.EXPECT().ListNamespaces(gomock.Any(), &namespaceservice.ListNamespacesRequest{ + PageToken: "foo", + PageSize: 10, + }).Return(&namespaceservice.ListNamespacesResponse{ + Namespaces: []string{"ns1", "ns2"}, + NextPageToken: "bar", + }, nil).Times(1) + s.NoError(s.RunCmd("namespace", "list", "--page-token", "foo", "--page-size", "10")) } func (s *NamespaceTestSuite) TestDeleteProtection() { From 53fa2dbef921976ce479a0c4808c68b3eae43776 Mon Sep 17 00:00:00 2001 From: Shakeel Rao Date: Wed, 29 Oct 2025 15:54:10 -0400 Subject: [PATCH 2/5] comment --- app/namespace.go | 1 + 1 file changed, 1 insertion(+) diff --git a/app/namespace.go b/app/namespace.go index 33e0e6be..ecd6b2d3 100644 --- a/app/namespace.go +++ b/app/namespace.go @@ -336,6 +336,7 @@ func (c *NamespaceClient) deleteRegion(ctx *cli.Context) error { } func (c *NamespaceClient) listNamespaces(requestedPageToken string, pageSize int) error { + // Fetch a single page of namespaces. if len(requestedPageToken) > 0 || pageSize > 0 { res, err := c.client.ListNamespaces(c.ctx, &namespaceservice.ListNamespacesRequest{ PageToken: requestedPageToken, From 4f96a16b2518634252c05769fdd3ac05e1b6098f Mon Sep 17 00:00:00 2001 From: Shakeel Rao Date: Wed, 29 Oct 2025 16:01:00 -0400 Subject: [PATCH 3/5] bound page size --- app/namespace.go | 10 +++++++++- app/namespace_test.go | 2 ++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/app/namespace.go b/app/namespace.go index ecd6b2d3..c84104c9 100644 --- a/app/namespace.go +++ b/app/namespace.go @@ -61,6 +61,11 @@ const ( AuthMethodAPIKeyOrMTLS = "api_key_or_mtls" ) +const ( + MaxPageSize = 1000 + DefaultPageSize = 100 +) + var ( AuthMethods = []string{ AuthMethodRestricted, @@ -121,7 +126,7 @@ var ( pageSizeFlag = &cli.IntFlag{ Name: "page-size", Usage: "The page size for list operations", - Value: 100, + Value: DefaultPageSize, } pageTokenFlag = &cli.StringFlag{ Name: "page-token", @@ -1054,6 +1059,9 @@ func NewNamespaceCommand(getNamespaceClientFn GetNamespaceClientFn) (CommandOut, }, }, Action: func(ctx *cli.Context) error { + if ctx.Int(pageSizeFlagName) > MaxPageSize { + return fmt.Errorf("page size cannot be greater than %d", MaxPageSize) + } return c.listNamespaces(ctx.String(pageTokenFlagName), ctx.Int(pageSizeFlagName)) }, }, diff --git a/app/namespace_test.go b/app/namespace_test.go index c5412819..5dc7a063 100644 --- a/app/namespace_test.go +++ b/app/namespace_test.go @@ -4,6 +4,7 @@ import ( "context" "encoding/base64" "errors" + "fmt" "os" "strings" "testing" @@ -105,6 +106,7 @@ func (s *NamespaceTestSuite) TestGet() { } func (s *NamespaceTestSuite) TestList() { + s.Error(s.RunCmd("namespace", "list", "--page-size", fmt.Sprintf("%d", MaxPageSize+1))) s.mockService.EXPECT().ListNamespaces(gomock.Any(), &namespaceservice.ListNamespacesRequest{}).Return(nil, errors.New("some error")).Times(1) s.Error(s.RunCmd("namespace", "list")) From ec84257626ee6adcfe11fc1791cb80e10868d3d3 Mon Sep 17 00:00:00 2001 From: Shakeel Rao Date: Wed, 29 Oct 2025 16:22:17 -0400 Subject: [PATCH 4/5] bound page size 2.0 --- app/namespace.go | 9 +++++++-- app/namespace_test.go | 2 ++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/app/namespace.go b/app/namespace.go index c84104c9..ea1eb49d 100644 --- a/app/namespace.go +++ b/app/namespace.go @@ -1059,8 +1059,13 @@ func NewNamespaceCommand(getNamespaceClientFn GetNamespaceClientFn) (CommandOut, }, }, Action: func(ctx *cli.Context) error { - if ctx.Int(pageSizeFlagName) > MaxPageSize { - return fmt.Errorf("page size cannot be greater than %d", MaxPageSize) + if ctx.IsSet(pageSizeFlagName) { + if ctx.Int(pageSizeFlagName) <= 0 { + return fmt.Errorf("page size cannot be less than or equal to 0") + } + if ctx.Int(pageSizeFlagName) > MaxPageSize { + return fmt.Errorf("page size cannot be greater than %d", MaxPageSize) + } } return c.listNamespaces(ctx.String(pageTokenFlagName), ctx.Int(pageSizeFlagName)) }, diff --git a/app/namespace_test.go b/app/namespace_test.go index 5dc7a063..08e17d82 100644 --- a/app/namespace_test.go +++ b/app/namespace_test.go @@ -106,6 +106,8 @@ func (s *NamespaceTestSuite) TestGet() { } func (s *NamespaceTestSuite) TestList() { + s.Error(s.RunCmd("namespace", "list", "--page-size", "0")) + s.Error(s.RunCmd("namespace", "list", "--page-size", "-1")) s.Error(s.RunCmd("namespace", "list", "--page-size", fmt.Sprintf("%d", MaxPageSize+1))) s.mockService.EXPECT().ListNamespaces(gomock.Any(), &namespaceservice.ListNamespacesRequest{}).Return(nil, errors.New("some error")).Times(1) From 580eb2c1b70cb249c166fea73da6578958dd4e59 Mon Sep 17 00:00:00 2001 From: Shakeel Rao Date: Wed, 29 Oct 2025 16:24:47 -0400 Subject: [PATCH 5/5] strconv --- app/namespace_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/namespace_test.go b/app/namespace_test.go index 08e17d82..fe4ab8ed 100644 --- a/app/namespace_test.go +++ b/app/namespace_test.go @@ -4,8 +4,8 @@ import ( "context" "encoding/base64" "errors" - "fmt" "os" + "strconv" "strings" "testing" @@ -108,7 +108,7 @@ func (s *NamespaceTestSuite) TestGet() { func (s *NamespaceTestSuite) TestList() { s.Error(s.RunCmd("namespace", "list", "--page-size", "0")) s.Error(s.RunCmd("namespace", "list", "--page-size", "-1")) - s.Error(s.RunCmd("namespace", "list", "--page-size", fmt.Sprintf("%d", MaxPageSize+1))) + s.Error(s.RunCmd("namespace", "list", "--page-size", strconv.Itoa(MaxPageSize+1))) s.mockService.EXPECT().ListNamespaces(gomock.Any(), &namespaceservice.ListNamespacesRequest{}).Return(nil, errors.New("some error")).Times(1) s.Error(s.RunCmd("namespace", "list"))