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

Lines changed: 26 additions & 3 deletions
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

Lines changed: 4 additions & 3 deletions
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

Lines changed: 2 additions & 2 deletions
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

Lines changed: 15 additions & 2 deletions
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

Lines changed: 11 additions & 2 deletions
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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy