mirror of
https://github.com/coder/coder.git
synced 2025-07-08 11:39:50 +00:00
feat: add experimental template autostop requirement template settings UI (#9417)
This commit is contained in:
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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,
|
||||
|
@ -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,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
Reference in New Issue
Block a user