mirror of
https://github.com/coder/coder.git
synced 2025-07-13 21:36:50 +00:00
chore(codersdk): move all tailscale imports out of codersdk
(#12735)
Currently, importing `codersdk` just to interact with the API requires importing tailscale, which causes builds to fail unless manually using our fork.
This commit is contained in:
@ -16,6 +16,7 @@ import (
|
||||
"github.com/coder/coder/v2/coderd/database/dbtime"
|
||||
"github.com/coder/coder/v2/coderd/schedule"
|
||||
"github.com/coder/coder/v2/codersdk"
|
||||
"github.com/coder/coder/v2/codersdk/workspacesdk"
|
||||
"github.com/coder/coder/v2/provisioner/echo"
|
||||
"github.com/coder/coder/v2/testutil"
|
||||
)
|
||||
@ -165,9 +166,10 @@ func TestWorkspaceActivityBump(t *testing.T) {
|
||||
client, workspace, assertBumped := setupActivityTest(t)
|
||||
|
||||
resources := coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID)
|
||||
conn, err := client.DialWorkspaceAgent(ctx, resources[0].Agents[0].ID, &codersdk.DialWorkspaceAgentOptions{
|
||||
Logger: slogtest.Make(t, nil),
|
||||
})
|
||||
conn, err := workspacesdk.New(client).
|
||||
DialAgent(ctx, resources[0].Agents[0].ID, &workspacesdk.DialAgentOptions{
|
||||
Logger: slogtest.Make(t, nil),
|
||||
})
|
||||
require.NoError(t, err)
|
||||
defer conn.Close()
|
||||
|
||||
@ -202,9 +204,10 @@ func TestWorkspaceActivityBump(t *testing.T) {
|
||||
|
||||
// Bump by dialing the workspace and sending traffic.
|
||||
resources := coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID)
|
||||
conn, err := client.DialWorkspaceAgent(ctx, resources[0].Agents[0].ID, &codersdk.DialWorkspaceAgentOptions{
|
||||
Logger: slogtest.Make(t, nil),
|
||||
})
|
||||
conn, err := workspacesdk.New(client).
|
||||
DialAgent(ctx, resources[0].Agents[0].ID, &workspacesdk.DialAgentOptions{
|
||||
Logger: slogtest.Make(t, nil),
|
||||
})
|
||||
require.NoError(t, err)
|
||||
defer conn.Close()
|
||||
|
||||
|
970
coderd/apidoc/docs.go
generated
970
coderd/apidoc/docs.go
generated
File diff suppressed because it is too large
Load Diff
914
coderd/apidoc/swagger.json
generated
914
coderd/apidoc/swagger.json
generated
File diff suppressed because it is too large
Load Diff
@ -37,7 +37,6 @@ import (
|
||||
"tailscale.com/util/singleflight"
|
||||
|
||||
"cdr.dev/slog"
|
||||
|
||||
agentproto "github.com/coder/coder/v2/agent/proto"
|
||||
"github.com/coder/coder/v2/buildinfo"
|
||||
_ "github.com/coder/coder/v2/coderd/apidoc" // Used for swagger docs.
|
||||
@ -70,6 +69,7 @@ import (
|
||||
"github.com/coder/coder/v2/coderd/workspaceusage"
|
||||
"github.com/coder/coder/v2/codersdk"
|
||||
"github.com/coder/coder/v2/codersdk/drpc"
|
||||
"github.com/coder/coder/v2/codersdk/healthsdk"
|
||||
"github.com/coder/coder/v2/provisionerd/proto"
|
||||
"github.com/coder/coder/v2/provisionersdk"
|
||||
"github.com/coder/coder/v2/site"
|
||||
@ -153,7 +153,7 @@ type Options struct {
|
||||
// workspace applications. It consists of both a signing and encryption key.
|
||||
AppSecurityKey workspaceapps.SecurityKey
|
||||
|
||||
HealthcheckFunc func(ctx context.Context, apiKey string) *codersdk.HealthcheckReport
|
||||
HealthcheckFunc func(ctx context.Context, apiKey string) *healthsdk.HealthcheckReport
|
||||
HealthcheckTimeout time.Duration
|
||||
HealthcheckRefresh time.Duration
|
||||
WorkspaceProxiesFetchUpdater *atomic.Pointer[healthcheck.WorkspaceProxiesFetchUpdater]
|
||||
@ -423,7 +423,7 @@ func New(options *Options) *API {
|
||||
UserQuietHoursScheduleStore: options.UserQuietHoursScheduleStore,
|
||||
AccessControlStore: options.AccessControlStore,
|
||||
Experiments: experiments,
|
||||
healthCheckGroup: &singleflight.Group[string, *codersdk.HealthcheckReport]{},
|
||||
healthCheckGroup: &singleflight.Group[string, *healthsdk.HealthcheckReport]{},
|
||||
Acquirer: provisionerdserver.NewAcquirer(
|
||||
ctx,
|
||||
options.Logger.Named("acquirer"),
|
||||
@ -462,7 +462,7 @@ func New(options *Options) *API {
|
||||
}
|
||||
|
||||
if options.HealthcheckFunc == nil {
|
||||
options.HealthcheckFunc = func(ctx context.Context, apiKey string) *codersdk.HealthcheckReport {
|
||||
options.HealthcheckFunc = func(ctx context.Context, apiKey string) *healthsdk.HealthcheckReport {
|
||||
// NOTE: dismissed healthchecks are marked in formatHealthcheck.
|
||||
// Not here, as this result gets cached.
|
||||
return healthcheck.Run(ctx, &healthcheck.ReportOptions{
|
||||
@ -1266,8 +1266,8 @@ type API struct {
|
||||
// This is used to gate features that are not yet ready for production.
|
||||
Experiments codersdk.Experiments
|
||||
|
||||
healthCheckGroup *singleflight.Group[string, *codersdk.HealthcheckReport]
|
||||
healthCheckCache atomic.Pointer[codersdk.HealthcheckReport]
|
||||
healthCheckGroup *singleflight.Group[string, *healthsdk.HealthcheckReport]
|
||||
healthCheckCache atomic.Pointer[healthsdk.HealthcheckReport]
|
||||
|
||||
statsBatcher *batchstats.Batcher
|
||||
|
||||
|
@ -23,6 +23,7 @@ import (
|
||||
"cdr.dev/slog/sloggers/slogtest"
|
||||
"github.com/coder/coder/v2/coderd/database"
|
||||
"github.com/coder/coder/v2/coderd/database/dbfake"
|
||||
"github.com/coder/coder/v2/codersdk/workspacesdk"
|
||||
"github.com/coder/coder/v2/provisionersdk/proto"
|
||||
|
||||
"github.com/coder/coder/v2/agent/agenttest"
|
||||
@ -189,9 +190,10 @@ func TestDERPForceWebSockets(t *testing.T) {
|
||||
t.Cleanup(func() {
|
||||
client.HTTPClient.CloseIdleConnections()
|
||||
})
|
||||
wsclient := workspacesdk.New(client)
|
||||
user := coderdtest.CreateFirstUser(t, client)
|
||||
|
||||
gen, err := client.WorkspaceAgentConnectionInfoGeneric(context.Background())
|
||||
gen, err := wsclient.AgentConnectionInfoGeneric(context.Background())
|
||||
require.NoError(t, err)
|
||||
t.Log(spew.Sdump(gen))
|
||||
|
||||
@ -213,8 +215,8 @@ func TestDERPForceWebSockets(t *testing.T) {
|
||||
defer cancel()
|
||||
|
||||
resources := coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID)
|
||||
conn, err := client.DialWorkspaceAgent(ctx, resources[0].Agents[0].ID,
|
||||
&codersdk.DialWorkspaceAgentOptions{
|
||||
conn, err := wsclient.DialAgent(ctx, resources[0].Agents[0].ID,
|
||||
&workspacesdk.DialAgentOptions{
|
||||
Logger: slogtest.Make(t, nil).Leveled(slog.LevelDebug).Named("client"),
|
||||
},
|
||||
)
|
||||
|
@ -75,6 +75,7 @@ import (
|
||||
"github.com/coder/coder/v2/codersdk"
|
||||
"github.com/coder/coder/v2/codersdk/agentsdk"
|
||||
"github.com/coder/coder/v2/codersdk/drpc"
|
||||
"github.com/coder/coder/v2/codersdk/healthsdk"
|
||||
"github.com/coder/coder/v2/cryptorand"
|
||||
"github.com/coder/coder/v2/provisioner/echo"
|
||||
"github.com/coder/coder/v2/provisionerd"
|
||||
@ -113,7 +114,7 @@ type Options struct {
|
||||
TemplateScheduleStore schedule.TemplateScheduleStore
|
||||
Coordinator tailnet.Coordinator
|
||||
|
||||
HealthcheckFunc func(ctx context.Context, apiKey string) *codersdk.HealthcheckReport
|
||||
HealthcheckFunc func(ctx context.Context, apiKey string) *healthsdk.HealthcheckReport
|
||||
HealthcheckTimeout time.Duration
|
||||
HealthcheckRefresh time.Duration
|
||||
|
||||
|
@ -9,7 +9,7 @@ import (
|
||||
"golang.org/x/xerrors"
|
||||
|
||||
"github.com/coder/coder/v2/coderd/rbac"
|
||||
"github.com/coder/coder/v2/codersdk"
|
||||
"github.com/coder/coder/v2/codersdk/healthsdk"
|
||||
)
|
||||
|
||||
// AuditOAuthConvertState is never stored in the database. It is stored in a cookie
|
||||
@ -25,8 +25,8 @@ type AuditOAuthConvertState struct {
|
||||
}
|
||||
|
||||
type HealthSettings struct {
|
||||
ID uuid.UUID `db:"id" json:"id"`
|
||||
DismissedHealthchecks []codersdk.HealthSection `db:"dismissed_healthchecks" json:"dismissed_healthchecks"`
|
||||
ID uuid.UUID `db:"id" json:"id"`
|
||||
DismissedHealthchecks []healthsdk.HealthSection `db:"dismissed_healthchecks" json:"dismissed_healthchecks"`
|
||||
}
|
||||
|
||||
type Actions []rbac.Action
|
||||
|
@ -14,13 +14,13 @@ import (
|
||||
"golang.org/x/xerrors"
|
||||
|
||||
"cdr.dev/slog"
|
||||
|
||||
"github.com/coder/coder/v2/coderd/audit"
|
||||
"github.com/coder/coder/v2/coderd/database"
|
||||
"github.com/coder/coder/v2/coderd/httpapi"
|
||||
"github.com/coder/coder/v2/coderd/httpmw"
|
||||
"github.com/coder/coder/v2/coderd/rbac"
|
||||
"github.com/coder/coder/v2/codersdk"
|
||||
"github.com/coder/coder/v2/codersdk/healthsdk"
|
||||
)
|
||||
|
||||
// @Summary Debug Info Wireguard Coordinator
|
||||
@ -50,7 +50,7 @@ func (api *API) debugTailnet(rw http.ResponseWriter, r *http.Request) {
|
||||
// @Security CoderSessionToken
|
||||
// @Produce json
|
||||
// @Tags Debug
|
||||
// @Success 200 {object} codersdk.HealthcheckReport
|
||||
// @Success 200 {object} healthsdk.HealthcheckReport
|
||||
// @Router /debug/health [get]
|
||||
// @Param force query boolean false "Force a healthcheck to run"
|
||||
func (api *API) debugDeploymentHealth(rw http.ResponseWriter, r *http.Request) {
|
||||
@ -76,7 +76,7 @@ func (api *API) debugDeploymentHealth(rw http.ResponseWriter, r *http.Request) {
|
||||
}
|
||||
}
|
||||
|
||||
resChan := api.healthCheckGroup.DoChan("", func() (*codersdk.HealthcheckReport, error) {
|
||||
resChan := api.healthCheckGroup.DoChan("", func() (*healthsdk.HealthcheckReport, error) {
|
||||
// Create a new context not tied to the request.
|
||||
ctx, cancel := context.WithTimeout(context.Background(), api.Options.HealthcheckTimeout)
|
||||
defer cancel()
|
||||
@ -106,19 +106,19 @@ func (api *API) debugDeploymentHealth(rw http.ResponseWriter, r *http.Request) {
|
||||
}
|
||||
}
|
||||
|
||||
func formatHealthcheck(ctx context.Context, rw http.ResponseWriter, r *http.Request, hc codersdk.HealthcheckReport, dismissed ...codersdk.HealthSection) {
|
||||
func formatHealthcheck(ctx context.Context, rw http.ResponseWriter, r *http.Request, hc healthsdk.HealthcheckReport, dismissed ...healthsdk.HealthSection) {
|
||||
// Mark any sections previously marked as dismissed.
|
||||
for _, d := range dismissed {
|
||||
switch d {
|
||||
case codersdk.HealthSectionAccessURL:
|
||||
case healthsdk.HealthSectionAccessURL:
|
||||
hc.AccessURL.Dismissed = true
|
||||
case codersdk.HealthSectionDERP:
|
||||
case healthsdk.HealthSectionDERP:
|
||||
hc.DERP.Dismissed = true
|
||||
case codersdk.HealthSectionDatabase:
|
||||
case healthsdk.HealthSectionDatabase:
|
||||
hc.Database.Dismissed = true
|
||||
case codersdk.HealthSectionWebsocket:
|
||||
case healthsdk.HealthSectionWebsocket:
|
||||
hc.Websocket.Dismissed = true
|
||||
case codersdk.HealthSectionWorkspaceProxy:
|
||||
case healthsdk.HealthSectionWorkspaceProxy:
|
||||
hc.WorkspaceProxy.Dismissed = true
|
||||
}
|
||||
}
|
||||
@ -152,7 +152,7 @@ func formatHealthcheck(ctx context.Context, rw http.ResponseWriter, r *http.Requ
|
||||
// @Security CoderSessionToken
|
||||
// @Produce json
|
||||
// @Tags Debug
|
||||
// @Success 200 {object} codersdk.HealthSettings
|
||||
// @Success 200 {object} healthsdk.HealthSettings
|
||||
// @Router /debug/health/settings [get]
|
||||
func (api *API) deploymentHealthSettings(rw http.ResponseWriter, r *http.Request) {
|
||||
settingsJSON, err := api.Database.GetHealthSettings(r.Context())
|
||||
@ -164,7 +164,7 @@ func (api *API) deploymentHealthSettings(rw http.ResponseWriter, r *http.Request
|
||||
return
|
||||
}
|
||||
|
||||
var settings codersdk.HealthSettings
|
||||
var settings healthsdk.HealthSettings
|
||||
err = json.Unmarshal([]byte(settingsJSON), &settings)
|
||||
if err != nil {
|
||||
httpapi.Write(r.Context(), rw, http.StatusInternalServerError, codersdk.Response{
|
||||
@ -175,7 +175,7 @@ func (api *API) deploymentHealthSettings(rw http.ResponseWriter, r *http.Request
|
||||
}
|
||||
|
||||
if len(settings.DismissedHealthchecks) == 0 {
|
||||
settings.DismissedHealthchecks = []codersdk.HealthSection{}
|
||||
settings.DismissedHealthchecks = []healthsdk.HealthSection{}
|
||||
}
|
||||
|
||||
httpapi.Write(r.Context(), rw, http.StatusOK, settings)
|
||||
@ -187,8 +187,8 @@ func (api *API) deploymentHealthSettings(rw http.ResponseWriter, r *http.Request
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Tags Debug
|
||||
// @Param request body codersdk.UpdateHealthSettings true "Update health settings"
|
||||
// @Success 200 {object} codersdk.UpdateHealthSettings
|
||||
// @Param request body healthsdk.UpdateHealthSettings true "Update health settings"
|
||||
// @Success 200 {object} healthsdk.UpdateHealthSettings
|
||||
// @Router /debug/health/settings [put]
|
||||
func (api *API) putDeploymentHealthSettings(rw http.ResponseWriter, r *http.Request) {
|
||||
ctx := r.Context()
|
||||
@ -200,7 +200,7 @@ func (api *API) putDeploymentHealthSettings(rw http.ResponseWriter, r *http.Requ
|
||||
return
|
||||
}
|
||||
|
||||
var settings codersdk.HealthSettings
|
||||
var settings healthsdk.HealthSettings
|
||||
if !httpapi.Read(ctx, rw, r, &settings) {
|
||||
return
|
||||
}
|
||||
@ -264,9 +264,9 @@ func (api *API) putDeploymentHealthSettings(rw http.ResponseWriter, r *http.Requ
|
||||
httpapi.Write(r.Context(), rw, http.StatusOK, settings)
|
||||
}
|
||||
|
||||
func validateHealthSettings(settings codersdk.HealthSettings) error {
|
||||
func validateHealthSettings(settings healthsdk.HealthSettings) error {
|
||||
for _, dismissed := range settings.DismissedHealthchecks {
|
||||
ok := slices.Contains(codersdk.HealthSections, dismissed)
|
||||
ok := slices.Contains(healthsdk.HealthSections, dismissed)
|
||||
if !ok {
|
||||
return xerrors.Errorf("unknown healthcheck section: %s", dismissed)
|
||||
}
|
||||
@ -306,11 +306,11 @@ func _debugDERPTraffic(http.ResponseWriter, *http.Request) {} //nolint:unused
|
||||
// @x-apidocgen {"skip": true}
|
||||
func _debugExpVar(http.ResponseWriter, *http.Request) {} //nolint:unused
|
||||
|
||||
func loadDismissedHealthchecks(ctx context.Context, db database.Store, logger slog.Logger) []codersdk.HealthSection {
|
||||
dismissedHealthchecks := []codersdk.HealthSection{}
|
||||
func loadDismissedHealthchecks(ctx context.Context, db database.Store, logger slog.Logger) []healthsdk.HealthSection {
|
||||
dismissedHealthchecks := []healthsdk.HealthSection{}
|
||||
settingsJSON, err := db.GetHealthSettings(ctx)
|
||||
if err == nil {
|
||||
var settings codersdk.HealthSettings
|
||||
var settings healthsdk.HealthSettings
|
||||
err = json.Unmarshal([]byte(settingsJSON), &settings)
|
||||
if len(settings.DismissedHealthchecks) > 0 {
|
||||
dismissedHealthchecks = settings.DismissedHealthchecks
|
||||
|
@ -15,7 +15,7 @@ import (
|
||||
"cdr.dev/slog/sloggers/slogtest"
|
||||
|
||||
"github.com/coder/coder/v2/coderd/coderdtest"
|
||||
"github.com/coder/coder/v2/codersdk"
|
||||
"github.com/coder/coder/v2/codersdk/healthsdk"
|
||||
"github.com/coder/coder/v2/testutil"
|
||||
)
|
||||
|
||||
@ -29,10 +29,10 @@ func TestDebugHealth(t *testing.T) {
|
||||
ctx, cancel = context.WithTimeout(context.Background(), testutil.WaitShort)
|
||||
sessionToken string
|
||||
client = coderdtest.New(t, &coderdtest.Options{
|
||||
HealthcheckFunc: func(_ context.Context, apiKey string) *codersdk.HealthcheckReport {
|
||||
HealthcheckFunc: func(_ context.Context, apiKey string) *healthsdk.HealthcheckReport {
|
||||
calls.Add(1)
|
||||
assert.Equal(t, sessionToken, apiKey)
|
||||
return &codersdk.HealthcheckReport{
|
||||
return &healthsdk.HealthcheckReport{
|
||||
Time: time.Now(),
|
||||
}
|
||||
},
|
||||
@ -62,10 +62,10 @@ func TestDebugHealth(t *testing.T) {
|
||||
ctx, cancel = context.WithTimeout(context.Background(), testutil.WaitShort)
|
||||
sessionToken string
|
||||
client = coderdtest.New(t, &coderdtest.Options{
|
||||
HealthcheckFunc: func(_ context.Context, apiKey string) *codersdk.HealthcheckReport {
|
||||
HealthcheckFunc: func(_ context.Context, apiKey string) *healthsdk.HealthcheckReport {
|
||||
calls.Add(1)
|
||||
assert.Equal(t, sessionToken, apiKey)
|
||||
return &codersdk.HealthcheckReport{
|
||||
return &healthsdk.HealthcheckReport{
|
||||
Time: time.Now(),
|
||||
}
|
||||
},
|
||||
@ -97,15 +97,15 @@ func TestDebugHealth(t *testing.T) {
|
||||
client = coderdtest.New(t, &coderdtest.Options{
|
||||
Logger: &logger,
|
||||
HealthcheckTimeout: time.Microsecond,
|
||||
HealthcheckFunc: func(context.Context, string) *codersdk.HealthcheckReport {
|
||||
HealthcheckFunc: func(context.Context, string) *healthsdk.HealthcheckReport {
|
||||
t := time.NewTimer(time.Second)
|
||||
defer t.Stop()
|
||||
|
||||
select {
|
||||
case <-ctx.Done():
|
||||
return &codersdk.HealthcheckReport{}
|
||||
return &healthsdk.HealthcheckReport{}
|
||||
case <-t.C:
|
||||
return &codersdk.HealthcheckReport{}
|
||||
return &healthsdk.HealthcheckReport{}
|
||||
}
|
||||
},
|
||||
})
|
||||
@ -129,9 +129,9 @@ func TestDebugHealth(t *testing.T) {
|
||||
ctx, cancel = context.WithTimeout(context.Background(), testutil.WaitShort)
|
||||
client = coderdtest.New(t, &coderdtest.Options{
|
||||
HealthcheckRefresh: time.Microsecond,
|
||||
HealthcheckFunc: func(context.Context, string) *codersdk.HealthcheckReport {
|
||||
HealthcheckFunc: func(context.Context, string) *healthsdk.HealthcheckReport {
|
||||
calls <- struct{}{}
|
||||
return &codersdk.HealthcheckReport{}
|
||||
return &healthsdk.HealthcheckReport{}
|
||||
},
|
||||
})
|
||||
_ = coderdtest.CreateFirstUser(t, client)
|
||||
@ -174,9 +174,9 @@ func TestDebugHealth(t *testing.T) {
|
||||
client = coderdtest.New(t, &coderdtest.Options{
|
||||
HealthcheckRefresh: time.Hour,
|
||||
HealthcheckTimeout: time.Hour,
|
||||
HealthcheckFunc: func(context.Context, string) *codersdk.HealthcheckReport {
|
||||
HealthcheckFunc: func(context.Context, string) *healthsdk.HealthcheckReport {
|
||||
calls++
|
||||
return &codersdk.HealthcheckReport{
|
||||
return &healthsdk.HealthcheckReport{
|
||||
Time: time.Now(),
|
||||
}
|
||||
},
|
||||
@ -208,12 +208,12 @@ func TestDebugHealth(t *testing.T) {
|
||||
ctx, cancel = context.WithTimeout(context.Background(), testutil.WaitShort)
|
||||
sessionToken string
|
||||
client = coderdtest.New(t, &coderdtest.Options{
|
||||
HealthcheckFunc: func(_ context.Context, apiKey string) *codersdk.HealthcheckReport {
|
||||
HealthcheckFunc: func(_ context.Context, apiKey string) *healthsdk.HealthcheckReport {
|
||||
assert.Equal(t, sessionToken, apiKey)
|
||||
return &codersdk.HealthcheckReport{
|
||||
return &healthsdk.HealthcheckReport{
|
||||
Time: time.Now(),
|
||||
Healthy: true,
|
||||
DERP: codersdk.DERPHealthReport{Healthy: true},
|
||||
DERP: healthsdk.DERPHealthReport{Healthy: true},
|
||||
}
|
||||
},
|
||||
})
|
||||
@ -251,11 +251,11 @@ func TestHealthSettings(t *testing.T) {
|
||||
_ = coderdtest.CreateFirstUser(t, adminClient)
|
||||
|
||||
// when
|
||||
settings, err := adminClient.HealthSettings(ctx)
|
||||
settings, err := healthsdk.New(adminClient).HealthSettings(ctx)
|
||||
require.NoError(t, err)
|
||||
|
||||
// then
|
||||
require.Equal(t, codersdk.HealthSettings{DismissedHealthchecks: []codersdk.HealthSection{}}, settings)
|
||||
require.Equal(t, healthsdk.HealthSettings{DismissedHealthchecks: []healthsdk.HealthSection{}}, settings)
|
||||
})
|
||||
|
||||
t.Run("DismissSection", func(t *testing.T) {
|
||||
@ -268,16 +268,16 @@ func TestHealthSettings(t *testing.T) {
|
||||
adminClient := coderdtest.New(t, nil)
|
||||
_ = coderdtest.CreateFirstUser(t, adminClient)
|
||||
|
||||
expected := codersdk.HealthSettings{
|
||||
DismissedHealthchecks: []codersdk.HealthSection{codersdk.HealthSectionDERP, codersdk.HealthSectionWebsocket},
|
||||
expected := healthsdk.HealthSettings{
|
||||
DismissedHealthchecks: []healthsdk.HealthSection{healthsdk.HealthSectionDERP, healthsdk.HealthSectionWebsocket},
|
||||
}
|
||||
|
||||
// when: dismiss "derp" and "websocket"
|
||||
err := adminClient.PutHealthSettings(ctx, expected)
|
||||
err := healthsdk.New(adminClient).PutHealthSettings(ctx, expected)
|
||||
require.NoError(t, err)
|
||||
|
||||
// then
|
||||
settings, err := adminClient.HealthSettings(ctx)
|
||||
settings, err := healthsdk.New(adminClient).HealthSettings(ctx)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, expected, settings)
|
||||
|
||||
@ -287,7 +287,7 @@ func TestHealthSettings(t *testing.T) {
|
||||
bs, err := io.ReadAll(res.Body)
|
||||
require.NoError(t, err)
|
||||
defer res.Body.Close()
|
||||
var hc codersdk.HealthcheckReport
|
||||
var hc healthsdk.HealthcheckReport
|
||||
require.NoError(t, json.Unmarshal(bs, &hc))
|
||||
require.True(t, hc.DERP.Dismissed)
|
||||
require.True(t, hc.Websocket.Dismissed)
|
||||
@ -303,23 +303,23 @@ func TestHealthSettings(t *testing.T) {
|
||||
adminClient := coderdtest.New(t, nil)
|
||||
_ = coderdtest.CreateFirstUser(t, adminClient)
|
||||
|
||||
initial := codersdk.HealthSettings{
|
||||
DismissedHealthchecks: []codersdk.HealthSection{codersdk.HealthSectionDERP, codersdk.HealthSectionWebsocket},
|
||||
initial := healthsdk.HealthSettings{
|
||||
DismissedHealthchecks: []healthsdk.HealthSection{healthsdk.HealthSectionDERP, healthsdk.HealthSectionWebsocket},
|
||||
}
|
||||
|
||||
err := adminClient.PutHealthSettings(ctx, initial)
|
||||
err := healthsdk.New(adminClient).PutHealthSettings(ctx, initial)
|
||||
require.NoError(t, err)
|
||||
|
||||
expected := codersdk.HealthSettings{
|
||||
DismissedHealthchecks: []codersdk.HealthSection{codersdk.HealthSectionDERP},
|
||||
expected := healthsdk.HealthSettings{
|
||||
DismissedHealthchecks: []healthsdk.HealthSection{healthsdk.HealthSectionDERP},
|
||||
}
|
||||
|
||||
// when: undismiss "websocket"
|
||||
err = adminClient.PutHealthSettings(ctx, expected)
|
||||
err = healthsdk.New(adminClient).PutHealthSettings(ctx, expected)
|
||||
require.NoError(t, err)
|
||||
|
||||
// then
|
||||
settings, err := adminClient.HealthSettings(ctx)
|
||||
settings, err := healthsdk.New(adminClient).HealthSettings(ctx)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, expected, settings)
|
||||
|
||||
@ -329,7 +329,7 @@ func TestHealthSettings(t *testing.T) {
|
||||
bs, err := io.ReadAll(res.Body)
|
||||
require.NoError(t, err)
|
||||
defer res.Body.Close()
|
||||
var hc codersdk.HealthcheckReport
|
||||
var hc healthsdk.HealthcheckReport
|
||||
require.NoError(t, json.Unmarshal(bs, &hc))
|
||||
require.True(t, hc.DERP.Dismissed)
|
||||
require.False(t, hc.Websocket.Dismissed)
|
||||
@ -345,15 +345,15 @@ func TestHealthSettings(t *testing.T) {
|
||||
adminClient := coderdtest.New(t, nil)
|
||||
_ = coderdtest.CreateFirstUser(t, adminClient)
|
||||
|
||||
expected := codersdk.HealthSettings{
|
||||
DismissedHealthchecks: []codersdk.HealthSection{codersdk.HealthSectionDERP, codersdk.HealthSectionWebsocket},
|
||||
expected := healthsdk.HealthSettings{
|
||||
DismissedHealthchecks: []healthsdk.HealthSection{healthsdk.HealthSectionDERP, healthsdk.HealthSectionWebsocket},
|
||||
}
|
||||
|
||||
err := adminClient.PutHealthSettings(ctx, expected)
|
||||
err := healthsdk.New(adminClient).PutHealthSettings(ctx, expected)
|
||||
require.NoError(t, err)
|
||||
|
||||
// when
|
||||
err = adminClient.PutHealthSettings(ctx, expected)
|
||||
err = healthsdk.New(adminClient).PutHealthSettings(ctx, expected)
|
||||
|
||||
// then
|
||||
require.Error(t, err)
|
||||
|
@ -8,10 +8,10 @@ import (
|
||||
"time"
|
||||
|
||||
"github.com/coder/coder/v2/coderd/healthcheck/health"
|
||||
"github.com/coder/coder/v2/codersdk"
|
||||
"github.com/coder/coder/v2/codersdk/healthsdk"
|
||||
)
|
||||
|
||||
type AccessURLReport codersdk.AccessURLReport
|
||||
type AccessURLReport healthsdk.AccessURLReport
|
||||
|
||||
type AccessURLReportOptions struct {
|
||||
AccessURL *url.URL
|
||||
|
@ -8,14 +8,14 @@ import (
|
||||
|
||||
"github.com/coder/coder/v2/coderd/database"
|
||||
"github.com/coder/coder/v2/coderd/healthcheck/health"
|
||||
"github.com/coder/coder/v2/codersdk"
|
||||
"github.com/coder/coder/v2/codersdk/healthsdk"
|
||||
)
|
||||
|
||||
const (
|
||||
DatabaseDefaultThreshold = 15 * time.Millisecond
|
||||
)
|
||||
|
||||
type DatabaseReport codersdk.DatabaseReport
|
||||
type DatabaseReport healthsdk.DatabaseReport
|
||||
|
||||
type DatabaseReportOptions struct {
|
||||
DB database.Store
|
||||
|
@ -25,7 +25,7 @@ import (
|
||||
"github.com/coder/coder/v2/coderd/healthcheck/health"
|
||||
"github.com/coder/coder/v2/coderd/util/ptr"
|
||||
"github.com/coder/coder/v2/coderd/util/slice"
|
||||
"github.com/coder/coder/v2/codersdk"
|
||||
"github.com/coder/coder/v2/codersdk/healthsdk"
|
||||
)
|
||||
|
||||
const (
|
||||
@ -40,15 +40,15 @@ type ReportOptions struct {
|
||||
DERPMap *tailcfg.DERPMap
|
||||
}
|
||||
|
||||
type Report codersdk.DERPHealthReport
|
||||
type Report healthsdk.DERPHealthReport
|
||||
|
||||
type RegionReport struct {
|
||||
codersdk.DERPRegionReport
|
||||
healthsdk.DERPRegionReport
|
||||
mu sync.Mutex
|
||||
}
|
||||
|
||||
type NodeReport struct {
|
||||
codersdk.DERPNodeReport
|
||||
healthsdk.DERPNodeReport
|
||||
mu sync.Mutex
|
||||
clientCounter int
|
||||
}
|
||||
@ -59,7 +59,7 @@ func (r *Report) Run(ctx context.Context, opts *ReportOptions) {
|
||||
r.Warnings = []health.Message{}
|
||||
r.Dismissed = opts.Dismissed
|
||||
|
||||
r.Regions = map[int]*codersdk.DERPRegionReport{}
|
||||
r.Regions = map[int]*healthsdk.DERPRegionReport{}
|
||||
|
||||
wg := &sync.WaitGroup{}
|
||||
mu := sync.Mutex{}
|
||||
@ -69,7 +69,7 @@ func (r *Report) Run(ctx context.Context, opts *ReportOptions) {
|
||||
var (
|
||||
region = region
|
||||
regionReport = RegionReport{
|
||||
DERPRegionReport: codersdk.DERPRegionReport{
|
||||
DERPRegionReport: healthsdk.DERPRegionReport{
|
||||
Region: region,
|
||||
},
|
||||
}
|
||||
@ -121,7 +121,7 @@ func (r *Report) Run(ctx context.Context, opts *ReportOptions) {
|
||||
func (r *RegionReport) Run(ctx context.Context) {
|
||||
r.Healthy = true
|
||||
r.Severity = health.SeverityOK
|
||||
r.NodeReports = []*codersdk.DERPNodeReport{}
|
||||
r.NodeReports = []*healthsdk.DERPNodeReport{}
|
||||
r.Warnings = []health.Message{}
|
||||
|
||||
wg := &sync.WaitGroup{}
|
||||
@ -132,7 +132,7 @@ func (r *RegionReport) Run(ctx context.Context) {
|
||||
var (
|
||||
node = node
|
||||
nodeReport = NodeReport{
|
||||
DERPNodeReport: codersdk.DERPNodeReport{
|
||||
DERPNodeReport: healthsdk.DERPNodeReport{
|
||||
Node: node,
|
||||
Healthy: true,
|
||||
},
|
||||
@ -499,8 +499,8 @@ func convertError(err error) *string {
|
||||
return nil
|
||||
}
|
||||
|
||||
func sortNodeReports(reports []*codersdk.DERPNodeReport) {
|
||||
slices.SortFunc(reports, func(a, b *codersdk.DERPNodeReport) int {
|
||||
func sortNodeReports(reports []*healthsdk.DERPNodeReport) {
|
||||
slices.SortFunc(reports, func(a, b *healthsdk.DERPNodeReport) int {
|
||||
return slice.Ascending(a.Node.Name, b.Node.Name)
|
||||
})
|
||||
}
|
||||
|
@ -9,16 +9,16 @@ import (
|
||||
"github.com/coder/coder/v2/coderd/healthcheck/derphealth"
|
||||
"github.com/coder/coder/v2/coderd/healthcheck/health"
|
||||
"github.com/coder/coder/v2/coderd/util/ptr"
|
||||
"github.com/coder/coder/v2/codersdk"
|
||||
"github.com/coder/coder/v2/codersdk/healthsdk"
|
||||
)
|
||||
|
||||
type Checker interface {
|
||||
DERP(ctx context.Context, opts *derphealth.ReportOptions) codersdk.DERPHealthReport
|
||||
AccessURL(ctx context.Context, opts *AccessURLReportOptions) codersdk.AccessURLReport
|
||||
Websocket(ctx context.Context, opts *WebsocketReportOptions) codersdk.WebsocketReport
|
||||
Database(ctx context.Context, opts *DatabaseReportOptions) codersdk.DatabaseReport
|
||||
WorkspaceProxy(ctx context.Context, opts *WorkspaceProxyReportOptions) codersdk.WorkspaceProxyReport
|
||||
ProvisionerDaemons(ctx context.Context, opts *ProvisionerDaemonsReportDeps) codersdk.ProvisionerDaemonsReport
|
||||
DERP(ctx context.Context, opts *derphealth.ReportOptions) healthsdk.DERPHealthReport
|
||||
AccessURL(ctx context.Context, opts *AccessURLReportOptions) healthsdk.AccessURLReport
|
||||
Websocket(ctx context.Context, opts *WebsocketReportOptions) healthsdk.WebsocketReport
|
||||
Database(ctx context.Context, opts *DatabaseReportOptions) healthsdk.DatabaseReport
|
||||
WorkspaceProxy(ctx context.Context, opts *WorkspaceProxyReportOptions) healthsdk.WorkspaceProxyReport
|
||||
ProvisionerDaemons(ctx context.Context, opts *ProvisionerDaemonsReportDeps) healthsdk.ProvisionerDaemonsReport
|
||||
}
|
||||
|
||||
type ReportOptions struct {
|
||||
@ -34,46 +34,46 @@ type ReportOptions struct {
|
||||
|
||||
type defaultChecker struct{}
|
||||
|
||||
func (defaultChecker) DERP(ctx context.Context, opts *derphealth.ReportOptions) codersdk.DERPHealthReport {
|
||||
func (defaultChecker) DERP(ctx context.Context, opts *derphealth.ReportOptions) healthsdk.DERPHealthReport {
|
||||
var report derphealth.Report
|
||||
report.Run(ctx, opts)
|
||||
return codersdk.DERPHealthReport(report)
|
||||
return healthsdk.DERPHealthReport(report)
|
||||
}
|
||||
|
||||
func (defaultChecker) AccessURL(ctx context.Context, opts *AccessURLReportOptions) codersdk.AccessURLReport {
|
||||
func (defaultChecker) AccessURL(ctx context.Context, opts *AccessURLReportOptions) healthsdk.AccessURLReport {
|
||||
var report AccessURLReport
|
||||
report.Run(ctx, opts)
|
||||
return codersdk.AccessURLReport(report)
|
||||
return healthsdk.AccessURLReport(report)
|
||||
}
|
||||
|
||||
func (defaultChecker) Websocket(ctx context.Context, opts *WebsocketReportOptions) codersdk.WebsocketReport {
|
||||
func (defaultChecker) Websocket(ctx context.Context, opts *WebsocketReportOptions) healthsdk.WebsocketReport {
|
||||
var report WebsocketReport
|
||||
report.Run(ctx, opts)
|
||||
return codersdk.WebsocketReport(report)
|
||||
return healthsdk.WebsocketReport(report)
|
||||
}
|
||||
|
||||
func (defaultChecker) Database(ctx context.Context, opts *DatabaseReportOptions) codersdk.DatabaseReport {
|
||||
func (defaultChecker) Database(ctx context.Context, opts *DatabaseReportOptions) healthsdk.DatabaseReport {
|
||||
var report DatabaseReport
|
||||
report.Run(ctx, opts)
|
||||
return codersdk.DatabaseReport(report)
|
||||
return healthsdk.DatabaseReport(report)
|
||||
}
|
||||
|
||||
func (defaultChecker) WorkspaceProxy(ctx context.Context, opts *WorkspaceProxyReportOptions) codersdk.WorkspaceProxyReport {
|
||||
func (defaultChecker) WorkspaceProxy(ctx context.Context, opts *WorkspaceProxyReportOptions) healthsdk.WorkspaceProxyReport {
|
||||
var report WorkspaceProxyReport
|
||||
report.Run(ctx, opts)
|
||||
return codersdk.WorkspaceProxyReport(report)
|
||||
return healthsdk.WorkspaceProxyReport(report)
|
||||
}
|
||||
|
||||
func (defaultChecker) ProvisionerDaemons(ctx context.Context, opts *ProvisionerDaemonsReportDeps) codersdk.ProvisionerDaemonsReport {
|
||||
func (defaultChecker) ProvisionerDaemons(ctx context.Context, opts *ProvisionerDaemonsReportDeps) healthsdk.ProvisionerDaemonsReport {
|
||||
var report ProvisionerDaemonsReport
|
||||
report.Run(ctx, opts)
|
||||
return codersdk.ProvisionerDaemonsReport(report)
|
||||
return healthsdk.ProvisionerDaemonsReport(report)
|
||||
}
|
||||
|
||||
func Run(ctx context.Context, opts *ReportOptions) *codersdk.HealthcheckReport {
|
||||
func Run(ctx context.Context, opts *ReportOptions) *healthsdk.HealthcheckReport {
|
||||
var (
|
||||
wg sync.WaitGroup
|
||||
report codersdk.HealthcheckReport
|
||||
report healthsdk.HealthcheckReport
|
||||
)
|
||||
|
||||
if opts.Checker == nil {
|
||||
@ -156,24 +156,24 @@ func Run(ctx context.Context, opts *ReportOptions) *codersdk.HealthcheckReport {
|
||||
wg.Wait()
|
||||
|
||||
report.Time = time.Now()
|
||||
report.FailingSections = []codersdk.HealthSection{}
|
||||
report.FailingSections = []healthsdk.HealthSection{}
|
||||
if report.DERP.Severity.Value() > health.SeverityWarning.Value() {
|
||||
report.FailingSections = append(report.FailingSections, codersdk.HealthSectionDERP)
|
||||
report.FailingSections = append(report.FailingSections, healthsdk.HealthSectionDERP)
|
||||
}
|
||||
if report.AccessURL.Severity.Value() > health.SeverityOK.Value() {
|
||||
report.FailingSections = append(report.FailingSections, codersdk.HealthSectionAccessURL)
|
||||
report.FailingSections = append(report.FailingSections, healthsdk.HealthSectionAccessURL)
|
||||
}
|
||||
if report.Websocket.Severity.Value() > health.SeverityWarning.Value() {
|
||||
report.FailingSections = append(report.FailingSections, codersdk.HealthSectionWebsocket)
|
||||
report.FailingSections = append(report.FailingSections, healthsdk.HealthSectionWebsocket)
|
||||
}
|
||||
if report.Database.Severity.Value() > health.SeverityWarning.Value() {
|
||||
report.FailingSections = append(report.FailingSections, codersdk.HealthSectionDatabase)
|
||||
report.FailingSections = append(report.FailingSections, healthsdk.HealthSectionDatabase)
|
||||
}
|
||||
if report.WorkspaceProxy.Severity.Value() > health.SeverityWarning.Value() {
|
||||
report.FailingSections = append(report.FailingSections, codersdk.HealthSectionWorkspaceProxy)
|
||||
report.FailingSections = append(report.FailingSections, healthsdk.HealthSectionWorkspaceProxy)
|
||||
}
|
||||
if report.ProvisionerDaemons.Severity.Value() > health.SeverityWarning.Value() {
|
||||
report.FailingSections = append(report.FailingSections, codersdk.HealthSectionProvisionerDaemons)
|
||||
report.FailingSections = append(report.FailingSections, healthsdk.HealthSectionProvisionerDaemons)
|
||||
}
|
||||
|
||||
report.Healthy = len(report.FailingSections) == 0
|
||||
|
@ -9,39 +9,39 @@ import (
|
||||
"github.com/coder/coder/v2/coderd/healthcheck"
|
||||
"github.com/coder/coder/v2/coderd/healthcheck/derphealth"
|
||||
"github.com/coder/coder/v2/coderd/healthcheck/health"
|
||||
"github.com/coder/coder/v2/codersdk"
|
||||
"github.com/coder/coder/v2/codersdk/healthsdk"
|
||||
)
|
||||
|
||||
type testChecker struct {
|
||||
DERPReport codersdk.DERPHealthReport
|
||||
AccessURLReport codersdk.AccessURLReport
|
||||
WebsocketReport codersdk.WebsocketReport
|
||||
DatabaseReport codersdk.DatabaseReport
|
||||
WorkspaceProxyReport codersdk.WorkspaceProxyReport
|
||||
ProvisionerDaemonsReport codersdk.ProvisionerDaemonsReport
|
||||
DERPReport healthsdk.DERPHealthReport
|
||||
AccessURLReport healthsdk.AccessURLReport
|
||||
WebsocketReport healthsdk.WebsocketReport
|
||||
DatabaseReport healthsdk.DatabaseReport
|
||||
WorkspaceProxyReport healthsdk.WorkspaceProxyReport
|
||||
ProvisionerDaemonsReport healthsdk.ProvisionerDaemonsReport
|
||||
}
|
||||
|
||||
func (c *testChecker) DERP(context.Context, *derphealth.ReportOptions) codersdk.DERPHealthReport {
|
||||
func (c *testChecker) DERP(context.Context, *derphealth.ReportOptions) healthsdk.DERPHealthReport {
|
||||
return c.DERPReport
|
||||
}
|
||||
|
||||
func (c *testChecker) AccessURL(context.Context, *healthcheck.AccessURLReportOptions) codersdk.AccessURLReport {
|
||||
func (c *testChecker) AccessURL(context.Context, *healthcheck.AccessURLReportOptions) healthsdk.AccessURLReport {
|
||||
return c.AccessURLReport
|
||||
}
|
||||
|
||||
func (c *testChecker) Websocket(context.Context, *healthcheck.WebsocketReportOptions) codersdk.WebsocketReport {
|
||||
func (c *testChecker) Websocket(context.Context, *healthcheck.WebsocketReportOptions) healthsdk.WebsocketReport {
|
||||
return c.WebsocketReport
|
||||
}
|
||||
|
||||
func (c *testChecker) Database(context.Context, *healthcheck.DatabaseReportOptions) codersdk.DatabaseReport {
|
||||
func (c *testChecker) Database(context.Context, *healthcheck.DatabaseReportOptions) healthsdk.DatabaseReport {
|
||||
return c.DatabaseReport
|
||||
}
|
||||
|
||||
func (c *testChecker) WorkspaceProxy(context.Context, *healthcheck.WorkspaceProxyReportOptions) codersdk.WorkspaceProxyReport {
|
||||
func (c *testChecker) WorkspaceProxy(context.Context, *healthcheck.WorkspaceProxyReportOptions) healthsdk.WorkspaceProxyReport {
|
||||
return c.WorkspaceProxyReport
|
||||
}
|
||||
|
||||
func (c *testChecker) ProvisionerDaemons(context.Context, *healthcheck.ProvisionerDaemonsReportDeps) codersdk.ProvisionerDaemonsReport {
|
||||
func (c *testChecker) ProvisionerDaemons(context.Context, *healthcheck.ProvisionerDaemonsReportDeps) healthsdk.ProvisionerDaemonsReport {
|
||||
return c.ProvisionerDaemonsReport
|
||||
}
|
||||
|
||||
@ -53,346 +53,346 @@ func TestHealthcheck(t *testing.T) {
|
||||
checker *testChecker
|
||||
healthy bool
|
||||
severity health.Severity
|
||||
failingSections []codersdk.HealthSection
|
||||
failingSections []healthsdk.HealthSection
|
||||
}{{
|
||||
name: "OK",
|
||||
checker: &testChecker{
|
||||
DERPReport: codersdk.DERPHealthReport{
|
||||
DERPReport: healthsdk.DERPHealthReport{
|
||||
Healthy: true,
|
||||
Severity: health.SeverityOK,
|
||||
},
|
||||
AccessURLReport: codersdk.AccessURLReport{
|
||||
AccessURLReport: healthsdk.AccessURLReport{
|
||||
Healthy: true,
|
||||
Severity: health.SeverityOK,
|
||||
},
|
||||
WebsocketReport: codersdk.WebsocketReport{
|
||||
WebsocketReport: healthsdk.WebsocketReport{
|
||||
Healthy: true,
|
||||
Severity: health.SeverityOK,
|
||||
},
|
||||
DatabaseReport: codersdk.DatabaseReport{
|
||||
DatabaseReport: healthsdk.DatabaseReport{
|
||||
Healthy: true,
|
||||
Severity: health.SeverityOK,
|
||||
},
|
||||
WorkspaceProxyReport: codersdk.WorkspaceProxyReport{
|
||||
WorkspaceProxyReport: healthsdk.WorkspaceProxyReport{
|
||||
Healthy: true,
|
||||
Severity: health.SeverityOK,
|
||||
},
|
||||
ProvisionerDaemonsReport: codersdk.ProvisionerDaemonsReport{
|
||||
ProvisionerDaemonsReport: healthsdk.ProvisionerDaemonsReport{
|
||||
Severity: health.SeverityOK,
|
||||
},
|
||||
},
|
||||
healthy: true,
|
||||
severity: health.SeverityOK,
|
||||
failingSections: []codersdk.HealthSection{},
|
||||
failingSections: []healthsdk.HealthSection{},
|
||||
}, {
|
||||
name: "DERPFail",
|
||||
checker: &testChecker{
|
||||
DERPReport: codersdk.DERPHealthReport{
|
||||
DERPReport: healthsdk.DERPHealthReport{
|
||||
Healthy: false,
|
||||
Severity: health.SeverityError,
|
||||
},
|
||||
AccessURLReport: codersdk.AccessURLReport{
|
||||
AccessURLReport: healthsdk.AccessURLReport{
|
||||
Healthy: true,
|
||||
Severity: health.SeverityOK,
|
||||
},
|
||||
WebsocketReport: codersdk.WebsocketReport{
|
||||
WebsocketReport: healthsdk.WebsocketReport{
|
||||
Healthy: true,
|
||||
Severity: health.SeverityOK,
|
||||
},
|
||||
DatabaseReport: codersdk.DatabaseReport{
|
||||
DatabaseReport: healthsdk.DatabaseReport{
|
||||
Healthy: true,
|
||||
Severity: health.SeverityOK,
|
||||
},
|
||||
WorkspaceProxyReport: codersdk.WorkspaceProxyReport{
|
||||
WorkspaceProxyReport: healthsdk.WorkspaceProxyReport{
|
||||
Healthy: true,
|
||||
Severity: health.SeverityOK,
|
||||
},
|
||||
ProvisionerDaemonsReport: codersdk.ProvisionerDaemonsReport{
|
||||
ProvisionerDaemonsReport: healthsdk.ProvisionerDaemonsReport{
|
||||
Severity: health.SeverityOK,
|
||||
},
|
||||
},
|
||||
healthy: false,
|
||||
severity: health.SeverityError,
|
||||
failingSections: []codersdk.HealthSection{codersdk.HealthSectionDERP},
|
||||
failingSections: []healthsdk.HealthSection{healthsdk.HealthSectionDERP},
|
||||
}, {
|
||||
name: "DERPWarning",
|
||||
checker: &testChecker{
|
||||
DERPReport: codersdk.DERPHealthReport{
|
||||
DERPReport: healthsdk.DERPHealthReport{
|
||||
Healthy: true,
|
||||
Warnings: []health.Message{{Message: "foobar", Code: "EFOOBAR"}},
|
||||
Severity: health.SeverityWarning,
|
||||
},
|
||||
AccessURLReport: codersdk.AccessURLReport{
|
||||
AccessURLReport: healthsdk.AccessURLReport{
|
||||
Healthy: true,
|
||||
Severity: health.SeverityOK,
|
||||
},
|
||||
WebsocketReport: codersdk.WebsocketReport{
|
||||
WebsocketReport: healthsdk.WebsocketReport{
|
||||
Healthy: true,
|
||||
Severity: health.SeverityOK,
|
||||
},
|
||||
DatabaseReport: codersdk.DatabaseReport{
|
||||
DatabaseReport: healthsdk.DatabaseReport{
|
||||
Healthy: true,
|
||||
Severity: health.SeverityOK,
|
||||
},
|
||||
WorkspaceProxyReport: codersdk.WorkspaceProxyReport{
|
||||
WorkspaceProxyReport: healthsdk.WorkspaceProxyReport{
|
||||
Healthy: true,
|
||||
Severity: health.SeverityOK,
|
||||
},
|
||||
ProvisionerDaemonsReport: codersdk.ProvisionerDaemonsReport{
|
||||
ProvisionerDaemonsReport: healthsdk.ProvisionerDaemonsReport{
|
||||
Severity: health.SeverityOK,
|
||||
},
|
||||
},
|
||||
healthy: true,
|
||||
severity: health.SeverityWarning,
|
||||
failingSections: []codersdk.HealthSection{},
|
||||
failingSections: []healthsdk.HealthSection{},
|
||||
}, {
|
||||
name: "AccessURLFail",
|
||||
checker: &testChecker{
|
||||
DERPReport: codersdk.DERPHealthReport{
|
||||
DERPReport: healthsdk.DERPHealthReport{
|
||||
Healthy: true,
|
||||
Severity: health.SeverityOK,
|
||||
},
|
||||
AccessURLReport: codersdk.AccessURLReport{
|
||||
AccessURLReport: healthsdk.AccessURLReport{
|
||||
Healthy: false,
|
||||
Severity: health.SeverityWarning,
|
||||
},
|
||||
WebsocketReport: codersdk.WebsocketReport{
|
||||
WebsocketReport: healthsdk.WebsocketReport{
|
||||
Healthy: true,
|
||||
Severity: health.SeverityOK,
|
||||
},
|
||||
DatabaseReport: codersdk.DatabaseReport{
|
||||
DatabaseReport: healthsdk.DatabaseReport{
|
||||
Healthy: true,
|
||||
Severity: health.SeverityOK,
|
||||
},
|
||||
WorkspaceProxyReport: codersdk.WorkspaceProxyReport{
|
||||
WorkspaceProxyReport: healthsdk.WorkspaceProxyReport{
|
||||
Healthy: true,
|
||||
Severity: health.SeverityOK,
|
||||
},
|
||||
ProvisionerDaemonsReport: codersdk.ProvisionerDaemonsReport{
|
||||
ProvisionerDaemonsReport: healthsdk.ProvisionerDaemonsReport{
|
||||
Severity: health.SeverityOK,
|
||||
},
|
||||
},
|
||||
healthy: false,
|
||||
severity: health.SeverityWarning,
|
||||
failingSections: []codersdk.HealthSection{codersdk.HealthSectionAccessURL},
|
||||
failingSections: []healthsdk.HealthSection{healthsdk.HealthSectionAccessURL},
|
||||
}, {
|
||||
name: "WebsocketFail",
|
||||
checker: &testChecker{
|
||||
DERPReport: codersdk.DERPHealthReport{
|
||||
DERPReport: healthsdk.DERPHealthReport{
|
||||
Healthy: true,
|
||||
Severity: health.SeverityOK,
|
||||
},
|
||||
AccessURLReport: codersdk.AccessURLReport{
|
||||
AccessURLReport: healthsdk.AccessURLReport{
|
||||
Healthy: true,
|
||||
Severity: health.SeverityOK,
|
||||
},
|
||||
WebsocketReport: codersdk.WebsocketReport{
|
||||
WebsocketReport: healthsdk.WebsocketReport{
|
||||
Healthy: false,
|
||||
Severity: health.SeverityError,
|
||||
},
|
||||
DatabaseReport: codersdk.DatabaseReport{
|
||||
DatabaseReport: healthsdk.DatabaseReport{
|
||||
Healthy: true,
|
||||
Severity: health.SeverityOK,
|
||||
},
|
||||
WorkspaceProxyReport: codersdk.WorkspaceProxyReport{
|
||||
WorkspaceProxyReport: healthsdk.WorkspaceProxyReport{
|
||||
Healthy: true,
|
||||
Severity: health.SeverityOK,
|
||||
},
|
||||
ProvisionerDaemonsReport: codersdk.ProvisionerDaemonsReport{
|
||||
ProvisionerDaemonsReport: healthsdk.ProvisionerDaemonsReport{
|
||||
Severity: health.SeverityOK,
|
||||
},
|
||||
},
|
||||
healthy: false,
|
||||
severity: health.SeverityError,
|
||||
failingSections: []codersdk.HealthSection{codersdk.HealthSectionWebsocket},
|
||||
failingSections: []healthsdk.HealthSection{healthsdk.HealthSectionWebsocket},
|
||||
}, {
|
||||
name: "DatabaseFail",
|
||||
checker: &testChecker{
|
||||
DERPReport: codersdk.DERPHealthReport{
|
||||
DERPReport: healthsdk.DERPHealthReport{
|
||||
Healthy: true,
|
||||
Severity: health.SeverityOK,
|
||||
},
|
||||
AccessURLReport: codersdk.AccessURLReport{
|
||||
AccessURLReport: healthsdk.AccessURLReport{
|
||||
Healthy: true,
|
||||
Severity: health.SeverityOK,
|
||||
},
|
||||
WebsocketReport: codersdk.WebsocketReport{
|
||||
WebsocketReport: healthsdk.WebsocketReport{
|
||||
Healthy: true,
|
||||
Severity: health.SeverityOK,
|
||||
},
|
||||
DatabaseReport: codersdk.DatabaseReport{
|
||||
DatabaseReport: healthsdk.DatabaseReport{
|
||||
Healthy: false,
|
||||
Severity: health.SeverityError,
|
||||
},
|
||||
WorkspaceProxyReport: codersdk.WorkspaceProxyReport{
|
||||
WorkspaceProxyReport: healthsdk.WorkspaceProxyReport{
|
||||
Healthy: true,
|
||||
Severity: health.SeverityOK,
|
||||
},
|
||||
ProvisionerDaemonsReport: codersdk.ProvisionerDaemonsReport{
|
||||
ProvisionerDaemonsReport: healthsdk.ProvisionerDaemonsReport{
|
||||
Severity: health.SeverityOK,
|
||||
},
|
||||
},
|
||||
healthy: false,
|
||||
severity: health.SeverityError,
|
||||
failingSections: []codersdk.HealthSection{codersdk.HealthSectionDatabase},
|
||||
failingSections: []healthsdk.HealthSection{healthsdk.HealthSectionDatabase},
|
||||
}, {
|
||||
name: "ProxyFail",
|
||||
checker: &testChecker{
|
||||
DERPReport: codersdk.DERPHealthReport{
|
||||
DERPReport: healthsdk.DERPHealthReport{
|
||||
Healthy: true,
|
||||
Severity: health.SeverityOK,
|
||||
},
|
||||
AccessURLReport: codersdk.AccessURLReport{
|
||||
AccessURLReport: healthsdk.AccessURLReport{
|
||||
Healthy: true,
|
||||
Severity: health.SeverityOK,
|
||||
},
|
||||
WebsocketReport: codersdk.WebsocketReport{
|
||||
WebsocketReport: healthsdk.WebsocketReport{
|
||||
Healthy: true,
|
||||
Severity: health.SeverityOK,
|
||||
},
|
||||
DatabaseReport: codersdk.DatabaseReport{
|
||||
DatabaseReport: healthsdk.DatabaseReport{
|
||||
Healthy: true,
|
||||
Severity: health.SeverityOK,
|
||||
},
|
||||
WorkspaceProxyReport: codersdk.WorkspaceProxyReport{
|
||||
WorkspaceProxyReport: healthsdk.WorkspaceProxyReport{
|
||||
Healthy: false,
|
||||
Severity: health.SeverityError,
|
||||
},
|
||||
ProvisionerDaemonsReport: codersdk.ProvisionerDaemonsReport{
|
||||
ProvisionerDaemonsReport: healthsdk.ProvisionerDaemonsReport{
|
||||
Severity: health.SeverityOK,
|
||||
},
|
||||
},
|
||||
severity: health.SeverityError,
|
||||
healthy: false,
|
||||
failingSections: []codersdk.HealthSection{codersdk.HealthSectionWorkspaceProxy},
|
||||
failingSections: []healthsdk.HealthSection{healthsdk.HealthSectionWorkspaceProxy},
|
||||
}, {
|
||||
name: "ProxyWarn",
|
||||
checker: &testChecker{
|
||||
DERPReport: codersdk.DERPHealthReport{
|
||||
DERPReport: healthsdk.DERPHealthReport{
|
||||
Healthy: true,
|
||||
Severity: health.SeverityOK,
|
||||
},
|
||||
AccessURLReport: codersdk.AccessURLReport{
|
||||
AccessURLReport: healthsdk.AccessURLReport{
|
||||
Healthy: true,
|
||||
Severity: health.SeverityOK,
|
||||
},
|
||||
WebsocketReport: codersdk.WebsocketReport{
|
||||
WebsocketReport: healthsdk.WebsocketReport{
|
||||
Healthy: true,
|
||||
Severity: health.SeverityOK,
|
||||
},
|
||||
DatabaseReport: codersdk.DatabaseReport{
|
||||
DatabaseReport: healthsdk.DatabaseReport{
|
||||
Healthy: true,
|
||||
Severity: health.SeverityOK,
|
||||
},
|
||||
WorkspaceProxyReport: codersdk.WorkspaceProxyReport{
|
||||
WorkspaceProxyReport: healthsdk.WorkspaceProxyReport{
|
||||
Healthy: true,
|
||||
Warnings: []health.Message{{Message: "foobar", Code: "EFOOBAR"}},
|
||||
Severity: health.SeverityWarning,
|
||||
},
|
||||
ProvisionerDaemonsReport: codersdk.ProvisionerDaemonsReport{
|
||||
ProvisionerDaemonsReport: healthsdk.ProvisionerDaemonsReport{
|
||||
Severity: health.SeverityOK,
|
||||
},
|
||||
},
|
||||
severity: health.SeverityWarning,
|
||||
healthy: true,
|
||||
failingSections: []codersdk.HealthSection{},
|
||||
failingSections: []healthsdk.HealthSection{},
|
||||
}, {
|
||||
name: "ProvisionerDaemonsFail",
|
||||
checker: &testChecker{
|
||||
DERPReport: codersdk.DERPHealthReport{
|
||||
DERPReport: healthsdk.DERPHealthReport{
|
||||
Healthy: true,
|
||||
Severity: health.SeverityOK,
|
||||
},
|
||||
AccessURLReport: codersdk.AccessURLReport{
|
||||
AccessURLReport: healthsdk.AccessURLReport{
|
||||
Healthy: true,
|
||||
Severity: health.SeverityOK,
|
||||
},
|
||||
WebsocketReport: codersdk.WebsocketReport{
|
||||
WebsocketReport: healthsdk.WebsocketReport{
|
||||
Healthy: true,
|
||||
Severity: health.SeverityOK,
|
||||
},
|
||||
DatabaseReport: codersdk.DatabaseReport{
|
||||
DatabaseReport: healthsdk.DatabaseReport{
|
||||
Healthy: true,
|
||||
Severity: health.SeverityOK,
|
||||
},
|
||||
WorkspaceProxyReport: codersdk.WorkspaceProxyReport{
|
||||
WorkspaceProxyReport: healthsdk.WorkspaceProxyReport{
|
||||
Healthy: true,
|
||||
Severity: health.SeverityOK,
|
||||
},
|
||||
ProvisionerDaemonsReport: codersdk.ProvisionerDaemonsReport{
|
||||
ProvisionerDaemonsReport: healthsdk.ProvisionerDaemonsReport{
|
||||
Severity: health.SeverityError,
|
||||
},
|
||||
},
|
||||
severity: health.SeverityError,
|
||||
healthy: false,
|
||||
failingSections: []codersdk.HealthSection{codersdk.HealthSectionProvisionerDaemons},
|
||||
failingSections: []healthsdk.HealthSection{healthsdk.HealthSectionProvisionerDaemons},
|
||||
}, {
|
||||
name: "ProvisionerDaemonsWarn",
|
||||
checker: &testChecker{
|
||||
DERPReport: codersdk.DERPHealthReport{
|
||||
DERPReport: healthsdk.DERPHealthReport{
|
||||
Healthy: true,
|
||||
Severity: health.SeverityOK,
|
||||
},
|
||||
AccessURLReport: codersdk.AccessURLReport{
|
||||
AccessURLReport: healthsdk.AccessURLReport{
|
||||
Healthy: true,
|
||||
Severity: health.SeverityOK,
|
||||
},
|
||||
WebsocketReport: codersdk.WebsocketReport{
|
||||
WebsocketReport: healthsdk.WebsocketReport{
|
||||
Healthy: true,
|
||||
Severity: health.SeverityOK,
|
||||
},
|
||||
DatabaseReport: codersdk.DatabaseReport{
|
||||
DatabaseReport: healthsdk.DatabaseReport{
|
||||
Healthy: true,
|
||||
Severity: health.SeverityOK,
|
||||
},
|
||||
WorkspaceProxyReport: codersdk.WorkspaceProxyReport{
|
||||
WorkspaceProxyReport: healthsdk.WorkspaceProxyReport{
|
||||
Healthy: true,
|
||||
Severity: health.SeverityOK,
|
||||
},
|
||||
ProvisionerDaemonsReport: codersdk.ProvisionerDaemonsReport{
|
||||
ProvisionerDaemonsReport: healthsdk.ProvisionerDaemonsReport{
|
||||
Severity: health.SeverityWarning,
|
||||
Warnings: []health.Message{{Message: "foobar", Code: "EFOOBAR"}},
|
||||
},
|
||||
},
|
||||
severity: health.SeverityWarning,
|
||||
healthy: true,
|
||||
failingSections: []codersdk.HealthSection{},
|
||||
failingSections: []healthsdk.HealthSection{},
|
||||
}, {
|
||||
name: "AllFail",
|
||||
healthy: false,
|
||||
checker: &testChecker{
|
||||
DERPReport: codersdk.DERPHealthReport{
|
||||
DERPReport: healthsdk.DERPHealthReport{
|
||||
Healthy: false,
|
||||
Severity: health.SeverityError,
|
||||
},
|
||||
AccessURLReport: codersdk.AccessURLReport{
|
||||
AccessURLReport: healthsdk.AccessURLReport{
|
||||
Healthy: false,
|
||||
Severity: health.SeverityError,
|
||||
},
|
||||
WebsocketReport: codersdk.WebsocketReport{
|
||||
WebsocketReport: healthsdk.WebsocketReport{
|
||||
Healthy: false,
|
||||
Severity: health.SeverityError,
|
||||
},
|
||||
DatabaseReport: codersdk.DatabaseReport{
|
||||
DatabaseReport: healthsdk.DatabaseReport{
|
||||
Healthy: false,
|
||||
Severity: health.SeverityError,
|
||||
},
|
||||
WorkspaceProxyReport: codersdk.WorkspaceProxyReport{
|
||||
WorkspaceProxyReport: healthsdk.WorkspaceProxyReport{
|
||||
Healthy: false,
|
||||
Severity: health.SeverityError,
|
||||
},
|
||||
ProvisionerDaemonsReport: codersdk.ProvisionerDaemonsReport{
|
||||
ProvisionerDaemonsReport: healthsdk.ProvisionerDaemonsReport{
|
||||
Severity: health.SeverityError,
|
||||
},
|
||||
},
|
||||
severity: health.SeverityError,
|
||||
failingSections: []codersdk.HealthSection{
|
||||
codersdk.HealthSectionDERP,
|
||||
codersdk.HealthSectionAccessURL,
|
||||
codersdk.HealthSectionWebsocket,
|
||||
codersdk.HealthSectionDatabase,
|
||||
codersdk.HealthSectionWorkspaceProxy,
|
||||
codersdk.HealthSectionProvisionerDaemons,
|
||||
failingSections: []healthsdk.HealthSection{
|
||||
healthsdk.HealthSectionDERP,
|
||||
healthsdk.HealthSectionAccessURL,
|
||||
healthsdk.HealthSectionWebsocket,
|
||||
healthsdk.HealthSectionDatabase,
|
||||
healthsdk.HealthSectionWorkspaceProxy,
|
||||
healthsdk.HealthSectionProvisionerDaemons,
|
||||
},
|
||||
}} {
|
||||
c := c
|
||||
|
@ -16,11 +16,11 @@ import (
|
||||
"github.com/coder/coder/v2/coderd/healthcheck/health"
|
||||
"github.com/coder/coder/v2/coderd/provisionerdserver"
|
||||
"github.com/coder/coder/v2/coderd/util/ptr"
|
||||
"github.com/coder/coder/v2/codersdk"
|
||||
"github.com/coder/coder/v2/codersdk/healthsdk"
|
||||
"github.com/coder/coder/v2/provisionerd/proto"
|
||||
)
|
||||
|
||||
type ProvisionerDaemonsReport codersdk.ProvisionerDaemonsReport
|
||||
type ProvisionerDaemonsReport healthsdk.ProvisionerDaemonsReport
|
||||
|
||||
type ProvisionerDaemonsReportDeps struct {
|
||||
// Required
|
||||
@ -40,7 +40,7 @@ type ProvisionerDaemonsStore interface {
|
||||
}
|
||||
|
||||
func (r *ProvisionerDaemonsReport) Run(ctx context.Context, opts *ProvisionerDaemonsReportDeps) {
|
||||
r.Items = make([]codersdk.ProvisionerDaemonsReportItem, 0)
|
||||
r.Items = make([]healthsdk.ProvisionerDaemonsReportItem, 0)
|
||||
r.Severity = health.SeverityOK
|
||||
r.Warnings = make([]health.Message, 0)
|
||||
r.Dismissed = opts.Dismissed
|
||||
@ -95,7 +95,7 @@ func (r *ProvisionerDaemonsReport) Run(ctx context.Context, opts *ProvisionerDae
|
||||
continue
|
||||
}
|
||||
|
||||
it := codersdk.ProvisionerDaemonsReportItem{
|
||||
it := healthsdk.ProvisionerDaemonsReportItem{
|
||||
ProvisionerDaemon: db2sdk.ProvisionerDaemon(daemon),
|
||||
Warnings: make([]health.Message, 0),
|
||||
}
|
||||
|
@ -8,6 +8,7 @@ import (
|
||||
|
||||
"github.com/google/uuid"
|
||||
"github.com/stretchr/testify/assert"
|
||||
gomock "go.uber.org/mock/gomock"
|
||||
|
||||
"github.com/coder/coder/v2/coderd/database"
|
||||
"github.com/coder/coder/v2/coderd/database/dbmock"
|
||||
@ -15,9 +16,8 @@ import (
|
||||
"github.com/coder/coder/v2/coderd/healthcheck"
|
||||
"github.com/coder/coder/v2/coderd/healthcheck/health"
|
||||
"github.com/coder/coder/v2/codersdk"
|
||||
"github.com/coder/coder/v2/codersdk/healthsdk"
|
||||
"github.com/coder/coder/v2/provisionerd/proto"
|
||||
|
||||
gomock "go.uber.org/mock/gomock"
|
||||
)
|
||||
|
||||
func TestProvisionerDaemonReport(t *testing.T) {
|
||||
@ -34,21 +34,21 @@ func TestProvisionerDaemonReport(t *testing.T) {
|
||||
expectedSeverity health.Severity
|
||||
expectedWarningCode health.Code
|
||||
expectedError string
|
||||
expectedItems []codersdk.ProvisionerDaemonsReportItem
|
||||
expectedItems []healthsdk.ProvisionerDaemonsReportItem
|
||||
}{
|
||||
{
|
||||
name: "current version empty",
|
||||
currentVersion: "",
|
||||
expectedSeverity: health.SeverityError,
|
||||
expectedError: "Developer error: CurrentVersion is empty",
|
||||
expectedItems: []codersdk.ProvisionerDaemonsReportItem{},
|
||||
expectedItems: []healthsdk.ProvisionerDaemonsReportItem{},
|
||||
},
|
||||
{
|
||||
name: "no daemons",
|
||||
currentVersion: "v1.2.3",
|
||||
currentAPIMajorVersion: proto.CurrentMajor,
|
||||
expectedSeverity: health.SeverityError,
|
||||
expectedItems: []codersdk.ProvisionerDaemonsReportItem{},
|
||||
expectedItems: []healthsdk.ProvisionerDaemonsReportItem{},
|
||||
expectedWarningCode: health.CodeProvisionerDaemonsNoProvisionerDaemons,
|
||||
},
|
||||
{
|
||||
@ -58,7 +58,7 @@ func TestProvisionerDaemonReport(t *testing.T) {
|
||||
provisionerDaemonsErr: assert.AnError,
|
||||
expectedSeverity: health.SeverityError,
|
||||
expectedError: assert.AnError.Error(),
|
||||
expectedItems: []codersdk.ProvisionerDaemonsReportItem{},
|
||||
expectedItems: []healthsdk.ProvisionerDaemonsReportItem{},
|
||||
},
|
||||
{
|
||||
name: "one daemon up to date",
|
||||
@ -66,7 +66,7 @@ func TestProvisionerDaemonReport(t *testing.T) {
|
||||
currentAPIMajorVersion: proto.CurrentMajor,
|
||||
expectedSeverity: health.SeverityOK,
|
||||
provisionerDaemons: []database.ProvisionerDaemon{fakeProvisionerDaemon(t, "pd-ok", "v1.2.3", "1.0", now)},
|
||||
expectedItems: []codersdk.ProvisionerDaemonsReportItem{
|
||||
expectedItems: []healthsdk.ProvisionerDaemonsReportItem{
|
||||
{
|
||||
ProvisionerDaemon: codersdk.ProvisionerDaemon{
|
||||
ID: uuid.Nil,
|
||||
@ -89,7 +89,7 @@ func TestProvisionerDaemonReport(t *testing.T) {
|
||||
expectedSeverity: health.SeverityWarning,
|
||||
expectedWarningCode: health.CodeProvisionerDaemonVersionMismatch,
|
||||
provisionerDaemons: []database.ProvisionerDaemon{fakeProvisionerDaemon(t, "pd-old", "v1.1.2", "1.0", now)},
|
||||
expectedItems: []codersdk.ProvisionerDaemonsReportItem{
|
||||
expectedItems: []healthsdk.ProvisionerDaemonsReportItem{
|
||||
{
|
||||
ProvisionerDaemon: codersdk.ProvisionerDaemon{
|
||||
ID: uuid.Nil,
|
||||
@ -117,7 +117,7 @@ func TestProvisionerDaemonReport(t *testing.T) {
|
||||
expectedSeverity: health.SeverityError,
|
||||
expectedWarningCode: health.CodeUnknown,
|
||||
provisionerDaemons: []database.ProvisionerDaemon{fakeProvisionerDaemon(t, "pd-invalid-version", "invalid", "1.0", now)},
|
||||
expectedItems: []codersdk.ProvisionerDaemonsReportItem{
|
||||
expectedItems: []healthsdk.ProvisionerDaemonsReportItem{
|
||||
{
|
||||
ProvisionerDaemon: codersdk.ProvisionerDaemon{
|
||||
ID: uuid.Nil,
|
||||
@ -145,7 +145,7 @@ func TestProvisionerDaemonReport(t *testing.T) {
|
||||
expectedSeverity: health.SeverityError,
|
||||
expectedWarningCode: health.CodeUnknown,
|
||||
provisionerDaemons: []database.ProvisionerDaemon{fakeProvisionerDaemon(t, "pd-invalid-api", "v1.2.3", "invalid", now)},
|
||||
expectedItems: []codersdk.ProvisionerDaemonsReportItem{
|
||||
expectedItems: []healthsdk.ProvisionerDaemonsReportItem{
|
||||
{
|
||||
ProvisionerDaemon: codersdk.ProvisionerDaemon{
|
||||
ID: uuid.Nil,
|
||||
@ -173,7 +173,7 @@ func TestProvisionerDaemonReport(t *testing.T) {
|
||||
expectedSeverity: health.SeverityWarning,
|
||||
expectedWarningCode: health.CodeProvisionerDaemonAPIMajorVersionDeprecated,
|
||||
provisionerDaemons: []database.ProvisionerDaemon{fakeProvisionerDaemon(t, "pd-old-api", "v2.3.4", "1.0", now)},
|
||||
expectedItems: []codersdk.ProvisionerDaemonsReportItem{
|
||||
expectedItems: []healthsdk.ProvisionerDaemonsReportItem{
|
||||
{
|
||||
ProvisionerDaemon: codersdk.ProvisionerDaemon{
|
||||
ID: uuid.Nil,
|
||||
@ -201,7 +201,7 @@ func TestProvisionerDaemonReport(t *testing.T) {
|
||||
expectedSeverity: health.SeverityWarning,
|
||||
expectedWarningCode: health.CodeProvisionerDaemonVersionMismatch,
|
||||
provisionerDaemons: []database.ProvisionerDaemon{fakeProvisionerDaemon(t, "pd-ok", "v1.2.3", "1.0", now), fakeProvisionerDaemon(t, "pd-old", "v1.1.2", "1.0", now)},
|
||||
expectedItems: []codersdk.ProvisionerDaemonsReportItem{
|
||||
expectedItems: []healthsdk.ProvisionerDaemonsReportItem{
|
||||
{
|
||||
ProvisionerDaemon: codersdk.ProvisionerDaemon{
|
||||
ID: uuid.Nil,
|
||||
@ -242,7 +242,7 @@ func TestProvisionerDaemonReport(t *testing.T) {
|
||||
expectedSeverity: health.SeverityWarning,
|
||||
expectedWarningCode: health.CodeProvisionerDaemonVersionMismatch,
|
||||
provisionerDaemons: []database.ProvisionerDaemon{fakeProvisionerDaemon(t, "pd-ok", "v1.2.3", "1.0", now), fakeProvisionerDaemon(t, "pd-new", "v2.3.4", "1.0", now)},
|
||||
expectedItems: []codersdk.ProvisionerDaemonsReportItem{
|
||||
expectedItems: []healthsdk.ProvisionerDaemonsReportItem{
|
||||
{
|
||||
ProvisionerDaemon: codersdk.ProvisionerDaemon{
|
||||
ID: uuid.Nil,
|
||||
@ -282,7 +282,7 @@ func TestProvisionerDaemonReport(t *testing.T) {
|
||||
currentAPIMajorVersion: proto.CurrentMajor,
|
||||
expectedSeverity: health.SeverityOK,
|
||||
provisionerDaemons: []database.ProvisionerDaemon{fakeProvisionerDaemonStale(t, "pd-stale", "v1.2.3", "0.9", now.Add(-5*time.Minute), now), fakeProvisionerDaemon(t, "pd-ok", "v2.3.4", "1.0", now)},
|
||||
expectedItems: []codersdk.ProvisionerDaemonsReportItem{
|
||||
expectedItems: []healthsdk.ProvisionerDaemonsReportItem{
|
||||
{
|
||||
ProvisionerDaemon: codersdk.ProvisionerDaemon{
|
||||
ID: uuid.Nil,
|
||||
@ -305,7 +305,7 @@ func TestProvisionerDaemonReport(t *testing.T) {
|
||||
expectedSeverity: health.SeverityError,
|
||||
expectedWarningCode: health.CodeProvisionerDaemonsNoProvisionerDaemons,
|
||||
provisionerDaemons: []database.ProvisionerDaemon{fakeProvisionerDaemonStale(t, "pd-ok", "v1.2.3", "0.9", now.Add(-5*time.Minute), now)},
|
||||
expectedItems: []codersdk.ProvisionerDaemonsReportItem{},
|
||||
expectedItems: []healthsdk.ProvisionerDaemonsReportItem{},
|
||||
},
|
||||
} {
|
||||
tt := tt
|
||||
|
@ -13,10 +13,10 @@ import (
|
||||
"nhooyr.io/websocket"
|
||||
|
||||
"github.com/coder/coder/v2/coderd/healthcheck/health"
|
||||
"github.com/coder/coder/v2/codersdk"
|
||||
"github.com/coder/coder/v2/codersdk/healthsdk"
|
||||
)
|
||||
|
||||
type WebsocketReport codersdk.WebsocketReport
|
||||
type WebsocketReport healthsdk.WebsocketReport
|
||||
|
||||
type WebsocketReportOptions struct {
|
||||
APIKey string
|
||||
|
@ -9,9 +9,10 @@ import (
|
||||
"github.com/coder/coder/v2/coderd/healthcheck/health"
|
||||
"github.com/coder/coder/v2/coderd/util/ptr"
|
||||
"github.com/coder/coder/v2/codersdk"
|
||||
"github.com/coder/coder/v2/codersdk/healthsdk"
|
||||
)
|
||||
|
||||
type WorkspaceProxyReport codersdk.WorkspaceProxyReport
|
||||
type WorkspaceProxyReport healthsdk.WorkspaceProxyReport
|
||||
|
||||
type WorkspaceProxyReportOptions struct {
|
||||
WorkspaceProxiesFetchUpdater WorkspaceProxiesFetchUpdater
|
||||
|
@ -32,6 +32,7 @@ import (
|
||||
"github.com/coder/coder/v2/coderd/workspaceapps"
|
||||
"github.com/coder/coder/v2/codersdk"
|
||||
"github.com/coder/coder/v2/codersdk/agentsdk"
|
||||
"github.com/coder/coder/v2/codersdk/workspacesdk"
|
||||
"github.com/coder/coder/v2/provisioner/echo"
|
||||
"github.com/coder/coder/v2/provisionersdk/proto"
|
||||
"github.com/coder/coder/v2/testutil"
|
||||
@ -86,9 +87,10 @@ func TestDeploymentInsights(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
assert.NotZero(t, res.Workspaces[0].LastUsedAt)
|
||||
|
||||
conn, err := client.DialWorkspaceAgent(ctx, resources[0].Agents[0].ID, &codersdk.DialWorkspaceAgentOptions{
|
||||
Logger: slogtest.Make(t, nil).Named("tailnet"),
|
||||
})
|
||||
conn, err := workspacesdk.New(client).
|
||||
DialAgent(ctx, resources[0].Agents[0].ID, &workspacesdk.DialAgentOptions{
|
||||
Logger: slogtest.Make(t, nil).Named("tailnet"),
|
||||
})
|
||||
require.NoError(t, err)
|
||||
defer func() {
|
||||
_ = conn.Close()
|
||||
@ -174,9 +176,10 @@ func TestUserActivityInsights_SanityCheck(t *testing.T) {
|
||||
defer cancel()
|
||||
|
||||
// Connect to the agent to generate usage/latency stats.
|
||||
conn, err := client.DialWorkspaceAgent(ctx, resources[0].Agents[0].ID, &codersdk.DialWorkspaceAgentOptions{
|
||||
Logger: logger.Named("client"),
|
||||
})
|
||||
conn, err := workspacesdk.New(client).
|
||||
DialAgent(ctx, resources[0].Agents[0].ID, &workspacesdk.DialAgentOptions{
|
||||
Logger: logger.Named("client"),
|
||||
})
|
||||
require.NoError(t, err)
|
||||
defer conn.Close()
|
||||
|
||||
@ -271,9 +274,10 @@ func TestUserLatencyInsights(t *testing.T) {
|
||||
defer cancel()
|
||||
|
||||
// Connect to the agent to generate usage/latency stats.
|
||||
conn, err := client.DialWorkspaceAgent(ctx, resources[0].Agents[0].ID, &codersdk.DialWorkspaceAgentOptions{
|
||||
Logger: logger.Named("client"),
|
||||
})
|
||||
conn, err := workspacesdk.New(client).
|
||||
DialAgent(ctx, resources[0].Agents[0].ID, &workspacesdk.DialAgentOptions{
|
||||
Logger: logger.Named("client"),
|
||||
})
|
||||
require.NoError(t, err)
|
||||
defer conn.Close()
|
||||
|
||||
|
@ -23,7 +23,7 @@ import (
|
||||
"cdr.dev/slog"
|
||||
"github.com/coder/coder/v2/coderd/tracing"
|
||||
"github.com/coder/coder/v2/coderd/workspaceapps"
|
||||
"github.com/coder/coder/v2/codersdk"
|
||||
"github.com/coder/coder/v2/codersdk/workspacesdk"
|
||||
"github.com/coder/coder/v2/site"
|
||||
"github.com/coder/coder/v2/tailnet"
|
||||
"github.com/coder/retry"
|
||||
@ -427,9 +427,9 @@ func (s *ServerTailnet) acquireTicket(agentID uuid.UUID) (release func()) {
|
||||
}
|
||||
}
|
||||
|
||||
func (s *ServerTailnet) AgentConn(ctx context.Context, agentID uuid.UUID) (*codersdk.WorkspaceAgentConn, func(), error) {
|
||||
func (s *ServerTailnet) AgentConn(ctx context.Context, agentID uuid.UUID) (*workspacesdk.AgentConn, func(), error) {
|
||||
var (
|
||||
conn *codersdk.WorkspaceAgentConn
|
||||
conn *workspacesdk.AgentConn
|
||||
ret func()
|
||||
)
|
||||
|
||||
@ -440,9 +440,9 @@ func (s *ServerTailnet) AgentConn(ctx context.Context, agentID uuid.UUID) (*code
|
||||
}
|
||||
ret = s.acquireTicket(agentID)
|
||||
|
||||
conn = codersdk.NewWorkspaceAgentConn(s.conn, codersdk.WorkspaceAgentConnOptions{
|
||||
conn = workspacesdk.NewAgentConn(s.conn, workspacesdk.AgentConnOptions{
|
||||
AgentID: agentID,
|
||||
CloseFunc: func() error { return codersdk.ErrSkipClose },
|
||||
CloseFunc: func() error { return workspacesdk.ErrSkipClose },
|
||||
})
|
||||
|
||||
// Since we now have an open conn, be careful to close it if we error
|
||||
|
@ -26,8 +26,8 @@ import (
|
||||
"github.com/coder/coder/v2/agent/agenttest"
|
||||
"github.com/coder/coder/v2/agent/proto"
|
||||
"github.com/coder/coder/v2/coderd"
|
||||
"github.com/coder/coder/v2/codersdk"
|
||||
"github.com/coder/coder/v2/codersdk/agentsdk"
|
||||
"github.com/coder/coder/v2/codersdk/workspacesdk"
|
||||
"github.com/coder/coder/v2/tailnet"
|
||||
"github.com/coder/coder/v2/tailnet/tailnettest"
|
||||
"github.com/coder/coder/v2/testutil"
|
||||
@ -80,7 +80,7 @@ func TestServerTailnet_ReverseProxy(t *testing.T) {
|
||||
agents, serverTailnet := setupServerTailnetAgent(t, 1)
|
||||
a := agents[0]
|
||||
|
||||
u, err := url.Parse(fmt.Sprintf("http://127.0.0.1:%d", codersdk.WorkspaceAgentHTTPAPIServerPort))
|
||||
u, err := url.Parse(fmt.Sprintf("http://127.0.0.1:%d", workspacesdk.AgentHTTPAPIServerPort))
|
||||
require.NoError(t, err)
|
||||
|
||||
rp := serverTailnet.ReverseProxy(u, u, a.id)
|
||||
@ -111,7 +111,7 @@ func TestServerTailnet_ReverseProxy(t *testing.T) {
|
||||
registry := prometheus.NewRegistry()
|
||||
require.NoError(t, registry.Register(serverTailnet))
|
||||
|
||||
u, err := url.Parse(fmt.Sprintf("http://127.0.0.1:%d", codersdk.WorkspaceAgentHTTPAPIServerPort))
|
||||
u, err := url.Parse(fmt.Sprintf("http://127.0.0.1:%d", workspacesdk.AgentHTTPAPIServerPort))
|
||||
require.NoError(t, err)
|
||||
|
||||
rp := serverTailnet.ReverseProxy(u, u, a.id)
|
||||
@ -145,7 +145,7 @@ func TestServerTailnet_ReverseProxy(t *testing.T) {
|
||||
agents, serverTailnet := setupServerTailnetAgent(t, 1)
|
||||
a := agents[0]
|
||||
|
||||
u, err := url.Parse(fmt.Sprintf("http://127.0.0.1:%d", codersdk.WorkspaceAgentHTTPAPIServerPort))
|
||||
u, err := url.Parse(fmt.Sprintf("http://127.0.0.1:%d", workspacesdk.AgentHTTPAPIServerPort))
|
||||
require.NoError(t, err)
|
||||
|
||||
rp := serverTailnet.ReverseProxy(u, u, a.id)
|
||||
@ -156,7 +156,7 @@ func TestServerTailnet_ReverseProxy(t *testing.T) {
|
||||
// Ensure the reverse proxy director rewrites the url host to the agent's IP.
|
||||
rp.Director(req)
|
||||
assert.Equal(t,
|
||||
fmt.Sprintf("[%s]:%d", tailnet.IPFromUUID(a.id).String(), codersdk.WorkspaceAgentHTTPAPIServerPort),
|
||||
fmt.Sprintf("[%s]:%d", tailnet.IPFromUUID(a.id).String(), workspacesdk.AgentHTTPAPIServerPort),
|
||||
req.URL.Host,
|
||||
)
|
||||
})
|
||||
@ -315,7 +315,7 @@ func TestServerTailnet_ReverseProxy(t *testing.T) {
|
||||
|
||||
require.True(t, serverTailnet.Conn().GetBlockEndpoints(), "expected BlockEndpoints to be set")
|
||||
|
||||
u, err := url.Parse(fmt.Sprintf("http://127.0.0.1:%d", codersdk.WorkspaceAgentHTTPAPIServerPort))
|
||||
u, err := url.Parse(fmt.Sprintf("http://127.0.0.1:%d", workspacesdk.AgentHTTPAPIServerPort))
|
||||
require.NoError(t, err)
|
||||
|
||||
rp := serverTailnet.ReverseProxy(u, u, a.id)
|
||||
|
@ -22,6 +22,7 @@ import (
|
||||
"github.com/coder/coder/v2/coderd/schedule"
|
||||
"github.com/coder/coder/v2/coderd/util/ptr"
|
||||
"github.com/coder/coder/v2/codersdk"
|
||||
"github.com/coder/coder/v2/codersdk/workspacesdk"
|
||||
"github.com/coder/coder/v2/provisioner/echo"
|
||||
"github.com/coder/coder/v2/testutil"
|
||||
)
|
||||
@ -1235,9 +1236,10 @@ func TestTemplateMetrics(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
assert.Zero(t, res.Workspaces[0].LastUsedAt)
|
||||
|
||||
conn, err := client.DialWorkspaceAgent(ctx, resources[0].Agents[0].ID, &codersdk.DialWorkspaceAgentOptions{
|
||||
Logger: slogtest.Make(t, nil).Named("tailnet"),
|
||||
})
|
||||
conn, err := workspacesdk.New(client).
|
||||
DialAgent(ctx, resources[0].Agents[0].ID, &workspacesdk.DialAgentOptions{
|
||||
Logger: slogtest.Make(t, nil).Named("tailnet"),
|
||||
})
|
||||
require.NoError(t, err)
|
||||
defer func() {
|
||||
_ = conn.Close()
|
||||
|
@ -39,6 +39,7 @@ import (
|
||||
"github.com/coder/coder/v2/coderd/rbac"
|
||||
"github.com/coder/coder/v2/codersdk"
|
||||
"github.com/coder/coder/v2/codersdk/agentsdk"
|
||||
"github.com/coder/coder/v2/codersdk/workspacesdk"
|
||||
"github.com/coder/coder/v2/tailnet"
|
||||
"github.com/coder/coder/v2/tailnet/proto"
|
||||
)
|
||||
@ -803,13 +804,13 @@ func (api *API) workspaceAgentListeningPorts(rw http.ResponseWriter, r *http.Req
|
||||
// common non-HTTP ports such as databases, FTP, SSH, etc.
|
||||
filteredPorts := make([]codersdk.WorkspaceAgentListeningPort, 0, len(portsResponse.Ports))
|
||||
for _, port := range portsResponse.Ports {
|
||||
if port.Port < codersdk.WorkspaceAgentMinimumListeningPort {
|
||||
if port.Port < workspacesdk.AgentMinimumListeningPort {
|
||||
continue
|
||||
}
|
||||
if _, ok := appPorts[port.Port]; ok {
|
||||
continue
|
||||
}
|
||||
if _, ok := codersdk.WorkspaceAgentIgnoredListeningPorts[port.Port]; ok {
|
||||
if _, ok := workspacesdk.AgentIgnoredListeningPorts[port.Port]; ok {
|
||||
continue
|
||||
}
|
||||
filteredPorts = append(filteredPorts, port)
|
||||
@ -825,12 +826,12 @@ func (api *API) workspaceAgentListeningPorts(rw http.ResponseWriter, r *http.Req
|
||||
// @Produce json
|
||||
// @Tags Agents
|
||||
// @Param workspaceagent path string true "Workspace agent ID" format(uuid)
|
||||
// @Success 200 {object} codersdk.WorkspaceAgentConnectionInfo
|
||||
// @Success 200 {object} workspacesdk.AgentConnectionInfo
|
||||
// @Router /workspaceagents/{workspaceagent}/connection [get]
|
||||
func (api *API) workspaceAgentConnection(rw http.ResponseWriter, r *http.Request) {
|
||||
ctx := r.Context()
|
||||
|
||||
httpapi.Write(ctx, rw, http.StatusOK, codersdk.WorkspaceAgentConnectionInfo{
|
||||
httpapi.Write(ctx, rw, http.StatusOK, workspacesdk.AgentConnectionInfo{
|
||||
DERPMap: api.DERPMap(),
|
||||
DERPForceWebSockets: api.DeploymentValues.DERP.Config.ForceWebSockets.Value(),
|
||||
DisableDirectConnections: api.DeploymentValues.DERP.Config.BlockDirect.Value(),
|
||||
@ -845,13 +846,13 @@ func (api *API) workspaceAgentConnection(rw http.ResponseWriter, r *http.Request
|
||||
// @Security CoderSessionToken
|
||||
// @Produce json
|
||||
// @Tags Agents
|
||||
// @Success 200 {object} codersdk.WorkspaceAgentConnectionInfo
|
||||
// @Success 200 {object} workspacesdk.AgentConnectionInfo
|
||||
// @Router /workspaceagents/connection [get]
|
||||
// @x-apidocgen {"skip": true}
|
||||
func (api *API) workspaceAgentConnectionGeneric(rw http.ResponseWriter, r *http.Request) {
|
||||
ctx := r.Context()
|
||||
|
||||
httpapi.Write(ctx, rw, http.StatusOK, codersdk.WorkspaceAgentConnectionInfo{
|
||||
httpapi.Write(ctx, rw, http.StatusOK, workspacesdk.AgentConnectionInfo{
|
||||
DERPMap: api.DERPMap(),
|
||||
DERPForceWebSockets: api.DeploymentValues.DERP.Config.ForceWebSockets.Value(),
|
||||
DisableDirectConnections: api.DeploymentValues.DERP.Config.BlockDirect.Value(),
|
||||
|
@ -37,6 +37,7 @@ import (
|
||||
"github.com/coder/coder/v2/coderd/rbac"
|
||||
"github.com/coder/coder/v2/codersdk"
|
||||
"github.com/coder/coder/v2/codersdk/agentsdk"
|
||||
"github.com/coder/coder/v2/codersdk/workspacesdk"
|
||||
"github.com/coder/coder/v2/provisioner/echo"
|
||||
"github.com/coder/coder/v2/provisionersdk/proto"
|
||||
"github.com/coder/coder/v2/tailnet/tailnettest"
|
||||
@ -337,7 +338,8 @@ func TestWorkspaceAgentConnectRPC(t *testing.T) {
|
||||
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
|
||||
defer cancel()
|
||||
|
||||
conn, err := client.DialWorkspaceAgent(ctx, resources[0].Agents[0].ID, nil)
|
||||
conn, err := workspacesdk.New(client).
|
||||
DialAgent(ctx, resources[0].Agents[0].ID, nil)
|
||||
require.NoError(t, err)
|
||||
defer func() {
|
||||
_ = conn.Close()
|
||||
@ -448,13 +450,14 @@ func TestWorkspaceAgentTailnet(t *testing.T) {
|
||||
_ = agenttest.New(t, client.URL, r.AgentToken)
|
||||
resources := coderdtest.AwaitWorkspaceAgents(t, client, r.Workspace.ID)
|
||||
|
||||
conn, err := func() (*codersdk.WorkspaceAgentConn, error) {
|
||||
conn, err := func() (*workspacesdk.AgentConn, error) {
|
||||
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
|
||||
defer cancel() // Connection should remain open even if the dial context is canceled.
|
||||
|
||||
return client.DialWorkspaceAgent(ctx, resources[0].Agents[0].ID, &codersdk.DialWorkspaceAgentOptions{
|
||||
Logger: slogtest.Make(t, nil).Named("client").Leveled(slog.LevelDebug),
|
||||
})
|
||||
return workspacesdk.New(client).
|
||||
DialAgent(ctx, resources[0].Agents[0].ID, &workspacesdk.DialAgentOptions{
|
||||
Logger: slogtest.Make(t, nil).Named("client").Leveled(slog.LevelDebug),
|
||||
})
|
||||
}()
|
||||
require.NoError(t, err)
|
||||
defer conn.Close()
|
||||
@ -547,7 +550,7 @@ func TestWorkspaceAgentTailnetDirectDisabled(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
defer res.Body.Close()
|
||||
require.Equal(t, http.StatusOK, res.StatusCode)
|
||||
var connInfo codersdk.WorkspaceAgentConnectionInfo
|
||||
var connInfo workspacesdk.AgentConnectionInfo
|
||||
err = json.NewDecoder(res.Body).Decode(&connInfo)
|
||||
require.NoError(t, err)
|
||||
require.True(t, connInfo.DisableDirectConnections)
|
||||
@ -563,9 +566,10 @@ func TestWorkspaceAgentTailnetDirectDisabled(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
conn, err := client.DialWorkspaceAgent(ctx, resources[0].Agents[0].ID, &codersdk.DialWorkspaceAgentOptions{
|
||||
Logger: slogtest.Make(t, nil).Named("client").Leveled(slog.LevelDebug),
|
||||
})
|
||||
conn, err := workspacesdk.New(client).
|
||||
DialAgent(ctx, resources[0].Agents[0].ID, &workspacesdk.DialAgentOptions{
|
||||
Logger: slogtest.Make(t, nil).Named("client").Leveled(slog.LevelDebug),
|
||||
})
|
||||
require.NoError(t, err)
|
||||
defer conn.Close()
|
||||
|
||||
@ -603,10 +607,10 @@ func TestWorkspaceAgentListeningPorts(t *testing.T) {
|
||||
}
|
||||
|
||||
willFilterPort := func(port int) bool {
|
||||
if port < codersdk.WorkspaceAgentMinimumListeningPort || port > 65535 {
|
||||
if port < workspacesdk.AgentMinimumListeningPort || port > 65535 {
|
||||
return true
|
||||
}
|
||||
if _, ok := codersdk.WorkspaceAgentIgnoredListeningPorts[uint16(port)]; ok {
|
||||
if _, ok := workspacesdk.AgentIgnoredListeningPorts[uint16(port)]; ok {
|
||||
return true
|
||||
}
|
||||
|
||||
@ -646,7 +650,7 @@ func TestWorkspaceAgentListeningPorts(t *testing.T) {
|
||||
port uint16
|
||||
)
|
||||
require.Eventually(t, func() bool {
|
||||
for ignoredPort := range codersdk.WorkspaceAgentIgnoredListeningPorts {
|
||||
for ignoredPort := range workspacesdk.AgentIgnoredListeningPorts {
|
||||
if ignoredPort < 1024 || ignoredPort == 5432 {
|
||||
continue
|
||||
}
|
||||
@ -1623,13 +1627,14 @@ func TestWorkspaceAgent_UpdatedDERP(t *testing.T) {
|
||||
agentID := resources[0].Agents[0].ID
|
||||
|
||||
// Connect from a client.
|
||||
conn1, err := func() (*codersdk.WorkspaceAgentConn, error) {
|
||||
conn1, err := func() (*workspacesdk.AgentConn, error) {
|
||||
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
|
||||
defer cancel() // Connection should remain open even if the dial context is canceled.
|
||||
|
||||
return client.DialWorkspaceAgent(ctx, agentID, &codersdk.DialWorkspaceAgentOptions{
|
||||
Logger: logger.Named("client1"),
|
||||
})
|
||||
return workspacesdk.New(client).
|
||||
DialAgent(ctx, agentID, &workspacesdk.DialAgentOptions{
|
||||
Logger: logger.Named("client1"),
|
||||
})
|
||||
}()
|
||||
require.NoError(t, err)
|
||||
defer conn1.Close()
|
||||
@ -1672,9 +1677,10 @@ func TestWorkspaceAgent_UpdatedDERP(t *testing.T) {
|
||||
require.True(t, ok)
|
||||
|
||||
// Connect from a second client.
|
||||
conn2, err := client.DialWorkspaceAgent(ctx, agentID, &codersdk.DialWorkspaceAgentOptions{
|
||||
Logger: logger.Named("client2"),
|
||||
})
|
||||
conn2, err := workspacesdk.New(client).
|
||||
DialAgent(ctx, agentID, &workspacesdk.DialAgentOptions{
|
||||
Logger: logger.Named("client2"),
|
||||
})
|
||||
require.NoError(t, err)
|
||||
defer conn2.Close()
|
||||
ok = conn2.AwaitReachable(ctx)
|
||||
|
@ -30,6 +30,7 @@ import (
|
||||
"github.com/coder/coder/v2/coderd/rbac"
|
||||
"github.com/coder/coder/v2/coderd/workspaceapps"
|
||||
"github.com/coder/coder/v2/codersdk"
|
||||
"github.com/coder/coder/v2/codersdk/workspacesdk"
|
||||
"github.com/coder/coder/v2/testutil"
|
||||
)
|
||||
|
||||
@ -950,7 +951,7 @@ func Run(t *testing.T, appHostIsPrimary bool, factory DeploymentFactory) {
|
||||
defer cancel()
|
||||
|
||||
app := appDetails.Apps.Port
|
||||
app.AppSlugOrPort = strconv.Itoa(codersdk.WorkspaceAgentMinimumListeningPort - 1)
|
||||
app.AppSlugOrPort = strconv.Itoa(workspacesdk.AgentMinimumListeningPort - 1)
|
||||
resp, err := requestWithRetries(ctx, t, appDetails.AppClient(t), http.MethodGet, appDetails.SubdomainAppURL(app).String(), nil)
|
||||
require.NoError(t, err)
|
||||
defer resp.Body.Close()
|
||||
@ -1695,7 +1696,7 @@ func (r *fakeStatsReporter) Report(_ context.Context, stats []workspaceapps.Stat
|
||||
}
|
||||
|
||||
func testReconnectingPTY(ctx context.Context, t *testing.T, client *codersdk.Client, agentID uuid.UUID, signedToken string) {
|
||||
opts := codersdk.WorkspaceAgentReconnectingPTYOpts{
|
||||
opts := workspacesdk.WorkspaceAgentReconnectingPTYOpts{
|
||||
AgentID: agentID,
|
||||
Reconnect: uuid.New(),
|
||||
Width: 80,
|
||||
@ -1720,7 +1721,7 @@ func testReconnectingPTY(ctx context.Context, t *testing.T, client *codersdk.Cli
|
||||
return strings.Contains(line, "exit") || strings.Contains(line, "logout")
|
||||
}
|
||||
|
||||
conn, err := client.WorkspaceAgentReconnectingPTY(ctx, opts)
|
||||
conn, err := workspacesdk.New(client).AgentReconnectingPTY(ctx, opts)
|
||||
require.NoError(t, err)
|
||||
defer conn.Close()
|
||||
|
||||
@ -1729,7 +1730,7 @@ func testReconnectingPTY(ctx context.Context, t *testing.T, client *codersdk.Cli
|
||||
// will sometimes put the command output on the same line as the command and the test will flake
|
||||
require.NoError(t, tr.ReadUntil(ctx, matchPrompt), "find prompt")
|
||||
|
||||
data, err := json.Marshal(codersdk.ReconnectingPTYRequest{
|
||||
data, err := json.Marshal(workspacesdk.ReconnectingPTYRequest{
|
||||
Data: "echo test\r",
|
||||
})
|
||||
require.NoError(t, err)
|
||||
@ -1740,7 +1741,7 @@ func testReconnectingPTY(ctx context.Context, t *testing.T, client *codersdk.Cli
|
||||
require.NoError(t, tr.ReadUntil(ctx, matchEchoOutput), "find echo output")
|
||||
|
||||
// Exit should cause the connection to close.
|
||||
data, err = json.Marshal(codersdk.ReconnectingPTYRequest{
|
||||
data, err = json.Marshal(workspacesdk.ReconnectingPTYRequest{
|
||||
Data: "exit\r",
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
@ -26,6 +26,7 @@ import (
|
||||
"github.com/coder/coder/v2/coderd/util/slice"
|
||||
"github.com/coder/coder/v2/coderd/workspaceapps/appurl"
|
||||
"github.com/coder/coder/v2/codersdk"
|
||||
"github.com/coder/coder/v2/codersdk/workspacesdk"
|
||||
"github.com/coder/coder/v2/site"
|
||||
)
|
||||
|
||||
@ -68,7 +69,7 @@ type AgentProvider interface {
|
||||
ReverseProxy(targetURL, dashboardURL *url.URL, agentID uuid.UUID) *httputil.ReverseProxy
|
||||
|
||||
// AgentConn returns a new connection to the specified agent.
|
||||
AgentConn(ctx context.Context, agentID uuid.UUID) (_ *codersdk.WorkspaceAgentConn, release func(), _ error)
|
||||
AgentConn(ctx context.Context, agentID uuid.UUID) (_ *workspacesdk.AgentConn, release func(), _ error)
|
||||
|
||||
ServeHTTPDebug(w http.ResponseWriter, r *http.Request)
|
||||
|
||||
@ -513,9 +514,11 @@ func (s *Server) proxyWorkspaceApp(rw http.ResponseWriter, r *http.Request, appT
|
||||
return
|
||||
}
|
||||
|
||||
if portInt < codersdk.WorkspaceAgentMinimumListeningPort {
|
||||
if portInt < workspacesdk.AgentMinimumListeningPort {
|
||||
httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{
|
||||
Message: fmt.Sprintf("Application port %d is not permitted. Coder reserves ports less than %d for internal use.", portInt, codersdk.WorkspaceAgentMinimumListeningPort),
|
||||
Message: fmt.Sprintf("Application port %d is not permitted. Coder reserves ports less than %d for internal use.",
|
||||
portInt, workspacesdk.AgentMinimumListeningPort,
|
||||
),
|
||||
})
|
||||
return
|
||||
}
|
||||
|
Reference in New Issue
Block a user