Skip to content

Commit f5818ed

Browse files
committed
Make usage checker required
1 parent 82e506e commit f5818ed

File tree

7 files changed

+41
-47
lines changed

7 files changed

+41
-47
lines changed

coderd/autobuild/lifecycle_executor.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -281,11 +281,10 @@ func (e *Executor) runOnce(t time.Time) Stats {
281281
}
282282

283283
if nextTransition != "" {
284-
builder := wsbuilder.New(ws, nextTransition).
284+
builder := wsbuilder.New(ws, nextTransition, *e.buildUsageChecker.Load()).
285285
SetLastWorkspaceBuildInTx(&latestBuild).
286286
SetLastWorkspaceBuildJobInTx(&latestJob).
287287
Experiments(e.experiments).
288-
UsageChecker(*e.buildUsageChecker.Load()).
289288
Reason(reason)
290289
log.Debug(e.ctx, "auto building workspace", slog.F("transition", nextTransition))
291290
if nextTransition == database.WorkspaceTransitionStart &&

coderd/workspacebuilds.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -335,14 +335,13 @@ func (api *API) postWorkspaceBuilds(rw http.ResponseWriter, r *http.Request) {
335335
return
336336
}
337337

338-
builder := wsbuilder.New(workspace, database.WorkspaceTransition(createBuild.Transition)).
338+
builder := wsbuilder.New(workspace, database.WorkspaceTransition(createBuild.Transition), *api.BuildUsageChecker.Load()).
339339
Initiator(apiKey.UserID).
340340
RichParameterValues(createBuild.RichParameterValues).
341341
LogLevel(string(createBuild.LogLevel)).
342342
DeploymentValues(api.Options.DeploymentValues).
343343
Experiments(api.Experiments).
344-
TemplateVersionPresetID(createBuild.TemplateVersionPresetID).
345-
UsageChecker(*api.BuildUsageChecker.Load())
344+
TemplateVersionPresetID(createBuild.TemplateVersionPresetID)
346345

347346
var (
348347
previousWorkspaceBuild database.WorkspaceBuild

coderd/workspaces.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -701,14 +701,13 @@ func createWorkspace(
701701
return xerrors.Errorf("get workspace by ID: %w", err)
702702
}
703703

704-
builder := wsbuilder.New(workspace, database.WorkspaceTransitionStart).
704+
builder := wsbuilder.New(workspace, database.WorkspaceTransitionStart, *api.BuildUsageChecker.Load()).
705705
Reason(database.BuildReasonInitiator).
706706
Initiator(initiatorID).
707707
ActiveVersion().
708708
Experiments(api.Experiments).
709709
DeploymentValues(api.DeploymentValues).
710-
RichParameterValues(req.RichParameterValues).
711-
UsageChecker(*api.BuildUsageChecker.Load())
710+
RichParameterValues(req.RichParameterValues)
712711
if req.TemplateVersionID != uuid.Nil {
713712
builder = builder.VersionID(req.TemplateVersionID)
714713
}

coderd/wsbuilder/wsbuilder.go

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -139,8 +139,8 @@ type stateTarget struct {
139139
explicit *[]byte
140140
}
141141

142-
func New(w database.Workspace, t database.WorkspaceTransition) Builder {
143-
return Builder{workspace: w, trans: t}
142+
func New(w database.Workspace, t database.WorkspaceTransition, uc UsageChecker) Builder {
143+
return Builder{workspace: w, trans: t, usageChecker: uc}
144144
}
145145

146146
// Methods that customize the build are public, have a struct receiver and return a new Builder.
@@ -189,11 +189,6 @@ func (b Builder) Experiments(exp codersdk.Experiments) Builder {
189189
return b
190190
}
191191

192-
func (b Builder) UsageChecker(uc UsageChecker) Builder {
193-
b.usageChecker = uc
194-
return b
195-
}
196-
197192
func (b Builder) Initiator(u uuid.UUID) Builder {
198193
// nolint: revive
199194
b.initiator = u
@@ -1280,11 +1275,6 @@ func (b *Builder) checkUsage() error {
12801275
return BuildError{http.StatusInternalServerError, "failed to fetch template version", err}
12811276
}
12821277

1283-
// If no usage checker is set, we're AGPL.
1284-
if b.usageChecker == nil {
1285-
return nil
1286-
}
1287-
12881278
resp, err := b.usageChecker.CheckBuildUsage(b.ctx, b.store, templateVersion)
12891279
if err != nil {
12901280
return BuildError{http.StatusInternalServerError, "failed to check build usage", err}

coderd/wsbuilder/wsbuilder_test.go

Lines changed: 28 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ func TestBuilder_NoOptions(t *testing.T) {
102102
fc := files.New(prometheus.NewRegistry(), &coderdtest.FakeAuthorizer{})
103103

104104
ws := database.Workspace{ID: workspaceID, TemplateID: templateID, OwnerID: userID}
105-
uut := wsbuilder.New(ws, database.WorkspaceTransitionStart)
105+
uut := wsbuilder.New(ws, database.WorkspaceTransitionStart, wsbuilder.NoopUsageChecker{})
106106
// nolint: dogsled
107107
_, _, _, err := uut.Build(ctx, mDB, fc, nil, audit.WorkspaceBuildBaggage{})
108108
req.NoError(err)
@@ -142,7 +142,8 @@ func TestBuilder_Initiator(t *testing.T) {
142142
fc := files.New(prometheus.NewRegistry(), &coderdtest.FakeAuthorizer{})
143143

144144
ws := database.Workspace{ID: workspaceID, TemplateID: templateID, OwnerID: userID}
145-
uut := wsbuilder.New(ws, database.WorkspaceTransitionStart).Initiator(otherUserID)
145+
uut := wsbuilder.New(ws, database.WorkspaceTransitionStart, wsbuilder.NoopUsageChecker{}).
146+
Initiator(otherUserID)
146147
// nolint: dogsled
147148
_, _, _, err := uut.Build(ctx, mDB, fc, nil, audit.WorkspaceBuildBaggage{})
148149
req.NoError(err)
@@ -188,7 +189,8 @@ func TestBuilder_Baggage(t *testing.T) {
188189
fc := files.New(prometheus.NewRegistry(), &coderdtest.FakeAuthorizer{})
189190

190191
ws := database.Workspace{ID: workspaceID, TemplateID: templateID, OwnerID: userID}
191-
uut := wsbuilder.New(ws, database.WorkspaceTransitionStart).Initiator(otherUserID)
192+
uut := wsbuilder.New(ws, database.WorkspaceTransitionStart, wsbuilder.NoopUsageChecker{}).
193+
Initiator(otherUserID)
192194
// nolint: dogsled
193195
_, _, _, err := uut.Build(ctx, mDB, fc, nil, audit.WorkspaceBuildBaggage{IP: "127.0.0.1"})
194196
req.NoError(err)
@@ -227,7 +229,8 @@ func TestBuilder_Reason(t *testing.T) {
227229
fc := files.New(prometheus.NewRegistry(), &coderdtest.FakeAuthorizer{})
228230

229231
ws := database.Workspace{ID: workspaceID, TemplateID: templateID, OwnerID: userID}
230-
uut := wsbuilder.New(ws, database.WorkspaceTransitionStart).Reason(database.BuildReasonAutostart)
232+
uut := wsbuilder.New(ws, database.WorkspaceTransitionStart, wsbuilder.NoopUsageChecker{}).
233+
Reason(database.BuildReasonAutostart)
231234
// nolint: dogsled
232235
_, _, _, err := uut.Build(ctx, mDB, fc, nil, audit.WorkspaceBuildBaggage{})
233236
req.NoError(err)
@@ -271,7 +274,8 @@ func TestBuilder_ActiveVersion(t *testing.T) {
271274
fc := files.New(prometheus.NewRegistry(), &coderdtest.FakeAuthorizer{})
272275

273276
ws := database.Workspace{ID: workspaceID, TemplateID: templateID, OwnerID: userID}
274-
uut := wsbuilder.New(ws, database.WorkspaceTransitionStart).ActiveVersion()
277+
uut := wsbuilder.New(ws, database.WorkspaceTransitionStart, wsbuilder.NoopUsageChecker{}).
278+
ActiveVersion()
275279
// nolint: dogsled
276280
_, _, _, err := uut.Build(ctx, mDB, fc, nil, audit.WorkspaceBuildBaggage{})
277281
req.NoError(err)
@@ -386,7 +390,8 @@ func TestWorkspaceBuildWithTags(t *testing.T) {
386390
fc := files.New(prometheus.NewRegistry(), &coderdtest.FakeAuthorizer{})
387391

388392
ws := database.Workspace{ID: workspaceID, TemplateID: templateID, OwnerID: userID}
389-
uut := wsbuilder.New(ws, database.WorkspaceTransitionStart).RichParameterValues(buildParameters)
393+
uut := wsbuilder.New(ws, database.WorkspaceTransitionStart, wsbuilder.NoopUsageChecker{}).
394+
RichParameterValues(buildParameters)
390395
// nolint: dogsled
391396
_, _, _, err := uut.Build(ctx, mDB, fc, nil, audit.WorkspaceBuildBaggage{})
392397
req.NoError(err)
@@ -469,7 +474,8 @@ func TestWorkspaceBuildWithRichParameters(t *testing.T) {
469474
fc := files.New(prometheus.NewRegistry(), &coderdtest.FakeAuthorizer{})
470475

471476
ws := database.Workspace{ID: workspaceID, TemplateID: templateID, OwnerID: userID}
472-
uut := wsbuilder.New(ws, database.WorkspaceTransitionStart).RichParameterValues(nextBuildParameters)
477+
uut := wsbuilder.New(ws, database.WorkspaceTransitionStart, wsbuilder.NoopUsageChecker{}).
478+
RichParameterValues(nextBuildParameters)
473479
// nolint: dogsled
474480
_, _, _, err := uut.Build(ctx, mDB, fc, nil, audit.WorkspaceBuildBaggage{})
475481
req.NoError(err)
@@ -517,7 +523,8 @@ func TestWorkspaceBuildWithRichParameters(t *testing.T) {
517523
fc := files.New(prometheus.NewRegistry(), &coderdtest.FakeAuthorizer{})
518524

519525
ws := database.Workspace{ID: workspaceID, TemplateID: templateID, OwnerID: userID}
520-
uut := wsbuilder.New(ws, database.WorkspaceTransitionStart).RichParameterValues(nextBuildParameters)
526+
uut := wsbuilder.New(ws, database.WorkspaceTransitionStart, wsbuilder.NoopUsageChecker{}).
527+
RichParameterValues(nextBuildParameters)
521528
// nolint: dogsled
522529
_, _, _, err := uut.Build(ctx, mDB, fc, nil, audit.WorkspaceBuildBaggage{})
523530
req.NoError(err)
@@ -555,7 +562,8 @@ func TestWorkspaceBuildWithRichParameters(t *testing.T) {
555562
fc := files.New(prometheus.NewRegistry(), &coderdtest.FakeAuthorizer{})
556563

557564
ws := database.Workspace{ID: workspaceID, TemplateID: templateID, OwnerID: userID}
558-
uut := wsbuilder.New(ws, database.WorkspaceTransitionStart)
565+
uut := wsbuilder.New(ws, database.WorkspaceTransitionStart, wsbuilder.NoopUsageChecker{})
566+
// nolint: dogsled
559567
_, _, _, err := uut.Build(ctx, mDB, fc, nil, audit.WorkspaceBuildBaggage{})
560568
bldErr := wsbuilder.BuildError{}
561569
req.ErrorAs(err, &bldErr)
@@ -591,7 +599,8 @@ func TestWorkspaceBuildWithRichParameters(t *testing.T) {
591599
fc := files.New(prometheus.NewRegistry(), &coderdtest.FakeAuthorizer{})
592600

593601
ws := database.Workspace{ID: workspaceID, TemplateID: templateID, OwnerID: userID}
594-
uut := wsbuilder.New(ws, database.WorkspaceTransitionStart).RichParameterValues(nextBuildParameters)
602+
uut := wsbuilder.New(ws, database.WorkspaceTransitionStart, wsbuilder.NoopUsageChecker{}).
603+
RichParameterValues(nextBuildParameters)
595604
// nolint: dogsled
596605
_, _, _, err := uut.Build(ctx, mDB, fc, nil, audit.WorkspaceBuildBaggage{})
597606
bldErr := wsbuilder.BuildError{}
@@ -656,7 +665,7 @@ func TestWorkspaceBuildWithRichParameters(t *testing.T) {
656665
fc := files.New(prometheus.NewRegistry(), &coderdtest.FakeAuthorizer{})
657666

658667
ws := database.Workspace{ID: workspaceID, TemplateID: templateID, OwnerID: userID}
659-
uut := wsbuilder.New(ws, database.WorkspaceTransitionStart).
668+
uut := wsbuilder.New(ws, database.WorkspaceTransitionStart, wsbuilder.NoopUsageChecker{}).
660669
RichParameterValues(nextBuildParameters).
661670
VersionID(activeVersionID)
662671
_, _, _, err := uut.Build(ctx, mDB, fc, nil, audit.WorkspaceBuildBaggage{})
@@ -720,7 +729,7 @@ func TestWorkspaceBuildWithRichParameters(t *testing.T) {
720729
fc := files.New(prometheus.NewRegistry(), &coderdtest.FakeAuthorizer{})
721730

722731
ws := database.Workspace{ID: workspaceID, TemplateID: templateID, OwnerID: userID}
723-
uut := wsbuilder.New(ws, database.WorkspaceTransitionStart).
732+
uut := wsbuilder.New(ws, database.WorkspaceTransitionStart, wsbuilder.NoopUsageChecker{}).
724733
RichParameterValues(nextBuildParameters).
725734
VersionID(activeVersionID)
726735
_, _, _, err := uut.Build(ctx, mDB, fc, nil, audit.WorkspaceBuildBaggage{})
@@ -782,7 +791,7 @@ func TestWorkspaceBuildWithRichParameters(t *testing.T) {
782791
fc := files.New(prometheus.NewRegistry(), &coderdtest.FakeAuthorizer{})
783792

784793
ws := database.Workspace{ID: workspaceID, TemplateID: templateID, OwnerID: userID}
785-
uut := wsbuilder.New(ws, database.WorkspaceTransitionStart).
794+
uut := wsbuilder.New(ws, database.WorkspaceTransitionStart, wsbuilder.NoopUsageChecker{}).
786795
RichParameterValues(nextBuildParameters).
787796
VersionID(activeVersionID)
788797
// nolint: dogsled
@@ -849,7 +858,7 @@ func TestWorkspaceBuildWithPreset(t *testing.T) {
849858
fc := files.New(prometheus.NewRegistry(), &coderdtest.FakeAuthorizer{})
850859

851860
ws := database.Workspace{ID: workspaceID, TemplateID: templateID, OwnerID: userID}
852-
uut := wsbuilder.New(ws, database.WorkspaceTransitionStart).
861+
uut := wsbuilder.New(ws, database.WorkspaceTransitionStart, wsbuilder.NoopUsageChecker{}).
853862
ActiveVersion().
854863
TemplateVersionPresetID(presetID)
855864
// nolint: dogsled
@@ -916,7 +925,7 @@ func TestWorkspaceBuildDeleteOrphan(t *testing.T) {
916925
)
917926

918927
ws := database.Workspace{ID: workspaceID, TemplateID: templateID, OwnerID: userID}
919-
uut := wsbuilder.New(ws, database.WorkspaceTransitionDelete).Orphan()
928+
uut := wsbuilder.New(ws, database.WorkspaceTransitionDelete, wsbuilder.NoopUsageChecker{}).Orphan()
920929
fc := files.New(prometheus.NewRegistry(), &coderdtest.FakeAuthorizer{})
921930

922931
// nolint: dogsled
@@ -993,7 +1002,7 @@ func TestWorkspaceBuildDeleteOrphan(t *testing.T) {
9931002
)
9941003

9951004
ws := database.Workspace{ID: workspaceID, TemplateID: templateID, OwnerID: userID}
996-
uut := wsbuilder.New(ws, database.WorkspaceTransitionDelete).Orphan()
1005+
uut := wsbuilder.New(ws, database.WorkspaceTransitionDelete, wsbuilder.NoopUsageChecker{}).Orphan()
9971006
fc := files.New(prometheus.NewRegistry(), &coderdtest.FakeAuthorizer{})
9981007
// nolint: dogsled
9991008
_, _, _, err := uut.Build(ctx, mDB, fc, nil, audit.WorkspaceBuildBaggage{})
@@ -1039,8 +1048,7 @@ func TestWorkspaceBuildUsageChecker(t *testing.T) {
10391048
fc := files.New(prometheus.NewRegistry(), &coderdtest.FakeAuthorizer{})
10401049

10411050
ws := database.Workspace{ID: workspaceID, TemplateID: templateID, OwnerID: userID}
1042-
uut := wsbuilder.New(ws, database.WorkspaceTransitionStart).
1043-
UsageChecker(fakeUsageChecker)
1051+
uut := wsbuilder.New(ws, database.WorkspaceTransitionStart, fakeUsageChecker)
10441052
// nolint: dogsled
10451053
_, _, _, err := uut.Build(ctx, mDB, fc, nil, audit.WorkspaceBuildBaggage{})
10461054
require.NoError(t, err)
@@ -1101,9 +1109,8 @@ func TestWorkspaceBuildUsageChecker(t *testing.T) {
11011109
fc := files.New(prometheus.NewRegistry(), &coderdtest.FakeAuthorizer{})
11021110

11031111
ws := database.Workspace{ID: workspaceID, TemplateID: templateID, OwnerID: userID}
1104-
uut := wsbuilder.New(ws, database.WorkspaceTransitionStart).
1105-
VersionID(inactiveVersionID).
1106-
UsageChecker(fakeUsageChecker)
1112+
uut := wsbuilder.New(ws, database.WorkspaceTransitionStart, fakeUsageChecker).
1113+
VersionID(inactiveVersionID)
11071114
// nolint: dogsled
11081115
_, _, _, err := uut.Build(ctx, mDB, fc, nil, audit.WorkspaceBuildBaggage{})
11091116
c.assertions(t, err)

enterprise/coderd/license/license_test.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -691,10 +691,10 @@ func TestEntitlements(t *testing.T) {
691691

692692
licenseOpts := (&coderdenttest.LicenseOptions{
693693
FeatureSet: codersdk.FeatureSetPremium,
694-
IssuedAt: dbtime.Now().Add(-2 * time.Hour),
695-
NotBefore: dbtime.Now().Add(-time.Hour),
696-
GraceAt: dbtime.Now().Add(time.Hour * 24 * 60), // 60 days to remove warning
697-
ExpiresAt: dbtime.Now().Add(time.Hour * 24 * 90), // 90 days to remove warning
694+
IssuedAt: dbtime.Now().Add(-2 * time.Hour).Truncate(time.Second),
695+
NotBefore: dbtime.Now().Add(-time.Hour).Truncate(time.Second),
696+
GraceAt: dbtime.Now().Add(time.Hour * 24 * 60).Truncate(time.Second), // 60 days to remove warning
697+
ExpiresAt: dbtime.Now().Add(time.Hour * 24 * 90).Truncate(time.Second), // 90 days to remove warning
698698
}).
699699
UserLimit(100).
700700
ManagedAgentLimit(100, 200)
@@ -713,6 +713,7 @@ func TestEntitlements(t *testing.T) {
713713
Return(int64(1), nil)
714714
mDB.EXPECT().
715715
GetManagedAgentCount(gomock.Any(), gomock.Cond(func(params database.GetManagedAgentCountParams) bool {
716+
// gomock doesn't seem to compare times very nicely.
716717
if !assert.WithinDuration(t, licenseOpts.NotBefore, params.StartTime, time.Second) {
717718
return false
718719
}

enterprise/coderd/prebuilds/reconcile.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -751,10 +751,9 @@ func (c *StoreReconciler) provision(
751751
})
752752
}
753753

754-
builder := wsbuilder.New(workspace, transition).
754+
builder := wsbuilder.New(workspace, transition, *c.buildUsageChecker.Load()).
755755
Reason(database.BuildReasonInitiator).
756756
Initiator(database.PrebuildsSystemUserID).
757-
UsageChecker(*c.buildUsageChecker.Load()).
758757
MarkPrebuild()
759758

760759
if transition != database.WorkspaceTransitionDelete {

0 commit comments

Comments
 (0)