|
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 |
}
|