Skip to content

feat(coderd): notify when workspace is marked as dormant #13868

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 44 commits into from
Jul 24, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
9a398e7
feat(coderd): notify when workspace is marked as dormant
BrunoQuaresma Jul 10, 2024
fbf99be
Fix role
BrunoQuaresma Jul 10, 2024
40e5801
Apply Danny suggestions
BrunoQuaresma Jul 11, 2024
9a35cbb
Notify dormant workspace on lifecycle executor
BrunoQuaresma Jul 11, 2024
0701572
Notify dormancy on template schedule
BrunoQuaresma Jul 11, 2024
64cf76b
Apply Danny review suggestions
BrunoQuaresma Jul 12, 2024
b2f9180
Fix mismatch usage
BrunoQuaresma Jul 12, 2024
a445c4c
Resolve migration conflict
BrunoQuaresma Jul 12, 2024
bdc08d6
Merge branch 'main' of https://github.com/coder/coder into bq/impleme…
BrunoQuaresma Jul 12, 2024
ee7d542
Return error instead of receiving the logger
BrunoQuaresma Jul 12, 2024
f6db3c7
Improve verbiage
BrunoQuaresma Jul 12, 2024
95c784a
Merge branch 'main' of github.com:/coder/coder into bq/implement-noti…
dannykopping Jul 15, 2024
68bcfb0
Merge branch 'main' of github.com:/coder/coder into bq/implement-noti…
dannykopping Jul 16, 2024
467a797
Possible implementation simplification
dannykopping Jul 16, 2024
853e59e
Merge branch 'main' of https://github.com/coder/coder into bq/impleme…
BrunoQuaresma Jul 17, 2024
bbcb28e
Apply fmt
BrunoQuaresma Jul 17, 2024
e3c6f49
Notify after executor is done
BrunoQuaresma Jul 17, 2024
20a8766
Revert refactoring mistake
dannykopping Jul 18, 2024
e087172
Add workspace name to the log
BrunoQuaresma Jul 18, 2024
4b99061
Set a fake enqueuer on coderdtest options
BrunoQuaresma Jul 18, 2024
1932168
Merge branch 'bq/implement-notifications' of https://github.com/coder…
BrunoQuaresma Jul 18, 2024
36c043c
Fix migration
BrunoQuaresma Jul 18, 2024
d07f9d8
Fix migration sql
BrunoQuaresma Jul 18, 2024
21f7c35
Merge branch 'main' of https://github.com/coder/coder into bq/impleme…
BrunoQuaresma Jul 18, 2024
72da82d
Fix typo
BrunoQuaresma Jul 18, 2024
b49cd08
Fix migration number
BrunoQuaresma Jul 18, 2024
6f61f9f
Merge branch 'main' of https://github.com/coder/coder into bq/impleme…
BrunoQuaresma Jul 18, 2024
281b545
Apply Marcin comments
BrunoQuaresma Jul 18, 2024
7f73d90
Fix lint
BrunoQuaresma Jul 18, 2024
7c5de97
Update coderd/autobuild/lifecycle_executor.go
BrunoQuaresma Jul 18, 2024
299cd7f
Apply dannys comment
BrunoQuaresma Jul 18, 2024
16a3c19
Simplify dormancy template
BrunoQuaresma Jul 22, 2024
cf9eaec
Merge branch 'main' of https://github.com/coder/coder into bq/impleme…
BrunoQuaresma Jul 22, 2024
aea55aa
Add test to verify dormancy in lifecycle executor
BrunoQuaresma Jul 22, 2024
6d47c04
Add placeholder
BrunoQuaresma Jul 22, 2024
7b4ae29
make test pass
sreya Jul 23, 2024
308bd69
fix: lint
mtojek Jul 23, 2024
10ff6cf
Merge branch 'main' of https://github.com/coder/coder into bq/impleme…
BrunoQuaresma Jul 23, 2024
48ad269
Add test to verify notification in lifecycle executor
BrunoQuaresma Jul 23, 2024
0226fdf
Add notification for marked as deletion
BrunoQuaresma Jul 23, 2024
4d71c94
Apply Dannys review comments
BrunoQuaresma Jul 24, 2024
e1d5fec
Fix SQL
BrunoQuaresma Jul 24, 2024
a2023a1
Rollback dormant at test
BrunoQuaresma Jul 24, 2024
bae985c
Fix template
BrunoQuaresma Jul 24, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Possible implementation simplification
Signed-off-by: Danny Kopping <danny@coder.com>
  • Loading branch information
