Skip to content

Commit 9149c1e

Browse files
authored
chore: append template metadata to protobuf config (#20558)
Adds some extra meta data sent to provisioners. Also adds a field `reuse_terraform_workspace` to tell the provisioner whether or not to use the caching experiment.
1 parent 5e85663 commit 9149c1e

File tree

13 files changed

+663
-521
lines changed

13 files changed

+663
-521
lines changed

cli/testdata/coder_provisioner_list_--output_json.golden

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
"last_seen_at": "====[timestamp]=====",
88
"name": "test-daemon",
99
"version": "v0.0.0-devel",
10-
"api_version": "1.11",
10+
"api_version": "1.12",
1111
"provisioners": [
1212
"echo"
1313
],

coderd/database/dbfake/dbfake.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -622,6 +622,7 @@ func (t TemplateVersionBuilder) Do() TemplateVersionResponse {
622622
}
623623

624624
payload, err := json.Marshal(provisionerdserver.TemplateVersionImportJob{
625+
TemplateID: t.seed.TemplateID,
625626
TemplateVersionID: t.seed.ID,
626627
})
627628
require.NoError(t.t, err)

coderd/provisionerdserver/provisionerdserver.go

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ import (
4343
"github.com/coder/coder/v2/coderd/tracing"
4444
"github.com/coder/coder/v2/coderd/usage"
4545
"github.com/coder/coder/v2/coderd/usage/usagetypes"
46+
"github.com/coder/coder/v2/coderd/util/ptr"
4647
"github.com/coder/coder/v2/coderd/util/slice"
4748
"github.com/coder/coder/v2/coderd/wspubsub"
4849
"github.com/coder/coder/v2/codersdk"
@@ -697,13 +698,14 @@ func (s *server) acquireProtoJob(ctx context.Context, job database.ProvisionerJo
697698

698699
protoJob.Type = &proto.AcquiredJob_WorkspaceBuild_{
699700
WorkspaceBuild: &proto.AcquiredJob_WorkspaceBuild{
700-
WorkspaceBuildId: workspaceBuild.ID.String(),
701-
WorkspaceName: workspace.Name,
702-
State: workspaceBuild.ProvisionerState,
703-
RichParameterValues: convertRichParameterValues(workspaceBuildParameters),
704-
PreviousParameterValues: convertRichParameterValues(lastWorkspaceBuildParameters),
705-
VariableValues: asVariableValues(templateVariables),
706-
ExternalAuthProviders: externalAuthProviders,
701+
WorkspaceBuildId: workspaceBuild.ID.String(),
702+
WorkspaceName: workspace.Name,
703+
State: workspaceBuild.ProvisionerState,
704+
RichParameterValues: convertRichParameterValues(workspaceBuildParameters),
705+
PreviousParameterValues: convertRichParameterValues(lastWorkspaceBuildParameters),
706+
VariableValues: asVariableValues(templateVariables),
707+
ExternalAuthProviders: externalAuthProviders,
708+
ExpReuseTerraformWorkspace: ptr.Ref(false), // TODO: Toggle based on experiment
707709
Metadata: &sdkproto.Metadata{
708710
CoderUrl: s.AccessURL.String(),
709711
WorkspaceTransition: transition,
@@ -773,6 +775,11 @@ func (s *server) acquireProtoJob(ctx context.Context, job database.ProvisionerJo
773775
return nil, failJob(err.Error())
774776
}
775777

778+
templateID := ""
779+
if input.TemplateID.Valid {
780+
templateID = input.TemplateID.UUID.String()
781+
}
782+
776783
protoJob.Type = &proto.AcquiredJob_TemplateImport_{
777784
TemplateImport: &proto.AcquiredJob_TemplateImport{
778785
UserVariableValues: convertVariableValues(userVariableValues),
@@ -781,6 +788,8 @@ func (s *server) acquireProtoJob(ctx context.Context, job database.ProvisionerJo
781788
// There is no owner for a template import, but we can assume
782789
// the "Everyone" group as a placeholder.
783790
WorkspaceOwnerGroups: []string{database.EveryoneGroup},
791+
TemplateId: templateID,
792+
TemplateVersionId: input.TemplateVersionID.String(),
784793
},
785794
},
786795
}
@@ -3210,6 +3219,10 @@ func auditActionFromTransition(transition database.WorkspaceTransition) database
32103219
}
32113220

32123221
type TemplateVersionImportJob struct {
3222+
// TemplateID is not guaranteed to be set. Template versions can be created
3223+
// without being associated with a template. Resulting in a template id of
3224+
// `uuid.Nil`
3225+
TemplateID uuid.NullUUID `json:"template_id"`
32133226
TemplateVersionID uuid.UUID `json:"template_version_id"`
32143227
UserVariableValues []codersdk.VariableValue `json:"user_variable_values"`
32153228
}

coderd/provisionerdserver/provisionerdserver_test.go

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626
"storj.io/drpc"
2727

2828
"cdr.dev/slog/sloggers/slogtest"
29+
"github.com/coder/coder/v2/coderd/util/ptr"
2930
"github.com/coder/quartz"
3031
"github.com/coder/serpent"
3132

@@ -59,24 +60,24 @@ import (
5960
)
6061

6162
func testTemplateScheduleStore() *atomic.Pointer[schedule.TemplateScheduleStore] {
62-
ptr := &atomic.Pointer[schedule.TemplateScheduleStore]{}
63+
poitr := &atomic.Pointer[schedule.TemplateScheduleStore]{}
6364
store := schedule.NewAGPLTemplateScheduleStore()
64-
ptr.Store(&store)
65-
return ptr
65+
poitr.Store(&store)
66+
return poitr
6667
}
6768

6869
func testUserQuietHoursScheduleStore() *atomic.Pointer[schedule.UserQuietHoursScheduleStore] {
69-
ptr := &atomic.Pointer[schedule.UserQuietHoursScheduleStore]{}
70+
poitr := &atomic.Pointer[schedule.UserQuietHoursScheduleStore]{}
7071
store := schedule.NewAGPLUserQuietHoursScheduleStore()
71-
ptr.Store(&store)
72-
return ptr
72+
poitr.Store(&store)
73+
return poitr
7374
}
7475

7576
func testUsageInserter() *atomic.Pointer[usage.Inserter] {
76-
ptr := &atomic.Pointer[usage.Inserter]{}
77+
poitr := &atomic.Pointer[usage.Inserter]{}
7778
inserter := usage.NewAGPLInserter()
78-
ptr.Store(&inserter)
79-
return ptr
79+
poitr.Store(&inserter)
80+
return poitr
8081
}
8182

8283
func TestAcquireJob_LongPoll(t *testing.T) {
@@ -474,8 +475,9 @@ func TestAcquireJob(t *testing.T) {
474475
})
475476
want, err := json.Marshal(&proto.AcquiredJob_WorkspaceBuild_{
476477
WorkspaceBuild: &proto.AcquiredJob_WorkspaceBuild{
477-
WorkspaceBuildId: build.ID.String(),
478-
WorkspaceName: workspace.Name,
478+
ExpReuseTerraformWorkspace: ptr.Ref(false),
479+
WorkspaceBuildId: build.ID.String(),
480+
WorkspaceName: workspace.Name,
479481
VariableValues: []*sdkproto.VariableValue{
480482
{
481483
Name: "first",
@@ -629,6 +631,7 @@ func TestAcquireJob(t *testing.T) {
629631
Metadata: &sdkproto.Metadata{
630632
CoderUrl: (&url.URL{}).String(),
631633
WorkspaceOwnerGroups: []string{database.EveryoneGroup},
634+
TemplateVersionId: uuid.Nil.String(),
632635
},
633636
},
634637
})
@@ -677,6 +680,7 @@ func TestAcquireJob(t *testing.T) {
677680
Metadata: &sdkproto.Metadata{
678681
CoderUrl: (&url.URL{}).String(),
679682
WorkspaceOwnerGroups: []string{database.EveryoneGroup},
683+
TemplateVersionId: version.ID.String(),
680684
},
681685
},
682686
})
@@ -4392,11 +4396,11 @@ type fakeUsageInserter struct {
43924396
var _ usage.Inserter = &fakeUsageInserter{}
43934397

43944398
func newFakeUsageInserter() (*fakeUsageInserter, *atomic.Pointer[usage.Inserter]) {
4395-
ptr := &atomic.Pointer[usage.Inserter]{}
4399+
poitr := &atomic.Pointer[usage.Inserter]{}
43964400
fake := &fakeUsageInserter{}
43974401
var inserter usage.Inserter = fake
4398-
ptr.Store(&inserter)
4399-
return fake, ptr
4402+
poitr.Store(&inserter)
4403+
return fake, poitr
44004404
}
44014405

44024406
func (f *fakeUsageInserter) InsertDiscreteUsageEvent(_ context.Context, _ database.Store, event usagetypes.DiscreteEvent) error {

coderd/templateversions.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1609,9 +1609,13 @@ func (api *API) postTemplateVersionsByOrganization(rw http.ResponseWriter, r *ht
16091609
var matchedProvisioners codersdk.MatchedProvisioners
16101610
err = api.Database.InTx(func(tx database.Store) error {
16111611
jobID := uuid.New()
1612-
16131612
templateVersionID := uuid.New()
1613+
16141614
jobInput, err := json.Marshal(provisionerdserver.TemplateVersionImportJob{
1615+
TemplateID: uuid.NullUUID{
1616+
UUID: req.TemplateID,
1617+
Valid: req.TemplateID != uuid.Nil,
1618+
},
16151619
TemplateVersionID: templateVersionID,
16161620
UserVariableValues: req.UserVariableValues,
16171621
})

coderd/util/strings/strings.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,15 @@ import (
1010
"github.com/microcosm-cc/bluemonday"
1111
)
1212

13+
// EmptyToNil returns a `nil` for an empty string, or a pointer to the string
14+
// otherwise. Useful when needing to treat zero values as nil in APIs.
15+
func EmptyToNil(s string) *string {
16+
if s == "" {
17+
return nil
18+
}
19+
return &s
20+
}
21+
1322
// JoinWithConjunction joins a slice of strings with commas except for the last
1423
// two which are joined with "and".
1524
func JoinWithConjunction(s []string) string {

0 commit comments

Comments
 (0)