Thanks to visit codestin.com
Credit goes to github.com

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

Commit 4ecb68f

Browse files
committed
Add commands for workspace providers
1 parent 82f5615 commit 4ecb68f

File tree

6 files changed

+242
-98
lines changed

6 files changed

+242
-98
lines changed

coder-sdk/resourcepools.go

Lines changed: 0 additions & 65 deletions
This file was deleted.

coder-sdk/workspace_providers.go

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
package coder
2+
3+
import (
4+
"context"
5+
"net/http"
6+
)
7+
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"`
11+
Name string `json:"name"`
12+
Status WorkspaceProviderStatus `json:"status"`
13+
Local bool `json:"local"`
14+
ClusterAddress string `json:"cluster_address"`
15+
DefaultNamespace string `json:"default_namespace"`
16+
StorageClass string `json:"storage_class"`
17+
ClusterDomainSuffix string `json:"cluster_domain_suffix"`
18+
EnvproxyAccessURL string `json:"envproxy_access_url" validate:"required"`
19+
DevurlHost string `json:"devurl_host"`
20+
SSHEnabled bool `json:"ssh_enabled"`
21+
NamespaceWhitelist []string `json:"namespace_whitelist"`
22+
OrgWhitelist []string `json:"org_whitelist"`
23+
}
24+
25+
// WorkspaceProviderStatus represents the configuration state of a workspace provider.
26+
type WorkspaceProviderStatus string
27+
28+
// Workspace Provider statuses.
29+
const (
30+
WorkspaceProviderPending WorkspaceProviderStatus = "pending"
31+
WorkspaceProviderReady WorkspaceProviderStatus = "ready"
32+
)
33+
34+
// WorkspaceProviderByID fetches a workspace provider entity by its unique ID.
35+
func (c *Client) WorkspaceProviderByID(ctx context.Context, id string) (*WorkspaceProvider, error) {
36+
var wp WorkspaceProvider
37+
err := c.requestBody(ctx, http.MethodGet, "/api/private/resource-pools/"+id, nil, &wp)
38+
if err != nil {
39+
return nil, err
40+
}
41+
return &wp, nil
42+
}
43+
44+
// WorkspaceProviders fetches all workspace providers known to the Coder control plane.
45+
func (c *Client) WorkspaceProviders(ctx context.Context) ([]WorkspaceProvider, error) {
46+
var providers []WorkspaceProvider
47+
err := c.requestBody(ctx, http.MethodGet, "/api/private/resource-pools", nil, &providers)
48+
if err != nil {
49+
return nil, err
50+
}
51+
return providers, nil
52+
}
53+
54+
// CreateWorkspaceProviderReq defines the request parameters for creating a new workspace provider entity.
55+
type CreateWorkspaceProviderReq struct {
56+
Name string `json:"name"`
57+
}
58+
59+
// CreateWorkspaceProviderRes defines the response from creating a new workspace provider entity.
60+
type CreateWorkspaceProviderRes struct {
61+
ID string `json:"id"`
62+
Name string `json:"name"`
63+
Status WorkspaceProviderStatus `json:"status"`
64+
EnvproxyToken string `json:"envproxy_token"`
65+
}
66+
67+
// CreateWorkspaceProvider creates a new WorkspaceProvider entity.
68+
func (c *Client) CreateWorkspaceProvider(ctx context.Context, req CreateWorkspaceProviderReq) (*CreateWorkspaceProviderRes, error) {
69+
var res CreateWorkspaceProviderRes
70+
err := c.requestBody(ctx, http.MethodPost, "/api/private/resource-pools", req, &res)
71+
if err != nil {
72+
return nil, err
73+
}
74+
return &res, nil
75+
}
76+
77+
// DeleteWorkspaceProviderByID deletes a workspace provider entity from the Coder control plane.
78+
func (c *Client) DeleteWorkspaceProviderByID(ctx context.Context, id string) error {
79+
return c.requestBody(ctx, http.MethodDelete, "/api/private/resource-pools/"+id, nil, nil)
80+
}

