From 77dbe0b150e3ac048b8402f88b35cadde97f0f2e Mon Sep 17 00:00:00 2001 From: Mathias Fredriksson Date: Thu, 6 Jul 2023 10:48:16 +0000 Subject: [PATCH 01/10] add migrations --- coderd/database/dump.sql | 5 +++- ...0135_add_template_version_message.down.sql | 1 + ...000135_add_template_version_message.up.sql | 3 ++ coderd/database/models.go | 2 ++ coderd/database/queries.sql.go | 30 +++++++++++++------ coderd/database/queries/templateversions.sql | 3 +- docs/admin/audit-logs.md | 2 +- enterprise/audit/table.go | 1 + 8 files changed, 35 insertions(+), 12 deletions(-) create mode 100644 coderd/database/migrations/000135_add_template_version_message.down.sql create mode 100644 coderd/database/migrations/000135_add_template_version_message.up.sql diff --git a/coderd/database/dump.sql b/coderd/database/dump.sql index e0dabbb574e3a..fe762689ecd00 100644 --- a/coderd/database/dump.sql +++ b/coderd/database/dump.sql @@ -536,11 +536,14 @@ CREATE TABLE template_versions ( readme character varying(1048576) NOT NULL, job_id uuid NOT NULL, created_by uuid NOT NULL, - git_auth_providers text[] + git_auth_providers text[], + message text DEFAULT ''::text NOT NULL ); COMMENT ON COLUMN template_versions.git_auth_providers IS 'IDs of Git auth providers for a specific template version'; +COMMENT ON COLUMN template_versions.message IS 'Message describing the changes in this version of the template, similar to a Git commit message. Like a commit message, this should be a short, high-level description of the changes in this version of the template. This message is immutable and should not be updated after the fact.'; + CREATE TABLE templates ( id uuid NOT NULL, created_at timestamp with time zone NOT NULL, diff --git a/coderd/database/migrations/000135_add_template_version_message.down.sql b/coderd/database/migrations/000135_add_template_version_message.down.sql new file mode 100644 index 0000000000000..39be7b7995a56 --- /dev/null +++ b/coderd/database/migrations/000135_add_template_version_message.down.sql @@ -0,0 +1 @@ +ALTER TABLE template_versions DROP COLUMN message; diff --git a/coderd/database/migrations/000135_add_template_version_message.up.sql b/coderd/database/migrations/000135_add_template_version_message.up.sql new file mode 100644 index 0000000000000..b2eaa9cc918c1 --- /dev/null +++ b/coderd/database/migrations/000135_add_template_version_message.up.sql @@ -0,0 +1,3 @@ +ALTER TABLE template_versions ADD COLUMN message text NOT NULL DEFAULT ''; + +COMMENT ON COLUMN template_versions.message IS 'Message describing the changes in this version of the template, similar to a Git commit message. Like a commit message, this should be a short, high-level description of the changes in this version of the template. This message is immutable and should not be updated after the fact.'; diff --git a/coderd/database/models.go b/coderd/database/models.go index 7cd908f2cf5e7..1f610aea1f0ee 100644 --- a/coderd/database/models.go +++ b/coderd/database/models.go @@ -1609,6 +1609,8 @@ type TemplateVersion struct { CreatedBy uuid.UUID `db:"created_by" json:"created_by"` // IDs of Git auth providers for a specific template version GitAuthProviders []string `db:"git_auth_providers" json:"git_auth_providers"` + // Message describing the changes in this version of the template, similar to a Git commit message. Like a commit message, this should be a short, high-level description of the changes in this version of the template. This message is immutable and should not be updated after the fact. + Message string `db:"message" json:"message"` } type TemplateVersionParameter struct { diff --git a/coderd/database/queries.sql.go b/coderd/database/queries.sql.go index a2da7b831f1e1..c3edc51453f13 100644 --- a/coderd/database/queries.sql.go +++ b/coderd/database/queries.sql.go @@ -4326,7 +4326,7 @@ func (q *sqlQuerier) InsertTemplateVersionParameter(ctx context.Context, arg Ins const getPreviousTemplateVersion = `-- name: GetPreviousTemplateVersion :one SELECT - id, template_id, organization_id, created_at, updated_at, name, readme, job_id, created_by, git_auth_providers + id, template_id, organization_id, created_at, updated_at, name, readme, job_id, created_by, git_auth_providers, message FROM template_versions WHERE @@ -4361,13 +4361,14 @@ func (q *sqlQuerier) GetPreviousTemplateVersion(ctx context.Context, arg GetPrev &i.JobID, &i.CreatedBy, pq.Array(&i.GitAuthProviders), + &i.Message, ) return i, err } const getTemplateVersionByID = `-- name: GetTemplateVersionByID :one SELECT - id, template_id, organization_id, created_at, updated_at, name, readme, job_id, created_by, git_auth_providers + id, template_id, organization_id, created_at, updated_at, name, readme, job_id, created_by, git_auth_providers, message FROM template_versions WHERE @@ -4388,13 +4389,14 @@ func (q *sqlQuerier) GetTemplateVersionByID(ctx context.Context, id uuid.UUID) ( &i.JobID, &i.CreatedBy, pq.Array(&i.GitAuthProviders), + &i.Message, ) return i, err } const getTemplateVersionByJobID = `-- name: GetTemplateVersionByJobID :one SELECT - id, template_id, organization_id, created_at, updated_at, name, readme, job_id, created_by, git_auth_providers + id, template_id, organization_id, created_at, updated_at, name, readme, job_id, created_by, git_auth_providers, message FROM template_versions WHERE @@ -4415,13 +4417,14 @@ func (q *sqlQuerier) GetTemplateVersionByJobID(ctx context.Context, jobID uuid.U &i.JobID, &i.CreatedBy, pq.Array(&i.GitAuthProviders), + &i.Message, ) return i, err } const getTemplateVersionByTemplateIDAndName = `-- name: GetTemplateVersionByTemplateIDAndName :one SELECT - id, template_id, organization_id, created_at, updated_at, name, readme, job_id, created_by, git_auth_providers + id, template_id, organization_id, created_at, updated_at, name, readme, job_id, created_by, git_auth_providers, message FROM template_versions WHERE @@ -4448,13 +4451,14 @@ func (q *sqlQuerier) GetTemplateVersionByTemplateIDAndName(ctx context.Context, &i.JobID, &i.CreatedBy, pq.Array(&i.GitAuthProviders), + &i.Message, ) return i, err } const getTemplateVersionsByIDs = `-- name: GetTemplateVersionsByIDs :many SELECT - id, template_id, organization_id, created_at, updated_at, name, readme, job_id, created_by, git_auth_providers + id, template_id, organization_id, created_at, updated_at, name, readme, job_id, created_by, git_auth_providers, message FROM template_versions WHERE @@ -4481,6 +4485,7 @@ func (q *sqlQuerier) GetTemplateVersionsByIDs(ctx context.Context, ids []uuid.UU &i.JobID, &i.CreatedBy, pq.Array(&i.GitAuthProviders), + &i.Message, ); err != nil { return nil, err } @@ -4497,7 +4502,7 @@ func (q *sqlQuerier) GetTemplateVersionsByIDs(ctx context.Context, ids []uuid.UU const getTemplateVersionsByTemplateID = `-- name: GetTemplateVersionsByTemplateID :many SELECT - id, template_id, organization_id, created_at, updated_at, name, readme, job_id, created_by, git_auth_providers + id, template_id, organization_id, created_at, updated_at, name, readme, job_id, created_by, git_auth_providers, message FROM template_versions WHERE @@ -4562,6 +4567,7 @@ func (q *sqlQuerier) GetTemplateVersionsByTemplateID(ctx context.Context, arg Ge &i.JobID, &i.CreatedBy, pq.Array(&i.GitAuthProviders), + &i.Message, ); err != nil { return nil, err } @@ -4577,7 +4583,7 @@ func (q *sqlQuerier) GetTemplateVersionsByTemplateID(ctx context.Context, arg Ge } const getTemplateVersionsCreatedAfter = `-- name: GetTemplateVersionsCreatedAfter :many -SELECT id, template_id, organization_id, created_at, updated_at, name, readme, job_id, created_by, git_auth_providers FROM template_versions WHERE created_at > $1 +SELECT id, template_id, organization_id, created_at, updated_at, name, readme, job_id, created_by, git_auth_providers, message FROM template_versions WHERE created_at > $1 ` func (q *sqlQuerier) GetTemplateVersionsCreatedAfter(ctx context.Context, createdAt time.Time) ([]TemplateVersion, error) { @@ -4600,6 +4606,7 @@ func (q *sqlQuerier) GetTemplateVersionsCreatedAfter(ctx context.Context, create &i.JobID, &i.CreatedBy, pq.Array(&i.GitAuthProviders), + &i.Message, ); err != nil { return nil, err } @@ -4623,12 +4630,13 @@ INSERT INTO created_at, updated_at, "name", + message, readme, job_id, created_by ) VALUES - ($1, $2, $3, $4, $5, $6, $7, $8, $9) RETURNING id, template_id, organization_id, created_at, updated_at, name, readme, job_id, created_by, git_auth_providers + ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) RETURNING id, template_id, organization_id, created_at, updated_at, name, readme, job_id, created_by, git_auth_providers, message ` type InsertTemplateVersionParams struct { @@ -4638,6 +4646,7 @@ type InsertTemplateVersionParams struct { CreatedAt time.Time `db:"created_at" json:"created_at"` UpdatedAt time.Time `db:"updated_at" json:"updated_at"` Name string `db:"name" json:"name"` + Message string `db:"message" json:"message"` Readme string `db:"readme" json:"readme"` JobID uuid.UUID `db:"job_id" json:"job_id"` CreatedBy uuid.UUID `db:"created_by" json:"created_by"` @@ -4651,6 +4660,7 @@ func (q *sqlQuerier) InsertTemplateVersion(ctx context.Context, arg InsertTempla arg.CreatedAt, arg.UpdatedAt, arg.Name, + arg.Message, arg.Readme, arg.JobID, arg.CreatedBy, @@ -4667,6 +4677,7 @@ func (q *sqlQuerier) InsertTemplateVersion(ctx context.Context, arg InsertTempla &i.JobID, &i.CreatedBy, pq.Array(&i.GitAuthProviders), + &i.Message, ) return i, err } @@ -4679,7 +4690,7 @@ SET updated_at = $3, name = $4 WHERE - id = $1 RETURNING id, template_id, organization_id, created_at, updated_at, name, readme, job_id, created_by, git_auth_providers + id = $1 RETURNING id, template_id, organization_id, created_at, updated_at, name, readme, job_id, created_by, git_auth_providers, message ` type UpdateTemplateVersionByIDParams struct { @@ -4708,6 +4719,7 @@ func (q *sqlQuerier) UpdateTemplateVersionByID(ctx context.Context, arg UpdateTe &i.JobID, &i.CreatedBy, pq.Array(&i.GitAuthProviders), + &i.Message, ) return i, err } diff --git a/coderd/database/queries/templateversions.sql b/coderd/database/queries/templateversions.sql index 89f56ef617bcd..2245ef72fec1c 100644 --- a/coderd/database/queries/templateversions.sql +++ b/coderd/database/queries/templateversions.sql @@ -77,12 +77,13 @@ INSERT INTO created_at, updated_at, "name", + message, readme, job_id, created_by ) VALUES - ($1, $2, $3, $4, $5, $6, $7, $8, $9) RETURNING *; + ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) RETURNING *; -- name: UpdateTemplateVersionByID :one UPDATE diff --git a/docs/admin/audit-logs.md b/docs/admin/audit-logs.md index 131c9e7651aa5..454d041225385 100644 --- a/docs/admin/audit-logs.md +++ b/docs/admin/audit-logs.md @@ -17,7 +17,7 @@ We track the following resources: | GitSSHKey
create |
FieldTracked
created_atfalse
private_keytrue
public_keytrue
updated_atfalse
user_idtrue
| | License
create, delete |
FieldTracked
exptrue
idfalse
jwtfalse
uploaded_attrue
uuidtrue
| | Template
write, delete |
FieldTracked
active_version_idtrue
allow_user_autostarttrue
allow_user_autostoptrue
allow_user_cancel_workspace_jobstrue
created_atfalse
created_bytrue
default_ttltrue
deletedfalse
descriptiontrue
display_nametrue
failure_ttltrue
group_acltrue
icontrue
idtrue
inactivity_ttltrue
locked_ttltrue
max_ttltrue
nametrue
organization_idfalse
provisionertrue
updated_atfalse
user_acltrue
| -| TemplateVersion
create, write |
FieldTracked
created_atfalse
created_bytrue
git_auth_providersfalse
idtrue
job_idfalse
nametrue
organization_idfalse
readmetrue
template_idtrue
updated_atfalse
| +| TemplateVersion
create, write |
FieldTracked
created_atfalse
created_bytrue
git_auth_providersfalse
idtrue
job_idfalse
messagefalse
nametrue
organization_idfalse
readmetrue
template_idtrue
updated_atfalse
| | User
create, write, delete |
FieldTracked
avatar_urlfalse
created_atfalse
deletedtrue
emailtrue
hashed_passwordtrue
idtrue
last_seen_atfalse
login_typetrue
rbac_rolestrue
statustrue
updated_atfalse
usernametrue
| | Workspace
create, write, delete |
FieldTracked
autostart_scheduletrue
created_atfalse
deletedfalse
idtrue
last_used_atfalse
locked_attrue
nametrue
organization_idfalse
owner_idtrue
template_idtrue
ttltrue
updated_atfalse
| | WorkspaceBuild
start, stop |
FieldTracked
build_numberfalse
created_atfalse
daily_costfalse
deadlinefalse
idfalse
initiator_idfalse
job_idfalse
max_deadlinefalse
provisioner_statefalse
reasonfalse
template_version_idtrue
transitionfalse
updated_atfalse
workspace_idfalse
| diff --git a/enterprise/audit/table.go b/enterprise/audit/table.go index 139c240c9f8e1..c18a86b3b348b 100644 --- a/enterprise/audit/table.go +++ b/enterprise/audit/table.go @@ -86,6 +86,7 @@ var auditableResourcesTypes = map[any]map[string]Action{ "created_at": ActionIgnore, // Never changes, but is implicit and not helpful in a diff. "updated_at": ActionIgnore, // Changes, but is implicit and not helpful in a diff. "name": ActionTrack, + "message": ActionIgnore, // Never changes after creation. "readme": ActionTrack, "job_id": ActionIgnore, // Not helpful in a diff because jobs aren't tracked in audit logs. "created_by": ActionTrack, From f40bcc782c1539db697cc09da6eacbe8f10250d0 Mon Sep 17 00:00:00 2001 From: Mathias Fredriksson Date: Thu, 6 Jul 2023 11:30:33 +0000 Subject: [PATCH 02/10] propagate message in api response --- coderd/database/dbfake/dbfake.go | 1 + coderd/database/dbgen/dbgen.go | 1 + coderd/templateversions.go | 2 ++ coderd/templateversions_test.go | 8 +++++++- codersdk/organizations.go | 3 ++- codersdk/templateversions.go | 1 + 6 files changed, 14 insertions(+), 2 deletions(-) diff --git a/coderd/database/dbfake/dbfake.go b/coderd/database/dbfake/dbfake.go index 4561b16ee2805..5ee29d708a672 100644 --- a/coderd/database/dbfake/dbfake.go +++ b/coderd/database/dbfake/dbfake.go @@ -3932,6 +3932,7 @@ func (q *fakeQuerier) InsertTemplateVersion(_ context.Context, arg database.Inse CreatedAt: arg.CreatedAt, UpdatedAt: arg.UpdatedAt, Name: arg.Name, + Message: arg.Message, Readme: arg.Readme, JobID: arg.JobID, CreatedBy: arg.CreatedBy, diff --git a/coderd/database/dbgen/dbgen.go b/coderd/database/dbgen/dbgen.go index d10d7c04593c6..93002010d5765 100644 --- a/coderd/database/dbgen/dbgen.go +++ b/coderd/database/dbgen/dbgen.go @@ -477,6 +477,7 @@ func TemplateVersion(t testing.TB, db database.Store, orig database.TemplateVers CreatedAt: takeFirst(orig.CreatedAt, database.Now()), UpdatedAt: takeFirst(orig.UpdatedAt, database.Now()), Name: takeFirst(orig.Name, namesgenerator.GetRandomName(1)), + Message: orig.Message, Readme: takeFirst(orig.Readme, namesgenerator.GetRandomName(1)), JobID: takeFirst(orig.JobID, uuid.New()), CreatedBy: takeFirst(orig.CreatedBy, uuid.New()), diff --git a/coderd/templateversions.go b/coderd/templateversions.go index df5ae1793ed8b..666780cafd00c 100644 --- a/coderd/templateversions.go +++ b/coderd/templateversions.go @@ -1306,6 +1306,7 @@ func (api *API) postTemplateVersionsByOrganization(rw http.ResponseWriter, r *ht CreatedAt: database.Now(), UpdatedAt: database.Now(), Name: req.Name, + Message: req.Message, Readme: "", JobID: provisionerJob.ID, CreatedBy: apiKey.UserID, @@ -1420,6 +1421,7 @@ func convertTemplateVersion(version database.TemplateVersion, job codersdk.Provi CreatedAt: version.CreatedAt, UpdatedAt: version.UpdatedAt, Name: version.Name, + Message: version.Message, Job: job, Readme: version.Readme, CreatedBy: createdBy, diff --git a/coderd/templateversions_test.go b/coderd/templateversions_test.go index 5f9887055b271..ec794cd32045d 100644 --- a/coderd/templateversions_test.go +++ b/coderd/templateversions_test.go @@ -33,7 +33,10 @@ func TestTemplateVersion(t *testing.T) { user := coderdtest.CreateFirstUser(t, client) authz := coderdtest.AssertRBAC(t, api, client).Reset() - version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil) + version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil, func(req *codersdk.CreateTemplateVersionRequest) { + req.Name = "bananas" + req.Message = "first try" + }) authz.AssertChecked(t, rbac.ActionCreate, rbac.ResourceTemplate.InOrg(user.OrganizationID)) ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) @@ -43,6 +46,9 @@ func TestTemplateVersion(t *testing.T) { tv, err := client.TemplateVersion(ctx, version.ID) authz.AssertChecked(t, rbac.ActionRead, tv) require.NoError(t, err) + + assert.Equal(t, "bananas", tv.Name) + assert.Equal(t, "first try", tv.Message) }) t.Run("MemberCanRead", func(t *testing.T) { diff --git a/codersdk/organizations.go b/codersdk/organizations.go index 206dd12c0665f..9ff3c27cda1da 100644 --- a/codersdk/organizations.go +++ b/codersdk/organizations.go @@ -42,7 +42,8 @@ type OrganizationMember struct { // CreateTemplateVersionRequest enables callers to create a new Template Version. type CreateTemplateVersionRequest struct { - Name string `json:"name,omitempty" validate:"omitempty,template_version_name"` + Name string `json:"name,omitempty" validate:"omitempty,template_version_name"` + Message string `json:"message,omitempty"` // TemplateID optionally associates a version with a template. TemplateID uuid.UUID `json:"template_id,omitempty" format:"uuid"` StorageMethod ProvisionerStorageMethod `json:"storage_method" validate:"oneof=file,required" enums:"file"` diff --git a/codersdk/templateversions.go b/codersdk/templateversions.go index 585d87ea7ad92..d68ad80821217 100644 --- a/codersdk/templateversions.go +++ b/codersdk/templateversions.go @@ -25,6 +25,7 @@ type TemplateVersion struct { CreatedAt time.Time `json:"created_at" format:"date-time"` UpdatedAt time.Time `json:"updated_at" format:"date-time"` Name string `json:"name"` + Message string `json:"message"` Job ProvisionerJob `json:"job"` Readme string `json:"readme"` CreatedBy User `json:"created_by"` From a2aedfda6d48a5cee351421654409d9ab9b2888d Mon Sep 17 00:00:00 2001 From: Mathias Fredriksson Date: Thu, 6 Jul 2023 12:07:35 +0000 Subject: [PATCH 03/10] feat(cli): add template version message --- cli/templatecreate.go | 5 +++ cli/templatepush.go | 19 ++++++++ cli/templatepush_test.go | 79 ++++++++++++++++++++++++++++++++++ site/src/api/typesGenerated.ts | 2 + 4 files changed, 105 insertions(+) diff --git a/cli/templatecreate.go b/cli/templatecreate.go index 555707b28baf2..369757e26da6c 100644 --- a/cli/templatecreate.go +++ b/cli/templatecreate.go @@ -92,6 +92,8 @@ func (r *RootCmd) templateCreate() *clibase.Cmd { return xerrors.Errorf("check for lockfile: %w", err) } + message := uploadFlags.templateMessage(inv) + // Confirm upload of the directory. resp, err := uploadFlags.upload(inv, client) if err != nil { @@ -104,6 +106,7 @@ func (r *RootCmd) templateCreate() *clibase.Cmd { } job, err := createValidTemplateVersion(inv, createValidTemplateVersionArgs{ + Message: message, Client: client, Organization: organization, Provisioner: database.ProvisionerType(provisioner), @@ -205,6 +208,7 @@ func (r *RootCmd) templateCreate() *clibase.Cmd { type createValidTemplateVersionArgs struct { Name string + Message string Client *codersdk.Client Organization codersdk.Organization Provisioner database.ProvisionerType @@ -238,6 +242,7 @@ func createValidTemplateVersion(inv *clibase.Invocation, args createValidTemplat req := codersdk.CreateTemplateVersionRequest{ Name: args.Name, + Message: args.Message, StorageMethod: codersdk.ProvisionerStorageMethodFile, FileID: args.FileID, Provisioner: codersdk.ProvisionerType(args.Provisioner), diff --git a/cli/templatepush.go b/cli/templatepush.go index 02884aed360b3..5ee9715af03c6 100644 --- a/cli/templatepush.go +++ b/cli/templatepush.go @@ -21,6 +21,7 @@ import ( type templateUploadFlags struct { directory string ignoreLockfile bool + message string } func (pf *templateUploadFlags) options() []clibase.Option { @@ -35,6 +36,11 @@ func (pf *templateUploadFlags) options() []clibase.Option { Description: "Ignore warnings about not having a .terraform.lock.hcl file present in the template.", Default: "false", Value: clibase.BoolOf(&pf.ignoreLockfile), + }, { + Flag: "message", + FlagShorthand: "m", + Description: "Specify a message describing the changes in this version of the template. Messages longer than 72 characters will be displayed as truncated.", + Value: clibase.StringOf(&pf.message), }} } @@ -110,6 +116,16 @@ func (pf *templateUploadFlags) checkForLockfile(inv *clibase.Invocation) error { return nil } +func (pf *templateUploadFlags) templateMessage(inv *clibase.Invocation) string { + if len(pf.message) > 72 { + cliui.Warn(inv.Stdout, "Template message is longer than 72 characters, it will be displayed as truncated.") + } + if pf.message != "" { + return pf.message + } + return "Uploaded from the CLI" +} + func (pf *templateUploadFlags) templateName(args []string) (string, error) { if pf.stdin() { // Can't infer name from directory if none provided. @@ -174,6 +190,8 @@ func (r *RootCmd) templatePush() *clibase.Cmd { return xerrors.Errorf("check for lockfile: %w", err) } + message := uploadFlags.templateMessage(inv) + resp, err := uploadFlags.upload(inv, client) if err != nil { return err @@ -186,6 +204,7 @@ func (r *RootCmd) templatePush() *clibase.Cmd { job, err := createValidTemplateVersion(inv, createValidTemplateVersionArgs{ Name: versionName, + Message: message, Client: client, Organization: organization, Provisioner: database.ProvisionerType(provisioner), diff --git a/cli/templatepush_test.go b/cli/templatepush_test.go index 22f5b6a38f1f5..7d927077bcaad 100644 --- a/cli/templatepush_test.go +++ b/cli/templatepush_test.go @@ -6,6 +6,7 @@ import ( "os" "path/filepath" "runtime" + "strings" "testing" "github.com/stretchr/testify/assert" @@ -70,6 +71,84 @@ func TestTemplatePush(t *testing.T) { require.Equal(t, "example", templateVersions[1].Name) }) + t.Run("Message less than or equal to 72 chars", func(t *testing.T) { + t.Parallel() + client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true}) + user := coderdtest.CreateFirstUser(t, client) + version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil) + _ = coderdtest.AwaitTemplateVersionJob(t, client, version.ID) + + template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) + source := clitest.CreateTemplateVersionSource(t, &echo.Responses{ + Parse: echo.ParseComplete, + ProvisionApply: echo.ProvisionComplete, + }) + + wantMessage := strings.Repeat("a", 72) + + inv, root := clitest.New(t, "templates", "push", template.Name, "--directory", source, "--test.provisioner", string(database.ProvisionerTypeEcho), "--name", "example", "--message", wantMessage, "--yes") + clitest.SetupConfig(t, client, root) + pty := ptytest.New(t).Attach(inv) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitMedium) + defer cancel() + + inv = inv.WithContext(ctx) + w := clitest.StartWithWaiter(t, inv) + + pty.ExpectNoMatchBefore(ctx, "Template message is longer than 72 characters", "Updated version at") + + w.RequireSuccess() + + // Assert that the template version changed. + templateVersions, err := client.TemplateVersionsByTemplate(ctx, codersdk.TemplateVersionsByTemplateRequest{ + TemplateID: template.ID, + }) + require.NoError(t, err) + assert.Len(t, templateVersions, 2) + assert.NotEqual(t, template.ActiveVersionID, templateVersions[1].ID) + require.Equal(t, wantMessage, templateVersions[1].Message) + }) + + t.Run("Message too long, warn but continue", func(t *testing.T) { + t.Parallel() + client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true}) + user := coderdtest.CreateFirstUser(t, client) + version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil) + _ = coderdtest.AwaitTemplateVersionJob(t, client, version.ID) + + template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) + source := clitest.CreateTemplateVersionSource(t, &echo.Responses{ + Parse: echo.ParseComplete, + ProvisionApply: echo.ProvisionComplete, + }) + + wantMessage := strings.Repeat("a", 73) + + inv, root := clitest.New(t, "templates", "push", template.Name, "--directory", source, "--test.provisioner", string(database.ProvisionerTypeEcho), "--name", "example", "--message", wantMessage, "--yes") + clitest.SetupConfig(t, client, root) + pty := ptytest.New(t).Attach(inv) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitMedium) + defer cancel() + + inv = inv.WithContext(ctx) + w := clitest.StartWithWaiter(t, inv) + + pty.ExpectMatchContext(ctx, "Template message is longer than 72 characters") + + w.RequireSuccess() + + // Assert that the template version changed. + templateVersions, err := client.TemplateVersionsByTemplate(ctx, codersdk.TemplateVersionsByTemplateRequest{ + TemplateID: template.ID, + }) + require.NoError(t, err) + assert.Len(t, templateVersions, 2) + assert.NotEqual(t, template.ActiveVersionID, templateVersions[1].ID) + require.Equal(t, wantMessage, templateVersions[1].Message) + }) + t.Run("NoLockfile", func(t *testing.T) { t.Parallel() client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true}) diff --git a/site/src/api/typesGenerated.ts b/site/src/api/typesGenerated.ts index 050ef91d88a19..fd74f193c60b1 100644 --- a/site/src/api/typesGenerated.ts +++ b/site/src/api/typesGenerated.ts @@ -200,6 +200,7 @@ export interface CreateTemplateVersionDryRunRequest { // From codersdk/organizations.go export interface CreateTemplateVersionRequest { readonly name?: string + readonly message?: string readonly template_id?: string readonly storage_method: ProvisionerStorageMethod readonly file_id?: string @@ -915,6 +916,7 @@ export interface TemplateVersion { readonly created_at: string readonly updated_at: string readonly name: string + readonly message: string readonly job: ProvisionerJob readonly readme: string readonly created_by: User From ffb7f3ff2f2376a33a7bc982d226df47d491cc89 Mon Sep 17 00:00:00 2001 From: Mathias Fredriksson Date: Thu, 6 Jul 2023 12:12:45 +0000 Subject: [PATCH 04/10] fixup! propagate message in api response --- site/src/testHelpers/entities.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/site/src/testHelpers/entities.ts b/site/src/testHelpers/entities.ts index cf6cd175d21ad..1cc49b5934304 100644 --- a/site/src/testHelpers/entities.ts +++ b/site/src/testHelpers/entities.ts @@ -352,6 +352,7 @@ export const MockTemplateVersion: TypesGen.TemplateVersion = { template_id: "test-template", job: MockProvisionerJob, name: "test-version", + message: "first version", readme: `--- name:Template test --- @@ -369,6 +370,7 @@ export const MockTemplateVersion2: TypesGen.TemplateVersion = { template_id: "test-template", job: MockProvisionerJob, name: "test-version-2", + message: "first version", readme: `--- name:Template test 2 --- @@ -386,6 +388,7 @@ export const MockTemplateVersion3: TypesGen.TemplateVersion = { template_id: "test-template", job: MockProvisionerJob, name: "test-version-3", + message: "first version", readme: "README", created_by: MockUser, warnings: ["UNSUPPORTED_WORKSPACES"], From 98377ad533aaeb01f707d10aeff60b392bcd1656 Mon Sep 17 00:00:00 2001 From: Mathias Fredriksson Date: Thu, 6 Jul 2023 12:25:40 +0000 Subject: [PATCH 05/10] make gen --- coderd/apidoc/docs.go | 6 ++++++ coderd/apidoc/swagger.json | 6 ++++++ docs/api/schemas.md | 4 ++++ docs/api/templates.md | 10 ++++++++++ docs/cli/templates_create.md | 8 ++++++++ docs/cli/templates_push.md | 8 ++++++++ 6 files changed, 42 insertions(+) diff --git a/coderd/apidoc/docs.go b/coderd/apidoc/docs.go index 73d89c0d09a4c..eee9cf319df46 100644 --- a/coderd/apidoc/docs.go +++ b/coderd/apidoc/docs.go @@ -7024,6 +7024,9 @@ const docTemplate = `{ "type": "string", "format": "uuid" }, + "message": { + "type": "string" + }, "name": { "type": "string" }, @@ -9114,6 +9117,9 @@ const docTemplate = `{ "job": { "$ref": "#/definitions/codersdk.ProvisionerJob" }, + "message": { + "type": "string" + }, "name": { "type": "string" }, diff --git a/coderd/apidoc/swagger.json b/coderd/apidoc/swagger.json index fa565cb830eb7..3e53b309aaf23 100644 --- a/coderd/apidoc/swagger.json +++ b/coderd/apidoc/swagger.json @@ -6259,6 +6259,9 @@ "type": "string", "format": "uuid" }, + "message": { + "type": "string" + }, "name": { "type": "string" }, @@ -8225,6 +8228,9 @@ "job": { "$ref": "#/definitions/codersdk.ProvisionerJob" }, + "message": { + "type": "string" + }, "name": { "type": "string" }, diff --git a/docs/api/schemas.md b/docs/api/schemas.md index 672ec8bd2a929..6c01266f71385 100644 --- a/docs/api/schemas.md +++ b/docs/api/schemas.md @@ -1435,6 +1435,7 @@ AuthorizationObject can represent a "set" of objects, such as: all workspaces in { "example_id": "string", "file_id": "8a0cfb4f-ddc9-436d-91bb-75133c583767", + "message": "string", "name": "string", "provisioner": "terraform", "storage_method": "file", @@ -1458,6 +1459,7 @@ AuthorizationObject can represent a "set" of objects, such as: all workspaces in | ---------------------- | ---------------------------------------------------------------------- | -------- | ------------ | ------------------------------------------------------------ | | `example_id` | string | false | | | | `file_id` | string | false | | | +| `message` | string | false | | | | `name` | string | false | | | | `provisioner` | string | true | | | | `storage_method` | [codersdk.ProvisionerStorageMethod](#codersdkprovisionerstoragemethod) | true | | | @@ -4148,6 +4150,7 @@ AuthorizationObject can represent a "set" of objects, such as: all workspaces in }, "worker_id": "ae5fa6f7-c55b-40c1-b40a-b36ac467652b" }, + "message": "string", "name": "string", "organization_id": "7c60d51f-b44e-4682-87d6-449835ea4de6", "readme": "string", @@ -4165,6 +4168,7 @@ AuthorizationObject can represent a "set" of objects, such as: all workspaces in | `created_by` | [codersdk.User](#codersdkuser) | false | | | | `id` | string | false | | | | `job` | [codersdk.ProvisionerJob](#codersdkprovisionerjob) | false | | | +| `message` | string | false | | | | `name` | string | false | | | | `organization_id` | string | false | | | | `readme` | string | false | | | diff --git a/docs/api/templates.md b/docs/api/templates.md index 8a65ff8e45b08..bf4f3ba39e804 100644 --- a/docs/api/templates.md +++ b/docs/api/templates.md @@ -389,6 +389,7 @@ curl -X GET http://coder-server:8080/api/v2/organizations/{organization}/templat }, "worker_id": "ae5fa6f7-c55b-40c1-b40a-b36ac467652b" }, + "message": "string", "name": "string", "organization_id": "7c60d51f-b44e-4682-87d6-449835ea4de6", "readme": "string", @@ -469,6 +470,7 @@ curl -X GET http://coder-server:8080/api/v2/organizations/{organization}/templat }, "worker_id": "ae5fa6f7-c55b-40c1-b40a-b36ac467652b" }, + "message": "string", "name": "string", "organization_id": "7c60d51f-b44e-4682-87d6-449835ea4de6", "readme": "string", @@ -506,6 +508,7 @@ curl -X POST http://coder-server:8080/api/v2/organizations/{organization}/templa { "example_id": "string", "file_id": "8a0cfb4f-ddc9-436d-91bb-75133c583767", + "message": "string", "name": "string", "provisioner": "terraform", "storage_method": "file", @@ -572,6 +575,7 @@ curl -X POST http://coder-server:8080/api/v2/organizations/{organization}/templa }, "worker_id": "ae5fa6f7-c55b-40c1-b40a-b36ac467652b" }, + "message": "string", "name": "string", "organization_id": "7c60d51f-b44e-4682-87d6-449835ea4de6", "readme": "string", @@ -875,6 +879,7 @@ curl -X GET http://coder-server:8080/api/v2/templates/{template}/versions \ }, "worker_id": "ae5fa6f7-c55b-40c1-b40a-b36ac467652b" }, + "message": "string", "name": "string", "organization_id": "7c60d51f-b44e-4682-87d6-449835ea4de6", "readme": "string", @@ -927,6 +932,7 @@ Status Code **200** | `»» tags` | object | false | | | | `»»» [any property]` | string | false | | | | `»» worker_id` | string(uuid) | false | | | +| `» message` | string | false | | | | `» name` | string | false | | | | `» organization_id` | string(uuid) | false | | | | `» readme` | string | false | | | @@ -1068,6 +1074,7 @@ curl -X GET http://coder-server:8080/api/v2/templates/{template}/versions/{templ }, "worker_id": "ae5fa6f7-c55b-40c1-b40a-b36ac467652b" }, + "message": "string", "name": "string", "organization_id": "7c60d51f-b44e-4682-87d6-449835ea4de6", "readme": "string", @@ -1120,6 +1127,7 @@ Status Code **200** | `»» tags` | object | false | | | | `»»» [any property]` | string | false | | | | `»» worker_id` | string(uuid) | false | | | +| `» message` | string | false | | | | `» name` | string | false | | | | `» organization_id` | string(uuid) | false | | | | `» readme` | string | false | | | @@ -1205,6 +1213,7 @@ curl -X GET http://coder-server:8080/api/v2/templateversions/{templateversion} \ }, "worker_id": "ae5fa6f7-c55b-40c1-b40a-b36ac467652b" }, + "message": "string", "name": "string", "organization_id": "7c60d51f-b44e-4682-87d6-449835ea4de6", "readme": "string", @@ -1293,6 +1302,7 @@ curl -X PATCH http://coder-server:8080/api/v2/templateversions/{templateversion} }, "worker_id": "ae5fa6f7-c55b-40c1-b40a-b36ac467652b" }, + "message": "string", "name": "string", "organization_id": "7c60d51f-b44e-4682-87d6-449835ea4de6", "readme": "string", diff --git a/docs/cli/templates_create.md b/docs/cli/templates_create.md index 197ba3fdcf8a4..7b3957bbb38cd 100644 --- a/docs/cli/templates_create.md +++ b/docs/cli/templates_create.md @@ -57,6 +57,14 @@ Ignore warnings about not having a .terraform.lock.hcl file present in the templ Specify an inactivity TTL for workspaces created from this template. This licensed feature's default is 0h (off). +### -m, --message + +| | | +| ---- | ------------------- | +| Type | string | + +Specify a message describing the changes in this version of the template. Messages longer than 72 characters will be displayed as truncated. + ### --private | | | diff --git a/docs/cli/templates_push.md b/docs/cli/templates_push.md index 692887b6921d2..4043de558198b 100644 --- a/docs/cli/templates_push.md +++ b/docs/cli/templates_push.md @@ -47,6 +47,14 @@ Specify the directory to create from, use '-' to read tar from stdin. Ignore warnings about not having a .terraform.lock.hcl file present in the template. +### -m, --message + +| | | +| ---- | ------------------- | +| Type | string | + +Specify a message describing the changes in this version of the template. Messages longer than 72 characters will be displayed as truncated. + ### --name | | | From 960e5d1bbe56ab4f3e4c94c9dfd99ce4c54ed02c Mon Sep 17 00:00:00 2001 From: Mathias Fredriksson Date: Thu, 6 Jul 2023 12:42:56 +0000 Subject: [PATCH 06/10] update golden files --- cli/testdata/coder_templates_create_--help.golden | 5 +++++ cli/testdata/coder_templates_push_--help.golden | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/cli/testdata/coder_templates_create_--help.golden b/cli/testdata/coder_templates_create_--help.golden index d23b0f7571457..4ef57e5afd0d9 100644 --- a/cli/testdata/coder_templates_create_--help.golden +++ b/cli/testdata/coder_templates_create_--help.golden @@ -21,6 +21,11 @@ Create a template from the current directory or as specified by flag Specify an inactivity TTL for workspaces created from this template. This licensed feature's default is 0h (off). + -m, --message string + Specify a message describing the changes in this version of the + template. Messages longer than 72 characters will be displayed as + truncated. + --private bool Disable the default behavior of granting template access to the 'everyone' group. The template permissions must be updated to allow diff --git a/cli/testdata/coder_templates_push_--help.golden b/cli/testdata/coder_templates_push_--help.golden index ebe0a73e7014a..6aeff1641fd0d 100644 --- a/cli/testdata/coder_templates_push_--help.golden +++ b/cli/testdata/coder_templates_push_--help.golden @@ -17,6 +17,11 @@ Push a new template version from the current directory or as specified by flag Ignore warnings about not having a .terraform.lock.hcl file present in the template. + -m, --message string + Specify a message describing the changes in this version of the + template. Messages longer than 72 characters will be displayed as + truncated. + --name string Specify a name for the new template version. It will be automatically generated if not provided. From 93de18a0ce5ddaddcbb4d7bef52b845113323009 Mon Sep 17 00:00:00 2001 From: Mathias Fredriksson Date: Thu, 6 Jul 2023 14:12:49 +0000 Subject: [PATCH 07/10] detect newlines --- cli/templatepush.go | 7 ++++++- cli/templatepush_test.go | 44 +++++++++++++++++++++++----------------- 2 files changed, 31 insertions(+), 20 deletions(-) diff --git a/cli/templatepush.go b/cli/templatepush.go index 5ee9715af03c6..bc5516b092ef9 100644 --- a/cli/templatepush.go +++ b/cli/templatepush.go @@ -5,6 +5,7 @@ import ( "fmt" "io" "path/filepath" + "strings" "time" "github.com/briandowns/spinner" @@ -117,9 +118,13 @@ func (pf *templateUploadFlags) checkForLockfile(inv *clibase.Invocation) error { } func (pf *templateUploadFlags) templateMessage(inv *clibase.Invocation) string { - if len(pf.message) > 72 { + title := strings.SplitN(pf.message, "\n", 2)[0] + if len(title) > 72 { cliui.Warn(inv.Stdout, "Template message is longer than 72 characters, it will be displayed as truncated.") } + if title != pf.message { + cliui.Warn(inv.Stdout, "Template message contains newlines, only the first line will be displayed.") + } if pf.message != "" { return pf.message } diff --git a/cli/templatepush_test.go b/cli/templatepush_test.go index 7d927077bcaad..73b0ac7da9b46 100644 --- a/cli/templatepush_test.go +++ b/cli/templatepush_test.go @@ -123,30 +123,36 @@ func TestTemplatePush(t *testing.T) { ProvisionApply: echo.ProvisionComplete, }) - wantMessage := strings.Repeat("a", 73) - - inv, root := clitest.New(t, "templates", "push", template.Name, "--directory", source, "--test.provisioner", string(database.ProvisionerTypeEcho), "--name", "example", "--message", wantMessage, "--yes") - clitest.SetupConfig(t, client, root) - pty := ptytest.New(t).Attach(inv) - - ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitMedium) + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) defer cancel() - inv = inv.WithContext(ctx) - w := clitest.StartWithWaiter(t, inv) + for i, tt := range []struct { + wantMessage string + wantMatch string + }{ + {wantMessage: strings.Repeat("a", 73), wantMatch: "Template message is longer than 72 characters"}, + {wantMessage: "This is my title\n\nAnd this is my body.", wantMatch: "Template message contains newlines"}, + } { + inv, root := clitest.New(t, "templates", "push", template.Name, "--directory", source, "--test.provisioner", string(database.ProvisionerTypeEcho), "--name", "example", "--message", tt.wantMessage, "--yes") + clitest.SetupConfig(t, client, root) + pty := ptytest.New(t).Attach(inv) - pty.ExpectMatchContext(ctx, "Template message is longer than 72 characters") + inv = inv.WithContext(ctx) + w := clitest.StartWithWaiter(t, inv) - w.RequireSuccess() + pty.ExpectMatchContext(ctx, tt.wantMatch) - // Assert that the template version changed. - templateVersions, err := client.TemplateVersionsByTemplate(ctx, codersdk.TemplateVersionsByTemplateRequest{ - TemplateID: template.ID, - }) - require.NoError(t, err) - assert.Len(t, templateVersions, 2) - assert.NotEqual(t, template.ActiveVersionID, templateVersions[1].ID) - require.Equal(t, wantMessage, templateVersions[1].Message) + w.RequireSuccess() + + // Assert that the template version changed. + templateVersions, err := client.TemplateVersionsByTemplate(ctx, codersdk.TemplateVersionsByTemplateRequest{ + TemplateID: template.ID, + }) + require.NoError(t, err) + assert.Len(t, templateVersions, 2+i) + assert.NotEqual(t, template.ActiveVersionID, templateVersions[1+i].ID) + require.Equal(t, tt.wantMessage, templateVersions[1+i].Message) + } }) t.Run("NoLockfile", func(t *testing.T) { From 5bee51f3a75d8c78446480f6adb785ee5ef64179 Mon Sep 17 00:00:00 2001 From: Mathias Fredriksson Date: Thu, 6 Jul 2023 14:29:32 +0000 Subject: [PATCH 08/10] limit message length --- coderd/database/dbfake/dbfake.go | 4 ++++ coderd/database/dump.sql | 2 +- ...000135_add_template_version_message.up.sql | 2 +- coderd/templateversions_test.go | 21 +++++++++++++++++++ codersdk/organizations.go | 2 +- 5 files changed, 28 insertions(+), 3 deletions(-) diff --git a/coderd/database/dbfake/dbfake.go b/coderd/database/dbfake/dbfake.go index 5ee29d708a672..8d08923a4f72b 100644 --- a/coderd/database/dbfake/dbfake.go +++ b/coderd/database/dbfake/dbfake.go @@ -3921,6 +3921,10 @@ func (q *fakeQuerier) InsertTemplateVersion(_ context.Context, arg database.Inse return database.TemplateVersion{}, err } + if len(arg.Message) > 1048576 { + return database.TemplateVersion{}, xerrors.New("message too long") + } + q.mutex.Lock() defer q.mutex.Unlock() diff --git a/coderd/database/dump.sql b/coderd/database/dump.sql index fe762689ecd00..069bd97ac9873 100644 --- a/coderd/database/dump.sql +++ b/coderd/database/dump.sql @@ -537,7 +537,7 @@ CREATE TABLE template_versions ( job_id uuid NOT NULL, created_by uuid NOT NULL, git_auth_providers text[], - message text DEFAULT ''::text NOT NULL + message character varying(1048576) DEFAULT ''::character varying NOT NULL ); COMMENT ON COLUMN template_versions.git_auth_providers IS 'IDs of Git auth providers for a specific template version'; diff --git a/coderd/database/migrations/000135_add_template_version_message.up.sql b/coderd/database/migrations/000135_add_template_version_message.up.sql index b2eaa9cc918c1..e8dd2e7b050f2 100644 --- a/coderd/database/migrations/000135_add_template_version_message.up.sql +++ b/coderd/database/migrations/000135_add_template_version_message.up.sql @@ -1,3 +1,3 @@ -ALTER TABLE template_versions ADD COLUMN message text NOT NULL DEFAULT ''; +ALTER TABLE template_versions ADD COLUMN message varchar(1048576) NOT NULL DEFAULT ''; COMMENT ON COLUMN template_versions.message IS 'Message describing the changes in this version of the template, similar to a Git commit message. Like a commit message, this should be a short, high-level description of the changes in this version of the template. This message is immutable and should not be updated after the fact.'; diff --git a/coderd/templateversions_test.go b/coderd/templateversions_test.go index ec794cd32045d..cef88235a08a4 100644 --- a/coderd/templateversions_test.go +++ b/coderd/templateversions_test.go @@ -5,6 +5,7 @@ import ( "context" "net/http" "regexp" + "strings" "testing" "github.com/google/uuid" @@ -51,6 +52,26 @@ func TestTemplateVersion(t *testing.T) { assert.Equal(t, "first try", tv.Message) }) + t.Run("Message limit exceeded", func(t *testing.T) { + t.Parallel() + client, _, _ := coderdtest.NewWithAPI(t, nil) + user := coderdtest.CreateFirstUser(t, client) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + file, err := client.Upload(ctx, codersdk.ContentTypeTar, bytes.NewReader([]byte{})) + require.NoError(t, err) + _, err = client.CreateTemplateVersion(ctx, user.OrganizationID, codersdk.CreateTemplateVersionRequest{ + Name: "bananas", + Message: strings.Repeat("a", 1048577), + StorageMethod: codersdk.ProvisionerStorageMethodFile, + FileID: file.ID, + Provisioner: codersdk.ProvisionerTypeEcho, + }) + require.Error(t, err, "message too long, create should fail") + }) + t.Run("MemberCanRead", func(t *testing.T) { t.Parallel() diff --git a/codersdk/organizations.go b/codersdk/organizations.go index 9ff3c27cda1da..a2b6df505c55c 100644 --- a/codersdk/organizations.go +++ b/codersdk/organizations.go @@ -43,7 +43,7 @@ type OrganizationMember struct { // CreateTemplateVersionRequest enables callers to create a new Template Version. type CreateTemplateVersionRequest struct { Name string `json:"name,omitempty" validate:"omitempty,template_version_name"` - Message string `json:"message,omitempty"` + Message string `json:"message,omitempty" validate:"lt=1048577"` // Database limit: 1048576. // TemplateID optionally associates a version with a template. TemplateID uuid.UUID `json:"template_id,omitempty" format:"uuid"` StorageMethod ProvisionerStorageMethod `json:"storage_method" validate:"oneof=file,required" enums:"file"` From 9280af6c640bb90097eec0c2eacc67c33a3257f1 Mon Sep 17 00:00:00 2001 From: Mathias Fredriksson Date: Thu, 6 Jul 2023 16:36:30 +0000 Subject: [PATCH 09/10] fix --- cli/templatepush_test.go | 2 +- codersdk/organizations.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cli/templatepush_test.go b/cli/templatepush_test.go index 73b0ac7da9b46..c890ea6593b94 100644 --- a/cli/templatepush_test.go +++ b/cli/templatepush_test.go @@ -133,7 +133,7 @@ func TestTemplatePush(t *testing.T) { {wantMessage: strings.Repeat("a", 73), wantMatch: "Template message is longer than 72 characters"}, {wantMessage: "This is my title\n\nAnd this is my body.", wantMatch: "Template message contains newlines"}, } { - inv, root := clitest.New(t, "templates", "push", template.Name, "--directory", source, "--test.provisioner", string(database.ProvisionerTypeEcho), "--name", "example", "--message", tt.wantMessage, "--yes") + inv, root := clitest.New(t, "templates", "push", template.Name, "--directory", source, "--test.provisioner", string(database.ProvisionerTypeEcho), "--message", tt.wantMessage, "--yes") clitest.SetupConfig(t, client, root) pty := ptytest.New(t).Attach(inv) diff --git a/codersdk/organizations.go b/codersdk/organizations.go index a2b6df505c55c..e1a0d2f1e2c4c 100644 --- a/codersdk/organizations.go +++ b/codersdk/organizations.go @@ -43,7 +43,7 @@ type OrganizationMember struct { // CreateTemplateVersionRequest enables callers to create a new Template Version. type CreateTemplateVersionRequest struct { Name string `json:"name,omitempty" validate:"omitempty,template_version_name"` - Message string `json:"message,omitempty" validate:"lt=1048577"` // Database limit: 1048576. + Message string `json:"message,omitempty" validate:"lt=1048577"` // TemplateID optionally associates a version with a template. TemplateID uuid.UUID `json:"template_id,omitempty" format:"uuid"` StorageMethod ProvisionerStorageMethod `json:"storage_method" validate:"oneof=file,required" enums:"file"` From 9945e942ccceb2e0d95be0ec60c21ecea0e7f3aa Mon Sep 17 00:00:00 2001 From: Mathias Fredriksson Date: Tue, 11 Jul 2023 08:25:50 +0000 Subject: [PATCH 10/10] fix migration --- ...sage.down.sql => 000137_add_template_version_message.down.sql} | 0 ..._message.up.sql => 000137_add_template_version_message.up.sql} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename coderd/database/migrations/{000135_add_template_version_message.down.sql => 000137_add_template_version_message.down.sql} (100%) rename coderd/database/migrations/{000135_add_template_version_message.up.sql => 000137_add_template_version_message.up.sql} (100%) diff --git a/coderd/database/migrations/000135_add_template_version_message.down.sql b/coderd/database/migrations/000137_add_template_version_message.down.sql similarity index 100% rename from coderd/database/migrations/000135_add_template_version_message.down.sql rename to coderd/database/migrations/000137_add_template_version_message.down.sql diff --git a/coderd/database/migrations/000135_add_template_version_message.up.sql b/coderd/database/migrations/000137_add_template_version_message.up.sql similarity index 100% rename from coderd/database/migrations/000135_add_template_version_message.up.sql rename to coderd/database/migrations/000137_add_template_version_message.up.sql