Skip to content

Commit 2cfcfac

Browse files
committed
Merge branch 'main' into entfactor
2 parents 2dcf1f8 + 63fd494 commit 2cfcfac

Some content is hidden

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

63 files changed

+1492
-900
lines changed

.vscode/settings.json

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
"circbuf",
99
"cliflag",
1010
"cliui",
11+
"codecov",
12+
"Codespaces",
1113
"coderd",
1214
"coderdtest",
1315
"codersdk",
@@ -80,6 +82,7 @@
8082
"ptty",
8183
"ptys",
8284
"ptytest",
85+
"quickstart",
8386
"reconfig",
8487
"retrier",
8588
"rpty",
@@ -117,10 +120,12 @@
117120
"tstun",
118121
"turnconn",
119122
"typegen",
123+
"typesafe",
120124
"unconvert",
121125
"Untar",
122126
"Userspace",
123127
"VMID",
128+
"walkthrough",
124129
"weblinks",
125130
"webrtc",
126131
"wgcfg",
@@ -140,6 +145,10 @@
140145
"xstate",
141146
"yamux"
142147
],
148+
"cSpell.ignorePaths": [
149+
"site/package.json",
150+
".vscode/settings.json"
151+
],
143152
"emeraldwalk.runonsave": {
144153
"commands": [
145154
{

Makefile

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,13 @@ GOARCH := $(shell go env GOARCH)
3737
GOOS_BIN_EXT := $(if $(filter windows, $(GOOS)),.exe,)
3838
VERSION := $(shell ./scripts/version.sh)
3939

40+
# Use the highest ZSTD compression level in CI.
41+
ifdef CI
42+
ZSTDFLAGS := -22 --ultra
43+
else
44+
ZSTDFLAGS := -6
45+
endif
46+
4047
# All ${OS}_${ARCH} combos we build for. Windows binaries have the .exe suffix.
4148
OS_ARCHES := \
4249
linux_amd64 linux_arm64 linux_armv7 \
@@ -102,9 +109,8 @@ build/coder-slim_$(VERSION).tar: build/coder-slim_$(VERSION)_checksums.sha1 $(CO
102109
popd
103110

104111
build/coder-slim_$(VERSION).tar.zst site/out/bin/coder.tar.zst: build/coder-slim_$(VERSION).tar
105-
zstd -6 \
112+
zstd $(ZSTDFLAGS) \
106113
--force \
107-
--ultra \
108114
--long \
109115
--no-progress \
110116
-o "build/coder-slim_$(VERSION).tar.zst" \

cli/portforward_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import (
2424

2525
func TestPortForward(t *testing.T) {
2626
t.Parallel()
27+
t.Skip("These tests flake... a lot. It seems related to the Tailscale change, but all other tests pass...")
2728

2829
t.Run("None", func(t *testing.T) {
2930
t.Parallel()
@@ -281,6 +282,7 @@ func TestPortForward(t *testing.T) {
281282

282283
// runAgent creates a fake workspace and starts an agent locally for that
283284
// workspace. The agent will be cleaned up on test completion.
285+
// nolint:unused
284286
func runAgent(t *testing.T, client *codersdk.Client, userID uuid.UUID) ([]codersdk.WorkspaceResource, codersdk.Workspace) {
285287
ctx := context.Background()
286288
user, err := client.User(ctx, userID.String())

cli/server.go

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ import (
3434
"github.com/prometheus/client_golang/prometheus/promhttp"
3535
"github.com/spf13/afero"
3636
"github.com/spf13/cobra"
37-
sdktrace "go.opentelemetry.io/otel/sdk/trace"
37+
"go.opentelemetry.io/otel/trace"
3838
"golang.org/x/oauth2"
3939
xgithub "golang.org/x/oauth2/github"
4040
"golang.org/x/sync/errgroup"
@@ -115,7 +115,7 @@ func Server(newAPI func(context.Context, *coderd.Options) (*coderd.API, error))
115115
turnRelayAddress string
116116
tunnel bool
117117
stunServers []string
118-
trace bool
118+
traceEnable bool
119119
secureAuthCookie bool
120120
sshKeygenAlgorithmRaw string
121121
autoImportTemplates []string
@@ -159,26 +159,32 @@ func Server(newAPI func(context.Context, *coderd.Options) (*coderd.API, error))
159159
defer http.DefaultClient.CloseIdleConnections()
160160

161161
var (
162-
tracerProvider *sdktrace.TracerProvider
162+
tracerProvider trace.TracerProvider
163163
err error
164164
sqlDriver = "postgres"
165165
)
166-
if trace {
167-
tracerProvider, err = tracing.TracerProvider(ctx, "coderd")
166+
167+
if traceEnable || telemetryEnable {
168+
sdkTracerProvider, err := tracing.TracerProvider(ctx, "coderd", tracing.TracerOpts{
169+
Default: traceEnable,
170+
Coder: telemetryEnable && !isTest(),
171+
})
168172
if err != nil {
169-
logger.Warn(ctx, "failed to start telemetry exporter", slog.Error(err))
173+
logger.Warn(ctx, "start telemetry exporter", slog.Error(err))
170174
} else {
171175
// allow time for traces to flush even if command context is canceled
172176
defer func() {
173-
_ = shutdownWithTimeout(tracerProvider, 5*time.Second)
177+
_ = shutdownWithTimeout(sdkTracerProvider, 5*time.Second)
174178
}()
175179

176-
d, err := tracing.PostgresDriver(tracerProvider, "coderd.database")
180+
d, err := tracing.PostgresDriver(sdkTracerProvider, "coderd.database")
177181
if err != nil {
178-
logger.Warn(ctx, "failed to start postgres tracing driver", slog.Error(err))
182+
logger.Warn(ctx, "start postgres tracing driver", slog.Error(err))
179183
} else {
180184
sqlDriver = d
181185
}
186+
187+
tracerProvider = sdkTracerProvider
182188
}
183189
}
184190

@@ -841,7 +847,7 @@ func Server(newAPI func(context.Context, *coderd.Options) (*coderd.API, error))
841847
cliflag.StringArrayVarP(root.Flags(), &stunServers, "stun-server", "", "CODER_STUN_SERVERS", []string{
842848
"stun:stun.l.google.com:19302",
843849
}, "Specify URLs for STUN servers to enable P2P connections.")
844-
cliflag.BoolVarP(root.Flags(), &trace, "trace", "", "CODER_TRACE", false, "Specifies if application tracing data is collected")
850+
cliflag.BoolVarP(root.Flags(), &traceEnable, "trace", "", "CODER_TRACE", false, "Specifies if application tracing data is collected")
845851
cliflag.StringVarP(root.Flags(), &turnRelayAddress, "turn-relay-address", "", "CODER_TURN_RELAY_ADDRESS", "127.0.0.1",
846852
"Specifies the address to bind TURN connections.")
847853
cliflag.BoolVarP(root.Flags(), &secureAuthCookie, "secure-auth-cookie", "", "CODER_SECURE_AUTH_COOKIE", false, "Specifies if the 'Secure' property is set on browser session cookies")
@@ -918,8 +924,13 @@ func shutdownWithTimeout(s interface{ Shutdown(context.Context) error }, timeout
918924
}
919925

920926
// nolint:revive
921-
func newProvisionerDaemon(ctx context.Context, coderAPI *coderd.API,
922-
logger slog.Logger, cacheDir string, errCh chan error, dev bool,
927+
func newProvisionerDaemon(
928+
ctx context.Context,
929+
coderAPI *coderd.API,
930+
logger slog.Logger,
931+
cacheDir string,
932+
errCh chan error,
933+
dev bool,
923934
) (srv *provisionerd.Server, err error) {
924935
ctx, cancel := context.WithCancel(ctx)
925936
defer func() {
@@ -992,6 +1003,7 @@ func newProvisionerDaemon(ctx context.Context, coderAPI *coderd.API,
9921003
UpdateInterval: 500 * time.Millisecond,
9931004
Provisioners: provisioners,
9941005
WorkDirectory: tempDir,
1006+
Tracer: coderAPI.TracerProvider,
9951007
}), nil
9961008
}
9971009

cli/templatelist_test.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ func TestTemplateList(t *testing.T) {
4949
})
5050
t.Run("NoTemplates", func(t *testing.T) {
5151
t.Parallel()
52-
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
52+
client := coderdtest.New(t, &coderdtest.Options{})
5353
coderdtest.CreateFirstUser(t, client)
5454

5555
cmd, root := clitest.New(t, "templates", "list")
@@ -66,6 +66,8 @@ func TestTemplateList(t *testing.T) {
6666

6767
require.NoError(t, <-errC)
6868

69-
pty.ExpectMatch("No templates found in testuser! Create one:")
69+
pty.ExpectMatch("No templates found in")
70+
pty.ExpectMatch(coderdtest.FirstUserParams.Username)
71+
pty.ExpectMatch("Create one:")
7072
})
7173
}

coderd/audit/request.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ import (
1212

1313
"cdr.dev/slog"
1414
"github.com/coder/coder/coderd/database"
15-
"github.com/coder/coder/coderd/httpapi"
1615
"github.com/coder/coder/coderd/httpmw"
16+
"github.com/coder/coder/coderd/tracing"
1717
)
1818

1919
type RequestParams struct {
@@ -92,9 +92,9 @@ func ResourceType[T Auditable](tgt T) database.ResourceType {
9292
// that should be deferred, causing the audit log to be committed when the
9393
// handler returns.
9494
func InitRequest[T Auditable](w http.ResponseWriter, p *RequestParams) (*Request[T], func()) {
95-
sw, ok := w.(*httpapi.StatusWriter)
95+
sw, ok := w.(*tracing.StatusWriter)
9696
if !ok {
97-
panic("dev error: http.ResponseWriter is not *httpapi.StatusWriter")
97+
panic("dev error: http.ResponseWriter is not *tracing.StatusWriter")
9898
}
9999

100100
req := &Request[T]{

coderd/coderd.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import (
1515
"github.com/klauspost/compress/zstd"
1616
"github.com/pion/webrtc/v3"
1717
"github.com/prometheus/client_golang/prometheus"
18-
sdktrace "go.opentelemetry.io/otel/sdk/trace"
18+
"go.opentelemetry.io/otel/trace"
1919
"golang.org/x/xerrors"
2020
"google.golang.org/api/idtoken"
2121
"tailscale.com/derp"
@@ -72,7 +72,7 @@ type Options struct {
7272
SSHKeygenAlgorithm gitsshkey.Algorithm
7373
Telemetry telemetry.Reporter
7474
TURNServer *turnconn.Server
75-
TracerProvider *sdktrace.TracerProvider
75+
TracerProvider trace.TracerProvider
7676
AutoImportTemplates []AutoImportTemplate
7777

7878
TailscaleEnable bool
@@ -201,7 +201,7 @@ func New(options *Options) *API {
201201
apps := func(r chi.Router) {
202202
r.Use(
203203
httpmw.RateLimitPerMinute(options.APIRateLimit),
204-
tracing.HTTPMW(api.TracerProvider, "coderd.http"),
204+
tracing.HTTPMW(api.TracerProvider),
205205
httpmw.ExtractAPIKey(options.Database, oauthConfigs, true),
206206
httpmw.ExtractUserParam(api.Database),
207207
// Extracts the <workspace.agent> from the url
@@ -233,7 +233,7 @@ func New(options *Options) *API {
233233
r.Use(
234234
// Specific routes can specify smaller limits.
235235
httpmw.RateLimitPerMinute(options.APIRateLimit),
236-
tracing.HTTPMW(api.TracerProvider, "coderd.http"),
236+
tracing.HTTPMW(api.TracerProvider),
237237
)
238238
r.Get("/", func(w http.ResponseWriter, r *http.Request) {
239239
httpapi.Write(w, http.StatusOK, codersdk.Response{

coderd/database/databasefake/databasefake.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1257,6 +1257,9 @@ func (q *fakeQuerier) GetOrganizationMembershipsByUserID(_ context.Context, user
12571257
}
12581258

12591259
func (q *fakeQuerier) UpdateMemberRoles(_ context.Context, arg database.UpdateMemberRolesParams) (database.OrganizationMember, error) {
1260+
q.mutex.Lock()
1261+
defer q.mutex.Unlock()
1262+
12601263
for i, mem := range q.organizationMembers {
12611264
if mem.UserID == arg.UserID && mem.OrganizationID == arg.OrgID {
12621265
uniqueRoles := make([]string, 0, len(arg.GrantedRoles))
@@ -1275,6 +1278,7 @@ func (q *fakeQuerier) UpdateMemberRoles(_ context.Context, arg database.UpdateMe
12751278
return mem, nil
12761279
}
12771280
}
1281+
12781282
return database.OrganizationMember{}, sql.ErrNoRows
12791283
}
12801284

@@ -1427,6 +1431,22 @@ func (q *fakeQuerier) GetWorkspaceResourcesByJobID(_ context.Context, jobID uuid
14271431
return resources, nil
14281432
}
14291433

1434+
func (q *fakeQuerier) GetWorkspaceResourcesByJobIDs(_ context.Context, jobIDs []uuid.UUID) ([]database.WorkspaceResource, error) {
1435+
q.mutex.RLock()
1436+
defer q.mutex.RUnlock()
1437+
1438+
resources := make([]database.WorkspaceResource, 0)
1439+
for _, resource := range q.provisionerJobResources {
1440+
for _, jobID := range jobIDs {
1441+
if resource.JobID != jobID {
1442+
continue
1443+
}
1444+
resources = append(resources, resource)
1445+
}
1446+
}
1447+
return resources, nil
1448+
}
1449+
14301450
func (q *fakeQuerier) GetWorkspaceResourcesCreatedAfter(_ context.Context, after time.Time) ([]database.WorkspaceResource, error) {
14311451
q.mutex.RLock()
14321452
defer q.mutex.RUnlock()
@@ -1449,6 +1469,10 @@ func (q *fakeQuerier) GetWorkspaceResourceMetadataCreatedAfter(ctx context.Conte
14491469
for _, resource := range resources {
14501470
resourceIDs[resource.ID] = struct{}{}
14511471
}
1472+
1473+
q.mutex.RLock()
1474+
defer q.mutex.RUnlock()
1475+
14521476
metadata := make([]database.WorkspaceResourceMetadatum, 0)
14531477
for _, m := range q.provisionerJobResourceMetadata {
14541478
_, ok := resourceIDs[m.WorkspaceResourceID]

coderd/database/querier.go

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

coderd/database/queries.sql.go

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

coderd/database/queries/workspaceresources.sql

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,14 @@ FROM
1414
WHERE
1515
job_id = $1;
1616

17+
-- name: GetWorkspaceResourcesByJobIDs :many
18+
SELECT
19+
*
20+
FROM
21+
workspace_resources
22+
WHERE
23+
job_id = ANY(@ids :: uuid [ ]);
24+
1725
-- name: GetWorkspaceResourcesCreatedAfter :many
1826
SELECT * FROM workspace_resources WHERE created_at > $1;
1927

0 commit comments

Comments
 (0)