Skip to content

Commit c9220af

Browse files
committed
wip
1 parent a85a0aa commit c9220af

File tree

2 files changed

+78
-30
lines changed

2 files changed

+78
-30
lines changed

cli/templatepush.go

Lines changed: 46 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"github.com/coder/coder/cli/clibase"
1414
"github.com/coder/coder/cli/cliui"
1515
"github.com/coder/coder/coderd/database"
16+
"github.com/coder/coder/coderd/util/ptr"
1617
"github.com/coder/coder/codersdk"
1718
"github.com/coder/coder/provisionersdk"
1819
)
@@ -116,75 +117,84 @@ func (r *RootCmd) templatePush() *clibase.Cmd {
116117
provisionerTags []string
117118
uploadFlags templateUploadFlags
118119
activate bool
120+
create bool
119121
)
120122
client := new(codersdk.Client)
121123
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)),
128135
Handler: func(inv *clibase.Invocation) error {
129136
uploadFlags.setWorkdir(workdir)
130-
131137
organization, err := CurrentOrganization(inv, client)
132138
if err != nil {
133139
return err
134140
}
135-
136141
name, err := uploadFlags.templateName(inv.Args)
137142
if err != nil {
138143
return err
139144
}
140-
141145
template, err := client.TemplateByName(inv.Context(), organization.ID, name)
142146
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+
}
143170
return err
144171
}
145-
146172
resp, err := uploadFlags.upload(inv, client)
147173
if err != nil {
148174
return err
149175
}
150-
151176
tags, err := ParseProvisionerTags(provisionerTags)
152177
if err != nil {
153178
return err
154179
}
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})
168181
if err != nil {
169182
return err
170183
}
171-
172184
if job.Job.Status != codersdk.ProvisionerJobSucceeded {
173185
return xerrors.Errorf("job failed: %s", job.Job.Status)
174186
}
175-
176187
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})
180189
if err != nil {
181190
return err
182191
}
183192
}
184-
185193
_, _ = fmt.Fprintf(inv.Stdout, "Updated version at %s!\n", cliui.DefaultStyles.DateTimeStamp.Render(time.Now().Format(time.Stamp)))
186194
return nil
187195
},
196+
HelpHandler: func(i *clibase.Invocation) error {
197+
},
188198
}
189199

190200
cmd.Options = clibase.OptionSet{
@@ -235,6 +245,12 @@ func (r *RootCmd) templatePush() *clibase.Cmd {
235245
Default: "true",
236246
Value: clibase.BoolOf(&activate),
237247
},
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+
},
238254
cliui.SkipPromptOption(),
239255
uploadFlags.option(),
240256
}

cli/templatepush_test.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,38 @@ func TestTemplatePush(t *testing.T) {
111111
require.NotEqual(t, "example", templateVersions[0].Name)
112112
})
113113

114+
t.Run("PushTemplateWithCreate", func(t *testing.T) {
115+
t.Parallel()
116+
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
117+
user := coderdtest.CreateFirstUser(t, client)
118+
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil)
119+
_ = coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
120+
121+
source := clitest.CreateTemplateVersionSource(t, &echo.Responses{
122+
Parse: echo.ParseComplete,
123+
ProvisionApply: echo.ProvisionComplete,
124+
})
125+
126+
inv, root := clitest.New(t, "templates", "push", "--create", "--directory", source, "--name", "example")
127+
clitest.SetupConfig(t, client, root)
128+
pty := ptytest.New(t).Attach(inv)
129+
130+
clitest.Start(t, inv)
131+
132+
matches := []struct {
133+
match string
134+
write string
135+
}{
136+
{match: "Upload", write: "yes"},
137+
}
138+
for _, m := range matches {
139+
pty.ExpectMatch(m.match)
140+
if len(m.write) > 0 {
141+
pty.WriteLine(m.write)
142+
}
143+
}
144+
})
145+
114146
t.Run("UseWorkingDir", func(t *testing.T) {
115147
t.Parallel()
116148

0 commit comments

Comments
 (0)