From 78e6c4d7bff51a61053ed9f8bf4ed2e59eb58ecc Mon Sep 17 00:00:00 2001 From: Marcin Tojek Date: Thu, 23 Nov 2023 12:44:37 +0100 Subject: [PATCH 1/7] db: dismissed healthchecks --- coderd/database/dbauthz/dbauthz.go | 8 +++++++ coderd/database/dbmem/dbmem.go | 8 +++++++ coderd/database/dbmetrics/dbmetrics.go | 14 +++++++++++++ coderd/database/dbmock/dbmock.go | 29 ++++++++++++++++++++++++++ coderd/database/querier.go | 2 ++ coderd/database/queries.sql.go | 21 +++++++++++++++++++ coderd/database/queries/siteconfig.sql | 7 +++++++ 7 files changed, 89 insertions(+) diff --git a/coderd/database/dbauthz/dbauthz.go b/coderd/database/dbauthz/dbauthz.go index 9087bef4df8ef..960e8fa6fc48b 100644 --- a/coderd/database/dbauthz/dbauthz.go +++ b/coderd/database/dbauthz/dbauthz.go @@ -948,6 +948,10 @@ func (q *querier) GetDeploymentWorkspaceStats(ctx context.Context) (database.Get return q.db.GetDeploymentWorkspaceStats(ctx) } +func (q *querier) GetDismissedHealthchecks(ctx context.Context) (string, error) { + panic("not implemented") +} + func (q *querier) GetExternalAuthLink(ctx context.Context, arg database.GetExternalAuthLinkParams) (database.ExternalAuthLink, error) { return fetch(q.log, q.auth, q.db.GetExternalAuthLink)(ctx, arg) } @@ -2958,6 +2962,10 @@ func (q *querier) UpsertDefaultProxy(ctx context.Context, arg database.UpsertDef return q.db.UpsertDefaultProxy(ctx, arg) } +func (q *querier) UpsertDismissedHealthchecks(ctx context.Context, value string) error { + panic("not implemented") +} + func (q *querier) UpsertLastUpdateCheck(ctx context.Context, value string) error { if err := q.authorizeContext(ctx, rbac.ActionUpdate, rbac.ResourceSystem); err != nil { return err diff --git a/coderd/database/dbmem/dbmem.go b/coderd/database/dbmem/dbmem.go index aaf8914faa273..5d2475dc3ba89 100644 --- a/coderd/database/dbmem/dbmem.go +++ b/coderd/database/dbmem/dbmem.go @@ -1591,6 +1591,10 @@ func (q *FakeQuerier) GetDeploymentWorkspaceStats(ctx context.Context) (database return stat, nil } +func (q *FakeQuerier) GetDismissedHealthchecks(ctx context.Context) (string, error) { + panic("not implemented") +} + func (q *FakeQuerier) GetExternalAuthLink(_ context.Context, arg database.GetExternalAuthLinkParams) (database.ExternalAuthLink, error) { if err := validateDatabaseType(arg); err != nil { return database.ExternalAuthLink{}, err @@ -6790,6 +6794,10 @@ func (q *FakeQuerier) UpsertDefaultProxy(_ context.Context, arg database.UpsertD return nil } +func (q *FakeQuerier) UpsertDismissedHealthchecks(ctx context.Context, value string) error { + panic("not implemented") +} + func (q *FakeQuerier) UpsertLastUpdateCheck(_ context.Context, data string) error { q.mutex.Lock() defer q.mutex.Unlock() diff --git a/coderd/database/dbmetrics/dbmetrics.go b/coderd/database/dbmetrics/dbmetrics.go index 115a9bf8b5f20..d83276f694047 100644 --- a/coderd/database/dbmetrics/dbmetrics.go +++ b/coderd/database/dbmetrics/dbmetrics.go @@ -391,6 +391,13 @@ func (m metricsStore) GetDeploymentWorkspaceStats(ctx context.Context) (database return row, err } +func (m metricsStore) GetDismissedHealthchecks(ctx context.Context) (string, error) { + start := time.Now() + r0, r1 := m.s.GetDismissedHealthchecks(ctx) + m.queryLatencies.WithLabelValues("GetDismissedHealthchecks").Observe(time.Since(start).Seconds()) + return r0, r1 +} + func (m metricsStore) GetExternalAuthLink(ctx context.Context, arg database.GetExternalAuthLinkParams) (database.ExternalAuthLink, error) { start := time.Now() link, err := m.s.GetExternalAuthLink(ctx, arg) @@ -1866,6 +1873,13 @@ func (m metricsStore) UpsertDefaultProxy(ctx context.Context, arg database.Upser return r0 } +func (m metricsStore) UpsertDismissedHealthchecks(ctx context.Context, value string) error { + start := time.Now() + r0 := m.s.UpsertDismissedHealthchecks(ctx, value) + m.queryLatencies.WithLabelValues("UpsertDismissedHealthchecks").Observe(time.Since(start).Seconds()) + return r0 +} + func (m metricsStore) UpsertLastUpdateCheck(ctx context.Context, value string) error { start := time.Now() r0 := m.s.UpsertLastUpdateCheck(ctx, value) diff --git a/coderd/database/dbmock/dbmock.go b/coderd/database/dbmock/dbmock.go index 3454dda39445d..52bb719b701ca 100644 --- a/coderd/database/dbmock/dbmock.go +++ b/coderd/database/dbmock/dbmock.go @@ -742,6 +742,21 @@ func (mr *MockStoreMockRecorder) GetDeploymentWorkspaceStats(arg0 interface{}) * return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetDeploymentWorkspaceStats", reflect.TypeOf((*MockStore)(nil).GetDeploymentWorkspaceStats), arg0) } +// GetDismissedHealthchecks mocks base method. +func (m *MockStore) GetDismissedHealthchecks(arg0 context.Context) (string, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetDismissedHealthchecks", arg0) + ret0, _ := ret[0].(string) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetDismissedHealthchecks indicates an expected call of GetDismissedHealthchecks. +func (mr *MockStoreMockRecorder) GetDismissedHealthchecks(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetDismissedHealthchecks", reflect.TypeOf((*MockStore)(nil).GetDismissedHealthchecks), arg0) +} + // GetExternalAuthLink mocks base method. func (m *MockStore) GetExternalAuthLink(arg0 context.Context, arg1 database.GetExternalAuthLinkParams) (database.ExternalAuthLink, error) { m.ctrl.T.Helper() @@ -3917,6 +3932,20 @@ func (mr *MockStoreMockRecorder) UpsertDefaultProxy(arg0, arg1 interface{}) *gom return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpsertDefaultProxy", reflect.TypeOf((*MockStore)(nil).UpsertDefaultProxy), arg0, arg1) } +// UpsertDismissedHealthchecks mocks base method. +func (m *MockStore) UpsertDismissedHealthchecks(arg0 context.Context, arg1 string) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "UpsertDismissedHealthchecks", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// UpsertDismissedHealthchecks indicates an expected call of UpsertDismissedHealthchecks. +func (mr *MockStoreMockRecorder) UpsertDismissedHealthchecks(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpsertDismissedHealthchecks", reflect.TypeOf((*MockStore)(nil).UpsertDismissedHealthchecks), arg0, arg1) +} + // UpsertLastUpdateCheck mocks base method. func (m *MockStore) UpsertLastUpdateCheck(arg0 context.Context, arg1 string) error { m.ctrl.T.Helper() diff --git a/coderd/database/querier.go b/coderd/database/querier.go index cafc1d0249414..9bd85f9268f44 100644 --- a/coderd/database/querier.go +++ b/coderd/database/querier.go @@ -89,6 +89,7 @@ type sqlcQuerier interface { GetDeploymentID(ctx context.Context) (string, error) GetDeploymentWorkspaceAgentStats(ctx context.Context, createdAt time.Time) (GetDeploymentWorkspaceAgentStatsRow, error) GetDeploymentWorkspaceStats(ctx context.Context) (GetDeploymentWorkspaceStatsRow, error) + GetDismissedHealthchecks(ctx context.Context) (string, error) GetExternalAuthLink(ctx context.Context, arg GetExternalAuthLinkParams) (ExternalAuthLink, error) GetExternalAuthLinksByUserID(ctx context.Context, userID uuid.UUID) ([]ExternalAuthLink, error) GetFileByHashAndCreator(ctx context.Context, arg GetFileByHashAndCreatorParams) (File, error) @@ -356,6 +357,7 @@ type sqlcQuerier interface { // So we need to store it's configuration here for display purposes. // The functional values are immutable and controlled implicitly. UpsertDefaultProxy(ctx context.Context, arg UpsertDefaultProxyParams) error + UpsertDismissedHealthchecks(ctx context.Context, value string) error UpsertLastUpdateCheck(ctx context.Context, value string) error UpsertLogoURL(ctx context.Context, value string) error UpsertOAuthSigningKey(ctx context.Context, value string) error diff --git a/coderd/database/queries.sql.go b/coderd/database/queries.sql.go index 09f36c69b848b..c655ba4911479 100644 --- a/coderd/database/queries.sql.go +++ b/coderd/database/queries.sql.go @@ -4344,6 +4344,17 @@ func (q *sqlQuerier) GetDeploymentID(ctx context.Context) (string, error) { return value, err } +const getDismissedHealthchecks = `-- name: GetDismissedHealthchecks :one +SELECT value FROM site_configs WHERE key = 'dismissed_healthchecks' +` + +func (q *sqlQuerier) GetDismissedHealthchecks(ctx context.Context) (string, error) { + row := q.db.QueryRowContext(ctx, getDismissedHealthchecks) + var value string + err := row.Scan(&value) + return value, err +} + const getLastUpdateCheck = `-- name: GetLastUpdateCheck :one SELECT value FROM site_configs WHERE key = 'last_update_check' ` @@ -4449,6 +4460,16 @@ func (q *sqlQuerier) UpsertDefaultProxy(ctx context.Context, arg UpsertDefaultPr return err } +const upsertDismissedHealthchecks = `-- name: UpsertDismissedHealthchecks :exec +INSERT INTO site_configs (key, value) VALUES ('dismissed_healthchecks', $1) +ON CONFLICT (key) DO UPDATE SET value = $1 WHERE site_configs.key = 'dismissed_healthchecks' +` + +func (q *sqlQuerier) UpsertDismissedHealthchecks(ctx context.Context, value string) error { + _, err := q.db.ExecContext(ctx, upsertDismissedHealthchecks, value) + return err +} + const upsertLastUpdateCheck = `-- name: UpsertLastUpdateCheck :exec INSERT INTO site_configs (key, value) VALUES ('last_update_check', $1) ON CONFLICT (key) DO UPDATE SET value = $1 WHERE site_configs.key = 'last_update_check' diff --git a/coderd/database/queries/siteconfig.sql b/coderd/database/queries/siteconfig.sql index 602b82d984180..940e560c95203 100644 --- a/coderd/database/queries/siteconfig.sql +++ b/coderd/database/queries/siteconfig.sql @@ -70,3 +70,10 @@ SELECT value FROM site_configs WHERE key = 'oauth_signing_key'; -- name: UpsertOAuthSigningKey :exec INSERT INTO site_configs (key, value) VALUES ('oauth_signing_key', $1) ON CONFLICT (key) DO UPDATE set value = $1 WHERE site_configs.key = 'oauth_signing_key'; + +-- name: GetDismissedHealthchecks :one +SELECT value FROM site_configs WHERE key = 'dismissed_healthchecks'; + +-- name: UpsertDismissedHealthchecks :exec +INSERT INTO site_configs (key, value) VALUES ('dismissed_healthchecks', $1) +ON CONFLICT (key) DO UPDATE SET value = $1 WHERE site_configs.key = 'dismissed_healthchecks'; From 7c024f64cfc6e454659dbcbc6bdd11978728891d Mon Sep 17 00:00:00 2001 From: Marcin Tojek Date: Thu, 23 Nov 2023 12:53:00 +0100 Subject: [PATCH 2/7] Upsert and Get --- coderd/database/dbauthz/dbauthz.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/coderd/database/dbauthz/dbauthz.go b/coderd/database/dbauthz/dbauthz.go index 960e8fa6fc48b..e1e1160af2ad5 100644 --- a/coderd/database/dbauthz/dbauthz.go +++ b/coderd/database/dbauthz/dbauthz.go @@ -949,7 +949,8 @@ func (q *querier) GetDeploymentWorkspaceStats(ctx context.Context) (database.Get } func (q *querier) GetDismissedHealthchecks(ctx context.Context) (string, error) { - panic("not implemented") + // No authz checks + return q.db.GetDismissedHealthchecks(ctx) } func (q *querier) GetExternalAuthLink(ctx context.Context, arg database.GetExternalAuthLinkParams) (database.ExternalAuthLink, error) { @@ -2963,7 +2964,10 @@ func (q *querier) UpsertDefaultProxy(ctx context.Context, arg database.UpsertDef } func (q *querier) UpsertDismissedHealthchecks(ctx context.Context, value string) error { - panic("not implemented") + if err := q.authorizeContext(ctx, rbac.ActionCreate, rbac.ResourceDeploymentValues); err != nil { + return err + } + return q.db.UpsertDismissedHealthchecks(ctx, value) } func (q *querier) UpsertLastUpdateCheck(ctx context.Context, value string) error { From c4829fb1d1f2381b4d46b71709016cd3fb36fb61 Mon Sep 17 00:00:00 2001 From: Marcin Tojek Date: Thu, 23 Nov 2023 13:16:31 +0100 Subject: [PATCH 3/7] dbmem --- coderd/database/dbmem/dbmem.go | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/coderd/database/dbmem/dbmem.go b/coderd/database/dbmem/dbmem.go index 5d2475dc3ba89..06fb71c5e7049 100644 --- a/coderd/database/dbmem/dbmem.go +++ b/coderd/database/dbmem/dbmem.go @@ -159,6 +159,7 @@ type data struct { derpMeshKey string lastUpdateCheck []byte serviceBanner []byte + dismissedHealthchecks []byte applicationName string logoURL string appSecurityKey string @@ -1592,7 +1593,14 @@ func (q *FakeQuerier) GetDeploymentWorkspaceStats(ctx context.Context) (database } func (q *FakeQuerier) GetDismissedHealthchecks(ctx context.Context) (string, error) { - panic("not implemented") + q.mutex.RLock() + defer q.mutex.RUnlock() + + if q.dismissedHealthchecks == nil { + return "", sql.ErrNoRows + } + + return string(q.dismissedHealthchecks), nil } func (q *FakeQuerier) GetExternalAuthLink(_ context.Context, arg database.GetExternalAuthLinkParams) (database.ExternalAuthLink, error) { @@ -6794,8 +6802,12 @@ func (q *FakeQuerier) UpsertDefaultProxy(_ context.Context, arg database.UpsertD return nil } -func (q *FakeQuerier) UpsertDismissedHealthchecks(ctx context.Context, value string) error { - panic("not implemented") +func (q *FakeQuerier) UpsertDismissedHealthchecks(ctx context.Context, data string) error { + q.mutex.RLock() + defer q.mutex.RUnlock() + + q.dismissedHealthchecks = []byte(data) + return nil } func (q *FakeQuerier) UpsertLastUpdateCheck(_ context.Context, data string) error { From 13dc374f246e9b8cb67f8786caa521f62c54ebc2 Mon Sep 17 00:00:00 2001 From: Marcin Tojek Date: Thu, 23 Nov 2023 13:17:35 +0100 Subject: [PATCH 4/7] fix: Upsert --- coderd/database/dbmem/dbmem.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coderd/database/dbmem/dbmem.go b/coderd/database/dbmem/dbmem.go index 06fb71c5e7049..0969f984d8dd1 100644 --- a/coderd/database/dbmem/dbmem.go +++ b/coderd/database/dbmem/dbmem.go @@ -6802,7 +6802,7 @@ func (q *FakeQuerier) UpsertDefaultProxy(_ context.Context, arg database.UpsertD return nil } -func (q *FakeQuerier) UpsertDismissedHealthchecks(ctx context.Context, data string) error { +func (q *FakeQuerier) UpsertDismissedHealthchecks(_ context.Context, data string) error { q.mutex.RLock() defer q.mutex.RUnlock() From 57977d8bb439ec071ff009496a26be2c1c2e5f0e Mon Sep 17 00:00:00 2001 From: Marcin Tojek Date: Thu, 23 Nov 2023 13:36:21 +0100 Subject: [PATCH 5/7] fix: ctx --- coderd/database/dbmem/dbmem.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coderd/database/dbmem/dbmem.go b/coderd/database/dbmem/dbmem.go index 0969f984d8dd1..89d0fae212043 100644 --- a/coderd/database/dbmem/dbmem.go +++ b/coderd/database/dbmem/dbmem.go @@ -1592,7 +1592,7 @@ func (q *FakeQuerier) GetDeploymentWorkspaceStats(ctx context.Context) (database return stat, nil } -func (q *FakeQuerier) GetDismissedHealthchecks(ctx context.Context) (string, error) { +func (q *FakeQuerier) GetDismissedHealthchecks(_ context.Context) (string, error) { q.mutex.RLock() defer q.mutex.RUnlock() From 502dbc8d74bbffd3b1cf4b4c838dde80c9e23a83 Mon Sep 17 00:00:00 2001 From: Marcin Tojek Date: Thu, 23 Nov 2023 16:59:04 +0100 Subject: [PATCH 6/7] Dismissed into Health --- coderd/database/dbauthz/dbauthz.go | 14 ++++----- coderd/database/dbmem/dbmem.go | 28 ++++++++--------- coderd/database/dbmetrics/dbmetrics.go | 20 ++++++------ coderd/database/dbmock/dbmock.go | 42 +++++++++++++------------- coderd/database/querier.go | 4 +-- coderd/database/queries.sql.go | 18 +++++------ coderd/database/queries/siteconfig.sql | 10 +++--- 7 files changed, 68 insertions(+), 68 deletions(-) diff --git a/coderd/database/dbauthz/dbauthz.go b/coderd/database/dbauthz/dbauthz.go index e1e1160af2ad5..347f22f7aac0f 100644 --- a/coderd/database/dbauthz/dbauthz.go +++ b/coderd/database/dbauthz/dbauthz.go @@ -948,11 +948,6 @@ func (q *querier) GetDeploymentWorkspaceStats(ctx context.Context) (database.Get return q.db.GetDeploymentWorkspaceStats(ctx) } -func (q *querier) GetDismissedHealthchecks(ctx context.Context) (string, error) { - // No authz checks - return q.db.GetDismissedHealthchecks(ctx) -} - func (q *querier) GetExternalAuthLink(ctx context.Context, arg database.GetExternalAuthLinkParams) (database.ExternalAuthLink, error) { return fetch(q.log, q.auth, q.db.GetExternalAuthLink)(ctx, arg) } @@ -1026,6 +1021,11 @@ func (q *querier) GetGroupsByOrganizationID(ctx context.Context, organizationID return fetchWithPostFilter(q.auth, q.db.GetGroupsByOrganizationID)(ctx, organizationID) } +func (q *querier) GetHealthSettings(ctx context.Context) (string, error) { + // No authz checks + return q.db.GetHealthSettings(ctx) +} + // TODO: We need to create a ProvisionerJob resource type func (q *querier) GetHungProvisionerJobs(ctx context.Context, hungSince time.Time) ([]database.ProvisionerJob, error) { // if err := q.authorizeContext(ctx, rbac.ActionCreate, rbac.ResourceSystem); err != nil { @@ -2963,11 +2963,11 @@ func (q *querier) UpsertDefaultProxy(ctx context.Context, arg database.UpsertDef return q.db.UpsertDefaultProxy(ctx, arg) } -func (q *querier) UpsertDismissedHealthchecks(ctx context.Context, value string) error { +func (q *querier) UpsertHealthSettings(ctx context.Context, value string) error { if err := q.authorizeContext(ctx, rbac.ActionCreate, rbac.ResourceDeploymentValues); err != nil { return err } - return q.db.UpsertDismissedHealthchecks(ctx, value) + return q.db.UpsertHealthSettings(ctx, value) } func (q *querier) UpsertLastUpdateCheck(ctx context.Context, value string) error { diff --git a/coderd/database/dbmem/dbmem.go b/coderd/database/dbmem/dbmem.go index 89d0fae212043..e256904238717 100644 --- a/coderd/database/dbmem/dbmem.go +++ b/coderd/database/dbmem/dbmem.go @@ -159,7 +159,7 @@ type data struct { derpMeshKey string lastUpdateCheck []byte serviceBanner []byte - dismissedHealthchecks []byte + healthSettings []byte applicationName string logoURL string appSecurityKey string @@ -1592,17 +1592,6 @@ func (q *FakeQuerier) GetDeploymentWorkspaceStats(ctx context.Context) (database return stat, nil } -func (q *FakeQuerier) GetDismissedHealthchecks(_ context.Context) (string, error) { - q.mutex.RLock() - defer q.mutex.RUnlock() - - if q.dismissedHealthchecks == nil { - return "", sql.ErrNoRows - } - - return string(q.dismissedHealthchecks), nil -} - func (q *FakeQuerier) GetExternalAuthLink(_ context.Context, arg database.GetExternalAuthLinkParams) (database.ExternalAuthLink, error) { if err := validateDatabaseType(arg); err != nil { return database.ExternalAuthLink{}, err @@ -1783,6 +1772,17 @@ func (q *FakeQuerier) GetGroupsByOrganizationID(_ context.Context, id uuid.UUID) return groups, nil } +func (q *FakeQuerier) GetHealthSettings(_ context.Context) (string, error) { + q.mutex.RLock() + defer q.mutex.RUnlock() + + if q.healthSettings == nil { + return "", sql.ErrNoRows + } + + return string(q.healthSettings), nil +} + func (q *FakeQuerier) GetHungProvisionerJobs(_ context.Context, hungSince time.Time) ([]database.ProvisionerJob, error) { q.mutex.RLock() defer q.mutex.RUnlock() @@ -6802,11 +6802,11 @@ func (q *FakeQuerier) UpsertDefaultProxy(_ context.Context, arg database.UpsertD return nil } -func (q *FakeQuerier) UpsertDismissedHealthchecks(_ context.Context, data string) error { +func (q *FakeQuerier) UpsertHealthSettings(_ context.Context, data string) error { q.mutex.RLock() defer q.mutex.RUnlock() - q.dismissedHealthchecks = []byte(data) + q.healthSettings = []byte(data) return nil } diff --git a/coderd/database/dbmetrics/dbmetrics.go b/coderd/database/dbmetrics/dbmetrics.go index d83276f694047..5d8d0f1030088 100644 --- a/coderd/database/dbmetrics/dbmetrics.go +++ b/coderd/database/dbmetrics/dbmetrics.go @@ -391,13 +391,6 @@ func (m metricsStore) GetDeploymentWorkspaceStats(ctx context.Context) (database return row, err } -func (m metricsStore) GetDismissedHealthchecks(ctx context.Context) (string, error) { - start := time.Now() - r0, r1 := m.s.GetDismissedHealthchecks(ctx) - m.queryLatencies.WithLabelValues("GetDismissedHealthchecks").Observe(time.Since(start).Seconds()) - return r0, r1 -} - func (m metricsStore) GetExternalAuthLink(ctx context.Context, arg database.GetExternalAuthLinkParams) (database.ExternalAuthLink, error) { start := time.Now() link, err := m.s.GetExternalAuthLink(ctx, arg) @@ -468,6 +461,13 @@ func (m metricsStore) GetGroupsByOrganizationID(ctx context.Context, organizatio return groups, err } +func (m metricsStore) GetHealthSettings(ctx context.Context) (string, error) { + start := time.Now() + r0, r1 := m.s.GetHealthSettings(ctx) + m.queryLatencies.WithLabelValues("GetHealthSettings").Observe(time.Since(start).Seconds()) + return r0, r1 +} + func (m metricsStore) GetHungProvisionerJobs(ctx context.Context, hungSince time.Time) ([]database.ProvisionerJob, error) { start := time.Now() jobs, err := m.s.GetHungProvisionerJobs(ctx, hungSince) @@ -1873,10 +1873,10 @@ func (m metricsStore) UpsertDefaultProxy(ctx context.Context, arg database.Upser return r0 } -func (m metricsStore) UpsertDismissedHealthchecks(ctx context.Context, value string) error { +func (m metricsStore) UpsertHealthSettings(ctx context.Context, value string) error { start := time.Now() - r0 := m.s.UpsertDismissedHealthchecks(ctx, value) - m.queryLatencies.WithLabelValues("UpsertDismissedHealthchecks").Observe(time.Since(start).Seconds()) + r0 := m.s.UpsertHealthSettings(ctx, value) + m.queryLatencies.WithLabelValues("UpsertHealthSettings").Observe(time.Since(start).Seconds()) return r0 } diff --git a/coderd/database/dbmock/dbmock.go b/coderd/database/dbmock/dbmock.go index 52bb719b701ca..2bf37350efbaa 100644 --- a/coderd/database/dbmock/dbmock.go +++ b/coderd/database/dbmock/dbmock.go @@ -742,21 +742,6 @@ func (mr *MockStoreMockRecorder) GetDeploymentWorkspaceStats(arg0 interface{}) * return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetDeploymentWorkspaceStats", reflect.TypeOf((*MockStore)(nil).GetDeploymentWorkspaceStats), arg0) } -// GetDismissedHealthchecks mocks base method. -func (m *MockStore) GetDismissedHealthchecks(arg0 context.Context) (string, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetDismissedHealthchecks", arg0) - ret0, _ := ret[0].(string) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetDismissedHealthchecks indicates an expected call of GetDismissedHealthchecks. -func (mr *MockStoreMockRecorder) GetDismissedHealthchecks(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetDismissedHealthchecks", reflect.TypeOf((*MockStore)(nil).GetDismissedHealthchecks), arg0) -} - // GetExternalAuthLink mocks base method. func (m *MockStore) GetExternalAuthLink(arg0 context.Context, arg1 database.GetExternalAuthLinkParams) (database.ExternalAuthLink, error) { m.ctrl.T.Helper() @@ -907,6 +892,21 @@ func (mr *MockStoreMockRecorder) GetGroupsByOrganizationID(arg0, arg1 interface{ return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetGroupsByOrganizationID", reflect.TypeOf((*MockStore)(nil).GetGroupsByOrganizationID), arg0, arg1) } +// GetHealthSettings mocks base method. +func (m *MockStore) GetHealthSettings(arg0 context.Context) (string, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetHealthSettings", arg0) + ret0, _ := ret[0].(string) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetHealthSettings indicates an expected call of GetHealthSettings. +func (mr *MockStoreMockRecorder) GetHealthSettings(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetHealthSettings", reflect.TypeOf((*MockStore)(nil).GetHealthSettings), arg0) +} + // GetHungProvisionerJobs mocks base method. func (m *MockStore) GetHungProvisionerJobs(arg0 context.Context, arg1 time.Time) ([]database.ProvisionerJob, error) { m.ctrl.T.Helper() @@ -3932,18 +3932,18 @@ func (mr *MockStoreMockRecorder) UpsertDefaultProxy(arg0, arg1 interface{}) *gom return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpsertDefaultProxy", reflect.TypeOf((*MockStore)(nil).UpsertDefaultProxy), arg0, arg1) } -// UpsertDismissedHealthchecks mocks base method. -func (m *MockStore) UpsertDismissedHealthchecks(arg0 context.Context, arg1 string) error { +// UpsertHealthSettings mocks base method. +func (m *MockStore) UpsertHealthSettings(arg0 context.Context, arg1 string) error { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "UpsertDismissedHealthchecks", arg0, arg1) + ret := m.ctrl.Call(m, "UpsertHealthSettings", arg0, arg1) ret0, _ := ret[0].(error) return ret0 } -// UpsertDismissedHealthchecks indicates an expected call of UpsertDismissedHealthchecks. -func (mr *MockStoreMockRecorder) UpsertDismissedHealthchecks(arg0, arg1 interface{}) *gomock.Call { +// UpsertHealthSettings indicates an expected call of UpsertHealthSettings. +func (mr *MockStoreMockRecorder) UpsertHealthSettings(arg0, arg1 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpsertDismissedHealthchecks", reflect.TypeOf((*MockStore)(nil).UpsertDismissedHealthchecks), arg0, arg1) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpsertHealthSettings", reflect.TypeOf((*MockStore)(nil).UpsertHealthSettings), arg0, arg1) } // UpsertLastUpdateCheck mocks base method. diff --git a/coderd/database/querier.go b/coderd/database/querier.go index 9bd85f9268f44..10c6be43a8179 100644 --- a/coderd/database/querier.go +++ b/coderd/database/querier.go @@ -89,7 +89,6 @@ type sqlcQuerier interface { GetDeploymentID(ctx context.Context) (string, error) GetDeploymentWorkspaceAgentStats(ctx context.Context, createdAt time.Time) (GetDeploymentWorkspaceAgentStatsRow, error) GetDeploymentWorkspaceStats(ctx context.Context) (GetDeploymentWorkspaceStatsRow, error) - GetDismissedHealthchecks(ctx context.Context) (string, error) GetExternalAuthLink(ctx context.Context, arg GetExternalAuthLinkParams) (ExternalAuthLink, error) GetExternalAuthLinksByUserID(ctx context.Context, userID uuid.UUID) ([]ExternalAuthLink, error) GetFileByHashAndCreator(ctx context.Context, arg GetFileByHashAndCreatorParams) (File, error) @@ -103,6 +102,7 @@ type sqlcQuerier interface { // If it is the "Everyone" group, then we need to check the organization_members table. GetGroupMembers(ctx context.Context, groupID uuid.UUID) ([]User, error) GetGroupsByOrganizationID(ctx context.Context, organizationID uuid.UUID) ([]Group, error) + GetHealthSettings(ctx context.Context) (string, error) GetHungProvisionerJobs(ctx context.Context, updatedAt time.Time) ([]ProvisionerJob, error) GetLastUpdateCheck(ctx context.Context) (string, error) GetLatestWorkspaceBuildByWorkspaceID(ctx context.Context, workspaceID uuid.UUID) (WorkspaceBuild, error) @@ -357,7 +357,7 @@ type sqlcQuerier interface { // So we need to store it's configuration here for display purposes. // The functional values are immutable and controlled implicitly. UpsertDefaultProxy(ctx context.Context, arg UpsertDefaultProxyParams) error - UpsertDismissedHealthchecks(ctx context.Context, value string) error + UpsertHealthSettings(ctx context.Context, value string) error UpsertLastUpdateCheck(ctx context.Context, value string) error UpsertLogoURL(ctx context.Context, value string) error UpsertOAuthSigningKey(ctx context.Context, value string) error diff --git a/coderd/database/queries.sql.go b/coderd/database/queries.sql.go index c655ba4911479..c74d8b73c8d4d 100644 --- a/coderd/database/queries.sql.go +++ b/coderd/database/queries.sql.go @@ -4344,12 +4344,12 @@ func (q *sqlQuerier) GetDeploymentID(ctx context.Context) (string, error) { return value, err } -const getDismissedHealthchecks = `-- name: GetDismissedHealthchecks :one -SELECT value FROM site_configs WHERE key = 'dismissed_healthchecks' +const getHealthSettings = `-- name: GetHealthSettings :one +SELECT COALESCE(value, '{}') FROM site_configs WHERE key = 'health_settings' ` -func (q *sqlQuerier) GetDismissedHealthchecks(ctx context.Context) (string, error) { - row := q.db.QueryRowContext(ctx, getDismissedHealthchecks) +func (q *sqlQuerier) GetHealthSettings(ctx context.Context) (string, error) { + row := q.db.QueryRowContext(ctx, getHealthSettings) var value string err := row.Scan(&value) return value, err @@ -4460,13 +4460,13 @@ func (q *sqlQuerier) UpsertDefaultProxy(ctx context.Context, arg UpsertDefaultPr return err } -const upsertDismissedHealthchecks = `-- name: UpsertDismissedHealthchecks :exec -INSERT INTO site_configs (key, value) VALUES ('dismissed_healthchecks', $1) -ON CONFLICT (key) DO UPDATE SET value = $1 WHERE site_configs.key = 'dismissed_healthchecks' +const upsertHealthSettings = `-- name: UpsertHealthSettings :exec +INSERT INTO site_configs (key, value) VALUES ('health_settings', $1) +ON CONFLICT (key) DO UPDATE SET value = $1 WHERE site_configs.key = 'health_settings' ` -func (q *sqlQuerier) UpsertDismissedHealthchecks(ctx context.Context, value string) error { - _, err := q.db.ExecContext(ctx, upsertDismissedHealthchecks, value) +func (q *sqlQuerier) UpsertHealthSettings(ctx context.Context, value string) error { + _, err := q.db.ExecContext(ctx, upsertHealthSettings, value) return err } diff --git a/coderd/database/queries/siteconfig.sql b/coderd/database/queries/siteconfig.sql index 940e560c95203..4bcc32332e363 100644 --- a/coderd/database/queries/siteconfig.sql +++ b/coderd/database/queries/siteconfig.sql @@ -71,9 +71,9 @@ SELECT value FROM site_configs WHERE key = 'oauth_signing_key'; INSERT INTO site_configs (key, value) VALUES ('oauth_signing_key', $1) ON CONFLICT (key) DO UPDATE set value = $1 WHERE site_configs.key = 'oauth_signing_key'; --- name: GetDismissedHealthchecks :one -SELECT value FROM site_configs WHERE key = 'dismissed_healthchecks'; +-- name: GetHealthSettings :one +SELECT COALESCE(value, '{}') FROM site_configs WHERE key = 'health_settings'; --- name: UpsertDismissedHealthchecks :exec -INSERT INTO site_configs (key, value) VALUES ('dismissed_healthchecks', $1) -ON CONFLICT (key) DO UPDATE SET value = $1 WHERE site_configs.key = 'dismissed_healthchecks'; +-- name: UpsertHealthSettings :exec +INSERT INTO site_configs (key, value) VALUES ('health_settings', $1) +ON CONFLICT (key) DO UPDATE SET value = $1 WHERE site_configs.key = 'health_settings'; From 8990cb0d432a3cbdff112ea9f069204336bc76eb Mon Sep 17 00:00:00 2001 From: Marcin Tojek Date: Thu, 23 Nov 2023 17:05:55 +0100 Subject: [PATCH 7/7] Rename to health_settings --- coderd/database/dbmem/dbmem.go | 2 +- coderd/database/queries.sql.go | 9 +++++---- coderd/database/queries/siteconfig.sql | 4 +++- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/coderd/database/dbmem/dbmem.go b/coderd/database/dbmem/dbmem.go index e256904238717..d66b5b225b79a 100644 --- a/coderd/database/dbmem/dbmem.go +++ b/coderd/database/dbmem/dbmem.go @@ -1777,7 +1777,7 @@ func (q *FakeQuerier) GetHealthSettings(_ context.Context) (string, error) { defer q.mutex.RUnlock() if q.healthSettings == nil { - return "", sql.ErrNoRows + return "{}", nil } return string(q.healthSettings), nil diff --git a/coderd/database/queries.sql.go b/coderd/database/queries.sql.go index c74d8b73c8d4d..00ca22b0b34db 100644 --- a/coderd/database/queries.sql.go +++ b/coderd/database/queries.sql.go @@ -4345,14 +4345,15 @@ func (q *sqlQuerier) GetDeploymentID(ctx context.Context) (string, error) { } const getHealthSettings = `-- name: GetHealthSettings :one -SELECT COALESCE(value, '{}') FROM site_configs WHERE key = 'health_settings' +SELECT + COALESCE((SELECT value FROM site_configs WHERE key = 'health_settings'), '{}') :: text AS health_settings ` func (q *sqlQuerier) GetHealthSettings(ctx context.Context) (string, error) { row := q.db.QueryRowContext(ctx, getHealthSettings) - var value string - err := row.Scan(&value) - return value, err + var health_settings string + err := row.Scan(&health_settings) + return health_settings, err } const getLastUpdateCheck = `-- name: GetLastUpdateCheck :one diff --git a/coderd/database/queries/siteconfig.sql b/coderd/database/queries/siteconfig.sql index 4bcc32332e363..a432b71e3a91d 100644 --- a/coderd/database/queries/siteconfig.sql +++ b/coderd/database/queries/siteconfig.sql @@ -72,7 +72,9 @@ INSERT INTO site_configs (key, value) VALUES ('oauth_signing_key', $1) ON CONFLICT (key) DO UPDATE set value = $1 WHERE site_configs.key = 'oauth_signing_key'; -- name: GetHealthSettings :one -SELECT COALESCE(value, '{}') FROM site_configs WHERE key = 'health_settings'; +SELECT + COALESCE((SELECT value FROM site_configs WHERE key = 'health_settings'), '{}') :: text AS health_settings +; -- name: UpsertHealthSettings :exec INSERT INTO site_configs (key, value) VALUES ('health_settings', $1)