Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use dot to separate distro major and minor version and replace distro registry with factory #332

Merged
merged 23 commits into from
Jan 25, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
51aad41
pkg: add distrofactory as a replacement for distroregistry
thozza Dec 7, 2023
dddb55d
distro/test_distro: adjust to the distrofactory approach
thozza Dec 11, 2023
6b0c864
distrofactory: add FromHost() method
thozza Dec 11, 2023
f8df7dd
Replace distroregistry with distrofactory
thozza Dec 11, 2023
74562d0
common.GetHostDistroName(): return only distro name with dot
thozza Dec 12, 2023
b6181c2
Make `reporegistry` public, so that it can be used by osbuild-composer
thozza Dec 12, 2023
879c4a6
Move `GetHostDistroName()` to `distro` package
thozza Dec 12, 2023
51366d3
Introduce `distroidparser` package for parsing distro ID strings
thozza Dec 12, 2023
80e27da
distro/fedora: delete version-specific distro constructors
thozza Dec 20, 2023
724f589
distro/rhel7: delete version-specific distro constructors
thozza Dec 20, 2023
7198517
distro/rhel8: delete version-specific distro constructors
thozza Dec 20, 2023
a791dcd
distro/rhel9: delete version-specific distro constructors
thozza Dec 20, 2023
dcd74cd
Move `rpmmd.Load*Repositories()` to `reporegistry`
thozza Dec 12, 2023
7cb1920
distro: implement `String()` for the `ID` struct.
thozza Dec 12, 2023
9d11e2a
reporegistry: handle distro ID strings with and without the dot
thozza Dec 20, 2023
9ea83e4
distro/rhel: use dot to separate minor version in distro name
thozza Dec 20, 2023
95f2141
pkg/rpmmd: support 'gpgkeys' array in JSON format of `RepoConfig`
thozza Dec 22, 2023
da287da
cmd/gen-manifests: use reporegistry instead of a custom code
thozza Dec 20, 2023
5870091
cmd/build: use reporegistry instead of a custom code
thozza Dec 20, 2023
240d8c7
distro/test_distro: remove New() in favor of DistroFactory()
thozza Jan 5, 2024
44c54a5
distrofactory: support specifying distro name aliases
thozza Jan 9, 2024
37b9dff
reporegistry: export ReposByImageTypeName instead of ReposByImageType
thozza Jan 10, 2024
49a7e6a
LoadAllRepositories: don't fail on filenames which can't be parsed
thozza Jan 11, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 14 additions & 32 deletions cmd/build/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import (
"encoding/json"
"flag"
"fmt"
"io"
"os"
"path/filepath"
"strings"
Expand All @@ -15,11 +14,12 @@ import (
"github.com/osbuild/images/pkg/blueprint"
"github.com/osbuild/images/pkg/container"
"github.com/osbuild/images/pkg/distro"
"github.com/osbuild/images/pkg/distroregistry"
"github.com/osbuild/images/pkg/distrofactory"
"github.com/osbuild/images/pkg/dnfjson"
"github.com/osbuild/images/pkg/manifest"
"github.com/osbuild/images/pkg/osbuild"
"github.com/osbuild/images/pkg/ostree"
"github.com/osbuild/images/pkg/reporegistry"
"github.com/osbuild/images/pkg/rhsm/facts"
"github.com/osbuild/images/pkg/rpmmd"
)
Expand Down Expand Up @@ -112,32 +112,6 @@ func makeManifest(imgType distro.ImageType, config BuildConfig, distribution dis
return mf, nil
}

type DistroArchRepoMap map[string]map[string][]rpmmd.RepoConfig

func readRepos() DistroArchRepoMap {
reposDir := "./test/data/repositories/"
darm := make(DistroArchRepoMap)
filelist, err := os.ReadDir(reposDir)
check(err)
for _, file := range filelist {
filename := file.Name()
if !strings.HasSuffix(filename, ".json") {
continue
}
reposFilepath := filepath.Join(reposDir, filename)
fp, err := os.Open(reposFilepath)
check(err)
defer fp.Close()
data, err := io.ReadAll(fp)
check(err)
repos := make(map[string][]rpmmd.RepoConfig)
check(json.Unmarshal(data, &repos))
distro := strings.TrimSuffix(filename, filepath.Ext(filename))
darm[distro] = repos
}
return darm
}

func resolveContainers(containers []container.SourceSpec, archName string) ([]container.Spec, error) {
resolver := container.NewResolver(archName)

Expand Down Expand Up @@ -249,16 +223,20 @@ func main() {

rngSeed, err := cmdutil.NewRNGSeed()
check(err)
darm := readRepos()
distroReg := distroregistry.NewDefault()

testedRepoRegistry, err := reporegistry.NewTestedDefault()
if err != nil {
panic(fmt.Sprintf("failed to create repo registry with tested distros: %v", err))
}
distroFac := distrofactory.NewDefault()

config := loadConfig(configFile)

if err := os.MkdirAll(outputDir, 0777); err != nil {
fail(fmt.Sprintf("failed to create target directory: %s", err.Error()))
}

distribution := distroReg.GetDistro(distroName)
distribution := distroFac.GetDistro(distroName)
if distribution == nil {
fail(fmt.Sprintf("invalid or unsupported distribution: %q", distroName))
}
Expand All @@ -281,7 +259,11 @@ func main() {
}

// get repositories
repos := filterRepos(darm[distroName][archName], imgTypeName)
repos, err := testedRepoRegistry.ReposByArchName(distroName, archName, true)
if err != nil {
panic(fmt.Sprintf("failed to get repositories for %s/%s: %v", distroName, archName, err))
}
repos = filterRepos(repos, imgTypeName)
if len(repos) == 0 {
fail(fmt.Sprintf("no repositories defined for %s/%s\n", distroName, archName))
}
Expand Down
60 changes: 20 additions & 40 deletions cmd/gen-manifests/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,11 @@ import (
"github.com/osbuild/images/pkg/blueprint"
"github.com/osbuild/images/pkg/container"
"github.com/osbuild/images/pkg/distro"
"github.com/osbuild/images/pkg/distroregistry"
"github.com/osbuild/images/pkg/distrofactory"
"github.com/osbuild/images/pkg/dnfjson"
"github.com/osbuild/images/pkg/manifest"
"github.com/osbuild/images/pkg/ostree"
"github.com/osbuild/images/pkg/reporegistry"
"github.com/osbuild/images/pkg/rhsm/facts"
"github.com/osbuild/images/pkg/rpmmd"
)
Expand Down Expand Up @@ -291,40 +292,6 @@ func makeManifestJob(
return job
}

type DistroArchRepoMap map[string]map[string][]rpmmd.RepoConfig

func readRepos() DistroArchRepoMap {
reposDir := "./test/data/repositories/"
darm := make(DistroArchRepoMap)
filelist, err := os.ReadDir(reposDir)
if err != nil {
panic(err)
}
for _, file := range filelist {
filename := file.Name()
if !strings.HasSuffix(filename, ".json") {
continue
}
reposFilepath := filepath.Join(reposDir, filename)
fp, err := os.Open(reposFilepath)
if err != nil {
panic(err)
}
defer fp.Close()
data, err := io.ReadAll(fp)
if err != nil {
panic(err)
}
repos := make(map[string][]rpmmd.RepoConfig)
if err := json.Unmarshal(data, &repos); err != nil {
panic(err)
}
distro := strings.TrimSuffix(filename, filepath.Ext(filename))
darm[distro] = repos
}
return darm
}

func resolveContainers(containers []container.SourceSpec, archName string) ([]container.Spec, error) {
resolver := container.NewResolver(archName)

Expand Down Expand Up @@ -559,8 +526,13 @@ func main() {
if err != nil {
panic(err)
}
darm := readRepos()
distroReg := distroregistry.NewDefault()

testedRepoRegistry, err := reporegistry.NewTestedDefault()
if err != nil {
panic(fmt.Sprintf("failed to create repo registry with tested distros: %v", err))
}

distroFac := distrofactory.NewDefault()
jobs := make([]manifestJob, 0)

contentResolve := map[string]bool{
Expand All @@ -582,12 +554,17 @@ func main() {
}

fmt.Println("Collecting jobs")
distros, invalidDistros := resolveArgValues(distros, distroReg.List())

distros, invalidDistros := resolveArgValues(distros, testedRepoRegistry.ListDistros())
if len(invalidDistros) > 0 {
fmt.Fprintf(os.Stderr, "WARNING: invalid distro names: [%s]\n", strings.Join(invalidDistros, ","))
}
for _, distroName := range distros {
distribution := distroReg.GetDistro(distroName)
distribution := distroFac.GetDistro(distroName)
if distribution == nil {
fmt.Fprintf(os.Stderr, "WARNING: invalid distro name %q\n", distroName)
continue
}

distroArches, invalidArches := resolveArgValues(arches, distribution.ListArches())
if len(invalidArches) > 0 {
Expand All @@ -612,7 +589,10 @@ func main() {
}

// get repositories
repos := darm[distroName][archName]
repos, err := testedRepoRegistry.ReposByArchName(distroName, archName, true)
if err != nil {
panic(fmt.Sprintf("failed to get repositories for %s/%s: %v", distroName, archName, err))
}
repos = filterRepos(repos, imgTypeName)
if len(repos) == 0 {
fmt.Printf("no repositories defined for %s/%s/%s\n", distroName, archName, imgTypeName)
Expand Down
17 changes: 13 additions & 4 deletions cmd/list-images/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@ import (
"strings"

"github.com/gobwas/glob"
"github.com/osbuild/images/pkg/distroregistry"
"github.com/osbuild/images/pkg/distrofactory"
"github.com/osbuild/images/pkg/reporegistry"
)

type multiValue []string
Expand Down Expand Up @@ -74,15 +75,23 @@ func main() {
flag.BoolVar(&json, "json", false, "print configs as json")
flag.Parse()

distroReg := distroregistry.NewDefault()
distros, invalidDistros := resolveArgValues(distros, distroReg.List())
testedRepoRegistry, err := reporegistry.NewTestedDefault()
if err != nil {
panic(fmt.Sprintf("failed to create repo registry with tested distros: %v", err))
}
distroFac := distrofactory.NewDefault()
distros, invalidDistros := resolveArgValues(distros, testedRepoRegistry.ListDistros())
if len(invalidDistros) > 0 {
fmt.Fprintf(os.Stderr, "WARNING: invalid distro names: [%s]\n", strings.Join(invalidDistros, ","))
}

configs := make([]config, 0)
for _, distroName := range distros {
distribution := distroReg.GetDistro(distroName)
distribution := distroFac.GetDistro(distroName)
if distribution == nil {
fmt.Fprintf(os.Stderr, "WARNING: invalid distro name %q", distroName)
continue
}

distroArches, invalidArches := resolveArgValues(arches, distribution.ListArches())
if len(invalidArches) > 0 {
Expand Down
21 changes: 16 additions & 5 deletions cmd/osbuild-composer-image-definitions/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,26 @@ import (
"fmt"
"os"

"github.com/osbuild/images/pkg/distroregistry"
"github.com/osbuild/images/pkg/distrofactory"
"github.com/osbuild/images/pkg/reporegistry"
)

func main() {
definitions := map[string]map[string][]string{}
distroRegistry := distroregistry.NewDefault()
distroFac := distrofactory.NewDefault()

testedRepoRegistry, err := reporegistry.NewTestedDefault()
if err != nil {
panic(fmt.Sprintf("failed to create repo registry with tested distros: %v", err))
}

for _, distroName := range testedRepoRegistry.ListDistros() {
distro := distroFac.GetDistro(distroName)
if distro == nil {
fmt.Fprintf(os.Stderr, "WARNING: invalid distro name %q", distroName)
continue
}

for _, distroName := range distroRegistry.List() {
distro := distroRegistry.GetDistro(distroName)
for _, archName := range distro.ListArches() {
arch, err := distro.GetArch(archName)
if err != nil {
Expand All @@ -28,7 +39,7 @@ func main() {
}

encoder := json.NewEncoder(os.Stdout)
err := encoder.Encode(definitions)
err = encoder.Encode(definitions)
if err != nil {
panic(err)
}
Expand Down
33 changes: 17 additions & 16 deletions cmd/osbuild-dnf-json-tests/main_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,10 @@ import (
"github.com/osbuild/images/pkg/arch"
"github.com/osbuild/images/pkg/blueprint"
"github.com/osbuild/images/pkg/distro"
rhel "github.com/osbuild/images/pkg/distro/rhel8"
"github.com/osbuild/images/pkg/distro/rhel9"
"github.com/osbuild/images/pkg/dnfjson"
"github.com/osbuild/images/pkg/ostree"
"github.com/osbuild/images/pkg/reporegistry"
"github.com/osbuild/images/pkg/rpmmd"
)

Expand All @@ -27,20 +28,20 @@ func TestCrossArchDepsolve(t *testing.T) {
repoDir := "/usr/share/tests/osbuild-composer"

// NOTE: we can add RHEL, but don't make it hard requirement because it will fail outside of VPN
cs9 := rhel.NewCentos()
c9s := rhel9.DistroFactory("centos-9")

// Set up temporary directory for rpm/dnf cache
dir := t.TempDir()
baseSolver := dnfjson.NewBaseSolver(dir)

repos, err := rpmmd.LoadRepositories([]string{repoDir}, cs9.Name())
require.NoErrorf(t, err, "Failed to LoadRepositories %v", cs9.Name())
repos, err := reporegistry.LoadRepositories([]string{repoDir}, c9s.Name())
require.NoErrorf(t, err, "Failed to LoadRepositories %v", c9s.Name())

for _, archStr := range cs9.ListArches() {
for _, archStr := range c9s.ListArches() {
t.Run(archStr, func(t *testing.T) {
arch, err := cs9.GetArch(archStr)
arch, err := c9s.GetArch(archStr)
require.NoError(t, err)
solver := baseSolver.NewWithConfig(cs9.ModulePlatformID(), cs9.Releasever(), archStr, cs9.Name())
solver := baseSolver.NewWithConfig(c9s.ModulePlatformID(), c9s.Releasever(), archStr, c9s.Name())
for _, imgTypeStr := range arch.ListImageTypes() {
t.Run(imgTypeStr, func(t *testing.T) {
imgType, err := arch.GetImageType(imgTypeStr)
Expand Down Expand Up @@ -81,26 +82,26 @@ func TestDepsolvePackageSets(t *testing.T) {
repoDir := "/usr/share/tests/osbuild-composer"

// NOTE: we can add RHEL, but don't make it hard requirement because it will fail outside of VPN
cs9 := rhel.NewCentos()
c9s := rhel9.DistroFactory("centos-9")

// Set up temporary directory for rpm/dnf cache
dir := t.TempDir()
solver := dnfjson.NewSolver(cs9.ModulePlatformID(), cs9.Releasever(), arch.ARCH_X86_64.String(), cs9.Name(), dir)
solver := dnfjson.NewSolver(c9s.ModulePlatformID(), c9s.Releasever(), arch.ARCH_X86_64.String(), c9s.Name(), dir)

repos, err := rpmmd.LoadRepositories([]string{repoDir}, cs9.Name())
require.NoErrorf(t, err, "Failed to LoadRepositories %v", cs9.Name())
repos, err := reporegistry.LoadRepositories([]string{repoDir}, c9s.Name())
require.NoErrorf(t, err, "Failed to LoadRepositories %v", c9s.Name())
x86Repos, ok := repos[arch.ARCH_X86_64.String()]
require.Truef(t, ok, "failed to get %q repos for %q", arch.ARCH_X86_64.String(), cs9.Name())
require.Truef(t, ok, "failed to get %q repos for %q", arch.ARCH_X86_64.String(), c9s.Name())

x86Arch, err := cs9.GetArch(arch.ARCH_X86_64.String())
require.Nilf(t, err, "failed to get %q arch of %q distro", arch.ARCH_X86_64.String(), cs9.Name())
x86Arch, err := c9s.GetArch(arch.ARCH_X86_64.String())
require.Nilf(t, err, "failed to get %q arch of %q distro", arch.ARCH_X86_64.String(), c9s.Name())

qcow2ImageTypeName := "qcow2"
qcow2Image, err := x86Arch.GetImageType(qcow2ImageTypeName)
require.Nilf(t, err, "failed to get %q image type of %q/%q distro/arch", qcow2ImageTypeName, cs9.Name(), arch.ARCH_X86_64.String())
require.Nilf(t, err, "failed to get %q image type of %q/%q distro/arch", qcow2ImageTypeName, c9s.Name(), arch.ARCH_X86_64.String())

manifestSource, _, err := qcow2Image.Manifest(&blueprint.Blueprint{Packages: []blueprint.Package{{Name: "bind"}}}, distro.ImageOptions{}, x86Repos, 0)
require.Nilf(t, err, "failed to initialise manifest for %q image type of %q/%q distro/arch", qcow2ImageTypeName, cs9.Name(), arch.ARCH_X86_64.String())
require.Nilf(t, err, "failed to initialise manifest for %q image type of %q/%q distro/arch", qcow2ImageTypeName, c9s.Name(), arch.ARCH_X86_64.String())
imagePkgSets := manifestSource.GetPackageSetChains()

gotPackageSpecsSets := make(map[string][]rpmmd.PackageSpec, len(imagePkgSets))
Expand Down
6 changes: 3 additions & 3 deletions cmd/osbuild-package-sets/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import (

"github.com/osbuild/images/pkg/blueprint"
"github.com/osbuild/images/pkg/distro"
"github.com/osbuild/images/pkg/distroregistry"
"github.com/osbuild/images/pkg/distrofactory"
"github.com/osbuild/images/pkg/ostree"
)

Expand All @@ -29,9 +29,9 @@ func main() {
os.Exit(1)
}

dr := distroregistry.NewDefault()
df := distrofactory.NewDefault()

d := dr.GetDistro(distroName)
d := df.GetDistro(distroName)
if d == nil {
panic(fmt.Errorf("Distro %q does not exist", distroName))
}
Expand Down
Loading
Loading