internal/cmd/cmd.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ func Make() *cobra.Command {
3737
resourceCmd(),
3838
completionCmd(),
3939
imgsCmd(),
40+
providersCmd(),
4041
genDocsCmd(app),
4142
)
4243
app.PersistentFlags().BoolVarP(&verbose, "verbose", "v", false, "show verbose output")

internal/cmd/configssh.go

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -104,16 +104,16 @@ func configSSH(configpath *string, remove *bool) func(cmd *cobra.Command, _ []st
104104
return xerrors.New("no environments found")
105105
}
106106

107-
envsWithPools, err := coderutil.EnvsWithPool(ctx, client, envs)
107+
envsWithProviders, err := coderutil.EnvsWithProvider(ctx, client, envs)
108108
if err != nil {
109-
return xerrors.Errorf("resolve env pools: %w", err)
109+
return xerrors.Errorf("resolve env workspace providers: %w", err)
110110
}
111111

112-
if !sshAvailable(envsWithPools) {
112+
if !sshAvailable(envsWithProviders) {
113113
return xerrors.New("SSH is disabled or not available for any environments in your Coder Enterprise deployment.")
114114
}
115115

116-
newConfig := makeNewConfigs(user.Username, envsWithPools, privateKeyFilepath)
116+
newConfig := makeNewConfigs(user.Username, envsWithProviders, privateKeyFilepath)
117117

118118
err = os.MkdirAll(filepath.Dir(*configpath), os.ModePerm)
119119
if err != nil {
@@ -157,9 +157,9 @@ func removeOldConfig(config string) (string, bool) {
157157
}
158158

159159
// sshAvailable returns true if SSH is available for at least one environment.
160-
func sshAvailable(envs []coderutil.EnvWithPool) bool {
160+
func sshAvailable(envs []coderutil.EnvWithWorkspaceProvider) bool {
161161
for _, env := range envs {
162-
if env.Pool.SSHEnabled {
162+
if env.WorkspaceProvider.SSHEnabled {
163163
return true
164164
}
165165
}
@@ -174,19 +174,19 @@ func writeSSHKey(ctx context.Context, client *coder.Client, privateKeyPath strin
174174
return ioutil.WriteFile(privateKeyPath, []byte(key.PrivateKey), 0600)
175175
}
176176

177-
func makeNewConfigs(userName string, envs []coderutil.EnvWithPool, privateKeyFilepath string) string {
177+
func makeNewConfigs(userName string, envs []coderutil.EnvWithWorkspaceProvider, privateKeyFilepath string) string {
178178
newConfig := fmt.Sprintf("\n%s\n%s\n\n", sshStartToken, sshStartMessage)
179179
for _, env := range envs {
180-
if !env.Pool.SSHEnabled {
181-
clog.LogWarn(fmt.Sprintf("SSH is not enabled for pool %q", env.Pool.Name),
180+
if !env.WorkspaceProvider.SSHEnabled {
181+
clog.LogWarn(fmt.Sprintf("SSH is not enabled for workspace provider %q", env.WorkspaceProvider.Name),
182182
clog.BlankLine,
183-
clog.Tipf("ask an infrastructure administrator to enable SSH for this resource pool"),
183+
clog.Tipf("ask an infrastructure administrator to enable SSH for this workspace provider"),
184184
)
185185
continue
186186
}
187-
u, err := url.Parse(env.Pool.AccessURL)
187+
u, err := url.Parse(env.WorkspaceProvider.EnvproxyAccessURL)
188188
if err != nil {
189-
clog.LogWarn("invalid access url", clog.Causef("malformed url: %q", env.Pool.AccessURL))
189+
clog.LogWarn("invalid access url", clog.Causef("malformed url: %q", env.WorkspaceProvider.EnvproxyAccessURL))
190190
continue
191191
}
192192
newConfig += makeSSHConfig(u.Host, userName, env.Env.Name, privateKeyFilepath)

internal/cmd/providers.go

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
package cmd
2+
3+
import (
4+
"cdr.dev/coder-cli/coder-sdk"
5+
"cdr.dev/coder-cli/internal/x/xcobra"
6+
"cdr.dev/coder-cli/pkg/clog"
7+
"cdr.dev/coder-cli/pkg/tablewriter"
8+
"fmt"
9+
"github.com/spf13/cobra"
10+
"golang.org/x/xerrors"
11+
)
12+
13+
func providersCmd() *cobra.Command {
14+
cmd := &cobra.Command{
15+
Use: "providers",
16+
Short: "Interact with Coder workspace providers",
17+
Long: "Perform operations on the Coder Workspace Providers for the platform.",
18+
}
19+
20+
cmd.AddCommand(
21+
createProviderCmd(),
22+
listProviderCmd(),
23+
deleteProviderCmd(),
24+
)
25+
return cmd
26+
}
27+
28+
func createProviderCmd() *cobra.Command {
29+
cmd := &cobra.Command{
30+
Use: "create [workspace_provider_name]",
31+
Short: "create a new workspace provider.",
32+
Args: xcobra.ExactArgs(1),
33+
Long: "Create a new Coder workspace provider.",
34+
Example: `# create a new workspace provider in a pending state
35+
coder providers create my-new-workspace-provider`,
36+
RunE: func(cmd *cobra.Command, args []string) error {
37+
ctx := cmd.Context()
38+
39+
client, err := newClient(ctx)
40+
if err != nil {
41+
return err
42+
}
43+
44+
// ExactArgs(1) ensures our name value can't panic on an out of bounds.
45+
createReq := &coder.CreateWorkspaceProviderReq{
46+
Name: args[0],
47+
}
48+
49+
wp, err := client.CreateWorkspaceProvider(ctx, *createReq)
50+
if err != nil {
51+
return xerrors.Errorf("create workspace provider: %w", err)
52+
}
53+
54+
err = tablewriter.WriteTable(1, func(i int) interface{} {
55+
return wp
56+
})
57+
if err != nil {
58+
return xerrors.Errorf("write table: %w", err)
59+
}
60+
return nil
61+
},
62+
}
63+
return cmd
64+
}
65+
66+
func listProviderCmd() *cobra.Command {
67+
cmd := &cobra.Command{
68+
Use: "ls",
69+
Short: "list workspace providers.",
70+
Long: "List all Coder workspace providers.",
71+
Example: `# list workspace providers
72+
coder providers ls`,
73+
RunE: func(cmd *cobra.Command, args []string) error {
74+
ctx := cmd.Context()
75+
76+
client, err := newClient(ctx)
77+
if err != nil {
78+
return err
79+
}
80+
81+
wps, err := client.WorkspaceProviders(ctx)
82+
if err != nil {
83+
return xerrors.Errorf("list workspace providers: %w", err)
84+
}
85+
86+
err = tablewriter.WriteTable(len(wps), func(i int) interface{} {
87+
return wps[i]
88+
})
89+
if err != nil {
90+
return xerrors.Errorf("write table: %w", err)
91+
}
92+
return nil
93+
},
94+
}
95+
return cmd
96+
}
97+
98+
func deleteProviderCmd() *cobra.Command {
99+
cmd := &cobra.Command{
100+
Use: "rm [workspace_provider_id]",
101+
Short: "remove a workspace provider.",
102+
Args: xcobra.ExactArgs(1),
103+
Long: "Remove an existing Coder workspace provider.",
104+
Example: `# remove a new workspace provider by id
105+
coder providers rm my-workspace-provider-id`,
106+
RunE: func(cmd *cobra.Command, args []string) error {
107+
ctx := cmd.Context()
108+
id := args[0]
109+
client, err := newClient(ctx)
110+
if err != nil {
111+
return err
112+
}
113+
114+
err = client.DeleteWorkspaceProviderByID(ctx, id)
115+
if err != nil {
116+
return clog.Error(
117+
fmt.Sprintf(`failed to delete workspace provider "%s"`, id),
118+
clog.Causef(err.Error()),
119+
)
120+
}
121+
122+
clog.LogSuccess(fmt.Sprintf(`deleted workspace provider with id "%s"`, id))
123+
124+
return nil
125+
},
126+
}
127+
return cmd
128+
}

0 commit comments

Comments
 (0)