Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 3b7b96a

Browse files
authored
feat: Expose managed variables via API (#6134)
* WIP * hcl * useManagedVariables * fix * Fix * Fix * fix * go:build * Fix * fix: bool flag * Insert template variables * API * fix * Expose via API * More wiring * CLI for testing purposes * WIP * Delete FIXME * planVars * WIP * WIP * UserVariableValues * no dry run * Dry run * Done FIXME * Fix * Fix: CLI * Fix: migration * API tests * Test info * Tests * More tests * fix: lint * Fix: authz * Address PR comments * Fix * fix * fix
1 parent f0f39b4 commit 3b7b96a

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+2412
-656
lines changed

cli/templatecreate.go

+15-6
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ type createValidTemplateVersionArgs struct {
133133
Provisioner database.ProvisionerType
134134
FileID uuid.UUID
135135
ParameterFile string
136+
ValuesFile string
136137
// Template is only required if updating a template's active version.
137138
Template *codersdk.Template
138139
// ReuseParameters will attempt to reuse params from the Template field
@@ -145,13 +146,21 @@ type createValidTemplateVersionArgs struct {
145146
func createValidTemplateVersion(cmd *cobra.Command, args createValidTemplateVersionArgs, parameters ...codersdk.CreateParameterRequest) (*codersdk.TemplateVersion, []codersdk.CreateParameterRequest, error) {
146147
client := args.Client
147148

149+
// FIXME(mtojek): I will iterate on CLI experience in the follow-up.
150+
// see: https://github.com/coder/coder/issues/5980
151+
variableValues, err := loadVariableValues(args.ValuesFile)
152+
if err != nil {
153+
return nil, nil, err
154+
}
155+
148156
req := codersdk.CreateTemplateVersionRequest{
149-
Name: args.Name,
150-
StorageMethod: codersdk.ProvisionerStorageMethodFile,
151-
FileID: args.FileID,
152-
Provisioner: codersdk.ProvisionerType(args.Provisioner),
153-
ParameterValues: parameters,
154-
ProvisionerTags: args.ProvisionerTags,
157+
Name: args.Name,
158+
StorageMethod: codersdk.ProvisionerStorageMethodFile,
159+
FileID: args.FileID,
160+
Provisioner: codersdk.ProvisionerType(args.Provisioner),
161+
ParameterValues: parameters,
162+
ProvisionerTags: args.ProvisionerTags,
163+
UserVariableValues: variableValues,
155164
}
156165
if args.Template != nil {
157166
req.TemplateID = args.Template.ID

cli/templatepush.go

+3
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ func templatePush() *cobra.Command {
9393
versionName string
9494
provisioner string
9595
parameterFile string
96+
valuesFile string
9697
alwaysPrompt bool
9798
provisionerTags []string
9899
uploadFlags templateUploadFlags
@@ -139,6 +140,7 @@ func templatePush() *cobra.Command {
139140
Provisioner: database.ProvisionerType(provisioner),
140141
FileID: resp.ID,
141142
ParameterFile: parameterFile,
143+
ValuesFile: valuesFile,
142144
Template: &template,
143145
ReuseParameters: !alwaysPrompt,
144146
ProvisionerTags: tags,
@@ -165,6 +167,7 @@ func templatePush() *cobra.Command {
165167

166168
cmd.Flags().StringVarP(&provisioner, "test.provisioner", "", "terraform", "Customize the provisioner backend")
167169
cmd.Flags().StringVarP(&parameterFile, "parameter-file", "", "", "Specify a file path with parameter values.")
170+
cmd.Flags().StringVarP(&valuesFile, "values-file", "", "", "Specify a file path with values for managed variables.")
168171
cmd.Flags().StringVarP(&versionName, "name", "", "", "Specify a name for the new template version. It will be automatically generated if not provided.")
169172
cmd.Flags().StringArrayVarP(&provisionerTags, "provisioner-tag", "", []string{}, "Specify a set of tags to target provisioner daemons.")
170173
cmd.Flags().BoolVar(&alwaysPrompt, "always-prompt", false, "Always prompt all parameters. Does not pull parameter values from active template version")

cli/templatevariables.go

+50
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package cli
2+
3+
import (
4+
"os"
5+
6+
"golang.org/x/xerrors"
7+
"gopkg.in/yaml.v3"
8+
9+
"github.com/coder/coder/codersdk"
10+
)
11+
12+
func loadVariableValues(variablesFile string) ([]codersdk.VariableValue, error) {
13+
var values []codersdk.VariableValue
14+
if variablesFile == "" {
15+
return values, nil
16+
}
17+
18+
variablesMap, err := createVariablesMapFromFile(variablesFile)
19+
if err != nil {
20+
return nil, err
21+
}
22+
23+
for name, value := range variablesMap {
24+
values = append(values, codersdk.VariableValue{
25+
Name: name,
26+
Value: value,
27+
})
28+
}
29+
return values, nil
30+
}
31+
32+
// Reads a YAML file and populates a string -> string map.
33+
// Throws an error if the file name is empty.
34+
func createVariablesMapFromFile(variablesFile string) (map[string]string, error) {
35+
if variablesFile == "" {
36+
return nil, xerrors.Errorf("variable file name is not specified")
37+
}
38+
39+
variablesMap := make(map[string]string)
40+
variablesFileContents, err := os.ReadFile(variablesFile)
41+
if err != nil {
42+
return nil, err
43+
}
44+
45+
err = yaml.Unmarshal(variablesFileContents, &variablesMap)
46+
if err != nil {
47+
return nil, err
48+
}
49+
return variablesMap, nil
50+
}

cli/testdata/coder_templates_push_--help.golden

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ Flags:
1313
automatically generated if not provided.
1414
--parameter-file string Specify a file path with parameter values.
1515
--provisioner-tag stringArray Specify a set of tags to target provisioner daemons.
16+
--values-file string Specify a file path with values for managed variables.
1617
-y, --yes Bypass prompts
1718

1819
Global Flags:

coderd/apidoc/docs.go

+86
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/apidoc/swagger.json

+78
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/autobuild/executor/lifecycle_executor.go

+3-4
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"github.com/coder/coder/coderd/autobuild/schedule"
1414
"github.com/coder/coder/coderd/database"
1515
"github.com/coder/coder/coderd/database/dbauthz"
16+
"github.com/coder/coder/coderd/provisionerdserver"
1617
)
1718

1819
// Executor automatically starts or stops workspaces.
@@ -249,10 +250,8 @@ func build(ctx context.Context, store database.Store, workspace database.Workspa
249250
// This must happen in a transaction to ensure history can be inserted, and
250251
// the prior history can update it's "after" column to point at the new.
251252
workspaceBuildID := uuid.New()
252-
input, err := json.Marshal(struct {
253-
WorkspaceBuildID string `json:"workspace_build_id"`
254-
}{
255-
WorkspaceBuildID: workspaceBuildID.String(),
253+
input, err := json.Marshal(provisionerdserver.WorkspaceProvisionJob{
254+
WorkspaceBuildID: workspaceBuildID,
256255
})
257256
if err != nil {
258257
return xerrors.Errorf("marshal provision job: %w", err)

coderd/coderd.go

+1
Original file line numberDiff line numberDiff line change
@@ -479,6 +479,7 @@ func New(options *Options) *API {
479479
r.Get("/schema", api.templateVersionSchema)
480480
r.Get("/parameters", api.templateVersionParameters)
481481
r.Get("/rich-parameters", api.templateVersionRichParameters)
482+
r.Get("/variables", api.templateVersionVariables)
482483
r.Get("/resources", api.templateVersionResources)
483484
r.Get("/logs", api.templateVersionLogs)
484485
r.Route("/dry-run", func(r chi.Router) {

coderd/coderdtest/coderdtest.go

+9-3
Original file line numberDiff line numberDiff line change
@@ -522,17 +522,23 @@ func createAnotherUserRetry(t *testing.T, client *codersdk.Client, organizationI
522522
// CreateTemplateVersion creates a template import provisioner job
523523
// with the responses provided. It uses the "echo" provisioner for compatibility
524524
// with testing.
525-
func CreateTemplateVersion(t *testing.T, client *codersdk.Client, organizationID uuid.UUID, res *echo.Responses) codersdk.TemplateVersion {
525+
func CreateTemplateVersion(t *testing.T, client *codersdk.Client, organizationID uuid.UUID, res *echo.Responses, mutators ...func(*codersdk.CreateTemplateVersionRequest)) codersdk.TemplateVersion {
526526
t.Helper()
527527
data, err := echo.Tar(res)
528528
require.NoError(t, err)
529529
file, err := client.Upload(context.Background(), codersdk.ContentTypeTar, bytes.NewReader(data))
530530
require.NoError(t, err)
531-
templateVersion, err := client.CreateTemplateVersion(context.Background(), organizationID, codersdk.CreateTemplateVersionRequest{
531+
532+
req := codersdk.CreateTemplateVersionRequest{
532533
FileID: file.ID,
533534
StorageMethod: codersdk.ProvisionerStorageMethodFile,
534535
Provisioner: codersdk.ProvisionerTypeEcho,
535-
})
536+
}
537+
for _, mut := range mutators {
538+
mut(&req)
539+
}
540+
541+
templateVersion, err := client.CreateTemplateVersion(context.Background(), organizationID, req)
536542
require.NoError(t, err)
537543
return templateVersion
538544
}

0 commit comments

Comments
 (0)