Skip to content

Commit 84b0060

Browse files
committed
feat(coderd/healthcheck): add health check for proxy
1 parent b63ce10 commit 84b0060

File tree

2 files changed

+78
-12
lines changed

2 files changed

+78
-12
lines changed

coderd/healthcheck/workspaceproxy.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package healthcheck
22

33
import (
44
"context"
5+
"fmt"
56

67
"cdr.dev/slog"
78
"github.com/coder/coder/v2/buildinfo"
@@ -43,7 +44,7 @@ func (r *WorkspaceProxyReport) Run(ctx context.Context, opts *WorkspaceProxyRepo
4344
opts.Logger.Error(ctx, "developer error: opts.UpdateProxyHealth must not be nil if opts.FetchWorkspaceProxies is not nil")
4445
}
4546

46-
if err := opts.UpdateProxyHealth; err != nil {
47+
if err := opts.UpdateProxyHealth(ctx); err != nil {
4748
opts.Logger.Error(ctx, "failed to update proxy health: %w", err)
4849
}
4950

@@ -70,7 +71,8 @@ func (r *WorkspaceProxyReport) Run(ctx context.Context, opts *WorkspaceProxyRepo
7071
slog.F("proxy_version", proxy.Version),
7172
slog.F("proxy_name", proxy.Name),
7273
)
73-
r.Warnings = append(r.Warnings, "Proxy %q version %q does not match primary server version %q", proxy.Name, proxy.Version, opts.CurrentVersion)
74+
r.Healthy = false
75+
r.Warnings = append(r.Warnings, fmt.Sprintf("Proxy %q version %q does not match primary server version %q", proxy.Name, proxy.Version, opts.CurrentVersion))
7476
}
7577
}
7678
}

coderd/healthcheck/workspaceproxy_test.go

Lines changed: 74 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,29 @@ func TestWorkspaceProxies(t *testing.T) {
3131
require.Empty(t, rpt.WorkspaceProxies, "expected no proxies")
3232
})
3333

34-
t.Run("VersionMajorMinor", func(t *testing.T) {
34+
t.Run("Enabled/None", func(t *testing.T) {
35+
t.Parallel()
36+
37+
ctx := testutil.Context(t, testutil.WaitShort)
38+
log := slogtest.Make(t, nil)
39+
rpt := healthcheck.WorkspaceProxyReport{}
40+
rpt.Run(ctx, &healthcheck.WorkspaceProxyReportOptions{
41+
CurrentVersion: "v2.34.5",
42+
FetchWorkspaceProxies: func(_ context.Context) (codersdk.RegionsResponse[codersdk.WorkspaceProxy], error) {
43+
return codersdk.RegionsResponse[codersdk.WorkspaceProxy]{
44+
Regions: []codersdk.WorkspaceProxy{},
45+
}, nil
46+
},
47+
UpdateProxyHealth: func(context.Context) error { return nil },
48+
Logger: log,
49+
})
50+
51+
require.True(t, rpt.Healthy, "expected report to be healthy")
52+
require.Empty(t, rpt.Warnings, "expected no warnings")
53+
require.NotEmpty(t, rpt.WorkspaceProxies, "expected at least one proxy")
54+
})
55+
56+
t.Run("Enabled/Match", func(t *testing.T) {
3557
t.Parallel()
3658

3759
ctx := testutil.Context(t, testutil.WaitShort)
@@ -42,12 +64,8 @@ func TestWorkspaceProxies(t *testing.T) {
4264
FetchWorkspaceProxies: func(_ context.Context) (codersdk.RegionsResponse[codersdk.WorkspaceProxy], error) {
4365
return codersdk.RegionsResponse[codersdk.WorkspaceProxy]{
4466
Regions: []codersdk.WorkspaceProxy{
45-
{
46-
Region: codersdk.Region{
47-
Healthy: true,
48-
},
49-
Version: "v2.34.4",
50-
},
67+
fakeWorkspaceProxy(true, "v2.34.5"),
68+
fakeWorkspaceProxy(true, "v2.34.5"),
5169
},
5270
}, nil
5371
},
@@ -60,19 +78,65 @@ func TestWorkspaceProxies(t *testing.T) {
6078
require.NotEmpty(t, rpt.WorkspaceProxies, "expected at least one proxy")
6179
})
6280

63-
t.Run("VersionMismatch", func(t *testing.T) {
81+
t.Run("Enabled/Mismatch/One", func(t *testing.T) {
6482
t.Parallel()
6583

6684
ctx := testutil.Context(t, testutil.WaitShort)
6785
log := slogtest.Make(t, nil)
6886
rpt := healthcheck.WorkspaceProxyReport{}
6987
rpt.Run(ctx, &healthcheck.WorkspaceProxyReportOptions{
70-
Logger: log,
88+
CurrentVersion: "v2.35.0",
89+
FetchWorkspaceProxies: func(_ context.Context) (codersdk.RegionsResponse[codersdk.WorkspaceProxy], error) {
90+
return codersdk.RegionsResponse[codersdk.WorkspaceProxy]{
91+
Regions: []codersdk.WorkspaceProxy{
92+
fakeWorkspaceProxy(true, "v2.35.0"),
93+
fakeWorkspaceProxy(true, "v2.34.5"),
94+
},
95+
}, nil
96+
},
97+
Logger: log,
98+
UpdateProxyHealth: func(context.Context) error { return nil },
7199
})
72100

73101
require.False(t, rpt.Healthy, "expected report not to be healthy")
74102
require.Len(t, rpt.Warnings, 1)
75-
require.Contains(t, rpt.Warnings[0], "does not match server version")
103+
require.Contains(t, rpt.Warnings[0], "does not match primary server version")
76104
require.NotEmpty(t, rpt.WorkspaceProxies)
77105
})
106+
107+
t.Run("Enabled/Mismatch/Multiple", func(t *testing.T) {
108+
t.Parallel()
109+
110+
ctx := testutil.Context(t, testutil.WaitShort)
111+
log := slogtest.Make(t, nil)
112+
rpt := healthcheck.WorkspaceProxyReport{}
113+
rpt.Run(ctx, &healthcheck.WorkspaceProxyReportOptions{
114+
CurrentVersion: "v2.35.0",
115+
FetchWorkspaceProxies: func(_ context.Context) (codersdk.RegionsResponse[codersdk.WorkspaceProxy], error) {
116+
return codersdk.RegionsResponse[codersdk.WorkspaceProxy]{
117+
Regions: []codersdk.WorkspaceProxy{
118+
fakeWorkspaceProxy(true, "v2.34.5"),
119+
fakeWorkspaceProxy(true, "v2.34.5"),
120+
},
121+
}, nil
122+
},
123+
Logger: log,
124+
UpdateProxyHealth: func(context.Context) error { return nil },
125+
})
126+
127+
require.False(t, rpt.Healthy, "expected report not to be healthy")
128+
require.Len(t, rpt.Warnings, 2)
129+
require.Contains(t, rpt.Warnings[0], "does not match primary server version")
130+
require.Contains(t, rpt.Warnings[1], "does not match primary server version")
131+
require.NotEmpty(t, rpt.WorkspaceProxies)
132+
})
133+
}
134+
135+
func fakeWorkspaceProxy(healthy bool, version string) codersdk.WorkspaceProxy {
136+
return codersdk.WorkspaceProxy{
137+
Region: codersdk.Region{
138+
Healthy: healthy,
139+
},
140+
Version: version,
141+
}
78142
}

0 commit comments

Comments
 (0)