Repository: osbuild/osbuild-composer
Pull request #328 (2020-03-15 22:05:55)

A handful of cleanups
See individual commits for details.


Patch:
diff --git a/cmd/osbuild-pipeline/main.go b/cmd/osbuild-pipeline/main.go
index 512f63ca2..0b5d24d98 100644
--- a/cmd/osbuild-pipeline/main.go
+++ b/cmd/osbuild-pipeline/main.go
@@ -139,7 +139,7 @@ func main() {
 		}
 	} else {
 		size := d.GetSizeForOutputType(imageType, 0)
-		manifest, err := d.Manifest(blueprint, nil, packageSpecs, buildPackageSpecs, archArg, imageType, size)
+		manifest, err := d.Manifest(blueprint.Customizations, nil, packageSpecs, buildPackageSpecs, archArg, imageType, size)
 		if err != nil {
 			panic(err.Error())
 		}
diff --git a/dnf-json b/dnf-json
index bc4da2faf..30c4f7a4b 100755
--- a/dnf-json
+++ b/dnf-json
@@ -21,7 +21,6 @@ def dnfrepo(desc, parent_conf=None):
     """Makes a dnf.repo.Repo out of a JSON repository description"""
 
     repo = dnf.repo.Repo(desc["id"], parent_conf)
-    repo.name = desc["name"]
 
     if "baseurl" in desc:
         repo.baseurl = desc["baseurl"]
@@ -137,6 +136,8 @@ with tempfile.TemporaryDirectory() as persistdir:
                 "version": package.version,
                 "release": package.release,
                 "arch": package.arch,
+                "repo_id": package.reponame,
+                "path": package.relativepath,
                 "remote_location": package.remote_location(),
                 "checksum": f"{hawkey.chksum_name(package.chksum[0])}:{package.chksum[1].hex()}",
             })
diff --git a/internal/blueprint/blueprint.go b/internal/blueprint/blueprint.go
index b3785a22b..cd4e922c7 100644
--- a/internal/blueprint/blueprint.go
+++ b/internal/blueprint/blueprint.go
@@ -106,112 +106,6 @@ func (b *Blueprint) GetPackages() []string {
 	return packages
 }
 
