diff --git a/internal/cloudapi/v2/v2_koji_test.go b/internal/cloudapi/v2/v2_koji_test.go index e85a9ddc4..2a70928af 100644 --- a/internal/cloudapi/v2/v2_koji_test.go +++ b/internal/cloudapi/v2/v2_koji_test.go @@ -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() diff --git a/internal/cloudapi/v2/v2_multi_tenancy_test.go b/internal/cloudapi/v2/v2_multi_tenancy_test.go index 65ca860c1..3ff9f7bc2 100644 --- a/internal/cloudapi/v2/v2_multi_tenancy_test.go +++ b/internal/cloudapi/v2/v2_multi_tenancy_test.go @@ -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() diff --git a/internal/cloudapi/v2/v2_test.go b/internal/cloudapi/v2/v2_test.go index e7ec904eb..9be9c8080 100644 --- a/internal/cloudapi/v2/v2_test.go +++ b/internal/cloudapi/v2/v2_test.go @@ -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": { - "id": 22, - "reason": "DNF Error" - }, + "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(`