@@ -13,6 +13,7 @@ import (
13
13
"github.com/coder/coder/cli/clibase"
14
14
"github.com/coder/coder/cli/cliui"
15
15
"github.com/coder/coder/coderd/database"
16
+ "github.com/coder/coder/coderd/util/ptr"
16
17
"github.com/coder/coder/codersdk"
17
18
"github.com/coder/coder/provisionersdk"
18
19
)
@@ -116,75 +117,84 @@ func (r *RootCmd) templatePush() *clibase.Cmd {
116
117
provisionerTags []string
117
118
uploadFlags templateUploadFlags
118
119
activate bool
120
+ create bool
119
121
)
120
122
client := new (codersdk.Client )
121
123
cmd := & clibase.Cmd {
122
- Use : "push [template]" ,
123
- Short : "Push a new template version from the current directory or as specified by flag" ,
124
- Middleware : clibase .Chain (
125
- clibase .RequireRangeArgs (0 , 1 ),
126
- r .InitClient (client ),
127
- ),
124
+ Parent : & clibase.Cmd {},
125
+ Children : []* clibase.Cmd {},
126
+ Use : "push [template]" ,
127
+ Aliases : []string {},
128
+ Short : "Push a new template version from the current directory or as specified by flag" ,
129
+ Hidden : false ,
130
+ RawArgs : false ,
131
+ Long : "" ,
132
+ Options : []clibase.Option {},
133
+ Annotations : map [string ]string {},
134
+ Middleware : clibase .Chain (clibase .RequireRangeArgs (0 , 1 ), r .InitClient (client )),
128
135
Handler : func (inv * clibase.Invocation ) error {
129
136
uploadFlags .setWorkdir (workdir )
130
-
131
137
organization , err := CurrentOrganization (inv , client )
132
138
if err != nil {
133
139
return err
134
140
}
135
-
136
141
name , err := uploadFlags .templateName (inv .Args )
137
142
if err != nil {
138
143
return err
139
144
}
140
-
141
145
template , err := client .TemplateByName (inv .Context (), organization .ID , name )
142
146
if err != nil {
147
+ if create {
148
+ resp , err := uploadFlags .upload (inv , client )
149
+ if err != nil {
150
+ return err
151
+ }
152
+ tags , err := ParseProvisionerTags (provisionerTags )
153
+ if err != nil {
154
+ return err
155
+ }
156
+ job , err := createValidTemplateVersion (inv , createValidTemplateVersionArgs {Client : client , Organization : organization , Provisioner : database .ProvisionerType (provisioner ), FileID : resp .ID , ProvisionerTags : tags , VariablesFile : variablesFile , Variables : variables })
157
+ if err != nil {
158
+ return err
159
+ }
160
+ defaultTTL := 24 * time .Hour
161
+ failureTTL := 0 * time .Hour
162
+ inactivityTTL := 0 * time .Hour
163
+ disableEveryone := false
164
+ createReq := codersdk.CreateTemplateRequest {Name : name , VersionID : job .ID , DefaultTTLMillis : ptr .Ref (defaultTTL .Milliseconds ()), FailureTTLMillis : ptr .Ref (failureTTL .Milliseconds ()), InactivityTTLMillis : ptr .Ref (inactivityTTL .Milliseconds ()), DisableEveryoneGroupAccess : disableEveryone }
165
+ template , err = client .CreateTemplate (inv .Context (), organization .ID , createReq )
166
+ if err != nil {
167
+ return err
168
+ }
169
+ }
143
170
return err
144
171
}
145
-
146
172
resp , err := uploadFlags .upload (inv , client )
147
173
if err != nil {
148
174
return err
149
175
}
150
-
151
176
tags , err := ParseProvisionerTags (provisionerTags )
152
177
if err != nil {
153
178
return err
154
179
}
155
-
156
- job , err := createValidTemplateVersion (inv , createValidTemplateVersionArgs {
157
- Name : versionName ,
158
- Client : client ,
159
- Organization : organization ,
160
- Provisioner : database .ProvisionerType (provisioner ),
161
- FileID : resp .ID ,
162
- VariablesFile : variablesFile ,
163
- Variables : variables ,
164
- Template : & template ,
165
- ReuseParameters : ! alwaysPrompt ,
166
- ProvisionerTags : tags ,
167
- })
180
+ job , err := createValidTemplateVersion (inv , createValidTemplateVersionArgs {Name : versionName , Client : client , Organization : organization , Provisioner : database .ProvisionerType (provisioner ), FileID : resp .ID , VariablesFile : variablesFile , Variables : variables , Template : & template , ReuseParameters : ! alwaysPrompt , ProvisionerTags : tags })
168
181
if err != nil {
169
182
return err
170
183
}
171
-
172
184
if job .Job .Status != codersdk .ProvisionerJobSucceeded {
173
185
return xerrors .Errorf ("job failed: %s" , job .Job .Status )
174
186
}
175
-
176
187
if activate {
177
- err = client .UpdateActiveTemplateVersion (inv .Context (), template .ID , codersdk.UpdateActiveTemplateVersion {
178
- ID : job .ID ,
179
- })
188
+ err = client .UpdateActiveTemplateVersion (inv .Context (), template .ID , codersdk.UpdateActiveTemplateVersion {ID : job .ID })
180
189
if err != nil {
181
190
return err
182
191
}
183
192
}
184
-
185
193
_ , _ = fmt .Fprintf (inv .Stdout , "Updated version at %s!\n " , cliui .DefaultStyles .DateTimeStamp .Render (time .Now ().Format (time .Stamp )))
186
194
return nil
187
195
},
196
+ HelpHandler : func (i * clibase.Invocation ) error {
197
+ },
188
198
}
189
199
190
200
cmd .Options = clibase.OptionSet {
@@ -235,6 +245,12 @@ func (r *RootCmd) templatePush() *clibase.Cmd {
235
245
Default : "true" ,
236
246
Value : clibase .BoolOf (& activate ),
237
247
},
248
+ {
249
+ Flag : "create" ,
250
+ Description : "Create a new template if one does not already exist." ,
251
+ Default : "false" ,
252
+ Value : clibase .BoolOf (& create ),
253
+ },
238
254
cliui .SkipPromptOption (),
239
255
uploadFlags .option (),
240
256
}
0 commit comments