-
Notifications
You must be signed in to change notification settings - Fork 943
feat(coderd): add provisioner_daemons to /debug/health endpoint #11393
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
Changes from 1 commit
Commits
Show all changes
18 commits
Select commit
Hold shift + click to select a range
ffe19ea
WIP: add version healthcheck for provisioner daemons
johnstcn 764e5ae
fix unit tests
johnstcn 8a7c555
implement provisioner daemon healthcheck
johnstcn 23b7869
wire up provisioner daemons healthcheck
johnstcn 1c449eb
do not ts generate ProvisionerDaemonsReportOptions
johnstcn a9978e7
typescript fixings
johnstcn 6131b6b
hack once again for apitypings
johnstcn a785764
make gen lint fmt
johnstcn e191f14
fix after rebase
johnstcn a002fc1
make fmt
johnstcn fa67370
only check provisioner major api version mismatch
johnstcn eefdfc9
move convertProvisionerDaemon to db2sdk
johnstcn a61d348
use store instead of fn
johnstcn c2361cd
rename ProvisionerDaemonsReportOptions -> ProvisionerDaemonsReportDeps
johnstcn 2675615
appease linter
johnstcn 1fb49ac
better handle stale daemons
johnstcn 2159ac6
address comment about named return values
johnstcn 19e896a
address PR comments
johnstcn File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
use store instead of fn
- Loading branch information
commit a61d34835959855fe0ae7d449a3e36b06f0d98c0
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -10,10 +10,13 @@ import ( | |
"github.com/stretchr/testify/assert" | ||
|
||
"github.com/coder/coder/v2/coderd/database" | ||
"github.com/coder/coder/v2/coderd/database/dbmock" | ||
"github.com/coder/coder/v2/coderd/database/dbtime" | ||
"github.com/coder/coder/v2/coderd/healthcheck" | ||
"github.com/coder/coder/v2/coderd/healthcheck/health" | ||
"github.com/coder/coder/v2/provisionersdk" | ||
|
||
gomock "go.uber.org/mock/gomock" | ||
) | ||
|
||
func TestProvisionerDaemonReport(t *testing.T) { | ||
|
@@ -23,7 +26,8 @@ func TestProvisionerDaemonReport(t *testing.T) { | |
name string | ||
currentVersion string | ||
currentAPIMajorVersion int | ||
provisionerDaemonsFn func(context.Context) ([]database.ProvisionerDaemon, error) | ||
provisionerDaemons []database.ProvisionerDaemon | ||
provisionerDaemonsErr error | ||
expectedSeverity health.Severity | ||
expectedWarningCode health.Code | ||
expectedError string | ||
|
@@ -34,26 +38,18 @@ func TestProvisionerDaemonReport(t *testing.T) { | |
expectedSeverity: health.SeverityError, | ||
expectedError: "Developer error: CurrentVersion is empty", | ||
}, | ||
{ | ||
name: "provisionerdaemonsfn nil", | ||
currentVersion: "v1.2.3", | ||
currentAPIMajorVersion: 1, | ||
expectedSeverity: health.SeverityError, | ||
expectedError: "Developer error: ProvisionerDaemonsFn is nil", | ||
}, | ||
{ | ||
name: "no daemons", | ||
currentVersion: "v1.2.3", | ||
currentAPIMajorVersion: provisionersdk.CurrentMajor, | ||
provisionerDaemonsFn: fakeProvisionerDaemonsFn(), | ||
expectedSeverity: health.SeverityError, | ||
expectedError: "No provisioner daemons found!", | ||
}, | ||
{ | ||
name: "error fetching daemons", | ||
currentVersion: "v1.2.3", | ||
currentAPIMajorVersion: provisionersdk.CurrentMajor, | ||
provisionerDaemonsFn: fakeProvisionerDaemonsFnErr(assert.AnError), | ||
provisionerDaemonsErr: assert.AnError, | ||
expectedSeverity: health.SeverityError, | ||
expectedError: assert.AnError.Error(), | ||
}, | ||
|
@@ -62,69 +58,62 @@ func TestProvisionerDaemonReport(t *testing.T) { | |
currentVersion: "v1.2.3", | ||
currentAPIMajorVersion: provisionersdk.CurrentMajor, | ||
expectedSeverity: health.SeverityOK, | ||
provisionerDaemonsFn: fakeProvisionerDaemonsFn(fakeProvisionerDaemon(t, "pd-ok", "v1.2.3", "1.0")), | ||
provisionerDaemons: []database.ProvisionerDaemon{fakeProvisionerDaemon(t, "pd-ok", "v1.2.3", "1.0")}, | ||
}, | ||
{ | ||
name: "one daemon out of date", | ||
currentVersion: "v1.2.3", | ||
currentAPIMajorVersion: provisionersdk.CurrentMajor, | ||
expectedSeverity: health.SeverityWarning, | ||
expectedWarningCode: health.CodeProvisionerDaemonVersionMismatch, | ||
provisionerDaemonsFn: fakeProvisionerDaemonsFn(fakeProvisionerDaemon(t, "pd-old", "v1.1.2", "1.0")), | ||
provisionerDaemons: []database.ProvisionerDaemon{fakeProvisionerDaemon(t, "pd-old", "v1.1.2", "1.0")}, | ||
}, | ||
{ | ||
name: "invalid daemon version", | ||
currentVersion: "v1.2.3", | ||
currentAPIMajorVersion: provisionersdk.CurrentMajor, | ||
expectedSeverity: health.SeverityError, | ||
expectedWarningCode: health.CodeUnknown, | ||
provisionerDaemonsFn: fakeProvisionerDaemonsFn(fakeProvisionerDaemon(t, "pd-invalid-version", "invalid", "1.0")), | ||
provisionerDaemons: []database.ProvisionerDaemon{fakeProvisionerDaemon(t, "pd-invalid-version", "invalid", "1.0")}, | ||
}, | ||
{ | ||
name: "invalid daemon api version", | ||
currentVersion: "v1.2.3", | ||
currentAPIMajorVersion: provisionersdk.CurrentMajor, | ||
expectedSeverity: health.SeverityError, | ||
expectedWarningCode: health.CodeUnknown, | ||
provisionerDaemonsFn: fakeProvisionerDaemonsFn(fakeProvisionerDaemon(t, "pd-new-minor", "v1.2.3", "invalid")), | ||
provisionerDaemons: []database.ProvisionerDaemon{fakeProvisionerDaemon(t, "pd-new-minor", "v1.2.3", "invalid")}, | ||
}, | ||
{ | ||
name: "api version backward compat", | ||
currentVersion: "v2.3.4", | ||
currentAPIMajorVersion: 2, | ||
expectedSeverity: health.SeverityWarning, | ||
expectedWarningCode: health.CodeProvisionerDaemonAPIMajorVersionDeprecated, | ||
provisionerDaemonsFn: fakeProvisionerDaemonsFn( | ||
fakeProvisionerDaemon(t, "pd-old-api", "v2.3.4", "1.0")), | ||
provisionerDaemons: []database.ProvisionerDaemon{fakeProvisionerDaemon(t, "pd-old-api", "v2.3.4", "1.0")}, | ||
}, | ||
{ | ||
name: "one up to date, one out of date", | ||
currentVersion: "v1.2.3", | ||
currentAPIMajorVersion: provisionersdk.CurrentMajor, | ||
expectedSeverity: health.SeverityWarning, | ||
expectedWarningCode: health.CodeProvisionerDaemonVersionMismatch, | ||
provisionerDaemonsFn: fakeProvisionerDaemonsFn( | ||
fakeProvisionerDaemon(t, "pd-ok", "v1.2.3", "1.0"), | ||
fakeProvisionerDaemon(t, "pd-old", "v1.1.2", "1.0")), | ||
provisionerDaemons: []database.ProvisionerDaemon{fakeProvisionerDaemon(t, "pd-ok", "v1.2.3", "1.0"), fakeProvisionerDaemon(t, "pd-old", "v1.1.2", "1.0")}, | ||
}, | ||
{ | ||
name: "one up to date, one newer", | ||
currentVersion: "v1.2.3", | ||
currentAPIMajorVersion: provisionersdk.CurrentMajor, | ||
expectedSeverity: health.SeverityWarning, | ||
expectedWarningCode: health.CodeProvisionerDaemonVersionMismatch, | ||
provisionerDaemonsFn: fakeProvisionerDaemonsFn( | ||
fakeProvisionerDaemon(t, "pd-ok", "v1.2.3", "1.0"), | ||
fakeProvisionerDaemon(t, "pd-new", "v2.3.4", "1.0")), | ||
provisionerDaemons: []database.ProvisionerDaemon{fakeProvisionerDaemon(t, "pd-ok", "v1.2.3", "1.0"), fakeProvisionerDaemon(t, "pd-new", "v2.3.4", "1.0")}, | ||
}, | ||
{ | ||
name: "one up to date, one stale older", | ||
currentVersion: "v2.3.4", | ||
currentAPIMajorVersion: provisionersdk.CurrentMajor, | ||
expectedSeverity: health.SeverityOK, | ||
provisionerDaemonsFn: fakeProvisionerDaemonsFn( | ||
fakeProvisionerDaemonStale(t, "pd-ok", "v1.2.3", "0.9", dbtime.Now().Add(-5*time.Minute)), | ||
fakeProvisionerDaemon(t, "pd-new", "v2.3.4", "1.0")), | ||
provisionerDaemons: []database.ProvisionerDaemon{fakeProvisionerDaemonStale(t, "pd-ok", "v1.2.3", "0.9", dbtime.Now().Add(-5*time.Minute)), fakeProvisionerDaemon(t, "pd-new", "v2.3.4", "1.0")}, | ||
}, | ||
} { | ||
tt := tt | ||
|
@@ -138,14 +127,16 @@ func TestProvisionerDaemonReport(t *testing.T) { | |
if tt.currentAPIMajorVersion == 0 { | ||
opts.CurrentAPIMajorVersion = provisionersdk.CurrentMajor | ||
} | ||
if tt.provisionerDaemonsFn != nil { | ||
opts.ProvisionerDaemonsFn = tt.provisionerDaemonsFn | ||
} | ||
now := dbtime.Now() | ||
opts.TimeNowFn = func() time.Time { | ||
return now | ||
} | ||
|
||
ctrl := gomock.NewController(t) | ||
mDB := dbmock.NewMockStore(ctrl) | ||
mDB.EXPECT().GetProvisionerDaemons(gomock.Any()).AnyTimes().Return(tt.provisionerDaemons, tt.provisionerDaemonsErr) | ||
opts.Store = mDB | ||
|
||
rpt.Run(context.Background(), &opts) | ||
|
||
assert.Equal(t, tt.expectedSeverity, rpt.Severity) | ||
|
@@ -183,18 +174,6 @@ func fakeProvisionerDaemon(t *testing.T, name, version, apiVersion string) datab | |
} | ||
} | ||
|
||
func fakeProvisionerDaemonsFn(pds ...database.ProvisionerD 23D3 aemon) func(context.Context) ([]database.ProvisionerDaemon, error) { | ||
return func(context.Context) ([]database.ProvisionerDaemon, error) { | ||
return pds, nil | ||
} | ||
} | ||
|
||
func fakeProvisionerDaemonsFnErr(err error) func(context.Context) ([]database.ProvisionerDaemon, error) { | ||
return func(context.Context) ([]database.ProvisionerDaemon, error) { | ||
return nil, err | ||
} | ||
} | ||
|
||
func fakeProvisionerDaemonStale(t *testing.T, name, version, apiVersion string, lastSeenAt time.Time) database.ProvisionerDaemon { | ||
t.Helper() | ||
d := fakeProvisionerDaemon(t, name, version, apiVersion) | ||
<
3C99
svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-fold-down">
|
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.