feat: add experimental template autostop requirement template settings UI (#9417)

This commit is contained in:
Dean Sheather
2023-08-30 13:41:27 -07:00
committed by GitHub
parent d2462e5b88
commit 1de61246a3
21 changed files with 568 additions and 126 deletions

View File

@ -1,7 +1,25 @@
BEGIN;
DROP VIEW template_with_users;
ALTER TABLE templates RENAME COLUMN autostop_requirement_days_of_week TO restart_requirement_days_of_week;
ALTER TABLE templates RENAME COLUMN autostop_requirement_weeks TO restart_requirement_weeks;
CREATE VIEW
template_with_users
AS
SELECT
templates.*,
coalesce(visible_users.avatar_url, '') AS created_by_avatar_url,
coalesce(visible_users.username, '') AS created_by_username
FROM
templates
LEFT JOIN
visible_users
ON
templates.created_by = visible_users.id;
COMMENT ON VIEW template_with_users IS 'Joins in the username + avatar url of the created by user.';
COMMIT;

View File

@ -1,11 +1,11 @@
BEGIN;
DROP VIEW template_with_users;
ALTER TABLE templates RENAME COLUMN restart_requirement_days_of_week TO autostop_requirement_days_of_week;
ALTER TABLE templates RENAME COLUMN restart_requirement_weeks TO autostop_requirement_weeks;
DROP VIEW template_with_users;
CREATE VIEW
template_with_users
AS

View File

@ -72,8 +72,8 @@ func VerifyTemplateAutostopRequirement(days uint8, weeks int64) error {
if days > 0b11111111 {
return xerrors.New("invalid autostop requirement days, too large")
}
if weeks < 0 {
return xerrors.New("invalid autostop requirement weeks, negative")
if weeks < 1 {
return xerrors.New("invalid autostop requirement weeks, less than 1")
}
if weeks > MaxTemplateAutostopRequirementWeeks {
return xerrors.New("invalid autostop requirement weeks, too large")
@ -154,8 +154,10 @@ func (*agplTemplateScheduleStore) Get(ctx context.Context, db database.Store, te
UseAutostopRequirement: false,
MaxTTL: 0,
AutostopRequirement: TemplateAutostopRequirement{
// No days means never. The weeks value should always be greater
// than zero though.
DaysOfWeek: 0,
Weeks: 0,
Weeks: 1,
},
FailureTTL: 0,
TimeTilDormant: 0,

View File

@ -527,6 +527,12 @@ func (api *API) patchTemplateMeta(rw http.ResponseWriter, r *http.Request) {
if req.AutostopRequirement.Weeks < 0 {
validErrs = append(validErrs, codersdk.ValidationError{Field: "autostop_requirement.weeks", Detail: "Must be a positive integer."})
}
if req.AutostopRequirement.Weeks == 0 {
req.AutostopRequirement.Weeks = 1
}
if template.AutostopRequirementWeeks <= 0 {
template.AutostopRequirementWeeks = 1
}
if req.AutostopRequirement.Weeks > schedule.MaxTemplateAutostopRequirementWeeks {
validErrs = append(validErrs, codersdk.ValidationError{Field: "autostop_requirement.weeks", Detail: fmt.Sprintf("Must be less than %d.", schedule.MaxTemplateAutostopRequirementWeeks)})
}
@ -737,6 +743,11 @@ func (api *API) convertTemplate(
buildTimeStats := api.metricsCache.TemplateBuildTimeStats(template.ID)
autostopRequirementWeeks := template.AutostopRequirementWeeks
if autostopRequirementWeeks < 1 {
autostopRequirementWeeks = 1
}
return codersdk.Template{
ID: template.ID,
CreatedAt: template.CreatedAt,
@ -762,7 +773,7 @@ func (api *API) convertTemplate(
TimeTilDormantAutoDeleteMillis: time.Duration(template.TimeTilDormantAutoDelete).Milliseconds(),
AutostopRequirement: codersdk.TemplateAutostopRequirement{
DaysOfWeek: codersdk.BitmapToWeekdays(uint8(template.AutostopRequirementDaysOfWeek)),
Weeks: template.AutostopRequirementWeeks,
Weeks: autostopRequirementWeeks,
},
}
}

View File

@ -296,7 +296,7 @@ func TestPostTemplateByOrganization(t *testing.T) {
require.EqualValues(t, 1, atomic.LoadInt64(&setCalled))
require.Empty(t, got.AutostopRequirement.DaysOfWeek)
require.Zero(t, got.AutostopRequirement.Weeks)
require.EqualValues(t, 1, got.AutostopRequirement.Weeks)
})
t.Run("OK", func(t *testing.T) {
@ -379,7 +379,7 @@ func TestPostTemplateByOrganization(t *testing.T) {
require.NoError(t, err)
// ignored and use AGPL defaults
require.Empty(t, got.AutostopRequirement.DaysOfWeek)
require.Zero(t, got.AutostopRequirement.Weeks)
require.EqualValues(t, 1, got.AutostopRequirement.Weeks)
})
})
}
@ -1006,7 +1006,7 @@ func TestPatchTemplateMeta(t *testing.T) {
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
require.EqualValues(t, 1, atomic.LoadInt64(&setCalled))
require.Empty(t, template.AutostopRequirement.DaysOfWeek)
require.Zero(t, template.AutostopRequirement.Weeks)
require.EqualValues(t, 1, template.AutostopRequirement.Weeks)
req := codersdk.UpdateTemplateMeta{
Name: template.Name,
DisplayName: template.DisplayName,
@ -1045,7 +1045,7 @@ func TestPatchTemplateMeta(t *testing.T) {
SetFn: func(ctx context.Context, db database.Store, template database.Template, options schedule.TemplateScheduleOptions) (database.Template, error) {
if atomic.AddInt64(&setCalled, 1) == 2 {
assert.EqualValues(t, 0, options.AutostopRequirement.DaysOfWeek)
assert.EqualValues(t, 0, options.AutostopRequirement.Weeks)
assert.EqualValues(t, 1, options.AutostopRequirement.Weeks)
}
err := db.UpdateTemplateScheduleByID(ctx, database.UpdateTemplateScheduleByIDParams{
@ -1102,12 +1102,12 @@ func TestPatchTemplateMeta(t *testing.T) {
require.NoError(t, err)
require.EqualValues(t, 2, atomic.LoadInt64(&setCalled))
require.Empty(t, updated.AutostopRequirement.DaysOfWeek)
require.EqualValues(t, 0, updated.AutostopRequirement.Weeks)
require.EqualValues(t, 1, updated.AutostopRequirement.Weeks)
template, err = client.Template(ctx, template.ID)
require.NoError(t, err)
require.Empty(t, template.AutostopRequirement.DaysOfWeek)
require.EqualValues(t, 0, template.AutostopRequirement.Weeks)
require.EqualValues(t, 1, template.AutostopRequirement.Weeks)
})
t.Run("EnterpriseOnly", func(t *testing.T) {
@ -1118,7 +1118,7 @@ func TestPatchTemplateMeta(t *testing.T) {
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil)
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
require.Empty(t, template.AutostopRequirement.DaysOfWeek)
require.Zero(t, template.AutostopRequirement.Weeks)
require.EqualValues(t, 1, template.AutostopRequirement.Weeks)
req := codersdk.UpdateTemplateMeta{
Name: template.Name,
DisplayName: template.DisplayName,
@ -1138,12 +1138,12 @@ func TestPatchTemplateMeta(t *testing.T) {
updated, err := client.UpdateTemplateMeta(ctx, template.ID, req)
require.NoError(t, err)
require.Empty(t, updated.AutostopRequirement.DaysOfWeek)
require.Zero(t, updated.AutostopRequirement.Weeks)
require.EqualValues(t, 1, updated.AutostopRequirement.Weeks)
template, err = client.Template(ctx, template.ID)
require.NoError(t, err)
require.Empty(t, template.AutostopRequirement.DaysOfWeek)
require.Zero(t, template.AutostopRequirement.Weeks)
require.EqualValues(t, 1, template.AutostopRequirement.Weeks)
})
})
}