-func (b *Blueprint) GetHostname() *string {
-	if b.Customizations == nil {
-		return nil
-	}
-	return b.Customizations.Hostname
-}
-
-func (b *Blueprint) GetPrimaryLocale() (*string, *string) {
-	if b.Customizations == nil {
-		return nil, nil
-	}
-	if b.Customizations.Locale == nil {
-		return nil, nil
-	}
-	if len(b.Customizations.Locale.Languages) == 0 {
-		return nil, b.Customizations.Locale.Keyboard
-	}
-	return &b.Customizations.Locale.Languages[0], b.Customizations.Locale.Keyboard
-}
-
-func (b *Blueprint) GetTimezoneSettings() (*string, []string) {
-	if b.Customizations == nil {
-		return nil, nil
-	}
-	if b.Customizations.Timezone == nil {
-		return nil, nil
-	}
-	return b.Customizations.Timezone.Timezone, b.Customizations.Timezone.NTPServers
-}
-
-func (b *Blueprint) GetUsers() []UserCustomization {
-	if b.Customizations == nil {
-		return nil
-	}
-
-	users := []UserCustomization{}
-
-	// prepend sshkey for backwards compat (overridden by users)
-	if len(b.Customizations.SSHKey) > 0 {
-		for _, c := range b.Customizations.SSHKey {
-			users = append(users, UserCustomization{
-				Name: c.User,
-				Key:  &c.Key,
-			})
-		}
-	}
-
-	return append(users, b.Customizations.User...)
-}
-
-func (b *Blueprint) GetGroups() []GroupCustomization {
-	if b.Customizations == nil {
-		return nil
-	}
-
-	// This is for parity with lorax, which assumes that for each
-	// user, a group with that name already exists. Thus, filter groups
-	// named like an existing user.
-
-	groups := []GroupCustomization{}
-	for _, group := range b.Customizations.Group {
-		exists := false
-		for _, user := range b.Customizations.User {
-			if user.Name == group.Name {
-				exists = true
-				break
-			}
-		}
-		for _, key := range b.Customizations.SSHKey {
-			if key.User == group.Name {
-				exists = true
-				break
-			}
-		}
-		if !exists {
-			groups = append(groups, group)
-		}
-	}
-
-	return groups
-}
-
-func (b *Blueprint) GetKernel() *KernelCustomization {
-	if b.Customizations == nil {
-		return nil
-	}
-
-	return b.Customizations.Kernel
-}
-
-func (b *Blueprint) GetFirewall() *FirewallCustomization {
-	if b.Customizations == nil {
-		return nil
-	}
-
-	return b.Customizations.Firewall
-}
-
-func (b *Blueprint) GetServices() *ServicesCustomization {
-	if b.Customizations == nil {
-		return nil
-	}
-
-	return b.Customizations.Services
-}
-
 func (p Package) ToNameVersion() string {
 	// Omit version to prevent all packages with prefix of name to be installed
 	if p.Version == "*" {
diff --git a/internal/blueprint/customizations.go b/internal/blueprint/customizations.go
index d5ccedd4b..b94ab798b 100644
--- a/internal/blueprint/customizations.go
+++ b/internal/blueprint/customizations.go
@@ -70,3 +70,109 @@ type CustomizationError struct {
 func (e *CustomizationError) Error() string {
 	return e.Message
 }
+
+func (c *Customizations) GetHostname() *string {
+	if c == nil {
+		return nil
+	}
+	return c.Hostname
+}
+
+func (c *Customizations) GetPrimaryLocale() (*string, *string) {
+	if c == nil {
+		return nil, nil
+	}
+	if c.Locale == nil {
+		return nil, nil
+	}
+	if len(c.Locale.Languages) == 0 {
+		return nil, c.Locale.Keyboard
+	}
+	return &c.Locale.Languages[0], c.Locale.Keyboard
+}
+
+func (c *Customizations) GetTimezoneSettings() (*string, []string) {
+	if c == nil {
+		return nil, nil
+	}
+	if c.Timezone == nil {
+		return nil, nil
+	}
+	return c.Timezone.Timezone, c.Timezone.NTPServers
+}
+
+func (c *Customizations) GetUsers() []UserCustomization {
+	if c == nil {
+		return nil
+	}
+
+	users := []UserCustomization{}
+
+	// prepend sshkey for backwards compat (overridden by users)
+	if len(c.SSHKey) > 0 {
+		for _, c := range c.SSHKey {
+			users = append(users, UserCustomization{
+				Name: c.User,
+				Key:  &c.Key,
+			})
+		}
+	}
+
+	return append(users, c.User...)
+}
+
+func (c *Customizations) GetGroups() []GroupCustomization {
+	if c == nil {
+		return nil
+	}
+
+	// This is for parity with lorax, which assumes that for each
+	// user, a group with that name already exists. Thus, filter groups
+	// named like an existing user.
+
+	groups := []GroupCustomization{}
+	for _, group := range c.Group {
+		exists := false
+		for _, user := range c.User {
+			if user.Name == group.Name {
+				exists = true
+				break
+			}
+		}
+		for _, key := range c.SSHKey {
+			if key.User == group.Name {
+				exists = true
+				break
+			}
+		}
+		if !exists {
+			groups = append(groups, group)
+		}
+	}
+
+	return groups
+}
+
+func (c *Customizations) GetKernel() *KernelCustomization {
+	if c == nil {
+		return nil
+	}
+
+	return c.Kernel
+}
+
+func (c *Customizations) GetFirewall() *FirewallCustomization {
+	if c == nil {
+		return nil
+	}
+
+	return c.Firewall
+}
+
+func (c *Customizations) GetServices() *ServicesCustomization {
+	if c == nil {
+		return nil
+	}
+
+	return c.Services
+}
diff --git a/internal/distro/distro.go b/internal/distro/distro.go
index 5491c652c..008355103 100644
--- a/internal/distro/distro.go
+++ b/internal/distro/distro.go
@@ -58,7 +58,7 @@ type Distro interface {
 	// Returns an osbuild manifest, containing the sources and pipeline necessary
 	// to generates an image in the given output format with all packages and
 	// customizations specified in the given blueprint.
-	Manifest(b *blueprint.Blueprint, additionalRepos []rpmmd.RepoConfig, packageSpecs, buildPackageSpecs []rpmmd.PackageSpec, outputArchitecture, imageFormat string, size uint64) (*osbuild.Manifest, error)
+	Manifest(b *blueprint.Customizations, additionalRepos []rpmmd.RepoConfig, packageSpecs, buildPackageSpecs []rpmmd.PackageSpec, outputArchitecture, imageFormat string, size uint64) (*osbuild.Manifest, error)
 
 	// Returns a osbuild runner that can be used on this distro.
 	Runner() string
diff --git a/internal/distro/fedora30/distro.go b/internal/distro/fedora30/distro.go
index e866ef4bd..362f804f6 100644
--- a/internal/distro/fedora30/distro.go
+++ b/internal/distro/fedora30/distro.go
@@ -386,7 +386,7 @@ func (r *Fedora30) BuildPackages(outputArchitecture string) ([]string, error) {
 	return append(r.buildPackages, arch.BuildPackages...), nil
 }
 
-func (r *Fedora30) pipeline(b *blueprint.Blueprint, additionalRepos []rpmmd.RepoConfig, packageSpecs, buildPackageSpecs []rpmmd.PackageSpec, outputArchitecture, outputFormat string, size uint64) (*osbuild.Pipeline, error) {
+func (r *Fedora30) pipeline(c *blueprint.Customizations, additionalRepos []rpmmd.RepoConfig, packageSpecs, buildPackageSpecs []rpmmd.PackageSpec, outputArchitecture, outputFormat string, size uint64) (*osbuild.Pipeline, error) {
 	output, exists := r.outputs[outputFormat]
 	if !exists {
 		return nil, errors.New("invalid output format: " + outputFormat)
@@ -404,7 +404,7 @@ func (r *Fedora30) pipeline(b *blueprint.Blueprint, additionalRepos []rpmmd.Repo
 	p.AddStage(osbuild.NewFixBLSStage())
 
 	// TODO support setting all languages and install corresponding langpack-* package
-	language, keyboard := b.GetPrimaryLocale()
+	language, keyboard := c.GetPrimaryLocale()
 
 	if language != nil {
 		p.AddStage(osbuild.NewLocaleStage(&osbuild.LocaleStageOptions{*language}))
@@ -416,11 +416,11 @@ func (r *Fedora30) pipeline(b *blueprint.Blueprint, additionalRepos []rpmmd.Repo
 		p.AddStage(osbuild.NewKeymapStage(&osbuild.KeymapStageOptions{*keyboard}))
 	}
 
-	if hostname := b.GetHostname(); hostname != nil {
+	if hostname := c.GetHostname(); hostname != nil {
 		p.AddStage(osbuild.NewHostnameStage(&osbuild.HostnameStageOptions{*hostname}))
 	}
 
-	timezone, ntpServers := b.GetTimezoneSettings()
+	timezone, ntpServers := c.GetTimezoneSettings()
 
 	// TODO install chrony when this is set?
 	if timezone != nil {
@@ -431,7 +431,7 @@ func (r *Fedora30) pipeline(b *blueprint.Blueprint, additionalRepos []rpmmd.Repo
 		p.AddStage(osbuild.NewChronyStage(&osbuild.ChronyStageOptions{ntpServers}))
 	}
 
-	if users := b.GetUsers(); len(users) > 0 {
+	if users := c.GetUsers(); len(users) > 0 {
 		options, err := r.userStageOptions(users)
 		if err != nil {
 			return nil, err
@@ -439,20 +439,20 @@ func (r *Fedora30) pipeline(b *blueprint.Blueprint, additionalRepos []rpmmd.Repo
 		p.AddStage(osbuild.NewUsersStage(options))
 	}
 
-	if groups := b.GetGroups(); len(groups) > 0 {
+	if groups := c.GetGroups(); len(groups) > 0 {
 		p.AddStage(osbuild.NewGroupsStage(r.groupStageOptions(groups)))
 	}
 
 	if output.Bootable {
 		p.AddStage(osbuild.NewFSTabStage(r.fsTabStageOptions(arch.UEFI)))
 	}
-	p.AddStage(osbuild.NewGRUB2Stage(r.grub2StageOptions(output.KernelOptions, b.GetKernel(), arch.UEFI)))
+	p.AddStage(osbuild.NewGRUB2Stage(r.grub2StageOptions(output.KernelOptions, c.GetKernel(), arch.UEFI)))
 
-	if services := b.GetServices(); services != nil || output.EnabledServices != nil {
+	if services := c.GetServices(); services != nil || output.EnabledServices != nil {
 		p.AddStage(osbuild.NewSystemdStage(r.systemdStageOptions(output.EnabledServices, output.DisabledServices, services)))
 	}
 
-	if firewall := b.GetFirewall(); firewall != nil {
+	if firewall := c.GetFirewall(); firewall != nil {
 		p.AddStage(osbuild.NewFirewallStage(r.firewallStageOptions(firewall)))
 	}
 
@@ -475,8 +475,8 @@ func (r *Fedora30) sources(packages []rpmmd.PackageSpec) *osbuild.Sources {
 	}
 }
 
-func (r *Fedora30) Manifest(b *blueprint.Blueprint, additionalRepos []rpmmd.RepoConfig, packageSpecs, buildPackageSpecs []rpmmd.PackageSpec, outputArchitecture, outputFormat string, size uint64) (*osbuild.Manifest, error) {
-	pipeline, err := r.pipeline(b, additionalRepos, packageSpecs, buildPackageSpecs, outputArchitecture, outputFormat, size)
+func (r *Fedora30) Manifest(c *blueprint.Customizations, additionalRepos []rpmmd.RepoConfig, packageSpecs, buildPackageSpecs []rpmmd.PackageSpec, outputArchitecture, outputFormat string, size uint64) (*osbuild.Manifest, error) {
+	pipeline, err := r.pipeline(c, additionalRepos, packageSpecs, buildPackageSpecs, outputArchitecture, outputFormat, size)
 	if err != nil {
 		return nil, err
 	}
diff --git a/internal/distro/fedora31/distro.go b/internal/distro/fedora31/distro.go
index 2edbfa0cd..9b7204182 100644
--- a/internal/distro/fedora31/distro.go
+++ b/internal/distro/fedora31/distro.go
@@ -386,7 +386,7 @@ func (r *Fedora31) BuildPackages(outputArchitecture string) ([]string, error) {
 	return append(r.buildPackages, arch.BuildPackages...), nil
 }
 
-func (r *Fedora31) pipeline(b *blueprint.Blueprint, additionalRepos []rpmmd.RepoConfig, packageSpecs, buildPackageSpecs []rpmmd.PackageSpec, outputArchitecture, outputFormat string, size uint64) (*osbuild.Pipeline, error) {
+func (r *Fedora31) pipeline(c *blueprint.Customizations, additionalRepos []rpmmd.RepoConfig, packageSpecs, buildPackageSpecs []rpmmd.PackageSpec, outputArchitecture, outputFormat string, size uint64) (*osbuild.Pipeline, error) {
 	output, exists := r.outputs[outputFormat]
 	if !exists {
 		return nil, errors.New("invalid output format: " + outputFormat)
@@ -404,7 +404,7 @@ func (r *Fedora31) pipeline(b *blueprint.Blueprint, additionalRepos []rpmmd.Repo
 	p.AddStage(osbuild.NewFixBLSStage())
 
 	// TODO support setting all languages and install corresponding langpack-* package
-	language, keyboard := b.GetPrimaryLocale()
+	language, keyboard := c.GetPrimaryLocale()
 
 	if language != nil {
 		p.AddStage(osbuild.NewLocaleStage(&osbuild.LocaleStageOptions{*language}))
@@ -416,11 +416,11 @@ func (r *Fedora31) pipeline(b *blueprint.Blueprint, additionalRepos []rpmmd.Repo
 		p.AddStage(osbuild.NewKeymapStage(&osbuild.KeymapStageOptions{*keyboard}))
 	}
 
-	if hostname := b.GetHostname(); hostname != nil {
+	if hostname := c.GetHostname(); hostname != nil {
 		p.AddStage(osbuild.NewHostnameStage(&osbuild.HostnameStageOptions{*hostname}))
 	}
 
-	timezone, ntpServers := b.GetTimezoneSettings()
+	timezone, ntpServers := c.GetTimezoneSettings()
 
 	// TODO install chrony when this is set?
 	if timezone != nil {
@@ -431,7 +431,7 @@ func (r *Fedora31) pipeline(b *blueprint.Blueprint, additionalRepos []rpmmd.Repo
 		p.AddStage(osbuild.NewChronyStage(&osbuild.ChronyStageOptions{ntpServers}))
 	}
 
-	if users := b.GetUsers(); len(users) > 0 {
+	if users := c.GetUsers(); len(users) > 0 {
 		options, err := r.userStageOptions(users)
 		if err != nil {
 			return nil, err
@@ -439,20 +439,20 @@ func (r *Fedora31) pipeline(b *blueprint.Blueprint, additionalRepos []rpmmd.Repo
 		p.AddStage(osbuild.NewUsersStage(options))
 	}
 
-	if groups := b.GetGroups(); len(groups) > 0 {
+	if groups := c.GetGroups(); len(groups) > 0 {
 		p.AddStage(osbuild.NewGroupsStage(r.groupStageOptions(groups)))
 	}
 
 	if output.Bootable {
 		p.AddStage(osbuild.NewFSTabStage(r.fsTabStageOptions(arch.UEFI)))
 	}
-	p.AddStage(osbuild.NewGRUB2Stage(r.grub2StageOptions(output.KernelOptions, b.GetKernel(), arch.UEFI)))
+	p.AddStage(osbuild.NewGRUB2Stage(r.grub2StageOptions(output.KernelOptions, c.GetKernel(), arch.UEFI)))
 
-	if services := b.GetServices(); services != nil || output.EnabledServices != nil {
+	if services := c.GetServices(); services != nil || output.EnabledServices != nil {
 		p.AddStage(osbuild.NewSystemdStage(r.systemdStageOptions(output.EnabledServices, output.DisabledServices, services)))
 	}
 
-	if firewall := b.GetFirewall(); firewall != nil {
+	if firewall := c.GetFirewall(); firewall != nil {
 		p.AddStage(osbuild.NewFirewallStage(r.firewallStageOptions(firewall)))
 	}
 
@@ -475,8 +475,8 @@ func (r *Fedora31) sources(packages []rpmmd.PackageSpec) *osbuild.Sources {
 	}
 }
 
-func (r *Fedora31) Manifest(b *blueprint.Blueprint, additionalRepos []rpmmd.RepoConfig, packageSpecs, buildPackageSpecs []rpmmd.PackageSpec, outputArchitecture, outputFormat string, size uint64) (*osbuild.Manifest, error) {
-	pipeline, err := r.pipeline(b, additionalRepos, packageSpecs, buildPackageSpecs, outputArchitecture, outputFormat, size)
+func (r *Fedora31) Manifest(c *blueprint.Customizations, additionalRepos []rpmmd.RepoConfig, packageSpecs, buildPackageSpecs []rpmmd.PackageSpec, outputArchitecture, outputFormat string, size uint64) (*osbuild.Manifest, error) {
+	pipeline, err := r.pipeline(c, additionalRepos, packageSpecs, buildPackageSpecs, outputArchitecture, outputFormat, size)
 	if err != nil {
 		return nil, err
 	}
diff --git a/internal/distro/fedora32/distro.go b/internal/distro/fedora32/distro.go
index 6a4b443ec..d7b732c30 100644
--- a/internal/distro/fedora32/distro.go
+++ b/internal/distro/fedora32/distro.go
@@ -386,7 +386,7 @@ func (r *Fedora32) BuildPackages(outputArchitecture string) ([]string, error) {
 	return append(r.buildPackages, arch.BuildPackages...), nil
 }
 
-func (r *Fedora32) pipeline(b *blueprint.Blueprint, additionalRepos []rpmmd.RepoConfig, packageSpecs, buildPackageSpecs []rpmmd.PackageSpec, outputArchitecture, outputFormat string, size uint64) (*osbuild.Pipeline, error) {
+func (r *Fedora32) pipeline(c *blueprint.Customizations, additionalRepos []rpmmd.RepoConfig, packageSpecs, buildPackageSpecs []rpmmd.PackageSpec, outputArchitecture, outputFormat string, size uint64) (*osbuild.Pipeline, error) {
 	output, exists := r.outputs[outputFormat]
 	if !exists {
 		return nil, errors.New("invalid output format: " + outputFormat)
@@ -404,7 +404,7 @@ func (r *Fedora32) pipeline(b *blueprint.Blueprint, additionalRepos []rpmmd.Repo
 	p.AddStage(osbuild.NewFixBLSStage())
 
 	// TODO support setting all languages and install corresponding langpack-* package
-	language, keyboard := b.GetPrimaryLocale()
+	language, keyboard := c.GetPrimaryLocale()
 
 	if language != nil {
 		p.AddStage(osbuild.NewLocaleStage(&osbuild.LocaleStageOptions{*language}))
@@ -416,11 +416,11 @@ func (r *Fedora32) pipeline(b *blueprint.Blueprint, additionalRepos []rpmmd.Repo
 		p.AddStage(osbuild.NewKeymapStage(&osbuild.KeymapStageOptions{*keyboard}))
 	}
 
-	if hostname := b.GetHostname(); hostname != nil {
+	if hostname := c.GetHostname(); hostname != nil {
 		p.AddStage(osbuild.NewHostnameStage(&osbuild.HostnameStageOptions{*hostname}))
 	}
 
-	timezone, ntpServers := b.GetTimezoneSettings()
+	timezone, ntpServers := c.GetTimezoneSettings()
 
 	// TODO install chrony when this is set?
 	if timezone != nil {
@@ -431,7 +431,7 @@ func (r *Fedora32) pipeline(b *blueprint.Blueprint, additionalRepos []rpmmd.Repo
 		p.AddStage(osbuild.NewChronyStage(&osbuild.ChronyStageOptions{ntpServers}))
 	}
 
-	if users := b.GetUsers(); len(users) > 0 {
+	if users := c.GetUsers(); len(users) > 0 {
 		options, err := r.userStageOptions(users)
 		if err != nil {
 			return nil, err
@@ -439,20 +439,20 @@ func (r *Fedora32) pipeline(b *blueprint.Blueprint, additionalRepos []rpmmd.Repo
 		p.AddStage(osbuild.NewUsersStage(options))
 	}
 
-	if groups := b.GetGroups(); len(groups) > 0 {
+	if groups := c.GetGroups(); len(groups) > 0 {
 		p.AddStage(osbuild.NewGroupsStage(r.groupStageOptions(groups)))
 	}
 
 	if output.Bootable {
 		p.AddStage(osbuild.NewFSTabStage(r.fsTabStageOptions(arch.UEFI)))
 	}
-	p.AddStage(osbuild.NewGRUB2Stage(r.grub2StageOptions(output.KernelOptions, b.GetKernel(), arch.UEFI)))
+	p.AddStage(osbuild.NewGRUB2Stage(r.grub2StageOptions(output.KernelOptions, c.GetKernel(), arch.UEFI)))
 
-	if services := b.GetServices(); services != nil || output.EnabledServices != nil {
+	if services := c.GetServices(); services != nil || output.EnabledServices != nil {
 		p.AddStage(osbuild.NewSystemdStage(r.systemdStageOptions(output.EnabledServices, output.DisabledServices, services)))
 	}
 
-	if firewall := b.GetFirewall(); firewall != nil {
+	if firewall := c.GetFirewall(); firewall != nil {
 		p.AddStage(osbuild.NewFirewallStage(r.firewallStageOptions(firewall)))
 	}
 
@@ -475,8 +475,8 @@ func (r *Fedora32) sources(packages []rpmmd.PackageSpec) *osbuild.Sources {
 	}
 }
 
-func (r *Fedora32) Manifest(b *blueprint.Blueprint, additionalRepos []rpmmd.RepoConfig, packageSpecs, buildPackageSpecs []rpmmd.PackageSpec, outputArchitecture, outputFormat string, size uint64) (*osbuild.Manifest, error) {
-	pipeline, err := r.pipeline(b, additionalRepos, packageSpecs, buildPackageSpecs, outputArchitecture, outputFormat, size)
+func (r *Fedora32) Manifest(c *blueprint.Customizations, additionalRepos []rpmmd.RepoConfig, packageSpecs, buildPackageSpecs []rpmmd.PackageSpec, outputArchitecture, outputFormat string, size uint64) (*osbuild.Manifest, error) {
+	pipeline, err := r.pipeline(c, additionalRepos, packageSpecs, buildPackageSpecs, outputArchitecture, outputFormat, size)
 	if err != nil {
 		return nil, err
 	}
diff --git a/internal/distro/rhel81/distro.go b/internal/distro/rhel81/distro.go
index e63a3eb2f..4fe242b93 100644
--- a/internal/distro/rhel81/distro.go
+++ b/internal/distro/rhel81/distro.go
@@ -525,7 +525,7 @@ func (r *RHEL81) BuildPackages(outputArchitecture string) ([]string, error) {
 	return append(r.buildPackages, arch.BuildPackages...), nil
 }
 
-func (r *RHEL81) pipeline(b *blueprint.Blueprint, additionalRepos []rpmmd.RepoConfig, packageSpecs, buildPackageSpecs []rpmmd.PackageSpec, outputArchitecture, outputFormat string, size uint64) (*osbuild.Pipeline, error) {
+func (r *RHEL81) pipeline(c *blueprint.Customizations, additionalRepos []rpmmd.RepoConfig, packageSpecs, buildPackageSpecs []rpmmd.PackageSpec, outputArchitecture, outputFormat string, size uint64) (*osbuild.Pipeline, error) {
 	output, exists := r.outputs[outputFormat]
 	if !exists {
 		return nil, errors.New("invalid output format: " + outputFormat)
@@ -547,13 +547,13 @@ func (r *RHEL81) pipeline(b *blueprint.Blueprint, additionalRepos []rpmmd.RepoCo
 	}
 
 	kernelOptions := output.KernelOptions
-	if kernel := b.GetKernel(); kernel != nil {
+	if kernel := c.GetKernel(); kernel != nil {
 		kernelOptions += " " + kernel.Append
 	}
 	p.AddStage(osbuild.NewGRUB2Stage(r.grub2StageOptions(kernelOptions, arch.UEFI)))
 
 	// TODO support setting all languages and install corresponding langpack-* package
-	language, keyboard := b.GetPrimaryLocale()
+	language, keyboard := c.GetPrimaryLocale()
 
 	if language != nil {
 		p.AddStage(osbuild.NewLocaleStage(&osbuild.LocaleStageOptions{*language}))
@@ -565,11 +565,11 @@ func (r *RHEL81) pipeline(b *blueprint.Blueprint, additionalRepos []rpmmd.RepoCo
 		p.AddStage(osbuild.NewKeymapStage(&osbuild.KeymapStageOptions{*keyboard}))
 	}
 
-	if hostname := b.GetHostname(); hostname != nil {
+	if hostname := c.GetHostname(); hostname != nil {
 		p.AddStage(osbuild.NewHostnameStage(&osbuild.HostnameStageOptions{*hostname}))
 	}
 
-	timezone, ntpServers := b.GetTimezoneSettings()
+	timezone, ntpServers := c.GetTimezoneSettings()
 
 	// TODO install chrony when this is set?
 	if timezone != nil {
@@ -580,7 +580,7 @@ func (r *RHEL81) pipeline(b *blueprint.Blueprint, additionalRepos []rpmmd.RepoCo
 		p.AddStage(osbuild.NewChronyStage(&osbuild.ChronyStageOptions{ntpServers}))
 	}
 
-	if users := b.GetUsers(); len(users) > 0 {
+	if users := c.GetUsers(); len(users) > 0 {
 		options, err := r.userStageOptions(users)
 		if err != nil {
 			return nil, err
@@ -588,15 +588,15 @@ func (r *RHEL81) pipeline(b *blueprint.Blueprint, additionalRepos []rpmmd.RepoCo
 		p.AddStage(osbuild.NewUsersStage(options))
 	}
 
-	if groups := b.GetGroups(); len(groups) > 0 {
+	if groups := c.GetGroups(); len(groups) > 0 {
 		p.AddStage(osbuild.NewGroupsStage(r.groupStageOptions(groups)))
 	}
 
-	if services := b.GetServices(); services != nil || output.EnabledServices != nil {
+	if services := c.GetServices(); services != nil || output.EnabledServices != nil {
 		p.AddStage(osbuild.NewSystemdStage(r.systemdStageOptions(output.EnabledServices, output.DisabledServices, services, output.DefaultTarget)))
 	}
 
-	if firewall := b.GetFirewall(); firewall != nil {
+	if firewall := c.GetFirewall(); firewall != nil {
 		p.AddStage(osbuild.NewFirewallStage(r.firewallStageOptions(firewall)))
 	}
 
@@ -619,8 +619,8 @@ func (r *RHEL81) sources(packages []rpmmd.PackageSpec) *osbuild.Sources {
 	}
 }
 
-func (r *RHEL81) Manifest(b *blueprint.Blueprint, additionalRepos []rpmmd.RepoConfig, packageSpecs, buildPackageSpecs []rpmmd.PackageSpec, outputArchitecture, outputFormat string, size uint64) (*osbuild.Manifest, error) {
-	pipeline, err := r.pipeline(b, additionalRepos, packageSpecs, buildPackageSpecs, outputArchitecture, outputFormat, size)
+func (r *RHEL81) Manifest(c *blueprint.Customizations, additionalRepos []rpmmd.RepoConfig, packageSpecs, buildPackageSpecs []rpmmd.PackageSpec, outputArchitecture, outputFormat string, size uint64) (*osbuild.Manifest, error) {
+	pipeline, err := r.pipeline(c, additionalRepos, packageSpecs, buildPackageSpecs, outputArchitecture, outputFormat, size)
 	if err != nil {
 		return nil, err
 	}
diff --git a/internal/distro/rhel82/distro.go b/internal/distro/rhel82/distro.go
index c68995ceb..069bfe347 100644
--- a/internal/distro/rhel82/distro.go
+++ b/internal/distro/rhel82/distro.go
@@ -525,7 +525,7 @@ func (r *RHEL82) BuildPackages(outputArchitecture string) ([]string, error) {
 	return append(r.buildPackages, arch.BuildPackages...), nil
 }
 
-func (r *RHEL82) pipeline(b *blueprint.Blueprint, additionalRepos []rpmmd.RepoConfig, packageSpecs, buildPackageSpecs []rpmmd.PackageSpec, outputArchitecture, outputFormat string, size uint64) (*osbuild.Pipeline, error) {
+func (r *RHEL82) pipeline(c *blueprint.Customizations, additionalRepos []rpmmd.RepoConfig, packageSpecs, buildPackageSpecs []rpmmd.PackageSpec, outputArchitecture, outputFormat string, size uint64) (*osbuild.Pipeline, error) {
 	output, exists := r.outputs[outputFormat]
 	if !exists {
 		return nil, errors.New("invalid output format: " + outputFormat)
@@ -547,13 +547,13 @@ func (r *RHEL82) pipeline(b *blueprint.Blueprint, additionalRepos []rpmmd.RepoCo
 	}
 
 	kernelOptions := output.KernelOptions
-	if kernel := b.GetKernel(); kernel != nil {
+	if kernel := c.GetKernel(); kernel != nil {
 		kernelOptions += " " + kernel.Append
 	}
 	p.AddStage(osbuild.NewGRUB2Stage(r.grub2StageOptions(kernelOptions, arch.UEFI)))
 
 	// TODO support setting all languages and install corresponding langpack-* package
-	language, keyboard := b.GetPrimaryLocale()
+	language, keyboard := c.GetPrimaryLocale()
 
 	if language != nil {
 		p.AddStage(osbuild.NewLocaleStage(&osbuild.LocaleStageOptions{*language}))
@@ -565,11 +565,11 @@ func (r *RHEL82) pipeline(b *blueprint.Blueprint, additionalRepos []rpmmd.RepoCo
 		p.AddStage(osbuild.NewKeymapStage(&osbuild.KeymapStageOptions{*keyboard}))
 	}
 
-	if hostname := b.GetHostname(); hostname != nil {
+	if hostname := c.GetHostname(); hostname != nil {
 		p.AddStage(osbuild.NewHostnameStage(&osbuild.HostnameStageOptions{*hostname}))
 	}
 
-	timezone, ntpServers := b.GetTimezoneSettings()
+	timezone, ntpServers := c.GetTimezoneSettings()
 
 	// TODO install chrony when this is set?
 	if timezone != nil {
@@ -580,7 +580,7 @@ func (r *RHEL82) pipeline(b *blueprint.Blueprint, additionalRepos []rpmmd.RepoCo
 		p.AddStage(osbuild.NewChronyStage(&osbuild.ChronyStageOptions{ntpServers}))
 	}
 
-	if users := b.GetUsers(); len(users) > 0 {
+	if users := c.GetUsers(); len(users) > 0 {
 		options, err := r.userStageOptions(users)
 		if err != nil {
 			return nil, err
@@ -588,15 +588,15 @@ func (r *RHEL82) pipeline(b *blueprint.Blueprint, additionalRepos []rpmmd.RepoCo
 		p.AddStage(osbuild.NewUsersStage(options))
 	}
 
-	if groups := b.GetGroups(); len(groups) > 0 {
+	if groups := c.GetGroups(); len(groups) > 0 {
 		p.AddStage(osbuild.NewGroupsStage(r.groupStageOptions(groups)))
 	}
 
-	if services := b.GetServices(); services != nil || output.EnabledServices != nil {
+	if services := c.GetServices(); services != nil || output.EnabledServices != nil {
 		p.AddStage(osbuild.NewSystemdStage(r.systemdStageOptions(output.EnabledServices, output.DisabledServices, services, output.DefaultTarget)))
 	}
 
-	if firewall := b.GetFirewall(); firewall != nil {
+	if firewall := c.GetFirewall(); firewall != nil {
 		p.AddStage(osbuild.NewFirewallStage(r.firewallStageOptions(firewall)))
 	}
 
@@ -619,8 +619,8 @@ func (r *RHEL82) sources(packages []rpmmd.PackageSpec) *osbuild.Sources {
 	}
 }
 
-func (r *RHEL82) Manifest(b *blueprint.Blueprint, additionalRepos []rpmmd.RepoConfig, packageSpecs, buildPackageSpecs []rpmmd.PackageSpec, outputArchitecture, outputFormat string, size uint64) (*osbuild.Manifest, error) {
-	pipeline, err := r.pipeline(b, additionalRepos, packageSpecs, buildPackageSpecs, outputArchitecture, outputFormat, size)
+func (r *RHEL82) Manifest(c *blueprint.Customizations, additionalRepos []rpmmd.RepoConfig, packageSpecs, buildPackageSpecs []rpmmd.PackageSpec, outputArchitecture, outputFormat string, size uint64) (*osbuild.Manifest, error) {
+	pipeline, err := r.pipeline(c, additionalRepos, packageSpecs, buildPackageSpecs, outputArchitecture, outputFormat, size)
 	if err != nil {
 		return nil, err
 	}
diff --git a/internal/rcm/api.go b/internal/rcm/api.go
index bab22eeb2..88e230528 100644
--- a/internal/rcm/api.go
+++ b/internal/rcm/api.go
@@ -5,13 +5,14 @@ package rcm
 import (
 	"encoding/json"
 	"fmt"
-	"github.com/osbuild/osbuild-composer/internal/common"
-	"github.com/osbuild/osbuild-composer/internal/rpmmd"
 	"log"
 	"net"
 	"net/http"
 	"strings"
 
+	"github.com/osbuild/osbuild-composer/internal/common"
+	"github.com/osbuild/osbuild-composer/internal/rpmmd"
+
 	"github.com/google/uuid"
 	"github.com/julienschmidt/httprouter"
 	"github.com/osbuild/osbuild-composer/internal/blueprint"
@@ -139,7 +140,6 @@ func (api *API) submit(writer http.ResponseWriter, request *http.Request, _ http
 	for n, repo := range composeRequest.Repositories {
 		repoConfigs = append(repoConfigs, rpmmd.RepoConfig{
 			Id:        fmt.Sprintf("repo-%d", n),
-			Name:      fmt.Sprintf("repo-%d", n),
 			BaseURL:   repo.URL,
 			IgnoreSSL: false,
 		})
diff --git a/internal/rpmmd/repository.go b/internal/rpmmd/repository.go
index 46796dafb..b71b19f46 100644
--- a/internal/rpmmd/repository.go
+++ b/internal/rpmmd/repository.go
@@ -14,7 +14,6 @@ import (
 
 type RepoConfig struct {
 	Id         string `json:"id"`
-	Name       string `json:"name"`
 	BaseURL    string `json:"baseurl,omitempty"`
 	Metalink   string `json:"metalink,omitempty"`
 	MirrorList string `json:"mirrorlist,omitempty"`
@@ -67,6 +66,8 @@ type PackageSpec struct {
 	Version        string `json:"version,omitempty"`
 	Release        string `json:"release,omitempty"`
 	Arch           string `json:"arch,omitempty"`
+	RepoID         string `json:"repo_id,omitempty"`
+	Path           string `json:"path,omitempty"`
 	RemoteLocation string `json:"remote_location,omitempty"`
 	Checksum       string `json:"checksum,omitempty"`
 }
diff --git a/internal/store/store.go b/internal/store/store.go
index 7bc9bc74b..0807866ef 100644
--- a/internal/store/store.go
+++ b/internal/store/store.go
@@ -621,7 +621,7 @@ func (s *Store) PushCompose(composeID uuid.UUID, bp *blueprint.Blueprint, packag
 		repos = append(repos, source.RepoConfig())
 	}
 
-	manifestStruct, err := s.distro.Manifest(bp, repos, packages, buildPackages, arch, composeType, size)
+	manifestStruct, err := s.distro.Manifest(bp.Customizations, repos, packages, buildPackages, arch, composeType, size)
 	if err != nil {
 		return err
 	}
@@ -689,7 +689,7 @@ func (s *Store) PushComposeRequest(request ComposeRequest) error {
 		if !exists {
 			panic("fatal error, image type should exist but it does not")
 		}
-		manifestStruct, err := distroStruct.Manifest(&request.Blueprint, request.Repositories, nil, nil, arch, imgTypeCompatStr, 0)
+		manifestStruct, err := distroStruct.Manifest(request.Blueprint.Customizations, request.Repositories, nil, nil, arch, imgTypeCompatStr, 0)
 		if err != nil {
 			return err
 		}
@@ -969,7 +969,6 @@ func NewSourceConfig(repo rpmmd.RepoConfig, system bool) SourceConfig {
 func (s *SourceConfig) RepoConfig() rpmmd.RepoConfig {
 	var repo rpmmd.RepoConfig
 
-	repo.Name = s.Name
 	repo.Id = s.Name
 	repo.IgnoreSSL = !s.CheckSSL
 
diff --git a/repositories/fedora-30.json b/repositories/fedora-30.json
index 6119bf386..36fd19453 100644
--- a/repositories/fedora-30.json
+++ b/repositories/fedora-30.json
@@ -2,7 +2,6 @@
     "x86_64": [
         {
             "id": "fedora",
-            "name": "Fedora 30",
             "baseurl": "http://download.fedoraproject.org/pub/fedora/linux/releases/30/Everything/x86_64/os/",
             "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBFturGcBEACv0xBo91V2n0uEC2vh69ywCiSyvUgN/AQH8EZpCVtM7NyjKgKm\nbbY4G3R0M3ir1xXmvUDvK0493/qOiFrjkplvzXFTGpPTi0ypqGgxc5d0ohRA1M75\nL+0AIlXoOgHQ358/c4uO8X0JAA1NYxCkAW1KSJgFJ3RjukrfqSHWthS1d4o8fhHy\nKJKEnirE5hHqB50dafXrBfgZdaOs3C6ppRIePFe2o4vUEapMTCHFw0woQR8Ah4/R\nn7Z9G9Ln+0Cinmy0nbIDiZJ+pgLAXCOWBfDUzcOjDGKvcpoZharA07c0q1/5ojzO\n4F0Fh4g/BUmtrASwHfcIbjHyCSr1j/3Iz883iy07gJY5Yhiuaqmp0o0f9fgHkG53\n2xCU1owmACqaIBNQMukvXRDtB2GJMuKa/asTZDP6R5re+iXs7+s9ohcRRAKGyAyc\nYKIQKcaA+6M8T7/G+TPHZX6HJWqJJiYB+EC2ERblpvq9TPlLguEWcmvjbVc31nyq\nSDoO3ncFWKFmVsbQPTbP+pKUmlLfJwtb5XqxNR5GEXSwVv4I7IqBmJz1MmRafnBZ\ng0FJUtH668GnldO20XbnSVBr820F5SISMXVwCXDXEvGwwiB8Lt8PvqzXnGIFDAu3\nDlQI5sxSqpPVWSyw08ppKT2Tpmy8adiBotLfaCFl2VTHwOae48X2dMPBvQARAQAB\ntDFGZWRvcmEgKDMwKSA8ZmVkb3JhLTMwLXByaW1hcnlAZmVkb3JhcHJvamVjdC5v\ncmc+iQI4BBMBAgAiBQJbbqxnAhsPBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAK\nCRDvPBEfz8ZZudTnD/9170LL3nyTVUCFmBjT9wZ4gYnpwtKVPa/pKnxbbS+Bmmac\ng9TrT9pZbqOHrNJLiZ3Zx1Hp+8uxr3Lo6kbYwImLhkOEDrf4aP17HfQ6VYFbQZI8\nf79OFxWJ7si9+3gfzeh9UYFEqOQfzIjLWFyfnas0OnV/P+RMQ1Zr+vPRqO7AR2va\nN9wg+Xl7157dhXPCGYnGMNSoxCbpRs0JNlzvJMuAea5nTTznRaJZtK/xKsqLn51D\nK07k9MHVFXakOH8QtMCUglbwfTfIpO5YRq5imxlWbqsYWVQy1WGJFyW6hWC0+RcJ\nOx5zGtOfi4/dN+xJ+ibnbyvy/il7Qm+vyFhCYqIPyS5m2UVJUuao3eApE38k78/o\n8aQOTnFQZ+U1Sw+6woFTxjqRQBXlQm2+7Bt3bqGATg4sXXWPbmwdL87Ic+mxn/ml\nSMfQux/5k6iAu1kQhwkO2YJn9eII6HIPkW+2m5N1JsUyJQe4cbtZE5Yh3TRA0dm7\n+zoBRfCXkOW4krchbgww/ptVmzMMP7GINJdROrJnsGl5FVeid9qHzV7aZycWSma7\nCxBYB1J8HCbty5NjtD6XMYRrMLxXugvX6Q4NPPH+2NKjzX4SIDejS6JjgrP3KA3O\npMuo7ZHMfveBngv8yP+ZD/1sS6l+dfExvdaJdOdgFCnp4p3gPbw5+Lv70HrMjA==\n=BfZ/\n-----END PGP PUBLIC KEY BLOCK-----\n"
         }
@@ -10,7 +9,6 @@
     "aarch64": [
         {
             "id": "fedora",
-            "name": "Fedora 30",
             "baseurl": "http://download.fedoraproject.org/pub/fedora/linux/releases/30/Everything/aarch64/os/",
             "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBFturGcBEACv0xBo91V2n0uEC2vh69ywCiSyvUgN/AQH8EZpCVtM7NyjKgKm\nbbY4G3R0M3ir1xXmvUDvK0493/qOiFrjkplvzXFTGpPTi0ypqGgxc5d0ohRA1M75\nL+0AIlXoOgHQ358/c4uO8X0JAA1NYxCkAW1KSJgFJ3RjukrfqSHWthS1d4o8fhHy\nKJKEnirE5hHqB50dafXrBfgZdaOs3C6ppRIePFe2o4vUEapMTCHFw0woQR8Ah4/R\nn7Z9G9Ln+0Cinmy0nbIDiZJ+pgLAXCOWBfDUzcOjDGKvcpoZharA07c0q1/5ojzO\n4F0Fh4g/BUmtrASwHfcIbjHyCSr1j/3Iz883iy07gJY5Yhiuaqmp0o0f9fgHkG53\n2xCU1owmACqaIBNQMukvXRDtB2GJMuKa/asTZDP6R5re+iXs7+s9ohcRRAKGyAyc\nYKIQKcaA+6M8T7/G+TPHZX6HJWqJJiYB+EC2ERblpvq9TPlLguEWcmvjbVc31nyq\nSDoO3ncFWKFmVsbQPTbP+pKUmlLfJwtb5XqxNR5GEXSwVv4I7IqBmJz1MmRafnBZ\ng0FJUtH668GnldO20XbnSVBr820F5SISMXVwCXDXEvGwwiB8Lt8PvqzXnGIFDAu3\nDlQI5sxSqpPVWSyw08ppKT2Tpmy8adiBotLfaCFl2VTHwOae48X2dMPBvQARAQAB\ntDFGZWRvcmEgKDMwKSA8ZmVkb3JhLTMwLXByaW1hcnlAZmVkb3JhcHJvamVjdC5v\ncmc+iQI4BBMBAgAiBQJbbqxnAhsPBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAK\nCRDvPBEfz8ZZudTnD/9170LL3nyTVUCFmBjT9wZ4gYnpwtKVPa/pKnxbbS+Bmmac\ng9TrT9pZbqOHrNJLiZ3Zx1Hp+8uxr3Lo6kbYwImLhkOEDrf4aP17HfQ6VYFbQZI8\nf79OFxWJ7si9+3gfzeh9UYFEqOQfzIjLWFyfnas0OnV/P+RMQ1Zr+vPRqO7AR2va\nN9wg+Xl7157dhXPCGYnGMNSoxCbpRs0JNlzvJMuAea5nTTznRaJZtK/xKsqLn51D\nK07k9MHVFXakOH8QtMCUglbwfTfIpO5YRq5imxlWbqsYWVQy1WGJFyW6hWC0+RcJ\nOx5zGtOfi4/dN+xJ+ibnbyvy/il7Qm+vyFhCYqIPyS5m2UVJUuao3eApE38k78/o\n8aQOTnFQZ+U1Sw+6woFTxjqRQBXlQm2+7Bt3bqGATg4sXXWPbmwdL87Ic+mxn/ml\nSMfQux/5k6iAu1kQhwkO2YJn9eII6HIPkW+2m5N1JsUyJQe4cbtZE5Yh3TRA0dm7\n+zoBRfCXkOW4krchbgww/ptVmzMMP7GINJdROrJnsGl5FVeid9qHzV7aZycWSma7\nCxBYB1J8HCbty5NjtD6XMYRrMLxXugvX6Q4NPPH+2NKjzX4SIDejS6JjgrP3KA3O\npMuo7ZHMfveBngv8yP+ZD/1sS6l+dfExvdaJdOdgFCnp4p3gPbw5+Lv70HrMjA==\n=BfZ/\n-----END PGP PUBLIC KEY BLOCK-----\n"
         }
diff --git a/repositories/fedora-31.json b/repositories/fedora-31.json
index 44dbf86f9..f45cb13cd 100644
--- a/repositories/fedora-31.json
+++ b/repositories/fedora-31.json
@@ -3,7 +3,6 @@
     "x86_64": [
         {
             "id": "fedora",
-            "name": "Fedora 31",
             "baseurl": "http://download.fedoraproject.org/pub/fedora/linux/releases/31/Everything/x86_64/os/",
             "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBFxq3QMBEADUhGfCfP1ijiggBuVbR/pBDSWMC3TWbfC8pt7fhZkYrilzfWUM\nfTsikPymSriScONXP6DNyZ5r7tgrIVdVrJvRIqIFRO0mufp9HyfWKDO//Ctyp7OQ\nzYw6NVthO/aWpyFfJpj6s4iZsYGqf9gByV8brBB8v8jEsCtVOj1BU3bMbLkMsRI9\n+WiLjDYyvopqNBQuIe8ogxSxpYdbUz6+jxzfvhRoBzWdjITd//Gjd90kkrBOMWkO\nLTqO133OD1WMT08G5NuQ4KhjYsVvSbBpfdkTcNuP8gBP9LxCQDc+e1eAhZ95g3qk\nXLeKEK9j+F+wuG/OrEAxBsscCxXRUB38QH6CFe3UxGoSMnBi+jEhicudo+ItpFOy\n7rPaYyRh4Pmu4QHcC83bNjp8NI6zTHrBmVuPqkxMn07GMAQav9ezBXj6umqTX4cU\ndsJUavJrJ3u7rT0lhBdiGrQ9zPbL07u2Kn+OXPAC3dKSf7G8TvwNAdry9esGSpi3\n8aa1myQYVZvAlsIBkbN3fb1wvDJE5czVhzwQ77V2t66jxeg0o9/2OZVH3CozD2Zj\nv28LHuW/jnQHtsQ0fUyQYRmHxNEVkW10GGM7fQwxzpxFFS1O/2XEnfMu7yBHZsgL\nSojfUct0FhLhEN/g/IINX9ZCVrzK5/De27CNjYE1cgYD/lTmQ0SyjfKVwwARAQAB\ntDFGZWRvcmEgKDMxKSA8ZmVkb3JhLTMxLXByaW1hcnlAZmVkb3JhcHJvamVjdC5v\ncmc+iQI+BBMBAgAoAhsPBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAUCXGrkTQUJ\nEs8P/QAKCRBQyzkLPDNZxBmDD/90IFwAfFcQq5ENl7/o2CYQ9k2adTHbV5RoIOWC\n/o9I5/btn1y8WDhPOUNmsgbUqRqz6srlVplg+LkpIj67PVLDBwpVbCJC8o1fztd2\nMryVqdvu562WVhUorII+iW7nfqD0yv55nH9b/JR1qloUa8LpeKw84JgvxF5wVfyR\nid1WjI0DBk2taFR4xCfU5Tb262fbdFj5iB9xskP7oNeS29+SfDjlnybtlFoqr9UA\nnY1uvhBPkGmj45SJkpfP+L+kGYXVaUd29M/q/Pt46X1KDvr6Z0l8bSUEk3zfcNdj\nuEhtHBqSy1UPPAikGX1Q5wGdu7R7+mv/ARqfI6OC44ipoOMNK1Aiu6+slbPYphwX\nighSz9yYuG0EdWt7akfKR0R04Kuej4LXLWcxTR4l8XDzThYgPP0g+z0XQJrAkVhi\nSrzICeC3K1GPSiUtNAxSTL+qWWgwvQyAPNoPV/OYmY+wUxUnKCZpEWPkL79lh6CM\nbJx/zlrOMzRumSzaOnKW9AOliviH4Rj89OmDifBEsQ0CewdHN9ly6g4ZFJJGYXJ5\nHTb5jdButTC3tDfvH8Z7dtXKdC4iqJCIxj698Xn8UjVefZQ2nbv5eXcZLfHtvbNB\nTTv1vvBV4G7aiHKYRSj7HmxhLBZC8Y/nmFAemOoOYDpR5eUmPmSbFayoLfRsFXmC\nHLs7cw==\n=6hRW\n-----END PGP PUBLIC KEY BLOCK-----\n"
         }
@@ -11,7 +10,6 @@
     "aarch64": [
         {
             "id": "fedora",
-            "name": "Fedora 31",
             "baseurl": "http://download.fedoraproject.org/pub/fedora/linux/releases/31/Everything/aarch64/os/",
             "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBFxq3QMBEADUhGfCfP1ijiggBuVbR/pBDSWMC3TWbfC8pt7fhZkYrilzfWUM\nfTsikPymSriScONXP6DNyZ5r7tgrIVdVrJvRIqIFRO0mufp9HyfWKDO//Ctyp7OQ\nzYw6NVthO/aWpyFfJpj6s4iZsYGqf9gByV8brBB8v8jEsCtVOj1BU3bMbLkMsRI9\n+WiLjDYyvopqNBQuIe8ogxSxpYdbUz6+jxzfvhRoBzWdjITd//Gjd90kkrBOMWkO\nLTqO133OD1WMT08G5NuQ4KhjYsVvSbBpfdkTcNuP8gBP9LxCQDc+e1eAhZ95g3qk\nXLeKEK9j+F+wuG/OrEAxBsscCxXRUB38QH6CFe3UxGoSMnBi+jEhicudo+ItpFOy\n7rPaYyRh4Pmu4QHcC83bNjp8NI6zTHrBmVuPqkxMn07GMAQav9ezBXj6umqTX4cU\ndsJUavJrJ3u7rT0lhBdiGrQ9zPbL07u2Kn+OXPAC3dKSf7G8TvwNAdry9esGSpi3\n8aa1myQYVZvAlsIBkbN3fb1wvDJE5czVhzwQ77V2t66jxeg0o9/2OZVH3CozD2Zj\nv28LHuW/jnQHtsQ0fUyQYRmHxNEVkW10GGM7fQwxzpxFFS1O/2XEnfMu7yBHZsgL\nSojfUct0FhLhEN/g/IINX9ZCVrzK5/De27CNjYE1cgYD/lTmQ0SyjfKVwwARAQAB\ntDFGZWRvcmEgKDMxKSA8ZmVkb3JhLTMxLXByaW1hcnlAZmVkb3JhcHJvamVjdC5v\ncmc+iQI+BBMBAgAoAhsPBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAUCXGrkTQUJ\nEs8P/QAKCRBQyzkLPDNZxBmDD/90IFwAfFcQq5ENl7/o2CYQ9k2adTHbV5RoIOWC\n/o9I5/btn1y8WDhPOUNmsgbUqRqz6srlVplg+LkpIj67PVLDBwpVbCJC8o1fztd2\nMryVqdvu562WVhUorII+iW7nfqD0yv55nH9b/JR1qloUa8LpeKw84JgvxF5wVfyR\nid1WjI0DBk2taFR4xCfU5Tb262fbdFj5iB9xskP7oNeS29+SfDjlnybtlFoqr9UA\nnY1uvhBPkGmj45SJkpfP+L+kGYXVaUd29M/q/Pt46X1KDvr6Z0l8bSUEk3zfcNdj\nuEhtHBqSy1UPPAikGX1Q5wGdu7R7+mv/ARqfI6OC44ipoOMNK1Aiu6+slbPYphwX\nighSz9yYuG0EdWt7akfKR0R04Kuej4LXLWcxTR4l8XDzThYgPP0g+z0XQJrAkVhi\nSrzICeC3K1GPSiUtNAxSTL+qWWgwvQyAPNoPV/OYmY+wUxUnKCZpEWPkL79lh6CM\nbJx/zlrOMzRumSzaOnKW9AOliviH4Rj89OmDifBEsQ0CewdHN9ly6g4ZFJJGYXJ5\nHTb5jdButTC3tDfvH8Z7dtXKdC4iqJCIxj698Xn8UjVefZQ2nbv5eXcZLfHtvbNB\nTTv1vvBV4G7aiHKYRSj7HmxhLBZC8Y/nmFAemOoOYDpR5eUmPmSbFayoLfRsFXmC\nHLs7cw==\n=6hRW\n-----END PGP PUBLIC KEY BLOCK-----\n"
         }
diff --git a/repositories/fedora-32.json b/repositories/fedora-32.json
index 029149cc0..8ad151a79 100644
--- a/repositories/fedora-32.json
+++ b/repositories/fedora-32.json
@@ -2,7 +2,6 @@
     "x86_64": [
         {
             "id": "fedora",
-            "name": "Fedora 32",
             "baseurl": "http://download.fedoraproject.org/pub/fedora/linux/releases/32/Everything/x86_64/os/",
             "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBF1RVqsBEADWMBqYv/G1r4PwyiPQCfg5fXFGXV1FCZ32qMi9gLUTv1CX7rYy\nH4Inj93oic+lt1kQ0kQCkINOwQczOkm6XDkEekmMrHknJpFLwrTK4AS28bYF2RjL\nM+QJ/dGXDMPYsP0tkLvoxaHr9WTRq89A+AmONcUAQIMJg3JxXAAafBi2UszUUEPI\nU35MyufFt2ePd1k/6hVAO8S2VT72TxXSY7Ha4X2J0pGzbqQ6Dq3AVzogsnoIi09A\n7fYutYZPVVAEGRUqavl0th8LyuZShASZ38CdAHBMvWV4bVZghd/wDV5ev3LXUE0o\nitLAqNSeiDJ3grKWN6v0qdU0l3Ya60sugABd3xaE+ROe8kDCy3WmAaO51Q880ZA2\niXOTJFObqkBTP9j9+ZeQ+KNE8SBoiH1EybKtBU8HmygZvu8ZC1TKUyL5gwGUJt8v\nergy5Bw3Q7av520sNGD3cIWr4fBAVYwdBoZT8RcsnU1PP67NmOGFcwSFJ/LpiOMC\npZ1IBvjOC7KyKEZY2/63kjW73mB7OHOd18BHtGVkA3QAdVlcSule/z68VOAy6bih\nE6mdxP28D4INsts8w6yr4G+3aEIN8u0qRQq66Ri5mOXTyle+ONudtfGg3U9lgicg\nz6oVk17RT0jV9uL6K41sGZ1sH/6yTXQKagdAYr3w1ix2L46JgzC+/+6SSwARAQAB\ntDFGZWRvcmEgKDMyKSA8ZmVkb3JhLTMyLXByaW1hcnlAZmVkb3JhcHJvamVjdC5v\ncmc+iQI4BBMBAgAiBQJdUVarAhsPBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAK\nCRBsEwJtEslE0LdAD/wKdAMtfzr7O2y06/sOPnrb3D39Y2DXbB8y0iEmRdBL29Bq\n5btxwmAka7JZRJVFxPsOVqZ6KARjS0/oCBmJc0jCRANFCtM4UjVHTSsxrJfuPkel\nvrlNE9tcR6OCRpuj/PZgUa39iifF/FTUfDgh4Q91xiQoLqfBxOJzravQHoK9VzrM\nNTOu6J6l4zeGzY/ocj6DpT+5fdUO/3HgGFNiNYPC6GVzeiA3AAVR0sCyGENuqqdg\nwUxV3BIht05M5Wcdvxg1U9x5I3yjkLQw+idvX4pevTiCh9/0u+4g80cT/21Cxsdx\n7+DVHaewXbF87QQIcOAing0S5QE67r2uPVxmWy/56TKUqDoyP8SNsV62lT2jutsj\nLevNxUky011g5w3bc61UeaeKrrurFdRs+RwBVkXmtqm/i6g0ZTWZyWGO6gJd+HWA\nqY1NYiq4+cMvNLatmA2sOoCsRNmE9q6jM/ESVgaH8hSp8GcLuzt9/r4PZZGl5CvU\neldOiD221u8rzuHmLs4dsgwJJ9pgLT0cUAsOpbMPI0JpGIPQ2SG6yK7LmO6HFOxb\nAkz7IGUt0gy1MzPTyBvnB+WgD1I+IQXXsJbhP5+d+d3mOnqsd6oDM/grKBzrhoUe\noNadc9uzjqKlOrmrdIR3Bz38SSiWlde5fu6xPqJdmGZRNjXtcyJlbSPVDIloxw==\n=QWRO\n-----END PGP PUBLIC KEY BLOCK-----\n"
         }
@@ -10,7 +9,6 @@
     "aarch64": [
         {
             "id": "fedora",
-            "name": "Fedora 32",
             "baseurl": "http://download.fedoraproject.org/pub/fedora/linux/releases/32/Everything/aarch64/os/",
             "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBF1RVqsBEADWMBqYv/G1r4PwyiPQCfg5fXFGXV1FCZ32qMi9gLUTv1CX7rYy\nH4Inj93oic+lt1kQ0kQCkINOwQczOkm6XDkEekmMrHknJpFLwrTK4AS28bYF2RjL\nM+QJ/dGXDMPYsP0tkLvoxaHr9WTRq89A+AmONcUAQIMJg3JxXAAafBi2UszUUEPI\nU35MyufFt2ePd1k/6hVAO8S2VT72TxXSY7Ha4X2J0pGzbqQ6Dq3AVzogsnoIi09A\n7fYutYZPVVAEGRUqavl0th8LyuZShASZ38CdAHBMvWV4bVZghd/wDV5ev3LXUE0o\nitLAqNSeiDJ3grKWN6v0qdU0l3Ya60sugABd3xaE+ROe8kDCy3WmAaO51Q880ZA2\niXOTJFObqkBTP9j9+ZeQ+KNE8SBoiH1EybKtBU8HmygZvu8ZC1TKUyL5gwGUJt8v\nergy5Bw3Q7av520sNGD3cIWr4fBAVYwdBoZT8RcsnU1PP67NmOGFcwSFJ/LpiOMC\npZ1IBvjOC7KyKEZY2/63kjW73mB7OHOd18BHtGVkA3QAdVlcSule/z68VOAy6bih\nE6mdxP28D4INsts8w6yr4G+3aEIN8u0qRQq66Ri5mOXTyle+ONudtfGg3U9lgicg\nz6oVk17RT0jV9uL6K41sGZ1sH/6yTXQKagdAYr3w1ix2L46JgzC+/+6SSwARAQAB\ntDFGZWRvcmEgKDMyKSA8ZmVkb3JhLTMyLXByaW1hcnlAZmVkb3JhcHJvamVjdC5v\ncmc+iQI4BBMBAgAiBQJdUVarAhsPBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAK\nCRBsEwJtEslE0LdAD/wKdAMtfzr7O2y06/sOPnrb3D39Y2DXbB8y0iEmRdBL29Bq\n5btxwmAka7JZRJVFxPsOVqZ6KARjS0/oCBmJc0jCRANFCtM4UjVHTSsxrJfuPkel\nvrlNE9tcR6OCRpuj/PZgUa39iifF/FTUfDgh4Q91xiQoLqfBxOJzravQHoK9VzrM\nNTOu6J6l4zeGzY/ocj6DpT+5fdUO/3HgGFNiNYPC6GVzeiA3AAVR0sCyGENuqqdg\nwUxV3BIht05M5Wcdvxg1U9x5I3yjkLQw+idvX4pevTiCh9/0u+4g80cT/21Cxsdx\n7+DVHaewXbF87QQIcOAing0S5QE67r2uPVxmWy/56TKUqDoyP8SNsV62lT2jutsj\nLevNxUky011g5w3bc61UeaeKrrurFdRs+RwBVkXmtqm/i6g0ZTWZyWGO6gJd+HWA\nqY1NYiq4+cMvNLatmA2sOoCsRNmE9q6jM/ESVgaH8hSp8GcLuzt9/r4PZZGl5CvU\neldOiD221u8rzuHmLs4dsgwJJ9pgLT0cUAsOpbMPI0JpGIPQ2SG6yK7LmO6HFOxb\nAkz7IGUt0gy1MzPTyBvnB+WgD1I+IQXXsJbhP5+d+d3mOnqsd6oDM/grKBzrhoUe\noNadc9uzjqKlOrmrdIR3Bz38SSiWlde5fu6xPqJdmGZRNjXtcyJlbSPVDIloxw==\n=QWRO\n-----END PGP PUBLIC KEY BLOCK-----\n"
         }
diff --git a/repositories/rhel-8.1.json b/repositories/rhel-8.1.json
index 860df8c39..1c93df0e0 100644
--- a/repositories/rhel-8.1.json
+++ b/repositories/rhel-8.1.json
@@ -2,24 +2,20 @@
     "aarch64": [
         {
             "id": "baseos",
-            "name": "BaseOS",
             "BaseURL": "http://download.devel.redhat.com/rhel-8/rel-eng/RHEL-8/RHEL-8.1.0-RC-1.1/compose/BaseOS/aarch64/os"
         },
         {
             "id": "appstream",
-            "name": "AppStream",
             "BaseURL": "http://download.devel.redhat.com/rhel-8/rel-eng/RHEL-8/RHEL-8.1.0-RC-1.1/compose/AppStream/aarch64/os"
         }
     ],
     "x86_64": [
         {
             "id": "baseos",
-            "name": "BaseOS",
             "BaseURL": "http://download.devel.redhat.com/rhel-8/rel-eng/RHEL-8/RHEL-8.1.0-RC-1.1/compose/BaseOS/x86_64/os"
         },
         {
             "id": "appstream",
-            "name": "AppStream",
             "BaseURL": "http://download.devel.redhat.com/rhel-8/rel-eng/RHEL-8/RHEL-8.1.0-RC-1.1/compose/AppStream/x86_64/os"
         }
     ]
diff --git a/repositories/rhel-8.2.json b/repositories/rhel-8.2.json
index 4e6f383cd..36bd07a0c 100644
--- a/repositories/rhel-8.2.json
+++ b/repositories/rhel-8.2.json
@@ -2,24 +2,20 @@
     "aarch64": [
         {
             "id": "baseos",
-            "name": "BaseOS",
             "BaseURL": "http://download.devel.redhat.com/rhel-8/nightly/RHEL-8/latest-RHEL-8.2.0/compose/BaseOS/aarch64/os"
         },
         {
             "id": "appstream",
-            "name": "AppStream",
             "BaseURL": "http://download.devel.redhat.com/rhel-8/nightly/RHEL-8/latest-RHEL-8.2.0/compose/AppStream/aarch64/os"
         }
     ],
     "x86_64": [
         {
             "id": "baseos",
-            "name": "BaseOS",
             "BaseURL": "http://download.devel.redhat.com/rhel-8/nightly/RHEL-8/latest-RHEL-8.2.0/compose/BaseOS/x86_64/os"
         },
         {
             "id": "appstream",
-            "name": "AppStream",
             "BaseURL": "http://download.devel.redhat.com/rhel-8/nightly/RHEL-8/latest-RHEL-8.2.0/compose/AppStream/x86_64/os"
         }
     ]


Test patch:
diff --git a/cmd/osbuild-dnf-json-tests/main_test.go b/cmd/osbuild-dnf-json-tests/main_test.go
index aa088187a..44624825f 100644
--- a/cmd/osbuild-dnf-json-tests/main_test.go
+++ b/cmd/osbuild-dnf-json-tests/main_test.go
@@ -46,7 +46,6 @@ func TestFetchChecksum(t *testing.T) {
 
 	repoCfg := rpmmd.RepoConfig{
 		Id:        "repo",
-		Name:      "repo",
 		BaseURL:   fmt.Sprintf("file://%s", dir),
 		IgnoreSSL: true,
 	}
diff --git a/internal/distro/distro_test.go b/internal/distro/distro_test.go
index 1e7c6a663..6d5855573 100644
--- a/internal/distro/distro_test.go
+++ b/internal/distro/distro_test.go
@@ -58,7 +58,7 @@ func TestDistro_Manifest(t *testing.T) {
 				return
 			}
 			size := d.GetSizeForOutputType(tt.ComposeRequest.OutputFormat, 0)
-			got, err := d.Manifest(tt.ComposeRequest.Blueprint,
+			got, err := d.Manifest(tt.ComposeRequest.Blueprint.Customizations,
 				nil,
 				tt.RpmMD.Packages,
 				tt.RpmMD.BuildPackages,
diff --git a/internal/distro/fedoratest/distro.go b/internal/distro/fedoratest/distro.go
index 749984108..873c14a59 100644
--- a/internal/distro/fedoratest/distro.go
+++ b/internal/distro/fedoratest/distro.go
@@ -33,7 +33,6 @@ func (d *FedoraTestDistro) Repositories(arch string) []rpmmd.RepoConfig {
 	return []rpmmd.RepoConfig{
 		{
 			Id:      "test-id",
-			Name:    "Test Name",
 			BaseURL: "http://example.com/test/os/" + arch,
 		},
 	}
@@ -63,7 +62,7 @@ func (d *FedoraTestDistro) BuildPackages(outputArchitecture string) ([]string, e
 	return nil, nil
 }
 
-func (d *FedoraTestDistro) pipeline(b *blueprint.Blueprint, additionalRepos []rpmmd.RepoConfig, buildPackages, basePackages []rpmmd.PackageSpec, outputArch, outputFormat string, size uint64) (*osbuild.Pipeline, error) {
+func (d *FedoraTestDistro) pipeline(c *blueprint.Customizations, additionalRepos []rpmmd.RepoConfig, buildPackages, basePackages []rpmmd.PackageSpec, outputArch, outputFormat string, size uint64) (*osbuild.Pipeline, error) {
 	if outputFormat == "qcow2" && outputArch == "x86_64" {
 		return &osbuild.Pipeline{}, nil
 	} else {
@@ -75,8 +74,8 @@ func (r *FedoraTestDistro) sources(packages []rpmmd.PackageSpec) *osbuild.Source
 	return &osbuild.Sources{}
 }
 
-func (r *FedoraTestDistro) Manifest(b *blueprint.Blueprint, additionalRepos []rpmmd.RepoConfig, packageSpecs, buildPackageSpecs []rpmmd.PackageSpec, outputArchitecture, outputFormat string, size uint64) (*osbuild.Manifest, error) {
-	pipeline, err := r.pipeline(b, additionalRepos, packageSpecs, buildPackageSpecs, outputArchitecture, outputFormat, size)
+func (r *FedoraTestDistro) Manifest(c *blueprint.Customizations, additionalRepos []rpmmd.RepoConfig, packageSpecs, buildPackageSpecs []rpmmd.PackageSpec, outputArchitecture, outputFormat string, size uint64) (*osbuild.Manifest, error) {
+	pipeline, err := r.pipeline(c, additionalRepos, packageSpecs, buildPackageSpecs, outputArchitecture, outputFormat, size)
 	if err != nil {
 		return nil, err
 	}
diff --git a/internal/distro/test/distro.go b/internal/distro/test/distro.go
index 0a5b75f27..642334ba1 100644
--- a/internal/distro/test/distro.go
+++ b/internal/distro/test/distro.go
@@ -29,7 +29,6 @@ func (d *TestDistro) Repositories(arch string) []rpmmd.RepoConfig {
 	return []rpmmd.RepoConfig{
 		{
 			Id:      "test-id",
-			Name:    "Test Name",
 			BaseURL: "http://example.com/test/os/" + arch,
 		},
 	}
@@ -55,7 +54,7 @@ func (d *TestDistro) BuildPackages(outputArchitecture string) ([]string, error)
 	return nil, nil
 }
 
-func (d *TestDistro) pipeline(b *blueprint.Blueprint, additionalRepos []rpmmd.RepoConfig, packageSpecs, buildPackageSpecs []rpmmd.PackageSpec, outputArch, outputFormat string, size uint64) (*osbuild.Pipeline, error) {
+func (d *TestDistro) pipeline(c *blueprint.Customizations, additionalRepos []rpmmd.RepoConfig, packageSpecs, buildPackageSpecs []rpmmd.PackageSpec, outputArch, outputFormat string, size uint64) (*osbuild.Pipeline, error) {
 	if outputFormat == "test_output" && outputArch == "test_arch" {
 		return &osbuild.Pipeline{}, nil
 	}
@@ -67,8 +66,8 @@ func (d *TestDistro) sources(packages []rpmmd.PackageSpec) *osbuild.Sources {
 	return &osbuild.Sources{}
 }
 
-func (r *TestDistro) Manifest(b *blueprint.Blueprint, additionalRepos []rpmmd.RepoConfig, packageSpecs, buildPackageSpecs []rpmmd.PackageSpec, outputArchitecture, outputFormat string, size uint64) (*osbuild.Manifest, error) {
-	pipeline, err := r.pipeline(b, additionalRepos, packageSpecs, buildPackageSpecs, outputArchitecture, outputFormat, size)
+func (r *TestDistro) Manifest(c *blueprint.Customizations, additionalRepos []rpmmd.RepoConfig, packageSpecs, buildPackageSpecs []rpmmd.PackageSpec, outputArchitecture, outputFormat string, size uint64) (*osbuild.Manifest, error) {
+	pipeline, err := r.pipeline(c, additionalRepos, packageSpecs, buildPackageSpecs, outputArchitecture, outputFormat, size)
 	if err != nil {
 		return nil, err
 	}