Skip to content

Commit cf0d0bb

Browse files
committed
feat: add cohesive e2e tests for the web terminal, apps, and workspaces
1 parent 1faed63 commit cf0d0bb

35 files changed

+1512
-155
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ site/storybook-static/
2727
site/test-results/*
2828
site/e2e/test-results/*
2929
site/e2e/states/*.json
30+
site/e2e/.auth.json
3031
site/playwright-report/*
3132
site/.swc
3233
site/dist/

.prettierignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ site/storybook-static/
3030
site/test-results/*
3131
site/e2e/test-results/*
3232
site/e2e/states/*.json
33+
site/e2e/.auth.json
3334
site/playwright-report/*
3435
site/.swc
3536
site/dist/

cli/server.go

Lines changed: 42 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -820,7 +820,7 @@ func (r *RootCmd) Server(newAPI func(context.Context, *coderd.Options) (*coderd.
820820
for i := int64(0); i < cfg.Provisioner.Daemons.Value(); i++ {
821821
daemonCacheDir := filepath.Join(cacheDir, fmt.Sprintf("provisioner-%d", i))
822822
daemon, err := newProvisionerDaemon(
823-
ctx, coderAPI, provisionerdMetrics, logger, cfg, daemonCacheDir, errCh, false, &provisionerdWaitGroup,
823+
ctx, coderAPI, provisionerdMetrics, logger, cfg, daemonCacheDir, errCh, &provisionerdWaitGroup,
824824
)
825825
if err != nil {
826826
return xerrors.Errorf("create provisioner daemon: %w", err)
@@ -1176,7 +1176,6 @@ func newProvisionerDaemon(
11761176
cfg *codersdk.DeploymentValues,
11771177
cacheDir string,
11781178
errCh chan error,
1179-
dev bool,
11801179
wg *sync.WaitGroup,
11811180
) (srv *provisionerd.Server, err error) {
11821181
ctx, cancel := context.WithCancel(ctx)
@@ -1191,53 +1190,14 @@ func newProvisionerDaemon(
11911190
return nil, xerrors.Errorf("mkdir %q: %w", cacheDir, err)
11921191
}
11931192

1194-
tfDir := filepath.Join(cacheDir, "tf")
1195-
err = os.MkdirAll(tfDir, 0o700)
1196-
if err != nil {
1197-
return nil, xerrors.Errorf("mkdir terraform dir: %w", err)
1198-
}
1199-
1200-
tracer := coderAPI.TracerProvider.Tracer(tracing.TracerName)
1201-
terraformClient, terraformServer := provisionersdk.MemTransportPipe()
1202-
wg.Add(1)
1203-
go func() {
1204-
defer wg.Done()
1205-
<-ctx.Done()
1206-
_ = terraformClient.Close()
1207-
_ = terraformServer.Close()
1208-
}()
1209-
wg.Add(1)
1210-
go func() {
1211-
defer wg.Done()
1212-
defer cancel()
1213-
1214-
err := terraform.Serve(ctx, &terraform.ServeOptions{
1215-
ServeOptions: &provisionersdk.ServeOptions{
1216-
Listener: terraformServer,
1217-
},
1218-
CachePath: tfDir,
1219-
Logger: logger,
1220-
Tracer: tracer,
1221-
})
1222-
if err != nil && !xerrors.Is(err, context.Canceled) {
1223-
select {
1224-
case errCh <- err:
1225-
default:
1226-
}
1227-
}
1228-
}()
1229-
12301193
workDir := filepath.Join(cacheDir, "work")
12311194
err = os.MkdirAll(workDir, 0o700)
12321195
if err != nil {
12331196
return nil, xerrors.Errorf("mkdir work dir: %w", err)
12341197
}
12351198

1236-
provisioners := provisionerd.Provisioners{
1237-
string(database.ProvisionerTypeTerraform): sdkproto.NewDRPCProvisionerClient(terraformClient),
1238-
}
1239-
// include echo provisioner when in dev mode
1240-
if dev {
1199+
provisioners := provisionerd.Provisioners{}
1200+
if cfg.Provisioner.DaemonsEcho {
12411201
echoClient, echoServer := provisionersdk.MemTransportPipe()
12421202
wg.Add(1)
12431203
go func() {
@@ -1260,7 +1220,46 @@ func newProvisionerDaemon(
12601220
}
12611221
}()
12621222
provisioners[string(database.ProvisionerTypeEcho)] = sdkproto.NewDRPCProvisionerClient(echoClient)
1223+
} else {
1224+
tfDir := filepath.Join(cacheDir, "tf")
1225+
err = os.MkdirAll(tfDir, 0o700)
1226+
if err != nil {
1227+
return nil, xerrors.Errorf("mkdir terraform dir: %w", err)
1228+
}
1229+
1230+
tracer := coderAPI.TracerProvider.Tracer(tracing.TracerName)
1231+
terraformClient, terraformServer := provisionersdk.MemTransportPipe()
1232+
wg.Add(1)
1233+
go func() {
1234+
defer wg.Done()
1235+
<-ctx.Done()
1236+
_ = terraformClient.Close()
1237+
_ = terraformServer.Close()
1238+
}()
1239+
wg.Add(1)
1240+
go func() {
1241+
defer wg.Done()
1242+
defer cancel()
1243+
1244+
err := terraform.Serve(ctx, &terraform.ServeOptions{
1245+
ServeOptions: &provisionersdk.ServeOptions{
1246+
Listener: terraformServer,
1247+
},
1248+
CachePath: tfDir,
1249+
Logger: logger,
1250+
Tracer: tracer,
1251+
})
1252+
if err != nil && !xerrors.Is(err, context.Canceled) {
1253+
select {
1254+
case errCh <- err:
1255+
default:
1256+
}
1257+
}
1258+
}()
1259+
1260+
provisioners[string(database.ProvisionerTypeTerraform)] = sdkproto.NewDRPCProvisionerClient(terraformClient)
12631261
}
1262+
12641263
debounce := time.Second
12651264
return provisionerd.New(func(ctx context.Context) (proto.DRPCProvisionerDaemonClient, error) {
12661265
// This debounces calls to listen every second. Read the comment

cli/testdata/server-config.yaml.golden

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,10 @@ provisioning:
281281
# state for a long time, consider increasing this.
282282
# (default: 3, type: int)
283283
daemons: 3
284+
# Whether to use echo provisioner daemons instead of Terraform. This is for E2E
285+
# tests.
286+
# (default: false, type: bool)
287+
daemonsEcho: false
284288
# Time to wait before polling for a new job.
285289
# (default: 1s, type: duration)
286290
daemonPollInterval: 1s

coderd/apidoc/docs.go

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/apidoc/swagger.json

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

codersdk/deployment.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,7 @@ type GitAuthConfig struct {
309309

310310
type ProvisionerConfig struct {
311311
Daemons clibase.Int64 `json:"daemons" typescript:",notnull"`
312+
DaemonsEcho clibase.Bool `json:"daemons_echo" typescript:",notnull"`
312313
DaemonPollInterval clibase.Duration `json:"daemon_poll_interval" typescript:",notnull"`
313314
DaemonPollJitter clibase.Duration `json:"daemon_poll_jitter" typescript:",notnull"`
314315
ForceCancelInterval clibase.Duration `json:"force_cancel_interval" typescript:",notnull"`
@@ -1080,6 +1081,17 @@ when required by your organization's security policy.`,
10801081
Group: &deploymentGroupProvisioning,
10811082
YAML: "daemons",
10821083
},
1084+
{
1085+
Name: "Echo Provisioner",
1086+
Description: "Whether to use echo provisioner daemons instead of Terraform. This is for E2E tests.",
1087+
Flag: "provisioner-daemons-echo",
1088+
Env: "CODER_PROVISIONER_DAEMONS_ECHO",
1089+
Hidden: true,
1090+
Default: "false",
1091+
Value: &c.Provisioner.DaemonsEcho,
1092+
Group: &deploymentGroupProvisioning,
1093+
YAML: "daemonsEcho",
1094+
},
10831095
{
10841096
Name: "Poll Interval",
10851097
Description: "Time to wait before polling for a new job.",

docs/api/general.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,7 @@ curl -X GET http://coder-server:8080/api/v2/deployment/config \
282282
"daemon_poll_interval": 0,
283283
"daemon_poll_jitter": 0,
284284
"daemons": 0,
285+
"daemons_echo": true,
285286
"force_cancel_interval": 0
286287
},
287288
"proxy_health_status_interval": 0,

docs/api/schemas.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1954,6 +1954,7 @@ AuthorizationObject can represent a "set" of objects, such as: all workspaces in
19541954
"daemon_poll_interval": 0,
19551955
"daemon_poll_jitter": 0,
19561956
"daemons": 0,
1957+
"daemons_echo": true,
19571958
"force_cancel_interval": 0
19581959
},
19591960
"proxy_health_status_interval": 0,
@@ -2282,6 +2283,7 @@ AuthorizationObject can represent a "set" of objects, such as: all workspaces in
22822283
"daemon_poll_interval": 0,
22832284
"daemon_poll_jitter": 0,
22842285
"daemons": 0,
2286+
"daemons_echo": true,
22852287
"force_cancel_interval": 0
22862288
},
22872289
"proxy_health_status_interval": 0,
@@ -3118,6 +3120,7 @@ AuthorizationObject can represent a "set" of objects, such as: all workspaces in
31183120
"daemon_poll_interval": 0,
31193121
"daemon_poll_jitter": 0,
31203122
"daemons": 0,
3123+
"daemons_echo": true,
31213124
"force_cancel_interval": 0
31223125
}
31233126
```
@@ -3129,6 +3132,7 @@ AuthorizationObject can represent a "set" of objects, such as: all workspaces in
31293132
| `daemon_poll_interval` | integer | false | | |
31303133
| `daemon_poll_jitter` | integer | false | | |
31313134
| `daemons` | integer | false | | |
3135+
| `daemons_echo` | boolean | false | | |
31323136
| `force_cancel_interval` | integer | false | | |
31333137

31343138
## codersdk.ProvisionerDaemon

examples/templates/docker/main.tf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ terraform {
22
required_providers {
33
coder = {
44
source = "coder/coder"
5-
version = "~> 0.7.0"
5+
version = "~> 0.8.3"
66
}
77
docker = {
88
source = "kreuzwerker/docker"

0 commit comments

Comments
 (0)