Blame internal/worker/server_test.go

Packit 63bb0d
package worker_test
Packit 63bb0d
Packit 63bb0d
import (
Packit Service 509fd4
	"context"
Packit 63bb0d
	"fmt"
Packit Service 3a6627
	"io/ioutil"
Packit 63bb0d
	"net/http"
Packit Service 3a6627
	"os"
Packit 63bb0d
	"testing"
Packit 63bb0d
Packit Service 3a6627
	"github.com/google/uuid"
Packit 63bb0d
	"github.com/stretchr/testify/require"
Packit 63bb0d
Packit 63bb0d
	"github.com/osbuild/osbuild-composer/internal/distro"
Packit 63bb0d
	"github.com/osbuild/osbuild-composer/internal/distro/fedoratest"
Packit Service 3a6627
	"github.com/osbuild/osbuild-composer/internal/jobqueue/fsjobqueue"
Packit 63bb0d
	"github.com/osbuild/osbuild-composer/internal/test"
Packit 63bb0d
	"github.com/osbuild/osbuild-composer/internal/worker"
Packit 63bb0d
)
Packit 63bb0d
Packit Service 3a6627
func newTestServer(t *testing.T, tempdir string) *worker.Server {
Packit Service 3a6627
	q, err := fsjobqueue.New(tempdir)
Packit Service 3a6627
	if err != nil {
Packit Service 3a6627
		t.Fatalf("error creating fsjobqueue: %v", err)
Packit Service 3a6627
	}
Packit Service 3a6627
	return worker.NewServer(nil, q, "")
Packit Service 3a6627
}
Packit Service 3a6627
Packit 63bb0d
// Ensure that the status request returns OK.
Packit 63bb0d
func TestStatus(t *testing.T) {
Packit Service 3a6627
	tempdir, err := ioutil.TempDir("", "worker-tests-")
Packit Service 3a6627
	require.NoError(t, err)
Packit Service 3a6627
	defer os.RemoveAll(tempdir)
Packit Service 3a6627
Packit Service 3a6627
	server := newTestServer(t, tempdir)
Packit Service 509fd4
	handler := server.Handler()
Packit Service 509fd4
	test.TestRoute(t, handler, false, "GET", "/api/worker/v1/status", ``, http.StatusOK, `{"status":"OK"}`, "message")
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
func TestErrors(t *testing.T) {
Packit 63bb0d
	var cases = []struct {
Packit 63bb0d
		Method         string
Packit 63bb0d
		Path           string
Packit 63bb0d
		Body           string
Packit 63bb0d
		ExpectedStatus int
Packit 63bb0d
	}{
Packit 63bb0d
		// Bogus path
Packit Service 509fd4
		{"GET", "/api/worker/v1/foo", ``, http.StatusNotFound},
Packit 63bb0d
		// Create job with invalid body
Packit Service 509fd4
		{"POST", "/api/worker/v1/jobs", ``, http.StatusBadRequest},
Packit 63bb0d
		// Wrong method
Packit Service 509fd4
		{"GET", "/api/worker/v1/jobs", ``, http.StatusMethodNotAllowed},
Packit 63bb0d
		// Update job with invalid ID
Packit Service 509fd4
		{"PATCH", "/api/worker/v1/jobs/foo", `{"status":"FINISHED"}`, http.StatusBadRequest},
Packit 63bb0d
		// Update job that does not exist, with invalid body
Packit Service 509fd4
		{"PATCH", "/api/worker/v1/jobs/aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", ``, http.StatusBadRequest},
Packit 63bb0d
		// Update job that does not exist
Packit Service 509fd4
		{"PATCH", "/api/worker/v1/jobs/aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", `{"status":"FINISHED"}`, http.StatusNotFound},
Packit 63bb0d
	}
Packit 63bb0d
Packit Service 3a6627
	tempdir, err := ioutil.TempDir("", "worker-tests-")
Packit Service 3a6627
	require.NoError(t, err)
Packit Service 3a6627
	defer os.RemoveAll(tempdir)
Packit Service 3a6627
Packit 63bb0d
	for _, c := range cases {
Packit Service 3a6627
		server := newTestServer(t, tempdir)
Packit Service 509fd4
		handler := server.Handler()
Packit Service 509fd4
		test.TestRoute(t, handler, false, c.Method, c.Path, c.Body, c.ExpectedStatus, "{}", "message")
Packit 63bb0d
	}
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
func TestCreate(t *testing.T) {
Packit Service 3a6627
	tempdir, err := ioutil.TempDir("", "worker-tests-")
Packit Service 3a6627
	require.NoError(t, err)
Packit Service 3a6627
	defer os.RemoveAll(tempdir)
Packit Service 3a6627
Packit 63bb0d
	distroStruct := fedoratest.New()
Packit 63bb0d
	arch, err := distroStruct.GetArch("x86_64")
Packit 63bb0d
	if err != nil {
Packit 63bb0d
		t.Fatalf("error getting arch from distro")
Packit 63bb0d
	}
Packit 63bb0d
	imageType, err := arch.GetImageType("qcow2")
Packit 63bb0d
	if err != nil {
Packit 63bb0d
		t.Fatalf("error getting image type from arch")
Packit 63bb0d
	}
Packit Service 15f37d
	manifest, err := imageType.Manifest(nil, distro.ImageOptions{Size: imageType.Size(0)}, nil, nil, 0)
Packit 63bb0d
	if err != nil {
Packit 63bb0d
		t.Fatalf("error creating osbuild manifest")
Packit 63bb0d
	}
Packit Service 3a6627
	server := newTestServer(t, tempdir)
Packit Service 509fd4
	handler := server.Handler()
Packit 63bb0d
Packit Service 509fd4
	_, err = server.EnqueueOSBuild(arch.Name(), &worker.OSBuildJob{Manifest: manifest})
Packit 63bb0d
	require.NoError(t, err)
Packit 63bb0d
Packit Service 509fd4
	test.TestRoute(t, handler, false, "POST", "/api/worker/v1/jobs", `{"types":["osbuild"],"arch":"x86_64"}`, http.StatusCreated,
Packit Service 509fd4
		`{"type":"osbuild","args":{"manifest":{"pipeline":{},"sources":{}}}}`, "id", "location", "artifact_location")
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
func TestCancel(t *testing.T) {
Packit Service 3a6627
	tempdir, err := ioutil.TempDir("", "worker-tests-")
Packit Service 3a6627
	require.NoError(t, err)
Packit Service 3a6627
	defer os.RemoveAll(tempdir)
Packit Service 3a6627
Packit 63bb0d
	distroStruct := fedoratest.New()
Packit 63bb0d
	arch, err := distroStruct.GetArch("x86_64")
Packit 63bb0d
	if err != nil {
Packit 63bb0d
		t.Fatalf("error getting arch from distro")
Packit 63bb0d
	}
Packit 63bb0d
	imageType, err := arch.GetImageType("qcow2")
Packit 63bb0d
	if err != nil {
Packit 63bb0d
		t.Fatalf("error getting image type from arch")
Packit 63bb0d
	}
Packit Service 15f37d
	manifest, err := imageType.Manifest(nil, distro.ImageOptions{Size: imageType.Size(0)}, nil, nil, 0)
Packit 63bb0d
	if err != nil {
Packit 63bb0d
		t.Fatalf("error creating osbuild manifest")
Packit 63bb0d
	}
Packit Service 3a6627
	server := newTestServer(t, tempdir)
Packit Service 509fd4
	handler := server.Handler()
Packit Service 509fd4
Packit Service 509fd4
	jobId, err := server.EnqueueOSBuild(arch.Name(), &worker.OSBuildJob{Manifest: manifest})
Packit Service 509fd4
	require.NoError(t, err)
Packit 63bb0d
Packit Service 509fd4
	token, j, typ, args, dynamicArgs, err := server.RequestJob(context.Background(), arch.Name(), []string{"osbuild"})
Packit 63bb0d
	require.NoError(t, err)
Packit Service 509fd4
	require.Equal(t, jobId, j)
Packit Service 509fd4
	require.Equal(t, "osbuild", typ)
Packit Service 509fd4
	require.NotNil(t, args)
Packit Service 509fd4
	require.Nil(t, dynamicArgs)
Packit 63bb0d
Packit Service 509fd4
	test.TestRoute(t, handler, false, "GET", fmt.Sprintf("/api/worker/v1/jobs/%s", token), `{}`, http.StatusOK,
Packit Service 509fd4
		`{"canceled":false}`)
Packit 63bb0d
Packit Service 509fd4
	err = server.Cancel(jobId)
Packit 63bb0d
	require.NoError(t, err)
Packit 63bb0d
Packit Service 509fd4
	test.TestRoute(t, handler, false, "GET", fmt.Sprintf("/api/worker/v1/jobs/%s", token), `{}`, http.StatusOK,
Packit Service 509fd4
		`{"canceled":true}`)
Packit 63bb0d
}
Packit 63bb0d
Packit Service 509fd4
func TestUpdate(t *testing.T) {
Packit Service 3a6627
	tempdir, err := ioutil.TempDir("", "worker-tests-")
Packit Service 3a6627
	require.NoError(t, err)
Packit Service 3a6627
	defer os.RemoveAll(tempdir)
Packit Service 3a6627
Packit 63bb0d
	distroStruct := fedoratest.New()
Packit 63bb0d
	arch, err := distroStruct.GetArch("x86_64")
Packit 63bb0d
	if err != nil {
Packit 63bb0d
		t.Fatalf("error getting arch from distro")
Packit 63bb0d
	}
Packit 63bb0d
	imageType, err := arch.GetImageType("qcow2")
Packit 63bb0d
	if err != nil {
Packit 63bb0d
		t.Fatalf("error getting image type from arch")
Packit 63bb0d
	}
Packit Service 15f37d
	manifest, err := imageType.Manifest(nil, distro.ImageOptions{Size: imageType.Size(0)}, nil, nil, 0)
Packit Service 509fd4
	if err != nil {
Packit Service 509fd4
		t.Fatalf("error creating osbuild manifest")
Packit Service 509fd4
	}
Packit Service 3a6627
	server := newTestServer(t, tempdir)
Packit Service 509fd4
	handler := server.Handler()
Packit 63bb0d
Packit Service 509fd4
	jobId, err := server.EnqueueOSBuild(arch.Name(), &worker.OSBuildJob{Manifest: manifest})
Packit Service 509fd4
	require.NoError(t, err)
Packit 63bb0d
Packit Service 509fd4
	token, j, typ, args, dynamicArgs, err := server.RequestJob(context.Background(), arch.Name(), []string{"osbuild"})
Packit Service 509fd4
	require.NoError(t, err)
Packit Service 509fd4
	require.Equal(t, jobId, j)
Packit Service 509fd4
	require.Equal(t, "osbuild", typ)
Packit Service 509fd4
	require.NotNil(t, args)
Packit Service 509fd4
	require.Nil(t, dynamicArgs)
Packit Service 509fd4
Packit Service 509fd4
	test.TestRoute(t, handler, false, "PATCH", fmt.Sprintf("/api/worker/v1/jobs/%s", token), `{}`, http.StatusOK, `{}`)
Packit Service 509fd4
	test.TestRoute(t, handler, false, "PATCH", fmt.Sprintf("/api/worker/v1/jobs/%s", token), `{}`, http.StatusNotFound, `*`)
Packit 63bb0d
}
Packit 63bb0d
Packit Service 3a6627
func TestArgs(t *testing.T) {
Packit Service 3a6627
	distroStruct := fedoratest.New()
Packit Service 3a6627
	arch, err := distroStruct.GetArch("x86_64")
Packit Service 3a6627
	require.NoError(t, err)
Packit Service 3a6627
	imageType, err := arch.GetImageType("qcow2")
Packit Service 3a6627
	require.NoError(t, err)
Packit Service 15f37d
	manifest, err := imageType.Manifest(nil, distro.ImageOptions{Size: imageType.Size(0)}, nil, nil, 0)
Packit Service 3a6627
	require.NoError(t, err)
Packit Service 3a6627
Packit Service 3a6627
	tempdir, err := ioutil.TempDir("", "worker-tests-")
Packit Service 3a6627
	require.NoError(t, err)
Packit Service 3a6627
	defer os.RemoveAll(tempdir)
Packit Service 3a6627
	server := newTestServer(t, tempdir)
Packit Service 3a6627
Packit Service 3a6627
	job := worker.OSBuildJob{
Packit Service 3a6627
		Manifest:  manifest,
Packit Service 3a6627
		ImageName: "test-image",
Packit Service 3a6627
	}
Packit Service 3a6627
	jobId, err := server.EnqueueOSBuild(arch.Name(), &job)
Packit Service 3a6627
	require.NoError(t, err)
Packit Service 3a6627
Packit Service 3a6627
	_, _, _, args, _, err := server.RequestJob(context.Background(), arch.Name(), []string{"osbuild"})
Packit Service 3a6627
	require.NoError(t, err)
Packit Service 3a6627
	require.NotNil(t, args)
Packit Service 3a6627
Packit Service 3a6627
	var jobArgs worker.OSBuildJob
Packit Service 3a6627
	jobType, rawArgs, deps, err := server.Job(jobId, &jobArgs)
Packit Service 3a6627
	require.NoError(t, err)
Packit Service 3a6627
	require.Equal(t, args, rawArgs)
Packit Service 3a6627
	require.Equal(t, job, jobArgs)
Packit Service 3a6627
	require.Equal(t, jobType, "osbuild:"+arch.Name())
Packit Service 3a6627
	require.Equal(t, []uuid.UUID(nil), deps)
Packit Service 3a6627
}
Packit Service 3a6627
Packit Service 509fd4
func TestUpload(t *testing.T) {
Packit Service 3a6627
	tempdir, err := ioutil.TempDir("", "worker-tests-")
Packit Service 3a6627
	require.NoError(t, err)
Packit Service 3a6627
	defer os.RemoveAll(tempdir)
Packit Service 3a6627
Packit Service 509fd4
	distroStruct := fedoratest.New()
Packit Service 509fd4
	arch, err := distroStruct.GetArch("x86_64")
Packit Service 509fd4
	if err != nil {
Packit Service 509fd4
		t.Fatalf("error getting arch from distro")
Packit 63bb0d
	}
Packit Service 509fd4
	imageType, err := arch.GetImageType("qcow2")
Packit Service 509fd4
	if err != nil {
Packit Service 509fd4
		t.Fatalf("error getting image type from arch")
Packit Service 509fd4
	}
Packit Service 15f37d
	manifest, err := imageType.Manifest(nil, distro.ImageOptions{Size: imageType.Size(0)}, nil, nil, 0)
Packit Service 509fd4
	if err != nil {
Packit Service 509fd4
		t.Fatalf("error creating osbuild manifest")
Packit 63bb0d
	}
Packit Service 3a6627
	server := newTestServer(t, tempdir)
Packit Service 509fd4
	handler := server.Handler()
Packit Service 509fd4
Packit Service 509fd4
	jobID, err := server.EnqueueOSBuild(arch.Name(), &worker.OSBuildJob{Manifest: manifest})
Packit Service 509fd4
	require.NoError(t, err)
Packit Service 509fd4
Packit Service 509fd4
	token, j, typ, args, dynamicArgs, err := server.RequestJob(context.Background(), arch.Name(), []string{"osbuild"})
Packit Service 509fd4
	require.NoError(t, err)
Packit Service 509fd4
	require.Equal(t, jobID, j)
Packit Service 509fd4
	require.Equal(t, "osbuild", typ)
Packit Service 509fd4
	require.NotNil(t, args)
Packit Service 509fd4
	require.Nil(t, dynamicArgs)
Packit Service 509fd4
Packit Service 509fd4
	test.TestRoute(t, handler, false, "PUT", fmt.Sprintf("/api/worker/v1/jobs/%s/artifacts/foobar", token), `this is my artifact`, http.StatusOK, `?`)
Packit 63bb0d
}