Blame internal/upload/koji/koji_test.go

Packit 63bb0d
//+build koji_test
Packit 63bb0d
Packit 63bb0d
package koji_test
Packit 63bb0d
Packit 63bb0d
import (
Packit 63bb0d
	"crypto/rand"
Packit 63bb0d
	"io"
Packit 63bb0d
	"io/ioutil"
Packit 63bb0d
	"os"
Packit 63bb0d
	"os/exec"
Packit 63bb0d
	"strconv"
Packit 63bb0d
	"testing"
Packit 63bb0d
	"time"
Packit 63bb0d
Packit 63bb0d
	"github.com/google/uuid"
Packit 63bb0d
	"github.com/stretchr/testify/assert"
Packit 63bb0d
	"github.com/stretchr/testify/require"
Packit 63bb0d
Packit 63bb0d
	"github.com/osbuild/osbuild-composer/internal/upload/koji"
Packit 63bb0d
)
Packit 63bb0d
Packit 63bb0d
func TestKojiImport(t *testing.T) {
Packit 63bb0d
	// define constants
Packit 63bb0d
	server := "http://localhost:8080/kojihub"
Packit 63bb0d
	user := "osbuild"
Packit 63bb0d
	password := "osbuildpass"
Packit 63bb0d
	filename := "image.qcow2"
Packit 63bb0d
	filesize := 1024
Packit 63bb0d
	// you cannot create two build with a same name, let's create a random one each time
Packit 63bb0d
	buildName := "osbuild-image-" + uuid.Must(uuid.NewRandom()).String()
Packit 63bb0d
	// koji needs to specify a directory to which the upload should happen, let's reuse the build name
Packit 63bb0d
	uploadDirectory := buildName
Packit 63bb0d
Packit 63bb0d
	// authenticate
Packit 63bb0d
	k, err := koji.New(server)
Packit 63bb0d
	require.NoError(t, err)
Packit 63bb0d
	err = k.Login(user, password)
Packit 63bb0d
	require.NoError(t, err)
Packit 63bb0d
Packit 63bb0d
	defer func() {
Packit 63bb0d
		err := k.Logout()
Packit 63bb0d
		if err != nil {
Packit 63bb0d
			require.NoError(t, err)
Packit 63bb0d
		}
Packit 63bb0d
	}()
Packit 63bb0d
Packit 63bb0d
	// Create a random file
Packit 63bb0d
	f, err := ioutil.TempFile("", "osbuild-koji-test-*.qcow2")
Packit 63bb0d
	require.NoError(t, err)
Packit 63bb0d
	defer func() {
Packit 63bb0d
		assert.NoError(t, f.Close())
Packit 63bb0d
		assert.NoError(t, os.Remove(f.Name()))
Packit 63bb0d
	}()
Packit 63bb0d
Packit 63bb0d
	_, err = io.CopyN(f, rand.Reader, int64(filesize))
Packit 63bb0d
	require.NoError(t, err)
Packit 63bb0d
	_, err = f.Seek(0, io.SeekStart)
Packit 63bb0d
	require.NoError(t, err)
Packit 63bb0d
Packit 63bb0d
	// Upload the file
Packit 63bb0d
	hash, _, err := k.Upload(f, uploadDirectory, filename)
Packit 63bb0d
	require.NoError(t, err)
Packit 63bb0d
Packit 63bb0d
	// Import the build
Packit 63bb0d
	build := koji.Build{
Packit 63bb0d
		Name:      buildName,
Packit 63bb0d
		Version:   "1",
Packit 63bb0d
		Release:   "1",
Packit 63bb0d
		StartTime: time.Now().Unix(),
Packit 63bb0d
		EndTime:   time.Now().Unix(),
Packit 63bb0d
	}
Packit 63bb0d
	buildRoots := []koji.BuildRoot{
Packit 63bb0d
		{
Packit 63bb0d
			ID: 1,
Packit 63bb0d
			Host: koji.Host{
Packit 63bb0d
				Os:   "RHEL8",
Packit 63bb0d
				Arch: "noarch",
Packit 63bb0d
			},
Packit 63bb0d
			ContentGenerator: koji.ContentGenerator{
Packit 63bb0d
				Name:    "osbuild",
Packit 63bb0d
				Version: "1",
Packit 63bb0d
			},
Packit 63bb0d
			Container: koji.Container{
Packit 63bb0d
				Type: "nspawn",
Packit 63bb0d
				Arch: "noarch",
Packit 63bb0d
			},
Packit 63bb0d
			Tools:      []koji.Tool{},
Packit 63bb0d
			Components: []koji.Component{},
Packit 63bb0d
		},
Packit 63bb0d
	}
Packit 63bb0d
	output := []koji.Output{
Packit 63bb0d
		{
Packit 63bb0d
			BuildRootID:  1,
Packit 63bb0d
			Filename:     filename,
Packit 63bb0d
			FileSize:     uint64(filesize),
Packit 63bb0d
			Arch:         "noarch",
Packit 63bb0d
			ChecksumType: "md5",
Packit 63bb0d
			MD5:          hash,
Packit 63bb0d
			Type:         "image",
Packit 63bb0d
			Components:   []koji.Component{},
Packit 63bb0d
			Extra: koji.OutputExtra{
Packit 63bb0d
				Image: koji.OutputExtraImageInfo{
Packit 63bb0d
					Arch: "noarch",
Packit 63bb0d
				},
Packit 63bb0d
			},
Packit 63bb0d
		},
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	result, err := k.CGImport(build, buildRoots, output, uploadDirectory)
Packit 63bb0d
	require.NoError(t, err)
Packit 63bb0d
Packit 63bb0d
	// check if the build is really there:
Packit 63bb0d
	cmd := exec.Command(
Packit 63bb0d
		"koji",
Packit 63bb0d
		"--server", server,
Packit 63bb0d
		"--user", user,
Packit 63bb0d
		"--password", password,
Packit 63bb0d
		"--authtype", "password",
Packit 63bb0d
		"list-builds",
Packit 63bb0d
		"--buildid", strconv.Itoa(result.BuildID),
Packit 63bb0d
	)
Packit 63bb0d
Packit 63bb0d
	// sample output:
Packit 63bb0d
	// Build                                                    Built by          State
Packit 63bb0d
	// -------------------------------------------------------  ----------------  ----------------
Packit 63bb0d
	// osbuild-image-92882b90-4bd9-4422-8b8a-40863f94535a-1-1   osbuild           COMPLETE
Packit 63bb0d
	out, err := cmd.CombinedOutput()
Packit 63bb0d
	assert.NoError(t, err)
Packit 63bb0d
Packit 63bb0d
	// let's check for COMPLETE, koji will exit with non-zero status code if the build doesn't exist
Packit 63bb0d
	assert.Contains(t, string(out), "COMPLETE")
Packit 63bb0d
}