Skip to content

Commit d4132ec

Browse files
committed
Merge remote-tracking branch 'origin/main' into agent-metadata
2 parents 9c6db22 + 773580c commit d4132ec

File tree

22 files changed

+122
-77
lines changed

22 files changed

+122
-77
lines changed

cli/server.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -484,7 +484,7 @@ func (r *RootCmd) Server(newAPI func(context.Context, *coderd.Options) (*coderd.
484484
tunnelDone <-chan struct{} = make(chan struct{}, 1)
485485
)
486486
if cfg.AccessURL.String() == "" {
487-
cliui.Infof(inv.Stderr, "Opening tunnel so workspaces can connect to your deployment. For production scenarios, specify an external access URL\n")
487+
cliui.Infof(inv.Stderr, "Opening tunnel so workspaces can connect to your deployment. For production scenarios, specify an external access URL")
488488
tunnel, err = devtunnel.New(ctx, logger.Named("devtunnel"), cfg.WgtunnelHost.String())
489489
if err != nil {
490490
return xerrors.Errorf("create tunnel: %w", err)
@@ -531,7 +531,7 @@ func (r *RootCmd) Server(newAPI func(context.Context, *coderd.Options) (*coderd.
531531
}
532532

533533
// A newline is added before for visibility in terminal output.
534-
cliui.Infof(inv.Stdout, "\nView the Web UI: %s\n", cfg.AccessURL.String())
534+
cliui.Infof(inv.Stdout, "\nView the Web UI: %s", cfg.AccessURL.String())
535535

536536
// Used for zero-trust instance identity with Google Cloud.
537537
googleTokenValidator, err := idtoken.NewValidator(ctx, option.WithoutAuthentication())

cli/templatepush.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,13 @@ func (pf *templateUploadFlags) templateName(args []string) (string, error) {
8585
if len(args) > 0 {
8686
return args[0], nil
8787
}
88+
// Have to take absPath to resolve "." and "..".
89+
absPath, err := filepath.Abs(pf.directory)
90+
if err != nil {
91+
return "", err
92+
}
8893
// If no name is provided, use the directory name.
89-
return filepath.Base(pf.directory), nil
94+
return filepath.Base(absPath), nil
9095
}
9196

9297
func (r *RootCmd) templatePush() *clibase.Cmd {

cli/templatepush_test.go

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,8 +155,9 @@ func TestTemplatePush(t *testing.T) {
155155
require.Equal(t, "example", templateVersions[1].Name)
156156
})
157157

158+
// This test modifies the working directory.
159+
//nolint:paralleltest
158160
t.Run("UseWorkingDir", func(t *testing.T) {
159-
t.Parallel()
160161
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
161162
user := coderdtest.CreateFirstUser(t, client)
162163
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil)
@@ -173,9 +174,18 @@ func TestTemplatePush(t *testing.T) {
173174
r.Name = filepath.Base(source)
174175
})
175176

177+
oldDir, err := os.Getwd()
178+
require.NoError(t, err)
179+
180+
os.Chdir(source)
181+
182+
t.Cleanup(func() {
183+
os.Chdir(oldDir)
184+
})
185+
176186
// Don't pass the name of the template, it should use the
177187
// directory of the source.
178-
inv, root := clitest.New(t, "templates", "push", "--directory", source, "--test.provisioner", string(database.ProvisionerTypeEcho))
188+
inv, root := clitest.New(t, "templates", "push", "--test.provisioner", string(database.ProvisionerTypeEcho))
179189
clitest.SetupConfig(t, client, root)
180190
pty := ptytest.New(t).Attach(inv)
181191

coderd/database/dbauthz/querier.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -340,18 +340,18 @@ func (q *querier) InsertLicense(ctx context.Context, arg database.InsertLicenseP
340340
return q.db.InsertLicense(ctx, arg)
341341
}
342342

343-
func (q *querier) InsertOrUpdateLogoURL(ctx context.Context, value string) error {
343+
func (q *querier) UpsertLogoURL(ctx context.Context, value string) error {
344344
if err := q.authorizeContext(ctx, rbac.ActionCreate, rbac.ResourceDeploymentValues); err != nil {
345345
return err
346346
}
347-
return q.db.InsertOrUpdateLogoURL(ctx, value)
347+
return q.db.UpsertLogoURL(ctx, value)
348348
}
349349

350-
func (q *querier) InsertOrUpdateServiceBanner(ctx context.Context, value string) error {
350+
func (q *querier) UpsertServiceBanner(ctx context.Context, value string) error {
351351
if err := q.authorizeContext(ctx, rbac.ActionCreate, rbac.ResourceDeploymentValues); err != nil {
352352
return err
353353
}
354-
return q.db.InsertOrUpdateServiceBanner(ctx, value)
354+
return q.db.UpsertServiceBanner(ctx, value)
355355
}
356356

357357
func (q *querier) GetLicenseByID(ctx context.Context, id int32) (database.License, error) {

coderd/database/dbauthz/querier_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -312,10 +312,10 @@ func (s *MethodTestSuite) TestLicense() {
312312
check.Args(database.InsertLicenseParams{}).
313313
Asserts(rbac.ResourceLicense, rbac.ActionCreate)
314314
}))
315-
s.Run("InsertOrUpdateLogoURL", s.Subtest(func(db database.Store, check *expects) {
315+
s.Run("UpsertLogoURL", s.Subtest(func(db database.Store, check *expects) {
316316
check.Args("value").Asserts(rbac.ResourceDeploymentValues, rbac.ActionCreate)
317317
}))
318-
s.Run("InsertOrUpdateServiceBanner", s.Subtest(func(db database.Store, check *expects) {
318+
s.Run("UpsertServiceBanner", s.Subtest(func(db database.Store, check *expects) {
319319
check.Args("value").Asserts(rbac.ResourceDeploymentValues, rbac.ActionCreate)
320320
}))
321321
s.Run("GetLicenseByID", s.Subtest(func(db database.Store, check *expects) {
@@ -336,12 +336,12 @@ func (s *MethodTestSuite) TestLicense() {
336336
check.Args().Asserts().Returns("")
337337
}))
338338
s.Run("GetLogoURL", s.Subtest(func(db database.Store, check *expects) {
339-
err := db.InsertOrUpdateLogoURL(context.Background(), "value")
339+
err := db.UpsertLogoURL(context.Background(), "value")
340340
require.NoError(s.T(), err)
341341
check.Args().Asserts().Returns("value")
342342
}))
343343
s.Run("GetServiceBanner", s.Subtest(func(db database.Store, check *expects) {
344-
err := db.InsertOrUpdateServiceBanner(context.Background(), "value")
344+
err := db.UpsertServiceBanner(context.Background(), "value")
345345
require.NoError(s.T(), err)
346346
check.Args().Asserts().Returns("value")
347347
}))

coderd/database/dbauthz/system.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -228,11 +228,11 @@ func (q *querier) UpdateWorkspaceBuildCostByID(ctx context.Context, arg database
228228
return q.db.UpdateWorkspaceBuildCostByID(ctx, arg)
229229
}
230230

231-
func (q *querier) InsertOrUpdateLastUpdateCheck(ctx context.Context, value string) error {
231+
func (q *querier) UpsertLastUpdateCheck(ctx context.Context, value string) error {
232232
if err := q.authorizeContext(ctx, rbac.ActionUpdate, rbac.ResourceSystem); err != nil {
233233
return err
234234
}
235-
return q.db.InsertOrUpdateLastUpdateCheck(ctx, value)
235+
return q.db.UpsertLastUpdateCheck(ctx, value)
236236
}
237237

238238
func (q *querier) GetLastUpdateCheck(ctx context.Context) (string, error) {

coderd/database/dbauthz/system_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,11 +102,11 @@ func (s *MethodTestSuite) TestSystemFunctions() {
102102
DailyCost: 10,
103103
}).Asserts(rbac.ResourceSystem, rbac.ActionUpdate).Returns(o)
104104
}))
105-
s.Run("InsertOrUpdateLastUpdateCheck", s.Subtest(func(db database.Store, check *expects) {
105+
s.Run("UpsertLastUpdateCheck", s.Subtest(func(db database.Store, check *expects) {
106106
check.Args("value").Asserts(rbac.ResourceSystem, rbac.ActionUpdate)
107107
}))
108108
s.Run("GetLastUpdateCheck", s.Subtest(func(db database.Store, check *expects) {
109-
err := db.InsertOrUpdateLastUpdateCheck(context.Background(), "value")
109+
err := db.UpsertLastUpdateCheck(context.Background(), "value")
110110
require.NoError(s.T(), err)
111111
check.Args().Asserts(rbac.ResourceSystem, rbac.ActionRead)
112112
}))

coderd/database/dbfake/databasefake.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4342,7 +4342,7 @@ func (q *fakeQuerier) GetDERPMeshKey(_ context.Context) (string, error) {
43424342
return q.derpMeshKey, nil
43434343
}
43444344

4345-
func (q *fakeQuerier) InsertOrUpdateLastUpdateCheck(_ context.Context, data string) error {
4345+
func (q *fakeQuerier) UpsertLastUpdateCheck(_ context.Context, data string) error {
43464346
q.mutex.RLock()
43474347
defer q.mutex.RUnlock()
43484348

@@ -4360,7 +4360,7 @@ func (q *fakeQuerier) GetLastUpdateCheck(_ context.Context) (string, error) {
43604360
return string(q.lastUpdateCheck), nil
43614361
}
43624362

4363-
func (q *fakeQuerier) InsertOrUpdateServiceBanner(_ context.Context, data string) error {
4363+
func (q *fakeQuerier) UpsertServiceBanner(_ context.Context, data string) error {
43644364
q.mutex.RLock()
43654365
defer q.mutex.RUnlock()
43664366

@@ -4379,7 +4379,7 @@ func (q *fakeQuerier) GetServiceBanner(_ context.Context) (string, error) {
43794379
return string(q.serviceBanner), nil
43804380
}
43814381

4382-
func (q *fakeQuerier) InsertOrUpdateLogoURL(_ context.Context, data string) error {
4382+
func (q *fakeQuerier) UpsertLogoURL(_ context.Context, data string) error {
43834383
q.mutex.RLock()
43844384
defer q.mutex.RUnlock()
43854385

coderd/database/querier.go

Lines changed: 3 additions & 3 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: 9 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/queries/siteconfig.sql

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,21 +10,21 @@ INSERT INTO site_configs (key, value) VALUES ('derp_mesh_key', $1);
1010
-- name: GetDERPMeshKey :one
1111
SELECT value FROM site_configs WHERE key = 'derp_mesh_key';
1212

13-
-- name: InsertOrUpdateLastUpdateCheck :exec
13+
-- name: UpsertLastUpdateCheck :exec
1414
INSERT INTO site_configs (key, value) VALUES ('last_update_check', $1)
1515
ON CONFLICT (key) DO UPDATE SET value = $1 WHERE site_configs.key = 'last_update_check';
1616

1717
-- name: GetLastUpdateCheck :one
1818
SELECT value FROM site_configs WHERE key = 'last_update_check';
1919

20-
-- name: InsertOrUpdateServiceBanner :exec
20+
-- name: UpsertServiceBanner :exec
2121
INSERT INTO site_configs (key, value) VALUES ('service_banner', $1)
2222
ON CONFLICT (key) DO UPDATE SET value = $1 WHERE site_configs.key = 'service_banner';
2323

2424
-- name: GetServiceBanner :one
2525
SELECT value FROM site_configs WHERE key = 'service_banner';
2626

27-
-- name: InsertOrUpdateLogoURL :exec
27+
-- name: UpsertLogoURL :exec
2828
INSERT INTO site_configs (key, value) VALUES ('logo_url', $1)
2929
ON CONFLICT (key) DO UPDATE SET value = $1 WHERE site_configs.key = 'logo_url';
3030

coderd/provisionerjobs.go

Lines changed: 49 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,47 @@ func (api *API) provisionerJobLogs(rw http.ResponseWriter, r *http.Request, job
5454
}
5555
}
5656

57+
if !follow {
58+
logs, err := api.Database.GetProvisionerLogsAfterID(ctx, database.GetProvisionerLogsAfterIDParams{
59+
JobID: job.ID,
60+
CreatedAfter: after,
61+
})
62+
if errors.Is(err, sql.ErrNoRows) {
63+
err = nil
64+
}
65+
if err != nil {
66+
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
67+
Message: "Internal error fetching provisioner logs.",
68+
Detail: err.Error(),
69+
})
70+
return
71+
}
72+
if logs == nil {
73+
logs = []database.ProvisionerJobLog{}
74+
}
75+
76+
logger.Debug(ctx, "Finished non-follow job logs")
77+
httpapi.Write(ctx, rw, http.StatusOK, convertProvisionerJobLogs(logs))
78+
return
79+
}
80+
81+
// if we are following logs, start the subscription before we query the database, so that we don't miss any logs
82+
// between the end of our query and the start of the subscription. We might get duplicates, so we'll keep track
83+
// of processed IDs.
84+
var bufferedLogs <-chan *database.ProvisionerJobLog
85+
if follow {
86+
bl, closeFollow, err := api.followProvisionerJobLogs(actor, job.ID)
87+
if err != nil {
88+
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
89+
Message: "Internal error watching provisioner logs.",
90+
Detail: err.Error(),
91+
})
92+
return
93+
}
94+
defer closeFollow()
95+
bufferedLogs = bl
96+
}
97+
5798
logs, err := api.Database.GetProvisionerLogsAfterID(ctx, database.GetProvisionerLogsAfterIDParams{
5899
JobID: job.ID,
59100
CreatedAfter: after,
@@ -72,12 +113,6 @@ func (api *API) provisionerJobLogs(rw http.ResponseWriter, r *http.Request, job
72113
logs = []database.ProvisionerJobLog{}
73114
}
74115

75-
if !follow {
76-
logger.Debug(ctx, "Finished non-follow job logs")
77-
httpapi.Write(ctx, rw, http.StatusOK, convertProvisionerJobLogs(logs))
78-
return
79-
}
80-
81116
api.WebsocketWaitMutex.Lock()
82117
api.WebsocketWaitGroup.Add(1)
83118
api.WebsocketWaitMutex.Unlock()
@@ -106,28 +141,19 @@ func (api *API) provisionerJobLogs(rw http.ResponseWriter, r *http.Request, job
106141
return
107142
}
108143
}
144+
job, err = api.Database.GetProvisionerJobByID(ctx, job.ID)
145+
if err != nil {
146+
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
147+
Message: "Internal error fetching provisioner job.",
148+
Detail: err.Error(),
149+
})
150+
return
151+
}
109152
if job.CompletedAt.Valid {
110153
// job was complete before we queried the database for historical logs
111154
return
112155
}
113156

114-
// if we are following logs, start the subscription before we query the database, so that we don't miss any logs
115-
// between the end of our query and the start of the subscription. We might get duplicates, so we'll keep track
116-
// of processed IDs.
117-
var bufferedLogs <-chan *database.ProvisionerJobLog
118-
if follow {
119-
bl, closeFollow, err := api.followProvisionerJobLogs(actor, job.ID)
120-
if err != nil {
121-
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
122-
Message: "Internal error watching provisioner logs.",
123-
Detail: err.Error(),
124-
})
125-
return
126-
}
127-
defer closeFollow()
128-
bufferedLogs = bl
129-
}
130-
131157
for {
132158
select {
133159
case <-ctx.Done():

coderd/updatecheck/updatecheck.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ func (c *Checker) update() (r Result, err error) {
211211
}
212212

213213
// nolint:gocritic // Inserting the last update check is a system function.
214-
err = c.db.InsertOrUpdateLastUpdateCheck(dbauthz.AsSystemRestricted(ctx), string(b))
214+
err = c.db.UpsertLastUpdateCheck(dbauthz.AsSystemRestricted(ctx), string(b))
215215
if err != nil {
216216
return r, err
217217
}

coderd/workspaceagents.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -787,7 +787,11 @@ func (api *API) dialWorkspaceAgentTailnet(agentID uuid.UUID) (*codersdk.Workspac
787787
go func() {
788788
err := (*api.TailnetCoordinator.Load()).ServeClient(serverConn, uuid.New(), agentID)
789789
if err != nil {
790-
api.Logger.Warn(ctx, "tailnet coordinator client error", slog.Error(err))
790+
// Sometimes, we get benign closed pipe errors when the server is
791+
// shutting down.
792+
if api.ctx.Err() == nil {
793+
api.Logger.Warn(ctx, "tailnet coordinator client error", slog.Error(err))
794+
}
791795
_ = agentConn.Close()
792796
}
793797
}()

codersdk/organizations.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,9 @@ func (c *Client) TemplatesByOrganization(ctx context.Context, organizationID uui
221221

222222
// TemplateByName finds a template inside the organization provided with a case-insensitive name.
223223
func (c *Client) TemplateByName(ctx context.Context, organizationID uuid.UUID, name string) (Template, error) {
224+
if name == "" {
225+
return Template{}, xerrors.Errorf("template name cannot be empty")
226+
}
224227
res, err := c.Request(ctx, http.MethodGet,
225228
fmt.Sprintf("/api/v2/organizations/%s/templates/%s", organizationID.String(), name),
226229
nil,

docs/manifest.json

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
{
2-
"versions": [
3-
"main"
4-
],
2+
"versions": ["main"],
53
"routes": [
64
{
75
"title": "About",

0 commit comments

Comments
 (0)