@@ -2,6 +2,7 @@ package cli
2
2
3
3
import (
4
4
"fmt"
5
+ "io/ioutil"
5
6
"os"
6
7
"path/filepath"
7
8
"sort"
@@ -11,6 +12,7 @@ import (
11
12
"github.com/briandowns/spinner"
12
13
"github.com/spf13/cobra"
13
14
"golang.org/x/xerrors"
15
+ "gopkg.in/yaml.v3"
14
16
15
17
"github.com/coder/coder/cli/cliui"
16
18
"github.com/coder/coder/coderd/database"
@@ -21,9 +23,10 @@ import (
21
23
22
24
func templateCreate ()* cobra.Command {
23
25
var (
24
- yes bool
25
- directory string
26
- provisioner string
26
+ yes bool
27
+ directory string
28
+ provisioner string
29
+ parameterFile string
27
30
)
28
31
cmd := & cobra.Command {
29
32
Use :"create [name]" ,
@@ -79,7 +82,7 @@ func templateCreate() *cobra.Command {
79
82
}
80
83
spin .Stop ()
81
84
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 )
83
86
if err != nil {
84
87
return err
85
88
}
@@ -116,6 +119,7 @@ func templateCreate() *cobra.Command {
116
119
currentDirectory ,_ := os .Getwd ()
117
120
cmd .Flags ().StringVarP (& directory ,"directory" ,"d" ,currentDirectory ,"Specify the directory to create from" )
118
121
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." )
119
123
// This is for testing!
120
124
err := cmd .Flags ().MarkHidden ("test.provisioner" )
121
125
if err != nil {
@@ -125,7 +129,7 @@ func templateCreate() *cobra.Command {
125
129
return cmd
126
130
}
127
131
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 ) {
129
133
before := time .Now ()
130
134
version ,err := client .CreateTemplateVersion (cmd .Context (),organization .ID , codersdk.CreateTemplateVersionRequest {
131
135
StorageMethod :database .ProvisionerStorageMethodFile ,
@@ -184,20 +188,44 @@ func createValidTemplateVersion(cmd *cobra.Command, client *codersdk.Client, org
184
188
missingSchemas = append (missingSchemas ,parameterSchema )
185
189
}
186
190
_ ,_ = 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
+ }
187
207
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
+ }
189
217
if err != nil {
190
218
return nil ,nil ,err
191
219
}
192
220
parameters = append (parameters , codersdk.CreateParameterRequest {
193
221
Name :parameterSchema .Name ,
194
- SourceValue :value ,
222
+ SourceValue :parameterValue ,
195
223
SourceScheme :database .ParameterSourceSchemeData ,
196
224
DestinationScheme :parameterSchema .DefaultDestinationScheme ,
197
225
})
198
226
_ ,_ = fmt .Fprintln (cmd .OutOrStdout ())
199
227
}
200
- return createValidTemplateVersion (cmd ,client ,organization ,provisioner ,hash ,parameters ... )
228
+ return createValidTemplateVersion (cmd ,client ,organization ,provisioner ,hash ,parameterFile , parameters ... )
201
229
}
202
230
203
231
if version .Job .Status != codersdk .ProvisionerJobSucceeded {