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