dannykopping committed Jul 16, 2024
commit 467a797edcd927d66c47f0ef44b52f0bee22f05e

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
INSERT INTO notification_templates (id, name, title_template, body_template, "group", actions)
VALUES ('123e4567-e89b-12d3-a456-426614174000', 'Workspace Marked as Dormant', E'Workspace "{{.Labels.name}}" marked as dormant',
E'Hi {{.UserName}}\n\n' ||
E'Your workspace **{{.Labels.name}}** has been marked as **dormant**.\n' ||
E'The specified reason was "**{{.Labels.reason}}{{ if .Labels.initiator }} (initiated by: {{ .Labels.initiator }}){{end}}**\n\n' ||
E'Dormancy refers to a workspace being unused for a defined length of time, and after it exceeds {{.Labels.dormancyHours}} hours of dormancy it will be deleted.\n' ||
E'To prevent your workspace from being deleted, simply use it as normal.',
'Workspace Events', '[
{
"label": "View workspace",
"url": "{{ base_url }}/@{{.UserName}}/{{.Labels.name}}"
}
]'::jsonb);
11 changes: 4 additions & 7 deletions coderd/schedule/mock.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,12 @@ import (

"github.com/google/uuid"

"cdr.dev/slog"

"github.com/coder/coder/v2/coderd/database"
"github.com/coder/coder/v2/coderd/notifications"
)

type MockTemplateScheduleStore struct {
GetFn func(ctx context.Context, db database.Store, templateID uuid.UUID) (TemplateScheduleOptions, error)
SetFn func(ctx context.Context, db database.Store, template database.Template, options TemplateScheduleOptions, enqueuer notifications.Enqueuer, logger slog.Logger) (database.Template, error)
SetFn func(ctx context.Context, db database.Store, template database.Template, options TemplateScheduleOptions) (database.Template, error)
}

var _ TemplateScheduleStore = MockTemplateScheduleStore{}
Expand All @@ -26,12 +23,12 @@ func (m MockTemplateScheduleStore) Get(ctx context.Context, db database.Store, t
return NewAGPLTemplateScheduleStore().Get(ctx, db, templateID)
}

