mirror of
https://github.com/coder/coder.git
synced 2025-07-21 01:28:49 +00:00
feat(coderd): notify when workspace is marked as dormant (#13868)
This commit is contained in:
@ -6,6 +6,8 @@ import (
|
||||
"sync/atomic"
|
||||
"time"
|
||||
|
||||
"cdr.dev/slog"
|
||||
|
||||
"github.com/google/uuid"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"go.opentelemetry.io/otel/trace"
|
||||
@ -14,6 +16,8 @@ import (
|
||||
"github.com/coder/coder/v2/coderd/database"
|
||||
"github.com/coder/coder/v2/coderd/database/dbauthz"
|
||||
"github.com/coder/coder/v2/coderd/database/dbtime"
|
||||
"github.com/coder/coder/v2/coderd/dormancy"
|
||||
"github.com/coder/coder/v2/coderd/notifications"
|
||||
agpl "github.com/coder/coder/v2/coderd/schedule"
|
||||
"github.com/coder/coder/v2/coderd/tracing"
|
||||
"github.com/coder/coder/v2/codersdk"
|
||||
@ -28,13 +32,18 @@ type EnterpriseTemplateScheduleStore struct {
|
||||
|
||||
// Custom time.Now() function to use in tests. Defaults to dbtime.Now().
|
||||
TimeNowFn func() time.Time
|
||||
|
||||
enqueuer notifications.Enqueuer
|
||||
logger slog.Logger
|
||||
}
|
||||
|
||||
var _ agpl.TemplateScheduleStore = &EnterpriseTemplateScheduleStore{}
|
||||
|
||||
func NewEnterpriseTemplateScheduleStore(userQuietHoursStore *atomic.Pointer[agpl.UserQuietHoursScheduleStore]) *EnterpriseTemplateScheduleStore {
|
||||
func NewEnterpriseTemplateScheduleStore(userQuietHoursStore *atomic.Pointer[agpl.UserQuietHoursScheduleStore], enqueuer notifications.Enqueuer, logger slog.Logger) *EnterpriseTemplateScheduleStore {
|
||||
return &EnterpriseTemplateScheduleStore{
|
||||
UserQuietHoursScheduleStore: userQuietHoursStore,
|
||||
enqueuer: enqueuer,
|
||||
logger: logger,
|
||||
}
|
||||
}
|
||||
|
||||
@ -125,7 +134,10 @@ func (s *EnterpriseTemplateScheduleStore) Set(ctx context.Context, db database.S
|
||||
return database.Template{}, xerrors.Errorf("verify autostart requirement: %w", err)
|
||||
}
|
||||
|
||||
var template database.Template
|
||||
var (
|
||||
template database.Template
|
||||
markedForDeletion []database.Workspace
|
||||
)
|
||||
err = db.InTx(func(tx database.Store) error {
|
||||
ctx, span := tracing.StartSpanWithName(ctx, "(*schedule.EnterpriseTemplateScheduleStore).Set()-InTx()")
|
||||
defer span.End()
|
||||
@ -159,7 +171,7 @@ func (s *EnterpriseTemplateScheduleStore) Set(ctx context.Context, db database.S
|
||||
// to ensure workspaces are being cleaned up correctly. Similarly if we are
|
||||
// disabling it (by passing 0), then we want to delete nullify the deleting_at
|
||||
// fields of all the template workspaces.
|
||||
err = tx.UpdateWorkspacesDormantDeletingAtByTemplateID(ctx, database.UpdateWorkspacesDormantDeletingAtByTemplateIDParams{
|
||||
markedForDeletion, err = tx.UpdateWorkspacesDormantDeletingAtByTemplateID(ctx, database.UpdateWorkspacesDormantDeletingAtByTemplateIDParams{
|
||||
TemplateID: tpl.ID,
|
||||
TimeTilDormantAutodeleteMs: opts.TimeTilDormantAutoDelete.Milliseconds(),
|
||||
DormantAt: dormantAt,
|
||||
@ -193,6 +205,21 @@ func (s *EnterpriseTemplateScheduleStore) Set(ctx context.Context, db database.S
|
||||
return database.Template{}, err
|
||||
}
|
||||
|
||||
for _, workspace := range markedForDeletion {
|
||||
_, err = dormancy.NotifyWorkspaceMarkedForDeletion(
|
||||
ctx,
|
||||
s.enqueuer,
|
||||
dormancy.WorkspaceMarkedForDeletionNotification{
|
||||
Workspace: workspace,
|
||||
Reason: "template updated to new dormancy policy",
|
||||
CreatedBy: "scheduletemplate",
|
||||
},
|
||||
)
|
||||
if err != nil {
|
||||
s.logger.Warn(ctx, "failed to notify of workspace marked for deletion", slog.Error(err), slog.F("workspace_id", workspace.ID))
|
||||
}
|
||||
}
|
||||
|
||||
return template, nil
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user