diff --git a/Containerfile b/Containerfile index 00b860307..fb180e920 100644 --- a/Containerfile +++ b/Containerfile @@ -16,7 +16,6 @@ COPY ./group_osbuild-osbuild-fedora.repo /etc/yum.repos.d/ COPY ./package-requires.txt . RUN grep -vE '^#' package-requires.txt | xargs dnf install -y && rm -f package-requires.txt && dnf clean all COPY --from=builder /build/bin/* /usr/bin/ -COPY bib/data /usr/share/bootc-image-builder ENTRYPOINT ["/usr/bin/bootc-image-builder"] VOLUME /output diff --git a/bib/cmd/bootc-image-builder/export_test.go b/bib/cmd/bootc-image-builder/export_test.go index e174182c0..680c243c2 100644 --- a/bib/cmd/bootc-image-builder/export_test.go +++ b/bib/cmd/bootc-image-builder/export_test.go @@ -6,11 +6,11 @@ import ( ) var ( - CanChownInPath = canChownInPath - GetDistroAndRunner = getDistroAndRunner - CreateRand = createRand - BuildCobraCmdline = buildCobraCmdline - HandleAWSFlags = handleAWSFlags + CanChownInPath = canChownInPath + CreateRand = createRand + BuildCobraCmdline = buildCobraCmdline + HandleAWSFlags = handleAWSFlags + NewDistroYAMLFrom = newDistroYAMLFrom ) 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 index b5b84a77c..4c7cee686 100644 --- a/bib/cmd/bootc-image-builder/legacy_iso.go +++ b/bib/cmd/bootc-image-builder/legacy_iso.go @@ -3,9 +3,6 @@ package main import ( "fmt" "math/rand" - "slices" - "strconv" - "strings" "github.com/osbuild/blueprint/pkg/blueprint" "github.com/osbuild/images/pkg/arch" @@ -15,60 +12,48 @@ import ( "github.com/osbuild/images/pkg/customizations/kickstart" "github.com/osbuild/images/pkg/depsolvednf" "github.com/osbuild/images/pkg/disk" + "github.com/osbuild/images/pkg/distro" + "github.com/osbuild/images/pkg/distro/bootc" + "github.com/osbuild/images/pkg/distro/defs" "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 +// newDistroYAMLFrom() returns the distroYAML for the given sourceInfo, +// if no direct match can be found it will it will use the ID_LIKE. +// This should ensure we work on every bootc image that puts a correct +// ID_LIKE= in /etc/os-release +func newDistroYAMLFrom(sourceInfo *osinfo.Info) (*defs.DistroYAML, *distro.ID, error) { + for _, distroID := range append([]string{sourceInfo.OSRelease.ID}, sourceInfo.OSRelease.IDLike...) { + nameVer := fmt.Sprintf("%s-%s", distroID, sourceInfo.OSRelease.VersionID) + id, err := distro.ParseID(nameVer) + if err != nil { + return nil, nil, err + } + distroYAML, err := defs.NewDistroYAML(nameVer) + if err != nil { + return nil, nil, err + } + if distroYAML != nil { + return distroYAML, id, nil + } + } + return nil, nil, fmt.Errorf("cannot load distro definitions for %s-%s or any of %v", sourceInfo.OSRelease.ID, sourceInfo.OSRelease.VersionID, sourceInfo.OSRelease.IDLike) } 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) + cnt, err := podman_container.New(imgref) if err != nil { return nil, nil, err } defer func() { - if err := container.Stop(); err != nil { + if err := cnt.Stop(); err != nil { logrus.Warnf("error stopping container: %v", err) } }() @@ -77,7 +62,7 @@ func manifestFromCobraForLegacyISO(imgref, buildImgref, imgTypeStr, rootFs, rpmC if rootFs != "" { rootfsType = rootFs } else { - rootfsType, err = container.DefaultRootfsType() + rootfsType, err = cnt.DefaultRootfsType() if err != nil { return nil, nil, fmt.Errorf("cannot get rootfs type for container: %w", err) } @@ -87,12 +72,12 @@ func manifestFromCobraForLegacyISO(imgref, buildImgref, imgTypeStr, rootFs, rpmC } // Gather some data from the containers distro - sourceinfo, err := osinfo.Load(container.Root()) + sourceinfo, err := osinfo.Load(cnt.Root()) if err != nil { return nil, nil, err } - buildContainer := container + buildContainer := cnt buildSourceinfo := sourceinfo startedBuildContainer := false defer func() { @@ -129,34 +114,8 @@ func manifestFromCobraForLegacyISO(imgref, buildImgref, imgTypeStr, rootFs, rpmC 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) + mani, err := imgTypeManifestForLegacyISO(imgref, rootFs, cntArch.String(), buildSourceinfo, config, rng) if err != nil { return nil, nil, fmt.Errorf("cannot get manifest: %w", err) } @@ -185,7 +144,7 @@ func makeISOManifest(c *ManifestConfig, solver *depsolvednf.Solver, cacheRoot st // run naively via syscall translation) // XXX: should NewResolver() take "arch.Arch"? - resolver := container.NewResolver(c.Architecture.String()) + resolver := container.NewResolver(cntArch.String()) containerSpecs := make(map[string][]container.Spec) for plName, sourceSpecs := range mani.GetContainerSourceSpecs() { @@ -197,133 +156,83 @@ func makeISOManifest(c *ManifestConfig, solver *depsolvednf.Solver, cacheRoot st 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) + if spec.Arch != cntArch { + 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, cntArch) } } containerSpecs[plName] = specs } var opts manifest.SerializeOptions - if c.UseLibrepo { + if 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 + mTLS, err := extractTLSKeys(depsolvedRepos) + if err != nil { + return nil, nil, err } -} -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" - } + return mf, mTLS, nil } -func manifestForISO(c *ManifestConfig, rng *rand.Rand) (*manifest.Manifest, error) { - if c.Imgref == "" { +// XXX: ideally this would be an imageType.Manifest() function but +// we have no legacyISO image type (yet) +func imgTypeManifestForLegacyISO(imgref, rootFSType, archStr string, sourceInfo *osinfo.Info, bp *blueprint.Blueprint, rng *rand.Rand) (*manifest.Manifest, error) { + if 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") + distroYAML, id, err := newDistroYAMLFrom(sourceInfo) if err != nil { return nil, err } + // XXX: or "bootc-legacy-installer"? + installerImgTypeName := "bootc-rpm-installer" + imgType, ok := distroYAML.ImageTypes()[installerImgTypeName] + if !ok { + return nil, fmt.Errorf("cannot find image definition for %v", installerImgTypeName) + } + installerPkgSet, ok := imgType.PackageSets(*id, archStr)["installer"] + if !ok { + return nil, fmt.Errorf("cannot find installer package set for %v", installerImgTypeName) + } + installerConfig := imgType.InstallerConfig(*id, archStr) + if installerConfig == nil { + return nil, fmt.Errorf("empty installer config for %s", installerImgTypeName) + } + containerSource := container.SourceSpec{ - Source: c.Imgref, - Name: c.Imgref, + Source: imgref, + Name: 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" + platformi := bootc.PlatformFor(archStr, sourceInfo.UEFIVendor) + platformi.ImageFormat = platform.FORMAT_ISO // The ref is not needed and will be removed from the ctor later // in time - img := image.NewAnacondaContainerInstaller(platform, filename, containerSource, "") + img := image.NewAnacondaContainerInstallerLegacy(platformi, imgType.Filename, containerSource, "") img.ContainerRemoveSignatures = true img.RootfsCompression = "zstd" - if c.Architecture == arch.ARCH_X86_64 { + if archStr == arch.ARCH_X86_64.String() { 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, - } + img.InstallerCustomizations.Product = sourceInfo.OSRelease.Name + img.InstallerCustomizations.OSVersion = sourceInfo.OSRelease.VersionID + img.InstallerCustomizations.ISOLabel = bootc.LabelForISO(&sourceInfo.OSRelease, archStr) + img.ExtraBasePackages = installerPkgSet var customizations *blueprint.Customizations - if c.Config != nil { - customizations = c.Config.Customizations + if bp != nil { + customizations = bp.Customizations } img.InstallerCustomizations.FIPS = customizations.GetFIPS() img.Kickstart, err = kickstart.New(customizations) @@ -358,13 +267,15 @@ func manifestForISO(c *ManifestConfig, rng *rand.Rand) (*manifest.Manifest, erro img.Kickstart.OSTree = &kickstart.OSTree{ OSName: "default", } - img.InstallerCustomizations.LoraxTemplates = loraxTemplates(c.SourceInfo.OSRelease) - img.InstallerCustomizations.LoraxTemplatePackage = loraxTemplatePackage(c.SourceInfo.OSRelease) + img.InstallerCustomizations.LoraxTemplates = installerConfig.LoraxTemplates + if installerConfig.LoraxTemplatePackage != nil { + img.InstallerCustomizations.LoraxTemplatePackage = *installerConfig.LoraxTemplatePackage + } // see https://github.com/osbuild/bootc-image-builder/issues/733 img.InstallerCustomizations.ISORootfsType = manifest.SquashfsRootfs - installRootfsType, err := disk.NewFSType(c.RootFSType) + installRootfsType, err := disk.NewFSType(rootFSType) if err != nil { return nil, err } @@ -372,7 +283,7 @@ func manifestForISO(c *ManifestConfig, rng *rand.Rand) (*manifest.Manifest, erro mf := manifest.New() - foundDistro, foundRunner, err := getDistroAndRunner(c.SourceInfo.OSRelease) + foundDistro, foundRunner, err := bootc.GetDistroAndRunner(sourceInfo.OSRelease) if err != nil { return nil, fmt.Errorf("failed to infer distro and runner: %w", err) } @@ -381,64 +292,3 @@ func manifestForISO(c *ManifestConfig, rng *rand.Rand) (*manifest.Manifest, erro _, 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/legacy_iso_test.go b/bib/cmd/bootc-image-builder/legacy_iso_test.go new file mode 100644 index 000000000..9f5fddf98 --- /dev/null +++ b/bib/cmd/bootc-image-builder/legacy_iso_test.go @@ -0,0 +1,51 @@ +package main_test + +import ( + "testing" + + "github.com/stretchr/testify/assert" + + "github.com/osbuild/images/pkg/bib/osinfo" + "github.com/osbuild/images/pkg/distro" + + main "github.com/osbuild/bootc-image-builder/bib/cmd/bootc-image-builder" +) + +func TestNewDistroYAMLFromError(t *testing.T) { + si := &osinfo.Info{ + OSRelease: osinfo.OSRelease{ + ID: "weirdos", + VersionID: "2.71", + IDLike: []string{"waffleos", "barky"}, + }, + } + _, _, err := main.NewDistroYAMLFrom(si) + assert.EqualError(t, err, "cannot load distro definitions for weirdos-2.71 or any of [waffleos barky]") +} + +func TestNewDistroYAMLFromDirect(t *testing.T) { + si := &osinfo.Info{ + OSRelease: osinfo.OSRelease{ + ID: "centos", + VersionID: "10", + }, + } + distroYAML, id, err := main.NewDistroYAMLFrom(si) + assert.NoError(t, err) + assert.Equal(t, &distro.ID{Name: "centos", MajorVersion: 10, MinorVersion: -1}, id) + assert.Equal(t, "centos-10", distroYAML.Name) +} + +func TestNewDistroYAMLFromFallback(t *testing.T) { + si := &osinfo.Info{ + OSRelease: osinfo.OSRelease{ + ID: "blmblinux", + VersionID: "9.6", + IDLike: []string{"non-existing", "rhel", "centos", "fedora"}, + }, + } + distroYAML, id, err := main.NewDistroYAMLFrom(si) + assert.NoError(t, err) + assert.Equal(t, &distro.ID{Name: "rhel", MajorVersion: 9, MinorVersion: 6}, id) + assert.Equal(t, "rhel-9.6", distroYAML.Name) +} diff --git a/bib/cmd/bootc-image-builder/workload.go b/bib/cmd/bootc-image-builder/workload.go deleted file mode 100644 index d2667fa7e..000000000 --- a/bib/cmd/bootc-image-builder/workload.go +++ /dev/null @@ -1,24 +0,0 @@ -package main - -import "github.com/osbuild/images/pkg/rpmmd" - -// NullWorkload implements the images Workload interface but returns only nil -// from all its methods and holds no data. -type NullWorkload struct { -} - -func (p *NullWorkload) GetRepos() []rpmmd.RepoConfig { - return nil -} - -func (p *NullWorkload) GetPackages() []string { - return nil -} - -func (p *NullWorkload) GetServices() []string { - return nil -} - -func (p *NullWorkload) GetDisabledServices() []string { - return nil -} diff --git a/bib/data/defs/almalinux-10.yaml b/bib/data/defs/almalinux-10.yaml deleted file mode 120000 index 31ce3eb13..000000000 --- a/bib/data/defs/almalinux-10.yaml +++ /dev/null @@ -1 +0,0 @@ -centos-10.yaml \ No newline at end of file diff --git a/bib/data/defs/almalinux-9.yaml b/bib/data/defs/almalinux-9.yaml deleted file mode 120000 index f09a87265..000000000 --- a/bib/data/defs/almalinux-9.yaml +++ /dev/null @@ -1 +0,0 @@ -centos-9.yaml \ No newline at end of file diff --git a/bib/data/defs/aurora-40.yaml b/bib/data/defs/aurora-40.yaml deleted file mode 120000 index b77da5759..000000000 --- a/bib/data/defs/aurora-40.yaml +++ /dev/null @@ -1 +0,0 @@ -fedora-40.yaml \ No newline at end of file diff --git a/bib/data/defs/aurora-helium-10.yaml b/bib/data/defs/aurora-helium-10.yaml deleted file mode 120000 index 31ce3eb13..000000000 --- a/bib/data/defs/aurora-helium-10.yaml +++ /dev/null @@ -1 +0,0 @@ -centos-10.yaml \ No newline at end of file diff --git a/bib/data/defs/bazzite-40.yaml b/bib/data/defs/bazzite-40.yaml deleted file mode 120000 index b77da5759..000000000 --- a/bib/data/defs/bazzite-40.yaml +++ /dev/null @@ -1 +0,0 @@ -fedora-40.yaml \ No newline at end of file diff --git a/bib/data/defs/bluefin-40.yaml b/bib/data/defs/bluefin-40.yaml deleted file mode 120000 index b77da5759..000000000 --- a/bib/data/defs/bluefin-40.yaml +++ /dev/null @@ -1 +0,0 @@ -fedora-40.yaml \ No newline at end of file diff --git a/bib/data/defs/centos-10.yaml b/bib/data/defs/centos-10.yaml deleted file mode 100644 index dcf78f042..000000000 --- a/bib/data/defs/centos-10.yaml +++ /dev/null @@ -1,93 +0,0 @@ -anaconda-iso: - packages: - - "@hardware-support" - - alsa-firmware - - alsa-tools-firmware - - anaconda - - anaconda-dracut - - anaconda-install-img-deps - - anaconda-widgets - - audit - - bind-utils - - bzip2 - - cryptsetup - - curl - - dbus-x11 - - dejavu-sans-fonts - - dejavu-sans-mono-fonts - - device-mapper-persistent-data - - dmidecode - - dnf - - dracut-config-generic - - dracut-network - - efibootmgr - - ethtool - - fcoe-utils - - ftp - - gdb-gdbserver - - glibc-all-langpacks - - gnome-kiosk - - google-noto-sans-cjk-ttc-fonts - - grub2-tools - - grub2-tools-extra - - grub2-tools-minimal - - grubby - - gsettings-desktop-schemas - - hdparm - - hexedit - - hostname - - initscripts - - ipmitool - - jomolhari-fonts - - kbd - - kbd-misc - - kdump-anaconda-addon - - kernel - - less - - libblockdev-lvm-dbus - - libibverbs - - librsvg2 - - linux-firmware - - lldpad - - lsof - - madan-fonts - - mt-st - - mtr - - net-tools - - nfs-utils - - nm-connection-editor - - nmap-ncat - - nss-tools - - openssh-clients - - openssh-server - - ostree - - pciutils - - perl-interpreter - - pigz - - plymouth - - prefixdevname - - python3-pyatspi - - rdma-core - - rng-tools - - rpcbind - - rpm-ostree - - rsync - - rsyslog - - selinux-policy-targeted - - sg3_utils - - sil-padauk-fonts - - smartmontools - - spice-vdagent - - strace - - systemd - - tar - - udisks2 - - udisks2-iscsi - - usbutils - - vim-minimal - - volume_key - - wget - - xfsdump - - xfsprogs - - xrdb - - xz diff --git a/bib/data/defs/centos-9.yaml b/bib/data/defs/centos-9.yaml deleted file mode 100644 index 431642ca7..000000000 --- a/bib/data/defs/centos-9.yaml +++ /dev/null @@ -1,108 +0,0 @@ -anaconda-iso: - # This is the same set as the Fedora one, but without packages not available in CentOS/RHEL: - # atheros-firmware, brcmfmac-firmware, iwlwifi-dvm-firmware, iwlwifi-mvm-firmware, realtek-firmware, rit-meera-new-fonts - packages: - - aajohan-comfortaa-fonts - - abattis-cantarell-fonts - - alsa-firmware - - alsa-tools-firmware - - anaconda - - anaconda-dracut - - anaconda-install-env-deps - - anaconda-widgets - - audit - - bind-utils - - bitmap-fangsongti-fonts - - bzip2 - - cryptsetup - - curl - - dbus-x11 - - dejavu-sans-fonts - - dejavu-sans-mono-fonts - - device-mapper-persistent-data - - dmidecode - - dnf - - dracut-config-generic - - dracut-network - - efibootmgr - - ethtool - - fcoe-utils - - ftp - - gdb-gdbserver - - gdisk - - glibc-all-langpacks - - gnome-kiosk - - google-noto-sans-cjk-ttc-fonts - - grub2-tools - - grub2-tools-extra - - grub2-tools-minimal - - grubby - - gsettings-desktop-schemas - - hdparm - - hexedit - - hostname - - initscripts - - ipmitool - - jomolhari-fonts - - kbd - - kbd-misc - - kdump-anaconda-addon - - kernel - - khmeros-base-fonts - - less - - libblockdev-lvm-dbus - - libibverbs - - libreport-plugin-bugzilla - - libreport-plugin-reportuploader - - librsvg2 - - linux-firmware - - lldpad - - lsof - - madan-fonts - - mt-st - - mtr - - net-tools - - nfs-utils - - nm-connection-editor - - nmap-ncat - - nss-tools - - openssh-clients - - openssh-server - - ostree - - pciutils - - perl-interpreter - - pigz - - plymouth - - prefixdevname - - python3-pyatspi - - rdma-core - - rng-tools - - rpcbind - - rpm-ostree - - rsync - - rsyslog - - selinux-policy-targeted - - sg3_utils - - sil-abyssinica-fonts - - sil-padauk-fonts - - smartmontools - - spice-vdagent - - strace - - systemd - - tar - - tigervnc-server-minimal - - tigervnc-server-module - - udisks2 - - udisks2-iscsi - - usbutils - - vim-minimal - - volume_key - - wget - - xfsdump - - xfsprogs - - xorg-x11-drivers - - xorg-x11-fonts-misc - - xorg-x11-server-Xorg - - xorg-x11-xauth - - xrdb - - xz diff --git a/bib/data/defs/fedora-40.yaml b/bib/data/defs/fedora-40.yaml deleted file mode 100644 index c1431a18a..000000000 --- a/bib/data/defs/fedora-40.yaml +++ /dev/null @@ -1,112 +0,0 @@ -anaconda-iso: - packages: - - aajohan-comfortaa-fonts - - abattis-cantarell-fonts - - alsa-firmware - - alsa-tools-firmware - - anaconda - - anaconda-dracut - - anaconda-install-img-deps - - anaconda-widgets - - atheros-firmware - - audit - - bind-utils - - bitmap-fangsongti-fonts - - brcmfmac-firmware - - bzip2 - - cryptsetup - - curl - - dbus-x11 - - dejavu-sans-fonts - - dejavu-sans-mono-fonts - - device-mapper-persistent-data - - dmidecode - - dnf - - dracut-config-generic - - dracut-network - - efibootmgr - - ethtool - - fcoe-utils - - ftp - - gdb-gdbserver - - gdisk - - glibc-all-langpacks - - gnome-kiosk - - google-noto-sans-cjk-ttc-fonts - - grub2-tools - - grub2-tools-extra - - grub2-tools-minimal - - grubby - - gsettings-desktop-schemas - - hdparm - - hexedit - - hostname - - initscripts - - ipmitool - - iwlwifi-dvm-firmware - - iwlwifi-mvm-firmware - - jomolhari-fonts - - kbd - - kbd-misc - - kdump-anaconda-addon - - kernel - - khmeros-base-fonts - - less - - libblockdev-lvm-dbus - - libibverbs - - libreport-plugin-bugzilla - - libreport-plugin-reportuploader - - librsvg2 - - linux-firmware - - lldpad - - lsof - - madan-fonts - - mt-st - - mtr - - net-tools - - nfs-utils - - nm-connection-editor - - nmap-ncat - - nss-tools - - openssh-clients - - openssh-server - - ostree - - pciutils - - perl-interpreter - - pigz - - plymouth - - prefixdevname - - python3-pyatspi - - rdma-core - - realtek-firmware - - rit-meera-new-fonts - - rng-tools - - rpcbind - - rpm-ostree - - rsync - - rsyslog - - selinux-policy-targeted - - sg3_utils - - sil-abyssinica-fonts - - sil-padauk-fonts - - smartmontools - - spice-vdagent - - strace - - systemd - - tar - - tigervnc-server-minimal - - tigervnc-server-module - - udisks2 - - udisks2-iscsi - - usbutils - - vim-minimal - - volume_key - - wget - - xfsdump - - xfsprogs - - xorg-x11-drivers - - xorg-x11-fonts-misc - - xorg-x11-server-Xorg - - xorg-x11-xauth - - xrdb - - xz diff --git a/bib/data/defs/fedora-42.yaml b/bib/data/defs/fedora-42.yaml deleted file mode 120000 index b77da5759..000000000 --- a/bib/data/defs/fedora-42.yaml +++ /dev/null @@ -1 +0,0 @@ -fedora-40.yaml \ No newline at end of file diff --git a/bib/data/defs/heliumos-10.yaml b/bib/data/defs/heliumos-10.yaml deleted file mode 120000 index 31ce3eb13..000000000 --- a/bib/data/defs/heliumos-10.yaml +++ /dev/null @@ -1 +0,0 @@ -centos-10.yaml \ No newline at end of file diff --git a/bib/data/defs/heliumos-9.yaml b/bib/data/defs/heliumos-9.yaml deleted file mode 120000 index f09a87265..000000000 --- a/bib/data/defs/heliumos-9.yaml +++ /dev/null @@ -1 +0,0 @@ -centos-9.yaml \ No newline at end of file diff --git a/bib/data/defs/rhel-10.yaml b/bib/data/defs/rhel-10.yaml deleted file mode 120000 index 31ce3eb13..000000000 --- a/bib/data/defs/rhel-10.yaml +++ /dev/null @@ -1 +0,0 @@ -centos-10.yaml \ No newline at end of file diff --git a/bib/data/defs/rhel-9.yaml b/bib/data/defs/rhel-9.yaml deleted file mode 120000 index f09a87265..000000000 --- a/bib/data/defs/rhel-9.yaml +++ /dev/null @@ -1 +0,0 @@ -centos-9.yaml \ No newline at end of file diff --git a/bib/data/defs/rocky-10.yaml b/bib/data/defs/rocky-10.yaml deleted file mode 120000 index 31ce3eb13..000000000 --- a/bib/data/defs/rocky-10.yaml +++ /dev/null @@ -1 +0,0 @@ -centos-10.yaml \ No newline at end of file diff --git a/bib/data/defs/rocky-9.yaml b/bib/data/defs/rocky-9.yaml deleted file mode 120000 index f09a87265..000000000 --- a/bib/data/defs/rocky-9.yaml +++ /dev/null @@ -1 +0,0 @@ -centos-9.yaml \ No newline at end of file diff --git a/bib/go.mod b/bib/go.mod index 38c8ef835..622a94ba4 100644 --- a/bib/go.mod +++ b/bib/go.mod @@ -9,7 +9,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.209.0 + github.com/osbuild/images v0.214.0 github.com/sirupsen/logrus v1.9.3 github.com/spf13/cobra v1.10.1 github.com/spf13/pflag v1.0.10 diff --git a/bib/go.sum b/bib/go.sum index 579249fb2..19d3a4e76 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-20251028085624-65ddc2a44aa1 h1:yR14hRmFpYRKOupGTNibLttThBKpKbEYifkGBNzv8+E= +github.com/mvo5/images v0.0.0-20251028085624-65ddc2a44aa1/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,8 @@ 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.209.0 h1:9BRf+N0op1WbQkc+7zVRBZxg4dqS4lty3i2stF3G9lo= -github.com/osbuild/images v0.209.0/go.mod h1:tZqcrs3eNUA0VPs1h3YCnbnpAskVVfo36CIi2USSfDs= +github.com/osbuild/images v0.214.0 h1:uS73cWGlleIBrDDzJsjaaT8Gc6lHnxSm8YFVDFtI6Lg= +github.com/osbuild/images v0.214.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= diff --git a/bib/internal/distrodef/distrodef.go b/bib/internal/distrodef/distrodef.go deleted file mode 100644 index 2ad279444..000000000 --- a/bib/internal/distrodef/distrodef.go +++ /dev/null @@ -1,98 +0,0 @@ -package distrodef - -import ( - "fmt" - "os" - "path/filepath" - "strings" - - "golang.org/x/exp/maps" - "go.yaml.in/yaml/v3" - - "github.com/hashicorp/go-version" -) - -// ImageDef is a structure containing extra information needed to build an image that cannot be extracted -// from the container image itself. Currently, this is only the list of packages needed for the installer -// ISO. -type ImageDef struct { - Packages []string `yaml:"packages"` -} - -func findDistroDef(defDirs []string, distro, wantedVerStr string) (string, error) { - var bestFuzzyMatch string - - bestFuzzyVer := &version.Version{} - wantedVer, err := version.NewVersion(wantedVerStr) - if err != nil { - return "", fmt.Errorf("cannot parse wanted version string: %w", err) - } - - for _, defDir := range defDirs { - // exact match - matches, err := filepath.Glob(filepath.Join(defDir, fmt.Sprintf("%s-%s.yaml", distro, wantedVerStr))) - if err != nil { - return "", err - } - if len(matches) == 1 { - return matches[0], nil - } - - // fuzzy match - matches, err = filepath.Glob(filepath.Join(defDir, fmt.Sprintf("%s-[0-9]*.yaml", distro))) - if err != nil { - return "", err - } - for _, m := range matches { - baseNoExt := strings.TrimSuffix(filepath.Base(m), ".yaml") - haveVerStr := strings.SplitN(baseNoExt, "-", 2)[1] - // this should never error (because of the glob above) but be defensive - haveVer, err := version.NewVersion(haveVerStr) - if err != nil { - return "", fmt.Errorf("cannot parse distro version from %q: %w", m, err) - } - if wantedVer.Compare(haveVer) >= 0 && haveVer.Compare(bestFuzzyVer) > 0 { - bestFuzzyVer = haveVer - bestFuzzyMatch = m - } - } - } - if bestFuzzyMatch == "" { - return "", fmt.Errorf("could not find def file for distro %s-%s", distro, wantedVerStr) - } - - return bestFuzzyMatch, nil -} - -func loadFile(defDirs []string, distro, ver string) ([]byte, error) { - defPath, err := findDistroDef(defDirs, distro, ver) - if err != nil { - return nil, err - } - - content, err := os.ReadFile(defPath) - if err != nil { - return nil, fmt.Errorf("could not read def file %s for distro %s-%s: %v", defPath, distro, ver, err) - } - return content, nil -} - -// Loads a definition file for a given distro and image type -func LoadImageDef(defDirs []string, distro, ver, it string) (*ImageDef, error) { - data, err := loadFile(defDirs, distro, ver) - if err != nil { - return nil, err - } - - var defs map[string]ImageDef - if err := yaml.Unmarshal(data, &defs); err != nil { - return nil, fmt.Errorf("could not unmarshal def file for distro %s: %v", distro, err) - } - - d, ok := defs[it] - if !ok { - return nil, fmt.Errorf("could not find def for distro %s and image type %s, available types: %s", distro, it, strings.Join(maps.Keys(defs), ", ")) - } - - return &d, nil -} diff --git a/bib/internal/distrodef/distrodef_test.go b/bib/internal/distrodef/distrodef_test.go deleted file mode 100644 index 1b5f86f5f..000000000 --- a/bib/internal/distrodef/distrodef_test.go +++ /dev/null @@ -1,148 +0,0 @@ -package distrodef - -import ( - "os" - "path/filepath" - "slices" - "strings" - "testing" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -const testDefLocation = "test_defs" - -func TestLoadSimple(t *testing.T) { - def, err := LoadImageDef([]string{testDefLocation}, "fedoratest", "41", "anaconda-iso") - require.NoError(t, err) - assert.NotEmpty(t, def.Packages) -} - -func TestLoadFuzzy(t *testing.T) { - def, err := LoadImageDef([]string{testDefLocation}, "fedoratest", "99", "anaconda-iso") - require.NoError(t, err) - assert.NotEmpty(t, def.Packages) -} - -func TestLoadUnhappy(t *testing.T) { - _, err := LoadImageDef([]string{testDefLocation}, "lizard", "42", "anaconda-iso") - assert.ErrorContains(t, err, "could not find def file for distro lizard-42") - _, err = LoadImageDef([]string{testDefLocation}, "fedoratest", "0", "anaconda-iso") - assert.ErrorContains(t, err, "could not find def file for distro fedoratest-0") - - _, err = LoadImageDef([]string{testDefLocation}, "fedoratest", "41", "anaconda-disk") - assert.ErrorContains(t, err, "could not find def for distro fedoratest and image type anaconda-disk") - - _, err = LoadImageDef([]string{testDefLocation}, "fedoratest", "xxx", "anaconda-disk") - assert.ErrorContains(t, err, `cannot parse wanted version string: `) -} - -const fakeDefFileContent = "anaconda-iso:\n packages: \n - foo\n" - -func makeFakeDistrodefRoot(t *testing.T, defFiles []string) (searchPaths []string) { - tmp := t.TempDir() - - for _, defFile := range defFiles { - p := filepath.Join(tmp, defFile) - err := os.MkdirAll(filepath.Dir(p), 0755) - require.NoError(t, err) - err = os.WriteFile(p, []byte(fakeDefFileContent), 0644) - require.NoError(t, err) - - if !slices.Contains(searchPaths, filepath.Dir(p)) { - searchPaths = append(searchPaths, filepath.Dir(p)) - } - } - - return searchPaths -} - -func TestFindDistroDefMultiDirs(t *testing.T) { - defDirs := makeFakeDistrodefRoot(t, []string{ - "a/fedora-39.yaml", - "b/fedora-41.yaml", - "c/fedora-41.yaml", - }) - assert.Equal(t, 3, len(defDirs)) - - def, err := findDistroDef(defDirs, "fedora", "41") - assert.NoError(t, err) - assert.True(t, strings.HasSuffix(def, "b/fedora-41.yaml")) -} - -func TestFindDistroDefMultiDirsIgnoreENOENT(t *testing.T) { - defDirs := makeFakeDistrodefRoot(t, []string{ - "a/fedora-41.yaml", - }) - defDirs = append([]string{"/no/such/path"}, defDirs...) - - def, err := findDistroDef(defDirs, "fedora", "41") - assert.NoError(t, err) - assert.True(t, strings.HasSuffix(def, "a/fedora-41.yaml")) -} - -func TestFindDistroDefMultiFuzzy(t *testing.T) { - defDirs := makeFakeDistrodefRoot(t, []string{ - "a/fedora-39.yaml", - "b/fedora-41.yaml", - "b/b/fedora-42.yaml", - "c/fedora-41.yaml", - }) - // no fedora-99, pick the closest - def, err := findDistroDef(defDirs, "fedora", "99") - assert.NoError(t, err) - assert.True(t, strings.HasSuffix(def, "b/b/fedora-42.yaml")) -} - -func TestFindDistroDefMultiFuzzyMinorReleases(t *testing.T) { - defDirs := makeFakeDistrodefRoot(t, []string{ - "a/centos-8.9.yaml", - "b/centos-7.yaml", - "c/centos-9.1.yaml", - "d/centos-9.1.1.yaml", - "b/b/centos-9.10.yaml", - }) - def, err := findDistroDef(defDirs, "centos", "9.11") - assert.NoError(t, err) - assert.True(t, strings.HasSuffix(def, "b/b/centos-9.10.yaml"), def) -} - -func TestFindDistroDefMultiFuzzyMinorReleasesIsZero(t *testing.T) { - defDirs := makeFakeDistrodefRoot(t, []string{ - "a/centos-9.yaml", - "a/centos-10.yaml", - }) - def, err := findDistroDef(defDirs, "centos", "10.0") - assert.NoError(t, err) - assert.True(t, strings.HasSuffix(def, "a/centos-10.yaml"), def) -} - -func TestFindDistroDefMultiFuzzyError(t *testing.T) { - defDirs := makeFakeDistrodefRoot(t, []string{ - "a/fedora-40.yaml", - }) - // the best version we have is newer than what is requested, this - // is an error - _, err := findDistroDef(defDirs, "fedora", "30") - assert.ErrorContains(t, err, "could not find def file for distro fedora-30") -} - -func TestFindDistroDefBadNumberIgnoresBadFiles(t *testing.T) { - defDirs := makeFakeDistrodefRoot(t, []string{ - "a/fedora-NaN.yaml", - }) - _, err := findDistroDef(defDirs, "fedora", "40") - assert.ErrorContains(t, err, "could not find def file for distro fedora-40") -} - -func TestFindDistroDefCornerCases(t *testing.T) { - defDirs := makeFakeDistrodefRoot(t, []string{ - "a/fedora-.yaml", - "b/fedora-1.yaml", - "c/fedora.yaml", - }) - def, err := findDistroDef(defDirs, "fedora", "2") - assert.NoError(t, err) - assert.True(t, strings.HasSuffix(def, "b/fedora-1.yaml")) -} diff --git a/bib/internal/distrodef/test_defs/fedoratest-41.yaml b/bib/internal/distrodef/test_defs/fedoratest-41.yaml deleted file mode 100644 index c010ec5a7..000000000 --- a/bib/internal/distrodef/test_defs/fedoratest-41.yaml +++ /dev/null @@ -1,4 +0,0 @@ -anaconda-iso: - packages: - - anaconda - - curl