|
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 |
3a6627 |
"time"
|
|
Packit Service |
509fd4 |
|
|
Packit Service |
3a6627 |
"github.com/google/uuid"
|
|
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 |
3a6627 |
rpm_fixture := rpmmd_mock.BaseFixture(dir)
|
|
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 |
3a6627 |
kojiServer := kojiapi.NewServer(nil, rpm_fixture.Workers, rpm, distros)
|
|
Packit Service |
509fd4 |
require.NotNil(t, kojiServer)
|
|
Packit Service |
509fd4 |
|
|
Packit Service |
3a6627 |
return kojiServer, rpm_fixture.Workers
|
|
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 |
3a6627 |
|
|
Packit Service |
3a6627 |
test.TestRoute(t, handler, false, "GET", fmt.Sprintf("/api/composer-koji/v1/compose/%v/manifests", finalizeID), ``, http.StatusOK, `[{"pipeline": {}, "sources": {}}, {"pipeline": {}, "sources": {}}]`)
|
|
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 |
}
|
|
Packit Service |
3a6627 |
|
|
Packit Service |
3a6627 |
func TestJobTypeValidation(t *testing.T) {
|
|
Packit Service |
3a6627 |
dir, err := ioutil.TempDir("", "osbuild-composer-test-kojiapi-")
|
|
Packit Service |
3a6627 |
if err != nil {
|
|
Packit Service |
3a6627 |
log.Fatal(err)
|
|
Packit Service |
3a6627 |
}
|
|
Packit Service |
3a6627 |
defer os.RemoveAll(dir)
|
|
Packit Service |
3a6627 |
|
|
Packit Service |
3a6627 |
server, workers := newTestKojiServer(t, dir)
|
|
Packit Service |
3a6627 |
handler := server.Handler("/api/composer-koji/v1")
|
|
Packit Service |
3a6627 |
|
|
Packit Service |
3a6627 |
// Enqueue a compose job with N images (+ an Init and a Finalize job)
|
|
Packit Service |
3a6627 |
// Enqueuing them manually gives us access to the job IDs to use in
|
|
Packit Service |
3a6627 |
// requests.
|
|
Packit Service |
3a6627 |
nImages := 4
|
|
Packit Service |
3a6627 |
initJob := worker.KojiInitJob{
|
|
Packit Service |
3a6627 |
Server: "test-server",
|
|
Packit Service |
3a6627 |
Name: "test-job",
|
|
Packit Service |
3a6627 |
Version: "42",
|
|
Packit Service |
3a6627 |
Release: "1",
|
|
Packit Service |
3a6627 |
}
|
|
Packit Service |
3a6627 |
initID, err := workers.EnqueueKojiInit(&initJob)
|
|
Packit Service |
3a6627 |
require.NoError(t, err)
|
|
Packit Service |
3a6627 |
|
|
Packit Service |
3a6627 |
buildJobs := make([]worker.OSBuildKojiJob, nImages)
|
|
Packit Service |
3a6627 |
buildJobIDs := make([]uuid.UUID, nImages)
|
|
Packit Service |
3a6627 |
filenames := make([]string, nImages)
|
|
Packit Service |
3a6627 |
for idx := 0; idx < nImages; idx++ {
|
|
Packit Service |
3a6627 |
fname := fmt.Sprintf("image-file-%04d", idx)
|
|
Packit Service |
3a6627 |
buildJob := worker.OSBuildKojiJob{
|
|
Packit Service |
3a6627 |
ImageName: fmt.Sprintf("build-job-%04d", idx),
|
|
Packit Service |
3a6627 |
KojiServer: "test-server",
|
|
Packit Service |
3a6627 |
KojiDirectory: "koji-server-test-dir",
|
|
Packit Service |
3a6627 |
KojiFilename: fname,
|
|
Packit Service |
3a6627 |
}
|
|
Packit Service |
3a6627 |
buildID, err := workers.EnqueueOSBuildKoji(fmt.Sprintf("fake-arch-%d", idx), &buildJob, initID)
|
|
Packit Service |
3a6627 |
require.NoError(t, err)
|
|
Packit Service |
3a6627 |
|
|
Packit Service |
3a6627 |
buildJobs[idx] = buildJob
|
|
Packit Service |
3a6627 |
buildJobIDs[idx] = buildID
|
|
Packit Service |
3a6627 |
filenames[idx] = fname
|
|
Packit Service |
3a6627 |
}
|
|
Packit Service |
3a6627 |
|
|
Packit Service |
3a6627 |
finalizeJob := worker.KojiFinalizeJob{
|
|
Packit Service |
3a6627 |
Server: "test-server",
|
|
Packit Service |
3a6627 |
Name: "test-job",
|
|
Packit Service |
3a6627 |
Version: "42",
|
|
Packit Service |
3a6627 |
Release: "1",
|
|
Packit Service |
3a6627 |
KojiFilenames: filenames,
|
|
Packit Service |
3a6627 |
KojiDirectory: "koji-server-test-dir",
|
|
Packit Service |
3a6627 |
TaskID: 0,
|
|
Packit Service |
3a6627 |
StartTime: uint64(time.Now().Unix()),
|
|
Packit Service |
3a6627 |
}
|
|
Packit Service |
3a6627 |
finalizeID, err := workers.EnqueueKojiFinalize(&finalizeJob, initID, buildJobIDs)
|
|
Packit Service |
3a6627 |
require.NoError(t, err)
|
|
Packit Service |
3a6627 |
|
|
Packit Service |
3a6627 |
// ----- Jobs queued - Test API endpoints (status, manifests, logs) ----- //
|
|
Packit Service |
3a6627 |
|
|
Packit Service |
3a6627 |
for _, path := range []string{"", "/manifests", "/logs"} {
|
|
Packit Service |
3a6627 |
// should return OK - actual result should be tested elsewhere
|
|
Packit Service |
3a6627 |
test.TestRoute(t, handler, false, "GET", fmt.Sprintf("/api/composer-koji/v1/compose/%s%s", finalizeID, path), ``, http.StatusOK, "*")
|
|
Packit Service |
3a6627 |
|
|
Packit Service |
3a6627 |
// The other IDs should fail
|
|
Packit Service |
3a6627 |
msg := fmt.Sprintf("Job %s not found: expected \"koji-finalize\", found \"koji-init\" job instead", initID)
|
|
Packit Service |
3a6627 |
resp, _ := json.Marshal(map[string]string{"message": msg})
|
|
Packit Service |
3a6627 |
test.TestRoute(t, handler, false, "GET", fmt.Sprintf("/api/composer-koji/v1/compose/%s%s", initID, path), ``, http.StatusNotFound, string(resp))
|
|
Packit Service |
3a6627 |
|
|
Packit Service |
3a6627 |
for idx, buildID := range buildJobIDs {
|
|
Packit Service |
3a6627 |
msg := fmt.Sprintf("Job %s not found: expected \"koji-finalize\", found \"osbuild-koji:fake-arch-%d\" job instead", buildID, idx)
|
|
Packit Service |
3a6627 |
resp, _ := json.Marshal(map[string]string{"message": msg})
|
|
Packit Service |
3a6627 |
test.TestRoute(t, handler, false, "GET", fmt.Sprintf("/api/composer-koji/v1/compose/%s%s", buildID, path), ``, http.StatusNotFound, string(resp))
|
|
Packit Service |
3a6627 |
}
|
|
Packit Service |
3a6627 |
|
|
Packit Service |
3a6627 |
badID := uuid.New()
|
|
Packit Service |
3a6627 |
msg = fmt.Sprintf("Job %s not found: job does not exist", badID)
|
|
Packit Service |
3a6627 |
resp, _ = json.Marshal(map[string]string{"message": msg})
|
|
Packit Service |
3a6627 |
test.TestRoute(t, handler, false, "GET", fmt.Sprintf("/api/composer-koji/v1/compose/%s%s", badID, path), ``, http.StatusNotFound, string(resp))
|
|
Packit Service |
3a6627 |
}
|
|
Packit Service |
3a6627 |
}
|