Blame cmd/osbuild-pipeline/main.go

Packit 63bb0d
package main
Packit 63bb0d
Packit 63bb0d
import (
Packit 63bb0d
	"encoding/json"
Packit 63bb0d
	"flag"
Packit 63bb0d
	"fmt"
Packit 63bb0d
	"io"
Packit 63bb0d
	"io/ioutil"
Packit 63bb0d
	"os"
Packit 63bb0d
	"path"
Packit 63bb0d
Packit 63bb0d
	"github.com/osbuild/osbuild-composer/internal/distro/fedora32"
Packit Service 509fd4
	"github.com/osbuild/osbuild-composer/internal/distro/fedora33"
Packit 63bb0d
	"github.com/osbuild/osbuild-composer/internal/distro/rhel8"
Packit Service 509fd4
	"github.com/osbuild/osbuild-composer/internal/distro/rhel84"
Packit 63bb0d
Packit 63bb0d
	"github.com/osbuild/osbuild-composer/internal/blueprint"
Packit 63bb0d
	"github.com/osbuild/osbuild-composer/internal/distro"
Packit 63bb0d
	"github.com/osbuild/osbuild-composer/internal/rpmmd"
Packit 63bb0d
)
Packit 63bb0d
Packit 63bb0d
type repository struct {
Packit 63bb0d
	BaseURL    string `json:"baseurl,omitempty"`
Packit 63bb0d
	Metalink   string `json:"metalink,omitempty"`
Packit 63bb0d
	MirrorList string `json:"mirrorlist,omitempty"`
Packit 63bb0d
	GPGKey     string `json:"gpgkey,omitempty"`
Packit 63bb0d
	CheckGPG   bool   `json:"check_gpg,omitempty"`
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
type composeRequest struct {
Packit 63bb0d
	Distro       string              `json:"distro"`
Packit 63bb0d
	Arch         string              `json:"arch"`
Packit 63bb0d
	ImageType    string              `json:"image-type"`
Packit 63bb0d
	Blueprint    blueprint.Blueprint `json:"blueprint"`
Packit 63bb0d
	Repositories []repository        `json:"repositories"`
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
func main() {
Packit 63bb0d
	var rpmmdArg bool
Packit 63bb0d
	flag.BoolVar(&rpmmdArg, "rpmmd", false, "output rpmmd struct instead of pipeline manifest")
Packit Service 509fd4
	var seedArg int64
Packit Service 509fd4
	flag.Int64Var(&seedArg, "seed", 0, "seed for generating manifests (default: 0)")
Packit 63bb0d
	flag.Parse()
Packit 63bb0d
Packit 63bb0d
	// Path to composeRequet or '-' for stdin
Packit 63bb0d
	composeRequestArg := flag.Arg(0)
Packit 63bb0d
Packit 63bb0d
	composeRequest := &composeRequest{}
Packit 63bb0d
	if composeRequestArg != "" {
Packit 63bb0d
		var reader io.Reader
Packit 63bb0d
		if composeRequestArg == "-" {
Packit 63bb0d
			reader = os.Stdin
Packit 63bb0d
		} else {
Packit 63bb0d
			var err error
Packit 63bb0d
			reader, err = os.Open(composeRequestArg)
Packit 63bb0d
			if err != nil {
Packit 63bb0d
				panic("Could not open compose request: " + err.Error())
Packit 63bb0d
			}
Packit 63bb0d
		}
Packit 63bb0d
		file, err := ioutil.ReadAll(reader)
Packit 63bb0d
		if err != nil {
Packit 63bb0d
			panic("Could not read compose request: " + err.Error())
Packit 63bb0d
		}
Packit 63bb0d
		err = json.Unmarshal(file, &composeRequest)
Packit 63bb0d
		if err != nil {
Packit 63bb0d
			panic("Could not parse blueprint: " + err.Error())
Packit 63bb0d
		}
Packit 63bb0d
	}
Packit 63bb0d
Packit Service bcdfb1
	distros, err := distro.NewRegistry(fedora32.New(), fedora33.New(), rhel8.New(), rhel84.New(), rhel84.NewCentos())
Packit 63bb0d
	if err != nil {
Packit 63bb0d
		panic(err)
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	d := distros.GetDistro(composeRequest.Distro)
Packit 63bb0d
	if d == nil {
Packit 63bb0d
		_, _ = fmt.Fprintf(os.Stderr, "The provided distribution '%s' is not supported. Use one of these:\n", composeRequest.Distro)
Packit 63bb0d
		for _, d := range distros.List() {
Packit 63bb0d
			_, _ = fmt.Fprintln(os.Stderr, " *", d)
Packit 63bb0d
		}
Packit 63bb0d
		return
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	arch, err := d.GetArch(composeRequest.Arch)
Packit 63bb0d
	if err != nil {
Packit 63bb0d
		fmt.Fprintf(os.Stderr, "The provided architecture '%s' is not supported by %s. Use one of these:\n", composeRequest.Arch, d.Name())
Packit 63bb0d
		for _, a := range d.ListArches() {
Packit 63bb0d
			_, _ = fmt.Fprintln(os.Stderr, " *", a)
Packit 63bb0d
		}
Packit 63bb0d
		return
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	imageType, err := arch.GetImageType(composeRequest.ImageType)
Packit 63bb0d
	if err != nil {
Packit 63bb0d
		fmt.Fprintf(os.Stderr, "The provided image type '%s' is not supported by %s for %s. Use one of these:\n", composeRequest.ImageType, d.Name(), arch.Name())
Packit 63bb0d
		for _, t := range arch.ListImageTypes() {
Packit 63bb0d
			_, _ = fmt.Fprintln(os.Stderr, " *", t)
Packit 63bb0d
		}
Packit 63bb0d
		return
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	repos := make([]rpmmd.RepoConfig, len(composeRequest.Repositories))
Packit 63bb0d
	for i, repo := range composeRequest.Repositories {
Packit 63bb0d
		repos[i] = rpmmd.RepoConfig{
Packit 63bb0d
			Name:       fmt.Sprintf("repo-%d", i),
Packit 63bb0d
			BaseURL:    repo.BaseURL,
Packit 63bb0d
			Metalink:   repo.Metalink,
Packit 63bb0d
			MirrorList: repo.MirrorList,
Packit 63bb0d
			GPGKey:     repo.GPGKey,
Packit 63bb0d
			CheckGPG:   repo.CheckGPG,
Packit 63bb0d
		}
Packit 63bb0d
	}
Packit 63bb0d
Packit Service 15f37d
	packageSets := imageType.PackageSets(composeRequest.Blueprint)
Packit 63bb0d
Packit 63bb0d
	home, err := os.UserHomeDir()
Packit 63bb0d
	if err != nil {
Packit 63bb0d
		panic("os.UserHomeDir(): " + err.Error())
Packit 63bb0d
	}
Packit 63bb0d
Packit Service 15f37d
	rpm_md := rpmmd.NewRPMMD(path.Join(home, ".cache/osbuild-composer/rpmmd"), "/usr/libexec/osbuild-composer/dnf-json")
Packit 63bb0d
Packit Service 15f37d
	packageSpecSets := make(map[string][]rpmmd.PackageSpec)
Packit Service 15f37d
	for name, packages := range packageSets {
Packit Service 15f37d
		packageSpecs, _, err := rpm_md.Depsolve(packages, repos, d.ModulePlatformID(), arch.Name())
Packit Service 15f37d
		if err != nil {
Packit Service 15f37d
			panic("Could not depsolve: " + err.Error())
Packit Service 15f37d
		}
Packit Service 15f37d
		packageSpecSets[name] = packageSpecs
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	var bytes []byte
Packit 63bb0d
	if rpmmdArg {
Packit Service 15f37d
		bytes, err = json.Marshal(packageSpecSets)
Packit 63bb0d
		if err != nil {
Packit 63bb0d
			panic(err)
Packit 63bb0d
		}
Packit 63bb0d
	} else {
Packit 63bb0d
		manifest, err := imageType.Manifest(composeRequest.Blueprint.Customizations,
Packit 63bb0d
			distro.ImageOptions{
Packit 63bb0d
				Size: imageType.Size(0),
Packit Service 15f37d
				OSTree: distro.OSTreeImageOptions{
Packit Service 15f37d
					Ref: imageType.OSTreeRef(), // use default OSTreeRef for image type
Packit Service 15f37d
				},
Packit 63bb0d
			},
Packit 63bb0d
			repos,
Packit Service 15f37d
			packageSpecSets,
Packit Service 509fd4
			seedArg)
Packit 63bb0d
		if err != nil {
Packit 63bb0d
			panic(err.Error())
Packit 63bb0d
		}
Packit 63bb0d
Packit 63bb0d
		bytes, err = json.Marshal(manifest)
Packit 63bb0d
		if err != nil {
Packit 63bb0d
			panic(err)
Packit 63bb0d
		}
Packit 63bb0d
	}
Packit 63bb0d
	os.Stdout.Write(bytes)
Packit 63bb0d
}