Blame cmd/osbuild-worker/jobimpl-osbuild-koji.go

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
}