|
Packit Service |
509fd4 |
package main
|
|
Packit Service |
509fd4 |
|
|
Packit Service |
509fd4 |
import (
|
|
Packit Service |
509fd4 |
"crypto/tls"
|
|
Packit Service |
509fd4 |
"fmt"
|
|
Packit Service |
509fd4 |
"io/ioutil"
|
|
Packit Service |
509fd4 |
"log"
|
|
Packit Service |
509fd4 |
"net/http"
|
|
Packit Service |
509fd4 |
"net/url"
|
|
Packit Service |
509fd4 |
"os"
|
|
Packit Service |
509fd4 |
"path"
|
|
Packit Service |
509fd4 |
|
|
Packit Service |
509fd4 |
"github.com/osbuild/osbuild-composer/internal/common"
|
|
Packit Service |
509fd4 |
"github.com/osbuild/osbuild-composer/internal/distro"
|
|
Packit Service |
509fd4 |
"github.com/osbuild/osbuild-composer/internal/upload/koji"
|
|
Packit Service |
509fd4 |
"github.com/osbuild/osbuild-composer/internal/worker"
|
|
Packit Service |
509fd4 |
)
|
|
Packit Service |
509fd4 |
|
|
Packit Service |
509fd4 |
type OSBuildKojiJobImpl struct {
|
|
Packit Service |
509fd4 |
Store string
|
|
Packit Service |
bcdfb1 |
Output string
|
|
Packit Service |
509fd4 |
KojiServers map[string]koji.GSSAPICredentials
|
|
Packit Service |
509fd4 |
}
|
|
Packit Service |
509fd4 |
|
|
Packit Service |
509fd4 |
func (impl *OSBuildKojiJobImpl) kojiUpload(file *os.File, server, directory, filename string) (string, uint64, error) {
|
|
Packit Service |
509fd4 |
// Koji for some reason needs TLS renegotiation enabled.
|
|
Packit Service |
509fd4 |
// Clone the default http transport and enable renegotiation.
|
|
Packit Service |
509fd4 |
transport := http.DefaultTransport.(*http.Transport).Clone()
|
|
Packit Service |
509fd4 |
transport.TLSClientConfig = &tls.Config{
|
|
Packit Service |
509fd4 |
Renegotiation: tls.RenegotiateOnceAsClient,
|
|
Packit Service |
509fd4 |
}
|
|
Packit Service |
509fd4 |
|
|
Packit Service |
509fd4 |
serverURL, err := url.Parse(server)
|
|
Packit Service |
509fd4 |
if err != nil {
|
|
Packit Service |
509fd4 |
return "", 0, err
|
|
Packit Service |
509fd4 |
}
|
|
Packit Service |
509fd4 |
|
|
Packit Service |
509fd4 |
creds, exists := impl.KojiServers[serverURL.Hostname()]
|
|
Packit Service |
509fd4 |
if !exists {
|
|
Packit Service |
509fd4 |
return "", 0, fmt.Errorf("Koji server has not been configured: %s", serverURL.Hostname())
|
|
Packit Service |
509fd4 |
}
|
|
Packit Service |
509fd4 |
|
|
Packit Service |
509fd4 |
k, err := koji.NewFromGSSAPI(server, &creds, transport)
|
|
Packit Service |
509fd4 |
if err != nil {
|
|
Packit Service |
509fd4 |
return "", 0, err
|
|
Packit Service |
509fd4 |
}
|
|
Packit Service |
509fd4 |
defer func() {
|
|
Packit Service |
509fd4 |
err := k.Logout()
|
|
Packit Service |
509fd4 |
if err != nil {
|
|
Packit Service |
509fd4 |
log.Printf("koji logout failed: %v", err)
|
|
Packit Service |
509fd4 |
}
|
|
Packit Service |
509fd4 |
}()
|
|
Packit Service |
509fd4 |
|
|
Packit Service |
509fd4 |
return k.Upload(file, directory, filename)
|
|
Packit Service |
509fd4 |
}
|
|
Packit Service |
509fd4 |
|
|
Packit Service |
509fd4 |
func (impl *OSBuildKojiJobImpl) Run(job worker.Job) error {
|
|
Packit Service |
bcdfb1 |
outputDirectory, err := ioutil.TempDir(impl.Output, job.Id().String()+"-*")
|
|
Packit Service |
509fd4 |
if err != nil {
|
|
Packit Service |
509fd4 |
return fmt.Errorf("error creating temporary output directory: %v", err)
|
|
Packit Service |
509fd4 |
}
|
|
Packit Service |
509fd4 |
defer func() {
|
|
Packit Service |
509fd4 |
err := os.RemoveAll(outputDirectory)
|
|
Packit Service |
509fd4 |
if err != nil {
|
|
Packit Service |
509fd4 |
log.Printf("Error removing temporary output directory (%s): %v", outputDirectory, err)
|
|
Packit Service |
509fd4 |
}
|
|
Packit Service |
509fd4 |
}()
|
|
Packit Service |
509fd4 |
|
|
Packit Service |
509fd4 |
var args worker.OSBuildKojiJob
|
|
Packit Service |
509fd4 |
err = job.Args(&args)
|
|
Packit Service |
509fd4 |
if err != nil {
|
|
Packit Service |
509fd4 |
return err
|
|
Packit Service |
509fd4 |
}
|
|
Packit Service |
509fd4 |
|
|
Packit Service |
509fd4 |
var initArgs worker.KojiInitJobResult
|
|
Packit Service |
509fd4 |
err = job.DynamicArgs(0, &initArgs)
|
|
Packit Service |
509fd4 |
if err != nil {
|
|
Packit Service |
509fd4 |
return err
|
|
Packit Service |
509fd4 |
}
|
|
Packit Service |
509fd4 |
|
|
Packit Service |
509fd4 |
var result worker.OSBuildKojiJobResult
|
|
Packit Service |
509fd4 |
result.Arch = common.CurrentArch()
|
|
Packit Service |
509fd4 |
result.HostOS, err = distro.GetRedHatRelease()
|
|
Packit Service |
509fd4 |
if err != nil {
|
|
Packit Service |
509fd4 |
return err
|
|
Packit Service |
509fd4 |
}
|
|
Packit Service |
509fd4 |
|
|
Packit Service |
15f37d |
exports := []string{"assembler"} // NOTE: Koji API doesn't support new image types yet
|
|
Packit Service |
509fd4 |
if initArgs.KojiError == "" {
|
|
Packit Service |
15f37d |
result.OSBuildOutput, err = RunOSBuild(args.Manifest, impl.Store, outputDirectory, exports, os.Stderr)
|
|
Packit Service |
509fd4 |
if err != nil {
|
|
Packit Service |
509fd4 |
return err
|
|
Packit Service |
509fd4 |
}
|
|
Packit Service |
509fd4 |
|
|
Packit Service |
509fd4 |
if result.OSBuildOutput.Success {
|
|
Packit Service |
509fd4 |
f, err := os.Open(path.Join(outputDirectory, args.ImageName))
|
|
Packit Service |
509fd4 |
if err != nil {
|
|
Packit Service |
509fd4 |
return err
|
|
Packit Service |
509fd4 |
}
|
|
Packit Service |
509fd4 |
result.ImageHash, result.ImageSize, err = impl.kojiUpload(f, args.KojiServer, args.KojiDirectory, args.KojiFilename)
|
|
Packit Service |
509fd4 |
if err != nil {
|
|
Packit Service |
509fd4 |
result.KojiError = err.Error()
|
|
Packit Service |
509fd4 |
}
|
|
Packit Service |
509fd4 |
}
|
|
Packit Service |
509fd4 |
}
|
|
Packit Service |
509fd4 |
|
|
Packit Service |
509fd4 |
err = job.Update(&result)
|
|
Packit Service |
509fd4 |
if err != nil {
|
|
Packit Service |
509fd4 |
return fmt.Errorf("Error reporting job result: %v", err)
|
|
Packit Service |
509fd4 |
}
|
|
Packit Service |
509fd4 |
|
|
Packit Service |
509fd4 |
return nil
|
|
Packit Service |
509fd4 |
}
|