Blame cmd/osbuild-koji-tests/main_test.go

Packit Service 509fd4
// This command contains some tests for the koji integration. It's a bit
Packit Service 509fd4
// different from the other cmd/*-tests executables because it cannot be
Packit Service 509fd4
// currently run as a "base test". Instead, it's run as a part of the
Packit Service 509fd4
// koji.sh test because it needs a working Koji instance to pass.
Packit Service 509fd4
Packit Service 509fd4
// +build integration
Packit Service 509fd4
Packit Service 509fd4
package main
Packit Service 509fd4
Packit Service 509fd4
import (
Packit Service 509fd4
	"crypto/rand"
Packit Service 509fd4
	"crypto/tls"
Packit Service 509fd4
	"crypto/x509"
Packit Service 509fd4
	"io"
Packit Service 509fd4
	"io/ioutil"
Packit Service 509fd4
	"net/http"
Packit Service 509fd4
	"os"
Packit Service 509fd4
	"os/exec"
Packit Service 509fd4
	"strconv"
Packit Service 509fd4
	"testing"
Packit Service 509fd4
	"time"
Packit Service 509fd4
Packit Service 509fd4
	"github.com/google/uuid"
Packit Service 509fd4
	"github.com/stretchr/testify/assert"
Packit Service 509fd4
	"github.com/stretchr/testify/require"
Packit Service 509fd4
Packit Service 509fd4
	"github.com/osbuild/osbuild-composer/internal/upload/koji"
Packit Service 509fd4
)
Packit Service 509fd4
Packit Service 509fd4
func TestKojiRefund(t *testing.T) {
Packit Service 509fd4
	shareDir := "/tmp/osbuild-composer-koji-test"
Packit Service 509fd4
	server := "https://localhost:4343/kojihub"
Packit Service 509fd4
Packit Service 509fd4
	// base our transport on the default one
Packit Service 509fd4
	transport := http.DefaultTransport.(*http.Transport).Clone()
Packit Service 509fd4
Packit Service 509fd4
	// use the self-signed certificate generated by run-koji-container
Packit Service 509fd4
	certPool := x509.NewCertPool()
Packit Service 509fd4
	cert, err := ioutil.ReadFile(shareDir + "/ca-crt.pem")
Packit Service 509fd4
	require.NoError(t, err)
Packit Service 509fd4
Packit Service 509fd4
	ok := certPool.AppendCertsFromPEM(cert)
Packit Service 509fd4
	require.True(t, ok)
Packit Service 509fd4
Packit Service 509fd4
	transport.TLSClientConfig = &tls.Config{
Packit Service 509fd4
		RootCAs: certPool,
Packit Service 509fd4
	}
Packit Service 509fd4
Packit Service 509fd4
	// login
Packit Service 509fd4
	credentials := &koji.GSSAPICredentials{
Packit Service 509fd4
		Principal: "osbuild-krb@LOCAL",
Packit Service 509fd4
		KeyTab:    shareDir + "/client.keytab",
Packit Service 509fd4
	}
Packit Service 509fd4
	k, err := koji.NewFromGSSAPI(server, credentials, transport)
Packit Service 509fd4
	require.NoError(t, err)
Packit Service 509fd4
Packit Service 509fd4
	defer func() {
Packit Service 509fd4
		err := k.Logout()
Packit Service 509fd4
		if err != nil {
Packit Service 509fd4
			require.NoError(t, err)
Packit Service 509fd4
		}
Packit Service 509fd4
	}()
Packit Service 509fd4
Packit Service 509fd4
	initResult, err := k.CGInitBuild("name", "verison", "release")
Packit Service 509fd4
	require.NoError(t, err)
Packit Service 509fd4
Packit Service 509fd4
	err = k.CGCancelBuild(initResult.BuildID, initResult.Token)
Packit Service 509fd4
	require.NoError(t, err)
Packit Service 509fd4
Packit Service 509fd4
	err = k.CGCancelBuild(initResult.BuildID, initResult.Token)
Packit Service 509fd4
	require.Error(t, err)
Packit Service 509fd4
Packit Service 509fd4
	initResult, err = k.CGInitBuild("name", "verison", "release")
Packit Service 509fd4
	require.NoError(t, err)
Packit Service 509fd4
Packit Service 509fd4
	err = k.CGFailBuild(initResult.BuildID, initResult.Token)
Packit Service 509fd4
	require.NoError(t, err)
Packit Service 509fd4
Packit Service 509fd4
	err = k.CGFailBuild(initResult.BuildID, initResult.Token)
Packit Service 509fd4
	require.Error(t, err)
Packit Service 509fd4
}
Packit Service 509fd4
Packit Service 509fd4
func TestKojiImport(t *testing.T) {
Packit Service 509fd4
	// define constants
Packit Service 509fd4
	server := "https://localhost:4343/kojihub"
Packit Service 509fd4
	filename := "image.qcow2"
Packit Service 509fd4
	filesize := 1024
Packit Service 509fd4
	shareDir := "/tmp/osbuild-composer-koji-test"
Packit Service 509fd4
	// you cannot create two build with a same name, let's create a random one each time
Packit Service 509fd4
	buildName := "osbuild-image-" + uuid.Must(uuid.NewRandom()).String()
Packit Service 509fd4
	// koji needs to specify a directory to which the upload should happen, let's reuse the build name
Packit Service 509fd4
	uploadDirectory := buildName
Packit Service 509fd4
Packit Service 509fd4
	// base our transport on the default one
Packit Service 509fd4
	transport := http.DefaultTransport.(*http.Transport).Clone()
Packit Service 509fd4
Packit Service 509fd4
	// use the self-signed certificate generated by run-koji-container
Packit Service 509fd4
	certPool := x509.NewCertPool()
Packit Service 509fd4
	cert, err := ioutil.ReadFile(shareDir + "/ca-crt.pem")
Packit Service 509fd4
	require.NoError(t, err)
Packit Service 509fd4
Packit Service 509fd4
	ok := certPool.AppendCertsFromPEM(cert)
Packit Service 509fd4
	require.True(t, ok)
Packit Service 509fd4
Packit Service 509fd4
	transport.TLSClientConfig = &tls.Config{
Packit Service 509fd4
		RootCAs: certPool,
Packit Service 509fd4
	}
Packit Service 509fd4
Packit Service 509fd4
	// login
Packit Service 509fd4
	credentials := &koji.GSSAPICredentials{
Packit Service 509fd4
		Principal: "osbuild-krb@LOCAL",
Packit Service 509fd4
		KeyTab:    shareDir + "/client.keytab",
Packit Service 509fd4
	}
Packit Service 509fd4
	k, err := koji.NewFromGSSAPI(server, credentials, transport)
Packit Service 509fd4
	require.NoError(t, err)
Packit Service 509fd4
Packit Service 509fd4
	defer func() {
Packit Service 509fd4
		err := k.Logout()
Packit Service 509fd4
		if err != nil {
Packit Service 509fd4
			require.NoError(t, err)
Packit Service 509fd4
		}
Packit Service 509fd4
	}()
Packit Service 509fd4
Packit Service 509fd4
	// Create a random file
Packit Service 509fd4
	f, err := ioutil.TempFile("", "osbuild-koji-test-*.qcow2")
Packit Service 509fd4
	require.NoError(t, err)
Packit Service 509fd4
	defer func() {
Packit Service 509fd4
		assert.NoError(t, f.Close())
Packit Service 509fd4
		assert.NoError(t, os.Remove(f.Name()))
Packit Service 509fd4
	}()
Packit Service 509fd4
Packit Service 509fd4
	_, err = io.CopyN(f, rand.Reader, int64(filesize))
Packit Service 509fd4
	require.NoError(t, err)
Packit Service 509fd4
	_, err = f.Seek(0, io.SeekStart)
Packit Service 509fd4
	require.NoError(t, err)
Packit Service 509fd4
Packit Service 509fd4
	// Upload the file
Packit Service 509fd4
	hash, _, err := k.Upload(f, uploadDirectory, filename)
Packit Service 509fd4
	require.NoError(t, err)
Packit Service 509fd4
Packit Service 509fd4
	// Import the build
Packit Service 509fd4
	build := koji.ImageBuild{
Packit Service 509fd4
		TaskID:    1,
Packit Service 509fd4
		Name:      buildName,
Packit Service 509fd4
		Version:   "1",
Packit Service 509fd4
		Release:   "1",
Packit Service 509fd4
		StartTime: time.Now().Unix(),
Packit Service 509fd4
		EndTime:   time.Now().Unix(),
Packit Service 509fd4
	}
Packit Service 509fd4
	buildRoots := []koji.BuildRoot{
Packit Service 509fd4
		{
Packit Service 509fd4
			ID: 1,
Packit Service 509fd4
			Host: koji.Host{
Packit Service 509fd4
				Os:   "RHEL8",
Packit Service 509fd4
				Arch: "noarch",
Packit Service 509fd4
			},
Packit Service 509fd4
			ContentGenerator: koji.ContentGenerator{
Packit Service 509fd4
				Name:    "osbuild",
Packit Service 509fd4
				Version: "1",
Packit Service 509fd4
			},
Packit Service 509fd4
			Container: koji.Container{
Packit Service 509fd4
				Type: "nspawn",
Packit Service 509fd4
				Arch: "noarch",
Packit Service 509fd4
			},
Packit Service 509fd4
			Tools: []koji.Tool{},
Packit Service 509fd4
			RPMs:  []koji.RPM{},
Packit Service 509fd4
		},
Packit Service 509fd4
	}
Packit Service 509fd4
	output := []koji.Image{
Packit Service 509fd4
		{
Packit Service 509fd4
			BuildRootID:  1,
Packit Service 509fd4
			Filename:     filename,
Packit Service 509fd4
			FileSize:     uint64(filesize),
Packit Service 509fd4
			Arch:         "noarch",
Packit Service 509fd4
			ChecksumType: "md5",
Packit Service 509fd4
			MD5:          hash,
Packit Service 509fd4
			Type:         "image",
Packit Service 509fd4
			RPMs:         []koji.RPM{},
Packit Service 509fd4
			Extra: koji.ImageExtra{
Packit Service 509fd4
				Info: koji.ImageExtraInfo{
Packit Service 509fd4
					Arch: "noarch",
Packit Service 509fd4
				},
Packit Service 509fd4
			},
Packit Service 509fd4
		},
Packit Service 509fd4
	}
Packit Service 509fd4
Packit Service 509fd4
	initResult, err := k.CGInitBuild(build.Name, build.Version, build.Release)
Packit Service 509fd4
	require.NoError(t, err)
Packit Service 509fd4
Packit Service 509fd4
	build.BuildID = uint64(initResult.BuildID)
Packit Service 509fd4
Packit Service 509fd4
	importResult, err := k.CGImport(build, buildRoots, output, uploadDirectory, initResult.Token)
Packit Service 509fd4
	require.NoError(t, err)
Packit Service 509fd4
Packit Service 509fd4
	// check if the build is really there:
Packit Service 509fd4
	cmd := exec.Command(
Packit Service 509fd4
		"koji",
Packit Service 509fd4
		"--server", server,
Packit Service 509fd4
		"-c", "/usr/share/tests/osbuild-composer/koji/koji.conf",
Packit Service 509fd4
		"--keytab", credentials.KeyTab,
Packit Service 509fd4
		"--principal", credentials.Principal,
Packit Service 509fd4
		"list-builds",
Packit Service 509fd4
		"--buildid", strconv.Itoa(importResult.BuildID),
Packit Service 509fd4
	)
Packit Service 509fd4
Packit Service 509fd4
	// sample output:
Packit Service 509fd4
	// Build                                                    Built by          State
Packit Service 509fd4
	// -------------------------------------------------------  ----------------  ----------------
Packit Service 509fd4
	// osbuild-image-92882b90-4bd9-4422-8b8a-40863f94535a-1-1   osbuild           COMPLETE
Packit Service 509fd4
	out, err := cmd.CombinedOutput()
Packit Service 509fd4
	assert.NoError(t, err)
Packit Service 509fd4
Packit Service 509fd4
	// let's check for COMPLETE, koji will exit with non-zero status code if the build doesn't exist
Packit Service 509fd4
	assert.Contains(t, string(out), "COMPLETE")
Packit Service 509fd4
}