Skip to content

Commit fc1bc4c

Browse files
committed
Wrap errors
1 parent 14a454c commit fc1bc4c

File tree

2 files changed

+34
-27
lines changed

2 files changed

+34
-27
lines changed

pkg/os/system/api.go

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ func (APIImplementor) GetBIOSSerialNumber() (string, error) {
123123
func (impl APIImplementor) GetService(name string) (*ServiceInfo, error) {
124124
service, err := impl.serviceFactory.GetService(name)
125125
if err != nil {
126-
return nil, fmt.Errorf("failed to get service %s: %w", name, err)
126+
return nil, fmt.Errorf("failed to get service %s. error: %w", name, err)
127127
}
128128

129129
displayName, err := cim.GetServiceDisplayName(service)
@@ -152,7 +152,7 @@ func (impl APIImplementor) StartService(name string) error {
152152
startService := func(service cim.ServiceInterface) error {
153153
retVal, err := service.StartService()
154154
if err != nil || (retVal != startServiceErrorCodeAccepted && retVal != startServiceErrorCodeAlreadyRunning) {
155-
return fmt.Errorf("error starting service name %s. return value: %d, error: %v", name, retVal, err)
155+
return fmt.Errorf("error starting service name %s. return value: %d, error: %w", name, retVal, err)
156156
}
157157
return nil
158158
}
@@ -173,12 +173,12 @@ func (impl APIImplementor) StartService(name string) error {
173173

174174
service, err := impl.serviceFactory.GetService(name)
175175
if err != nil {
176-
return err
176+
return fmt.Errorf("failed to get service %s. error: %w", name, err)
177177
}
178178

179179
state, err := impl.serviceManager.WaitUntilServiceState(service, startService, serviceRunningCheck, serviceStateCheckInternal, serviceStateCheckTimeout)
180180
if err != nil && !errors.Is(err, errTimedOut) {
181-
return err
181+
return fmt.Errorf("failed to wait for service %s state change. error: %w", name, err)
182182
}
183183

184184
if state != serviceStateRunning {
@@ -197,28 +197,28 @@ func (impl APIImplementor) stopSingleService(name string) (bool, error) {
197197
dependentRunning = true
198198
return fmt.Errorf("error stopping service %s as dependent services are not stopped", name)
199199
}
200-
return fmt.Errorf("error stopping service %s. return value: %d, error: %v", name, retVal, err)
200+
return fmt.Errorf("error stopping service %s. return value: %d, error: %w", name, retVal, err)
201201
}
202202
return nil
203203
}
204204
serviceStoppedCheck := func(service cim.ServiceInterface, state string) (bool, string, error) {
205205
err := service.Refresh()
206206
if err != nil {
207-
return false, "", err
207+
return false, "", fmt.Errorf("error refresh service %s instance. error: %w", name, err)
208208
}
209209

210210
newState, err := cim.GetServiceState(service)
211211
if err != nil {
212-
return false, state, err
212+
return false, state, fmt.Errorf("error getting service %s state. error: %w", name, err)
213213
}
214214

215215
klog.V(6).Infof("service (%v) state check: %s => %s", service, state, newState)
216-
return newState == serviceStateStopped, newState, err
216+
return newState == serviceStateStopped, newState, nil
217217
}
218218

219219
service, err := impl.serviceFactory.GetService(name)
220220
if err != nil {
221-
return dependentRunning, err
221+
return dependentRunning, fmt.Errorf("failed to get service %s. error: %w", name, err)
222222
}
223223

224224
state, err := impl.serviceManager.WaitUntilServiceState(service, stopService, serviceStoppedCheck, serviceStateCheckInternal, serviceStateCheckTimeout)
@@ -235,8 +235,11 @@ func (impl APIImplementor) stopSingleService(name string) (bool, error) {
235235

236236
func (impl APIImplementor) StopService(name string, force bool) error {
237237
dependentRunning, err := impl.stopSingleService(name)
238-
if err == nil || !dependentRunning || !force {
239-
return err
238+
if err == nil {
239+
return nil
240+
}
241+
if !dependentRunning || !force {
242+
return fmt.Errorf("failed to stop service %s. error: %w", name, err)
240243
}
241244

242245
serviceNames, err := impl.serviceManager.GetDependentsForService(name)
@@ -247,7 +250,7 @@ func (impl APIImplementor) StopService(name string, force bool) error {
247250
for _, serviceName := range serviceNames {
248251
_, err = impl.stopSingleService(serviceName)
249252
if err != nil {
250-
return err
253+
return fmt.Errorf("failed to stop service %s. error: %w", name, err)
251254
}
252255
}
253256

@@ -261,15 +264,15 @@ type ServiceManagerImpl struct {
261264
func (impl ServiceManagerImpl) WaitUntilServiceState(service cim.ServiceInterface, stateTransition stateTransitionFunc, stateCheck stateCheckFunc, interval time.Duration, timeout time.Duration) (string, error) {
262265
done, state, err := stateCheck(service, "")
263266
if err != nil {
264-
return state, err
267+
return state, fmt.Errorf("service %v state check failed: %w", service, err)
265268
}
266269
if done {
267-
return state, err
270+
return state, nil
268271
}
269272

270273
// Perform transition if not already in desired state
271274
if err := stateTransition(service); err != nil {
272-
return state, err
275+
return state, fmt.Errorf("service %v state transition failed: %w", service, err)
273276
}
274277

275278
ticker := time.NewTicker(interval)
@@ -283,7 +286,7 @@ func (impl ServiceManagerImpl) WaitUntilServiceState(service cim.ServiceInterfac
283286
klog.V(6).Infof("Checking service (%v) state...", service)
284287
done, state, err = stateCheck(service, state)
285288
if err != nil {
286-
return state, fmt.Errorf("check failed: %w", err)
289+
return state, fmt.Errorf("service %v state check failed: %w", service, err)
287290
}
288291
if done {
289292
klog.V(6).Infof("service (%v) state is %s and transition done.", service, state)
@@ -303,7 +306,7 @@ func (impl ServiceManagerImpl) GetDependentsForService(name string) ([]string, e
303306

304307
service, err := impl.serviceFactory.GetService(name)
305308
if err != nil {
306-
return serviceNames, err
309+
return serviceNames, fmt.Errorf("failed to get service %s. error: %w", name, err)
307310
}
308311

309312
servicesToCheck = append(servicesToCheck, service)
@@ -314,12 +317,12 @@ func (impl ServiceManagerImpl) GetDependentsForService(name string) ([]string, e
314317

315318
serviceName, err := cim.GetServiceName(service)
316319
if err != nil {
317-
return serviceNames, err
320+
return serviceNames, fmt.Errorf("error getting service name %v. error: %w", service, err)
318321
}
319322

320323
currentState, err := cim.GetServiceState(service)
321324
if err != nil {
322-
return serviceNames, err
325+
return serviceNames, fmt.Errorf("error getting service %s state. error: %w", serviceName, err)
323326
}
324327

325328
if currentState != serviceStateRunning {
@@ -332,7 +335,7 @@ func (impl ServiceManagerImpl) GetDependentsForService(name string) ([]string, e
332335

333336
dependents, err := service.GetDependents()
334337
if err != nil {
335-
return serviceNames, err
338+
return serviceNames, fmt.Errorf("error getting service %s dependents. error: %w", serviceName, err)
336339
}
337340

338341
servicesToCheck = append(servicesToCheck, dependents...)

pkg/os/system/api_test.go

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ func (m *MockService) Refresh() error {
5858
return nil
5959
}
6060

61+
var _ cim.ServiceInterface = &MockService{}
62+
6163
type MockServiceFactory struct {
6264
Services map[string]cim.ServiceInterface
6365
Err error
@@ -71,20 +73,22 @@ func (f *MockServiceFactory) GetService(name string) (cim.ServiceInterface, erro
7173
return svc, f.Err
7274
}
7375

76+
var _ ServiceFactory = &MockServiceFactory{}
77+
7478
func TestWaitUntilServiceState_Success(t *testing.T) {
7579
svc := &MockService{Name: "svc", State: "Stopped"}
7680

7781
stateChanged := false
7882

79-
stateCheck := func(s cim.ServiceInterface, state string) (bool, string, error) {
83+
stateCheck := func(_ cim.ServiceInterface, _ string) (bool, string, error) {
8084
if stateChanged {
8185
svc.State = serviceStateRunning
8286
return true, svc.State, nil
8387
}
8488
return false, svc.State, nil
8589
}
8690

87-
stateTransition := func(s cim.ServiceInterface) error {
91+
stateTransition := func(_ cim.ServiceInterface) error {
8892
stateChanged = true
8993
return nil
9094
}
@@ -102,11 +106,11 @@ func TestWaitUntilServiceState_Success(t *testing.T) {
102106
func TestWaitUntilServiceState_Timeout(t *testing.T) {
103107
svc := &MockService{Name: "svc", State: "Stopped"}
104108

105-
stateCheck := func(s cim.ServiceInterface, state string) (bool, string, error) {
109+
stateCheck := func(_ cim.ServiceInterface, _ string) (bool, string, error) {
106110
return false, svc.State, nil
107111
}
108112

109-
stateTransition := func(s cim.ServiceInterface) error {
113+
stateTransition := func(_ cim.ServiceInterface) error {
110114
return nil
111115
}
112116

@@ -123,17 +127,17 @@ func TestWaitUntilServiceState_Timeout(t *testing.T) {
123127
func TestWaitUntilServiceState_TransitionFails(t *testing.T) {
124128
svc := &MockService{Name: "svc", State: "Stopped"}
125129

126-
stateCheck := func(s cim.ServiceInterface, state string) (bool, string, error) {
130+
stateCheck := func(_ cim.ServiceInterface, _ string) (bool, string, error) {
127131
return false, svc.State, nil
128132
}
129133

130-
stateTransition := func(s cim.ServiceInterface) error {
134+
stateTransition := func(_ cim.ServiceInterface) error {
131135
return fmt.Errorf("transition failed")
132136
}
133137

134138
impl := ServiceManagerImpl{}
135139
_, err := impl.WaitUntilServiceState(svc, stateTransition, stateCheck, 10*time.Millisecond, 50*time.Millisecond)
136-
if err == nil || err.Error() != "transition failed" {
140+
if err == nil || !strings.Contains(err.Error(), "transition failed") {
137141
t.Fatalf("expected transition error, got %v", err)
138142
}
139143
}

0 commit comments

Comments
 (0)