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

Commit 8172858

Browse files
committed
feat: add provider name and repo name to envs ls
1 parent e04bba8 commit 8172858

File tree

6 files changed

+81
-10
lines changed

6 files changed

+81
-10
lines changed

coder-sdk/env.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ type Environment struct {
2626
CPUCores float32 `json:"cpu_cores" table:"CPUCores"`
2727
MemoryGB float32 `json:"memory_gb" table:"MemoryGB"`
2828
DiskGB int `json:"disk_gb" table:"DiskGB"`
29-
GPUs int `json:"gpus" table:"GPUs"`
30-
Updating bool `json:"updating" table:"Updating"`
29+
GPUs int `json:"gpus" table:"-"`
30+
Updating bool `json:"updating" table:"-"`
3131
LatestStat EnvironmentStat `json:"latest_stat" table:"Status"`
3232
RebuildMessages []RebuildMessage `json:"rebuild_messages" table:"-"`
3333
CreatedAt time.Time `json:"created_at" table:"-"`

coder-sdk/image.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,15 @@ func (c *DefaultClient) ImportImage(ctx context.Context, req ImportImageReq) (*I
6666
return &img, nil
6767
}
6868

69+
// ImageByID returns an image entity, fetched by its ID.
70+
func (c *DefaultClient) ImageByID(ctx context.Context, id string) (*Image, error) {
71+
var img Image
72+
if err := c.requestBody(ctx, http.MethodGet, "/api/v0/images/"+id, nil, &img); err != nil {
73+
return nil, err
74+
}
75+
return &img, nil
76+
}
77+
6978
// OrganizationImages returns all of the images imported for orgID.
7079
func (c *DefaultClient) OrganizationImages(ctx context.Context, orgID string) ([]Image, error) {
7180
var (

coder-sdk/interface.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,9 @@ type Client interface {
136136
// ImportImage creates a new image and optionally a new registry.
137137
ImportImage(ctx context.Context, req ImportImageReq) (*Image, error)
138138

139+
// ImageByID returns an image entity, fetched by its ID.
140+
ImageByID(ctx context.Context, id string) (*Image, error)
141+
139142
// OrganizationImages returns all of the images imported for orgID.
140143
OrganizationImages(ctx context.Context, orgID string) ([]Image, error)
141144

coder-sdk/workspace_providers.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,13 @@ type WorkspaceProviders struct {
1212

1313
// KubernetesProvider defines an entity capable of deploying and acting as an ingress for Coder environments.
1414
type KubernetesProvider struct {
15-
ID string `json:"id" table:"-"`
16-
Name string `json:"name" table:"Name"`
17-
Status WorkspaceProviderStatus `json:"status" table:"Status"`
18-
BuiltIn bool `json:"built_in" 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:"-"`
15+
ID string `json:"id" table:"-"`
16+
Name string `json:"name" table:"Name"`
17+
Status WorkspaceProviderStatus `json:"status" table:"Status"`
18+
BuiltIn bool `json:"built_in" table:"-"`
19+
EnvproxyAccessURL string `json:"envproxy_access_url" table:"Access URL" validate:"required"`
20+
DevurlHost string `json:"devurl_host" table:"Devurl Host"`
21+
OrgWhitelist []string `json:"org_whitelist" table:"-"`
2222
KubeProviderConfig `json:"config" table:"_"`
2323
}
2424

internal/cmd/envs.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,11 @@ func lsEnvsCommand() *cobra.Command {
8282

8383
switch outputFmt {
8484
case humanOutput:
85-
err := tablewriter.WriteTable(cmd.OutOrStdout(), len(envs), func(i int) interface{} {
85+
envs, err := coderutil.EnvsHumanTable(ctx, client, envs)
86+
if err != nil {
87+
return err
88+
}
89+
err = tablewriter.WriteTable(cmd.OutOrStdout(), len(envs), func(i int) interface{} {
8690
return envs[i]
8791
})
8892
if err != nil {

internal/coderutil/env.go

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package coderutil
22

33
import (
44
"context"
5+
"fmt"
56
"net/url"
67

78
"golang.org/x/xerrors"
@@ -72,3 +73,57 @@ func DefaultWorkspaceProvider(ctx context.Context, c coder.Client) (*coder.Kuber
7273
}
7374
return nil, coder.ErrNotFound
7475
}
76+
77+
type EnvTable struct {
78+
Name string `table:"Name"`
79+
Image string `table:"Image"`
80+
CPU float32 `table:"vCPU"`
81+
MemoryGB float32 `table:"MemoryGB"`
82+
DiskGB int `table:"DiskGB"`
83+
Status string `table:"Status"`
84+
Provider string `table:"Provider"`
85+
CVM bool `table:"CVM"`
86+
}
87+
88+
// EnvsHumanTable performs the composition of each Environment with its associated ProviderName and ImageRepo.
89+
func EnvsHumanTable(ctx context.Context, client coder.Client, envs []coder.Environment) ([]EnvTable, error) {
90+
imageMap := make(map[string]*coder.Image)
91+
for _, e := range envs {
92+
imageMap[e.ImageID] = nil
93+
}
94+
// TODO: make this concurrent
95+
for id := range imageMap {
96+
img, err := client.ImageByID(ctx, id)
97+
if err != nil {
98+
return nil, err
99+
}
100+
imageMap[id] = img
101+
}
102+
103+
pooledEnvs := make([]EnvTable, 0, len(envs))
104+
providers, err := client.WorkspaceProviders(ctx)
105+
if err != nil {
106+
return nil, err
107+
}
108+
providerMap := make(map[string]coder.KubernetesProvider, len(providers.Kubernetes))
109+
for _, p := range providers.Kubernetes {
110+
providerMap[p.ID] = p
111+
}
112+
for _, e := range envs {
113+
envProvider, ok := providerMap[e.ResourcePoolID]
114+
if !ok {
115+
return nil, xerrors.Errorf("fetch env workspace provider: %w", coder.ErrNotFound)
116+
}
117+
pooledEnvs = append(pooledEnvs, EnvTable{
118+
Name: e.Name,
119+
Image: fmt.Sprintf("%s:%s", imageMap[e.ImageID].Repository, e.ImageTag),
120+
CPU: e.CPUCores,
121+
MemoryGB: e.MemoryGB,
122+
DiskGB: e.DiskGB,
123+
Status: string(e.LatestStat.ContainerStatus),
124+
Provider: envProvider.Name,
125+
CVM: e.UseContainerVM,
126+
})
127+
}
128+
return pooledEnvs, nil
129+
}

0 commit comments

Comments
 (0)