func (m MockTemplateScheduleStore) Set(ctx context.Context, db database.Store, template database.Template, options TemplateScheduleOptions, enqueuer notifications.Enqueuer, logger slog.Logger) (database.Template, error) {
func (m MockTemplateScheduleStore) Set(ctx context.Context, db database.Store, template database.Template, opts TemplateScheduleOptions) (database.Template, error) {
if m.SetFn != nil {
return m.SetFn(ctx, db, template, options, enqueuer, logger)
return m.SetFn(ctx, db, template, opts)
}

return NewAGPLTemplateScheduleStore().Set(ctx, db, template, options, enqueuer, logger)
return NewAGPLTemplateScheduleStore().Set(ctx, db, template, opts)
}

type MockUserQuietHoursScheduleStore struct {
Expand Down
7 changes: 2 additions & 5 deletions coderd/schedule/template.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,11 @@ import (
"context"
"time"

"cdr.dev/slog"

"github.com/google/uuid"
"golang.org/x/xerrors"

"github.com/coder/coder/v2/coderd/database"
"github.com/coder/coder/v2/coderd/database/dbtime"
"github.com/coder/coder/v2/coderd/notifications"
"github.com/coder/coder/v2/coderd/tracing"
)

Expand Down Expand Up @@ -155,7 +152,7 @@ type TemplateScheduleOptions struct {
// scheduling options set by the template/site admin.
type TemplateScheduleStore interface {
Get(ctx context.Context, db database.Store, templateID uuid.UUID) (TemplateScheduleOptions, error)
Set(ctx context.Context, db database.Store, template database.Template, opts TemplateScheduleOptions, enqueuer notifications.Enqueuer, log slog.Logger) (database.Template, error)
Set(ctx context.Context, db database.Store, template database.Template, opts TemplateScheduleOptions) (database.Template, error)
}

type agplTemplateScheduleStore struct{}
Expand Down Expand Up @@ -200,7 +197,7 @@ func (*agplTemplateScheduleStore) Get(ctx context.Context, db database.Store, te
}, nil
}

func (*agplTemplateScheduleStore) Set(ctx context.Context, db database.Store, tpl database.Template, opts TemplateScheduleOptions, enqueuer notifications.Enqueuer, log slog.Logger) (database.Template, error) {
func (*agplTemplateScheduleStore) Set(ctx context.Context, db database.Store, tpl database.Template, opts TemplateScheduleOptions) (database.Template, error) {
ctx, span := tracing.StartSpan(ctx)
defer span.End()

Expand Down
4 changes: 2 additions & 2 deletions coderd/templates.go
Original file line number Diff line number Diff line change
Expand Up @@ -383,7 +383,7 @@ func (api *API) postTemplateByOrganization(rw http.ResponseWriter, r *http.Reque
FailureTTL: failureTTL,
TimeTilDormant: dormantTTL,
TimeTilDormantAutoDelete: dormantAutoDeletionTTL,
}, api.NotificationsEnqueuer, api.Logger)
})
if err != nil {
return xerrors.Errorf("set template schedule options: %s", err)
}
Expand Down Expand Up @@ -776,7 +776,7 @@ func (api *API) patchTemplateMeta(rw http.ResponseWriter, r *http.Request) {
TimeTilDormantAutoDelete: timeTilDormantAutoDelete,
UpdateWorkspaceLastUsedAt: updateWorkspaceLastUsedAt,
UpdateWorkspaceDormantAt: req.UpdateWorkspaceDormantAt,
}, api.NotificationsEnqueuer, api.Logger)
})
if err != nil {
return xerrors.Errorf("set template schedule options: %w", err)
}
Expand Down
17 changes: 8 additions & 9 deletions coderd/templates_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,14 @@ import (
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"

"cdr.dev/slog"
"cdr.dev/slog/sloggers/slogtest"

"github.com/coder/coder/v2/agent/agenttest"
"github.com/coder/coder/v2/coderd/audit"
"github.com/coder/coder/v2/coderd/coderdtest"
"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/notifications"
"github.com/coder/coder/v2/coderd/rbac"
"github.com/coder/coder/v2/coderd/schedule"
"github.com/coder/coder/v2/coderd/util/ptr"
Expand Down Expand Up @@ -192,7 +191,7 @@ func TestPostTemplateByOrganization(t *testing.T) {
var setCalled int64
client := coderdtest.New(t, &coderdtest.Options{
TemplateScheduleStore: schedule.MockTemplateScheduleStore{
SetFn: func(ctx context.Context, db database.Store, template database.Template, options schedule.TemplateScheduleOptions, enqueuer notifications.Enqueuer, logger slog.Logger) (database.Template, error) {
SetFn: func(ctx context.Context, db database.Store, template database.Template, options schedule.TemplateScheduleOptions) (database.Template, error) {
atomic.AddInt64(&setCalled, 1)
require.False(t, options.UserAutostartEnabled)
require.False(t, options.UserAutostopEnabled)
Expand Down Expand Up @@ -269,7 +268,7 @@ func TestPostTemplateByOrganization(t *testing.T) {
var setCalled int64
client := coderdtest.New(t, &coderdtest.Options{
TemplateScheduleStore: schedule.MockTemplateScheduleStore{
SetFn: func(ctx context.Context, db database.Store, template database.Template, options schedule.TemplateScheduleOptions, enqueuer notifications.Enqueuer, logger slog.Logger) (database.Template, error) {
SetFn: func(ctx context.Context, db database.Store, template database.Template, options schedule.TemplateScheduleOptions) (database.Template, error) {
atomic.AddInt64(&setCalled, 1)
assert.Zero(t, options.AutostopRequirement.DaysOfWeek)
assert.Zero(t, options.AutostopRequirement.Weeks)
Expand Down Expand Up @@ -319,7 +318,7 @@ func TestPostTemplateByOrganization(t *testing.T) {
var setCalled int64
client := coderdtest.New(t, &coderdtest.Options{
TemplateScheduleStore: schedule.MockTemplateScheduleStore{
SetFn: func(ctx context.Context, db database.Store, template database.Template, options schedule.TemplateScheduleOptions, enqueuer notifications.Enqueuer, logger slog.Logger) (database.Template, error) {
SetFn: func(ctx context.Context, db database.Store, template database.Template, options schedule.TemplateScheduleOptions) (database.Template, error) {
atomic.AddInt64(&setCalled, 1)
assert.EqualValues(t, 0b00110000, options.AutostopRequirement.DaysOfWeek)
assert.EqualValues(t, 2, options.AutostopRequirement.Weeks)
Expand Down Expand Up @@ -759,7 +758,7 @@ func TestPatchTemplateMeta(t *testing.T) {
var setCalled int64
client := coderdtest.New(t, &coderdtest.Options{
TemplateScheduleStore: schedule.MockTemplateScheduleStore{
SetFn: func(ctx context.Context, db database.Store, template database.Template, options schedule.TemplateScheduleOptions, enqueuer notifications.Enqueuer, logger slog.Logger) (database.Template, error) {
SetFn: func(ctx context.Context, db database.Store, template database.Template, options schedule.TemplateScheduleOptions) (database.Template, error) {
if atomic.AddInt64(&setCalled, 1) == 2 {
require.Equal(t, failureTTL, options.FailureTTL)
require.Equal(t, inactivityTTL, options.TimeTilDormant)
Expand Down Expand Up @@ -854,7 +853,7 @@ func TestPatchTemplateMeta(t *testing.T) {
allowAutostop.Store(true)
client := coderdtest.New(t, &coderdtest.Options{
TemplateScheduleStore: schedule.MockTemplateScheduleStore{
SetFn: func(ctx context.Context, db database.Store, template database.Template, options schedule.TemplateScheduleOptions, enqueuer notifications.Enqueuer, logger slog.Logger) (database.Template, error) {
SetFn: func(ctx context.Context, db database.Store, template database.Template, options schedule.TemplateScheduleOptions) (database.Template, error) {
atomic.AddInt64(&setCalled, 1)
assert.Equal(t, allowAutostart.Load(), options.UserAutostartEnabled)
assert.Equal(t, allowAutostop.Load(), options.UserAutostopEnabled)
Expand Down Expand Up @@ -1024,7 +1023,7 @@ func TestPatchTemplateMeta(t *testing.T) {
var setCalled int64
client := coderdtest.New(t, &coderdtest.Options{
TemplateScheduleStore: schedule.MockTemplateScheduleStore{
SetFn: func(ctx context.Context, db database.Store, template database.Template, options schedule.TemplateScheduleOptions, enqueuer notifications.Enqueuer, logger slog.Logger) (database.Template, error) {
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, 0b0110000, options.AutostopRequirement.DaysOfWeek)
assert.EqualValues(t, 2, options.AutostopRequirement.Weeks)
Expand Down Expand Up @@ -1095,7 +1094,7 @@ func TestPatchTemplateMeta(t *testing.T) {
var setCalled int64
client := coderdtest.New(t, &coderdtest.Options{
TemplateScheduleStore: schedule.MockTemplateScheduleStore{
SetFn: func(ctx context.Context, db database.Store, template database.Template, options schedule.TemplateScheduleOptions, enqueuer notifications.Enqueuer, logger slog.Logger) (database.Template, error) {
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, 1, options.AutostopRequirement.Weeks)
Expand Down
2 changes: 1 addition & 1 deletion coderd/workspaces_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3547,7 +3547,7 @@ func TestNotifications(t *testing.T) {
require.Contains(t, notifyEnq.Sent[0].Targets, workspace.ID)
require.Contains(t, notifyEnq.Sent[0].Targets, workspace.OrganizationID)
require.Contains(t, notifyEnq.Sent[0].Targets, workspace.OwnerID)
require.Equal(t, notifyEnq.Sent[0].Labels["initiatedBy"], member.Username)
require.Equal(t, notifyEnq.Sent[0].Labels["initiator"], member.Username)
})

t.Run("InitiatorIsOwner", func(t *testing.T) {
Expand Down
3 changes: 2 additions & 1 deletion enterprise/coderd/coderd.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import (
"github.com/prometheus/client_golang/prometheus"

"cdr.dev/slog"

"github.com/coder/coder/v2/coderd"
agplaudit "github.com/coder/coder/v2/coderd/audit"
agpldbauthz "github.com/coder/coder/v2/coderd/database/dbauthz"
Expand Down Expand Up @@ -632,7 +633,7 @@ func (api *API) updateEntitlements(ctx context.Context) error {

if initial, changed, enabled := featureChanged(codersdk.FeatureAdvancedTemplateScheduling); shouldUpdate(initial, changed, enabled) {
if enabled {
templateStore := schedule.NewEnterpriseTemplateScheduleStore(api.AGPL.UserQuietHoursScheduleStore)
templateStore := schedule.NewEnterpriseTemplateScheduleStore(api.AGPL.UserQuietHoursScheduleStore, api.NotificationsEnqueuer, api.Logger.Named("template.schedule-store"))
templateStoreInterface := agplschedule.TemplateScheduleStore(templateStore)
api.AGPL.TemplateScheduleStore.Store(&templateStoreInterface)

Expand Down
14 changes: 8 additions & 6 deletions enterprise/coderd/schedule/template.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,15 +33,17 @@ type EnterpriseTemplateScheduleStore struct {
// Custom time.Now() function to use in tests. Defaults to dbtime.Now().
TimeNowFn func() time.Time

// NotificationsEnqueuer handles enqueueing notifications for delivery by SMTP, webhook, etc.
NotificationsEnqueuer notifications.Enqueuer
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,
}
}

Expand Down Expand Up @@ -97,7 +99,7 @@ func (*EnterpriseTemplateScheduleStore) Get(ctx context.Context, db database.Sto
}

// Set implements agpl.TemplateScheduleStore.
func (s *EnterpriseTemplateScheduleStore) Set(ctx context.Context, db database.Store, tpl database.Template, opts agpl.TemplateScheduleOptions, enqueuer notifications.Enqueuer, logger slog.Logger) (database.Template, error) {
func (s *EnterpriseTemplateScheduleStore) Set(ctx context.Context, db database.Store, tpl database.Template, opts agpl.TemplateScheduleOptions) (database.Template, error) {
ctx, span := tracing.StartSpan(ctx)
defer span.End()

Expand Down Expand Up @@ -206,7 +208,7 @@ func (s *EnterpriseTemplateScheduleStore) Set(ctx context.Context, db database.S
for _, workspace := range dormantWorkspaces {
_, err = dormancy.NotifyWorkspaceDormant(
ctx,
enqueuer,
s.enqueuer,
dormancy.WorkspaceDormantNotification{
Workspace: workspace,
Initiator: "system",
Expand All @@ -215,7 +217,7 @@ func (s *EnterpriseTemplateScheduleStore) Set(ctx context.Context, db database.S
},
)
if err != nil {
logger.Warn(ctx, "failed to notify of workspace marked as dormant", slog.Error(err))
s.logger.Warn(ctx, "failed to notify of workspace marked as dormant", slog.Error(err))
}
}

Expand Down
18 changes: 11 additions & 7 deletions enterprise/coderd/schedule/template_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,16 @@ import (
"testing"
"time"

"cdr.dev/slog"
"cdr.dev/slog/sloggers/slogtest"
"github.com/google/uuid"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"

"cdr.dev/slog"
"cdr.dev/slog/sloggers/slogtest"

"github.com/coder/coder/v2/coderd/database"
"github.com/coder/coder/v2/coderd/database/dbgen"
"github.com/coder/coder/v2/coderd/database/dbtestutil"
"github.com/coder/coder/v2/coderd/notifications"
agplschedule "github.com/coder/coder/v2/coderd/schedule"
"github.com/coder/coder/v2/coderd/util/ptr"
"github.com/coder/coder/v2/cryptorand"
Expand Down Expand Up @@ -273,13 +273,15 @@ func TestTemplateUpdateBuildDeadlines(t *testing.T) {
wsBuild, err = db.GetWorkspaceBuildByID(ctx, wsBuild.ID)
require.NoError(t, err)

logger := slogtest.Make(t, &slogtest.Options{IgnoreErrors: true}).Leveled(slog.LevelDebug)

userQuietHoursStore, err := schedule.NewEnterpriseUserQuietHoursScheduleStore(userQuietHoursSchedule, true)
require.NoError(t, err)
userQuietHoursStorePtr := &atomic.Pointer[agplschedule.UserQuietHoursScheduleStore]{}
userQuietHoursStorePtr.Store(&userQuietHoursStore)

// Set the template policy.
templateScheduleStore := schedule.NewEnterpriseTemplateScheduleStore(userQuietHoursStorePtr)
templateScheduleStore := schedule.NewEnterpriseTemplateScheduleStore(userQuietHoursStorePtr, notifications.NewNoopEnqueuer(), logger)
templateScheduleStore.TimeNowFn = func() time.Time {
return c.now
}
Expand All @@ -300,7 +302,7 @@ func TestTemplateUpdateBuildDeadlines(t *testing.T) {
FailureTTL: 0,
TimeTilDormant: 0,
TimeTilDormantAutoDelete: 0,
}, nil, slogtest.Make(t, &slogtest.Options{IgnoreErrors: true}).Leveled(slog.LevelDebug))
})
require.NoError(t, err)

// Check that the workspace build has the expected deadlines.
Expand Down Expand Up @@ -558,13 +560,15 @@ func TestTemplateUpdateBuildDeadlinesSkip(t *testing.T) {
require.NoError(t, err)
}

logger := slogtest.Make(t, &slogtest.Options{IgnoreErrors: true}).Leveled(slog.LevelDebug)

userQuietHoursStore, err := schedule.NewEnterpriseUserQuietHoursScheduleStore(userQuietHoursSchedule, true)
require.NoError(t, err)
userQuietHoursStorePtr := &atomic.Pointer[agplschedule.UserQuietHoursScheduleStore]{}
userQuietHoursStorePtr.Store(&userQuietHoursStore)

// Set the template policy.
templateScheduleStore := schedule.NewEnterpriseTemplateScheduleStore(userQuietHoursStorePtr)
templateScheduleStore := schedule.NewEnterpriseTemplateScheduleStore(userQuietHoursStorePtr, notifications.NewNoopEnqueuer(), logger)
templateScheduleStore.TimeNowFn = func() time.Time {
return now
}
Expand All @@ -580,7 +584,7 @@ func TestTemplateUpdateBuildDeadlinesSkip(t *testing.T) {
FailureTTL: 0,
TimeTilDormant: 0,
TimeTilDormantAutoDelete: 0,
}, nil, slogtest.Make(t, &slogtest.Options{IgnoreErrors: true}).Leveled(slog.LevelDebug))
})
require.NoError(t, err)

// Check each build.
Expand Down
9 changes: 7 additions & 2 deletions enterprise/coderd/templates_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,16 @@ import (
"testing"
"time"

"cdr.dev/slog"
"cdr.dev/slog/sloggers/slogtest"
"github.com/google/uuid"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"

"github.com/coder/coder/v2/coderd/audit"
"github.com/coder/coder/v2/coderd/coderdtest"
"github.com/coder/coder/v2/coderd/database"
"github.com/coder/coder/v2/coderd/notifications"
"github.com/coder/coder/v2/coderd/rbac"
"github.com/coder/coder/v2/coderd/util/ptr"
"github.com/coder/coder/v2/codersdk"
Expand All @@ -29,6 +32,8 @@ import (
func TestTemplates(t *testing.T) {
t.Parallel()

logger := slogtest.Make(t, &slogtest.Options{IgnoreErrors: true}).Leveled(slog.LevelDebug)

t.Run("Deprecated", func(t *testing.T) {
t.Parallel()

Expand Down Expand Up @@ -637,7 +642,7 @@ func TestTemplates(t *testing.T) {
client, user := coderdenttest.New(t, &coderdenttest.Options{
Options: &coderdtest.Options{
IncludeProvisionerDaemon: true,
TemplateScheduleStore: schedule.NewEnterpriseTemplateScheduleStore(agplUserQuietHoursScheduleStore()),
TemplateScheduleStore: schedule.NewEnterpriseTemplateScheduleStore(agplUserQuietHoursScheduleStore(), notifications.NewNoopEnqueuer(), logger),
},
LicenseOptions: &coderdenttest.LicenseOptions{
Features: license.Features{
Expand Down Expand Up @@ -687,7 +692,7 @@ func TestTemplates(t *testing.T) {
owner, first := coderdenttest.New(t, &coderdenttest.Options{
Options: &coderdtest.Options{
IncludeProvisionerDaemon: true,
TemplateScheduleStore: schedule.NewEnterpriseTemplateScheduleStore(agplUserQuietHoursScheduleStore()),
TemplateScheduleStore: schedule.NewEnterpriseTemplateScheduleStore(agplUserQuietHoursScheduleStore(), notifications.NewNoopEnqueuer(), logger),
},
LicenseOptions: &coderdenttest.LicenseOptions{
Features: license.Features{
Expand Down
Loading
Loading