Skip to content
This repository was archived by the owner on Aug 30, 2024. It is now read-only.

Commit f799e20

Browse files
committed
fix: use proper API type for resource pool list
1 parent fcf87d5 commit f799e20

File tree

6 files changed

+83
-37
lines changed

6 files changed

+83
-37
lines changed

coder-sdk/interface.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -203,10 +203,10 @@ type Client interface {
203203
APIVersion(ctx context.Context) (string, error)
204204

205205
// WorkspaceProviderByID fetches a workspace provider entity by its unique ID.
206-
WorkspaceProviderByID(ctx context.Context, id string) (*WorkspaceProvider, error)
206+
WorkspaceProviderByID(ctx context.Context, id string) (*KubernetesProvider, error)
207207

208208
// WorkspaceProviders fetches all workspace providers known to the Coder control plane.
209-
WorkspaceProviders(ctx context.Context) ([]WorkspaceProvider, error)
209+
WorkspaceProviders(ctx context.Context) (*WorkspaceProviders, error)
210210

211211
// CreateWorkspaceProvider creates a new WorkspaceProvider entity.
212212
CreateWorkspaceProvider(ctx context.Context, req CreateWorkspaceProviderReq) (*CreateWorkspaceProviderRes, error)

coder-sdk/workspace_providers.go

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,13 @@ import (
55
"net/http"
66
)
77

8-
// WorkspaceProvider defines an entity capable of deploying and acting as an ingress for Coder environments.
9-
type WorkspaceProvider struct {
8+
// WorkspaceProviders defines all available Coder workspace provider targets.
9+
type WorkspaceProviders struct {
10+
Kubernetes []KubernetesProvider `json:"kubernetes"`
11+
}
12+
13+
// KubernetesProvider defines an entity capable of deploying and acting as an ingress for Coder environments.
14+
type KubernetesProvider struct {
1015
ID string `json:"id" table:"-"`
1116
Name string `json:"name" table:"Name"`
1217
Status WorkspaceProviderStatus `json:"status" table:"Status"`
@@ -32,8 +37,8 @@ const (
3237
)
3338

3439
// WorkspaceProviderByID fetches a workspace provider entity by its unique ID.
35-
func (c *DefaultClient) WorkspaceProviderByID(ctx context.Context, id string) (*WorkspaceProvider, error) {
36-
var wp WorkspaceProvider
40+
func (c *DefaultClient) WorkspaceProviderByID(ctx context.Context, id string) (*KubernetesProvider, error) {
41+
var wp KubernetesProvider
3742
err := c.requestBody(ctx, http.MethodGet, "/api/private/resource-pools/"+id, nil, &wp)
3843
if err != nil {
3944
return nil, err
@@ -42,13 +47,13 @@ func (c *DefaultClient) WorkspaceProviderByID(ctx context.Context, id string) (*
4247
}
4348

4449
// WorkspaceProviders fetches all workspace providers known to the Coder control plane.
45-
func (c *DefaultClient) WorkspaceProviders(ctx context.Context) ([]WorkspaceProvider, error) {
46-
var providers []WorkspaceProvider
50+
func (c *DefaultClient) WorkspaceProviders(ctx context.Context) (*WorkspaceProviders, error) {
51+
var providers WorkspaceProviders
4752
err := c.requestBody(ctx, http.MethodGet, "/api/private/resource-pools", nil, &providers)
4853
if err != nil {
4954
return nil, err
5055
}
51-
return providers, nil
56+
return &providers, nil
5257
}
5358

5459
// CreateWorkspaceProviderReq defines the request parameters for creating a new workspace provider entity.

internal/cmd/envs.go

Lines changed: 40 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -152,15 +152,16 @@ coder envs --user charlie@coder.com ls -o json \
152152

153153
func createEnvCmd() *cobra.Command {
154154
var (
155-
org string
156-
cpu float32
157-
memory float32
158-
disk int
159-
gpus int
160-
img string
161-
tag string
162-
follow bool
163-
useCVM bool
155+
org string
156+
cpu float32
157+
memory float32
158+
disk int
159+
gpus int
160+
img string
161+
tag string
162+
follow bool
163+
useCVM bool
164+
providerName string
164165
)
165166

166167
cmd := &cobra.Command{
@@ -199,9 +200,17 @@ coder envs create my-new-powerful-env --cpu 12 --disk 100 --memory 16 --image ub
199200
return err
200201
}
201202

202-
provider, err := coderutil.DefaultWorkspaceProvider(ctx, client)
203-
if err != nil {
204-
return xerrors.Errorf("default workspace provider: %w", err)
203+
var provider *coder.KubernetesProvider
204+
if providerName == "" {
205+
provider, err = coderutil.DefaultWorkspaceProvider(ctx, client)
206+
if err != nil {
207+
return xerrors.Errorf("default workspace provider: %w", err)
208+
}
209+
} else {
210+
provider, err = coderutil.ProviderByName(ctx, client, providerName)
211+
if err != nil {
212+
return xerrors.Errorf("provider by name: %w", err)
213+
}
205214
}
206215

207216
// ExactArgs(1) ensures our name value can't panic on an out of bounds.
@@ -258,6 +267,7 @@ coder envs create my-new-powerful-env --cpu 12 --disk 100 --memory 16 --image ub
258267
cmd.Flags().IntVarP(&disk, "disk", "d", 0, "GB of disk storage an environment should be provisioned with.")
259268
cmd.Flags().IntVarP(&gpus, "gpus", "g", 0, "number GPUs an environment should be provisioned with.")
260269
cmd.Flags().StringVarP(&img, "image", "i", "", "name of the image to base the environment off of.")
270+
cmd.Flags().StringVar(&providerName, "provider", "", "name of Workspace Provider with which to create the environment")
261271
cmd.Flags().BoolVar(&follow, "follow", false, "follow buildlog after initiating rebuild")
262272
cmd.Flags().BoolVar(&useCVM, "container-based-vm", false, "deploy the environment as a Container-based VM")
263273
_ = cmd.MarkFlagRequired("image")
@@ -266,11 +276,12 @@ coder envs create my-new-powerful-env --cpu 12 --disk 100 --memory 16 --image ub
266276

267277
func createEnvFromRepoCmd() *cobra.Command {
268278
var (
269-
ref string
270-
repo string
271-
follow bool
272-
filepath string
273-
org string
279+
ref string
280+
repo string
281+
follow bool
282+
filepath string
283+
org string
284+
providerName string
274285
)
275286

276287
cmd := &cobra.Command{
@@ -347,9 +358,17 @@ coder envs create-from-repo -f coder.yaml`,
347358
return xerrors.Errorf("parse environment template config: %w", err)
348359
}
349360

350-
provider, err := coderutil.DefaultWorkspaceProvider(ctx, client)
351-
if err != nil {
352-
return xerrors.Errorf("default workspace provider: %w", err)
361+
var provider *coder.KubernetesProvider
362+
if providerName == "" {
363+
provider, err = coderutil.DefaultWorkspaceProvider(ctx, client)
364+
if err != nil {
365+
return xerrors.Errorf("default workspace provider: %w", err)
366+
}
367+
} else {
368+
provider, err = coderutil.ProviderByName(ctx, client, providerName)
369+
if err != nil {
370+
return xerrors.Errorf("provider by name: %w", err)
371+
}
353372
}
354373

355374
env, err := client.CreateEnvironment(ctx, coder.CreateEnvironmentRequest{
@@ -382,6 +401,7 @@ coder envs create-from-repo -f coder.yaml`,
382401
cmd.Flags().StringVarP(&ref, "ref", "", "master", "git reference to pull template from. May be a branch, tag, or commit hash.")
383402
cmd.Flags().StringVarP(&repo, "repo-url", "r", "", "URL of the git repository to pull the config from. Config file must live in '.coder/coder.yaml'.")
384403
cmd.Flags().BoolVar(&follow, "follow", false, "follow buildlog after initiating rebuild")
404+
cmd.Flags().StringVar(&providerName, "provider", "", "name of Workspace Provider with which to create the environment")
385405
return cmd
386406
}
387407

internal/cmd/providers.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,8 @@ coder providers ls`,
8686
return xerrors.Errorf("list workspace providers: %w", err)
8787
}
8888

89-
err = tablewriter.WriteTable(len(wps), func(i int) interface{} {
90-
return wps[i]
89+
err = tablewriter.WriteTable(len(wps.Kubernetes), func(i int) interface{} {
90+
return wps.Kubernetes[i]
9191
})
9292
if err != nil {
9393
return xerrors.Errorf("write table: %w", err)
@@ -122,7 +122,7 @@ coder providers rm my-workspace-provider`,
122122
name := wpName
123123
egroup.Go(func() error {
124124
var id string
125-
for _, wp := range wps {
125+
for _, wp := range wps.Kubernetes {
126126
if wp.Name == name {
127127
id = wp.ID
128128
}

internal/coderutil/env.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ func DialEnvWsep(ctx context.Context, client coder.Client, env *coder.Environmen
3232
// EnvWithWorkspaceProvider composes an Environment entity with its associated WorkspaceProvider.
3333
type EnvWithWorkspaceProvider struct {
3434
Env coder.Environment
35-
WorkspaceProvider coder.WorkspaceProvider
35+
WorkspaceProvider coder.KubernetesProvider
3636
}
3737

3838
// EnvsWithProvider performs the composition of each Environment with its associated WorkspaceProvider.
@@ -42,8 +42,8 @@ func EnvsWithProvider(ctx context.Context, client coder.Client, envs []coder.Env
4242
if err != nil {
4343
return nil, err
4444
}
45-
providerMap := make(map[string]coder.WorkspaceProvider, len(providers))
46-
for _, p := range providers {
45+
providerMap := make(map[string]coder.KubernetesProvider, len(providers.Kubernetes))
46+
for _, p := range providers.Kubernetes {
4747
providerMap[p.ID] = p
4848
}
4949
for _, e := range envs {
@@ -60,12 +60,12 @@ func EnvsWithProvider(ctx context.Context, client coder.Client, envs []coder.Env
6060
}
6161

6262
// DefaultWorkspaceProvider returns the default provider with which to create environments.
63-
func DefaultWorkspaceProvider(ctx context.Context, c coder.Client) (*coder.WorkspaceProvider, error) {
63+
func DefaultWorkspaceProvider(ctx context.Context, c coder.Client) (*coder.KubernetesProvider, error) {
6464
provider, err := c.WorkspaceProviders(ctx)
6565
if err != nil {
6666
return nil, err
6767
}
68-
for _, p := range provider {
68+
for _, p := range provider.Kubernetes {
6969
if p.Local {
7070
return &p, nil
7171
}

internal/coderutil/provider.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package coderutil
2+
3+
import (
4+
"context"
5+
6+
"cdr.dev/coder-cli/coder-sdk"
7+
)
8+
9+
// ProviderByName searches linearly for a workspace provider by its name.
10+
func ProviderByName(ctx context.Context, client coder.Client, name string) (*coder.KubernetesProvider, error) {
11+
providers, err := client.WorkspaceProviders(ctx)
12+
if err != nil {
13+
return nil, err
14+
}
15+
for _, p := range providers.Kubernetes {
16+
if p.Name == name {
17+
return &p, nil
18+
}
19+
}
20+
return nil, coder.ErrNotFound
21+
}

0 commit comments

Comments
 (0)