Skip to content

Commit 33b6fb5

Browse files
committed
fixup! feat(coderd/healthcheck/derphealth): add some STUN-specific checks
1 parent c4c1a89 commit 33b6fb5

File tree

2 files changed

+79
-17
lines changed

2 files changed

+79
-17
lines changed

coderd/healthcheck/derphealth/derp.go

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,20 @@ func (r *Report) Run(ctx context.Context, opts *ReportOptions) {
115115

116116
wg.Wait()
117117

118+
// Count the number of STUN-capable nodes.
119+
var stunCapableNodes int
120+
for _, region := range r.Regions {
121+
for _, node := range region.NodeReports {
122+
if node.STUN.CanSTUN {
123+
stunCapableNodes++
124+
}
125+
}
126+
}
127+
if stunCapableNodes == 0 {
128+
r.Severity = health.SeverityWarning
129+
r.Warnings = append(r.Warnings, health.Messagef(health.CodeSTUNNoNodes, noSTUN))
130+
}
131+
118132
// Review region reports and select the highest severity.
119133
for _, regionReport := range r.Regions {
120134
if regionReport.Severity.Value() > r.Severity.Value() {
@@ -131,8 +145,7 @@ func (r *RegionReport) Run(ctx context.Context) {
131145

132146
wg := &sync.WaitGroup{}
133147
var (
134-
unhealthyNodes int // atomic.Int64 is not mandatory as we depend on RegionReport mutex.
135-
stunCapableNodes int
148+
unhealthyNodes int // atomic.Int64 is not mandatory as we depend on RegionReport mutex.
136149
)
137150

138151
wg.Add(len(r.Region.Nodes))
@@ -163,9 +176,6 @@ func (r *RegionReport) Run(ctx context.Context) {
163176
if nodeReport.Severity != health.SeverityOK {
164177
unhealthyNodes++
165178
}
166-
if nodeReport.STUN.Enabled && nodeReport.STUN.CanSTUN {
167-
stunCapableNodes++
168-
}
169179

170180
r.Warnings = append(r.Warnings, nodeReport.Warnings...)
171181
r.mu.Unlock()
@@ -185,11 +195,6 @@ func (r *RegionReport) Run(ctx context.Context) {
185195
return
186196
}
187197

188-
if stunCapableNodes == 0 {
189-
r.Severity = health.SeverityWarning
190-
r.Warnings = append(r.Warnings, health.Messagef(health.CodeSTUNNoNodes, noSTUN))
191-
}
192-
193198
if len(r.Region.Nodes) == 1 {
194199
r.Healthy = r.NodeReports[0].Severity != health.SeverityError
195200
r.Severity = r.NodeReports[0].Severity

coderd/healthcheck/derphealth/derp_test.go

Lines changed: 64 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -130,8 +130,8 @@ func TestDERP(t *testing.T) {
130130
assert.Equal(t, health.SeverityWarning, report.Severity)
131131
assert.True(t, report.Dismissed)
132132
if assert.Len(t, report.Warnings, 2) {
133-
assert.Contains(t, report.Warnings[0].Code, health.CodeSTUNNoNodes)
134-
assert.Contains(t, report.Warnings[1].Code, health.CodeDERPOneNodeUnhealthy)
133+
assert.Contains(t, report.Warnings[0].Code, health.CodeDERPOneNodeUnhealthy)
134+
assert.Contains(t, report.Warnings[1].Code, health.CodeSTUNNoNodes)
135135
}
136136
for _, region := range report.Regions {
137137
assert.True(t, region.Healthy)
@@ -141,7 +141,7 @@ func TestDERP(t *testing.T) {
141141
assert.Equal(t, health.SeverityOK, region.NodeReports[0].Severity)
142142
assert.False(t, region.NodeReports[1].Healthy)
143143
assert.Equal(t, health.SeverityError, region.NodeReports[1].Severity)
144-
assert.Len(t, region.Warnings, 2)
144+
assert.Len(t, region.Warnings, 1)
145145
}
146146
})
147147

@@ -172,7 +172,7 @@ func TestDERP(t *testing.T) {
172172
ForceHTTP: true,
173173
}, {
174174
Name: "badstun",
175-
RegionID: 1000,
175+
RegionID: 999,
176176
HostName: derpURL.Host,
177177
STUNPort: 19302,
178178
STUNOnly: true,
@@ -189,7 +189,8 @@ func TestDERP(t *testing.T) {
189189
assert.True(t, report.Healthy)
190190
assert.Equal(t, health.SeverityWarning, report.Severity)
191191
if assert.Len(t, report.Warnings, 2) {
192-
assert.Contains(t, report.Warnings[0].Code, health.CodeSTUNNoNodes)
192+
assert.EqualValues(t, report.Warnings[1].Code, health.CodeSTUNNoNodes)
193+
assert.EqualValues(t, report.Warnings[0].Code, health.CodeDERPOneNodeUnhealthy)
193194
}
194195
for _, region := range report.Regions {
195196
assert.True(t, region.Healthy)
@@ -199,7 +200,7 @@ func TestDERP(t *testing.T) {
199200
assert.Equal(t, health.SeverityOK, region.NodeReports[0].Severity)
200201
assert.False(t, region.NodeReports[1].Healthy)
201202
assert.Equal(t, health.SeverityError, region.NodeReports[1].Severity)
202-
assert.Len(t, region.Warnings, 2)
203+
assert.Len(t, region.Warnings, 1)
203204
}
204205
})
205206

@@ -366,7 +367,63 @@ func TestDERP(t *testing.T) {
366367
}
367368
})
368369

369-
t.Run("STUNOnly/Error", func(t *testing.T) {
370+
t.Run("STUNOnly/OneBadOneGood", func(t *testing.T) {
371+
t.Parallel()
372+
373+
var (
374+
ctx = context.Background()
375+
report = derphealth.Report{}
376+
opts = &derphealth.ReportOptions{
377+
DERPMap: &tailcfg.DERPMap{Regions: map[int]*tailcfg.DERPRegion{
378+
1: {
379+
EmbeddedRelay: true,
380+
RegionID: 999,
381+
Nodes: []*tailcfg.DERPNode{{
382+
Name: "badstun",
383+
RegionID: 999,
384+
HostName: "badstun.example.com",
385+
STUNPort: 19302,
386+
STUNOnly: true,
387+
InsecureForTests: true,
388+
ForceHTTP: true,
389+
}, {
390+
Name: "goodstun",
391+
RegionID: 999,
392+
HostName: "stun.l.google.com",
393+
STUNPort: 19302,
394+
STUNOnly: true,
395+
InsecureForTests: true,
396+
ForceHTTP: true,
397+
}},
398+
},
399+
},
400+
},
401+
}
402+
)
403+
404+
report.Run(ctx, opts)
405+
assert.True(t, report.Healthy)
406+
assert.Equal(t, health.SeverityWarning, report.Severity)
407+
if assert.Len(t, report.Warnings, 1) {
408+
assert.Equal(t, health.CodeDERPOneNodeUnhealthy, report.Warnings[0].Code)
409+
}
410+
for _, region := range report.Regions {
411+
assert.True(t, region.Healthy)
412+
assert.Equal(t, health.SeverityWarning, region.Severity)
413+
// badstun
414+
assert.False(t, region.NodeReports[0].Healthy)
415+
assert.True(t, region.NodeReports[0].STUN.Enabled)
416+
assert.False(t, region.NodeReports[0].STUN.CanSTUN)
417+
assert.NotNil(t, region.NodeReports[0].STUN.Error)
418+
// goodstun
419+
assert.True(t, region.NodeReports[1].Healthy)
420+
assert.True(t, region.NodeReports[1].STUN.Enabled)
421+
assert.True(t, region.NodeReports[1].STUN.CanSTUN)
422+
assert.Nil(t, region.NodeReports[1].STUN.Error)
423+
}
424+
})
425+
426+
t.Run("STUNOnly/NoStun", func(t *testing.T) {
370427
t.Parallel()
371428

372429
var (

0 commit comments

Comments
 (0)