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>
119 lines
2.4 KiB
Go
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)
|
|
}
|