diff --git a/bib/cmd/bootc-image-builder/export_test.go b/bib/cmd/bootc-image-builder/export_test.go index e174182c0..1e0192dc7 100644 --- a/bib/cmd/bootc-image-builder/export_test.go +++ b/bib/cmd/bootc-image-builder/export_test.go @@ -6,11 +6,10 @@ import ( ) var ( - CanChownInPath = canChownInPath - GetDistroAndRunner = getDistroAndRunner - CreateRand = createRand - BuildCobraCmdline = buildCobraCmdline - HandleAWSFlags = handleAWSFlags + CanChownInPath = canChownInPath + CreateRand = createRand + BuildCobraCmdline = buildCobraCmdline + HandleAWSFlags = handleAWSFlags ) func MockOsGetuid(new func() int) (restore func()) { diff --git a/bib/cmd/bootc-image-builder/image_test.go b/bib/cmd/bootc-image-builder/image_test.go deleted file mode 100644 index a204b1811..000000000 --- a/bib/cmd/bootc-image-builder/image_test.go +++ /dev/null @@ -1,58 +0,0 @@ -package main_test - -import ( - "fmt" - "testing" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - "github.com/osbuild/images/pkg/manifest" - "github.com/osbuild/images/pkg/runner" - - bib "github.com/osbuild/bootc-image-builder/bib/cmd/bootc-image-builder" - "github.com/osbuild/images/pkg/bib/osinfo" -) - -func TestGetDistroAndRunner(t *testing.T) { - cases := []struct { - id string - versionID string - expectedDistro manifest.Distro - expectedRunner runner.Runner - expectedErr string - }{ - // Happy - {"fedora", "40", manifest.DISTRO_FEDORA, &runner.Fedora{Version: 40}, ""}, - {"centos", "9", manifest.DISTRO_EL9, &runner.CentOS{Version: 9}, ""}, - {"centos", "10", manifest.DISTRO_EL10, &runner.CentOS{Version: 10}, ""}, - {"centos", "11", manifest.DISTRO_NULL, &runner.CentOS{Version: 11}, ""}, - {"rhel", "9.4", manifest.DISTRO_EL9, &runner.RHEL{Major: 9, Minor: 4}, ""}, - {"rhel", "10.4", manifest.DISTRO_EL10, &runner.RHEL{Major: 10, Minor: 4}, ""}, - {"rhel", "11.4", manifest.DISTRO_NULL, &runner.RHEL{Major: 11, Minor: 4}, ""}, - {"toucanos", "42", manifest.DISTRO_NULL, &runner.Linux{}, ""}, - - // Sad - {"fedora", "asdf", manifest.DISTRO_NULL, nil, "cannot parse Fedora version (asdf)"}, - {"centos", "asdf", manifest.DISTRO_NULL, nil, "cannot parse CentOS version (asdf)"}, - {"rhel", "10", manifest.DISTRO_NULL, nil, "invalid RHEL version format: 10"}, - {"rhel", "10.asdf", manifest.DISTRO_NULL, nil, "cannot parse RHEL minor version (asdf)"}, - } - - for _, c := range cases { - t.Run(fmt.Sprintf("%s-%s", c.id, c.versionID), func(t *testing.T) { - osRelease := osinfo.OSRelease{ - ID: c.id, - VersionID: c.versionID, - } - distro, runner, err := bib.GetDistroAndRunner(osRelease) - if c.expectedErr != "" { - assert.ErrorContains(t, err, c.expectedErr) - } else { - require.NoError(t, err) - assert.Equal(t, c.expectedDistro, distro) - assert.Equal(t, c.expectedRunner, runner) - } - }) - } -} diff --git a/bib/cmd/bootc-image-builder/legacy_iso.go b/bib/cmd/bootc-image-builder/legacy_iso.go deleted file mode 100644 index 7f71e88ec..000000000 --- a/bib/cmd/bootc-image-builder/legacy_iso.go +++ /dev/null @@ -1,444 +0,0 @@ -package main - -import ( - "fmt" - "math/rand" - "slices" - "strconv" - "strings" - - "github.com/osbuild/blueprint/pkg/blueprint" - "github.com/osbuild/images/pkg/arch" - "github.com/osbuild/images/pkg/bib/osinfo" - "github.com/osbuild/images/pkg/container" - "github.com/osbuild/images/pkg/customizations/anaconda" - "github.com/osbuild/images/pkg/customizations/kickstart" - "github.com/osbuild/images/pkg/depsolvednf" - "github.com/osbuild/images/pkg/disk" - "github.com/osbuild/images/pkg/image" - "github.com/osbuild/images/pkg/manifest" - "github.com/osbuild/images/pkg/osbuild" - "github.com/osbuild/images/pkg/platform" - "github.com/osbuild/images/pkg/rpmmd" - "github.com/osbuild/images/pkg/runner" - "github.com/sirupsen/logrus" - - podman_container "github.com/osbuild/images/pkg/bib/container" - - "github.com/osbuild/bootc-image-builder/bib/internal/distrodef" -) - -// all possible locations for the bib's distro definitions -// ./data/defs and ./bib/data/defs are for development -// /usr/share/bootc-image-builder/defs is for the production, containerized version -var distroDefPaths = []string{ - "./data/defs", - "./bib/data/defs", - "/usr/share/bootc-image-builder/defs", -} - -type ManifestConfig struct { - // OCI image path (without the transport, that is always docker://) - Imgref string - BuildImgref string - - // Build config - Config *blueprint.Blueprint - - // CPU architecture of the image - Architecture arch.Arch - - // Paths to the directory with the distro definitions - DistroDefPaths []string - - // Extracted information about the source container image - SourceInfo *osinfo.Info - BuildSourceInfo *osinfo.Info - - // RootFSType specifies the filesystem type for the root partition - RootFSType string - - // use librepo ad the rpm downlaod backend - UseLibrepo bool -} - -func manifestFromCobraForLegacyISO(imgref, buildImgref, imgTypeStr, rootFs, rpmCacheRoot string, config *blueprint.Blueprint, useLibrepo bool, cntArch arch.Arch) ([]byte, *mTLSConfig, error) { - container, err := podman_container.New(imgref) - if err != nil { - return nil, nil, err - } - defer func() { - if err := container.Stop(); err != nil { - logrus.Warnf("error stopping container: %v", err) - } - }() - - var rootfsType string - if rootFs != "" { - rootfsType = rootFs - } else { - rootfsType, err = container.DefaultRootfsType() - if err != nil { - return nil, nil, fmt.Errorf("cannot get rootfs type for container: %w", err) - } - if rootfsType == "" { - return nil, nil, fmt.Errorf(`no default root filesystem type specified in container, please use "--rootfs" to set manually`) - } - } - - // Gather some data from the containers distro - sourceinfo, err := osinfo.Load(container.Root()) - if err != nil { - return nil, nil, err - } - - buildContainer := container - buildSourceinfo := sourceinfo - startedBuildContainer := false - defer func() { - if startedBuildContainer { - if err := buildContainer.Stop(); err != nil { - logrus.Warnf("error stopping container: %v", err) - } - } - }() - - if buildImgref != "" { - buildContainer, err = podman_container.New(buildImgref) - if err != nil { - return nil, nil, err - } - startedBuildContainer = true - - // Gather some data from the containers distro - buildSourceinfo, err = osinfo.Load(buildContainer.Root()) - if err != nil { - return nil, nil, err - } - } else { - buildImgref = imgref - } - - // This is needed just for RHEL and RHSM in most cases, but let's run it every time in case - // the image has some non-standard dnf plugins. - if err := buildContainer.InitDNF(); err != nil { - return nil, nil, err - } - solver, err := buildContainer.NewContainerSolver(rpmCacheRoot, cntArch, sourceinfo) - if err != nil { - return nil, nil, err - } - - manifestConfig := &ManifestConfig{ - Architecture: cntArch, - Config: config, - Imgref: imgref, - BuildImgref: buildImgref, - DistroDefPaths: distroDefPaths, - SourceInfo: sourceinfo, - BuildSourceInfo: buildSourceinfo, - RootFSType: rootfsType, - UseLibrepo: useLibrepo, - } - - manifest, repos, err := makeISOManifest(manifestConfig, solver, rpmCacheRoot) - if err != nil { - return nil, nil, err - } - - mTLS, err := extractTLSKeys(repos) - if err != nil { - return nil, nil, err - } - - return manifest, mTLS, nil -} - -func makeISOManifest(c *ManifestConfig, solver *depsolvednf.Solver, cacheRoot string) (manifest.OSBuildManifest, map[string][]rpmmd.RepoConfig, error) { - rng := createRand() - mani, err := manifestForISO(c, rng) - if err != nil { - return nil, nil, fmt.Errorf("cannot get manifest: %w", err) - } - - // depsolve packages - depsolvedSets := make(map[string]depsolvednf.DepsolveResult) - depsolvedRepos := make(map[string][]rpmmd.RepoConfig) - pkgSetChains, err := mani.GetPackageSetChains() - if err != nil { - return nil, nil, err - } - for name, pkgSet := range pkgSetChains { - res, err := solver.Depsolve(pkgSet, 0) - if err != nil { - return nil, nil, fmt.Errorf("cannot depsolve: %w", err) - } - depsolvedSets[name] = *res - depsolvedRepos[name] = res.Repos - } - - // Resolve container - the normal case is that host and target - // architecture are the same. However it is possible to build - // cross-arch images by using qemu-user. This will run everything - // (including the build-root) with the target arch then, it - // is fast enough (given that it's mostly I/O and all I/O is - // run naively via syscall translation) - - // XXX: should NewResolver() take "arch.Arch"? - resolver := container.NewResolver(c.Architecture.String()) - - containerSpecs := make(map[string][]container.Spec) - for plName, sourceSpecs := range mani.GetContainerSourceSpecs() { - for _, c := range sourceSpecs { - resolver.Add(c) - } - specs, err := resolver.Finish() - if err != nil { - return nil, nil, fmt.Errorf("cannot resolve containers: %w", err) - } - for _, spec := range specs { - if spec.Arch != c.Architecture { - return nil, nil, fmt.Errorf("image found is for unexpected architecture %q (expected %q), if that is intentional, please make sure --target-arch matches", spec.Arch, c.Architecture) - } - } - containerSpecs[plName] = specs - } - - var opts manifest.SerializeOptions - if c.UseLibrepo { - opts.RpmDownloader = osbuild.RpmDownloaderLibrepo - } - mf, err := mani.Serialize(depsolvedSets, containerSpecs, nil, &opts) - if err != nil { - return nil, nil, fmt.Errorf("[ERROR] manifest serialization failed: %s", err.Error()) - } - return mf, depsolvedRepos, nil -} - -func labelForISO(os *osinfo.OSRelease, arch *arch.Arch) string { - switch os.ID { - case "fedora": - return fmt.Sprintf("Fedora-S-dvd-%s-%s", arch, os.VersionID) - case "centos": - labelTemplate := "CentOS-Stream-%s-BaseOS-%s" - if os.VersionID == "8" { - labelTemplate = "CentOS-Stream-%s-%s-dvd" - } - return fmt.Sprintf(labelTemplate, os.VersionID, arch) - case "rhel": - version := strings.ReplaceAll(os.VersionID, ".", "-") - return fmt.Sprintf("RHEL-%s-BaseOS-%s", version, arch) - default: - return fmt.Sprintf("Container-Installer-%s", arch) - } -} - -// from:https://github.com/osbuild/images/blob/v0.207.0/data/distrodefs/rhel-10/imagetypes.yaml#L169 -var loraxRhelTemplates = []manifest.InstallerLoraxTemplate{ - manifest.InstallerLoraxTemplate{Path: "80-rhel/runtime-postinstall.tmpl"}, - manifest.InstallerLoraxTemplate{Path: "80-rhel/runtime-cleanup.tmpl", AfterDracut: true}, -} - -// from:https://github.com/osbuild/images/blob/v0.207.0/data/distrodefs/fedora/imagetypes.yaml#L408 -var loraxFedoraTemplates = []manifest.InstallerLoraxTemplate{ - manifest.InstallerLoraxTemplate{Path: "99-generic/runtime-postinstall.tmpl"}, - manifest.InstallerLoraxTemplate{Path: "99-generic/runtime-cleanup.tmpl", AfterDracut: true}, -} - -func loraxTemplates(si osinfo.OSRelease) []manifest.InstallerLoraxTemplate { - switch { - case si.ID == "rhel" || slices.Contains(si.IDLike, "rhel") || si.VersionID == "eln": - return loraxRhelTemplates - default: - return loraxFedoraTemplates - } -} - -func loraxTemplatePackage(si osinfo.OSRelease) string { - switch { - case si.ID == "rhel" || slices.Contains(si.IDLike, "rhel") || si.VersionID == "eln": - return "lorax-templates-rhel" - default: - return "lorax-templates-generic" - } -} - -func manifestForISO(c *ManifestConfig, rng *rand.Rand) (*manifest.Manifest, error) { - if c.Imgref == "" { - return nil, fmt.Errorf("pipeline: no base image defined") - } - - imageDef, err := distrodef.LoadImageDef(c.DistroDefPaths, c.SourceInfo.OSRelease.ID, c.SourceInfo.OSRelease.VersionID, "anaconda-iso") - if err != nil { - return nil, err - } - - containerSource := container.SourceSpec{ - Source: c.Imgref, - Name: c.Imgref, - Local: true, - } - - platform := &platform.Data{ - Arch: c.Architecture, - ImageFormat: platform.FORMAT_ISO, - UEFIVendor: c.SourceInfo.UEFIVendor, - } - switch c.Architecture { - case arch.ARCH_X86_64: - platform.BIOSPlatform = "i386-pc" - case arch.ARCH_AARCH64: - // aarch64 always uses UEFI, so let's enforce the vendor - if c.SourceInfo.UEFIVendor == "" { - return nil, fmt.Errorf("UEFI vendor must be set for aarch64 ISO") - } - case arch.ARCH_S390X: - platform.ZiplSupport = true - case arch.ARCH_PPC64LE: - platform.BIOSPlatform = "powerpc-ieee1275" - case arch.ARCH_RISCV64: - // nothing special needed - default: - return nil, fmt.Errorf("unsupported architecture %v", c.Architecture) - } - filename := "install.iso" - - // The ref is not needed and will be removed from the ctor later - // in time - img := image.NewAnacondaContainerInstallerLegacy(platform, filename, containerSource, "") - img.ContainerRemoveSignatures = true - img.RootfsCompression = "zstd" - - if c.Architecture == arch.ARCH_X86_64 { - img.InstallerCustomizations.ISOBoot = manifest.Grub2ISOBoot - } - - img.InstallerCustomizations.Product = c.SourceInfo.OSRelease.Name - img.InstallerCustomizations.OSVersion = c.SourceInfo.OSRelease.VersionID - img.InstallerCustomizations.ISOLabel = labelForISO(&c.SourceInfo.OSRelease, &c.Architecture) - - img.ExtraBasePackages = rpmmd.PackageSet{ - Include: imageDef.Packages, - } - - var customizations *blueprint.Customizations - if c.Config != nil { - customizations = c.Config.Customizations - } - img.InstallerCustomizations.FIPS = customizations.GetFIPS() - img.Kickstart, err = kickstart.New(customizations) - if err != nil { - return nil, err - } - img.Kickstart.Path = osbuild.KickstartPathOSBuild - if kopts := customizations.GetKernel(); kopts != nil && kopts.Append != "" { - img.Kickstart.KernelOptionsAppend = append(img.Kickstart.KernelOptionsAppend, kopts.Append) - } - img.Kickstart.NetworkOnBoot = true - - instCust, err := customizations.GetInstaller() - if err != nil { - return nil, err - } - if instCust != nil && instCust.Modules != nil { - img.InstallerCustomizations.EnabledAnacondaModules = append(img.InstallerCustomizations.EnabledAnacondaModules, instCust.Modules.Enable...) - img.InstallerCustomizations.DisabledAnacondaModules = append(img.InstallerCustomizations.DisabledAnacondaModules, instCust.Modules.Disable...) - } - img.InstallerCustomizations.EnabledAnacondaModules = append(img.InstallerCustomizations.EnabledAnacondaModules, - anaconda.ModuleUsers, - anaconda.ModuleServices, - anaconda.ModuleSecurity, - // XXX: get from the imagedefs - anaconda.ModuleNetwork, - anaconda.ModulePayloads, - anaconda.ModuleRuntime, - anaconda.ModuleStorage, - ) - - img.Kickstart.OSTree = &kickstart.OSTree{ - OSName: "default", - } - img.InstallerCustomizations.LoraxTemplates = loraxTemplates(c.SourceInfo.OSRelease) - img.InstallerCustomizations.LoraxTemplatePackage = loraxTemplatePackage(c.SourceInfo.OSRelease) - - // see https://github.com/osbuild/bootc-image-builder/issues/733 - img.InstallerCustomizations.ISORootfsType = manifest.SquashfsRootfs - - installRootfsType, err := disk.NewFSType(c.RootFSType) - if err != nil { - return nil, err - } - img.InstallRootfsType = installRootfsType - - mf := manifest.New() - - foundDistro, foundRunner, err := getDistroAndRunner(c.SourceInfo.OSRelease) - if err != nil { - return nil, fmt.Errorf("failed to infer distro and runner: %w", err) - } - mf.Distro = foundDistro - - _, err = img.InstantiateManifest(&mf, nil, foundRunner, rng) - return &mf, err -} - -func getDistroAndRunner(osRelease osinfo.OSRelease) (manifest.Distro, runner.Runner, error) { - switch osRelease.ID { - case "fedora": - version, err := strconv.ParseUint(osRelease.VersionID, 10, 64) - if err != nil { - return manifest.DISTRO_NULL, nil, fmt.Errorf("cannot parse Fedora version (%s): %w", osRelease.VersionID, err) - } - - return manifest.DISTRO_FEDORA, &runner.Fedora{ - Version: version, - }, nil - case "centos": - version, err := strconv.ParseUint(osRelease.VersionID, 10, 64) - if err != nil { - return manifest.DISTRO_NULL, nil, fmt.Errorf("cannot parse CentOS version (%s): %w", osRelease.VersionID, err) - } - r := &runner.CentOS{ - Version: version, - } - switch version { - case 9: - return manifest.DISTRO_EL9, r, nil - case 10: - return manifest.DISTRO_EL10, r, nil - default: - logrus.Warnf("Unknown CentOS version %d, using default distro for manifest generation", version) - return manifest.DISTRO_NULL, r, nil - } - - case "rhel": - versionParts := strings.Split(osRelease.VersionID, ".") - if len(versionParts) != 2 { - return manifest.DISTRO_NULL, nil, fmt.Errorf("invalid RHEL version format: %s", osRelease.VersionID) - } - major, err := strconv.ParseUint(versionParts[0], 10, 64) - if err != nil { - return manifest.DISTRO_NULL, nil, fmt.Errorf("cannot parse RHEL major version (%s): %w", versionParts[0], err) - } - minor, err := strconv.ParseUint(versionParts[1], 10, 64) - if err != nil { - return manifest.DISTRO_NULL, nil, fmt.Errorf("cannot parse RHEL minor version (%s): %w", versionParts[1], err) - } - r := &runner.RHEL{ - Major: major, - Minor: minor, - } - switch major { - case 9: - return manifest.DISTRO_EL9, r, nil - case 10: - return manifest.DISTRO_EL10, r, nil - default: - logrus.Warnf("Unknown RHEL version %d, using default distro for manifest generation", major) - return manifest.DISTRO_NULL, r, nil - } - } - - logrus.Warnf("Unknown distro %s, using default runner", osRelease.ID) - return manifest.DISTRO_NULL, &runner.Linux{}, nil -} diff --git a/bib/cmd/bootc-image-builder/main.go b/bib/cmd/bootc-image-builder/main.go index 5f10f7603..601e93e38 100644 --- a/bib/cmd/bootc-image-builder/main.go +++ b/bib/cmd/bootc-image-builder/main.go @@ -25,11 +25,13 @@ import ( "github.com/osbuild/images/pkg/bib/blueprintload" "github.com/osbuild/images/pkg/cloud" "github.com/osbuild/images/pkg/cloud/awscloud" + "github.com/osbuild/images/pkg/depsolvednf" "github.com/osbuild/images/pkg/distro" "github.com/osbuild/images/pkg/distro/bootc" "github.com/osbuild/images/pkg/experimentalflags" "github.com/osbuild/images/pkg/manifest" "github.com/osbuild/images/pkg/manifestgen" + "github.com/osbuild/images/pkg/osbuild" "github.com/osbuild/images/pkg/reporegistry" "github.com/osbuild/images/pkg/rpmmd" @@ -151,24 +153,20 @@ func manifestFromCobra(cmd *cobra.Command, args []string, pbar progress.Progress // Note that we only need to pass a single imgType here into the manifest generation because: // 1. the bootc disk manifests contains exports for all supported image types // 2. the bootc legacy types (iso, anaconda-iso) always do a single build - imgType := imgTypes[0] - if imageTypes.Legacy() { - return manifestFromCobraForLegacyISO(imgref, buildImgref, imgType, rootFs, rpmCacheRoot, config, useLibrepo, cntArch) - } - return manifestFromCobraForDisk(imgref, buildImgref, installerPayloadRef, imgType, rootFs, rpmCacheRoot, config, useLibrepo, cntArch) + imgType := imageTypes[0] + return manifestFromCobraFor(imgref, buildImgref, installerPayloadRef, imgType, rootFs, rpmCacheRoot, config, useLibrepo, cntArch) } -func manifestFromCobraForDisk(imgref, buildImgref, installerPayloadRef, imgTypeStr, rootFs, rpmCacheRoot string, config *blueprint.Blueprint, useLibrepo bool, cntArch arch.Arch) ([]byte, *mTLSConfig, error) { - distri, err := bootc.NewBootcDistro(imgref) +func manifestFromCobraFor(imgref, buildImgref, installerPayloadRef, imgTypeStr, rootFs, rpmCacheRoot string, config *blueprint.Blueprint, useLibrepo bool, cntArch arch.Arch) ([]byte, *mTLSConfig, error) { + distri, err := bootc.NewBootcDistro(imgref, &bootc.DistroOptions{ + DefaultFs: rootFs, + }) if err != nil { return nil, nil, err } if err := distri.SetBuildContainer(buildImgref); err != nil { return nil, nil, err } - if err := distri.SetDefaultFs(rootFs); err != nil { - return nil, nil, err - } archi, err := distri.GetArch(cntArch.String()) if err != nil { return nil, nil, err @@ -182,6 +180,11 @@ func manifestFromCobraForDisk(imgref, buildImgref, installerPayloadRef, imgTypeS if err != nil { return nil, nil, err } + var depsolveResult map[string]depsolvednf.DepsolveResult + var rpmDownloader osbuild.RpmDownloader + if useLibrepo { + rpmDownloader = osbuild.RpmDownloaderLibrepo + } mg, err := manifestgen.New(repos, &manifestgen.Options{ // XXX: hack to skip repo loading for the bootc image. // We need to add a SkipRepositories or similar to @@ -191,6 +194,11 @@ func manifestFromCobraForDisk(imgref, buildImgref, installerPayloadRef, imgTypeS BaseURLs: []string{"https://example.com/not-used"}, }, }, + RpmDownloader: rpmDownloader, + Depsolver: func(cacheDir string, depsolveWarningsOutput io.Writer, packageSets map[string][]rpmmd.PackageSet, d distro.Distro, arch string, solver *depsolvednf.Solver) (map[string]depsolvednf.DepsolveResult, error) { + depsolveResult, err = manifestgen.DefaultDepsolver(cacheDir, depsolveWarningsOutput, packageSets, d, arch, solver) + return depsolveResult, err + }, }) if err != nil { return nil, nil, err @@ -204,7 +212,17 @@ func manifestFromCobraForDisk(imgref, buildImgref, installerPayloadRef, imgTypeS if err != nil { return nil, nil, err } - return manifest, nil, nil + + depsolvedRepos := make(map[string][]rpmmd.RepoConfig) + for k, v := range depsolveResult { + depsolvedRepos[k] = v.Repos + } + mTLS, err := extractTLSKeys(depsolvedRepos) + if err != nil { + return nil, nil, err + } + + return manifest, mTLS, nil } func cmdManifest(cmd *cobra.Command, args []string) error { diff --git a/bib/go.mod b/bib/go.mod index 07ddd79bd..d641b2057 100644 --- a/bib/go.mod +++ b/bib/go.mod @@ -7,7 +7,7 @@ require ( github.com/hashicorp/go-version v1.7.0 github.com/osbuild/blueprint v1.16.0 github.com/osbuild/image-builder-cli v0.0.0-20250924085931-15de5139f521 - github.com/osbuild/images v0.211.0 + github.com/osbuild/images v0.216.1-0.20251111070102-913beef1efed github.com/sirupsen/logrus v1.9.3 github.com/spf13/cobra v1.10.1 github.com/spf13/pflag v1.0.10 @@ -134,3 +134,5 @@ require ( gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) + +replace github.com/osbuild/images => github.com/mvo5/images v0.0.0-20251113165820-8a75b8f51af8 diff --git a/bib/go.sum b/bib/go.sum index 5e61b2e18..6827248ec 100644 --- a/bib/go.sum +++ b/bib/go.sum @@ -235,6 +235,8 @@ github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/mvo5/images v0.0.0-20251113165820-8a75b8f51af8 h1:ycncVs62hfkJohY5k0KslOJPhFQRvdDGabefMjlFC+0= +github.com/mvo5/images v0.0.0-20251113165820-8a75b8f51af8/go.mod h1:Cs7zFV8rmbVHn+19ArNdjd1AtFk+LC9dOOHuxiSLghw= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040= @@ -247,8 +249,6 @@ github.com/osbuild/blueprint v1.16.0 h1:f/kHih+xpeJ1v7wtIfzdHPZTsiXsqKeDQ1+rrue6 github.com/osbuild/blueprint v1.16.0/go.mod h1:HPlJzkEl7q5g8hzaGksUk7ifFAy9QFw9LmzhuFOAVm4= github.com/osbuild/image-builder-cli v0.0.0-20250924085931-15de5139f521 h1:Mo1htXYyEoKrBQD+/RC/kluAWu4+E0oEjPorujVn/K8= github.com/osbuild/image-builder-cli v0.0.0-20250924085931-15de5139f521/go.mod h1:oTn9T+bV9g/760hM/jX7AV0c4vuVIn6FjAnaVM9RzRo= -github.com/osbuild/images v0.211.0 h1:3BU7mMM7Iu81qZnq7y8luuIIOt707J9tF9DwCyOk9yM= -github.com/osbuild/images v0.211.0/go.mod h1:Cs7zFV8rmbVHn+19ArNdjd1AtFk+LC9dOOHuxiSLghw= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=