debian-forge-composer/cmd/osbuild-koji/main.go
Tom Gundersen f446613d4a upload/koji: use CGInitBuild and clarify metadata structs
Move to requiring CGInitBuild to be called before CGImport. In the
future we could make the former optional again, but for now we want to
allow the caller to have done CGInitBuild and for composer only to do
the CGImport using the passed in build_id and token.

Also rename and document some struct fields in the metadata struct to
make them more specific to our use-case and hopefully easier to read.

Signed-off-by: Tom Gundersen <teg@jklm.no>
2020-09-16 00:15:02 +01:00

119 lines
2.4 KiB
Go

package main
import (
"flag"
"fmt"
"log"
"net/http"
"os"
"path"
"time"
"github.com/google/uuid"
"github.com/osbuild/osbuild-composer/internal/upload/koji"
)
func main() {
var server, user, password, name, version, release, arch, filename string
flag.StringVar(&server, "server", "", "url to API")
flag.StringVar(&user, "user", "", "koji username")
flag.StringVar(&password, "password", "", "koji password")
flag.StringVar(&name, "name", "", "image name")
flag.StringVar(&version, "version", "", "image verison")
flag.StringVar(&release, "release", "", "image release")
flag.StringVar(&arch, "arch", "", "image architecture")
flag.StringVar(&filename, "filename", "", "filename")
flag.Parse()
id, err := uuid.NewRandom()
if err != nil {
println(err.Error())
return
}
dir := fmt.Sprintf("osbuild-%v", id)
file, err := os.Open(filename)
if err != nil {
println(err.Error())
return
}
defer file.Close()
k, err := koji.NewFromPlain(server, "osbuild", "osbuildpass", http.DefaultTransport)
if err != nil {
println(err.Error())
return
}
defer func() {
err := k.Logout()
if err != nil {
log.Print("logging out of koji failed ", err)
}
}()
hash, length, err := k.Upload(file, dir, path.Base(filename))
if err != nil {
println(err.Error())
return
}
build := koji.ImageBuild{
Name: name,
Version: version,
Release: release,
StartTime: time.Now().Unix(),
EndTime: time.Now().Unix(),
}
buildRoots := []koji.BuildRoot{
{
ID: 1,
Host: koji.Host{
Os: "RHEL8",
Arch: arch,
},
ContentGenerator: koji.ContentGenerator{
Name: "osbuild",
Version: "1",
},
Container: koji.Container{
Type: "nspawn",
Arch: arch,
},
Tools: []koji.Tool{},
RPMs: []koji.RPM{},
},
}
output := []koji.Image{
{
BuildRootID: 1,
Filename: path.Base(filename),
FileSize: length,
Arch: arch,
ChecksumType: "md5",
MD5: hash,
Type: "image",
RPMs: []koji.RPM{},
Extra: koji.ImageExtra{
Info: koji.ImageExtraInfo{
Arch: arch,
},
},
},
}
initResult, err := k.CGInitBuild(nil, build.Name, build.Version, build.Release)
if err != nil {
println(err.Error())
return
}
build.BuildID = uint64(initResult.BuildID)
importResult, err := k.CGImport(build, buildRoots, output, dir, initResult.Token)
if err != nil {
println(err.Error())
return
}
fmt.Printf("Success, build id: %d\n", importResult.BuildID)
}