From 64729fd105f9d906da323865790a6119b6d82ebb Mon Sep 17 00:00:00 2001 From: Kyle Carberry Date: Fri, 23 Sep 2022 21:27:36 +0000 Subject: [PATCH] feat: Add custom version names Fixes #4137. --- cli/templatecreate.go | 2 ++ cli/templatepush.go | 3 +++ cli/templatepush_test.go | 3 ++- coderd/templateversions.go | 6 +++++- coderd/templateversions_test.go | 4 +++- codersdk/organizations.go | 1 + site/src/api/typesGenerated.ts | 1 + 7 files changed, 17 insertions(+), 3 deletions(-) diff --git a/cli/templatecreate.go b/cli/templatecreate.go index ef776754ad409..a0f4014f712f0 100644 --- a/cli/templatecreate.go +++ b/cli/templatecreate.go @@ -144,6 +144,7 @@ func templateCreate() *cobra.Command { } type createValidTemplateVersionArgs struct { + Name string Client *codersdk.Client Organization codersdk.Organization Provisioner database.ProvisionerType @@ -162,6 +163,7 @@ func createValidTemplateVersion(cmd *cobra.Command, args createValidTemplateVers client := args.Client req := codersdk.CreateTemplateVersionRequest{ + Name: args.Name, StorageMethod: codersdk.ProvisionerStorageMethodFile, StorageSource: args.FileHash, Provisioner: codersdk.ProvisionerType(args.Provisioner), diff --git a/cli/templatepush.go b/cli/templatepush.go index ccc6e800b01d4..f858c6daecb0d 100644 --- a/cli/templatepush.go +++ b/cli/templatepush.go @@ -19,6 +19,7 @@ import ( func templatePush() *cobra.Command { var ( directory string + versionName string provisioner string parameterFile string alwaysPrompt bool @@ -75,6 +76,7 @@ func templatePush() *cobra.Command { spin.Stop() job, _, err := createValidTemplateVersion(cmd, createValidTemplateVersionArgs{ + Name: versionName, Client: client, Organization: organization, Provisioner: database.ProvisionerType(provisioner), @@ -107,6 +109,7 @@ func templatePush() *cobra.Command { cmd.Flags().StringVarP(&directory, "directory", "d", currentDirectory, "Specify the directory to create from") cmd.Flags().StringVarP(&provisioner, "test.provisioner", "", "terraform", "Customize the provisioner backend") cmd.Flags().StringVarP(¶meterFile, "parameter-file", "", "", "Specify a file path with parameter values.") + cmd.Flags().StringVarP(&versionName, "name", "", "", "Specify a name for the new template version. It will be automatically generated if not provided.") cmd.Flags().BoolVar(&alwaysPrompt, "always-prompt", false, "Always prompt all parameters. Does not pull parameter values from active template version") cliui.AllowSkipPrompt(cmd) // This is for testing! diff --git a/cli/templatepush_test.go b/cli/templatepush_test.go index e94921dd9dc12..a372fb987e1ce 100644 --- a/cli/templatepush_test.go +++ b/cli/templatepush_test.go @@ -122,7 +122,7 @@ func TestTemplatePush(t *testing.T) { Parse: echo.ParseComplete, Provision: echo.ProvisionComplete, }) - cmd, root := clitest.New(t, "templates", "push", template.Name, "--directory", source, "--test.provisioner", string(database.ProvisionerTypeEcho)) + cmd, root := clitest.New(t, "templates", "push", template.Name, "--directory", source, "--test.provisioner", string(database.ProvisionerTypeEcho), "--name", "example") clitest.SetupConfig(t, client, root) pty := ptytest.New(t) cmd.SetIn(pty.Input()) @@ -153,6 +153,7 @@ func TestTemplatePush(t *testing.T) { require.NoError(t, err) assert.Len(t, templateVersions, 2) assert.NotEqual(t, template.ActiveVersionID, templateVersions[1].ID) + require.Equal(t, "example", templateVersions[1].Name) }) t.Run("UseWorkingDir", func(t *testing.T) { diff --git a/coderd/templateversions.go b/coderd/templateversions.go index 54820b49eacf7..a8c658f8bd608 100644 --- a/coderd/templateversions.go +++ b/coderd/templateversions.go @@ -791,13 +791,17 @@ func (api *API) postTemplateVersionsByOrganization(rw http.ResponseWriter, r *ht } } + if req.Name == "" { + req.Name = namesgenerator.GetRandomName(1) + } + templateVersion, err = db.InsertTemplateVersion(ctx, database.InsertTemplateVersionParams{ ID: uuid.New(), TemplateID: templateID, OrganizationID: organization.ID, CreatedAt: database.Now(), UpdatedAt: database.Now(), - Name: namesgenerator.GetRandomName(1), + Name: req.Name, Readme: "", JobID: provisionerJob.ID, CreatedBy: uuid.NullUUID{ diff --git a/coderd/templateversions_test.go b/coderd/templateversions_test.go index b78dd79ae9ba1..f51d7c2c46925 100644 --- a/coderd/templateversions_test.go +++ b/coderd/templateversions_test.go @@ -93,7 +93,8 @@ func TestPostTemplateVersionsByOrganization(t *testing.T) { file, err := client.Upload(ctx, codersdk.ContentTypeTar, data) require.NoError(t, err) - _, err = client.CreateTemplateVersion(ctx, user.OrganizationID, codersdk.CreateTemplateVersionRequest{ + version, err := client.CreateTemplateVersion(ctx, user.OrganizationID, codersdk.CreateTemplateVersionRequest{ + Name: "bananas", StorageMethod: codersdk.ProvisionerStorageMethodFile, StorageSource: file.Hash, Provisioner: codersdk.ProvisionerTypeEcho, @@ -105,6 +106,7 @@ func TestPostTemplateVersionsByOrganization(t *testing.T) { }}, }) require.NoError(t, err) + require.Equal(t, "bananas", version.Name) require.Len(t, auditor.AuditLogs, 1) assert.Equal(t, database.AuditActionCreate, auditor.AuditLogs[0].Action) diff --git a/codersdk/organizations.go b/codersdk/organizations.go index a3ef0a7a000e3..187aba8018a99 100644 --- a/codersdk/organizations.go +++ b/codersdk/organizations.go @@ -34,6 +34,7 @@ type Organization struct { // CreateTemplateVersionRequest enables callers to create a new Template Version. type CreateTemplateVersionRequest struct { + Name string `json:"name,omitempty" validate:"omitempty,template_name"` // TemplateID optionally associates a version with a template. TemplateID uuid.UUID `json:"template_id,omitempty"` diff --git a/site/src/api/typesGenerated.ts b/site/src/api/typesGenerated.ts index bf8476e60d1ba..c81b84efac2a6 100644 --- a/site/src/api/typesGenerated.ts +++ b/site/src/api/typesGenerated.ts @@ -185,6 +185,7 @@ export interface CreateTemplateVersionDryRunRequest { // From codersdk/organizations.go export interface CreateTemplateVersionRequest { + readonly name?: string readonly template_id?: string readonly storage_method: ProvisionerStorageMethod readonly storage_source: string