Skip to content

Commit 200e652

Browse files
committed
Add provisioner tags to template push and create
1 parent 7dda3a2 commit 200e652

File tree

6 files changed

+73
-34
lines changed

6 files changed

+73
-34
lines changed

cli/templatecreate.go

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ func templateCreate() *cobra.Command {
2727
directory string
2828
provisioner string
2929
parameterFile string
30+
provisionerTags []string
3031
maxTTL time.Duration
3132
minAutostartInterval time.Duration
3233
)
@@ -88,12 +89,18 @@ func templateCreate() *cobra.Command {
8889
}
8990
spin.Stop()
9091

92+
tags, err := ParseProvisionerTags(provisionerTags)
93+
if err != nil {
94+
return err
95+
}
96+
9197
job, _, err := createValidTemplateVersion(cmd, createValidTemplateVersionArgs{
92-
Client: client,
93-
Organization: organization,
94-
Provisioner: database.ProvisionerType(provisioner),
95-
FileID: resp.ID,
96-
ParameterFile: parameterFile,
98+
Client: client,
99+
Organization: organization,
100+
Provisioner: database.ProvisionerType(provisioner),
101+
FileID: resp.ID,
102+
ParameterFile: parameterFile,
103+
ProvisionerTags: tags,
97104
})
98105
if err != nil {
99106
return err
@@ -135,6 +142,7 @@ func templateCreate() *cobra.Command {
135142
cmd.Flags().StringVarP(&parameterFile, "parameter-file", "", "", "Specify a file path with parameter values.")
136143
cmd.Flags().DurationVarP(&maxTTL, "max-ttl", "", 24*time.Hour, "Specify a maximum TTL for workspaces created from this template.")
137144
cmd.Flags().DurationVarP(&minAutostartInterval, "min-autostart-interval", "", time.Hour, "Specify a minimum autostart interval for workspaces created from this template.")
145+
cmd.Flags().StringArrayVarP(&provisionerTags, "provisioner-tag", "", []string{}, "Specify a set of tags to target provisioner daemons.")
138146
// This is for testing!
139147
err := cmd.Flags().MarkHidden("test.provisioner")
140148
if err != nil {
@@ -157,6 +165,7 @@ type createValidTemplateVersionArgs struct {
157165
// before prompting the user. Set to false to always prompt for param
158166
// values.
159167
ReuseParameters bool
168+
ProvisionerTags map[string]string
160169
}
161170

162171
func createValidTemplateVersion(cmd *cobra.Command, args createValidTemplateVersionArgs, parameters ...codersdk.CreateParameterRequest) (*codersdk.TemplateVersion, []codersdk.CreateParameterRequest, error) {
@@ -168,6 +177,7 @@ func createValidTemplateVersion(cmd *cobra.Command, args createValidTemplateVers
168177
FileID: args.FileID,
169178
Provisioner: codersdk.ProvisionerType(args.Provisioner),
170179
ParameterValues: parameters,
180+
ProvisionerTags: args.ProvisionerTags,
171181
}
172182
if args.Template != nil {
173183
req.TemplateID = args.Template.ID
@@ -337,3 +347,15 @@ func prettyDirectoryPath(dir string) string {
337347
}
338348
return pretty
339349
}
350+
351+
func ParseProvisionerTags(rawTags []string) (map[string]string, error) {
352+
tags := map[string]string{}
353+
for _, rawTag := range rawTags {
354+
parts := strings.SplitN(rawTag, "=", 2)
355+
if len(parts) < 2 {
356+
return nil, xerrors.Errorf("invalid tag format for %q. must be key=value", rawTag)
357+
}
358+
tags[parts[0]] = parts[1]
359+
}
360+
return tags, nil
361+
}

cli/templatepush.go

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,12 @@ import (
1818

1919
func templatePush() *cobra.Command {
2020
var (
21-
directory string
22-
versionName string
23-
provisioner string
24-
parameterFile string
25-
alwaysPrompt bool
21+
directory string
22+
versionName string
23+
provisioner string
24+
parameterFile string
25+
alwaysPrompt bool
26+
provisionerTags []string
2627
)
2728

2829
cmd := &cobra.Command{
@@ -75,6 +76,11 @@ func templatePush() *cobra.Command {
7576
}
7677
spin.Stop()
7778

79+
tags, err := ParseProvisionerTags(provisionerTags)
80+
if err != nil {
81+
return err
82+
}
83+
7884
job, _, err := createValidTemplateVersion(cmd, createValidTemplateVersionArgs{
7985
Name: versionName,
8086
Client: client,
@@ -84,6 +90,7 @@ func templatePush() *cobra.Command {
8490
ParameterFile: parameterFile,
8591
Template: &template,
8692
ReuseParameters: !alwaysPrompt,
93+
ProvisionerTags: tags,
8794
})
8895
if err != nil {
8996
return err

coderd/database/dbtype/dbtype.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,13 @@ import (
99

1010
type Map map[string]string
1111

12-
func (m Map) Scan(src interface{}) error {
12+
func (m *Map) Scan(src interface{}) error {
1313
if src == nil {
1414
return nil
1515
}
1616
switch src := src.(type) {
1717
case []byte:
18-
err := json.Unmarshal(src, &m)
18+
err := json.Unmarshal(src, m)
1919
if err != nil {
2020
return err
2121
}

enterprise/cli/provisionerdaemons.go

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import (
55
"fmt"
66
"os"
77
"os/signal"
8-
"strings"
98
"time"
109

1110
"cdr.dev/slog"
@@ -60,13 +59,9 @@ func provisionerDaemonStart() *cobra.Command {
6059
return xerrors.Errorf("get current organization: %w", err)
6160
}
6261

63-
tags := map[string]string{}
64-
for _, rawTag := range rawTags {
65-
parts := strings.SplitN(rawTag, "=", 2)
66-
if len(parts) < 2 {
67-
return xerrors.Errorf("invalid tag format for %q. must be key=value", rawTag)
68-
}
69-
tags[parts[0]] = parts[1]
62+
tags, err := agpl.ParseProvisionerTags(rawTags)
63+
if err != nil {
64+
return err
7065
}
7166

7267
err = os.MkdirAll(cacheDir, 0o700)
@@ -106,6 +101,8 @@ func provisionerDaemonStart() *cobra.Command {
106101
return err
107102
}
108103

104+
logger.Info(ctx, "starting provisioner daemon", slog.F("tags", tags))
105+
109106
provisioners := provisionerd.Provisioners{
110107
string(database.ProvisionerTypeTerraform): proto.NewDRPCProvisionerClient(provisionersdk.Conn(terraformClient)),
111108
}

enterprise/coderd/coderd.go

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -227,13 +227,14 @@ func (api *API) updateEntitlements(ctx context.Context) error {
227227
defer api.entitlementsMu.Unlock()
228228

229229
entitlements, err := license.Entitlements(ctx, api.Database, api.Logger, len(api.replicaManager.All()), len(api.GitAuthConfigs), api.Keys, map[string]bool{
230-
codersdk.FeatureAuditLog: api.AuditLogging,
231-
codersdk.FeatureBrowserOnly: api.BrowserOnly,
232-
codersdk.FeatureSCIM: len(api.SCIMAPIKey) != 0,
233-
codersdk.FeatureWorkspaceQuota: api.UserWorkspaceQuota != 0,
234-
codersdk.FeatureHighAvailability: api.DERPServerRelayAddress != "",
235-
codersdk.FeatureMultipleGitAuth: len(api.GitAuthConfigs) > 1,
236-
codersdk.FeatureTemplateRBAC: api.RBAC,
230+
codersdk.FeatureAuditLog: api.AuditLogging,
231+
codersdk.FeatureBrowserOnly: api.BrowserOnly,
232+
codersdk.FeatureSCIM: len(api.SCIMAPIKey) != 0,
233+
codersdk.FeatureWorkspaceQuota: api.UserWorkspaceQuota != 0,
234+
codersdk.FeatureHighAvailability: api.DERPServerRelayAddress != "",
235+
codersdk.FeatureMultipleGitAuth: len(api.GitAuthConfigs) > 1,
236+
codersdk.FeatureTemplateRBAC: api.RBAC,
237+
codersdk.FeatureExternalProvisionerDaemons: true,
237238
})
238239
if err != nil {
239240
return err

enterprise/coderd/provisionerdaemons.go

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -75,13 +75,15 @@ func (api *API) provisionerDaemons(rw http.ResponseWriter, r *http.Request) {
7575
})
7676
return
7777
}
78-
79-
httpapi.Write(ctx, rw, http.StatusOK, daemons)
78+
apiDaemons := make([]codersdk.ProvisionerDaemon, 0)
79+
for _, daemon := range daemons {
80+
apiDaemons = append(apiDaemons, convertProvisionerDaemon(daemon))
81+
}
82+
httpapi.Write(ctx, rw, http.StatusOK, apiDaemons)
8083
}
8184

8285
// Serves the provisioner daemon protobuf API over a WebSocket.
8386
func (api *API) provisionerDaemonServe(rw http.ResponseWriter, r *http.Request) {
84-
8587
tags := map[string]string{}
8688
if r.URL.Query().Has("tag") {
8789
for _, tag := range r.URL.Query()["tag"] {
@@ -102,13 +104,13 @@ func (api *API) provisionerDaemonServe(rw http.ResponseWriter, r *http.Request)
102104
return
103105
}
104106

105-
provisioners := map[codersdk.ProvisionerType]struct{}{}
107+
provisionersMap := map[codersdk.ProvisionerType]struct{}{}
106108
for _, provisioner := range r.URL.Query()["provisioner"] {
107109
switch provisioner {
108110
case string(codersdk.ProvisionerTypeEcho):
109-
provisioners[codersdk.ProvisionerTypeEcho] = struct{}{}
111+
provisionersMap[codersdk.ProvisionerTypeEcho] = struct{}{}
110112
case string(codersdk.ProvisionerTypeTerraform):
111-
provisioners[codersdk.ProvisionerTypeTerraform] = struct{}{}
113+
provisionersMap[codersdk.ProvisionerTypeTerraform] = struct{}{}
112114
default:
113115
httpapi.Write(r.Context(), rw, http.StatusBadRequest, codersdk.Response{
114116
Message: fmt.Sprintf("Unknown provisioner type %q", provisioner),
@@ -132,12 +134,22 @@ func (api *API) provisionerDaemonServe(rw http.ResponseWriter, r *http.Request)
132134
}
133135
}
134136

137+
provisioners := make([]database.ProvisionerType, 0)
138+
for p := range provisionersMap {
139+
switch p {
140+
case codersdk.ProvisionerTypeTerraform:
141+
provisioners = append(provisioners, database.ProvisionerTypeTerraform)
142+
case codersdk.ProvisionerTypeEcho:
143+
provisioners = append(provisioners, database.ProvisionerTypeEcho)
144+
}
145+
}
146+
135147
name := namesgenerator.GetRandomName(1)
136148
daemon, err := api.Database.InsertProvisionerDaemon(r.Context(), database.InsertProvisionerDaemonParams{
137149
ID: uuid.New(),
138150
CreatedAt: database.Now(),
139151
Name: name,
140-
Provisioners: []database.ProvisionerType{database.ProvisionerTypeEcho, database.ProvisionerTypeTerraform},
152+
Provisioners: provisioners,
141153
Tags: tags,
142154
})
143155
if err != nil {

0 commit comments

Comments
 (0)