Skip to content

Commit f36fb67

Browse files
authored
chore: use static params when dynamic param metadata is missing (#17836)
Existing template versions do not have the metadata (modules + plan) in the db. So revert to using static parameter information from the original template import. This data will still be served over the websocket.
1 parent fb0e3d6 commit f36fb67

File tree

14 files changed

+553
-246
lines changed

14 files changed

+553
-246
lines changed

coderd/coderd.go

+26-3
Original file line numberDiff line numberDiff line change
@@ -1597,7 +1597,7 @@ type API struct {
15971597
// passed to dbauthz.
15981598
AccessControlStore *atomic.Pointer[dbauthz.AccessControlStore]
15991599
PortSharer atomic.Pointer[portsharing.PortSharer]
1600-
FileCache files.Cache
1600+
FileCache *files.Cache
16011601
PrebuildsClaimer atomic.Pointer[prebuilds.Claimer]
16021602
PrebuildsReconciler atomic.Pointer[prebuilds.ReconciliationOrchestrator]
16031603

@@ -1722,13 +1722,30 @@ func compressHandler(h http.Handler) http.Handler {
17221722
return cmp.Handler(h)
17231723
}
17241724

1725+
type MemoryProvisionerDaemonOption func(*memoryProvisionerDaemonOptions)
1726+
1727+
func MemoryProvisionerWithVersionOverride(version string) MemoryProvisionerDaemonOption {
1728+
return func(opts *memoryProvisionerDaemonOptions) {
1729+
opts.versionOverride = version
1730+
}
1731+
}
1732+
1733+
type memoryProvisionerDaemonOptions struct {
1734+
versionOverride string
1735+
}
1736+
17251737
// CreateInMemoryProvisionerDaemon is an in-memory connection to a provisionerd.
17261738
// Useful when starting coderd and provisionerd in the same process.
17271739
func (api *API) CreateInMemoryProvisionerDaemon(dialCtx context.Context, name string, provisionerTypes []codersdk.ProvisionerType) (client proto.DRPCProvisionerDaemonClient, err error) {
17281740
return api.CreateInMemoryTaggedProvisionerDaemon(dialCtx, name, provisionerTypes, nil)
17291741
}
17301742

1731-
func (api *API) CreateInMemoryTaggedProvisionerDaemon(dialCtx context.Context, name string, provisionerTypes []codersdk.ProvisionerType, provisionerTags map[string]string) (client proto.DRPCProvisionerDaemonClient, err error) {
1743+
func (api *API) CreateInMemoryTaggedProvisionerDaemon(dialCtx context.Context, name string, provisionerTypes []codersdk.ProvisionerType, provisionerTags map[string]string, opts ...MemoryProvisionerDaemonOption) (client proto.DRPCProvisionerDaemonClient, err error) {
1744+
options := &memoryProvisionerDaemonOptions{}
1745+
for _, opt := range opts {
1746+
opt(options)
1747+
}
1748+
17321749
tracer := api.TracerProvider.Tracer(tracing.TracerName)
17331750
clientSession, serverSession := drpcsdk.MemTransportPipe()
17341751
defer func() {
@@ -1755,6 +1772,12 @@ func (api *API) CreateInMemoryTaggedProvisionerDaemon(dialCtx context.Context, n
17551772
return nil, xerrors.Errorf("failed to parse built-in provisioner key ID: %w", err)
17561773
}
17571774

1775+
apiVersion := proto.CurrentVersion.String()
1776+
if options.versionOverride != "" && flag.Lookup("test.v") != nil {
1777+
// This should only be usable for unit testing. To fake a different provisioner version
1778+
apiVersion = options.versionOverride
1779+
}
1780+
17581781
//nolint:gocritic // in-memory provisioners are owned by system
17591782
daemon, err := api.Database.UpsertProvisionerDaemon(dbauthz.AsSystemRestricted(dialCtx), database.UpsertProvisionerDaemonParams{
17601783
Name: name,
@@ -1764,7 +1787,7 @@ func (api *API) CreateInMemoryTaggedProvisionerDaemon(dialCtx context.Context, n
17641787
Tags: provisionersdk.MutateTags(uuid.Nil, provisionerTags),
17651788
LastSeenAt: sql.NullTime{Time: dbtime.Now(), Valid: true},
17661789
Version: buildinfo.Version(),
1767-
APIVersion: proto.CurrentVersion.String(),
1790+
APIVersion: apiVersion,
17681791
KeyID: keyID,
17691792
})
17701793
if err != nil {

coderd/coderdtest/coderdtest.go

+4-3
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ type Options struct {
135135

136136
// IncludeProvisionerDaemon when true means to start an in-memory provisionerD
137137
IncludeProvisionerDaemon bool
138+
ProvisionerDaemonVersion string
138139
ProvisionerDaemonTags map[string]string
139140
MetricsCacheRefreshInterval time.Duration
140141
AgentStatsRefreshInterval time.Duration
@@ -601,7 +602,7 @@ func NewWithAPI(t testing.TB, options *Options) (*codersdk.Client, io.Closer, *c
601602
setHandler(rootHandler)
602603
var provisionerCloser io.Closer = nopcloser{}
603604
if options.IncludeProvisionerDaemon {
604-
provisionerCloser = NewTaggedProvisionerDaemon(t, coderAPI, "test", options.ProvisionerDaemonTags)
605+
provisionerCloser = NewTaggedProvisionerDaemon(t, coderAPI, "test", options.ProvisionerDaemonTags, coderd.MemoryProvisionerWithVersionOverride(options.ProvisionerDaemonVersion))
605606
}
606607
client := codersdk.New(serverURL)
607608
t.Cleanup(func() {
@@ -648,7 +649,7 @@ func NewProvisionerDaemon(t testing.TB, coderAPI *coderd.API) io.Closer {
648649
return NewTaggedProvisionerDaemon(t, coderAPI, "test", nil)
649650
}
650651

651-
func NewTaggedProvisionerDaemon(t testing.TB, coderAPI *coderd.API, name string, provisionerTags map[string]string) io.Closer {
652+
func NewTaggedProvisionerDaemon(t testing.TB, coderAPI *coderd.API, name string, provisionerTags map[string]string, opts ...coderd.MemoryProvisionerDaemonOption) io.Closer {
652653
t.Helper()
653654

654655
// t.Cleanup runs in last added, first called order. t.TempDir() will delete
@@ -676,7 +677,7 @@ func NewTaggedProvisionerDaemon(t testing.TB, coderAPI *coderd.API, name string,
676677

677678
connectedCh := make(chan struct{})
678679
daemon := provisionerd.New(func(dialCtx context.Context) (provisionerdproto.DRPCProvisionerDaemonClient, error) {
679-
return coderAPI.CreateInMemoryTaggedProvisionerDaemon(dialCtx, name, []codersdk.ProvisionerType{codersdk.ProvisionerTypeEcho}, provisionerTags)
680+
return coderAPI.CreateInMemoryTaggedProvisionerDaemon(dialCtx, name, []codersdk.ProvisionerType{codersdk.ProvisionerTypeEcho}, provisionerTags, opts...)
680681
}, &provisionerd.Options{
681682
Logger: coderAPI.Logger.Named("provisionerd").Leveled(slog.LevelDebug),
682683
UpdateInterval: 250 * time.Millisecond,

coderd/database/dbauthz/dbauthz_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -1214,8 +1214,8 @@ func (s *MethodTestSuite) TestTemplate() {
12141214
JobID: job.ID,
12151215
TemplateID: uuid.NullUUID{UUID: t.ID, Valid: true},
12161216
})
1217-
dbgen.TemplateVersionTerraformValues(s.T(), db, database.InsertTemplateVersionTerraformValuesByJobIDParams{
1218-
JobID: job.ID,
1217+
dbgen.TemplateVersionTerraformValues(s.T(), db, database.TemplateVersionTerraformValue{
1218+
TemplateVersionID: tv.ID,
12191219
})
12201220
check.Args(tv.ID).Asserts(t, policy.ActionRead)
12211221
}))

coderd/database/dbgen/dbgen.go

+15-2
Original file line numberDiff line numberDiff line change
@@ -998,11 +998,19 @@ func TemplateVersionParameter(t testing.TB, db database.Store, orig database.Tem
998998
return version
999999
}
10001000

1001-
func TemplateVersionTerraformValues(t testing.TB, db database.Store, orig database.InsertTemplateVersionTerraformValuesByJobIDParams) {
1001+
func TemplateVersionTerraformValues(t testing.TB, db database.Store, orig database.TemplateVersionTerraformValue) database.TemplateVersionTerraformValue {
10021002
t.Helper()
10031003

1004+
jobID := uuid.New()
1005+
if orig.TemplateVersionID != uuid.Nil {
1006+
v, err := db.GetTemplateVersionByID(genCtx, orig.TemplateVersionID)
1007+
if err == nil {
1008+
jobID = v.JobID
1009+
}
1010+
}
1011+
10041012
params := database.InsertTemplateVersionTerraformValuesByJobIDParams{
1005-
JobID: takeFirst(orig.JobID, uuid.New()),
1013+
JobID: jobID,
10061014
CachedPlan: takeFirstSlice(orig.CachedPlan, []byte("{}")),
10071015
CachedModuleFiles: orig.CachedModuleFiles,
10081016
UpdatedAt: takeFirst(orig.UpdatedAt, dbtime.Now()),
@@ -1011,6 +1019,11 @@ func TemplateVersionTerraformValues(t testing.TB, db database.Store, orig databa
10111019

10121020
err := db.InsertTemplateVersionTerraformValuesByJobID(genCtx, params)
10131021
require.NoError(t, err, "insert template version parameter")
1022+
1023+
v, err := db.GetTemplateVersionTerraformValues(genCtx, orig.TemplateVersionID)
1024+
require.NoError(t, err, "get template version values")
1025+
1026+
return v
10141027
}
10151028

10161029
func WorkspaceAgentStat(t testing.TB, db database.Store, orig database.WorkspaceAgentStat) database.WorkspaceAgentStat {

coderd/files/cache.go

+11-2
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import (
1616

1717
// NewFromStore returns a file cache that will fetch files from the provided
1818
// database.
19-
func NewFromStore(store database.Store) Cache {
19+
func NewFromStore(store database.Store) *Cache {
2020
fetcher := func(ctx context.Context, fileID uuid.UUID) (fs.FS, error) {
2121
file, err := store.GetFileByID(ctx, fileID)
2222
if err != nil {
@@ -27,7 +27,7 @@ func NewFromStore(store database.Store) Cache {
2727
return archivefs.FromTarReader(content), nil
2828
}
2929

30-
return Cache{
30+
return &Cache{
3131
lock: sync.Mutex{},
3232
data: make(map[uuid.UUID]*cacheEntry),
3333
fetcher: fetcher,
@@ -112,3 +112,12 @@ func (c *Cache) Release(fileID uuid.UUID) {
112112

113113
delete(c.data, fileID)
114114
}
115+
116+
// Count returns the number of files currently in the cache.
117+
// Mainly used for unit testing assertions.
118+
func (c *Cache) Count() int {
119+
c.lock.Lock()
120+
defer c.lock.Unlock()
121+
122+
return len(c.data)
123+
}

0 commit comments

Comments
 (0)