Skip to content

Commit 6007f15

Browse files
authored
fixed issue where warnings are disseminated along with passes (#390)
1 parent ba65f92 commit 6007f15

File tree

4 files changed

+160
-21
lines changed

4 files changed

+160
-21
lines changed

pkg/analyze/host_filesystem_performance.go

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -45,19 +45,19 @@ func (a *AnalyzeHostFilesystemPerformance) Analyze(getCollectedFileContents func
4545
return nil, errors.Wrapf(err, "failed to unmarshal filesystem performance results from %s", name)
4646
}
4747

48-
var coll resultCollector
48+
result := &AnalyzeResult{
49+
Title: a.Title(),
50+
}
4951

5052
for _, outcome := range hostAnalyzer.Outcomes {
51-
result := &AnalyzeResult{Title: a.Title()}
5253

5354
if outcome.Fail != nil {
5455
if outcome.Fail.When == "" {
5556
result.IsFail = true
5657
result.Message = renderFSPerfOutcome(outcome.Fail.Message, fsPerf)
5758
result.URI = outcome.Fail.URI
5859

59-
coll.push(result)
60-
continue
60+
return []*AnalyzeResult{result}, nil
6161
}
6262

6363
isMatch, err := compareHostFilesystemPerformanceConditionalToActual(outcome.Fail.When, fsPerf)
@@ -70,16 +70,15 @@ func (a *AnalyzeHostFilesystemPerformance) Analyze(getCollectedFileContents func
7070
result.Message = renderFSPerfOutcome(outcome.Fail.Message, fsPerf)
7171
result.URI = outcome.Fail.URI
7272

73-
coll.push(result)
73+
return []*AnalyzeResult{result}, nil
7474
}
7575
} else if outcome.Warn != nil {
7676
if outcome.Warn.When == "" {
7777
result.IsWarn = true
7878
result.Message = renderFSPerfOutcome(outcome.Warn.Message, fsPerf)
7979
result.URI = outcome.Warn.URI
8080

81-
coll.push(result)
82-
continue
81+
return []*AnalyzeResult{result}, nil
8382
}
8483

8584
isMatch, err := compareHostFilesystemPerformanceConditionalToActual(outcome.Warn.When, fsPerf)
@@ -92,16 +91,15 @@ func (a *AnalyzeHostFilesystemPerformance) Analyze(getCollectedFileContents func
9291
result.Message = renderFSPerfOutcome(outcome.Warn.Message, fsPerf)
9392
result.URI = outcome.Warn.URI
9493

95-
coll.push(result)
94+
return []*AnalyzeResult{result}, nil
9695
}
9796
} else if outcome.Pass != nil {
9897
if outcome.Pass.When == "" {
9998
result.IsPass = true
10099
result.Message = renderFSPerfOutcome(outcome.Pass.Message, fsPerf)
101100
result.URI = outcome.Pass.URI
102101

103-
coll.push(result)
104-
continue
102+
return []*AnalyzeResult{result}, nil
105103
}
106104

107105
isMatch, err := compareHostFilesystemPerformanceConditionalToActual(outcome.Pass.When, fsPerf)
@@ -114,13 +112,13 @@ func (a *AnalyzeHostFilesystemPerformance) Analyze(getCollectedFileContents func
114112
result.Message = renderFSPerfOutcome(outcome.Pass.Message, fsPerf)
115113
result.URI = outcome.Pass.URI
116114

117-
coll.push(result)
115+
return []*AnalyzeResult{result}, nil
118116
}
119117

120118
}
121119
}
122120

123-
return coll.get(a.Title()), nil
121+
return []*AnalyzeResult{result}, nil
124122
}
125123

