Skip to content

Commit 0aacac9

Browse files
committed
Merge remote-tracking branch 'origin/main' into stevenmasley/safe_authorized_query
2 parents 13e938c + 56b963a commit 0aacac9

Some content is hidden

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

62 files changed

+746
-688
lines changed

.devcontainer/Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ SHELL ["/bin/bash", "-o", "pipefail", "-c"]
33

44
ENV EDITOR=vim
55

6-
RUN apt-get update && apt-get upgrade
6+
RUN apt-get update && apt-get upgrade --yes
77

88
RUN apt-get install --yes \
99
ca-certificates \

cli/agent.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ func workspaceAgent() *cobra.Command {
165165
return "", err
166166
}
167167
client.SessionToken = resp.SessionToken
168-
return "", nil
168+
return resp.SessionToken, nil
169169
},
170170
EnvironmentVariables: map[string]string{
171171
"GIT_ASKPASS": executablePath,

cli/agent_test.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,11 @@ package cli_test
22

33
import (
44
"context"
5+
"runtime"
6+
"strings"
57
"testing"
68

9+
"github.com/google/uuid"
710
"github.com/stretchr/testify/assert"
811
"github.com/stretchr/testify/require"
912

@@ -194,6 +197,23 @@ func TestWorkspaceAgent(t *testing.T) {
194197
_, err := dialer.Ping(ctx)
195198
return err == nil
196199
}, testutil.WaitMedium, testutil.IntervalFast)
200+
201+
sshClient, err := dialer.SSHClient()
202+
require.NoError(t, err)
203+
defer sshClient.Close()
204+
session, err := sshClient.NewSession()
205+
require.NoError(t, err)
206+
defer session.Close()
207+
key := "CODER_AGENT_TOKEN"
208+
command := "sh -c 'echo $" + key + "'"
209+
if runtime.GOOS == "windows" {
210+
command = "cmd.exe /c echo %" + key + "%"
211+
}
212+
token, err := session.CombinedOutput(command)
213+
require.NoError(t, err)
214+
_, err = uuid.Parse(strings.TrimSpace(string(token)))
215+
require.NoError(t, err)
216+
197217
cancelFunc()
198218
err = <-errC
199219
require.NoError(t, err)

cli/cliui/provisionerjob.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,14 @@ import (
1616
"github.com/coder/coder/codersdk"
1717
)
1818

19-
func WorkspaceBuild(ctx context.Context, writer io.Writer, client *codersdk.Client, build uuid.UUID, before time.Time) error {
19+
func WorkspaceBuild(ctx context.Context, writer io.Writer, client *codersdk.Client, build uuid.UUID) error {
2020
return ProvisionerJob(ctx, writer, ProvisionerJobOptions{
2121
Fetch: func() (codersdk.ProvisionerJob, error) {
2222
build, err := client.WorkspaceBuild(ctx, build)
2323
return build.Job, err
2424
},
2525
Logs: func() (<-chan codersdk.ProvisionerJobLog, io.Closer, error) {
26-
return client.WorkspaceBuildLogsAfter(ctx, build, before)
26+
return client.WorkspaceBuildLogsAfter(ctx, build, 0)
2727
},
2828
})
2929
}

cli/create.go

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,6 @@ func create() *cobra.Command {
139139
return err
140140
}
141141

142-
after := time.Now()
143142
workspace, err := client.CreateWorkspace(cmd.Context(), organization.ID, codersdk.Me, codersdk.CreateWorkspaceRequest{
144143
TemplateID: template.ID,
145144
Name: workspaceName,
@@ -151,7 +150,7 @@ func create() *cobra.Command {
151150
return err
152151
}
153152

154-
err = cliui.WorkspaceBuild(cmd.Context(), cmd.OutOrStdout(), client, workspace.LatestBuild.ID, after)
153+
err = cliui.WorkspaceBuild(cmd.Context(), cmd.OutOrStdout(), client, workspace.LatestBuild.ID)
155154
if err != nil {
156155
return err
157156
}
@@ -238,7 +237,6 @@ PromptParamLoop:
238237
_, _ = fmt.Fprintln(cmd.OutOrStdout())
239238

240239
// Run a dry-run with the given parameters to check correctness
241-
after := time.Now()
242240
dryRun, err := client.CreateTemplateVersionDryRun(cmd.Context(), templateVersion.ID, codersdk.CreateTemplateVersionDryRunRequest{
243241
WorkspaceName: args.NewWorkspaceName,
244242
ParameterValues: parameters,
@@ -255,7 +253,7 @@ PromptParamLoop:
255253
return client.CancelTemplateVersionDryRun(cmd.Context(), templateVersion.ID, dryRun.ID)
256254
},
257255
Logs: func() (<-chan codersdk.ProvisionerJobLog, io.Closer, error) {
258-
return client.TemplateVersionDryRunLogsAfter(cmd.Context(), templateVersion.ID, dryRun.ID, after)
256+
return client.TemplateVersionDryRunLogsAfter(cmd.Context(), templateVersion.ID, dryRun.ID, 0)
259257
},
260258
// Don't show log output for the dry-run unless there's an error.
261259
Silent: true,

cli/delete.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ func deleteWorkspace() *cobra.Command {
4747
)
4848
}
4949

50-
before := time.Now()
5150
build, err := client.CreateWorkspaceBuild(cmd.Context(), workspace.ID, codersdk.CreateWorkspaceBuildRequest{
5251
Transition: codersdk.WorkspaceTransitionDelete,
5352
ProvisionerState: state,
@@ -57,7 +56,7 @@ func deleteWorkspace() *cobra.Command {
5756
return err
5857
}
5958

60-
err = cliui.WorkspaceBuild(cmd.Context(), cmd.OutOrStdout(), client, build.ID, before)
59+
err = cliui.WorkspaceBuild(cmd.Context(), cmd.OutOrStdout(), client, build.ID)
6160
if err != nil {
6261
return err
6362
}

cli/portforward.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ func portForward() *cobra.Command {
7979
return xerrors.New("workspace must be in start transition to port-forward")
8080
}
8181
if workspace.LatestBuild.Job.CompletedAt == nil {
82-
err = cliui.WorkspaceBuild(ctx, cmd.ErrOrStderr(), client, workspace.LatestBuild.ID, workspace.CreatedAt)
82+
err = cliui.WorkspaceBuild(ctx, cmd.ErrOrStderr(), client, workspace.LatestBuild.ID)
8383
if err != nil {
8484
return err
8585
}

cli/server.go

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import (
2929
"github.com/google/go-github/v43/github"
3030
"github.com/google/uuid"
3131
"github.com/prometheus/client_golang/prometheus"
32+
"github.com/prometheus/client_golang/prometheus/collectors"
3233
"github.com/prometheus/client_golang/prometheus/promhttp"
3334
"github.com/spf13/afero"
3435
"github.com/spf13/cobra"
@@ -358,6 +359,7 @@ func Server(vip *viper.Viper, newAPI func(context.Context, *coderd.Options) (*co
358359
AgentStatsRefreshInterval: cfg.AgentStatRefreshInterval.Value,
359360
Experimental: ExperimentalEnabled(cmd),
360361
DeploymentConfig: cfg,
362+
PrometheusRegistry: prometheus.NewRegistry(),
361363
}
362364
if tlsConfig != nil {
363365
options.TLSCertificates = tlsConfig.Certificates
@@ -505,21 +507,25 @@ func Server(vip *viper.Viper, newAPI func(context.Context, *coderd.Options) (*co
505507
defer serveHandler(ctx, logger, nil, cfg.Pprof.Address.Value, "pprof")()
506508
}
507509
if cfg.Prometheus.Enable.Value {
508-
options.PrometheusRegisterer = prometheus.DefaultRegisterer
509-
closeUsersFunc, err := prometheusmetrics.ActiveUsers(ctx, options.PrometheusRegisterer, options.Database, 0)
510+
options.PrometheusRegistry.MustRegister(collectors.NewGoCollector())
511+
options.PrometheusRegistry.MustRegister(collectors.NewProcessCollector(collectors.ProcessCollectorOpts{}))
512+
513+
closeUsersFunc, err := prometheusmetrics.ActiveUsers(ctx, options.PrometheusRegistry, options.Database, 0)
510514
if err != nil {
511515
return xerrors.Errorf("register active users prometheus metric: %w", err)
512516
}
513517
defer closeUsersFunc()
514518

515-
closeWorkspacesFunc, err := prometheusmetrics.Workspaces(ctx, options.PrometheusRegisterer, options.Database, 0)
519+
closeWorkspacesFunc, err := prometheusmetrics.Workspaces(ctx, options.PrometheusRegistry, options.Database, 0)
516520
if err != nil {
517521
return xerrors.Errorf("register workspaces prometheus metric: %w", err)
518522
}
519523
defer closeWorkspacesFunc()
520524

521525
//nolint:revive
522-
defer serveHandler(ctx, logger, promhttp.Handler(), cfg.Prometheus.Address.Value, "prometheus")()
526+
defer serveHandler(ctx, logger, promhttp.InstrumentMetricHandler(
527+
options.PrometheusRegistry, promhttp.HandlerFor(options.PrometheusRegistry, promhttp.HandlerOpts{}),
528+
), cfg.Prometheus.Address.Value, "prometheus")()
523529
}
524530

525531
// We use a separate coderAPICloser so the Enterprise API
@@ -555,8 +561,9 @@ func Server(vip *viper.Viper, newAPI func(context.Context, *coderd.Options) (*co
555561
_ = daemon.Close()
556562
}
557563
}()
564+
provisionerdMetrics := provisionerd.NewMetrics(options.PrometheusRegistry)
558565
for i := 0; i < cfg.ProvisionerDaemons.Value; i++ {
559-
daemon, err := newProvisionerDaemon(ctx, coderAPI, logger, cfg.CacheDirectory.Value, errCh, false)
566+
daemon, err := newProvisionerDaemon(ctx, coderAPI, provisionerdMetrics, logger, cfg.CacheDirectory.Value, errCh, false)
560567
if err != nil {
561568
return xerrors.Errorf("create provisioner daemon: %w", err)
562569
}
@@ -823,6 +830,7 @@ func shutdownWithTimeout(shutdown func(context.Context) error, timeout time.Dura
823830
func newProvisionerDaemon(
824831
ctx context.Context,
825832
coderAPI *coderd.API,
833+
metrics provisionerd.Metrics,
826834
logger slog.Logger,
827835
cacheDir string,
828836
errCh chan error,
@@ -899,7 +907,8 @@ func newProvisionerDaemon(
899907
UpdateInterval: 500 * time.Millisecond,
900908
Provisioners: provisioners,
901909
WorkDirectory: tempDir,
902-
Tracer: coderAPI.TracerProvider,
910+
TracerProvider: coderAPI.TracerProvider,
911+
Metrics: &metrics,
903912
}), nil
904913
}
905914

cli/ssh.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,7 @@ func getWorkspaceAndAgent(ctx context.Context, cmd *cobra.Command, client *coder
250250
return codersdk.Workspace{}, codersdk.WorkspaceAgent{}, xerrors.New("workspace must be in start transition to ssh")
251251
}
252252
if workspace.LatestBuild.Job.CompletedAt == nil {
253-
err := cliui.WorkspaceBuild(ctx, cmd.ErrOrStderr(), client, workspace.LatestBuild.ID, workspace.CreatedAt)
253+
err := cliui.WorkspaceBuild(ctx, cmd.ErrOrStderr(), client, workspace.LatestBuild.ID)
254254
if err != nil {
255255
return codersdk.Workspace{}, codersdk.WorkspaceAgent{}, err
256256
}

cli/start.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,14 @@ func start() *cobra.Command {
2525
if err != nil {
2626
return err
2727
}
28-
before := time.Now()
2928
build, err := client.CreateWorkspaceBuild(cmd.Context(), workspace.ID, codersdk.CreateWorkspaceBuildRequest{
3029
Transition: codersdk.WorkspaceTransitionStart,
3130
})
3231
if err != nil {
3332
return err
3433
}
3534

36-
err = cliui.WorkspaceBuild(cmd.Context(), cmd.OutOrStdout(), client, build.ID, before)
35+
err = cliui.WorkspaceBuild(cmd.Context(), cmd.OutOrStdout(), client, build.ID)
3736
if err != nil {
3837
return err
3938
}

cli/state.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import (
55
"io"
66
"os"
77
"strconv"
8-
"time"
98

109
"github.com/spf13/cobra"
1110

@@ -100,7 +99,6 @@ func statePush() *cobra.Command {
10099
return err
101100
}
102101

103-
before := time.Now()
104102
build, err = client.CreateWorkspaceBuild(cmd.Context(), workspace.ID, codersdk.CreateWorkspaceBuildRequest{
105103
TemplateVersionID: build.TemplateVersionID,
106104
Transition: build.Transition,
@@ -109,7 +107,7 @@ func statePush() *cobra.Command {
109107
if err != nil {
110108
return err
111109
}
112-
return cliui.WorkspaceBuild(cmd.Context(), cmd.OutOrStderr(), client, build.ID, before)
110+
return cliui.WorkspaceBuild(cmd.Context(), cmd.OutOrStderr(), client, build.ID)
113111
},
114112
}
115113
cmd.Flags().IntVarP(&buildNumber, "build", "b", 0, "Specify a workspace build to target by name.")

cli/stop.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,15 +33,14 @@ func stop() *cobra.Command {
3333
if err != nil {
3434
return err
3535
}
36-
before := time.Now()
3736
build, err := client.CreateWorkspaceBuild(cmd.Context(), workspace.ID, codersdk.CreateWorkspaceBuildRequest{
3837
Transition: codersdk.WorkspaceTransitionStop,
3938
})
4039
if err != nil {
4140
return err
4241
}
4342

44-
err = cliui.WorkspaceBuild(cmd.Context(), cmd.OutOrStdout(), client, build.ID, before)
43+
err = cliui.WorkspaceBuild(cmd.Context(), cmd.OutOrStdout(), client, build.ID)
4544
if err != nil {
4645
return err
4746
}

cli/templatecreate.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,6 @@ type createValidTemplateVersionArgs struct {
160160
}
161161

162162
func createValidTemplateVersion(cmd *cobra.Command, args createValidTemplateVersionArgs, parameters ...codersdk.CreateParameterRequest) (*codersdk.TemplateVersion, []codersdk.CreateParameterRequest, error) {
163-
before := time.Now()
164163
client := args.Client
165164

166165
req := codersdk.CreateTemplateVersionRequest{
@@ -187,7 +186,7 @@ func createValidTemplateVersion(cmd *cobra.Command, args createValidTemplateVers
187186
return client.CancelTemplateVersion(cmd.Context(), version.ID)
188187
},
189188
Logs: func() (<-chan codersdk.ProvisionerJobLog, io.Closer, error) {
190-
return client.TemplateVersionLogsAfter(cmd.Context(), version.ID, before)
189+
return client.TemplateVersionLogsAfter(cmd.Context(), version.ID, 0)
191190
},
192191
})
193192
if err != nil {

cli/update.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package cli
22

33
import (
44
"fmt"
5-
"time"
65

76
"github.com/spf13/cobra"
87

@@ -57,7 +56,6 @@ func update() *cobra.Command {
5756
return nil
5857
}
5958

60-
before := time.Now()
6159
build, err := client.CreateWorkspaceBuild(cmd.Context(), workspace.ID, codersdk.CreateWorkspaceBuildRequest{
6260
TemplateVersionID: template.ActiveVersionID,
6361
Transition: workspace.LatestBuild.Transition,
@@ -66,7 +64,7 @@ func update() *cobra.Command {
6664
if err != nil {
6765
return err
6866
}
69-
logs, closer, err := client.WorkspaceBuildLogsAfter(cmd.Context(), build.ID, before)
67+
logs, closer, err := client.WorkspaceBuildLogsAfter(cmd.Context(), build.ID, 0)
7068
if err != nil {
7169
return err
7270
}

coderd/activitybump.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ func activityBumpWorkspace(log slog.Logger, db database.Store, workspace databas
5454

5555
newDeadline := database.Now().Add(bumpAmount)
5656

57-
if err := s.UpdateWorkspaceBuildByID(ctx, database.UpdateWorkspaceBuildByIDParams{
57+
if _, err := s.UpdateWorkspaceBuildByID(ctx, database.UpdateWorkspaceBuildByIDParams{
5858
ID: build.ID,
5959
UpdatedAt: database.Now(),
6060
ProvisionerState: build.ProvisionerState,

coderd/coderd.go

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import (
1616
"github.com/andybalholm/brotli"
1717
"github.com/go-chi/chi/v5"
1818
"github.com/go-chi/chi/v5/middleware"
19+
"github.com/google/uuid"
1920
"github.com/klauspost/compress/zstd"
2021
"github.com/prometheus/client_golang/prometheus"
2122
"go.opentelemetry.io/otel/trace"
@@ -78,7 +79,7 @@ type Options struct {
7879
GoogleTokenValidator *idtoken.Validator
7980
GithubOAuth2Config *GithubOAuth2Config
8081
OIDCConfig *OIDCConfig
81-
PrometheusRegisterer prometheus.Registerer
82+
PrometheusRegistry *prometheus.Registry
8283
SecureAuthCookie bool
8384
SSHKeygenAlgorithm gitsshkey.Algorithm
8485
Telemetry telemetry.Reporter
@@ -132,8 +133,8 @@ func New(options *Options) *API {
132133
if options.Authorizer == nil {
133134
options.Authorizer = rbac.NewAuthorizer()
134135
}
135-
if options.PrometheusRegisterer == nil {
136-
options.PrometheusRegisterer = prometheus.NewRegistry()
136+
if options.PrometheusRegistry == nil {
137+
options.PrometheusRegistry = prometheus.NewRegistry()
137138
}
138139
if options.TailnetCoordinator == nil {
139140
options.TailnetCoordinator = tailnet.NewCoordinator()
@@ -165,6 +166,7 @@ func New(options *Options) *API {
165166

166167
r := chi.NewRouter()
167168
api := &API{
169+
ID: uuid.New(),
168170
Options: options,
169171
RootHandler: r,
170172
siteHandler: site.Handler(site.FS(), binFS),
@@ -204,7 +206,7 @@ func New(options *Options) *API {
204206
httpmw.Recover(api.Logger),
205207
httpmw.ExtractRealIP(api.RealIPConfig),
206208
httpmw.Logger(api.Logger),
207-
httpmw.Prometheus(options.PrometheusRegisterer),
209+
httpmw.Prometheus(options.PrometheusRegistry),
208210
// handleSubdomainApplications checks if the first subdomain is a valid
209211
// app URL. If it is, it will serve that application.
210212
api.handleSubdomainApplications(
@@ -579,6 +581,11 @@ func New(options *Options) *API {
579581

580582
type API struct {
581583
*Options
584+
// ID is a uniquely generated ID on initialization.
585+
// This is used to associate objects with a specific
586+
// Coder API instance, like workspace agents to a
587+
// specific replica.
588+
ID uuid.UUID
582589
Auditor atomic.Pointer[audit.Auditor]
583590
WorkspaceClientCoordinateOverride atomic.Pointer[func(rw http.ResponseWriter) bool]
584591
WorkspaceQuotaEnforcer atomic.Pointer[workspacequota.Enforcer]

0 commit comments

Comments
 (0)