feat: add auto-locking/deleting workspace based on template config (#8240)

This commit is contained in:
Jon Ayers
2023-07-02 21:29:52 -05:00
committed by GitHub
parent 818c4a7f23
commit 4a9c8f407a
18 changed files with 726 additions and 70 deletions
+22 -2
View File
@@ -3495,12 +3495,17 @@ func (q *fakeQuerier) GetWorkspacesEligibleForTransition(ctx context.Context, no
return nil, err
}
if build.Transition == database.WorkspaceTransitionStart && !build.Deadline.IsZero() && build.Deadline.Before(now) {
if build.Transition == database.WorkspaceTransitionStart &&
!build.Deadline.IsZero() &&
build.Deadline.Before(now) &&
!workspace.LockedAt.Valid {
workspaces = append(workspaces, workspace)
continue
}
if build.Transition == database.WorkspaceTransitionStop && workspace.AutostartSchedule.Valid {
if build.Transition == database.WorkspaceTransitionStop &&
workspace.AutostartSchedule.Valid &&
!workspace.LockedAt.Valid {
workspaces = append(workspaces, workspace)
continue
}
@@ -3513,6 +3518,19 @@ func (q *fakeQuerier) GetWorkspacesEligibleForTransition(ctx context.Context, no
workspaces = append(workspaces, workspace)
continue
}
template, err := q.GetTemplateByID(ctx, workspace.TemplateID)
if err != nil {
return nil, xerrors.Errorf("get template by ID: %w", err)
}
if !workspace.LockedAt.Valid && template.InactivityTTL > 0 {
workspaces = append(workspaces, workspace)
continue
}
if workspace.LockedAt.Valid && template.LockedTTL > 0 {
workspaces = append(workspaces, workspace)
continue
}
}
return workspaces, nil
@@ -4702,6 +4720,7 @@ func (q *fakeQuerier) UpdateTemplateScheduleByID(_ context.Context, arg database
tpl.MaxTTL = arg.MaxTTL
tpl.FailureTTL = arg.FailureTTL
tpl.InactivityTTL = arg.InactivityTTL
tpl.LockedTTL = arg.LockedTTL
q.templates[idx] = tpl
return tpl.DeepCopy(), nil
}
@@ -5245,6 +5264,7 @@ func (q *fakeQuerier) UpdateWorkspaceLockedAt(_ context.Context, arg database.Up
continue
}
workspace.LockedAt = arg.LockedAt
workspace.LastUsedAt = database.Now()
q.workspaces[index] = workspace
return nil
}
+4 -1
View File
@@ -25,7 +25,10 @@ CREATE TYPE audit_action AS ENUM (
CREATE TYPE build_reason AS ENUM (
'initiator',
'autostart',
'autostop'
'autostop',
'autolock',
'failedstop',
'autodelete'
);
CREATE TYPE log_level AS ENUM (
@@ -0,0 +1 @@
-- It's not possible to delete enum values.
@@ -0,0 +1,5 @@
BEGIN;
ALTER TYPE build_reason ADD VALUE IF NOT EXISTS 'autolock';
ALTER TYPE build_reason ADD VALUE IF NOT EXISTS 'failedstop';
ALTER TYPE build_reason ADD VALUE IF NOT EXISTS 'autodelete';
COMMIT;
+13 -4
View File
@@ -214,9 +214,12 @@ func AllAuditActionValues() []AuditAction {
type BuildReason string
const (
BuildReasonInitiator BuildReason = "initiator"
BuildReasonAutostart BuildReason = "autostart"
BuildReasonAutostop BuildReason = "autostop"
BuildReasonInitiator BuildReason = "initiator"
BuildReasonAutostart BuildReason = "autostart"
BuildReasonAutostop BuildReason = "autostop"
BuildReasonAutolock BuildReason = "autolock"
BuildReasonFailedstop BuildReason = "failedstop"
BuildReasonAutodelete BuildReason = "autodelete"
)
func (e *BuildReason) Scan(src interface{}) error {
@@ -258,7 +261,10 @@ func (e BuildReason) Valid() bool {
switch e {
case BuildReasonInitiator,
BuildReasonAutostart,
BuildReasonAutostop:
BuildReasonAutostop,
BuildReasonAutolock,
BuildReasonFailedstop,
BuildReasonAutodelete:
return true
}
return false
@@ -269,6 +275,9 @@ func AllBuildReasonValues() []BuildReason {
BuildReasonInitiator,
BuildReasonAutostart,
BuildReasonAutostop,
BuildReasonAutolock,
BuildReasonFailedstop,
BuildReasonAutodelete,
}
}
+18 -1
View File
@@ -8663,6 +8663,8 @@ LEFT JOIN
workspace_builds ON workspace_builds.workspace_id = workspaces.id
INNER JOIN
provisioner_jobs ON workspace_builds.job_id = provisioner_jobs.id
INNER JOIN
templates ON workspaces.template_id = templates.id
WHERE
workspace_builds.build_number = (
SELECT
@@ -8700,6 +8702,20 @@ WHERE
provisioner_jobs.error IS NOT NULL AND
provisioner_jobs.error != '' AND
workspace_builds.transition = 'start'::workspace_transition
) OR
-- If the workspace's template has an inactivity_ttl set
-- it may be eligible for locking.
(
templates.inactivity_ttl > 0 AND
workspaces.locked_at IS NULL
) OR
-- If the workspace's template has a locked_ttl set
-- and the workspace is already locked
(
templates.locked_ttl > 0 AND
workspaces.locked_at IS NOT NULL
)
) AND workspaces.deleted = 'false'
`
@@ -8899,7 +8915,8 @@ const updateWorkspaceLockedAt = `-- name: UpdateWorkspaceLockedAt :exec
UPDATE
workspaces
SET
locked_at = $2
locked_at = $2,
last_used_at = now() at time zone 'utc'
WHERE
id = $1
`
+18 -1
View File
@@ -414,6 +414,8 @@ LEFT JOIN
workspace_builds ON workspace_builds.workspace_id = workspaces.id
INNER JOIN
provisioner_jobs ON workspace_builds.job_id = provisioner_jobs.id
INNER JOIN
templates ON workspaces.template_id = templates.id
WHERE
workspace_builds.build_number = (
SELECT
@@ -451,6 +453,20 @@ WHERE
provisioner_jobs.error IS NOT NULL AND
provisioner_jobs.error != '' AND
workspace_builds.transition = 'start'::workspace_transition
) OR
-- If the workspace's template has an inactivity_ttl set
-- it may be eligible for locking.
(
templates.inactivity_ttl > 0 AND
workspaces.locked_at IS NULL
) OR
-- If the workspace's template has a locked_ttl set
-- and the workspace is already locked
(
templates.locked_ttl > 0 AND
workspaces.locked_at IS NOT NULL
)
) AND workspaces.deleted = 'false';
@@ -458,6 +474,7 @@ WHERE
UPDATE
workspaces
SET
locked_at = $2
locked_at = $2,
last_used_at = now() at time zone 'utc'
WHERE
id = $1;