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

Commit fa3f53b

Browse files
authored
fix: use proper API type for resource pool list (#272)
1 parent fcf87d5 commit fa3f53b

File tree

7 files changed

+91
-47
lines changed

7 files changed

+91
-47
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: 30 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,31 @@ 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 {
10-
ID string `json:"id" table:"-"`
11-
Name string `json:"name" table:"Name"`
12-
Status WorkspaceProviderStatus `json:"status" table:"Status"`
13-
Local bool `json:"local" table:"-"`
14-
ClusterAddress string `json:"cluster_address" table:"Cluster Address"`
15-
DefaultNamespace string `json:"default_namespace" table:"Namespace"`
16-
StorageClass string `json:"storage_class" table:"Storage Class"`
17-
ClusterDomainSuffix string `json:"cluster_domain_suffix" table:"Cluster Domain Suffix"`
18-
EnvproxyAccessURL string `json:"envproxy_access_url" validate:"required" table:"Access URL"`
19-
DevurlHost string `json:"devurl_host" table:"Devurl Host"`
20-
SSHEnabled bool `json:"ssh_enabled" table:"SSH Enabled"`
21-
NamespaceWhitelist []string `json:"namespace_whitelist" table:"Namespace Allowlist"`
22-
OrgWhitelist []string `json:"org_whitelist" table:"-"`
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 {
15+
ID string `json:"id" table:"-"`
16+
Name string `json:"name" table:"Name"`
17+
Status WorkspaceProviderStatus `json:"status" table:"Status"`
18+
Local bool `json:"local" table:"-"`
19+
EnvproxyAccessURL string `json:"envproxy_access_url" validate:"required" table:"Access URL"`
20+
DevurlHost string `json:"devurl_host" table:"Devurl Host"`
21+
OrgWhitelist []string `json:"org_whitelist" table:"-"`
22+
KubeProviderConfig `json:"config"`
23+
}
24+
25+
// KubeProviderConfig defines Kubernetes-specific configuration options.
26+
type KubeProviderConfig struct {
27+
ClusterAddress string `json:"cluster_address" table:"Cluster Address"`
28+
DefaultNamespace string `json:"default_namespace" table:"Namespace"`
29+
StorageClass string `json:"storage_class" table:"Storage Class"`
30+
ClusterDomainSuffix string `json:"cluster_domain_suffix" table:"Cluster Domain Suffix"`
31+
SSHEnabled bool `json:"ssh_enabled" table:"SSH Enabled"`
32+
NamespaceWhitelist []string `json:"namespace_whitelist" table:"Namespace Allowlist"`
2333
}
2434

2535
// WorkspaceProviderStatus represents the configuration state of a workspace provider.
@@ -32,8 +42,8 @@ const (
3242
)
3343

3444
// 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
45+
func (c *DefaultClient) WorkspaceProviderByID(ctx context.Context, id string) (*KubernetesProvider, error) {
46+
var wp KubernetesProvider
3747
err := c.requestBody(ctx, http.MethodGet, "/api/private/resource-pools/"+id, nil, &wp)
3848
if err != nil {
3949
return nil, err
@@ -42,13 +52,13 @@ func (c *DefaultClient) WorkspaceProviderByID(ctx context.Context, id string) (*
4252
}
4353

4454
// 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
55+
func (c *DefaultClient) WorkspaceProviders(ctx context.Context) (*WorkspaceProviders, error) {
56+
var providers WorkspaceProviders
4757
err := c.requestBody(ctx, http.MethodGet, "/api/private/resource-pools", nil, &providers)
4858
if err != nil {
4959
return nil, err
5060
}
51-
return providers, nil
61+
return &providers, nil
5262
}
5363

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

docs/coder_envs_create.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ coder envs create my-new-powerful-env --cpu 12 --disk 100 --memory 16 --image ub
3030
-i, --image string name of the image to base the environment off of.
3131
-m, --memory float32 GB of RAM an environment should be provisioned with.
3232
-o, --org string name of the organization the environment should be created under.
33+
--provider string name of Workspace Provider with which to create the environment
3334
-t, --tag string tag of the image the environment will be based off of. (default "latest")
3435
```
3536

internal/cmd/envs.go

Lines changed: 29 additions & 17 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{
@@ -382,6 +393,7 @@ coder envs create-from-repo -f coder.yaml`,
382393
cmd.Flags().StringVarP(&ref, "ref", "", "master", "git reference to pull template from. May be a branch, tag, or commit hash.")
383394
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'.")
384395
cmd.Flags().BoolVar(&follow, "follow", false, "follow buildlog after initiating rebuild")
396+
cmd.Flags().StringVar(&providerName, "provider", "", "name of Workspace Provider with which to create the environment")
385397
return cmd
386398
}
387399

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)