Blame internal/kojiapi/server_test.go

Packit Service 509fd4
package kojiapi_test
Packit Service 509fd4
Packit Service 509fd4
import (
Packit Service 509fd4
	"context"
Packit Service 509fd4
	"encoding/json"
Packit Service 509fd4
	"fmt"
Packit Service 509fd4
	"io/ioutil"
Packit Service 509fd4
	"log"
Packit Service 509fd4
	"net/http"
Packit Service 509fd4
	"net/http/httptest"
Packit Service 509fd4
	"os"
Packit Service 509fd4
	"sync"
Packit Service 509fd4
	"testing"
Packit Service 509fd4
Packit Service 509fd4
	"github.com/osbuild/osbuild-composer/internal/jobqueue/fsjobqueue"
Packit Service 509fd4
	"github.com/osbuild/osbuild-composer/internal/kojiapi"
Packit Service 509fd4
	"github.com/osbuild/osbuild-composer/internal/kojiapi/api"
Packit Service 509fd4
	distro_mock "github.com/osbuild/osbuild-composer/internal/mocks/distro"
Packit Service 509fd4
	rpmmd_mock "github.com/osbuild/osbuild-composer/internal/mocks/rpmmd"
Packit Service 509fd4
	"github.com/osbuild/osbuild-composer/internal/osbuild"
Packit Service 509fd4
	"github.com/osbuild/osbuild-composer/internal/test"
Packit Service 509fd4
	"github.com/osbuild/osbuild-composer/internal/worker"
Packit Service 509fd4
	"github.com/stretchr/testify/require"
Packit Service 509fd4
)
Packit Service 509fd4
Packit Service 509fd4
func newTestKojiServer(t *testing.T, dir string) (*kojiapi.Server, *worker.Server) {
Packit Service 509fd4
	rpm_fixture := rpmmd_mock.BaseFixture()
Packit Service 509fd4
	rpm := rpmmd_mock.NewRPMMDMock(rpm_fixture)
Packit Service 509fd4
	require.NotNil(t, rpm)
Packit Service 509fd4
Packit Service 509fd4
	distros, err := distro_mock.NewDefaultRegistry()
Packit Service 509fd4
	require.NoError(t, err)
Packit Service 509fd4
	require.NotNil(t, distros)
Packit Service 509fd4
Packit Service 509fd4
	queue, err := fsjobqueue.New(dir)
Packit Service 509fd4
	require.NoError(t, err)
Packit Service 509fd4
Packit Service 509fd4
	workerServer := worker.NewServer(nil, queue, "")
Packit Service 509fd4
	require.NotNil(t, workerServer)
Packit Service 509fd4
Packit Service 509fd4
	kojiServer := kojiapi.NewServer(nil, workerServer, rpm, distros)
Packit Service 509fd4
	require.NotNil(t, kojiServer)
Packit Service 509fd4
Packit Service 509fd4
	return kojiServer, workerServer
Packit Service 509fd4
}
Packit Service 509fd4
Packit Service 509fd4
func TestStatus(t *testing.T) {
Packit Service 509fd4
	dir, err := ioutil.TempDir("", "osbuild-composer-test-kojiapi-")
Packit Service 509fd4
	if err != nil {
Packit Service 509fd4
		log.Fatal(err)
Packit Service 509fd4
	}
Packit Service 509fd4
	defer os.RemoveAll(dir)
Packit Service 509fd4
Packit Service 509fd4
	kojiServer, _ := newTestKojiServer(t, dir)
Packit Service 509fd4
	handler := kojiServer.Handler("/api/composer-koji/v1")
Packit Service 509fd4
	test.TestRoute(t, handler, false, "GET", "/api/composer-koji/v1/status", ``, http.StatusOK, `{"status":"OK"}`, "message")
Packit Service 509fd4
}
Packit Service 509fd4
Packit Service 509fd4
type jobResult struct {
Packit Service 509fd4
	Result interface{} `json:"result"`
Packit Service 509fd4
}
Packit Service 509fd4
Packit Service 509fd4
func TestCompose(t *testing.T) {
Packit Service 509fd4
	dir, err := ioutil.TempDir("", "osbuild-composer-test-kojiapi-")
Packit Service 509fd4
	if err != nil {
Packit Service 509fd4
		log.Fatal(err)
Packit Service 509fd4
	}
Packit Service 509fd4
	defer os.RemoveAll(dir)
Packit Service 509fd4
Packit Service 509fd4
	kojiServer, workerServer := newTestKojiServer(t, dir)
Packit Service 509fd4
	handler := kojiServer.Handler("/api/composer-koji/v1")
Packit Service 509fd4
	workerHandler := workerServer.Handler()
Packit Service 509fd4
Packit Service 509fd4
	type kojiCase struct {
Packit Service 509fd4
		initResult       worker.KojiInitJobResult
Packit Service 509fd4
		buildResult      worker.OSBuildKojiJobResult
Packit Service 509fd4
		finalizeResult   worker.KojiFinalizeJobResult
Packit Service 509fd4
		composeReplyCode int
Packit Service 509fd4
		composeReply     string
Packit Service 509fd4
		composeStatus    string
Packit Service 509fd4
	}
Packit Service 509fd4
Packit Service 509fd4
	var cases = []kojiCase{
Packit Service 509fd4
		{
Packit Service 509fd4
			initResult: worker.KojiInitJobResult{
Packit Service 509fd4
				BuildID: 42,
Packit Service 509fd4
				Token:   `"foobar"`,
Packit Service 509fd4
			},
Packit Service 509fd4
			buildResult: worker.OSBuildKojiJobResult{
Packit Service 509fd4
				Arch:      "x86_64",
Packit Service 509fd4
				HostOS:    "fedora-30",
Packit Service 509fd4
				ImageHash: "browns",
Packit Service 509fd4
				ImageSize: 42,
Packit Service 509fd4
				OSBuildOutput: &osbuild.Result{
Packit Service 509fd4
					Success: true,
Packit Service 509fd4
				},
Packit Service 509fd4
			},
Packit Service 509fd4
			composeReplyCode: http.StatusCreated,
Packit Service 509fd4
			composeReply:     `{"koji_build_id":42}`,
Packit Service 509fd4
			composeStatus: `{
Packit Service 509fd4
				"image_statuses": [
Packit Service 509fd4
					{
Packit Service 509fd4
						"status": "success"
Packit Service 509fd4
					},
Packit Service 509fd4
					{
Packit Service 509fd4
						"status": "success"
Packit Service 509fd4
					}
Packit Service 509fd4
				],
Packit Service 509fd4
				"koji_build_id": 42,
Packit Service 509fd4
				"koji_task_id": 0,
Packit Service 509fd4
				"status": "success"
Packit Service 509fd4
			}`,
Packit Service 509fd4
		},
Packit Service 509fd4
		{
Packit Service 509fd4
			initResult: worker.KojiInitJobResult{
Packit Service 509fd4
				KojiError: "failure",
Packit Service 509fd4
			},
Packit Service 509fd4
			buildResult: worker.OSBuildKojiJobResult{
Packit Service 509fd4
				Arch:      "x86_64",
Packit Service 509fd4
				HostOS:    "fedora-30",
Packit Service 509fd4
				ImageHash: "browns",
Packit Service 509fd4
				ImageSize: 42,
Packit Service 509fd4
				OSBuildOutput: &osbuild.Result{
Packit Service 509fd4
					Success: true,
Packit Service 509fd4
				},
Packit Service 509fd4
			},
Packit Service 509fd4
			composeReplyCode: http.StatusBadRequest,
Packit Service 509fd4
			composeReply:     `{"message":"Could not initialize build with koji: failure"}`,
Packit Service 509fd4
			composeStatus: `{
Packit Service 509fd4
				"image_statuses": [
Packit Service 509fd4
					{
Packit Service 509fd4
						"status": "failure"
Packit Service 509fd4
					},
Packit Service 509fd4
					{
Packit Service 509fd4
						"status": "failure"
Packit Service 509fd4
					}
Packit Service 509fd4
				],
Packit Service 509fd4
				"koji_task_id": 0,
Packit Service 509fd4
				"status": "failure"
Packit Service 509fd4
			}`,
Packit Service 509fd4
		},
Packit Service 509fd4
		{
Packit Service 509fd4
			initResult: worker.KojiInitJobResult{
Packit Service 509fd4
				BuildID: 42,
Packit Service 509fd4
				Token:   `"foobar"`,
Packit Service 509fd4
			},
Packit Service 509fd4
			buildResult: worker.OSBuildKojiJobResult{
Packit Service 509fd4
				Arch:      "x86_64",
Packit Service 509fd4
				HostOS:    "fedora-30",
Packit Service 509fd4
				ImageHash: "browns",
Packit Service 509fd4
				ImageSize: 42,
Packit Service 509fd4
				OSBuildOutput: &osbuild.Result{
Packit Service 509fd4
					Success: false,
Packit Service 509fd4
				},
Packit Service 509fd4
			},
Packit Service 509fd4
			composeReplyCode: http.StatusCreated,
Packit Service 509fd4
			composeReply:     `{"koji_build_id":42}`,
Packit Service 509fd4
			composeStatus: `{
Packit Service 509fd4
				"image_statuses": [
Packit Service 509fd4
					{
Packit Service 509fd4
						"status": "failure"
Packit Service 509fd4
					},
Packit Service 509fd4
					{
Packit Service 509fd4
						"status": "success"
Packit Service 509fd4
					}
Packit Service 509fd4
				],
Packit Service 509fd4
				"koji_build_id": 42,
Packit Service 509fd4
				"koji_task_id": 0,
Packit Service 509fd4
				"status": "failure"
Packit Service 509fd4
			}`,
Packit Service 509fd4
		},
Packit Service 509fd4
		{
Packit Service 509fd4
			initResult: worker.KojiInitJobResult{
Packit Service 509fd4
				BuildID: 42,
Packit Service 509fd4
				Token:   `"foobar"`,
Packit Service 509fd4
			},
Packit Service 509fd4
			buildResult: worker.OSBuildKojiJobResult{
Packit Service 509fd4
				Arch:      "x86_64",
Packit Service 509fd4
				HostOS:    "fedora-30",
Packit Service 509fd4
				ImageHash: "browns",
Packit Service 509fd4
				ImageSize: 42,
Packit Service 509fd4
				OSBuildOutput: &osbuild.Result{
Packit Service 509fd4
					Success: true,
Packit Service 509fd4
				},
Packit Service 509fd4
				KojiError: "failure",
Packit Service 509fd4
			},
Packit Service 509fd4
			composeReplyCode: http.StatusCreated,
Packit Service 509fd4
			composeReply:     `{"koji_build_id":42}`,
Packit Service 509fd4
			composeStatus: `{
Packit Service 509fd4
				"image_statuses": [
Packit Service 509fd4
					{
Packit Service 509fd4
						"status": "failure"
Packit Service 509fd4
					},
Packit Service 509fd4
					{
Packit Service 509fd4
						"status": "success"
Packit Service 509fd4
					}
Packit Service 509fd4
				],
Packit Service 509fd4
				"koji_build_id": 42,
Packit Service 509fd4
				"koji_task_id": 0,
Packit Service 509fd4
				"status": "failure"
Packit Service 509fd4
			}`,
Packit Service 509fd4
		},
Packit Service 509fd4
		{
Packit Service 509fd4
			initResult: worker.KojiInitJobResult{
Packit Service 509fd4
				BuildID: 42,
Packit Service 509fd4
				Token:   `"foobar"`,
Packit Service 509fd4
			},
Packit Service 509fd4
			buildResult: worker.OSBuildKojiJobResult{
Packit Service 509fd4
				Arch:      "x86_64",
Packit Service 509fd4
				HostOS:    "fedora-30",
Packit Service 509fd4
				ImageHash: "browns",
Packit Service 509fd4
				ImageSize: 42,
Packit Service 509fd4
				OSBuildOutput: &osbuild.Result{
Packit Service 509fd4
					Success: true,
Packit Service 509fd4
				},
Packit Service 509fd4
			},
Packit Service 509fd4
			finalizeResult: worker.KojiFinalizeJobResult{
Packit Service 509fd4
				KojiError: "failure",
Packit Service 509fd4
			},
Packit Service 509fd4
			composeReplyCode: http.StatusCreated,
Packit Service 509fd4
			composeReply:     `{"koji_build_id":42}`,
Packit Service 509fd4
			composeStatus: `{
Packit Service 509fd4
				"image_statuses": [
Packit Service 509fd4
					{
Packit Service 509fd4
						"status": "success"
Packit Service 509fd4
					},
Packit Service 509fd4
					{
Packit Service 509fd4
						"status": "success"
Packit Service 509fd4
					}
Packit Service 509fd4
				],
Packit Service 509fd4
				"koji_build_id": 42,
Packit Service 509fd4
				"koji_task_id": 0,
Packit Service 509fd4
				"status": "failure"
Packit Service 509fd4
			}`,
Packit Service 509fd4
		},
Packit Service 509fd4
	}
Packit Service 509fd4
	for _, c := range cases {
Packit Service 509fd4
		var wg sync.WaitGroup
Packit Service 509fd4
		wg.Add(1)
Packit Service 509fd4
Packit Service 509fd4
		go func(t *testing.T, result worker.KojiInitJobResult) {
Packit Service 509fd4
			token, _, jobType, rawJob, _, err := workerServer.RequestJob(context.Background(), "x86_64", []string{"koji-init"})
Packit Service 509fd4
			require.NoError(t, err)
Packit Service 509fd4
			require.Equal(t, "koji-init", jobType)
Packit Service 509fd4
Packit Service 509fd4
			var initJob worker.KojiInitJob
Packit Service 509fd4
			err = json.Unmarshal(rawJob, &initJob)
Packit Service 509fd4
			require.NoError(t, err)
Packit Service 509fd4
			require.Equal(t, "koji.example.com", initJob.Server)
Packit Service 509fd4
			require.Equal(t, "foo", initJob.Name)
Packit Service 509fd4
			require.Equal(t, "1", initJob.Version)
Packit Service 509fd4
			require.Equal(t, "2", initJob.Release)
Packit Service 509fd4
Packit Service 509fd4
			initJobResult, err := json.Marshal(&jobResult{Result: result})
Packit Service 509fd4
			require.NoError(t, err)
Packit Service 509fd4
			test.TestRoute(t, workerHandler, false, "PATCH", fmt.Sprintf("/api/worker/v1/jobs/%v", token), string(initJobResult), http.StatusOK, `{}`)
Packit Service 509fd4
Packit Service 509fd4
			wg.Done()
Packit Service 509fd4
		}(t, c.initResult)
Packit Service 509fd4
Packit Service 509fd4
		test.TestRoute(t, handler, false, "POST", "/api/composer-koji/v1/compose", `
Packit Service 509fd4
		{
Packit Service 509fd4
			"name":"foo",
Packit Service 509fd4
			"version":"1",
Packit Service 509fd4
			"release":"2",
Packit Service 509fd4
			"distribution":"fedora-30",
Packit Service 509fd4
			"image_requests": [
Packit Service 509fd4
				{
Packit Service 509fd4
					"architecture": "x86_64",
Packit Service 509fd4
					"image_type": "qcow2",
Packit Service 509fd4
					"repositories": [
Packit Service 509fd4
						{
Packit Service 509fd4
							"baseurl": "https://repo.example.com/"
Packit Service 509fd4
						}
Packit Service 509fd4
					]
Packit Service 509fd4
				},
Packit Service 509fd4
				{
Packit Service 509fd4
					"architecture": "x86_64",
Packit Service 509fd4
					"image_type": "qcow2",
Packit Service 509fd4
					"repositories": [
Packit Service 509fd4
						{
Packit Service 509fd4
							"baseurl": "https://repo.example.com/"
Packit Service 509fd4
						}
Packit Service 509fd4
					]
Packit Service 509fd4
				}
Packit Service 509fd4
			],
Packit Service 509fd4
			"koji": {
Packit Service 509fd4
				"server": "koji.example.com"
Packit Service 509fd4
			}
Packit Service 509fd4
		}`, c.composeReplyCode, c.composeReply, "id")
Packit Service 509fd4
		wg.Wait()
Packit Service 509fd4
Packit Service 509fd4
		token, _, jobType, rawJob, _, err := workerServer.RequestJob(context.Background(), "x86_64", []string{"osbuild-koji"})
Packit Service 509fd4
		require.NoError(t, err)
Packit Service 509fd4
		require.Equal(t, "osbuild-koji", jobType)
Packit Service 509fd4
Packit Service 509fd4
		var osbuildJob worker.OSBuildKojiJob
Packit Service 509fd4
		err = json.Unmarshal(rawJob, &osbuildJob)
Packit Service 509fd4
		require.NoError(t, err)
Packit Service 509fd4
		require.Equal(t, "koji.example.com", osbuildJob.KojiServer)
Packit Service 509fd4
		require.Equal(t, "test.img", osbuildJob.ImageName)
Packit Service 509fd4
		require.NotEmpty(t, osbuildJob.KojiDirectory)
Packit Service 509fd4
Packit Service 509fd4
		buildJobResult, err := json.Marshal(&jobResult{Result: c.buildResult})
Packit Service 509fd4
		require.NoError(t, err)
Packit Service 509fd4
		test.TestRoute(t, workerHandler, false, "PATCH", fmt.Sprintf("/api/worker/v1/jobs/%v", token), string(buildJobResult), http.StatusOK, `{}`)
Packit Service 509fd4
Packit Service 509fd4
		token, _, jobType, rawJob, _, err = workerServer.RequestJob(context.Background(), "x86_64", []string{"osbuild-koji"})
Packit Service 509fd4
		require.NoError(t, err)
Packit Service 509fd4
		require.Equal(t, "osbuild-koji", jobType)
Packit Service 509fd4
Packit Service 509fd4
		err = json.Unmarshal(rawJob, &osbuildJob)
Packit Service 509fd4
		require.NoError(t, err)
Packit Service 509fd4
		require.Equal(t, "koji.example.com", osbuildJob.KojiServer)
Packit Service 509fd4
		require.Equal(t, "test.img", osbuildJob.ImageName)
Packit Service 509fd4
		require.NotEmpty(t, osbuildJob.KojiDirectory)
Packit Service 509fd4
Packit Service 509fd4
		test.TestRoute(t, workerHandler, false, "PATCH", fmt.Sprintf("/api/worker/v1/jobs/%v", token), `{
Packit Service 509fd4
			"result": {
Packit Service 509fd4
				"arch": "x86_64",
Packit Service 509fd4
				"host_os": "fedora-30",
Packit Service 509fd4
				"image_hash": "browns",
Packit Service 509fd4
				"image_size": 42,
Packit Service 509fd4
				"osbuild_output": {
Packit Service 509fd4
					"success": true
Packit Service 509fd4
				}
Packit Service 509fd4
			}
Packit Service 509fd4
		}`, http.StatusOK, `{}`)
Packit Service 509fd4
Packit Service 509fd4
		token, finalizeID, jobType, rawJob, _, err := workerServer.RequestJob(context.Background(), "x86_64", []string{"koji-finalize"})
Packit Service 509fd4
		require.NoError(t, err)
Packit Service 509fd4
		require.Equal(t, "koji-finalize", jobType)
Packit Service 509fd4
Packit Service 509fd4
		var kojiFinalizeJob worker.KojiFinalizeJob
Packit Service 509fd4
		err = json.Unmarshal(rawJob, &kojiFinalizeJob)
Packit Service 509fd4
		require.NoError(t, err)
Packit Service 509fd4
		require.Equal(t, "koji.example.com", kojiFinalizeJob.Server)
Packit Service 509fd4
		require.Equal(t, "1", kojiFinalizeJob.Version)
Packit Service 509fd4
		require.Equal(t, "2", kojiFinalizeJob.Release)
Packit Service 509fd4
		require.ElementsMatch(t, []string{"foo-1-2.x86_64.img", "foo-1-2.x86_64.img"}, kojiFinalizeJob.KojiFilenames)
Packit Service 509fd4
		require.NotEmpty(t, kojiFinalizeJob.KojiDirectory)
Packit Service 509fd4
Packit Service 509fd4
		finalizeResult, err := json.Marshal(&jobResult{Result: c.finalizeResult})
Packit Service 509fd4
		require.NoError(t, err)
Packit Service 509fd4
		test.TestRoute(t, workerHandler, false, "PATCH", fmt.Sprintf("/api/worker/v1/jobs/%v", token), string(finalizeResult), http.StatusOK, `{}`)
Packit Service 509fd4
Packit Service 509fd4
		test.TestRoute(t, handler, false, "GET", fmt.Sprintf("/api/composer-koji/v1/compose/%v", finalizeID), ``, http.StatusOK, c.composeStatus)
Packit Service 509fd4
	}
Packit Service 509fd4
}
Packit Service 509fd4
Packit Service 509fd4
func TestRequest(t *testing.T) {
Packit Service 509fd4
	dir, err := ioutil.TempDir("", "osbuild-composer-test-kojiapi-")
Packit Service 509fd4
	if err != nil {
Packit Service 509fd4
		log.Fatal(err)
Packit Service 509fd4
	}
Packit Service 509fd4
	defer os.RemoveAll(dir)
Packit Service 509fd4
Packit Service 509fd4
	server, _ := newTestKojiServer(t, dir)
Packit Service 509fd4
	handler := server.Handler("/api/composer-koji/v1")
Packit Service 509fd4
Packit Service 509fd4
	// Make request to an invalid route
Packit Service 509fd4
	req := httptest.NewRequest("GET", "/invalidroute", nil)
Packit Service 509fd4
Packit Service 509fd4
	rec := httptest.NewRecorder()
Packit Service 509fd4
	handler.ServeHTTP(rec, req)
Packit Service 509fd4
	resp := rec.Result()
Packit Service 509fd4
Packit Service 509fd4
	var status api.Status
Packit Service 509fd4
	err = json.NewDecoder(resp.Body).Decode(&status)
Packit Service 509fd4
	require.NoError(t, err)
Packit Service 509fd4
	require.Equal(t, http.StatusNotFound, resp.StatusCode)
Packit Service 509fd4
Packit Service 509fd4
	// Trigger an error 400 code
Packit Service 509fd4
	req = httptest.NewRequest("GET", "/api/composer-koji/v1/compose/badid", nil)
Packit Service 509fd4
Packit Service 509fd4
	rec = httptest.NewRecorder()
Packit Service 509fd4
	handler.ServeHTTP(rec, req)
Packit Service 509fd4
	resp = rec.Result()
Packit Service 509fd4
Packit Service 509fd4
	err = json.NewDecoder(resp.Body).Decode(&status)
Packit Service 509fd4
	require.NoError(t, err)
Packit Service 509fd4
	require.Equal(t, http.StatusBadRequest, resp.StatusCode)
Packit Service 509fd4
}