Skip to content

Commit 534d441

Browse files
Yu-Jackc3y1huang
authored andcommitted
fix: shouldn't set error in optional phases
Signed-off-by: Jack Yu <[email protected]>
1 parent 6bd0407 commit 534d441

File tree

2 files changed

+126
-11
lines changed

2 files changed

+126
-11
lines changed

pkg/manager/manager.go

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -160,41 +160,49 @@ func (m *SupportBundleManager) runAllPhases(requiredPhases []RunPhase, optionalP
160160
maxProgressCount := len(requiredPhases) + len(optionalPhases) + len(postPhases)
161161

162162
for _, phase := range requiredPhases {
163-
if err := m.runPhase(phase, &progressCount, maxProgressCount); err != nil {
163+
if err := m.runPhase(phase, &progressCount, maxProgressCount, true); err != nil {
164164
logrus.Errorf("Failed to run requiredPhases %s: %s", phase.Name, err.Error())
165165
return
166166
}
167167
}
168168

169169
for _, phase := range optionalPhases {
170-
if err := m.runPhase(phase, &progressCount, maxProgressCount); err != nil {
171-
logrus.Errorf("Failed to run optionalPhases %s: %s", phase.Name, err.Error())
170+
if err := m.runPhase(phase, &progressCount, maxProgressCount, false); err != nil {
171+
logrus.Errorf("Failed to run optionalPhases %s: %s, but error is skiped", phase.Name, err.Error())
172172
// Since it's optional, don't return error.
173173
continue
174174
}
175175
}
176176

177177
for _, phase := range postPhases {
178-
if err := m.runPhase(phase, &progressCount, maxProgressCount); err != nil {
178+
if err := m.runPhase(phase, &progressCount, maxProgressCount, true); err != nil {
179179
logrus.Errorf("Failed to run postPhases %s: %s", phase.Name, err.Error())
180180
return
181181
}
182182
}
183183
}
184184

185-
func (m *SupportBundleManager) runPhase(phase RunPhase, progressCount *int, maxProgressCount int) error {
185+
func (m *SupportBundleManager) runPhase(phase RunPhase, progressCount *int, maxProgressCount int, setError bool) error {
186186
logrus.Infof("Running phase %s", phase.Name)
187187
m.status.SetPhase(phase.Name)
188-
if err := phase.Run(); err != nil {
189-
m.status.SetError(err.Error())
190-
logrus.Errorf("Failed to run phase %s: %s", phase.Name, err.Error())
191-
return err
188+
189+
err := phase.Run()
190+
if err != nil {
191+
if setError {
192+
m.status.SetError(err.Error())
193+
logrus.Errorf("Failed to run phase %s: %s", phase.Name, err.Error())
194+
return err
195+
}
192196
}
197+
193198
*progressCount++
194199
progress := 100 * (*progressCount) / maxProgressCount
195200
m.status.SetProgress(progress)
196-
logrus.Infof("Succeed to run phase %s. Progress (%d).", phase.Name, progress)
197-
return nil
201+
202+
if err == nil {
203+
logrus.Infof("Succeed to run phase %s. Progress (%d).", phase.Name, progress)
204+
}
205+
return err
198206
}
199207

200208
func (m *SupportBundleManager) phaseInit() error {

pkg/manager/manager_test.go

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
package manager
22

33
import (
4+
"errors"
45
"fmt"
56
"reflect"
67
"testing"
78

9+
"github.com/stretchr/testify/assert"
810
corev1 "k8s.io/api/core/v1"
11+
12+
"github.com/rancher/support-bundle-kit/pkg/types"
913
)
1014

1115
func TestParseToleration(t *testing.T) {
@@ -71,3 +75,106 @@ func TestParseToleration(t *testing.T) {
7175
}
7276
}
7377
}
78+
79+
func TestRunAllPhases(t *testing.T) {
80+
tests := []struct {
81+
name string
82+
requiredPhases []RunPhase
83+
optionalPhases []RunPhase
84+
postPhases []RunPhase
85+
expectedError bool
86+
expectedProgress int
87+
}{
88+
{
89+
name: "All pass",
90+
requiredPhases: []RunPhase{
91+
{Name: types.ManagerPhaseInit, Run: func() error { return nil }},
92+
{Name: types.ManagerPhaseClusterBundle, Run: func() error { return nil }},
93+
},
94+
optionalPhases: []RunPhase{
95+
{Name: types.ManagerPhasePrometheusBundle, Run: func() error { return nil }},
96+
},
97+
postPhases: []RunPhase{
98+
{Name: types.ManagerPhasePackaging, Run: func() error { return nil }},
99+
{Name: types.ManagerPhaseDone, Run: func() error { return nil }},
100+
},
101+
expectedError: false,
102+
expectedProgress: 100,
103+
},
104+
{
105+
name: "First Required phase error",
106+
requiredPhases: []RunPhase{
107+
{Name: types.ManagerPhaseInit, Run: func() error { return errors.New("required phase error") }},
108+
{Name: types.ManagerPhaseClusterBundle, Run: func() error { return nil }},
109+
},
110+
optionalPhases: []RunPhase{
111+
{Name: types.ManagerPhasePrometheusBundle, Run: func() error { return nil }},
112+
},
113+
postPhases: []RunPhase{
114+
{Name: types.ManagerPhasePackaging, Run: func() error { return nil }},
115+
{Name: types.ManagerPhaseDone, Run: func() error { return nil }},
116+
},
117+
expectedError: true,
118+
expectedProgress: 0,
119+
},
120+
{
121+
name: "Second Required phase error",
122+
requiredPhases: []RunPhase{
123+
{Name: types.ManagerPhaseInit, Run: func() error { return nil }},
124+
{Name: types.ManagerPhaseClusterBundle, Run: func() error { return errors.New("required phase error") }},
125+
},
126+
optionalPhases: []RunPhase{
127+
{Name: types.ManagerPhasePrometheusBundle, Run: func() error { return nil }},
128+
},
129+
postPhases: []RunPhase{
130+
{Name: types.ManagerPhasePackaging, Run: func() error { return nil }},
131+
{Name: types.ManagerPhaseDone, Run: func() error { return nil }},
132+
},
133+
expectedError: true,
134+
expectedProgress: 20,
135+
},
136+
{
137+
name: "Optional phase error",
138+
requiredPhases: []RunPhase{
139+
{Name: types.ManagerPhaseInit, Run: func() error { return nil }},
140+
{Name: types.ManagerPhaseClusterBundle, Run: func() error { return nil }},
141+
},
142+
optionalPhases: []RunPhase{
143+
{Name: types.ManagerPhasePrometheusBundle, Run: func() error { return errors.New("optional phase error") }},
144+
},
145+
postPhases: []RunPhase{
146+
{Name: types.ManagerPhasePackaging, Run: func() error { return nil }},
147+
{Name: types.ManagerPhaseDone, Run: func() error { return nil }},
148+
},
149+
expectedError: false,
150+
expectedProgress: 100,
151+
},
152+
{
153+
name: "Final Post phase error",
154+
requiredPhases: []RunPhase{
155+
{Name: types.ManagerPhaseInit, Run: func() error { return nil }},
156+
{Name: types.ManagerPhaseClusterBundle, Run: func() error { return nil }},
157+
},
158+
optionalPhases: []RunPhase{
159+
{Name: types.ManagerPhasePrometheusBundle, Run: func() error { return nil }},
160+
},
161+
postPhases: []RunPhase{
162+
{Name: types.ManagerPhasePackaging, Run: func() error { return nil }},
163+
{Name: types.ManagerPhaseDone, Run: func() error { return errors.New("post phase error") }},
164+
},
165+
expectedError: true,
166+
expectedProgress: 80,
167+
},
168+
}
169+
170+
for _, tt := range tests {
171+
t.Run(tt.name, func(t *testing.T) {
172+
m := &SupportBundleManager{
173+
status: ManagerStatus{},
174+
}
175+
m.runAllPhases(tt.requiredPhases, tt.optionalPhases, tt.postPhases)
176+
assert.Equal(t, tt.expectedError, m.status.Error, "expected error %v, got %v")
177+
assert.Equal(t, tt.expectedProgress, m.status.Progress, "expected progress %v, got %v")
178+
})
179+
}
180+
}

0 commit comments

Comments
 (0)