Skip to content

feat: implement reconciliation loop #17255

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 64 commits into from
Apr 4, 2025
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
64 commits
Select commit Hold shift + click to select a range
148dae1
fix: add fallback icons for notifications (#17013)
defelmnq Mar 28, 2025
c679991
docs: edit workspace lifecycle description (#17146)
EdwardAngert Mar 28, 2025
a9574fb
chore(cli): increase timeout for TestSSH_Container subtests (#17148)
johnstcn Mar 28, 2025
ac74c65
test(cli): fix data race in `TestCreateWithRichParameters` (#17128)
mafredri Mar 28, 2025
562a6c9
chore: add .cursorrules config (#17160)
sreya Mar 28, 2025
d3050a7
chore: bump github.com/prometheus/common from 0.62.0 to 0.63.0 (#16959)
dependabot[bot] Mar 28, 2025
9bc727e
chore: add support for one-way websockets to backend (#16853)
Parkreiner Mar 28, 2025
489641d
feat: set icons for each type of notification (#17115)
BrunoQuaresma Mar 31, 2025
8ea956f
feat: add app status tracking to the backend (#17163)
kylecarbs Mar 31, 2025
057cbd4
feat(cli): add `coder exp mcp` command (#17066)
johnstcn Mar 31, 2025
40de51b
chore: bump vite from 5.4.15 to 5.4.16 in /site (#17176)
dependabot[bot] Mar 31, 2025
7b14b4f
chore: update msw to 2.4.8 (#17167)
sreya Mar 31, 2025
8340567
chore: pin goimports to 0.31.0 (#17177)
sreya Apr 1, 2025
989c3ec
chore: pin various dependencies in CI files (#17180)
sreya Apr 1, 2025
cc733ab
ci: check go versions are consistent (#17149)
johnstcn Apr 1, 2025
e4cf189
chore(mcp): fix test flakes (#17183)
johnstcn Apr 1, 2025
7d08bf0
chore: improve error logging in TestServer/EphemeralDeployment (#17184)
hugodutka Apr 1, 2025
3a243c1
fix: remove shared mutable state between oidc tests (#17179)
ethanndickson Apr 1, 2025
1e11e82
fix(mcp): report task status correctly (#17187)
johnstcn Apr 1, 2025
fcac4ab
fix(site): standardize headers for Admin Settings page (#16911)
Parkreiner Apr 1, 2025
037dbc8
docs: add new cursor and windsurf docs (#17092)
EdwardAngert Apr 1, 2025
27d2343
fix(cli): exp mcp: remove unnecessary cli flag (#17190)
johnstcn Apr 1, 2025
583a0c6
feat: add frontend for app statuses (#17178)
kylecarbs Apr 1, 2025
900e125
docs: update SMTP configuration in notifications docs (#17161)
EdwardAngert Apr 1, 2025
f3e5bb9
fix: convert workspace id in db2sdk.WorkspaceAppStatus (#17201)
kylecarbs Apr 1, 2025
88bae05
feat(cli): implement exp mcp configure claude-code command (#17195)
johnstcn Apr 1, 2025
00e1ea4
feat: add the ability to hide preset parameters (#17168)
SasSwart Apr 1, 2025
fd24116
docs: clarify that CODER_EXTERNAL_AUTH_0_ID is used in callback URLs …
bpmct Apr 1, 2025
184c1f0
chore: add db queries for dynamic parameters (#17137)
aslilac Apr 1, 2025
a3248f9
chore(docs): move feature stage docs to install directory (#17199)
stirby Apr 1, 2025
4604f19
refactor: increase workspace and template avatar size (#17200)
BrunoQuaresma Apr 2, 2025
a61c3e7
docs: add tutorials for using early access AI agent features (#17186)
bpmct Apr 2, 2025
c6e8662
fix: watch workspace agent logs (#17209)
code-asher Apr 2, 2025
51ce047
fix: replace aliased import with unaliased import (#17207)
bcpeinhardt Apr 2, 2025
2efb808
docs: remove beta badge from notifications doc (#17096)
EdwardAngert Apr 2, 2025
0125ff4
docs: add new workspace notifications dashboard and config (#16548)
EdwardAngert Apr 2, 2025
0ec87ab
docs: add new section on managing provisioners from the dashboard (#1…
EdwardAngert Apr 2, 2025
d575e7f
chore: force babel dependency to 7.26.10 (#17193)
sreya Apr 2, 2025
6fdad02
fix: avoid sharing `echo.Responses` across tests (#17211)
ethanndickson Apr 2, 2025
b1f5d45
chore: disable e2e-premium tests (#17213)
sreya Apr 2, 2025
d6c034d
chore: pin dogfood npm dependencies (#17216)
sreya Apr 2, 2025
8cecc4f
chore(coderd/coderdtest/oidctest): protect mutable fields with rwmute…
johnstcn Apr 2, 2025
13997ca
docs: clarify details around MCP (#17220)
bpmct Apr 2, 2025
0163dda
ci: linkspector: fix 403 to external site (#17222)
johnstcn Apr 2, 2025
c418e86
chore: slightly soften disclaimers for AI features (#17223)
bpmct Apr 2, 2025
ac0cf35
fix: silence One-Way WebSocket error messages in React Strict Mode (#…
Parkreiner Apr 2, 2025
83d7147
chore: deprecate ResourceSystem (#17217)
spikecurtis Apr 2, 2025
e8b7ce8
ci: re-enable revive and gosec linters (#17225)
johnstcn Apr 2, 2025
0fe7346
docs: remove enterprise from docs (#17226)
EdwardAngert Apr 2, 2025
c938bfe
fix: prevent invalid render output for build logs (#17233)
Parkreiner Apr 2, 2025
c062942
chore: bump next from 14.2.25 to 14.2.26 in /offlinedocs (#17234)
dependabot[bot] Apr 2, 2025
ac7ea08
chore: add files cache for reading template tar archives from db (#17…
aslilac Apr 2, 2025
5979c32
chore: skip flakey e2e tests (#17235)
aslilac Apr 2, 2025
998724d
chore: sort agent `/list-directory` output (#17218)
ethanndickson Apr 3, 2025
4aa45a5
fix(cli): modify `exp mcp configure` to also read claude API key from…
johnstcn Apr 3, 2025
99c6f23
feat: add migrations and queries to support prebuilds (#16891)
SasSwart Apr 3, 2025
aa3d71d
feat(cli): support opening devcontainers in vscode (#17189)
DanielleMaywood Apr 3, 2025
ab8c437
feat(site): open dev container in vscode (#17182)
DanielleMaywood Apr 3, 2025
b60934b
chore: hide workspace creation UI for users without permission (#16871)
jaaydenh Apr 3, 2025
b61f0ab
fix(agent): ensure SSH server shutdown with process groups (#17227)
mafredri Apr 3, 2025
ccfe1bd
fix: fix permissions for workspace creation (#17241)
jaaydenh Apr 3, 2025
ae44ecf
chore: update prismjs to 1.30.0 (#17215)
sreya Apr 3, 2025
4d3aab6
Merge remote-tracking branch 'origin/main' into yevhenii/510-reconcil…
evgeniy-scherbina Apr 4, 2025
97b3886
fix dbmem tests
SasSwart Apr 1, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
chore: add db queries for dynamic parameters (#17137)
  • Loading branch information
aslilac authored Apr 1, 2025
commit 184c1f0a59badcd698c11faeb873a661d72b3c38
28 changes: 28 additions & 0 deletions coderd/database/dbauthz/dbauthz.go
Original file line number Diff line number Diff line change
Expand Up @@ -1741,6 +1741,22 @@ func (q *querier) GetFileByID(ctx context.Context, id uuid.UUID) (database.File,
return file, nil
}

func (q *querier) GetFileIDByTemplateVersionID(ctx context.Context, templateVersionID uuid.UUID) (uuid.UUID, error) {
fileID, err := q.db.GetFileIDByTemplateVersionID(ctx, templateVersionID)
if err != nil {
return uuid.Nil, err
}
// This is a kind of weird check, because users will almost never have this
// permission. Since this query is not currently used to provide data in a
// user facing way, it's expected that this query is run as some system
// subject in order to be authorized.
err = q.authorizeContext(ctx, policy.ActionRead, rbac.ResourceFile.WithID(fileID))
if err != nil {
return uuid.Nil, err
}
return fileID, nil
}

func (q *querier) GetFileTemplates(ctx context.Context, fileID uuid.UUID) ([]database.GetFileTemplatesRow, error) {
if err := q.authorizeContext(ctx, policy.ActionRead, rbac.ResourceSystem); err != nil {
return nil, err
Expand Down Expand Up @@ -2453,6 +2469,18 @@ func (q *querier) GetTemplateVersionParameters(ctx context.Context, templateVers
return q.db.GetTemplateVersionParameters(ctx, templateVersionID)
}

func (q *querier) GetTemplateVersionTerraformValues(ctx context.Context, templateVersionID uuid.UUID) (database.TemplateVersionTerraformValue, error) {
// The template_version_terraform_values table should follow the same access
// control as the template_version table. Rather than reimplement the checks,
// we just defer to existing implementation. (plus we'd need to use this query
// to reimplement the proper checks anyway)
_, err := q.GetTemplateVersionByID(ctx, templateVersionID)
if err != nil {
return database.TemplateVersionTerraformValue{}, err
}
return q.db.GetTemplateVersionTerraformValues(ctx, templateVersionID)
}

func (q *querier) GetTemplateVersionVariables(ctx context.Context, templateVersionID uuid.UUID) ([]database.TemplateVersionVariable, error) {
tv, err := q.db.GetTemplateVersionByID(ctx, templateVersionID)
if err != nil {
Expand Down
26 changes: 26 additions & 0 deletions coderd/database/dbauthz/dbauthz_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -342,6 +342,15 @@ func (s *MethodTestSuite) TestFile() {
f := dbgen.File(s.T(), db, database.File{})
check.Args(f.ID).Asserts(f, policy.ActionRead).Returns(f)
}))
s.Run("GetFileIDByTemplateVersionID", s.Subtest(func(db database.Store, check *expects) {
o := dbgen.Organization(s.T(), db, database.Organization{})
u := dbgen.User(s.T(), db, database.User{})
_ = dbgen.OrganizationMember(s.T(), db, database.OrganizationMember{OrganizationID: o.ID, UserID: u.ID})
f := dbgen.File(s.T(), db, database.File{CreatedBy: u.ID})
j := dbgen.ProvisionerJob(s.T(), db, nil, database.ProvisionerJob{StorageMethod: database.ProvisionerStorageMethodFile, FileID: f.ID})
tv := dbgen.TemplateVersion(s.T(), db, database.TemplateVersion{OrganizationID: o.ID, JobID: j.ID, CreatedBy: u.ID})
check.Args(tv.ID).Asserts(rbac.ResourceFile.WithID(f.ID), policy.ActionRead).Returns(f.ID)
}))
s.Run("InsertFile", s.Subtest(func(db database.Store, check *expects) {
u := dbgen.User(s.T(), db, database.User{})
check.Args(database.InsertFileParams{
Expand Down Expand Up @@ -1196,6 +1205,23 @@ func (s *MethodTestSuite) TestTemplate() {
})
check.Args(tv.ID).Asserts(t1, policy.ActionRead).Returns([]database.TemplateVersionParameter{})
}))
s.Run("GetTemplateVersionTerraformValues", s.Subtest(func(db database.Store, check *expects) {
o := dbgen.Organization(s.T(), db, database.Organization{})
u := dbgen.User(s.T(), db, database.User{})
_ = dbgen.OrganizationMember(s.T(), db, database.OrganizationMember{OrganizationID: o.ID, UserID: u.ID})
t := dbgen.Template(s.T(), db, database.Template{OrganizationID: o.ID, CreatedBy: u.ID})
job := dbgen.ProvisionerJob(s.T(), db, nil, database.ProvisionerJob{OrganizationID: o.ID})
tv := dbgen.TemplateVersion(s.T(), db, database.TemplateVersion{
OrganizationID: o.ID,
CreatedBy: u.ID,
JobID: job.ID,
TemplateID: uuid.NullUUID{UUID: t.ID, Valid: true},
})
dbgen.TemplateVersionTerraformValues(s.T(), db, database.InsertTemplateVersionTerraformValuesByJobIDParams{
JobID: job.ID,
})
check.Args(tv.ID).Asserts(t, policy.ActionRead)
}))
s.Run("GetTemplateVersionVariables", s.Subtest(func(db database.Store, check *expects) {
dbtestutil.DisableForeignKeysAndTriggers(s.T(), db)
t1 := dbgen.Template(s.T(), db, database.Template{})
Expand Down
13 changes: 13 additions & 0 deletions coderd/database/dbgen/dbgen.go
Original file line number Diff line number Diff line change
Expand Up @@ -971,6 +971,19 @@ func TemplateVersionParameter(t testing.TB, db database.Store, orig database.Tem
return version
}

func TemplateVersionTerraformValues(t testing.TB, db database.Store, orig database.InsertTemplateVersionTerraformValuesByJobIDParams) {
t.Helper()

params := database.InsertTemplateVersionTerraformValuesByJobIDParams{
JobID: takeFirst(orig.JobID, uuid.New()),
CachedPlan: takeFirstSlice(orig.CachedPlan, []byte("{}")),
UpdatedAt: takeFirst(orig.UpdatedAt, dbtime.Now()),
}

err := db.InsertTemplateVersionTerraformValuesByJobID(genCtx, params)
require.NoError(t, err, "insert template version parameter")
}

func WorkspaceAgentStat(t testing.TB, db database.Store, orig database.WorkspaceAgentStat) database.WorkspaceAgentStat {
if orig.ConnectionsByProto == nil {
orig.ConnectionsByProto = json.RawMessage([]byte("{}"))
Expand Down
37 changes: 37 additions & 0 deletions coderd/database/dbmem/dbmem.go
Original file line number Diff line number Diff line change
Expand Up @@ -3327,6 +3327,30 @@ func (q *FakeQuerier) GetFileByID(_ context.Context, id uuid.UUID) (database.Fil
return database.File{}, sql.ErrNoRows
}

func (q *FakeQuerier) GetFileIDByTemplateVersionID(ctx context.Context, templateVersionID uuid.UUID) (uuid.UUID, error) {
q.mutex.RLock()
defer q.mutex.RUnlock()

for _, v := range q.templateVersions {
if v.ID == templateVersionID {
jobID := v.JobID
for _, j := range q.provisionerJobs {
if j.ID == jobID {
if j.StorageMethod == database.ProvisionerStorageMethodFile {
return j.FileID, nil
}
// We found the right job id but it wasn't a proper match.
break
}
}
// We found the right template version but it wasn't a proper match.
break
}
}

return uuid.Nil, sql.ErrNoRows
}

func (q *FakeQuerier) GetFileTemplates(_ context.Context, id uuid.UUID) ([]database.GetFileTemplatesRow, error) {
q.mutex.RLock()
defer q.mutex.RUnlock()
Expand Down Expand Up @@ -6020,6 +6044,19 @@ func (q *FakeQuerier) GetTemplateVersionParameters(_ context.Context, templateVe
return parameters, nil
}

func (q *FakeQuerier) GetTemplateVersionTerraformValues(ctx context.Context, templateVersionID uuid.UUID) (database.TemplateVersionTerraformValue, error) {
q.mutex.RLock()
defer q.mutex.RUnlock()

for _, tvtv := range q.templateVersionTerraformValues {
if tvtv.TemplateVersionID == templateVersionID {
return tvtv, nil
}
}

return database.TemplateVersionTerraformValue{}, sql.ErrNoRows
}

func (q *FakeQuerier) GetTemplateVersionVariables(_ context.Context, templateVersionID uuid.UUID) ([]database.TemplateVersionVariable, error) {
q.mutex.RLock()
defer q.mutex.RUnlock()
Expand Down
14 changes: 14 additions & 0 deletions coderd/database/dbmetrics/querymetrics.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

30 changes: 30 additions & 0 deletions coderd/database/dbmock/dbmock.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions coderd/database/querier.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

40 changes: 40 additions & 0 deletions coderd/database/queries.sql.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

17 changes: 17 additions & 0 deletions coderd/database/queries/files.sql
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,23 @@ WHERE
LIMIT
1;

-- name: GetFileIDByTemplateVersionID :one
SELECT
files.id
FROM
files
JOIN
provisioner_jobs ON
provisioner_jobs.storage_method = 'file'
AND provisioner_jobs.file_id = files.id
JOIN
template_versions ON template_versions.job_id = provisioner_jobs.id
WHERE
template_versions.id = @template_version_id
LIMIT
1;


-- name: GetFileByHashAndCreator :one
SELECT
*
Expand Down
8 changes: 8 additions & 0 deletions coderd/database/queries/templateversionterraformvalues.sql
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
-- name: GetTemplateVersionTerraformValues :one
SELECT
template_version_terraform_values.*
FROM
template_version_terraform_values
WHERE
template_version_terraform_values.template_version_id = @template_version_id;

-- name: InsertTemplateVersionTerraformValuesByJobID :exec
INSERT INTO
template_version_terraform_values (
Expand Down
Loading