Skip to content

Commit 2704b18

Browse files
mvo5achilleas-k
authored andcommitted
obuild-worker: extract workerClientErrorFrom() helper and add tests
Tiny commit to extract a helper from DepsolveJobImpl.Run() that can then be unit tested. This should help with osbuild/images#727
1 parent 7abcd27 commit 2704b18

File tree

3 files changed

+70
-20
lines changed

3 files changed

+70
-20
lines changed

cmd/osbuild-worker/export_test.go

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package main
2+
3+
var WorkerClientErrorFrom = workerClientErrorFrom

cmd/osbuild-worker/jobimpl-depsolve.go

+27-20
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,30 @@ func (impl *DepsolveJobImpl) depsolve(packageSets map[string][]rpmmd.PackageSet,
7373
return depsolvedSets, repoConfigs, nil
7474
}
7575

76+
func workerClientErrorFrom(err error) (*clienterrors.Error, error) {
77+
switch e := err.(type) {
78+
case dnfjson.Error:
79+
// Error originates from dnf-json
80+
switch e.Kind {
81+
case "DepsolveError":
82+
return clienterrors.WorkerClientError(clienterrors.ErrorDNFDepsolveError, err.Error(), e.Reason), nil
83+
case "MarkingErrors":
84+
return clienterrors.WorkerClientError(clienterrors.ErrorDNFMarkingErrors, err.Error(), e.Reason), nil
85+
case "RepoError":
86+
return clienterrors.WorkerClientError(clienterrors.ErrorDNFRepoError, err.Error(), e.Reason), nil
87+
default:
88+
err := fmt.Errorf("Unhandled dnf-json error in depsolve job: %v", err)
89+
// This still has the kind/reason format but a kind that's returned
90+
// by dnf-json and not explicitly handled here.
91+
return clienterrors.WorkerClientError(clienterrors.ErrorDNFOtherError, err.Error(), e.Reason), err
92+
}
93+
default:
94+
err := fmt.Errorf("rpmmd error in depsolve job: %v", err)
95+
// Error originates from internal/rpmmd, not from dnf-json
96+
return clienterrors.WorkerClientError(clienterrors.ErrorRPMMDError, err.Error(), nil), err
97+
}
98+
}
99+
76100
func (impl *DepsolveJobImpl) Run(job worker.Job) error {
77101
logWithId := logrus.WithField("jobId", job.Id())
78102
var args worker.DepsolveJob
@@ -106,26 +130,9 @@ func (impl *DepsolveJobImpl) Run(job worker.Job) error {
106130

107131
result.PackageSpecs, result.RepoConfigs, err = impl.depsolve(args.PackageSets, args.ModulePlatformID, args.Arch, args.Releasever)
108132
if err != nil {
109-
switch e := err.(type) {
110-
case dnfjson.Error:
111-
// Error originates from dnf-json
112-
switch e.Kind {
113-
case "DepsolveError":
114-
result.JobError = clienterrors.WorkerClientError(clienterrors.ErrorDNFDepsolveError, err.Error(), e.Reason)
115-
case "MarkingErrors":
116-
result.JobError = clienterrors.WorkerClientError(clienterrors.ErrorDNFMarkingErrors, err.Error(), e.Reason)
117-
case "RepoError":
118-
result.JobError = clienterrors.WorkerClientError(clienterrors.ErrorDNFRepoError, err.Error(), e.Reason)
119-
default:
120-
// This still has the kind/reason format but a kind that's returned
121-
// by dnf-json and not explicitly handled here.
122-
result.JobError = clienterrors.WorkerClientError(clienterrors.ErrorDNFOtherError, err.Error(), e.Reason)
123-
logWithId.Errorf("Unhandled dnf-json error in depsolve job: %v", err)
124-
}
125-
case error:
126-
// Error originates from internal/rpmmd, not from dnf-json
127-
result.JobError = clienterrors.WorkerClientError(clienterrors.ErrorRPMMDError, err.Error(), nil)
128-
logWithId.Errorf("rpmmd error in depsolve job: %v", err)
133+
result.JobError, err = workerClientErrorFrom(err)
134+
if err != nil {
135+
logWithId.Errorf(err.Error())
129136
}
130137
}
131138
if err := impl.Solver.CleanCache(); err != nil {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package main_test
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
7+
"github.com/stretchr/testify/assert"
8+
9+
"github.com/osbuild/images/pkg/dnfjson"
10+
11+
worker "github.com/osbuild/osbuild-composer/cmd/osbuild-worker"
12+
)
13+
14+
func TestWorkerClientErrorFromDnfJson(t *testing.T) {
15+
dnfJsonErr := dnfjson.Error{
16+
Kind: "DepsolveError",
17+
Reason: "something is terribly wrong",
18+
}
19+
clientErr, err := worker.WorkerClientErrorFrom(dnfJsonErr)
20+
assert.NoError(t, err)
21+
// XXX: this is duplicating the details, see https://github.com/osbuild/images/issues/727
22+
assert.Equal(t, clientErr.String(), `Code: 20, Reason: DNF error occurred: DepsolveError: something is terribly wrong, Details: something is terribly wrong`)
23+
}
24+
25+
func TestWorkerClientErrorFromOtherError(t *testing.T) {
26+
otherErr := fmt.Errorf("some error")
27+
clientErr, err := worker.WorkerClientErrorFrom(otherErr)
28+
// XXX: this is probably okay but it seems slightly dangerous to
29+
// assume that any "error" we get there is coming from rpmmd, can
30+
// we generate a more typed error from dnfjson here for rpmmd errors?
31+
assert.EqualError(t, err, "rpmmd error in depsolve job: some error")
32+
assert.Equal(t, clientErr.String(), `Code: 23, Reason: rpmmd error in depsolve job: some error, Details: <nil>`)
33+
}
34+
35+
func TestWorkerClientErrorFromNil(t *testing.T) {
36+
clientErr, err := worker.WorkerClientErrorFrom(nil)
37+
// XXX: this is wrong, it should generate an internal error
38+
assert.EqualError(t, err, "rpmmd error in depsolve job: <nil>")
39+
assert.Equal(t, clientErr.String(), `Code: 23, Reason: rpmmd error in depsolve job: <nil>, Details: <nil>`)
40+
}

0 commit comments

Comments
 (0)