mirror of
https://github.com/coder/coder.git
synced 2026-09-24 15:04:27 +08:00
feat: add deleting_at column to workspaces (#8333)
This commit is contained in:
+8
-20
@@ -12,7 +12,6 @@ import (
|
||||
|
||||
"github.com/go-chi/chi/v5"
|
||||
"github.com/google/uuid"
|
||||
"golang.org/x/exp/slices"
|
||||
"golang.org/x/xerrors"
|
||||
|
||||
"cdr.dev/slog"
|
||||
@@ -797,7 +796,7 @@ func (api *API) putWorkspaceLock(rw http.ResponseWriter, r *http.Request) {
|
||||
lockedAt.Time = database.Now()
|
||||
}
|
||||
|
||||
err := api.Database.UpdateWorkspaceLockedAt(ctx, database.UpdateWorkspaceLockedAtParams{
|
||||
err := api.Database.UpdateWorkspaceLockedDeletingAt(ctx, database.UpdateWorkspaceLockedDeletingAtParams{
|
||||
ID: workspace.ID,
|
||||
LockedAt: lockedAt,
|
||||
})
|
||||
@@ -1119,6 +1118,11 @@ func convertWorkspace(
|
||||
lockedAt = &workspace.LockedAt.Time
|
||||
}
|
||||
|
||||
var deletedAt *time.Time
|
||||
if workspace.DeletingAt.Valid {
|
||||
deletedAt = &workspace.DeletingAt.Time
|
||||
}
|
||||
|
||||
failingAgents := []uuid.UUID{}
|
||||
for _, resource := range workspaceBuild.Resources {
|
||||
for _, agent := range resource.Agents {
|
||||
@@ -1128,10 +1132,7 @@ func convertWorkspace(
|
||||
}
|
||||
}
|
||||
|
||||
var (
|
||||
ttlMillis = convertWorkspaceTTLMillis(workspace.Ttl)
|
||||
deletingAt = calculateDeletingAt(workspace, template, workspaceBuild)
|
||||
)
|
||||
ttlMillis := convertWorkspaceTTLMillis(workspace.Ttl)
|
||||
|
||||
return codersdk.Workspace{
|
||||
ID: workspace.ID,
|
||||
@@ -1151,7 +1152,7 @@ func convertWorkspace(
|
||||
AutostartSchedule: autostartSchedule,
|
||||
TTLMillis: ttlMillis,
|
||||
LastUsedAt: workspace.LastUsedAt,
|
||||
DeletingAt: deletingAt,
|
||||
DeletingAt: deletedAt,
|
||||
LockedAt: lockedAt,
|
||||
Health: codersdk.WorkspaceHealth{
|
||||
Healthy: len(failingAgents) == 0,
|
||||
@@ -1169,19 +1170,6 @@ func convertWorkspaceTTLMillis(i sql.NullInt64) *int64 {
|
||||
return &millis
|
||||
}
|
||||
|
||||
// Calculate the time of the upcoming workspace deletion, if applicable; otherwise, return nil.
|
||||
// Workspaces may have impending deletions if InactivityTTL feature is turned on and the workspace is inactive.
|
||||
func calculateDeletingAt(workspace database.Workspace, template database.Template, build codersdk.WorkspaceBuild) *time.Time {
|
||||
inactiveStatuses := []codersdk.WorkspaceStatus{codersdk.WorkspaceStatusStopped, codersdk.WorkspaceStatusCanceled, codersdk.WorkspaceStatusFailed, codersdk.WorkspaceStatusDeleted}
|
||||
isInactive := slices.Contains(inactiveStatuses, build.Status)
|
||||
// If InactivityTTL is turned off (set to 0) or if the workspace is active, there is no impending deletion
|
||||
if template.InactivityTTL == 0 || !isInactive {
|
||||
return nil
|
||||
}
|
||||
|
||||
return ptr.Ref(workspace.LastUsedAt.Add(time.Duration(template.InactivityTTL) * time.Nanosecond))
|
||||
}
|
||||
|
||||
func validWorkspaceTTLMillis(millis *int64, templateDefault, templateMax time.Duration) (sql.NullInt64, error) {
|
||||
if templateDefault == 0 && templateMax != 0 || (templateMax > 0 && templateDefault > templateMax) {
|
||||
templateDefault = templateMax
|
||||
|
||||
Reference in New Issue
Block a user