Skip to content

Commit af6e77c

Browse files
committed
Add ability to create new environments and images
1 parent 2d52bb3 commit af6e77c

File tree

3 files changed

+131
-23
lines changed

3 files changed

+131
-23
lines changed

coder-sdk/env.go

Lines changed: 43 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,30 @@ type Environment struct {
3434
AutoOffThreshold xjson.Duration `json:"auto_off_threshold" tab:"-"`
3535
}
3636

37+
// CreateEnvironmentRequest is used to configure a new environment
38+
type CreateEnvironmentRequest struct {
39+
Name string `json:"name"`
40+
ImageID string `json:"image_id"`
41+
ImageTag string `json:"image_tag"`
42+
CPUCores float32 `json:"cpu_cores"`
43+
MemoryGB int `json:"memory_gb"`
44+
DiskGB int `json:"disk_gb"`
45+
GPUs int `json:"gpus"`
46+
Services []string `json:"services"`
47+
}
48+
49+
// CreateEnvironment sends a request to create an environment.
50+
func (c Client) CreateEnvironment(ctx context.Context, orgID string, req CreateEnvironmentRequest) (*Environment, error) {
51+
var env *Environment
52+
err := c.requestBody(
53+
ctx,
54+
http.MethodPost, "/api/orgs/"+orgID+"/environments",
55+
req,
56+
env,
57+
)
58+
return env, err
59+
}
60+
3761
// EnvironmentsByOrganization gets the list of environments owned by the given user.
3862
func (c Client) EnvironmentsByOrganization(ctx context.Context, userID, orgID string) ([]Environment, error) {
3963
var envs []Environment
@@ -46,32 +70,28 @@ func (c Client) EnvironmentsByOrganization(ctx context.Context, userID, orgID st
4670
return envs, err
4771
}
4872

73+
// DeleteEnvironment deletes the environment.
74+
func (c Client) DeleteEnvironment(ctx context.Context, envID string) error {
75+
return c.requestBody(
76+
ctx,
77+
http.MethodDelete, "/api/environments/"+envID,
78+
nil,
79+
nil,
80+
)
81+
}
82+
4983
// DialWsep dials an environments command execution interface
5084
// See github.com/cdr/wsep for details
5185
func (c Client) DialWsep(ctx context.Context, env *Environment) (*websocket.Conn, error) {
52-
u := c.copyURL()
53-
if c.BaseURL.Scheme == "https" {
54-
u.Scheme = "wss"
55-
} else {
56-
u.Scheme = "ws"
57-
}
58-
u.Path = "/proxy/environments/" + env.ID + "/wsep"
86+
return c.dialWs(ctx, "/proxy/environments/"+env.ID+"/wsep")
87+
}
5988

60-
ctx, cancel := context.WithTimeout(ctx, time.Second*15)
61-
defer cancel()
89+
// DialEnvironmentBuildLog opens a websocket connection for the environment build log messages
90+
func (c Client) DialEnvironmentBuildLog(ctx context.Context, envID string) (*websocket.Conn, error) {
91+
return c.dialWs(ctx, "/api/environments/"+envID+"/watch-update")
92+
}
6293

63-
conn, resp, err := websocket.Dial(ctx, u.String(),
64-
&websocket.DialOptions{
65-
HTTPHeader: map[string][]string{
66-
"Cookie": {"session_token=" + c.Token},
67-
},
68-
},
69-
)
70-
if err != nil {
71-
if resp != nil {
72-
return nil, bodyError(resp)
73-
}
74-
return nil, err
75-
}
76-
return conn, nil
94+
// DialEnvironmentStats opens a websocket connection for environment stats
95+
func (c Client) DialEnvironmentStats(ctx context.Context, envID string) (*websocket.Conn, error) {
96+
return c.dialWs(ctx, "/api/environments/"+envID+"/watch-stats")
7797
}

coder-sdk/image.go

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package coder
2+
3+
import (
4+
"context"
5+
"net/http"
6+
)
7+
8+
// Image describes a Coder Image
9+
type Image struct {
10+
ID string `json:"id"`
11+
OrganizationID string `json:"organization_id"`
12+
Repository string `json:"repository"`
13+
Description string `json:"description"`
14+
URL string `json:"url"` // user-supplied URL for image
15+
DefaultCPUCores float32 `json:"default_cpu_cores"`
16+
DefaultMemoryGB int `json:"default_memory_gb"`
17+
DefaultDiskGB int `json:"default_disk_gb"`
18+
Deprecated bool `json:"deprecated"`
19+
}
20+
21+
// NewRegistryRequest describes a docker registry used in importing an image
22+
type NewRegistryRequest struct {
23+
FriendlyName string `json:"friendly_name"`
24+
Registry string `json:"registry"`
25+
Username string `json:"username"`
26+
Password string `json:"password"`
27+
}
28+
29+
// ImportImageRequest is used to import new images and registries into Coder
30+
type ImportImageRequest struct {
31+
// RegistryID is used to import images to existing registries.
32+
RegistryID *string `json:"registry_id"`
33+
// NewRegistry is used when adding a new registry.
34+
NewRegistry *NewRegistryRequest `json:"new_registry"`
35+
// Repository refers to the image. For example: "codercom/ubuntu".
36+
Repository string `json:"repository"`
37+
Tag string `json:"tag"`
38+
DefaultCPUCores float32 `json:"default_cpu_cores"`
39+
DefaultMemoryGB int `json:"default_memory_gb"`
40+
DefaultDiskGB int `json:"default_disk_gb"`
41+
Description string `json:"description"`
42+
URL string `json:"url"`
43+
}
44+
45+
// ImportImage creates a new image and optionally a new registry
46+
func (c Client) ImportImage(ctx context.Context, orgID string, req ImportImageRequest) (*Image, error) {
47+
var img *Image
48+
err := c.requestBody(
49+
ctx,
50+
http.MethodPost, "/api/orgs/"+orgID+"/images",
51+
req,
52+
img,
53+
)
54+
return img, err
55+
}

coder-sdk/ws.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package coder
2+
3+
import (
4+
"context"
5+
6+
"nhooyr.io/websocket"
7+
)
8+
9+
func (c Client) dialWs(ctx context.Context, path string) (*websocket.Conn, error) {
10+
u := c.copyURL()
11+
if c.BaseURL.Scheme == "https" {
12+
u.Scheme = "wss"
13+
} else {
14+
u.Scheme = "ws"
15+
}
16+
u.Path = path
17+
18+
conn, resp, err := websocket.Dial(ctx, u.String(),
19+
&websocket.DialOptions{
20+
HTTPHeader: map[string][]string{
21+
"Session-Token": {c.Token},
22+
},
23+
},
24+
)
25+
if err != nil {
26+
if resp != nil {
27+
return nil, bodyError(resp)
28+
}
29+
return nil, err
30+
}
31+
32+
return conn, nil
33+
}

0 commit comments

Comments
 (0)