Skip to content

Commit d434181

Browse files
authored
feat: add cohesive e2e tests for the web terminal, apps, and workspaces (#8140)
* feat: add cohesive e2e tests for the web terminal, apps, and workspaces * Fix web terminal flake
1 parent 2a492b7 commit d434181

36 files changed

+1534
-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: 4 additions & 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/
@@ -74,3 +75,6 @@ helm/templates/*.yaml
7475

7576
# Testdata shouldn't be formatted.
7677
scripts/apitypings/testdata/**/*.ts
78+
79+
# Generated files shouldn't be formatted.
80+
site/e2e/provisionerGenerated.ts

.prettierignore.include

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,6 @@ helm/templates/*.yaml
88

99
# Testdata shouldn't be formatted.
1010
scripts/apitypings/testdata/**/*.ts
11+
12+
# Generated files shouldn't be formatted.
13+
site/e2e/provisionerGenerated.ts

cli/server.go

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

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

1237-
provisioners := provisionerd.Provisioners{
1238-
string(database.ProvisionerTypeTerraform): sdkproto.NewDRPCProvisionerClient(terraformClient),
1239-
}
1240-
// include echo provisioner when in dev mode
1241-
if dev {
1200+
provisioners := provisionerd.Provisioners{}
1201+
if cfg.Provisioner.DaemonsEcho {
12421202
echoClient, echoServer := provisionersdk.MemTransportPipe()
12431203
wg.Add(1)
12441204
go func() {
@@ -1261,7 +1221,46 @@ func newProvisionerDaemon(
12611221
}
12621222
}()
12631223
provisioners[string(database.ProvisionerTypeEcho)] = sdkproto.NewDRPCProvisionerClient(echoClient)
1224+
} else {
1225+
tfDir := filepath.Join(cacheDir, "tf")
1226+
err = os.MkdirAll(tfDir, 0o700)
1227+
if err != nil {
1228+
return nil, xerrors.Errorf("mkdir terraform dir: %w", err)
1229+
}
1230+
1231+
tracer := coderAPI.TracerProvider.Tracer(tracing.TracerName)
1232+
terraformClient, terraformServer := provisionersdk.MemTransportPipe()
1233+
wg.Add(1)
1234+
go func() {
1235+
defer wg.Done()
1236+
<-ctx.Done()
1237+
_ = terraformClient.Close()
1238+
_ = terraformServer.Close()
1239+
}()
1240+
wg.Add(1)
1241+
go func() {
1242+
defer wg.Done()
1243+
defer cancel()
1244+
1245+
err := terraform.Serve(ctx, &terraform.ServeOptions{
1246+
ServeOptions: &provisionersdk.ServeOptions{
1247+
Listener: terraformServer,
1248+
},
1249+
CachePath: tfDir,
1250+
Logger: logger,
1251+
Tracer: tracer,
1252+
})
1253+
if err != nil && !xerrors.Is(err, context.Canceled) {
1254+
select {
1255+
case errCh <- err:
1256+
default:
1257+
}
1258+
}
1259+
}()
1260+
1261+
provisioners[string(database.ProvisionerTypeTerraform)] = sdkproto.NewDRPCProvisionerClient(terraformClient)
12641262
}
1263+
12651264
debounce := time.Second
12661265
return provisionerd.New(func(ctx context.Context) (proto.DRPCProvisionerDaemonClient, error) {
12671266
// 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
@@ -288,6 +288,10 @@ provisioning:
288288
# state for a long time, consider increasing this.
289289
# (default: 3, type: int)
290290
daemons: 3
291+
# Whether to use echo provisioner daemons instead of Terraform. This is for E2E
292+
# tests.
293+
# (default: false, type: bool)
294+
daemonsEcho: false
291295
# Time to wait before polling for a new job.
292296
# (default: 1s, type: duration)
293297
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
@@ -310,6 +310,7 @@ type GitAuthConfig struct {
310310

311311
type ProvisionerConfig struct {
312312
Daemons clibase.Int64 `json:"daemons" typescript:",notnull"`
313+
DaemonsEcho clibase.Bool `json:"daemons_echo" typescript:",notnull"`
313314
DaemonPollInterval clibase.Duration `json:"daemon_poll_interval" typescript:",notnull"`
314315
DaemonPollJitter clibase.Duration `json:"daemon_poll_jitter" typescript:",notnull"`
315316
ForceCancelInterval clibase.Duration `json:"force_cancel_interval" typescript:",notnull"`
@@ -1093,6 +1094,17 @@ when required by your organization's security policy.`,
10931094
Group: &deploymentGroupProvisioning,
10941095
YAML: "daemons",
10951096
},
1097+
{
1098+
Name: "Echo Provisioner",
1099+
Description: "Whether to use echo provisioner daemons instead of Terraform. This is for E2E tests.",
1100+
Flag: "provisioner-daemons-echo",
1101+
Env: "CODER_PROVISIONER_DAEMONS_ECHO",
1102+
Hidden: true,
1103+
Default: "false",
1104+
Value: &c.Provisioner.DaemonsEcho,
1105+
Group: &deploymentGroupProvisioning,
1106+
YAML: "daemonsEcho",
1107+
},
10961108
{
10971109
Name: "Poll Interval",
10981110
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
@@ -283,6 +283,7 @@ curl -X GET http://coder-server:8080/api/v2/deployment/config \
283283
"daemon_poll_interval": 0,
284284
"daemon_poll_jitter": 0,
285285
"daemons": 0,
286+
"daemons_echo": true,
286287
"force_cancel_interval": 0
287288
},
288289
"proxy_health_status_interval": 0,

docs/api/schemas.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1960,6 +1960,7 @@ AuthorizationObject can represent a "set" of objects, such as: all workspaces in
19601960
"daemon_poll_interval": 0,
19611961
"daemon_poll_jitter": 0,
19621962
"daemons": 0,
1963+
"daemons_echo": true,
19631964
"force_cancel_interval": 0
19641965
},
19651966
"proxy_health_status_interval": 0,
@@ -2289,6 +2290,7 @@ AuthorizationObject can represent a "set" of objects, such as: all workspaces in
22892290
"daemon_poll_interval": 0,
22902291
"daemon_poll_jitter": 0,
22912292
"daemons": 0,
2293+
"daemons_echo": true,
22922294
"force_cancel_interval": 0
22932295
},
22942296
"proxy_health_status_interval": 0,
@@ -3125,6 +3127,7 @@ AuthorizationObject can represent a "set" of objects, such as: all workspaces in
31253127
"daemon_poll_interval": 0,
31263128
"daemon_poll_jitter": 0,
31273129
"daemons": 0,
3130+
"daemons_echo": true,
31283131
"force_cancel_interval": 0
31293132
}
31303133
```
@@ -3136,6 +3139,7 @@ AuthorizationObject can represent a "set" of objects, such as: all workspaces in
31363139
| `daemon_poll_interval` | integer | false | | |
31373140
| `daemon_poll_jitter` | integer | false | | |
31383141
| `daemons` | integer | false | | |
3142+
| `daemons_echo` | boolean | false | | |
31393143
| `force_cancel_interval` | integer | false | | |
31403144

31413145
## codersdk.ProvisionerDaemon

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy