Skip to content

Commit b35b7b3

Browse files
committed
Read params from file for template/workspace creation
1 parent c034e83 commit b35b7b3

File tree

2 files changed

+71
-13
lines changed

2 files changed

+71
-13
lines changed

cli/create.go

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@ package cli
22

33
import (
44
"fmt"
5+
"io/ioutil"
56
"time"
67

78
"github.com/spf13/cobra"
89
"golang.org/x/exp/slices"
910
"golang.org/x/xerrors"
11+
"gopkg.in/yaml.v3"
1012

1113
"github.com/coder/coder/cli/cliflag"
1214
"github.com/coder/coder/cli/cliui"
@@ -18,6 +20,7 @@ func create() *cobra.Command {
1820
var (
1921
workspaceName string
2022
templateName string
23+
parameterFile string
2124
)
2225
cmd := &cobra.Command{
2326
Annotations: workspaceCommand,
@@ -117,23 +120,49 @@ func create() *cobra.Command {
117120
return err
118121
}
119122

120-
printed := false
123+
parameterValues := make(map[string]string)
124+
125+
if parameterFile != "" {
126+
parameterFileContents, err := ioutil.ReadFile(parameterFile)
127+
128+
if err != nil {
129+
return err
130+
}
131+
132+
err = yaml.Unmarshal(parameterFileContents, &parameterValues)
133+
134+
if err != nil {
135+
return err
136+
}
137+
}
138+
139+
disclaimerPrinted := false
121140
parameters := make([]codersdk.CreateParameterRequest, 0)
122141
for _, parameterSchema := range parameterSchemas {
123142
if !parameterSchema.AllowOverrideSource {
124143
continue
125144
}
126-
if !printed {
145+
if !disclaimerPrinted {
127146
_, _ = fmt.Fprintln(cmd.OutOrStdout(), cliui.Styles.Paragraph.Render("This template has customizable parameters. Values can be changed after create, but may have unintended side effects (like data loss).")+"\r\n")
128-
printed = true
147+
disclaimerPrinted = true
129148
}
130-
value, err := cliui.ParameterSchema(cmd, parameterSchema)
149+
150+
var parameterValue string
151+
if parameterFile != "" {
152+
if parameterValues[parameterSchema.Name] == "" {
153+
return xerrors.Errorf("Parameter value absent in parameter file for %q!", parameterSchema.Name)
154+
}
155+
parameterValue = parameterValues[parameterSchema.Name]
156+
} else {
157+
parameterValue, err = cliui.ParameterSchema(cmd, parameterSchema)
158+
}
159+
131160
if err != nil {
132161
return err
133162
}
134163
parameters = append(parameters, codersdk.CreateParameterRequest{
135164
Name: parameterSchema.Name,
136-
SourceValue: value,
165+
SourceValue: parameterValue,
137166
SourceScheme: database.ParameterSourceSchemeData,
138167
DestinationScheme: parameterSchema.DefaultDestinationScheme,
139168
})
@@ -195,5 +224,6 @@ func create() *cobra.Command {
195224
}
196225

197226
cliflag.StringVarP(cmd.Flags(), &templateName, "template", "t", "CODER_TEMPLATE_NAME", "", "Specify a template name.")
227+
cliflag.StringVarP(cmd.Flags(), &parameterFile, "parameter-file", "", "CODER_PARAMETER_FILE", "", "Specify a file path with parameter values.")
198228
return cmd
199229
}

cli/templatecreate.go

Lines changed: 36 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package cli
22

33
import (
44
"fmt"
5+
"io/ioutil"
56
"os"
67
"path/filepath"
78
"sort"
@@ -11,6 +12,7 @@ import (
1112
"github.com/briandowns/spinner"
1213
"github.com/spf13/cobra"
1314
"golang.org/x/xerrors"
15+
"gopkg.in/yaml.v3"
1416

1517
"github.com/coder/coder/cli/cliui"
1618
"github.com/coder/coder/coderd/database"
@@ -21,9 +23,10 @@ import (
2123

2224
func templateCreate() *cobra.Command {
2325
var (
24-
yes bool
25-
directory string
26-
provisioner string
26+
yes bool
27+
directory string
28+
provisioner string
29+
parameterFile string
2730
)
2831
cmd := &cobra.Command{
2932
Use: "create [name]",
@@ -79,7 +82,7 @@ func templateCreate() *cobra.Command {
7982
}
8083
spin.Stop()
8184

82-
job, parameters, err := createValidTemplateVersion(cmd, client, organization, database.ProvisionerType(provisioner), resp.Hash)
85+
job, parameters, err := createValidTemplateVersion(cmd, client, organization, database.ProvisionerType(provisioner), resp.Hash, parameterFile)
8386
if err != nil {
8487
return err
8588
}
@@ -116,6 +119,7 @@ func templateCreate() *cobra.Command {
116119
currentDirectory, _ := os.Getwd()
117120
cmd.Flags().StringVarP(&directory, "directory", "d", currentDirectory, "Specify the directory to create from")
118121
cmd.Flags().StringVarP(&provisioner, "test.provisioner", "", "terraform", "Customize the provisioner backend")
122+
cmd.Flags().StringVarP(&parameterFile, "parameter-file", "", "", "Specify a file path with parameter values.")
119123
// This is for testing!
120124
err := cmd.Flags().MarkHidden("test.provisioner")
121125
if err != nil {
@@ -125,7 +129,7 @@ func templateCreate() *cobra.Command {
125129
return cmd
126130
}
127131

128-
func createValidTemplateVersion(cmd *cobra.Command, client *codersdk.Client, organization codersdk.Organization, provisioner database.ProvisionerType, hash string, parameters ...codersdk.CreateParameterRequest) (*codersdk.TemplateVersion, []codersdk.CreateParameterRequest, error) {
132+
func createValidTemplateVersion(cmd *cobra.Command, client *codersdk.Client, organization codersdk.Organization, provisioner database.ProvisionerType, hash string, parameterFile string, parameters ...codersdk.CreateParameterRequest) (*codersdk.TemplateVersion, []codersdk.CreateParameterRequest, error) {
129133
before := time.Now()
130134
version, err := client.CreateTemplateVersion(cmd.Context(), organization.ID, codersdk.CreateTemplateVersionRequest{
131135
StorageMethod: database.ProvisionerStorageMethodFile,
@@ -184,20 +188,44 @@ func createValidTemplateVersion(cmd *cobra.Command, client *codersdk.Client, org
184188
missingSchemas = append(missingSchemas, parameterSchema)
185189
}
186190
_, _ = fmt.Fprintln(cmd.OutOrStdout(), cliui.Styles.Paragraph.Render("This template has required variables! They are scoped to the template, and not viewable after being set.")+"\r\n")
191+
192+
parameterValuesFromFile := make(map[string]string)
193+
if parameterFile != "" {
194+
_, _ = fmt.Fprintln(cmd.OutOrStdout(), cliui.Styles.Paragraph.Render("Attempting to read the variables from the parameter file.")+"\r\n")
195+
parameterFileContents, err := ioutil.ReadFile(parameterFile)
196+
197+
if err != nil {
198+
return nil, nil, err
199+
}
200+
201+
err = yaml.Unmarshal(parameterFileContents, &parameterValuesFromFile)
202+
203+
if err != nil {
204+
return nil, nil, err
205+
}
206+
}
187207
for _, parameterSchema := range missingSchemas {
188-
value, err := cliui.ParameterSchema(cmd, parameterSchema)
208+
var parameterValue string
209+
if parameterFile != "" {
210+
if parameterValuesFromFile[parameterSchema.Name] == "" {
211+
return nil, nil, xerrors.Errorf("Required parameter value absent in parameter file for %q!", parameterSchema.Name)
212+
}
213+
parameterValue = parameterValuesFromFile[parameterSchema.Name]
214+
} else {
215+
parameterValue, err = cliui.ParameterSchema(cmd, parameterSchema)
216+
}
189217
if err != nil {
190218
return nil, nil, err
191219
}
192220
parameters = append(parameters, codersdk.CreateParameterRequest{
193221
Name: parameterSchema.Name,
194-
SourceValue: value,
222+
SourceValue: parameterValue,
195223
SourceScheme: database.ParameterSourceSchemeData,
196224
DestinationScheme: parameterSchema.DefaultDestinationScheme,
197225
})
198226
_, _ = fmt.Fprintln(cmd.OutOrStdout())
199227
}
200-
return createValidTemplateVersion(cmd, client, organization, provisioner, hash, parameters...)
228+
return createValidTemplateVersion(cmd, client, organization, provisioner, hash, parameterFile, parameters...)
201229
}
202230

203231
if version.Job.Status != codersdk.ProvisionerJobSucceeded {

0 commit comments

Comments
 (0)