Skip to content

Commit 57355fb

Browse files
committed
Merge branch 'main' into joshvee-ssh-header-command
2 parents 9a9ff38 + f5f150d commit 57355fb

File tree

230 files changed

+6610
-4072
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

230 files changed

+6610
-4072
lines changed

.github/actions/setup-sqlc/action.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,6 @@ runs:
55
using: "composite"
66
steps:
77
- name: Setup sqlc
8-
uses: sqlc-dev/setup-sqlc@v3
8+
uses: sqlc-dev/setup-sqlc@v4
99
with:
1010
sqlc-version: "1.20.0"

.github/pr-deployments/template/main.tf

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
terraform {
22
required_providers {
33
coder = {
4-
source = "coder/coder"
4+
source = "coder/coder"
55
}
66
kubernetes = {
7-
source = "hashicorp/kubernetes"
7+
source = "hashicorp/kubernetes"
88
}
99
}
1010
}
@@ -235,6 +235,9 @@ resource "kubernetes_deployment" "main" {
235235
"app.kubernetes.io/name" = "coder-workspace"
236236
}
237237
}
238+
strategy {
239+
type = "Recreate"
240+
}
238241

239242
template {
240243
metadata {

.github/workflows/ci.yaml

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -291,14 +291,9 @@ jobs:
291291
gotestsum --junitfile="gotests.xml" --jsonfile="gotests.json" \
292292
--packages="./..." -- $PARALLEL_FLAG -short -failfast $COVERAGE_FLAGS
293293
294-
- name: Print test stats
295-
if: success() || failure()
296-
run: |
297-
# Artifacts are not available after rerunning a job,
298-
# so we need to print the test stats to the log.
299-
go run ./scripts/ci-report/main.go gotests.json | tee gotests_stats.json
300-
301294
- name: Upload test stats to Datadog
295+
timeout-minutes: 1
296+
continue-on-error: true
302297
uses: ./.github/actions/upload-datadog
303298
if: success() || failure()
304299
with:
@@ -343,14 +338,9 @@ jobs:
343338
export TS_DEBUG_DISCO=true
344339
make test-postgres
345340
346-
- name: Print test stats
347-
if: success() || failure()
348-
run: |
349-
# Artifacts are not available after rerunning a job,
350-
# so we need to print the test stats to the log.
351-
go run ./scripts/ci-report/main.go gotests.json | tee gotests_stats.json
352-
353341
- name: Upload test stats to Datadog
342+
timeout-minutes: 1
343+
continue-on-error: true
354344
uses: ./.github/actions/upload-datadog
355345
if: success() || failure()
356346
with:
@@ -391,6 +381,8 @@ jobs:
391381
gotestsum --junitfile="gotests.xml" -- -race ./...
392382
393383
- name: Upload test stats to Datadog
384+
timeout-minutes: 1
385+
continue-on-error: true
394386
uses: ./.github/actions/upload-datadog
395387
if: always()
396388
with:

Makefile

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -419,7 +419,6 @@ lint: lint/shellcheck lint/go lint/ts lint/helm lint/site-icons
419419

420420
lint/site-icons:
421421
./scripts/check_site_icons.sh
422-
423422
.PHONY: lint/site-icons
424423

425424
lint/ts:
@@ -517,6 +516,8 @@ coderd/database/dump.sql: coderd/database/gen/dump/main.go $(wildcard coderd/dat
517516
go run ./coderd/database/gen/dump/main.go
518517

519518
# Generates Go code for querying the database.
519+
# coderd/database/queries.sql.go
520+
# coderd/database/models.go
520521
coderd/database/querier.go: coderd/database/sqlc.yaml coderd/database/dump.sql $(wildcard coderd/database/queries/*.sql)
521522
./coderd/database/generate.sh
522523

@@ -539,19 +540,18 @@ provisionerd/proto/provisionerd.pb.go: provisionerd/proto/provisionerd.proto
539540
--go-drpc_opt=paths=source_relative \
540541
./provisionerd/proto/provisionerd.proto
541542

542-
site/src/api/typesGenerated.ts: scripts/apitypings/main.go $(shell find ./codersdk $(FIND_EXCLUSIONS) -type f -name '*.go')
543-
go run ./scripts/apitypings/ > site/src/api/typesGenerated.ts
544-
cd site
545-
pnpm run format:types ./src/api/typesGenerated.ts
543+
site/src/api/typesGenerated.ts: $(wildcard scripts/apitypings/*) $(shell find ./codersdk $(FIND_EXCLUSIONS) -type f -name '*.go')
544+
go run ./scripts/apitypings/ > $@
545+
pnpm run format:write:only "$@"
546546

547547
site/e2e/provisionerGenerated.ts: provisionerd/proto/provisionerd.pb.go provisionersdk/proto/provisioner.pb.go
548548
cd site
549549
../scripts/pnpm_install.sh
550550
pnpm run gen:provisioner
551551

552-
site/src/theme/icons.json: $(wildcard site/static/icon/*)
553-
go run ./scripts/gensite/ -icons $@
554-
pnpm run format:write:only $@
552+
site/src/theme/icons.json: $(wildcard scripts/gensite/*) $(wildcard site/static/icon/*)
553+
go run ./scripts/gensite/ -icons "$@"
554+
pnpm run format:write:only "$@"
555555

556556
examples/examples.gen.json: scripts/examplegen/main.go examples/examples.go $(shell find ./examples/templates)
557557
go run ./scripts/examplegen/main.go > examples/examples.gen.json

cli/restart.go

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,15 @@ package cli
22

33
import (
44
"fmt"
5+
"net/http"
56
"time"
67

78
"golang.org/x/xerrors"
89

9-
"github.com/coder/pretty"
10-
1110
"github.com/coder/coder/v2/cli/clibase"
1211
"github.com/coder/coder/v2/cli/cliui"
1312
"github.com/coder/coder/v2/codersdk"
13+
"github.com/coder/pretty"
1414
)
1515

1616
func (r *RootCmd) restart() *clibase.Cmd {
@@ -40,19 +40,14 @@ func (r *RootCmd) restart() *clibase.Cmd {
4040
return err
4141
}
4242

43-
template, err := client.Template(inv.Context(), workspace.TemplateID)
44-
if err != nil {
45-
return err
46-
}
47-
4843
buildOptions, err := asWorkspaceBuildParameters(parameterFlags.buildOptions)
4944
if err != nil {
5045
return xerrors.Errorf("can't parse build options: %w", err)
5146
}
5247

5348
buildParameters, err := prepStartWorkspace(inv, client, prepStartWorkspaceArgs{
54-
Action: WorkspaceRestart,
55-
Template: template,
49+
Action: WorkspaceRestart,
50+
TemplateVersionID: workspace.LatestBuild.TemplateVersionID,
5651

5752
LastBuildParameters: lastBuildParameters,
5853

@@ -82,13 +77,29 @@ func (r *RootCmd) restart() *clibase.Cmd {
8277
return err
8378
}
8479

85-
build, err = client.CreateWorkspaceBuild(ctx, workspace.ID, codersdk.CreateWorkspaceBuildRequest{
80+
req := codersdk.CreateWorkspaceBuildRequest{
8681
Transition: codersdk.WorkspaceTransitionStart,
8782
RichParameterValues: buildParameters,
88-
})
89-
if err != nil {
83+
TemplateVersionID: workspace.LatestBuild.TemplateVersionID,
84+
}
85+
86+
build, err = client.CreateWorkspaceBuild(ctx, workspace.ID, req)
87+
// It's possible for a workspace build to fail due to the template requiring starting
88+
// workspaces with the active version.
89+
if cerr, ok := codersdk.AsError(err); ok && cerr.StatusCode() == http.StatusUnauthorized {
90+
build, err = startWorkspaceActiveVersion(inv, client, startWorkspaceActiveVersionArgs{
91+
BuildOptions: buildOptions,
92+
LastBuildParameters: lastBuildParameters,
93+
PromptBuildOptions: parameterFlags.promptBuildOptions,
94+
Workspace: workspace,
95+
})
96+
if err != nil {
97+
return xerrors.Errorf("start workspace with active template version: %w", err)
98+
}
99+
} else if err != nil {
90100
return err
91101
}
102+
92103
err = cliui.WorkspaceBuild(ctx, out, client, build.ID)
93104
if err != nil {
94105
return err

cli/server.go

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ import (
4141
"github.com/prometheus/client_golang/prometheus"
4242
"github.com/prometheus/client_golang/prometheus/collectors"
4343
"github.com/prometheus/client_golang/prometheus/promhttp"
44+
"go.opentelemetry.io/otel"
45+
"go.opentelemetry.io/otel/propagation"
4446
"go.opentelemetry.io/otel/trace"
4547
"golang.org/x/mod/semver"
4648
"golang.org/x/oauth2"
@@ -78,6 +80,7 @@ import (
7880
"github.com/coder/coder/v2/coderd/httpmw"
7981
"github.com/coder/coder/v2/coderd/oauthpki"
8082
"github.com/coder/coder/v2/coderd/prometheusmetrics"
83+
"github.com/coder/coder/v2/coderd/prometheusmetrics/insights"
8184
"github.com/coder/coder/v2/coderd/schedule"
8285
"github.com/coder/coder/v2/coderd/telemetry"
8386
"github.com/coder/coder/v2/coderd/tracing"
@@ -198,6 +201,21 @@ func enablePrometheus(
198201
}
199202
afterCtx(ctx, closeWorkspacesFunc)
200203

204+
insightsMetricsCollector, err := insights.NewMetricsCollector(options.Database, options.Logger, 0, 0)
205+
if err != nil {
206+
return nil, xerrors.Errorf("unable to initialize insights metrics collector: %w", err)
207+
}
208+
err = options.PrometheusRegistry.Register(insightsMetricsCollector)
209+
if err != nil {
210+
return nil, xerrors.Errorf("unable to register insights metrics collector: %w", err)
211+
}
212+
213+
closeInsightsMetricsCollector, err := insightsMetricsCollector.Run(ctx)
214+
if err != nil {
215+
return nil, xerrors.Errorf("unable to run insights metrics collector: %w", err)
216+
}
217+
afterCtx(ctx, closeInsightsMetricsCollector)
218+
201219
if vals.Prometheus.CollectAgentStats {
202220
closeAgentStatsFunc, err := prometheusmetrics.AgentStats(ctx, logger, options.PrometheusRegistry, options.Database, time.Now(), 0)
203221
if err != nil {
@@ -764,6 +782,8 @@ func (r *RootCmd) Server(newAPI func(context.Context, *coderd.Options) (*coderd.
764782
return xerrors.Errorf("create telemetry reporter: %w", err)
765783
}
766784
defer options.Telemetry.Close()
785+
} else {
786+
logger.Warn(ctx, `telemetry disabled, unable to notify of security issues. Read more: https://coder.com/docs/v2/latest/admin/telemetry`)
767787
}
768788

769789
// This prevents the pprof import from being accidentally deleted.
@@ -938,7 +958,7 @@ func (r *RootCmd) Server(newAPI func(context.Context, *coderd.Options) (*coderd.
938958
autobuildTicker := time.NewTicker(vals.AutobuildPollInterval.Value())
939959
defer autobuildTicker.Stop()
940960
autobuildExecutor := autobuild.NewExecutor(
941-
ctx, options.Database, options.Pubsub, coderAPI.TemplateScheduleStore, &coderAPI.Auditor, logger, autobuildTicker.C)
961+
ctx, options.Database, options.Pubsub, coderAPI.TemplateScheduleStore, &coderAPI.Auditor, coderAPI.AccessControlStore, logger, autobuildTicker.C)
942962
autobuildExecutor.Run()
943963

944964
hangDetectorTicker := time.NewTicker(vals.JobHangDetectorInterval.Value())
@@ -2020,6 +2040,13 @@ func ConfigureTraceProvider(
20202040
sqlDriver = "postgres"
20212041
)
20222042

2043+
otel.SetTextMapPropagator(
2044+
propagation.NewCompositeTextMapPropagator(
2045+
propagation.TraceContext{},
2046+
propagation.Baggage{},
2047+
),
2048+
)
2049+
20232050
if cfg.Trace.Enable.Value() || cfg.Trace.DataDog.Value() || cfg.Trace.HoneycombAPIKey != "" {
20242051
sdkTracerProvider, _closeTracing, err := tracing.TracerProvider(ctx, "coderd", tracing.TracerOpts{
20252052
Default: cfg.Trace.Enable.Value(),

cli/start.go

Lines changed: 65 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@ package cli
22

33
import (
44
"fmt"
5+
"net/http"
56
"time"
67

8+
"github.com/google/uuid"
79
"golang.org/x/xerrors"
810

911
"github.com/coder/coder/v2/cli/clibase"
@@ -35,19 +37,14 @@ func (r *RootCmd) start() *clibase.Cmd {
3537
return err
3638
}
3739

38-
template, err := client.Template(inv.Context(), workspace.TemplateID)
39-
if err != nil {
40-
return err
41-
}
42-
4340
buildOptions, err := asWorkspaceBuildParameters(parameterFlags.buildOptions)
4441
if err != nil {
4542
return xerrors.Errorf("unable to parse build options: %w", err)
4643
}
4744

4845
buildParameters, err := prepStartWorkspace(inv, client, prepStartWorkspaceArgs{
49-
Action: WorkspaceStart,
50-
Template: template,
46+
Action: WorkspaceStart,
47+
TemplateVersionID: workspace.LatestBuild.TemplateVersionID,
5148

5249
LastBuildParameters: lastBuildParameters,
5350

@@ -58,11 +55,26 @@ func (r *RootCmd) start() *clibase.Cmd {
5855
return err
5956
}
6057

61-
build, err := client.CreateWorkspaceBuild(inv.Context(), workspace.ID, codersdk.CreateWorkspaceBuildRequest{
58+
req := codersdk.CreateWorkspaceBuildRequest{
6259
Transition: codersdk.WorkspaceTransitionStart,
6360
RichParameterValues: buildParameters,
64-
})
65-
if err != nil {
61+
TemplateVersionID: workspace.LatestBuild.TemplateVersionID,
62+
}
63+
64+
build, err := client.CreateWorkspaceBuild(inv.Context(), workspace.ID, req)
65+
// It's possible for a workspace build to fail due to the template requiring starting
66+
// workspaces with the active version.
67+
if cerr, ok := codersdk.AsError(err); ok && cerr.StatusCode() == http.StatusUnauthorized {
68+
build, err = startWorkspaceActiveVersion(inv, client, startWorkspaceActiveVersionArgs{
69+
BuildOptions: buildOptions,
70+
LastBuildParameters: lastBuildParameters,
71+
PromptBuildOptions: parameterFlags.promptBuildOptions,
72+
Workspace: workspace,
73+
})
74+
if err != nil {
75+
return xerrors.Errorf("start workspace with active template version: %w", err)
76+
}
77+
} else if err != nil {
6678
return err
6779
}
6880

@@ -82,8 +94,8 @@ func (r *RootCmd) start() *clibase.Cmd {
8294
}
8395

8496
type prepStartWorkspaceArgs struct {
85-
Action WorkspaceCLIAction
86-
Template codersdk.Template
97+
Action WorkspaceCLIAction
98+
TemplateVersionID uuid.UUID
8799

88100
LastBuildParameters []codersdk.WorkspaceBuildParameter
89101

@@ -94,7 +106,7 @@ type prepStartWorkspaceArgs struct {
94106
func prepStartWorkspace(inv *clibase.Invocation, client *codersdk.Client, args prepStartWorkspaceArgs) ([]codersdk.WorkspaceBuildParameter, error) {
95107
ctx := inv.Context()
96108

97-
templateVersion, err := client.TemplateVersion(ctx, args.Template.ActiveVersionID)
109+
templateVersion, err := client.TemplateVersion(ctx, args.TemplateVersionID)
98110
if err != nil {
99111
return nil, xerrors.Errorf("get template version: %w", err)
100112
}
@@ -110,3 +122,43 @@ func prepStartWorkspace(inv *clibase.Invocation, client *codersdk.Client, args p
110122
WithBuildOptions(args.BuildOptions)
111123
return resolver.Resolve(inv, args.Action, templateVersionParameters)
112124
}
125+
126+
type startWorkspaceActiveVersionArgs struct {
127+
BuildOptions []codersdk.WorkspaceBuildParameter
128+
LastBuildParameters []codersdk.WorkspaceBuildParameter
129+
PromptBuildOptions bool
130+
Workspace codersdk.Workspace
131+
}
132+
133+
func startWorkspaceActiveVersion(inv *clibase.Invocation, client *codersdk.Client, args startWorkspaceActiveVersionArgs) (codersdk.WorkspaceBuild, error) {
134+
_, _ = fmt.Fprintln(inv.Stdout, "Failed to restart with the template version from your last build. Policy may require you to restart with the current active template version.")
135+
136+
template, err := client.Template(inv.Context(), args.Workspace.TemplateID)
137+
if err != nil {
138+
return codersdk.WorkspaceBuild{}, xerrors.Errorf("get template: %w", err)
139+
}
140+
141+
buildParameters, err := prepStartWorkspace(inv, client, prepStartWorkspaceArgs{
142+
Action: WorkspaceStart,
143+
TemplateVersionID: template.ActiveVersionID,
144+
145+
LastBuildParameters: args.LastBuildParameters,
146+
147+
PromptBuildOptions: args.PromptBuildOptions,
148+
BuildOptions: args.BuildOptions,
149+
})
150+
if err != nil {
151+
return codersdk.WorkspaceBuild{}, err
152+
}
153+
154+
build, err := client.CreateWorkspaceBuild(inv.Context(), args.Workspace.ID, codersdk.CreateWorkspaceBuildRequest{
155+
Transition: codersdk.WorkspaceTransitionStart,
156+
RichParameterValues: buildParameters,
157+
TemplateVersionID: template.ActiveVersionID,
158+
})
159+
if err != nil {
160+
return codersdk.WorkspaceBuild{}, err
161+
}
162+
163+
return build, nil
164+
}

0 commit comments

Comments
 (0)