cloudapi: Correctly test dependency errors

Dependency errors are not set by the workers, they're not set directly
in the job result. They are added by the worker server in case the job
error indicates it's a dependency error.
This commit is contained in:
Sanne Raymaekers 2022-08-02 12:10:09 +02:00 committed by Ondřej Budai
parent 111feda1f5
commit 7b73cf395f
3 changed files with 37 additions and 90 deletions

View file

@ -25,7 +25,7 @@ type jobResult struct {
}
func TestKojiCompose(t *testing.T) {
kojiServer, workerServer, _, cancel := newV2Server(t, t.TempDir(), []string{""}, false)
kojiServer, workerServer, _, cancel := newV2Server(t, t.TempDir(), []string{""}, false, false)
handler := kojiServer.Handler("/api/image-builder-composer/v2")
workerHandler := workerServer.Handler()
defer cancel()
@ -215,6 +215,7 @@ func TestKojiCompose(t *testing.T) {
"image_status": {
"status": "failure",
"error": {
"details": null,
"id": 10,
"reason": "Koji build error"
}
@ -223,6 +224,7 @@ func TestKojiCompose(t *testing.T) {
{
"status": "failure",
"error": {
"details": null,
"id": 10,
"reason": "Koji build error"
}
@ -321,76 +323,8 @@ func TestKojiCompose(t *testing.T) {
"status": "failure"
}`,
},
// #7
{
initResult: worker.KojiInitJobResult{
BuildID: 42,
Token: `"foobar"`,
},
buildResult: worker.OSBuildJobResult{
Arch: test_distro.TestArchName,
HostOS: test_distro.TestDistroName,
TargetResults: []*target.TargetResult{target.NewKojiTargetResult(&target.KojiTargetResultOptions{
ImageMD5: "browns",
ImageSize: 42,
})},
OSBuildOutput: &osbuild.Result{
Success: true,
},
JobResult: worker.JobResult{
JobError: clienterrors.WorkerClientError(
clienterrors.ErrorManifestDependency,
"Manifest dependency failed",
clienterrors.WorkerClientError(
clienterrors.ErrorDNFOtherError,
"DNF Error",
nil,
),
),
},
},
composeReplyCode: http.StatusCreated,
composeReply: `{"href":"/api/image-builder-composer/v2/compose", "kind":"ComposeId"}`,
composeStatus: `{
"kind": "ComposeStatus",
"image_status": {
"error": {
"details": [
{
"id": 22,
"reason": "DNF Error"
}
],
"id": 9,
"reason": "Manifest dependency failed"
},
"status": "failure"
},
"image_statuses": [
{
"error": {
"details": [
{
"id": 22,
"reason": "DNF Error"
}
],
"id": 9,
"reason": "Manifest dependency failed"
},
"status": "failure"
},
{
"status": "success"
}
],
"koji_status": {
"build_id": 42
},
"status": "failure"
}`,
},
}
for idx, c := range cases {
name, version, release := "foo", "1", "2"
t.Run(fmt.Sprintf("Test case #%d", idx), func(t *testing.T) {
@ -536,7 +470,7 @@ func TestKojiCompose(t *testing.T) {
}
func TestKojiJobTypeValidation(t *testing.T) {
server, workers, _, cancel := newV2Server(t, t.TempDir(), []string{""}, false)
server, workers, _, cancel := newV2Server(t, t.TempDir(), []string{""}, false, false)
handler := server.Handler("/api/image-builder-composer/v2")
defer cancel()

View file

@ -197,7 +197,7 @@ func runNextJob(t *testing.T, jobs []uuid.UUID, workerHandler http.Handler, orgI
func TestMultitenancy(t *testing.T) {
// Passing an empty list as depsolving channels, we want to do depsolves
// ourselvess
apiServer, workerServer, q, cancel := newV2Server(t, t.TempDir(), []string{}, true)
apiServer, workerServer, q, cancel := newV2Server(t, t.TempDir(), []string{}, true, false)
handler := apiServer.Handler("/api/image-builder-composer/v2")
defer cancel()

View file

@ -24,7 +24,7 @@ import (
"github.com/osbuild/osbuild-composer/internal/worker/clienterrors"
)
func newV2Server(t *testing.T, dir string, depsolveChannels []string, enableJWT bool) (*v2.Server, *worker.Server, jobqueue.JobQueue, context.CancelFunc) {
func newV2Server(t *testing.T, dir string, depsolveChannels []string, enableJWT bool, failDepsolve bool) (*v2.Server, *worker.Server, jobqueue.JobQueue, context.CancelFunc) {
q, err := fsjobqueue.New(dir)
require.NoError(t, err)
workerServer := worker.NewServer(nil, q, worker.Config{BasePath: "/api/worker/v1", JWTEnabled: enableJWT, TenantProviderFields: []string{"rh-org-id", "account_id"}})
@ -57,7 +57,17 @@ func newV2Server(t *testing.T, dir string, depsolveChannels []string, enableJWT
if err != nil {
continue
}
rawMsg, err := json.Marshal(&worker.DepsolveJobResult{PackageSpecs: map[string][]rpmmd.PackageSpec{"build": []rpmmd.PackageSpec{rpmmd.PackageSpec{Name: "pkg1"}}}, Error: "", ErrorType: worker.ErrorType("")})
dJR := &worker.DepsolveJobResult{
PackageSpecs: map[string][]rpmmd.PackageSpec{"build": []rpmmd.PackageSpec{rpmmd.PackageSpec{Name: "pkg1"}}},
Error: "",
ErrorType: worker.ErrorType(""),
}
if failDepsolve {
dJR.JobResult.JobError = clienterrors.WorkerClientError(clienterrors.ErrorDNFOtherError, "DNF Error", nil)
}
rawMsg, err := json.Marshal(dJR)
require.NoError(t, err)
err = workerServer.FinishJob(token, rawMsg)
if err != nil {
@ -76,7 +86,7 @@ func newV2Server(t *testing.T, dir string, depsolveChannels []string, enableJWT
}
func TestUnknownRoute(t *testing.T) {
srv, _, _, cancel := newV2Server(t, t.TempDir(), []string{""}, false)
srv, _, _, cancel := newV2Server(t, t.TempDir(), []string{""}, false, false)
defer cancel()
test.TestRoute(t, srv.Handler("/api/image-builder-composer/v2"), false, "GET", "/api/image-builder-composer/v2/badroute", ``, http.StatusNotFound, `
@ -90,7 +100,7 @@ func TestUnknownRoute(t *testing.T) {
}
func TestGetError(t *testing.T) {
srv, _, _, cancel := newV2Server(t, t.TempDir(), []string{""}, false)
srv, _, _, cancel := newV2Server(t, t.TempDir(), []string{""}, false, false)
defer cancel()
test.TestRoute(t, srv.Handler("/api/image-builder-composer/v2"), false, "GET", "/api/image-builder-composer/v2/errors/4", ``, http.StatusOK, `
@ -113,7 +123,7 @@ func TestGetError(t *testing.T) {
}
func TestGetErrorList(t *testing.T) {
srv, _, _, cancel := newV2Server(t, t.TempDir(), []string{""}, false)
srv, _, _, cancel := newV2Server(t, t.TempDir(), []string{""}, false, false)
defer cancel()
test.TestRoute(t, srv.Handler("/api/image-builder-composer/v2"), false, "GET", "/api/image-builder-composer/v2/errors?page=3&size=1", ``, http.StatusOK, `
@ -132,7 +142,7 @@ func TestGetErrorList(t *testing.T) {
}
func TestCompose(t *testing.T) {
srv, _, _, cancel := newV2Server(t, t.TempDir(), []string{""}, false)
srv, _, _, cancel := newV2Server(t, t.TempDir(), []string{""}, false, false)
defer cancel()
// create two ostree repos, one to serve the default test_distro ref (for fallback tests) and one to serve a custom ref
@ -550,7 +560,7 @@ func TestCompose(t *testing.T) {
}
func TestComposeStatusSuccess(t *testing.T) {
srv, wrksrv, _, cancel := newV2Server(t, t.TempDir(), []string{""}, false)
srv, wrksrv, _, cancel := newV2Server(t, t.TempDir(), []string{""}, false, false)
defer cancel()
test.TestRoute(t, srv.Handler("/api/image-builder-composer/v2"), false, "POST", "/api/image-builder-composer/v2/compose", fmt.Sprintf(`
@ -664,7 +674,7 @@ func TestComposeStatusSuccess(t *testing.T) {
}
func TestComposeStatusFailure(t *testing.T) {
srv, wrksrv, _, cancel := newV2Server(t, t.TempDir(), []string{""}, false)
srv, wrksrv, _, cancel := newV2Server(t, t.TempDir(), []string{""}, false, false)
defer cancel()
test.TestRoute(t, srv.Handler("/api/image-builder-composer/v2"), false, "POST", "/api/image-builder-composer/v2/compose", fmt.Sprintf(`
@ -720,7 +730,7 @@ func TestComposeStatusFailure(t *testing.T) {
}
func TestComposeStatusInvalidUUID(t *testing.T) {
srv, _, _, cancel := newV2Server(t, t.TempDir(), []string{""}, false)
srv, _, _, cancel := newV2Server(t, t.TempDir(), []string{""}, false, false)
defer cancel()
test.TestRoute(t, srv.Handler("/api/image-builder-composer/v2"), false, "GET", "/api/image-builder-composer/v2/composes/abcdef", ``, http.StatusBadRequest, `
@ -736,7 +746,7 @@ func TestComposeStatusInvalidUUID(t *testing.T) {
}
func TestComposeJobError(t *testing.T) {
srv, wrksrv, _, cancel := newV2Server(t, t.TempDir(), []string{""}, false)
srv, wrksrv, _, cancel := newV2Server(t, t.TempDir(), []string{""}, false, false)
defer cancel()
test.TestRoute(t, srv.Handler("/api/image-builder-composer/v2"), false, "POST", "/api/image-builder-composer/v2/compose", fmt.Sprintf(`
@ -798,7 +808,7 @@ func TestComposeJobError(t *testing.T) {
}
func TestComposeDependencyError(t *testing.T) {
srv, wrksrv, _, cancel := newV2Server(t, t.TempDir(), []string{""}, false)
srv, wrksrv, _, cancel := newV2Server(t, t.TempDir(), []string{""}, false, true)
defer cancel()
test.TestRoute(t, srv.Handler("/api/image-builder-composer/v2"), false, "POST", "/api/image-builder-composer/v2/compose", fmt.Sprintf(`
@ -837,7 +847,6 @@ func TestComposeDependencyError(t *testing.T) {
jobErr := worker.JobResult{
JobError: clienterrors.WorkerClientError(clienterrors.ErrorManifestDependency, "Manifest dependency failed", nil),
}
jobErr.JobError.Details = clienterrors.WorkerClientError(clienterrors.ErrorDNFOtherError, "DNF Error", nil)
jobResult, err := json.Marshal(worker.OSBuildJobResult{JobResult: jobErr})
require.NoError(t, err)
@ -850,10 +859,14 @@ func TestComposeDependencyError(t *testing.T) {
"id": "%v",
"image_status": {
"error": {
"details": {
"details": [{
"id": 5,
"reason": "Error in depsolve job dependency",
"details": [{
"id": 22,
"reason": "DNF Error"
},
}]
}],
"id": 9,
"reason": "Manifest dependency failed"
},
@ -864,7 +877,7 @@ func TestComposeDependencyError(t *testing.T) {
}
func TestComposeCustomizations(t *testing.T) {
srv, _, _, cancel := newV2Server(t, t.TempDir(), []string{""}, false)
srv, _, _, cancel := newV2Server(t, t.TempDir(), []string{""}, false, false)
defer cancel()
test.TestRoute(t, srv.Handler("/api/image-builder-composer/v2"), false, "POST", "/api/image-builder-composer/v2/compose", fmt.Sprintf(`
@ -918,7 +931,7 @@ func TestComposeCustomizations(t *testing.T) {
}
func TestImageTypes(t *testing.T) {
srv, _, _, cancel := newV2Server(t, t.TempDir(), []string{""}, false)
srv, _, _, cancel := newV2Server(t, t.TempDir(), []string{""}, false, false)
defer cancel()
test.TestRoute(t, srv.Handler("/api/image-builder-composer/v2"), false, "POST", "/api/image-builder-composer/v2/compose", fmt.Sprintf(`