126124
func compareHostFilesystemPerformanceConditionalToActual(conditional string, fsPerf collect.FSPerfResults) (res bool, err error) {

pkg/analyze/host_filesystem_performance_test.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,42 @@ func TestAnalyzeHostFilesystemPerformance(t *testing.T) {
296296
},
297297
},
298298
},
299+
{
300+
name: "skip warn if pass first",
301+
fsPerf: &collect.FSPerfResults{
302+
P99: 9 * time.Millisecond,
303+
},
304+
hostAnalyzer: &troubleshootv1beta2.FilesystemPerformanceAnalyze{
305+
CollectorName: "file system performance",
306+
Outcomes: []*troubleshootv1beta2.Outcome{
307+
{
308+
Pass: &troubleshootv1beta2.SingleOutcome{
309+
When: "p99 < 10ms",
310+
Message: "Acceptable write latency",
311+
},
312+
},
313+
{
314+
Warn: &troubleshootv1beta2.SingleOutcome{
315+
When: "p99 < 20ms",
316+
Message: "Warn write latency",
317+
},
318+
},
319+
{
320+
Fail: &troubleshootv1beta2.SingleOutcome{
321+
When: "p99 >= 20ms",
322+
Message: "fail",
323+
},
324+
},
325+
},
326+
},
327+
result: []*AnalyzeResult{
328+
{
329+
Title: "Filesystem Performance",
330+
IsPass: true,
331+
Message: "Acceptable write latency",
332+
},
333+
},
334+
},
299335
}
300336
for _, test := range tests {
301337
t.Run(test.name, func(t *testing.T) {

pkg/analyze/host_tcpportstatus.go

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ import (
1010
"github.com/replicatedhq/troubleshoot/pkg/collect"
1111
)
1212

13+
// AnalyzeHostTCPPortStatus is an analyzer that will return only one matching result, or a warning if nothing matches. The first
14+
// match that is encountered is the one that is returned.
1315
type AnalyzeHostTCPPortStatus struct {
1416
hostAnalyzer *troubleshootv1beta2.TCPPortStatusAnalyze
1517
}
@@ -39,61 +41,60 @@ func (a *AnalyzeHostTCPPortStatus) Analyze(getCollectedFileContents func(string)
3941
return nil, errors.Wrap(err, "failed to unmarshal collected")
4042
}
4143

42-
var coll resultCollector
44+
result := &AnalyzeResult{Title: a.Title()}
4345

4446
for _, outcome := range hostAnalyzer.Outcomes {
45-
result := &AnalyzeResult{Title: a.Title()}
4647

4748
if outcome.Fail != nil {
4849
if outcome.Fail.When == "" {
4950
result.IsFail = true
5051
result.Message = outcome.Fail.Message
5152
result.URI = outcome.Fail.URI
5253

53-
coll.push(result)
54+
return []*AnalyzeResult{result}, nil
5455
}
5556

5657
if string(actual.Status) == outcome.Fail.When {
5758
result.IsFail = true
5859
result.Message = outcome.Fail.Message
5960
result.URI = outcome.Fail.URI
6061

61-
coll.push(result)
62+
return []*AnalyzeResult{result}, nil
6263
}
6364
} else if outcome.Warn != nil {
6465
if outcome.Warn.When == "" {
6566
result.IsWarn = true
6667
result.Message = outcome.Warn.Message
6768
result.URI = outcome.Warn.URI
6869

69-
coll.push(result)
70+
return []*AnalyzeResult{result}, nil
7071
}
7172

7273
if string(actual.Status) == outcome.Warn.When {
7374
result.IsWarn = true
7475
result.Message = outcome.Warn.Message
7576
result.URI = outcome.Warn.URI
7677

77-
coll.push(result)
78+
return []*AnalyzeResult{result}, nil
7879
}
7980
} else if outcome.Pass != nil {
8081
if outcome.Pass.When == "" {
8182
result.IsPass = true
8283
result.Message = outcome.Pass.Message
8384
result.URI = outcome.Pass.URI
8485

85-
coll.push(result)
86+
return []*AnalyzeResult{result}, nil
8687
}
8788

8889
if string(actual.Status) == outcome.Pass.When {
8990
result.IsPass = true
9091
result.Message = outcome.Pass.Message
9192
result.URI = outcome.Pass.URI
9293

93-
coll.push(result)
94+
return []*AnalyzeResult{result}, nil
9495
}
9596
}
9697
}
9798

98-
return coll.get(a.Title()), nil
99+
return []*AnalyzeResult{result}, nil
99100
}
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
package analyzer
2+
3+
import (
4+
"encoding/json"
5+
"testing"
6+
7+
troubleshootv1beta2 "github.com/replicatedhq/troubleshoot/pkg/apis/troubleshoot/v1beta2"
8+
"github.com/replicatedhq/troubleshoot/pkg/collect"
9+
"github.com/stretchr/testify/require"
10+
)
11+
12+
func TestAnalyzeTCPPortStatus(t *testing.T) {
13+
tt := []struct {
14+
name string
15+
collected collect.NetworkStatusResult
16+
analyzer troubleshootv1beta2.TCPPortStatusAnalyze
17+
results []*AnalyzeResult
18+
wantErr bool
19+
}{
20+
{
21+
name: "pass expect single result",
22+
collected: collect.NetworkStatusResult{
23+
Status: "connected",
24+
},
25+
analyzer: troubleshootv1beta2.TCPPortStatusAnalyze{
26+
AnalyzeMeta: troubleshootv1beta2.AnalyzeMeta{
27+
CheckName: "Kubernetes API TCP Port Status",
28+
},
29+
Outcomes: []*troubleshootv1beta2.Outcome{
30+
{
31+
Pass: &troubleshootv1beta2.SingleOutcome{
32+
When: "connected",
33+
Message: "Port 6443 is open",
34+
},
35+
},
36+
{
37+
Warn: &troubleshootv1beta2.SingleOutcome{
38+
Message: "Unexpected port status",
39+
},
40+
},
41+
},
42+
},
43+
results: []*AnalyzeResult{
44+
{
45+
Title: "Kubernetes API TCP Port Status",
46+
IsPass: true,
47+
Message: "Port 6443 is open",
48+
},
49+
},
50+
},
51+
52+
{
53+
name: "get warn if no match",
54+
collected: collect.NetworkStatusResult{
55+
Status: "connected",
56+
},
57+
analyzer: troubleshootv1beta2.TCPPortStatusAnalyze{
58+
AnalyzeMeta: troubleshootv1beta2.AnalyzeMeta{
59+
CheckName: "Kubernetes API TCP Port Status",
60+
},
61+
Outcomes: []*troubleshootv1beta2.Outcome{
62+
{
63+
Fail: &troubleshootv1beta2.SingleOutcome{
64+
When: "foo",
65+
Message: "Port 6443 is open",
66+
},
67+
},
68+
{
69+
Warn: &troubleshootv1beta2.SingleOutcome{
70+
Message: "Unexpected port status",
71+
},
72+
},
73+
},
74+
},
75+
results: []*AnalyzeResult{
76+
{
77+
Title: "Kubernetes API TCP Port Status",
78+
IsWarn: true,
79+
Message: "Unexpected port status",
80+
},
81+
},
82+
},
83+
}
84+
85+
for _, tc := range tt {
86+
t.Run(tc.name, func(t *testing.T) {
87+
fn := func(_ string) ([]byte, error) {
88+
return json.Marshal(&tc.collected)
89+
}
90+
analyzer := AnalyzeHostTCPPortStatus{
91+
hostAnalyzer: &tc.analyzer,
92+
}
93+
results, err := analyzer.Analyze(fn)
94+
if tc.wantErr {
95+
require.NotNil(t, err)
96+
return
97+
}
98+
99+
require.Nil(t, err)
100+
require.Equal(t, tc.results, results)
101+
})
102+
}
103+
104+
}

0 commit comments

Comments
 (0)