From b620650f4ddd5e9c0c2321443fe4f53ed3f5a84b Mon Sep 17 00:00:00 2001 From: v-alingampally Date: Wed, 20 May 2026 16:04:40 -0400 Subject: [PATCH] Add DI doctl command examples --- args.go | 6 + commands/dedicated_inference.go | 28 ++-- commands/dedicated_inference_test.go | 32 ++++- do/dedicated_inference.go | 30 ++-- do/mocks/DedicatedInferenceService.go | 134 +++++++++--------- ...icated_inference_list_accelerators_test.go | 64 +++++++-- 6 files changed, 190 insertions(+), 104 deletions(-) diff --git a/args.go b/args.go index fe31a1671..b58109a52 100644 --- a/args.go +++ b/args.go @@ -877,4 +877,10 @@ const ( // ArgDedicatedInferenceTokenName is the name for a dedicated inference auth token. ArgDedicatedInferenceTokenName = "token-name" + + // ArgDedicatedInferenceAcceleratorPage is the page number for paginated accelerator results. + ArgDedicatedInferenceAcceleratorPage = "page" + + // ArgDedicatedInferenceAcceleratorPerPage is the number of accelerator results per page. + ArgDedicatedInferenceAcceleratorPerPage = "per-page" ) diff --git a/commands/dedicated_inference.go b/commands/dedicated_inference.go index e90e7c825..0606e8b0c 100644 --- a/commands/dedicated_inference.go +++ b/commands/dedicated_inference.go @@ -47,16 +47,19 @@ func DedicatedInferenceCmd() *Command { "Create a dedicated inference endpoint", `Creates a dedicated inference endpoint on your account using a spec file in JSON or YAML format. Use the `+"`"+`--spec`+"`"+` flag to provide the path to the spec file. -Optionally provide a Hugging Face access token using `+"`"+`--hugging-face-token`+"`"+`.`, +Optionally provide a Hugging Face access token using `+"`"+`--hugging-face-token`+"`"+` for gated models. +For more information, see https://docs.digitalocean.com/reference/api/digitalocean/#tag/Dedicated-Inference/operation/dedicatedInferences_create`, Writer, aliasOpt("c"), displayerType(&displayers.DedicatedInference{}), ) AddStringFlag(cmdCreate, doctl.ArgDedicatedInferenceSpec, "", "", `Path to a dedicated inference spec in JSON or YAML format. Set to "-" to read from stdin.`, requiredOpt()) AddStringFlag(cmdCreate, doctl.ArgDedicatedInferenceHuggingFaceToken, "", "", "Hugging Face token for accessing gated models (optional)") - cmdCreate.Example = `The following example creates a dedicated inference endpoint using a spec file: doctl dedicated-inference create --spec spec.yaml --hugging-face-token "hf_mytoken" + cmdCreate.Example = `The following example creates a dedicated inference endpoint using a YAML spec file: doctl dedicated-inference create --spec spec.yaml -For more information, see https://docs.digitalocean.com/reference/api/digitalocean/#tag/Dedicated-Inference/operation/dedicatedInferences_create` +The following example creates a dedicated inference endpoint for a gated Hugging Face model by also providing an access token: doctl dedicated-inference create --spec spec.yaml --hugging-face-token "hf_mytoken" + +The following example creates a dedicated inference endpoint by piping the spec from stdin: cat spec.yaml | doctl dedicated-inference create --spec -` cmdGet := CmdBuilder( cmd, @@ -89,16 +92,19 @@ For more information, see https://docs.digitalocean.com/reference/api/digitaloce "Update a dedicated inference endpoint", `Updates a dedicated inference endpoint using a spec file in JSON or YAML format. Use the `+"`"+`--spec`+"`"+` flag to provide the path to the spec file. -Optionally provide a Hugging Face access token using `+"`"+`--hugging-face-token`+"`"+`.`, +Optionally provide a Hugging Face access token using `+"`"+`--hugging-face-token`+"`"+` for gated models. +For more information, see https://docs.digitalocean.com/reference/api/digitalocean/#tag/Dedicated-Inference/operation/dedicatedInferences_update`, Writer, aliasOpt("u"), displayerType(&displayers.DedicatedInference{}), ) AddStringFlag(cmdUpdate, doctl.ArgDedicatedInferenceSpec, "", "", `Path to a dedicated inference spec in JSON or YAML format. Set to "-" to read from stdin.`, requiredOpt()) AddStringFlag(cmdUpdate, doctl.ArgDedicatedInferenceHuggingFaceToken, "", "", "Hugging Face token for accessing gated models (optional)") - cmdUpdate.Example = `The following example updates a dedicated inference endpoint using a spec file: doctl dedicated-inference update 12345678-1234-1234-1234-123456789012 --spec spec.yaml + cmdUpdate.Example = `The following example updates a dedicated inference endpoint using a YAML spec file: doctl dedicated-inference update 12345678-1234-1234-1234-123456789012 --spec spec.yaml + +The following example updates a dedicated inference endpoint for a gated Hugging Face model by also providing an access token: doctl dedicated-inference update 12345678-1234-1234-1234-123456789012 --spec spec.yaml --hugging-face-token "hf_mytoken" -For more information, see https://docs.digitalocean.com/reference/api/digitalocean/#tag/Dedicated-Inference/operation/dedicatedInferences_update` +The following example updates a dedicated inference endpoint by piping the spec from stdin: cat spec.yaml | doctl dedicated-inference update 12345678-1234-1234-1234-123456789012 --spec -` cmdList := CmdBuilder( cmd, @@ -131,9 +137,13 @@ Optionally use `+"`"+`--slug`+"`"+` to filter by accelerator slug.`, displayerType(&displayers.DedicatedInferenceAccelerator{}), ) AddStringFlag(cmdListAccelerators, doctl.ArgDedicatedInferenceAcceleratorSlug, "", "", "Filter accelerators by slug (optional)") + AddIntFlag(cmdListAccelerators, doctl.ArgDedicatedInferenceAcceleratorPage, "", 1, "Page number for paginated results (optional)") + AddIntFlag(cmdListAccelerators, doctl.ArgDedicatedInferenceAcceleratorPerPage, "", 20, "Number of results per page (optional)") cmdListAccelerators.Example = `The following example lists accelerators for a dedicated inference endpoint: doctl dedicated-inference list-accelerators 12345678-1234-1234-1234-123456789012 -The following example filters by slug: doctl dedicated-inference list-accelerators 12345678-1234-1234-1234-123456789012 --slug gpu-mi300x1-192gb` +The following example filters by slug: doctl dedicated-inference list-accelerators 12345678-1234-1234-1234-123456789012 --slug gpu-mi300x1-192gb + +The following example retrieves the second page of accelerators with 10 results per page: doctl dedicated-inference list-accelerators 12345678-1234-1234-1234-123456789012 --page 2 --per-page 10` cmdCreateToken := CmdBuilder( cmd, @@ -304,8 +314,10 @@ func RunDedicatedInferenceListAccelerators(c *CmdConfig) error { diID := c.Args[0] slug, _ := c.Doit.GetString(c.NS, doctl.ArgDedicatedInferenceAcceleratorSlug) + page, _ := c.Doit.GetInt(c.NS, doctl.ArgDedicatedInferenceAcceleratorPage) + perPage, _ := c.Doit.GetInt(c.NS, doctl.ArgDedicatedInferenceAcceleratorPerPage) - accelerators, err := c.DedicatedInferences().ListAccelerators(diID, slug) + accelerators, err := c.DedicatedInferences().ListAccelerators(diID, slug, page, perPage) if err != nil { return err } diff --git a/commands/dedicated_inference_test.go b/commands/dedicated_inference_test.go index 015d78ace..c1dd1a11f 100644 --- a/commands/dedicated_inference_test.go +++ b/commands/dedicated_inference_test.go @@ -381,9 +381,11 @@ func TestRunDedicatedInferenceListAccelerators(t *testing.T) { }, } - tm.dedicatedInferences.EXPECT().ListAccelerators("00000000-0000-4000-8000-000000000000", "").Return(testAccelerators, nil) + tm.dedicatedInferences.EXPECT().ListAccelerators("00000000-0000-4000-8000-000000000000", "", 1, 20).Return(testAccelerators, nil) config.Args = append(config.Args, "00000000-0000-4000-8000-000000000000") + config.Doit.Set(config.NS, doctl.ArgDedicatedInferenceAcceleratorPage, 1) + config.Doit.Set(config.NS, doctl.ArgDedicatedInferenceAcceleratorPerPage, 20) err := RunDedicatedInferenceListAccelerators(config) assert.NoError(t, err) @@ -403,10 +405,36 @@ func TestRunDedicatedInferenceListAccelerators_WithSlug(t *testing.T) { }, } - tm.dedicatedInferences.EXPECT().ListAccelerators("00000000-0000-4000-8000-000000000000", "gpu-mi300x1-192gb").Return(testAccelerators, nil) + tm.dedicatedInferences.EXPECT().ListAccelerators("00000000-0000-4000-8000-000000000000", "gpu-mi300x1-192gb", 1, 20).Return(testAccelerators, nil) config.Args = append(config.Args, "00000000-0000-4000-8000-000000000000") config.Doit.Set(config.NS, doctl.ArgDedicatedInferenceAcceleratorSlug, "gpu-mi300x1-192gb") + config.Doit.Set(config.NS, doctl.ArgDedicatedInferenceAcceleratorPage, 1) + config.Doit.Set(config.NS, doctl.ArgDedicatedInferenceAcceleratorPerPage, 20) + + err := RunDedicatedInferenceListAccelerators(config) + assert.NoError(t, err) + }) +} + +func TestRunDedicatedInferenceListAccelerators_WithPagination(t *testing.T) { + withTestClient(t, func(config *CmdConfig, tm *tcMocks) { + testAccelerators := do.DedicatedInferenceAcceleratorInfos{ + { + DedicatedInferenceAcceleratorInfo: &godo.DedicatedInferenceAcceleratorInfo{ + ID: "accel-3", + Name: "gpu-h100x1-80gb", + Slug: "gpu-h100x1-80gb", + Status: "ACTIVE", + }, + }, + } + + tm.dedicatedInferences.EXPECT().ListAccelerators("00000000-0000-4000-8000-000000000000", "", 2, 10).Return(testAccelerators, nil) + + config.Args = append(config.Args, "00000000-0000-4000-8000-000000000000") + config.Doit.Set(config.NS, doctl.ArgDedicatedInferenceAcceleratorPage, 2) + config.Doit.Set(config.NS, doctl.ArgDedicatedInferenceAcceleratorPerPage, 10) err := RunDedicatedInferenceListAccelerators(config) assert.NoError(t, err) diff --git a/do/dedicated_inference.go b/do/dedicated_inference.go index 875198044..55f840478 100644 --- a/do/dedicated_inference.go +++ b/do/dedicated_inference.go @@ -74,7 +74,7 @@ type DedicatedInferenceService interface { Update(id string, req *godo.DedicatedInferenceUpdateRequest) (*DedicatedInference, error) List(region string, name string) (DedicatedInferenceListItems, error) Delete(id string) error - ListAccelerators(diID string, slug string) (DedicatedInferenceAcceleratorInfos, error) + ListAccelerators(diID string, slug string, page int, perPage int) (DedicatedInferenceAcceleratorInfos, error) CreateToken(diID string, req *godo.DedicatedInferenceTokenCreateRequest) (*DedicatedInferenceToken, error) ListTokens(diID string) (DedicatedInferenceTokens, error) RevokeToken(diID string, tokenID string) error @@ -161,31 +161,23 @@ func (s *dedicatedInferenceService) List(region string, name string) (DedicatedI } // ListAccelerators lists accelerators for a dedicated inference endpoint. -func (s *dedicatedInferenceService) ListAccelerators(diID string, slug string) (DedicatedInferenceAcceleratorInfos, error) { - f := func(opt *godo.ListOptions) ([]any, *godo.Response, error) { - list, resp, err := s.client.DedicatedInference.ListAccelerators(context.TODO(), diID, &godo.DedicatedInferenceListAcceleratorsOptions{Slug: slug, ListOptions: *opt}) - if err != nil { - return nil, nil, err - } - - items := make([]any, len(list)) - for i := range list { - items[i] = list[i] - } - return items, resp, nil +func (s *dedicatedInferenceService) ListAccelerators(diID string, slug string, page int, perPage int) (DedicatedInferenceAcceleratorInfos, error) { + opts := &godo.DedicatedInferenceListAcceleratorsOptions{ + Slug: slug, + ListOptions: godo.ListOptions{Page: page, PerPage: perPage}, } - si, err := PaginateResp(f) + list, _, err := s.client.DedicatedInference.ListAccelerators(context.TODO(), diID, opts) if err != nil { return nil, err } - list := make(DedicatedInferenceAcceleratorInfos, len(si)) - for i := range si { - a := si[i].(godo.DedicatedInferenceAcceleratorInfo) - list[i] = DedicatedInferenceAcceleratorInfo{DedicatedInferenceAcceleratorInfo: &a} + result := make(DedicatedInferenceAcceleratorInfos, len(list)) + for i := range list { + a := list[i] + result[i] = DedicatedInferenceAcceleratorInfo{DedicatedInferenceAcceleratorInfo: &a} } - return list, nil + return result, nil } // CreateToken creates a new auth token for a dedicated inference endpoint. diff --git a/do/mocks/DedicatedInferenceService.go b/do/mocks/DedicatedInferenceService.go index c86ff2cee..8ec90265b 100644 --- a/do/mocks/DedicatedInferenceService.go +++ b/do/mocks/DedicatedInferenceService.go @@ -57,6 +57,21 @@ func (mr *MockDedicatedInferenceServiceMockRecorder) Create(req any) *gomock.Cal return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Create", reflect.TypeOf((*MockDedicatedInferenceService)(nil).Create), req) } +// CreateToken mocks base method. +func (m *MockDedicatedInferenceService) CreateToken(diID string, req *godo.DedicatedInferenceTokenCreateRequest) (*do.DedicatedInferenceToken, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CreateToken", diID, req) + ret0, _ := ret[0].(*do.DedicatedInferenceToken) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CreateToken indicates an expected call of CreateToken. +func (mr *MockDedicatedInferenceServiceMockRecorder) CreateToken(diID, req any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateToken", reflect.TypeOf((*MockDedicatedInferenceService)(nil).CreateToken), diID, req) +} + // Delete mocks base method. func (m *MockDedicatedInferenceService) Delete(id string) error { m.ctrl.T.Helper() @@ -71,64 +86,80 @@ func (mr *MockDedicatedInferenceServiceMockRecorder) Delete(id any) *gomock.Call return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockDedicatedInferenceService)(nil).Delete), id) } -// ListAccelerators mocks base method. -func (m *MockDedicatedInferenceService) ListAccelerators(diID string, slug string) (do.DedicatedInferenceAcceleratorInfos, error) { +// Get mocks base method. +func (m *MockDedicatedInferenceService) Get(id string) (*do.DedicatedInference, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "ListAccelerators", diID, slug) - ret0, _ := ret[0].(do.DedicatedInferenceAcceleratorInfos) + ret := m.ctrl.Call(m, "Get", id) + ret0, _ := ret[0].(*do.DedicatedInference) ret1, _ := ret[1].(error) return ret0, ret1 } -// ListAccelerators indicates an expected call of ListAccelerators. -func (mr *MockDedicatedInferenceServiceMockRecorder) ListAccelerators(diID any, slug any) *gomock.Call { +// Get indicates an expected call of Get. +func (mr *MockDedicatedInferenceServiceMockRecorder) Get(id any) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListAccelerators", reflect.TypeOf((*MockDedicatedInferenceService)(nil).ListAccelerators), diID, slug) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockDedicatedInferenceService)(nil).Get), id) } -// List mocks base method. -func (m *MockDedicatedInferenceService) List(region string, name string) (do.DedicatedInferenceListItems, error) { +// GetGPUModelConfig mocks base method. +func (m *MockDedicatedInferenceService) GetGPUModelConfig() (do.DedicatedInferenceGPUModelConfigs, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "List", region, name) - ret0, _ := ret[0].(do.DedicatedInferenceListItems) + ret := m.ctrl.Call(m, "GetGPUModelConfig") + ret0, _ := ret[0].(do.DedicatedInferenceGPUModelConfigs) ret1, _ := ret[1].(error) return ret0, ret1 } -// List indicates an expected call of List. -func (mr *MockDedicatedInferenceServiceMockRecorder) List(region any, name any) *gomock.Call { +// GetGPUModelConfig indicates an expected call of GetGPUModelConfig. +func (mr *MockDedicatedInferenceServiceMockRecorder) GetGPUModelConfig() *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "List", reflect.TypeOf((*MockDedicatedInferenceService)(nil).List), region, name) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetGPUModelConfig", reflect.TypeOf((*MockDedicatedInferenceService)(nil).GetGPUModelConfig)) } -// Update mocks base method. -func (m *MockDedicatedInferenceService) Update(id string, req *godo.DedicatedInferenceUpdateRequest) (*do.DedicatedInference, error) { +// GetSizes mocks base method. +func (m *MockDedicatedInferenceService) GetSizes() ([]string, do.DedicatedInferenceSizes, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Update", id, req) - ret0, _ := ret[0].(*do.DedicatedInference) + ret := m.ctrl.Call(m, "GetSizes") + ret0, _ := ret[0].([]string) + ret1, _ := ret[1].(do.DedicatedInferenceSizes) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// GetSizes indicates an expected call of GetSizes. +func (mr *MockDedicatedInferenceServiceMockRecorder) GetSizes() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetSizes", reflect.TypeOf((*MockDedicatedInferenceService)(nil).GetSizes)) +} + +// List mocks base method. +func (m *MockDedicatedInferenceService) List(region, name string) (do.DedicatedInferenceListItems, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "List", region, name) + ret0, _ := ret[0].(do.DedicatedInferenceListItems) ret1, _ := ret[1].(error) return ret0, ret1 } -// Update indicates an expected call of Update. -func (mr *MockDedicatedInferenceServiceMockRecorder) Update(id any, req any) *gomock.Call { +// List indicates an expected call of List. +func (mr *MockDedicatedInferenceServiceMockRecorder) List(region, name any) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Update", reflect.TypeOf((*MockDedicatedInferenceService)(nil).Update), id, req) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "List", reflect.TypeOf((*MockDedicatedInferenceService)(nil).List), region, name) } -// CreateToken mocks base method. -func (m *MockDedicatedInferenceService) CreateToken(diID string, req *godo.DedicatedInferenceTokenCreateRequest) (*do.DedicatedInferenceToken, error) { +// ListAccelerators mocks base method. +func (m *MockDedicatedInferenceService) ListAccelerators(diID, slug string, page, perPage int) (do.DedicatedInferenceAcceleratorInfos, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "CreateToken", diID, req) - ret0, _ := ret[0].(*do.DedicatedInferenceToken) + ret := m.ctrl.Call(m, "ListAccelerators", diID, slug, page, perPage) + ret0, _ := ret[0].(do.DedicatedInferenceAcceleratorInfos) ret1, _ := ret[1].(error) return ret0, ret1 } -// CreateToken indicates an expected call of CreateToken. -func (mr *MockDedicatedInferenceServiceMockRecorder) CreateToken(diID any, req any) *gomock.Call { +// ListAccelerators indicates an expected call of ListAccelerators. +func (mr *MockDedicatedInferenceServiceMockRecorder) ListAccelerators(diID, slug, page, perPage any) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateToken", reflect.TypeOf((*MockDedicatedInferenceService)(nil).CreateToken), diID, req) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListAccelerators", reflect.TypeOf((*MockDedicatedInferenceService)(nil).ListAccelerators), diID, slug, page, perPage) } // ListTokens mocks base method. @@ -147,7 +178,7 @@ func (mr *MockDedicatedInferenceServiceMockRecorder) ListTokens(diID any) *gomoc } // RevokeToken mocks base method. -func (m *MockDedicatedInferenceService) RevokeToken(diID string, tokenID string) error { +func (m *MockDedicatedInferenceService) RevokeToken(diID, tokenID string) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "RevokeToken", diID, tokenID) ret0, _ := ret[0].(error) @@ -155,53 +186,22 @@ func (m *MockDedicatedInferenceService) RevokeToken(diID string, tokenID string) } // RevokeToken indicates an expected call of RevokeToken. -func (mr *MockDedicatedInferenceServiceMockRecorder) RevokeToken(diID any, tokenID any) *gomock.Call { +func (mr *MockDedicatedInferenceServiceMockRecorder) RevokeToken(diID, tokenID any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RevokeToken", reflect.TypeOf((*MockDedicatedInferenceService)(nil).RevokeToken), diID, tokenID) } -// GetSizes mocks base method. -func (m *MockDedicatedInferenceService) GetSizes() ([]string, do.DedicatedInferenceSizes, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetSizes") - ret0, _ := ret[0].([]string) - ret1, _ := ret[1].(do.DedicatedInferenceSizes) - ret2, _ := ret[2].(error) - return ret0, ret1, ret2 -} - -// GetSizes indicates an expected call of GetSizes. -func (mr *MockDedicatedInferenceServiceMockRecorder) GetSizes() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetSizes", reflect.TypeOf((*MockDedicatedInferenceService)(nil).GetSizes)) -} - -// GetGPUModelConfig mocks base method. -func (m *MockDedicatedInferenceService) GetGPUModelConfig() (do.DedicatedInferenceGPUModelConfigs, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetGPUModelConfig") - ret0, _ := ret[0].(do.DedicatedInferenceGPUModelConfigs) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetGPUModelConfig indicates an expected call of GetGPUModelConfig. -func (mr *MockDedicatedInferenceServiceMockRecorder) GetGPUModelConfig() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetGPUModelConfig", reflect.TypeOf((*MockDedicatedInferenceService)(nil).GetGPUModelConfig)) -} - -// Get mocks base method. -func (m *MockDedicatedInferenceService) Get(id string) (*do.DedicatedInference, error) { +// Update mocks base method. +func (m *MockDedicatedInferenceService) Update(id string, req *godo.DedicatedInferenceUpdateRequest) (*do.DedicatedInference, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Get", id) + ret := m.ctrl.Call(m, "Update", id, req) ret0, _ := ret[0].(*do.DedicatedInference) ret1, _ := ret[1].(error) return ret0, ret1 } -// Get indicates an expected call of Get. -func (mr *MockDedicatedInferenceServiceMockRecorder) Get(id any) *gomock.Call { +// Update indicates an expected call of Update. +func (mr *MockDedicatedInferenceServiceMockRecorder) Update(id, req any) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockDedicatedInferenceService)(nil).Get), id) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Update", reflect.TypeOf((*MockDedicatedInferenceService)(nil).Update), id, req) } diff --git a/integration/dedicated_inference_list_accelerators_test.go b/integration/dedicated_inference_list_accelerators_test.go index b958fa994..c64501e00 100644 --- a/integration/dedicated_inference_list_accelerators_test.go +++ b/integration/dedicated_inference_list_accelerators_test.go @@ -37,16 +37,25 @@ var _ = suite("dedicated-inference/list-accelerators", func(t *testing.T, when s return } - // Check for slug filter query param - slugFilter := req.URL.Query().Get("slug") - if slugFilter == "gpu-mi300x1-192gb" { - w.Header().Set("Content-Type", "application/json") - w.Write([]byte(dedicatedInferenceListAcceleratorsFilteredResponse)) - return - } + // Check for slug filter query param + slugFilter := req.URL.Query().Get("slug") + if slugFilter == "gpu-mi300x1-192gb" { + w.Header().Set("Content-Type", "application/json") + w.Write([]byte(dedicatedInferenceListAcceleratorsFilteredResponse)) + return + } + // Check for pagination query params + pageParam := req.URL.Query().Get("page") + perPageParam := req.URL.Query().Get("per_page") + if pageParam == "2" && perPageParam == "10" { w.Header().Set("Content-Type", "application/json") - w.Write([]byte(dedicatedInferenceListAcceleratorsResponse)) + w.Write([]byte(dedicatedInferenceListAcceleratorsPaginatedResponse)) + return + } + + w.Header().Set("Content-Type", "application/json") + w.Write([]byte(dedicatedInferenceListAcceleratorsResponse)) case "/v2/dedicated-inferences/99999999-9999-4999-8999-999999999999/accelerators": auth := req.Header.Get("Authorization") if auth != "Bearer some-magic-token" { @@ -173,6 +182,24 @@ var _ = suite("dedicated-inference/list-accelerators", func(t *testing.T, when s expect.Equal(strings.TrimSpace(dedicatedInferenceListAcceleratorsOutput), strings.TrimSpace(string(output))) }) }) + + when("pagination flags are provided", func() { + it("sends page and per_page query params and returns paginated results", func() { + cmd = exec.Command(builtBinaryPath, + "-t", "some-magic-token", + "-u", server.URL, + "dedicated-inference", + "list-accelerators", + "00000000-0000-4000-8000-000000000000", + "--page", "2", + "--per-page", "10", + ) + + output, err := cmd.CombinedOutput() + expect.NoError(err, fmt.Sprintf("received error output: %s", output)) + expect.Equal(strings.TrimSpace(dedicatedInferenceListAcceleratorsPaginatedOutput), strings.TrimSpace(string(output))) + }) + }) }) const ( @@ -231,5 +258,26 @@ acc-002 gpu-h100x1-80gb ACTIVE "total": 1 } } +` + dedicatedInferenceListAcceleratorsPaginatedOutput = ` +ID Name Slug Status Created At +acc-003 decode-gpu-2 gpu-h100x2-80gb ACTIVE 2023-06-01 00:00:00 +0000 UTC +` + dedicatedInferenceListAcceleratorsPaginatedResponse = ` +{ + "accelerators": [ + { + "id": "acc-003", + "name": "decode-gpu-2", + "slug": "gpu-h100x2-80gb", + "status": "ACTIVE", + "created_at": "2023-06-01T00:00:00Z" + } + ], + "links": {}, + "meta": { + "total": 11 + } +} ` )