go.mod: update osbuild/images to v0.123.0
Includes modularity support.
This commit is contained in:
parent
5e3d6aff54
commit
536b7d95c5
37 changed files with 655 additions and 157 deletions
|
|
@ -73,6 +73,7 @@ type crBlueprint struct {
|
||||||
Version string `json:"version,omitempty"`
|
Version string `json:"version,omitempty"`
|
||||||
Packages []blueprint.Package `json:"packages,omitempty"`
|
Packages []blueprint.Package `json:"packages,omitempty"`
|
||||||
Modules []blueprint.Package `json:"modules,omitempty"`
|
Modules []blueprint.Package `json:"modules,omitempty"`
|
||||||
|
EnabledModules []blueprint.EnabledModule `json:"enabled_modules" toml:"enabled_modules"`
|
||||||
Groups []blueprint.Group `json:"groups,omitempty"`
|
Groups []blueprint.Group `json:"groups,omitempty"`
|
||||||
Containers []blueprint.Container `json:"containers,omitempty"`
|
Containers []blueprint.Container `json:"containers,omitempty"`
|
||||||
Customizations *blueprint.Customizations `json:"customizations,omitempty"`
|
Customizations *blueprint.Customizations `json:"customizations,omitempty"`
|
||||||
|
|
|
||||||
2
go.mod
2
go.mod
|
|
@ -44,7 +44,7 @@ require (
|
||||||
github.com/labstack/gommon v0.4.2
|
github.com/labstack/gommon v0.4.2
|
||||||
github.com/openshift-online/ocm-sdk-go v0.1.438
|
github.com/openshift-online/ocm-sdk-go v0.1.438
|
||||||
github.com/oracle/oci-go-sdk/v54 v54.0.0
|
github.com/oracle/oci-go-sdk/v54 v54.0.0
|
||||||
github.com/osbuild/images v0.120.0
|
github.com/osbuild/images v0.123.0
|
||||||
github.com/osbuild/osbuild-composer/pkg/splunk_logger v0.0.0-20240814102216-0239db53236d
|
github.com/osbuild/osbuild-composer/pkg/splunk_logger v0.0.0-20240814102216-0239db53236d
|
||||||
github.com/osbuild/pulp-client v0.1.0
|
github.com/osbuild/pulp-client v0.1.0
|
||||||
github.com/pkg/errors v0.9.1
|
github.com/pkg/errors v0.9.1
|
||||||
|
|
|
||||||
4
go.sum
4
go.sum
|
|
@ -547,8 +547,8 @@ github.com/openshift-online/ocm-sdk-go v0.1.438 h1:tsLCCUzbLCTL4RZG02y9RuopmGCXp
|
||||||
github.com/openshift-online/ocm-sdk-go v0.1.438/go.mod h1:CiAu2jwl3ITKOxkeV0Qnhzv4gs35AmpIzVABQLtcI2Y=
|
github.com/openshift-online/ocm-sdk-go v0.1.438/go.mod h1:CiAu2jwl3ITKOxkeV0Qnhzv4gs35AmpIzVABQLtcI2Y=
|
||||||
github.com/oracle/oci-go-sdk/v54 v54.0.0 h1:CDLjeSejv2aDpElAJrhKpi6zvT/zhZCZuXchUUZ+LS4=
|
github.com/oracle/oci-go-sdk/v54 v54.0.0 h1:CDLjeSejv2aDpElAJrhKpi6zvT/zhZCZuXchUUZ+LS4=
|
||||||
github.com/oracle/oci-go-sdk/v54 v54.0.0/go.mod h1:+t+yvcFGVp+3ZnztnyxqXfQDsMlq8U25faBLa+mqCMc=
|
github.com/oracle/oci-go-sdk/v54 v54.0.0/go.mod h1:+t+yvcFGVp+3ZnztnyxqXfQDsMlq8U25faBLa+mqCMc=
|
||||||
github.com/osbuild/images v0.120.0 h1:6zXCp59AG03qajZlg/GJ07Fr4E6z5qaZshOuWgAse7g=
|
github.com/osbuild/images v0.123.0 h1:9b2sfl6751dpAEU3wR0bMN1d/bEhbJ39N5a/9ZVCxcg=
|
||||||
github.com/osbuild/images v0.120.0/go.mod h1:Ag87vmyxooiPQBJEDILbypG8/SRIear75YA78NwLix0=
|
github.com/osbuild/images v0.123.0/go.mod h1:Ag87vmyxooiPQBJEDILbypG8/SRIear75YA78NwLix0=
|
||||||
github.com/osbuild/osbuild-composer/pkg/splunk_logger v0.0.0-20240814102216-0239db53236d h1:r9BFPDv0uuA9k1947Jybcxs36c/pTywWS1gjeizvtcQ=
|
github.com/osbuild/osbuild-composer/pkg/splunk_logger v0.0.0-20240814102216-0239db53236d h1:r9BFPDv0uuA9k1947Jybcxs36c/pTywWS1gjeizvtcQ=
|
||||||
github.com/osbuild/osbuild-composer/pkg/splunk_logger v0.0.0-20240814102216-0239db53236d/go.mod h1:zR1iu/hOuf+OQNJlk70tju9IqzzM4ycq0ectkFBm94U=
|
github.com/osbuild/osbuild-composer/pkg/splunk_logger v0.0.0-20240814102216-0239db53236d/go.mod h1:zR1iu/hOuf+OQNJlk70tju9IqzzM4ycq0ectkFBm94U=
|
||||||
github.com/osbuild/pulp-client v0.1.0 h1:L0C4ezBJGTamN3BKdv+rKLuq/WxXJbsFwz/Hj7aEmJ8=
|
github.com/osbuild/pulp-client v0.1.0 h1:L0C4ezBJGTamN3BKdv+rKLuq/WxXJbsFwz/Hj7aEmJ8=
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,10 @@ type RepositoryCustomization struct {
|
||||||
SSLVerify *bool `json:"sslverify,omitempty" toml:"sslverify,omitempty"`
|
SSLVerify *bool `json:"sslverify,omitempty" toml:"sslverify,omitempty"`
|
||||||
ModuleHotfixes *bool `json:"module_hotfixes,omitempty" toml:"module_hotfixes,omitempty"`
|
ModuleHotfixes *bool `json:"module_hotfixes,omitempty" toml:"module_hotfixes,omitempty"`
|
||||||
Filename string `json:"filename,omitempty" toml:"filename,omitempty"`
|
Filename string `json:"filename,omitempty" toml:"filename,omitempty"`
|
||||||
|
|
||||||
|
// When set the repository will be used during the depsolve of
|
||||||
|
// payload repositories to install packages from it.
|
||||||
|
InstallFrom bool `json:"install_from" toml:"install_from"`
|
||||||
}
|
}
|
||||||
|
|
||||||
const repoFilenameRegex = "^[\\w.-]{1,250}\\.repo$"
|
const repoFilenameRegex = "^[\\w.-]{1,250}\\.repo$"
|
||||||
|
|
|
||||||
14
vendor/github.com/osbuild/images/data/dependencies/deps.go
generated
vendored
Normal file
14
vendor/github.com/osbuild/images/data/dependencies/deps.go
generated
vendored
Normal file
|
|
@ -0,0 +1,14 @@
|
||||||
|
package dependencies
|
||||||
|
|
||||||
|
import (
|
||||||
|
_ "embed"
|
||||||
|
)
|
||||||
|
|
||||||
|
//go:embed osbuild
|
||||||
|
var minimumOSBuildVersion string
|
||||||
|
|
||||||
|
// MinimumOSBuildVersion returns the minimum version of osbuild required by this
|
||||||
|
// version of images module.
|
||||||
|
func MinimumOSBuildVersion() string {
|
||||||
|
return minimumOSBuildVersion
|
||||||
|
}
|
||||||
1
vendor/github.com/osbuild/images/data/dependencies/osbuild
generated
vendored
Normal file
1
vendor/github.com/osbuild/images/data/dependencies/osbuild
generated
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
139
|
||||||
5
vendor/github.com/osbuild/images/internal/workload/custom.go
generated
vendored
5
vendor/github.com/osbuild/images/internal/workload/custom.go
generated
vendored
|
|
@ -3,6 +3,7 @@ package workload
|
||||||
type Custom struct {
|
type Custom struct {
|
||||||
BaseWorkload
|
BaseWorkload
|
||||||
Packages []string
|
Packages []string
|
||||||
|
EnabledModules []string
|
||||||
Services []string
|
Services []string
|
||||||
DisabledServices []string
|
DisabledServices []string
|
||||||
}
|
}
|
||||||
|
|
@ -11,6 +12,10 @@ func (p *Custom) GetPackages() []string {
|
||||||
return p.Packages
|
return p.Packages
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (p *Custom) GetEnabledModules() []string {
|
||||||
|
return p.EnabledModules
|
||||||
|
}
|
||||||
|
|
||||||
func (p *Custom) GetServices() []string {
|
func (p *Custom) GetServices() []string {
|
||||||
return p.Services
|
return p.Services
|
||||||
}
|
}
|
||||||
|
|
|
||||||
5
vendor/github.com/osbuild/images/internal/workload/workload.go
generated
vendored
5
vendor/github.com/osbuild/images/internal/workload/workload.go
generated
vendored
|
|
@ -4,6 +4,7 @@ import "github.com/osbuild/images/pkg/rpmmd"
|
||||||
|
|
||||||
type Workload interface {
|
type Workload interface {
|
||||||
GetPackages() []string
|
GetPackages() []string
|
||||||
|
GetEnabledModules() []string
|
||||||
GetRepos() []rpmmd.RepoConfig
|
GetRepos() []rpmmd.RepoConfig
|
||||||
GetServices() []string
|
GetServices() []string
|
||||||
GetDisabledServices() []string
|
GetDisabledServices() []string
|
||||||
|
|
@ -17,6 +18,10 @@ func (p BaseWorkload) GetPackages() []string {
|
||||||
return []string{}
|
return []string{}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (p BaseWorkload) GetEnabledModules() []string {
|
||||||
|
return []string{}
|
||||||
|
}
|
||||||
|
|
||||||
func (p BaseWorkload) GetRepos() []rpmmd.RepoConfig {
|
func (p BaseWorkload) GetRepos() []rpmmd.RepoConfig {
|
||||||
return p.Repos
|
return p.Repos
|
||||||
}
|
}
|
||||||
|
|
|
||||||
35
vendor/github.com/osbuild/images/pkg/blueprint/blueprint.go
generated
vendored
35
vendor/github.com/osbuild/images/pkg/blueprint/blueprint.go
generated
vendored
|
|
@ -3,11 +3,16 @@ package blueprint
|
||||||
|
|
||||||
// A Blueprint is a high-level description of an image.
|
// A Blueprint is a high-level description of an image.
|
||||||
type Blueprint struct {
|
type Blueprint struct {
|
||||||
Name string `json:"name" toml:"name"`
|
Name string `json:"name" toml:"name"`
|
||||||
Description string `json:"description" toml:"description"`
|
Description string `json:"description" toml:"description"`
|
||||||
Version string `json:"version,omitempty" toml:"version,omitempty"`
|
Version string `json:"version,omitempty" toml:"version,omitempty"`
|
||||||
Packages []Package `json:"packages" toml:"packages"`
|
Packages []Package `json:"packages" toml:"packages"`
|
||||||
Modules []Package `json:"modules" toml:"modules"`
|
Modules []Package `json:"modules" toml:"modules"`
|
||||||
|
|
||||||
|
// Note, this is called "enabled modules" because we already have "modules" except
|
||||||
|
// the "modules" refers to packages and "enabled modules" refers to modularity modules.
|
||||||
|
EnabledModules []EnabledModule `json:"enabled_modules" toml:"enabled_modules"`
|
||||||
|
|
||||||
Groups []Group `json:"groups" toml:"groups"`
|
Groups []Group `json:"groups" toml:"groups"`
|
||||||
Containers []Container `json:"containers,omitempty" toml:"containers,omitempty"`
|
Containers []Container `json:"containers,omitempty" toml:"containers,omitempty"`
|
||||||
Customizations *Customizations `json:"customizations,omitempty" toml:"customizations"`
|
Customizations *Customizations `json:"customizations,omitempty" toml:"customizations"`
|
||||||
|
|
@ -23,6 +28,12 @@ type Package struct {
|
||||||
Version string `json:"version,omitempty" toml:"version,omitempty"`
|
Version string `json:"version,omitempty" toml:"version,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// A module specifies a modularity stream.
|
||||||
|
type EnabledModule struct {
|
||||||
|
Name string `json:"name" toml:"name"`
|
||||||
|
Stream string `json:"stream,omitempty" toml:"stream,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
// A group specifies an package group.
|
// A group specifies an package group.
|
||||||
type Group struct {
|
type Group struct {
|
||||||
Name string `json:"name" toml:"name"`
|
Name string `json:"name" toml:"name"`
|
||||||
|
|
@ -63,6 +74,16 @@ func (b *Blueprint) GetPackagesEx(bootable bool) []string {
|
||||||
return packages
|
return packages
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (b *Blueprint) GetEnabledModules() []string {
|
||||||
|
modules := []string{}
|
||||||
|
|
||||||
|
for _, mod := range b.EnabledModules {
|
||||||
|
modules = append(modules, mod.ToNameStream())
|
||||||
|
}
|
||||||
|
|
||||||
|
return modules
|
||||||
|
}
|
||||||
|
|
||||||
func (p Package) ToNameVersion() string {
|
func (p Package) ToNameVersion() string {
|
||||||
// Omit version to prevent all packages with prefix of name to be installed
|
// Omit version to prevent all packages with prefix of name to be installed
|
||||||
if p.Version == "*" || p.Version == "" {
|
if p.Version == "*" || p.Version == "" {
|
||||||
|
|
@ -71,3 +92,7 @@ func (p Package) ToNameVersion() string {
|
||||||
|
|
||||||
return p.Name + "-" + p.Version
|
return p.Name + "-" + p.Version
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (p EnabledModule) ToNameStream() string {
|
||||||
|
return p.Name + ":" + p.Stream
|
||||||
|
}
|
||||||
|
|
|
||||||
4
vendor/github.com/osbuild/images/pkg/blueprint/customizations.go
generated
vendored
4
vendor/github.com/osbuild/images/pkg/blueprint/customizations.go
generated
vendored
|
|
@ -376,8 +376,8 @@ func (c *Customizations) GetRepositories() ([]RepositoryCustomization, error) {
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
for idx := range c.Repositories {
|
for _, repo := range c.Repositories {
|
||||||
err := validateCustomRepository(&c.Repositories[idx])
|
err := validateCustomRepository(&repo)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
|
||||||
15
vendor/github.com/osbuild/images/pkg/blueprint/repository_customizations.go
generated
vendored
15
vendor/github.com/osbuild/images/pkg/blueprint/repository_customizations.go
generated
vendored
|
|
@ -25,6 +25,10 @@ type RepositoryCustomization struct {
|
||||||
SSLVerify *bool `json:"sslverify,omitempty" toml:"sslverify,omitempty"`
|
SSLVerify *bool `json:"sslverify,omitempty" toml:"sslverify,omitempty"`
|
||||||
ModuleHotfixes *bool `json:"module_hotfixes,omitempty" toml:"module_hotfixes,omitempty"`
|
ModuleHotfixes *bool `json:"module_hotfixes,omitempty" toml:"module_hotfixes,omitempty"`
|
||||||
Filename string `json:"filename,omitempty" toml:"filename,omitempty"`
|
Filename string `json:"filename,omitempty" toml:"filename,omitempty"`
|
||||||
|
|
||||||
|
// When set the repository will be used during the depsolve of
|
||||||
|
// payload repositories to install packages from it.
|
||||||
|
InstallFrom bool `json:"install_from" toml:"install_from"`
|
||||||
}
|
}
|
||||||
|
|
||||||
const repoFilenameRegex = "^[\\w.-]{1,250}\\.repo$"
|
const repoFilenameRegex = "^[\\w.-]{1,250}\\.repo$"
|
||||||
|
|
@ -76,6 +80,17 @@ func (rc *RepositoryCustomization) getFilename() string {
|
||||||
return rc.Filename
|
return rc.Filename
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func RepoCustomizationsInstallFromOnly(repos []RepositoryCustomization) []rpmmd.RepoConfig {
|
||||||
|
var res []rpmmd.RepoConfig
|
||||||
|
for _, repo := range repos {
|
||||||
|
if !repo.InstallFrom {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
res = append(res, repo.customRepoToRepoConfig())
|
||||||
|
}
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
func RepoCustomizationsToRepoConfigAndGPGKeyFiles(repos []RepositoryCustomization) (map[string][]rpmmd.RepoConfig, []*fsnode.File, error) {
|
func RepoCustomizationsToRepoConfigAndGPGKeyFiles(repos []RepositoryCustomization) (map[string][]rpmmd.RepoConfig, []*fsnode.File, error) {
|
||||||
if len(repos) == 0 {
|
if len(repos) == 0 {
|
||||||
return nil, nil, nil
|
return nil, nil, nil
|
||||||
|
|
|
||||||
220
vendor/github.com/osbuild/images/pkg/distro/fedora/distro.go
generated
vendored
220
vendor/github.com/osbuild/images/pkg/distro/fedora/distro.go
generated
vendored
|
|
@ -57,35 +57,11 @@ var (
|
||||||
"/": 1 * datasizes.GiB,
|
"/": 1 * datasizes.GiB,
|
||||||
"/usr": 2 * datasizes.GiB,
|
"/usr": 2 * datasizes.GiB,
|
||||||
}
|
}
|
||||||
|
)
|
||||||
|
|
||||||
// Services
|
// Image Definitions
|
||||||
iotServices = []string{
|
func mkImageInstallerImgType(d distribution) imageType {
|
||||||
"NetworkManager.service",
|
return imageType{
|
||||||
"firewalld.service",
|
|
||||||
"sshd.service",
|
|
||||||
"zezere_ignition.timer",
|
|
||||||
"zezere_ignition_banner.service",
|
|
||||||
"greenboot-grub2-set-counter",
|
|
||||||
"greenboot-grub2-set-success",
|
|
||||||
"greenboot-healthcheck",
|
|
||||||
"greenboot-rpm-ostree-grub2-check-fallback",
|
|
||||||
"greenboot-status",
|
|
||||||
"greenboot-task-runner",
|
|
||||||
"redboot-auto-reboot",
|
|
||||||
"redboot-task-runner",
|
|
||||||
"parsec",
|
|
||||||
"dbus-parsec",
|
|
||||||
}
|
|
||||||
|
|
||||||
minimalRawServices = []string{
|
|
||||||
"NetworkManager.service",
|
|
||||||
"firewalld.service",
|
|
||||||
"initial-setup.service",
|
|
||||||
"sshd.service",
|
|
||||||
}
|
|
||||||
|
|
||||||
// Image Definitions
|
|
||||||
imageInstallerImgType = imageType{
|
|
||||||
name: "image-installer",
|
name: "image-installer",
|
||||||
nameAliases: []string{"fedora-image-installer"},
|
nameAliases: []string{"fedora-image-installer"},
|
||||||
filename: "installer.iso",
|
filename: "installer.iso",
|
||||||
|
|
@ -93,11 +69,7 @@ var (
|
||||||
packageSets: map[string]packageSetFunc{
|
packageSets: map[string]packageSetFunc{
|
||||||
osPkgsKey: func(t *imageType) rpmmd.PackageSet {
|
osPkgsKey: func(t *imageType) rpmmd.PackageSet {
|
||||||
// use the minimal raw image type for the OS package set
|
// use the minimal raw image type for the OS package set
|
||||||
ft := &imageType{
|
return packagesets.Load(t, "minimal-raw", VersionReplacements())
|
||||||
name: "minimal-raw",
|
|
||||||
arch: t.arch,
|
|
||||||
}
|
|
||||||
return packagesets.Load(ft, VersionReplacements())
|
|
||||||
},
|
},
|
||||||
installerPkgsKey: packageSetLoader,
|
installerPkgsKey: packageSetLoader,
|
||||||
},
|
},
|
||||||
|
|
@ -115,8 +87,10 @@ var (
|
||||||
exports: []string{"bootiso"},
|
exports: []string{"bootiso"},
|
||||||
requiredPartitionSizes: requiredDirectorySizes,
|
requiredPartitionSizes: requiredDirectorySizes,
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
liveInstallerImgType = imageType{
|
func mkLiveInstallerImgType(d distribution) imageType {
|
||||||
|
return imageType{
|
||||||
name: "live-installer",
|
name: "live-installer",
|
||||||
nameAliases: []string{},
|
nameAliases: []string{},
|
||||||
filename: "live-installer.iso",
|
filename: "live-installer.iso",
|
||||||
|
|
@ -137,8 +111,10 @@ var (
|
||||||
exports: []string{"bootiso"},
|
exports: []string{"bootiso"},
|
||||||
requiredPartitionSizes: requiredDirectorySizes,
|
requiredPartitionSizes: requiredDirectorySizes,
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
iotCommitImgType = imageType{
|
func mkIotCommitImgType(d distribution) imageType {
|
||||||
|
return imageType{
|
||||||
name: "iot-commit",
|
name: "iot-commit",
|
||||||
nameAliases: []string{"fedora-iot-commit"},
|
nameAliases: []string{"fedora-iot-commit"},
|
||||||
filename: "commit.tar",
|
filename: "commit.tar",
|
||||||
|
|
@ -147,8 +123,9 @@ var (
|
||||||
osPkgsKey: packageSetLoader,
|
osPkgsKey: packageSetLoader,
|
||||||
},
|
},
|
||||||
defaultImageConfig: &distro.ImageConfig{
|
defaultImageConfig: &distro.ImageConfig{
|
||||||
EnabledServices: iotServices,
|
EnabledServices: iotServicesForVersion(&d),
|
||||||
DracutConf: []*osbuild.DracutConfStageOptions{osbuild.FIPSDracutConfStageOptions},
|
DracutConf: []*osbuild.DracutConfStageOptions{osbuild.FIPSDracutConfStageOptions},
|
||||||
|
MachineIdUninitialized: common.ToPtr(false),
|
||||||
},
|
},
|
||||||
rpmOstree: true,
|
rpmOstree: true,
|
||||||
image: iotCommitImage,
|
image: iotCommitImage,
|
||||||
|
|
@ -157,14 +134,19 @@ var (
|
||||||
exports: []string{"commit-archive"},
|
exports: []string{"commit-archive"},
|
||||||
requiredPartitionSizes: requiredDirectorySizes,
|
requiredPartitionSizes: requiredDirectorySizes,
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
iotBootableContainer = imageType{
|
func mkIotBootableContainer(d distribution) imageType {
|
||||||
|
return imageType{
|
||||||
name: "iot-bootable-container",
|
name: "iot-bootable-container",
|
||||||
filename: "iot-bootable-container.tar",
|
filename: "iot-bootable-container.tar",
|
||||||
mimeType: "application/x-tar",
|
mimeType: "application/x-tar",
|
||||||
packageSets: map[string]packageSetFunc{
|
packageSets: map[string]packageSetFunc{
|
||||||
osPkgsKey: packageSetLoader,
|
osPkgsKey: packageSetLoader,
|
||||||
},
|
},
|
||||||
|
defaultImageConfig: &distro.ImageConfig{
|
||||||
|
MachineIdUninitialized: common.ToPtr(false),
|
||||||
|
},
|
||||||
rpmOstree: true,
|
rpmOstree: true,
|
||||||
image: bootableContainerImage,
|
image: bootableContainerImage,
|
||||||
buildPipelines: []string{"build"},
|
buildPipelines: []string{"build"},
|
||||||
|
|
@ -172,8 +154,10 @@ var (
|
||||||
exports: []string{"ostree-encapsulate"},
|
exports: []string{"ostree-encapsulate"},
|
||||||
requiredPartitionSizes: requiredDirectorySizes,
|
requiredPartitionSizes: requiredDirectorySizes,
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
iotOCIImgType = imageType{
|
func mkIotOCIImgType(d distribution) imageType {
|
||||||
|
return imageType{
|
||||||
name: "iot-container",
|
name: "iot-container",
|
||||||
nameAliases: []string{"fedora-iot-container"},
|
nameAliases: []string{"fedora-iot-container"},
|
||||||
filename: "container.tar",
|
filename: "container.tar",
|
||||||
|
|
@ -185,8 +169,9 @@ var (
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
defaultImageConfig: &distro.ImageConfig{
|
defaultImageConfig: &distro.ImageConfig{
|
||||||
EnabledServices: iotServices,
|
EnabledServices: iotServicesForVersion(&d),
|
||||||
DracutConf: []*osbuild.DracutConfStageOptions{osbuild.FIPSDracutConfStageOptions},
|
DracutConf: []*osbuild.DracutConfStageOptions{osbuild.FIPSDracutConfStageOptions},
|
||||||
|
MachineIdUninitialized: common.ToPtr(false),
|
||||||
},
|
},
|
||||||
rpmOstree: true,
|
rpmOstree: true,
|
||||||
bootISO: false,
|
bootISO: false,
|
||||||
|
|
@ -196,8 +181,10 @@ var (
|
||||||
exports: []string{"container"},
|
exports: []string{"container"},
|
||||||
requiredPartitionSizes: requiredDirectorySizes,
|
requiredPartitionSizes: requiredDirectorySizes,
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
iotInstallerImgType = imageType{
|
func mkIotInstallerImgType(d distribution) imageType {
|
||||||
|
return imageType{
|
||||||
name: "iot-installer",
|
name: "iot-installer",
|
||||||
nameAliases: []string{"fedora-iot-installer"},
|
nameAliases: []string{"fedora-iot-installer"},
|
||||||
filename: "installer.iso",
|
filename: "installer.iso",
|
||||||
|
|
@ -206,8 +193,8 @@ var (
|
||||||
installerPkgsKey: packageSetLoader,
|
installerPkgsKey: packageSetLoader,
|
||||||
},
|
},
|
||||||
defaultImageConfig: &distro.ImageConfig{
|
defaultImageConfig: &distro.ImageConfig{
|
||||||
|
EnabledServices: iotServicesForVersion(&d),
|
||||||
Locale: common.ToPtr("en_US.UTF-8"),
|
Locale: common.ToPtr("en_US.UTF-8"),
|
||||||
EnabledServices: iotServices,
|
|
||||||
},
|
},
|
||||||
rpmOstree: true,
|
rpmOstree: true,
|
||||||
bootISO: true,
|
bootISO: true,
|
||||||
|
|
@ -218,8 +205,10 @@ var (
|
||||||
exports: []string{"bootiso"},
|
exports: []string{"bootiso"},
|
||||||
requiredPartitionSizes: requiredDirectorySizes,
|
requiredPartitionSizes: requiredDirectorySizes,
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
iotSimplifiedInstallerImgType = imageType{
|
func mkIotSimplifiedInstallerImgType(d distribution) imageType {
|
||||||
|
return imageType{
|
||||||
name: "iot-simplified-installer",
|
name: "iot-simplified-installer",
|
||||||
filename: "simplified-installer.iso",
|
filename: "simplified-installer.iso",
|
||||||
mimeType: "application/x-iso9660-image",
|
mimeType: "application/x-iso9660-image",
|
||||||
|
|
@ -227,7 +216,7 @@ var (
|
||||||
installerPkgsKey: packageSetLoader,
|
installerPkgsKey: packageSetLoader,
|
||||||
},
|
},
|
||||||
defaultImageConfig: &distro.ImageConfig{
|
defaultImageConfig: &distro.ImageConfig{
|
||||||
EnabledServices: iotServices,
|
EnabledServices: iotServicesForVersion(&d),
|
||||||
Keyboard: &osbuild.KeymapStageOptions{
|
Keyboard: &osbuild.KeymapStageOptions{
|
||||||
Keymap: "us",
|
Keymap: "us",
|
||||||
},
|
},
|
||||||
|
|
@ -249,8 +238,10 @@ var (
|
||||||
kernelOptions: ostreeDeploymentKernelOptions,
|
kernelOptions: ostreeDeploymentKernelOptions,
|
||||||
requiredPartitionSizes: requiredDirectorySizes,
|
requiredPartitionSizes: requiredDirectorySizes,
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
iotRawImgType = imageType{
|
func mkIotRawImgType(d distribution) imageType {
|
||||||
|
return imageType{
|
||||||
name: "iot-raw-image",
|
name: "iot-raw-image",
|
||||||
nameAliases: []string{"fedora-iot-raw-image"},
|
nameAliases: []string{"fedora-iot-raw-image"},
|
||||||
filename: "image.raw.xz",
|
filename: "image.raw.xz",
|
||||||
|
|
@ -281,8 +272,10 @@ var (
|
||||||
// override them (and make them smaller, in this case).
|
// override them (and make them smaller, in this case).
|
||||||
requiredPartitionSizes: map[string]uint64{},
|
requiredPartitionSizes: map[string]uint64{},
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
iotQcow2ImgType = imageType{
|
func mkIotQcow2ImgType(d distribution) imageType {
|
||||||
|
return imageType{
|
||||||
name: "iot-qcow2-image",
|
name: "iot-qcow2-image",
|
||||||
filename: "image.qcow2",
|
filename: "image.qcow2",
|
||||||
mimeType: "application/x-qemu-disk",
|
mimeType: "application/x-qemu-disk",
|
||||||
|
|
@ -307,8 +300,10 @@ var (
|
||||||
kernelOptions: ostreeDeploymentKernelOptions,
|
kernelOptions: ostreeDeploymentKernelOptions,
|
||||||
requiredPartitionSizes: requiredDirectorySizes,
|
requiredPartitionSizes: requiredDirectorySizes,
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
qcow2ImgType = imageType{
|
func mkQcow2ImgType(d distribution) imageType {
|
||||||
|
return imageType{
|
||||||
name: "qcow2",
|
name: "qcow2",
|
||||||
filename: "disk.qcow2",
|
filename: "disk.qcow2",
|
||||||
mimeType: "application/x-qemu-disk",
|
mimeType: "application/x-qemu-disk",
|
||||||
|
|
@ -329,7 +324,9 @@ var (
|
||||||
basePartitionTables: defaultBasePartitionTables,
|
basePartitionTables: defaultBasePartitionTables,
|
||||||
requiredPartitionSizes: requiredDirectorySizes,
|
requiredPartitionSizes: requiredDirectorySizes,
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
vmdkDefaultImageConfig = &distro.ImageConfig{
|
vmdkDefaultImageConfig = &distro.ImageConfig{
|
||||||
Locale: common.ToPtr("en_US.UTF-8"),
|
Locale: common.ToPtr("en_US.UTF-8"),
|
||||||
EnabledServices: []string{
|
EnabledServices: []string{
|
||||||
|
|
@ -339,8 +336,10 @@ var (
|
||||||
"cloud-init-local.service",
|
"cloud-init-local.service",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
)
|
||||||
|
|
||||||
vmdkImgType = imageType{
|
func mkVmdkImgType(d distribution) imageType {
|
||||||
|
return imageType{
|
||||||
name: "vmdk",
|
name: "vmdk",
|
||||||
filename: "disk.vmdk",
|
filename: "disk.vmdk",
|
||||||
mimeType: "application/x-vmdk",
|
mimeType: "application/x-vmdk",
|
||||||
|
|
@ -358,8 +357,10 @@ var (
|
||||||
basePartitionTables: defaultBasePartitionTables,
|
basePartitionTables: defaultBasePartitionTables,
|
||||||
requiredPartitionSizes: requiredDirectorySizes,
|
requiredPartitionSizes: requiredDirectorySizes,
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ovaImgType = imageType{
|
func mkOvaImgType(d distribution) imageType {
|
||||||
|
return imageType{
|
||||||
name: "ova",
|
name: "ova",
|
||||||
filename: "image.ova",
|
filename: "image.ova",
|
||||||
mimeType: "application/ovf",
|
mimeType: "application/ovf",
|
||||||
|
|
@ -377,8 +378,10 @@ var (
|
||||||
basePartitionTables: defaultBasePartitionTables,
|
basePartitionTables: defaultBasePartitionTables,
|
||||||
requiredPartitionSizes: requiredDirectorySizes,
|
requiredPartitionSizes: requiredDirectorySizes,
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
containerImgType = imageType{
|
func mkContainerImgType(d distribution) imageType {
|
||||||
|
return imageType{
|
||||||
name: "container",
|
name: "container",
|
||||||
filename: "container.tar",
|
filename: "container.tar",
|
||||||
mimeType: "application/x-tar",
|
mimeType: "application/x-tar",
|
||||||
|
|
@ -398,8 +401,10 @@ var (
|
||||||
exports: []string{"container"},
|
exports: []string{"container"},
|
||||||
requiredPartitionSizes: requiredDirectorySizes,
|
requiredPartitionSizes: requiredDirectorySizes,
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
wslImgType = imageType{
|
func mkWslImgType(d distribution) imageType {
|
||||||
|
return imageType{
|
||||||
name: "wsl",
|
name: "wsl",
|
||||||
filename: "wsl.tar",
|
filename: "wsl.tar",
|
||||||
mimeType: "application/x-tar",
|
mimeType: "application/x-tar",
|
||||||
|
|
@ -424,8 +429,10 @@ var (
|
||||||
exports: []string{"container"},
|
exports: []string{"container"},
|
||||||
requiredPartitionSizes: requiredDirectorySizes,
|
requiredPartitionSizes: requiredDirectorySizes,
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
minimalrawImgType = imageType{
|
func mkMinimalRawImgType(d distribution) imageType {
|
||||||
|
return imageType{
|
||||||
name: "minimal-raw",
|
name: "minimal-raw",
|
||||||
filename: "disk.raw.xz",
|
filename: "disk.raw.xz",
|
||||||
compression: "xz",
|
compression: "xz",
|
||||||
|
|
@ -434,7 +441,7 @@ var (
|
||||||
osPkgsKey: packageSetLoader,
|
osPkgsKey: packageSetLoader,
|
||||||
},
|
},
|
||||||
defaultImageConfig: &distro.ImageConfig{
|
defaultImageConfig: &distro.ImageConfig{
|
||||||
EnabledServices: minimalRawServices,
|
EnabledServices: minimalServicesForVersion(&d),
|
||||||
// NOTE: temporary workaround for a bug in initial-setup that
|
// NOTE: temporary workaround for a bug in initial-setup that
|
||||||
// requires a kickstart file in the root directory.
|
// requires a kickstart file in the root directory.
|
||||||
Files: []*fsnode.File{initialSetupKickstart()},
|
Files: []*fsnode.File{initialSetupKickstart()},
|
||||||
|
|
@ -442,6 +449,7 @@ var (
|
||||||
// Overwrite the default Grub2 timeout value.
|
// Overwrite the default Grub2 timeout value.
|
||||||
Timeout: 5,
|
Timeout: 5,
|
||||||
},
|
},
|
||||||
|
InstallWeakDeps: common.ToPtr(common.VersionLessThan(d.osVersion, VERSION_MINIMAL_WEAKDEPS)),
|
||||||
},
|
},
|
||||||
rpmOstree: false,
|
rpmOstree: false,
|
||||||
kernelOptions: defaultKernelOptions,
|
kernelOptions: defaultKernelOptions,
|
||||||
|
|
@ -454,7 +462,7 @@ var (
|
||||||
basePartitionTables: minimalrawPartitionTables,
|
basePartitionTables: minimalrawPartitionTables,
|
||||||
requiredPartitionSizes: requiredDirectorySizes,
|
requiredPartitionSizes: requiredDirectorySizes,
|
||||||
}
|
}
|
||||||
)
|
}
|
||||||
|
|
||||||
type distribution struct {
|
type distribution struct {
|
||||||
name string
|
name string
|
||||||
|
|
@ -473,6 +481,8 @@ var defaultDistroImageConfig = &distro.ImageConfig{
|
||||||
Timezone: common.ToPtr("UTC"),
|
Timezone: common.ToPtr("UTC"),
|
||||||
Locale: common.ToPtr("C.UTF-8"),
|
Locale: common.ToPtr("C.UTF-8"),
|
||||||
DefaultOSCAPDatastream: common.ToPtr(oscap.DefaultFedoraDatastream()),
|
DefaultOSCAPDatastream: common.ToPtr(oscap.DefaultFedoraDatastream()),
|
||||||
|
InstallWeakDeps: common.ToPtr(true),
|
||||||
|
MachineIdUninitialized: common.ToPtr(true),
|
||||||
}
|
}
|
||||||
|
|
||||||
func defaultDistroInstallerConfig(d *distribution) *distro.InstallerConfig {
|
func defaultDistroInstallerConfig(d *distribution) *distro.InstallerConfig {
|
||||||
|
|
@ -663,6 +673,8 @@ func newDistro(version int) distro.Distro {
|
||||||
distro: &rd,
|
distro: &rd,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
qcow2ImgType := mkQcow2ImgType(rd)
|
||||||
|
|
||||||
ociImgType := qcow2ImgType
|
ociImgType := qcow2ImgType
|
||||||
ociImgType.name = "oci"
|
ociImgType.name = "oci"
|
||||||
|
|
||||||
|
|
@ -696,7 +708,7 @@ func newDistro(version int) distro.Distro {
|
||||||
}
|
}
|
||||||
vhdImgType.defaultImageConfig = vhdConfig.InheritFrom(qcow2ImgType.defaultImageConfig)
|
vhdImgType.defaultImageConfig = vhdConfig.InheritFrom(qcow2ImgType.defaultImageConfig)
|
||||||
|
|
||||||
minimalrawZstdImgType := minimalrawImgType
|
minimalrawZstdImgType := mkMinimalRawImgType(rd)
|
||||||
minimalrawZstdImgType.name = "minimal-raw-zst"
|
minimalrawZstdImgType.name = "minimal-raw-zst"
|
||||||
minimalrawZstdImgType.filename = "disk.raw.zst"
|
minimalrawZstdImgType.filename = "disk.raw.zst"
|
||||||
minimalrawZstdImgType.mimeType = "application/zstd"
|
minimalrawZstdImgType.mimeType = "application/zstd"
|
||||||
|
|
@ -744,7 +756,7 @@ func newDistro(version int) distro.Distro {
|
||||||
ImageFormat: platform.FORMAT_VMDK,
|
ImageFormat: platform.FORMAT_VMDK,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
vmdkImgType,
|
mkVmdkImgType(rd),
|
||||||
)
|
)
|
||||||
x86_64.addImageTypes(
|
x86_64.addImageTypes(
|
||||||
&platform.X86{
|
&platform.X86{
|
||||||
|
|
@ -754,7 +766,7 @@ func newDistro(version int) distro.Distro {
|
||||||
ImageFormat: platform.FORMAT_OVA,
|
ImageFormat: platform.FORMAT_OVA,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
ovaImgType,
|
mkOvaImgType(rd),
|
||||||
)
|
)
|
||||||
x86_64.addImageTypes(
|
x86_64.addImageTypes(
|
||||||
&platform.X86{
|
&platform.X86{
|
||||||
|
|
@ -768,15 +780,22 @@ func newDistro(version int) distro.Distro {
|
||||||
)
|
)
|
||||||
x86_64.addImageTypes(
|
x86_64.addImageTypes(
|
||||||
&platform.X86{},
|
&platform.X86{},
|
||||||
containerImgType,
|
mkContainerImgType(rd),
|
||||||
wslImgType,
|
mkWslImgType(rd),
|
||||||
)
|
)
|
||||||
|
|
||||||
// add distro installer configuration to all installer types
|
// add distro installer configuration to all installer types
|
||||||
distroInstallerConfig := defaultDistroInstallerConfig(&rd)
|
distroInstallerConfig := defaultDistroInstallerConfig(&rd)
|
||||||
|
|
||||||
|
liveInstallerImgType := mkLiveInstallerImgType(rd)
|
||||||
liveInstallerImgType.defaultInstallerConfig = distroInstallerConfig
|
liveInstallerImgType.defaultInstallerConfig = distroInstallerConfig
|
||||||
|
|
||||||
|
imageInstallerImgType := mkImageInstallerImgType(rd)
|
||||||
imageInstallerImgType.defaultInstallerConfig = distroInstallerConfig
|
imageInstallerImgType.defaultInstallerConfig = distroInstallerConfig
|
||||||
|
|
||||||
|
iotInstallerImgType := mkIotInstallerImgType(rd)
|
||||||
iotInstallerImgType.defaultInstallerConfig = distroInstallerConfig
|
iotInstallerImgType.defaultInstallerConfig = distroInstallerConfig
|
||||||
|
|
||||||
x86_64.addImageTypes(
|
x86_64.addImageTypes(
|
||||||
&platform.X86{
|
&platform.X86{
|
||||||
BasePlatform: platform.BasePlatform{
|
BasePlatform: platform.BasePlatform{
|
||||||
|
|
@ -790,8 +809,8 @@ func newDistro(version int) distro.Distro {
|
||||||
BIOS: true,
|
BIOS: true,
|
||||||
UEFIVendor: "fedora",
|
UEFIVendor: "fedora",
|
||||||
},
|
},
|
||||||
iotOCIImgType,
|
mkIotOCIImgType(rd),
|
||||||
iotCommitImgType,
|
mkIotCommitImgType(rd),
|
||||||
iotInstallerImgType,
|
iotInstallerImgType,
|
||||||
imageInstallerImgType,
|
imageInstallerImgType,
|
||||||
liveInstallerImgType,
|
liveInstallerImgType,
|
||||||
|
|
@ -804,7 +823,7 @@ func newDistro(version int) distro.Distro {
|
||||||
BIOS: false,
|
BIOS: false,
|
||||||
UEFIVendor: "fedora",
|
UEFIVendor: "fedora",
|
||||||
},
|
},
|
||||||
iotRawImgType,
|
mkIotRawImgType(rd),
|
||||||
)
|
)
|
||||||
x86_64.addImageTypes(
|
x86_64.addImageTypes(
|
||||||
&platform.X86{
|
&platform.X86{
|
||||||
|
|
@ -814,7 +833,7 @@ func newDistro(version int) distro.Distro {
|
||||||
BIOS: false,
|
BIOS: false,
|
||||||
UEFIVendor: "fedora",
|
UEFIVendor: "fedora",
|
||||||
},
|
},
|
||||||
iotQcow2ImgType,
|
mkIotQcow2ImgType(rd),
|
||||||
)
|
)
|
||||||
aarch64.addImageTypes(
|
aarch64.addImageTypes(
|
||||||
&platform.Aarch64{
|
&platform.Aarch64{
|
||||||
|
|
@ -833,7 +852,7 @@ func newDistro(version int) distro.Distro {
|
||||||
QCOW2Compat: "1.1",
|
QCOW2Compat: "1.1",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
iotQcow2ImgType,
|
mkIotQcow2ImgType(rd),
|
||||||
ociImgType,
|
ociImgType,
|
||||||
qcow2ImgType,
|
qcow2ImgType,
|
||||||
)
|
)
|
||||||
|
|
@ -848,7 +867,7 @@ func newDistro(version int) distro.Distro {
|
||||||
)
|
)
|
||||||
aarch64.addImageTypes(
|
aarch64.addImageTypes(
|
||||||
&platform.Aarch64{},
|
&platform.Aarch64{},
|
||||||
containerImgType,
|
mkContainerImgType(rd),
|
||||||
)
|
)
|
||||||
aarch64.addImageTypes(
|
aarch64.addImageTypes(
|
||||||
&platform.Aarch64{
|
&platform.Aarch64{
|
||||||
|
|
@ -865,9 +884,9 @@ func newDistro(version int) distro.Distro {
|
||||||
UEFIVendor: "fedora",
|
UEFIVendor: "fedora",
|
||||||
},
|
},
|
||||||
imageInstallerImgType,
|
imageInstallerImgType,
|
||||||
iotCommitImgType,
|
mkIotCommitImgType(rd),
|
||||||
iotInstallerImgType,
|
iotInstallerImgType,
|
||||||
iotOCIImgType,
|
mkIotOCIImgType(rd),
|
||||||
liveInstallerImgType,
|
liveInstallerImgType,
|
||||||
)
|
)
|
||||||
aarch64.addImageTypes(
|
aarch64.addImageTypes(
|
||||||
|
|
@ -909,7 +928,7 @@ func newDistro(version int) distro.Distro {
|
||||||
{"/usr/lib/ostree-boot/efi/start_x.elf", "/boot/efi/"},
|
{"/usr/lib/ostree-boot/efi/start_x.elf", "/boot/efi/"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
iotRawImgType,
|
mkIotRawImgType(rd),
|
||||||
)
|
)
|
||||||
x86_64.addImageTypes(
|
x86_64.addImageTypes(
|
||||||
&platform.X86{
|
&platform.X86{
|
||||||
|
|
@ -918,7 +937,7 @@ func newDistro(version int) distro.Distro {
|
||||||
ImageFormat: platform.FORMAT_RAW,
|
ImageFormat: platform.FORMAT_RAW,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
minimalrawImgType,
|
mkMinimalRawImgType(rd),
|
||||||
minimalrawZstdImgType,
|
minimalrawZstdImgType,
|
||||||
)
|
)
|
||||||
aarch64.addImageTypes(
|
aarch64.addImageTypes(
|
||||||
|
|
@ -936,11 +955,13 @@ func newDistro(version int) distro.Distro {
|
||||||
{"/usr/share/uboot/rpi_arm64/u-boot.bin", "/boot/efi/rpi-u-boot.bin"},
|
{"/usr/share/uboot/rpi_arm64/u-boot.bin", "/boot/efi/rpi-u-boot.bin"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
minimalrawImgType,
|
mkMinimalRawImgType(rd),
|
||||||
minimalrawZstdImgType,
|
minimalrawZstdImgType,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
iotSimplifiedInstallerImgType := mkIotSimplifiedInstallerImgType(rd)
|
||||||
iotSimplifiedInstallerImgType.defaultInstallerConfig = distroInstallerConfig
|
iotSimplifiedInstallerImgType.defaultInstallerConfig = distroInstallerConfig
|
||||||
|
|
||||||
x86_64.addImageTypes(
|
x86_64.addImageTypes(
|
||||||
&platform.X86{
|
&platform.X86{
|
||||||
BasePlatform: platform.BasePlatform{
|
BasePlatform: platform.BasePlatform{
|
||||||
|
|
@ -1002,7 +1023,7 @@ func newDistro(version int) distro.Distro {
|
||||||
BIOS: true,
|
BIOS: true,
|
||||||
UEFIVendor: "fedora",
|
UEFIVendor: "fedora",
|
||||||
},
|
},
|
||||||
iotBootableContainer,
|
mkIotBootableContainer(rd),
|
||||||
)
|
)
|
||||||
aarch64.addImageTypes(
|
aarch64.addImageTypes(
|
||||||
&platform.Aarch64{
|
&platform.Aarch64{
|
||||||
|
|
@ -1018,7 +1039,7 @@ func newDistro(version int) distro.Distro {
|
||||||
},
|
},
|
||||||
UEFIVendor: "fedora",
|
UEFIVendor: "fedora",
|
||||||
},
|
},
|
||||||
iotBootableContainer,
|
mkIotBootableContainer(rd),
|
||||||
)
|
)
|
||||||
|
|
||||||
ppc64le.addImageTypes(
|
ppc64le.addImageTypes(
|
||||||
|
|
@ -1029,7 +1050,7 @@ func newDistro(version int) distro.Distro {
|
||||||
QCOW2Compat: "1.1",
|
QCOW2Compat: "1.1",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
iotBootableContainer,
|
mkIotBootableContainer(rd),
|
||||||
)
|
)
|
||||||
|
|
||||||
s390x.addImageTypes(
|
s390x.addImageTypes(
|
||||||
|
|
@ -1040,7 +1061,7 @@ func newDistro(version int) distro.Distro {
|
||||||
QCOW2Compat: "1.1",
|
QCOW2Compat: "1.1",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
iotBootableContainer,
|
mkIotBootableContainer(rd),
|
||||||
)
|
)
|
||||||
|
|
||||||
ppc64le.addImageTypes(
|
ppc64le.addImageTypes(
|
||||||
|
|
@ -1055,7 +1076,7 @@ func newDistro(version int) distro.Distro {
|
||||||
)
|
)
|
||||||
ppc64le.addImageTypes(
|
ppc64le.addImageTypes(
|
||||||
&platform.PPC64LE{},
|
&platform.PPC64LE{},
|
||||||
containerImgType,
|
mkContainerImgType(rd),
|
||||||
)
|
)
|
||||||
|
|
||||||
s390x.addImageTypes(
|
s390x.addImageTypes(
|
||||||
|
|
@ -1070,14 +1091,14 @@ func newDistro(version int) distro.Distro {
|
||||||
)
|
)
|
||||||
s390x.addImageTypes(
|
s390x.addImageTypes(
|
||||||
&platform.S390X{},
|
&platform.S390X{},
|
||||||
containerImgType,
|
mkContainerImgType(rd),
|
||||||
)
|
)
|
||||||
|
|
||||||
// XXX: there is no "qcow2" for riscv64 yet because there is
|
// XXX: there is no "qcow2" for riscv64 yet because there is
|
||||||
// no "@Fedora Cloud Server" group
|
// no "@Fedora Cloud Server" group
|
||||||
riscv64.addImageTypes(
|
riscv64.addImageTypes(
|
||||||
&platform.RISCV64{},
|
&platform.RISCV64{},
|
||||||
containerImgType,
|
mkContainerImgType(rd),
|
||||||
)
|
)
|
||||||
riscv64.addImageTypes(
|
riscv64.addImageTypes(
|
||||||
&platform.RISCV64{
|
&platform.RISCV64{
|
||||||
|
|
@ -1086,7 +1107,7 @@ func newDistro(version int) distro.Distro {
|
||||||
ImageFormat: platform.FORMAT_RAW,
|
ImageFormat: platform.FORMAT_RAW,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
minimalrawImgType,
|
mkMinimalRawImgType(rd),
|
||||||
minimalrawZstdImgType,
|
minimalrawZstdImgType,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -1119,3 +1140,44 @@ func DistroFactory(idStr string) distro.Distro {
|
||||||
|
|
||||||
return newDistro(id.MajorVersion)
|
return newDistro(id.MajorVersion)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func iotServicesForVersion(d *distribution) []string {
|
||||||
|
services := []string{
|
||||||
|
"NetworkManager.service",
|
||||||
|
"firewalld.service",
|
||||||
|
"sshd.service",
|
||||||
|
"greenboot-grub2-set-counter",
|
||||||
|
"greenboot-grub2-set-success",
|
||||||
|
"greenboot-healthcheck",
|
||||||
|
"greenboot-rpm-ostree-grub2-check-fallback",
|
||||||
|
"greenboot-status",
|
||||||
|
"greenboot-task-runner",
|
||||||
|
"redboot-auto-reboot",
|
||||||
|
"redboot-task-runner",
|
||||||
|
}
|
||||||
|
|
||||||
|
if common.VersionLessThan(d.osVersion, "42") {
|
||||||
|
services = append(services, []string{
|
||||||
|
"zezere_ignition.timer",
|
||||||
|
"zezere_ignition_banner.service",
|
||||||
|
"parsec",
|
||||||
|
"dbus-parsec",
|
||||||
|
}...)
|
||||||
|
}
|
||||||
|
|
||||||
|
return services
|
||||||
|
}
|
||||||
|
|
||||||
|
func minimalServicesForVersion(d *distribution) []string {
|
||||||
|
services := []string{
|
||||||
|
"NetworkManager.service",
|
||||||
|
"initial-setup.service",
|
||||||
|
"sshd.service",
|
||||||
|
}
|
||||||
|
|
||||||
|
if common.VersionLessThan(d.osVersion, "43") {
|
||||||
|
services = append(services, []string{"firewalld.service"}...)
|
||||||
|
}
|
||||||
|
|
||||||
|
return services
|
||||||
|
}
|
||||||
|
|
|
||||||
13
vendor/github.com/osbuild/images/pkg/distro/fedora/images.go
generated
vendored
13
vendor/github.com/osbuild/images/pkg/distro/fedora/images.go
generated
vendored
|
|
@ -110,6 +110,10 @@ func osCustomizations(
|
||||||
osc.Hostname = "localhost.localdomain"
|
osc.Hostname = "localhost.localdomain"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if imageConfig.InstallWeakDeps != nil {
|
||||||
|
osc.InstallWeakDeps = *imageConfig.InstallWeakDeps
|
||||||
|
}
|
||||||
|
|
||||||
timezone, ntpServers := c.GetTimezoneSettings()
|
timezone, ntpServers := c.GetTimezoneSettings()
|
||||||
if timezone != nil {
|
if timezone != nil {
|
||||||
osc.Timezone = *timezone
|
osc.Timezone = *timezone
|
||||||
|
|
@ -234,6 +238,10 @@ func osCustomizations(
|
||||||
osc.CACerts = ca.PEMCerts
|
osc.CACerts = ca.PEMCerts
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if imageConfig.MachineIdUninitialized != nil {
|
||||||
|
osc.MachineIdUninitialized = *imageConfig.MachineIdUninitialized
|
||||||
|
}
|
||||||
|
|
||||||
return osc, nil
|
return osc, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -334,7 +342,7 @@ func diskImage(workload workload.Workload,
|
||||||
img.Compression = t.compression
|
img.Compression = t.compression
|
||||||
if bp.Minimal {
|
if bp.Minimal {
|
||||||
// Disable weak dependencies if the 'minimal' option is enabled
|
// Disable weak dependencies if the 'minimal' option is enabled
|
||||||
img.InstallWeakDeps = common.ToPtr(false)
|
img.OSCustomizations.InstallWeakDeps = false
|
||||||
}
|
}
|
||||||
// TODO: move generation into LiveImage
|
// TODO: move generation into LiveImage
|
||||||
pt, err := t.getPartitionTable(bp.Customizations, options, rng)
|
pt, err := t.getPartitionTable(bp.Customizations, options, rng)
|
||||||
|
|
@ -345,9 +353,6 @@ func diskImage(workload workload.Workload,
|
||||||
|
|
||||||
img.Filename = t.Filename()
|
img.Filename = t.Filename()
|
||||||
|
|
||||||
d := t.arch.distro
|
|
||||||
img.FirstBoot = common.VersionGreaterThanOrEqual(d.osVersion, VERSION_FIRSTBOOT)
|
|
||||||
|
|
||||||
return img, nil
|
return img, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
15
vendor/github.com/osbuild/images/pkg/distro/fedora/imagetype.go
generated
vendored
15
vendor/github.com/osbuild/images/pkg/distro/fedora/imagetype.go
generated
vendored
|
|
@ -254,11 +254,22 @@ func (t *imageType) Manifest(bp *blueprint.Blueprint,
|
||||||
|
|
||||||
w := t.workload
|
w := t.workload
|
||||||
if w == nil {
|
if w == nil {
|
||||||
|
// XXX: this needs to get duplicaed in exactly the same
|
||||||
|
// way in rhel/imagetype.go
|
||||||
|
workloadRepos := payloadRepos
|
||||||
|
customRepos, err := bp.Customizations.GetRepositories()
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, err
|
||||||
|
}
|
||||||
|
installFromRepos := blueprint.RepoCustomizationsInstallFromOnly(customRepos)
|
||||||
|
workloadRepos = append(workloadRepos, installFromRepos...)
|
||||||
|
|
||||||
cw := &workload.Custom{
|
cw := &workload.Custom{
|
||||||
BaseWorkload: workload.BaseWorkload{
|
BaseWorkload: workload.BaseWorkload{
|
||||||
Repos: payloadRepos,
|
Repos: workloadRepos,
|
||||||
},
|
},
|
||||||
Packages: bp.GetPackagesEx(false),
|
Packages: bp.GetPackagesEx(false),
|
||||||
|
EnabledModules: bp.GetEnabledModules(),
|
||||||
}
|
}
|
||||||
if services := bp.Customizations.GetServices(); services != nil {
|
if services := bp.Customizations.GetServices(); services != nil {
|
||||||
cw.Services = services.Enabled
|
cw.Services = services.Enabled
|
||||||
|
|
|
||||||
2
vendor/github.com/osbuild/images/pkg/distro/fedora/package_sets.go
generated
vendored
2
vendor/github.com/osbuild/images/pkg/distro/fedora/package_sets.go
generated
vendored
|
|
@ -6,5 +6,5 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func packageSetLoader(t *imageType) rpmmd.PackageSet {
|
func packageSetLoader(t *imageType) rpmmd.PackageSet {
|
||||||
return packagesets.Load(t, VersionReplacements())
|
return packagesets.Load(t, "", VersionReplacements())
|
||||||
}
|
}
|
||||||
|
|
|
||||||
3
vendor/github.com/osbuild/images/pkg/distro/fedora/version.go
generated
vendored
3
vendor/github.com/osbuild/images/pkg/distro/fedora/version.go
generated
vendored
|
|
@ -11,6 +11,9 @@ const VERSION_ROOTFS_SQUASHFS = "41"
|
||||||
// other Fedora variants.
|
// other Fedora variants.
|
||||||
const VERSION_FIRSTBOOT = "43"
|
const VERSION_FIRSTBOOT = "43"
|
||||||
|
|
||||||
|
// Version at which we stop installing weak dependencies for Fedora Minimal
|
||||||
|
const VERSION_MINIMAL_WEAKDEPS = "43"
|
||||||
|
|
||||||
func VersionReplacements() map[string]string {
|
func VersionReplacements() map[string]string {
|
||||||
return map[string]string{
|
return map[string]string{
|
||||||
"VERSION_BRANCHED": VERSION_BRANCHED,
|
"VERSION_BRANCHED": VERSION_BRANCHED,
|
||||||
|
|
|
||||||
9
vendor/github.com/osbuild/images/pkg/distro/image_config.go
generated
vendored
9
vendor/github.com/osbuild/images/pkg/distro/image_config.go
generated
vendored
|
|
@ -94,6 +94,15 @@ type ImageConfig struct {
|
||||||
LockRootUser *bool
|
LockRootUser *bool
|
||||||
|
|
||||||
IgnitionPlatform *string
|
IgnitionPlatform *string
|
||||||
|
|
||||||
|
// InstallWeakDeps enables installation of weak dependencies for packages
|
||||||
|
// that are statically defined for the pipeline.
|
||||||
|
InstallWeakDeps *bool
|
||||||
|
|
||||||
|
// How to handle the /etc/machine-id file, when set to true it causes the
|
||||||
|
// machine id to be set to 'uninitialized' which causes ConditionFirstboot
|
||||||
|
// to be triggered in systemd
|
||||||
|
MachineIdUninitialized *bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// InheritFrom inherits unset values from the provided parent configuration and
|
// InheritFrom inherits unset values from the provided parent configuration and
|
||||||
|
|
|
||||||
12
vendor/github.com/osbuild/images/pkg/distro/packagesets/fedora/package_sets.yaml
generated
vendored
12
vendor/github.com/osbuild/images/pkg/distro/packagesets/fedora/package_sets.yaml
generated
vendored
|
|
@ -102,7 +102,6 @@ iot_commit: &iot_commit
|
||||||
- "criu"
|
- "criu"
|
||||||
- "cryptsetup"
|
- "cryptsetup"
|
||||||
- "curl"
|
- "curl"
|
||||||
- "dbus-parsec"
|
|
||||||
- "dosfstools"
|
- "dosfstools"
|
||||||
- "dracut-config-generic"
|
- "dracut-config-generic"
|
||||||
- "dracut-network"
|
- "dracut-network"
|
||||||
|
|
@ -131,7 +130,6 @@ iot_commit: &iot_commit
|
||||||
- "iputils"
|
- "iputils"
|
||||||
- "iwd"
|
- "iwd"
|
||||||
- "iwlwifi-mvm-firmware"
|
- "iwlwifi-mvm-firmware"
|
||||||
- "kernel-tools"
|
|
||||||
- "keyutils"
|
- "keyutils"
|
||||||
- "less"
|
- "less"
|
||||||
- "libsss_sudo"
|
- "libsss_sudo"
|
||||||
|
|
@ -142,11 +140,9 @@ iot_commit: &iot_commit
|
||||||
- "openssh-clients"
|
- "openssh-clients"
|
||||||
- "openssh-server"
|
- "openssh-server"
|
||||||
- "openssl"
|
- "openssl"
|
||||||
- "parsec"
|
|
||||||
- "pinentry"
|
- "pinentry"
|
||||||
- "podman"
|
- "podman"
|
||||||
- "policycoreutils"
|
- "policycoreutils"
|
||||||
- "policycoreutils-python-utils"
|
|
||||||
- "polkit"
|
- "polkit"
|
||||||
- "procps-ng"
|
- "procps-ng"
|
||||||
- "realtek-firmware"
|
- "realtek-firmware"
|
||||||
|
|
@ -175,13 +171,19 @@ iot_commit: &iot_commit
|
||||||
- "wpa_supplicant"
|
- "wpa_supplicant"
|
||||||
- "xfsprogs"
|
- "xfsprogs"
|
||||||
- "xz"
|
- "xz"
|
||||||
- "zezere-ignition"
|
|
||||||
- "zram-generator"
|
- "zram-generator"
|
||||||
condition:
|
condition:
|
||||||
version_less_than:
|
version_less_than:
|
||||||
"41":
|
"41":
|
||||||
include:
|
include:
|
||||||
- "dnsmasq"
|
- "dnsmasq"
|
||||||
|
"42":
|
||||||
|
include:
|
||||||
|
- "dbus-parsec"
|
||||||
|
- "kernel-tools"
|
||||||
|
- "parsec"
|
||||||
|
- "policycoreutils-python-utils"
|
||||||
|
- "zezere-ignition"
|
||||||
"43":
|
"43":
|
||||||
include:
|
include:
|
||||||
- "basesystem"
|
- "basesystem"
|
||||||
|
|
|
||||||
34
vendor/github.com/osbuild/images/pkg/distro/packagesets/loader.go
generated
vendored
34
vendor/github.com/osbuild/images/pkg/distro/packagesets/loader.go
generated
vendored
|
|
@ -3,17 +3,21 @@ package packagesets
|
||||||
import (
|
import (
|
||||||
"embed"
|
"embed"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"io/fs"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"gopkg.in/yaml.v3"
|
||||||
|
|
||||||
"github.com/osbuild/images/internal/common"
|
"github.com/osbuild/images/internal/common"
|
||||||
"github.com/osbuild/images/pkg/distro"
|
"github.com/osbuild/images/pkg/distro"
|
||||||
"github.com/osbuild/images/pkg/rpmmd"
|
"github.com/osbuild/images/pkg/rpmmd"
|
||||||
"gopkg.in/yaml.v3"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
//go:embed */*.yaml
|
//go:embed */*.yaml
|
||||||
var Data embed.FS
|
var data embed.FS
|
||||||
|
|
||||||
|
var DataFS fs.FS = data
|
||||||
|
|
||||||
type packageSet struct {
|
type packageSet struct {
|
||||||
Include []string `yaml:"include"`
|
Include []string `yaml:"include"`
|
||||||
|
|
@ -25,19 +29,31 @@ type conditions struct {
|
||||||
Architecture map[string]packageSet `yaml:"architecture,omitempty"`
|
Architecture map[string]packageSet `yaml:"architecture,omitempty"`
|
||||||
VersionLessThan map[string]packageSet `yaml:"version_less_than,omitempty"`
|
VersionLessThan map[string]packageSet `yaml:"version_less_than,omitempty"`
|
||||||
VersionGreaterOrEqual map[string]packageSet `yaml:"version_greater_or_equal,omitempty"`
|
VersionGreaterOrEqual map[string]packageSet `yaml:"version_greater_or_equal,omitempty"`
|
||||||
|
DistroName map[string]packageSet `yaml:"distro_name,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func Load(it distro.ImageType, replacements map[string]string) rpmmd.PackageSet {
|
// Load loads the PackageSet from the yaml source file discovered via the
|
||||||
typeName := strings.ReplaceAll(it.Name(), "-", "_")
|
// imagetype. By default the imagetype name is used to load the packageset
|
||||||
|
// but with "overrideTypeName" this can be overriden (useful for e.g.
|
||||||
|
// installer image types).
|
||||||
|
func Load(it distro.ImageType, overrideTypeName string, replacements map[string]string) rpmmd.PackageSet {
|
||||||
|
typeName := it.Name()
|
||||||
|
if overrideTypeName != "" {
|
||||||
|
typeName = overrideTypeName
|
||||||
|
}
|
||||||
|
typeName = strings.ReplaceAll(typeName, "-", "_")
|
||||||
|
|
||||||
arch := it.Arch()
|
arch := it.Arch()
|
||||||
archName := arch.Name()
|
archName := arch.Name()
|
||||||
distribution := arch.Distro()
|
distribution := arch.Distro()
|
||||||
distroNameVer := distribution.Name()
|
distroNameVer := distribution.Name()
|
||||||
distroName := strings.SplitN(distroNameVer, "-", 2)[0]
|
// we need to split from the right for "centos-stream-10" like
|
||||||
|
// distro names, sadly go has no rsplit() so we do it manually
|
||||||
|
// XXX: we cannot use distroidparser here because of import cycles
|
||||||
|
distroName := distroNameVer[:strings.LastIndex(distroNameVer, "-")]
|
||||||
distroVersion := distribution.OsVersion()
|
distroVersion := distribution.OsVersion()
|
||||||
|
|
||||||
distroSets, err := Data.Open(filepath.Join(distroName, "package_sets.yaml"))
|
distroSets, err := DataFS.Open(filepath.Join(distroName, "package_sets.yaml"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
@ -67,6 +83,12 @@ func Load(it distro.ImageType, replacements map[string]string) rpmmd.PackageSet
|
||||||
Exclude: archSet.Exclude,
|
Exclude: archSet.Exclude,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
if distroNameSet, ok := pkgSet.Condition.DistroName[distroName]; ok {
|
||||||
|
rpmmdPkgSet = rpmmdPkgSet.Append(rpmmd.PackageSet{
|
||||||
|
Include: distroNameSet.Include,
|
||||||
|
Exclude: distroNameSet.Exclude,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
for ltVer, ltSet := range pkgSet.Condition.VersionLessThan {
|
for ltVer, ltSet := range pkgSet.Condition.VersionLessThan {
|
||||||
if r, ok := replacements[ltVer]; ok {
|
if r, ok := replacements[ltVer]; ok {
|
||||||
|
|
|
||||||
4
vendor/github.com/osbuild/images/pkg/distro/rhel/images.go
generated
vendored
4
vendor/github.com/osbuild/images/pkg/distro/rhel/images.go
generated
vendored
|
|
@ -279,6 +279,10 @@ func osCustomizations(
|
||||||
osc.CACerts = ca.PEMCerts
|
osc.CACerts = ca.PEMCerts
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if imageConfig.InstallWeakDeps != nil {
|
||||||
|
osc.InstallWeakDeps = *imageConfig.InstallWeakDeps
|
||||||
|
}
|
||||||
|
|
||||||
return osc, nil
|
return osc, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
15
vendor/github.com/osbuild/images/pkg/distro/rhel/imagetype.go
generated
vendored
15
vendor/github.com/osbuild/images/pkg/distro/rhel/imagetype.go
generated
vendored
|
|
@ -304,11 +304,22 @@ func (t *ImageType) Manifest(bp *blueprint.Blueprint,
|
||||||
|
|
||||||
w := t.Workload
|
w := t.Workload
|
||||||
if w == nil {
|
if w == nil {
|
||||||
|
// XXX: this needs to get duplicaed in exactly the same
|
||||||
|
// way in fedora/imagetype.go
|
||||||
|
workloadRepos := payloadRepos
|
||||||
|
customRepos, err := bp.Customizations.GetRepositories()
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, err
|
||||||
|
}
|
||||||
|
installFromRepos := blueprint.RepoCustomizationsInstallFromOnly(customRepos)
|
||||||
|
workloadRepos = append(workloadRepos, installFromRepos...)
|
||||||
|
|
||||||
cw := &workload.Custom{
|
cw := &workload.Custom{
|
||||||
BaseWorkload: workload.BaseWorkload{
|
BaseWorkload: workload.BaseWorkload{
|
||||||
Repos: payloadRepos,
|
Repos: workloadRepos,
|
||||||
},
|
},
|
||||||
Packages: bp.GetPackagesEx(false),
|
Packages: bp.GetPackagesEx(false),
|
||||||
|
EnabledModules: bp.GetEnabledModules(),
|
||||||
}
|
}
|
||||||
if services := bp.Customizations.GetServices(); services != nil {
|
if services := bp.Customizations.GetServices(); services != nil {
|
||||||
cw.Services = services.Enabled
|
cw.Services = services.Enabled
|
||||||
|
|
|
||||||
1
vendor/github.com/osbuild/images/pkg/distro/rhel/rhel10/distro.go
generated
vendored
1
vendor/github.com/osbuild/images/pkg/distro/rhel/rhel10/distro.go
generated
vendored
|
|
@ -66,6 +66,7 @@ func defaultDistroImageConfig(d *rhel.Distribution) *distro.ImageConfig {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
DefaultOSCAPDatastream: common.ToPtr(oscap.DefaultRHEL10Datastream(d.IsRHEL())),
|
DefaultOSCAPDatastream: common.ToPtr(oscap.DefaultRHEL10Datastream(d.IsRHEL())),
|
||||||
|
InstallWeakDeps: common.ToPtr(true),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
1
vendor/github.com/osbuild/images/pkg/distro/rhel/rhel7/distro.go
generated
vendored
1
vendor/github.com/osbuild/images/pkg/distro/rhel/rhel7/distro.go
generated
vendored
|
|
@ -33,6 +33,7 @@ func defaultDistroImageConfig(d *rhel.Distribution) *distro.ImageConfig {
|
||||||
},
|
},
|
||||||
KernelOptionsBootloader: common.ToPtr(true),
|
KernelOptionsBootloader: common.ToPtr(true),
|
||||||
NoBLS: common.ToPtr(true), // RHEL 7 grub does not support BLS
|
NoBLS: common.ToPtr(true), // RHEL 7 grub does not support BLS
|
||||||
|
InstallWeakDeps: common.ToPtr(true),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
1
vendor/github.com/osbuild/images/pkg/distro/rhel/rhel8/distro.go
generated
vendored
1
vendor/github.com/osbuild/images/pkg/distro/rhel/rhel8/distro.go
generated
vendored
|
|
@ -54,6 +54,7 @@ func defaultDistroImageConfig(d *rhel.Distribution) *distro.ImageConfig {
|
||||||
},
|
},
|
||||||
KernelOptionsBootloader: common.ToPtr(true),
|
KernelOptionsBootloader: common.ToPtr(true),
|
||||||
DefaultOSCAPDatastream: common.ToPtr(oscap.DefaultRHEL8Datastream(d.IsRHEL())),
|
DefaultOSCAPDatastream: common.ToPtr(oscap.DefaultRHEL8Datastream(d.IsRHEL())),
|
||||||
|
InstallWeakDeps: common.ToPtr(true),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
1
vendor/github.com/osbuild/images/pkg/distro/rhel/rhel9/distro.go
generated
vendored
1
vendor/github.com/osbuild/images/pkg/distro/rhel/rhel9/distro.go
generated
vendored
|
|
@ -69,6 +69,7 @@ func defaultDistroImageConfig(d *rhel.Distribution) *distro.ImageConfig {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
DefaultOSCAPDatastream: common.ToPtr(oscap.DefaultRHEL9Datastream(d.IsRHEL())),
|
DefaultOSCAPDatastream: common.ToPtr(oscap.DefaultRHEL9Datastream(d.IsRHEL())),
|
||||||
|
InstallWeakDeps: common.ToPtr(true),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
36
vendor/github.com/osbuild/images/pkg/dnfjson/dnfjson.go
generated
vendored
36
vendor/github.com/osbuild/images/pkg/dnfjson/dnfjson.go
generated
vendored
|
|
@ -168,6 +168,7 @@ type Solver struct {
|
||||||
// DepsolveResult contains the results of a depsolve operation.
|
// DepsolveResult contains the results of a depsolve operation.
|
||||||
type DepsolveResult struct {
|
type DepsolveResult struct {
|
||||||
Packages []rpmmd.PackageSpec
|
Packages []rpmmd.PackageSpec
|
||||||
|
Modules []rpmmd.ModuleSpec
|
||||||
Repos []rpmmd.RepoConfig
|
Repos []rpmmd.RepoConfig
|
||||||
SBOM *sbom.Document
|
SBOM *sbom.Document
|
||||||
Solver string
|
Solver string
|
||||||
|
|
@ -240,7 +241,7 @@ func (s *Solver) Depsolve(pkgSets []rpmmd.PackageSet, sbomType sbom.StandardType
|
||||||
return nil, fmt.Errorf("decoding depsolve result failed: %w", err)
|
return nil, fmt.Errorf("decoding depsolve result failed: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
packages, repos := result.toRPMMD(rhsmMap)
|
packages, modules, repos := result.toRPMMD(rhsmMap)
|
||||||
|
|
||||||
var sbomDoc *sbom.Document
|
var sbomDoc *sbom.Document
|
||||||
if sbomType != sbom.StandardTypeNone {
|
if sbomType != sbom.StandardTypeNone {
|
||||||
|
|
@ -252,6 +253,7 @@ func (s *Solver) Depsolve(pkgSets []rpmmd.PackageSet, sbomType sbom.StandardType
|
||||||
|
|
||||||
return &DepsolveResult{
|
return &DepsolveResult{
|
||||||
Packages: packages,
|
Packages: packages,
|
||||||
|
Modules: modules,
|
||||||
Repos: repos,
|
Repos: repos,
|
||||||
SBOM: sbomDoc,
|
SBOM: sbomDoc,
|
||||||
Solver: result.Solver,
|
Solver: result.Solver,
|
||||||
|
|
@ -463,9 +465,10 @@ func (s *Solver) makeDepsolveRequest(pkgSets []rpmmd.PackageSet, sbomType sbom.S
|
||||||
transactions := make([]transactionArgs, len(pkgSets))
|
transactions := make([]transactionArgs, len(pkgSets))
|
||||||
for dsIdx, pkgSet := range pkgSets {
|
for dsIdx, pkgSet := range pkgSets {
|
||||||
transactions[dsIdx] = transactionArgs{
|
transactions[dsIdx] = transactionArgs{
|
||||||
PackageSpecs: pkgSet.Include,
|
PackageSpecs: pkgSet.Include,
|
||||||
ExcludeSpecs: pkgSet.Exclude,
|
ExcludeSpecs: pkgSet.Exclude,
|
||||||
InstallWeakDeps: pkgSet.InstallWeakDeps,
|
ModuleEnableSpecs: pkgSet.EnabledModules,
|
||||||
|
InstallWeakDeps: pkgSet.InstallWeakDeps,
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, jobRepo := range pkgSet.Repositories {
|
for _, jobRepo := range pkgSet.Repositories {
|
||||||
|
|
@ -577,7 +580,7 @@ func (s *Solver) makeSearchRequest(repos []rpmmd.RepoConfig, packages []string)
|
||||||
// convert internal a list of PackageSpecs and map of repoConfig to the rpmmd
|
// convert internal a list of PackageSpecs and map of repoConfig to the rpmmd
|
||||||
// equivalents and attach key and subscription information based on the
|
// equivalents and attach key and subscription information based on the
|
||||||
// repository configs.
|
// repository configs.
|
||||||
func (result depsolveResult) toRPMMD(rhsm map[string]bool) ([]rpmmd.PackageSpec, []rpmmd.RepoConfig) {
|
func (result depsolveResult) toRPMMD(rhsm map[string]bool) ([]rpmmd.PackageSpec, []rpmmd.ModuleSpec, []rpmmd.RepoConfig) {
|
||||||
pkgs := result.Packages
|
pkgs := result.Packages
|
||||||
repos := result.Repos
|
repos := result.Repos
|
||||||
rpmDependencies := make([]rpmmd.PackageSpec, len(pkgs))
|
rpmDependencies := make([]rpmmd.PackageSpec, len(pkgs))
|
||||||
|
|
@ -610,6 +613,22 @@ func (result depsolveResult) toRPMMD(rhsm map[string]bool) ([]rpmmd.PackageSpec,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mods := result.Modules
|
||||||
|
moduleSpecs := make([]rpmmd.ModuleSpec, len(mods))
|
||||||
|
|
||||||
|
i := 0
|
||||||
|
for _, mod := range mods {
|
||||||
|
moduleSpecs[i].ModuleConfigFile.Data.Name = mod.ModuleConfigFile.Data.Name
|
||||||
|
moduleSpecs[i].ModuleConfigFile.Data.Stream = mod.ModuleConfigFile.Data.Stream
|
||||||
|
moduleSpecs[i].ModuleConfigFile.Data.State = mod.ModuleConfigFile.Data.State
|
||||||
|
moduleSpecs[i].ModuleConfigFile.Data.Profiles = mod.ModuleConfigFile.Data.Profiles
|
||||||
|
|
||||||
|
moduleSpecs[i].FailsafeFile.Path = mod.FailsafeFile.Path
|
||||||
|
moduleSpecs[i].FailsafeFile.Data = mod.FailsafeFile.Data
|
||||||
|
|
||||||
|
i++
|
||||||
|
}
|
||||||
|
|
||||||
repoConfigs := make([]rpmmd.RepoConfig, 0, len(repos))
|
repoConfigs := make([]rpmmd.RepoConfig, 0, len(repos))
|
||||||
for repoID := range repos {
|
for repoID := range repos {
|
||||||
repo := repos[repoID]
|
repo := repos[repoID]
|
||||||
|
|
@ -635,7 +654,7 @@ func (result depsolveResult) toRPMMD(rhsm map[string]bool) ([]rpmmd.PackageSpec,
|
||||||
SSLClientCert: repo.SSLClientCert,
|
SSLClientCert: repo.SSLClientCert,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
return rpmDependencies, repoConfigs
|
return rpmDependencies, moduleSpecs, repoConfigs
|
||||||
}
|
}
|
||||||
|
|
||||||
// Request command and arguments for dnf-json
|
// Request command and arguments for dnf-json
|
||||||
|
|
@ -723,6 +742,9 @@ type transactionArgs struct {
|
||||||
// Packages to exclude from results
|
// Packages to exclude from results
|
||||||
ExcludeSpecs []string `json:"exclude-specs"`
|
ExcludeSpecs []string `json:"exclude-specs"`
|
||||||
|
|
||||||
|
// Modules to enable during depsolve
|
||||||
|
ModuleEnableSpecs []string `json:"module-enable-specs,omitempty"`
|
||||||
|
|
||||||
// IDs of repositories to use for this depsolve
|
// IDs of repositories to use for this depsolve
|
||||||
RepoIDs []string `json:"repo-ids"`
|
RepoIDs []string `json:"repo-ids"`
|
||||||
|
|
||||||
|
|
@ -779,7 +801,7 @@ type ModuleConfigData struct {
|
||||||
|
|
||||||
type ModuleFailsafeFile struct {
|
type ModuleFailsafeFile struct {
|
||||||
Path string `json:"path"`
|
Path string `json:"path"`
|
||||||
Data string `json:"string"`
|
Data string `json:"data"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// dnf-json error structure
|
// dnf-json error structure
|
||||||
|
|
|
||||||
69
vendor/github.com/osbuild/images/pkg/experimentalflags/experimental.go
generated
vendored
Normal file
69
vendor/github.com/osbuild/images/pkg/experimentalflags/experimental.go
generated
vendored
Normal file
|
|
@ -0,0 +1,69 @@
|
||||||
|
// Package experimentalflags provides functionality for reading
|
||||||
|
// options defined in an environment variable named
|
||||||
|
// IMAGE_BUILDER_EXPERIMENTAL.
|
||||||
|
//
|
||||||
|
// These functions should be used to determine, in a common way, if
|
||||||
|
// experimental features should be enabled when using the libarary.
|
||||||
|
package experimentalflags
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
const envKEY = "IMAGE_BUILDER_EXPERIMENTAL"
|
||||||
|
|
||||||
|
func experimentalOptions() map[string]string {
|
||||||
|
expMap := map[string]string{}
|
||||||
|
|
||||||
|
env := os.Getenv(envKEY)
|
||||||
|
if env == "" {
|
||||||
|
return expMap
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, s := range strings.Split(env, ",") {
|
||||||
|
l := strings.SplitN(s, "=", 2)
|
||||||
|
switch len(l) {
|
||||||
|
case 1:
|
||||||
|
expMap[l[0]] = "true"
|
||||||
|
case 2:
|
||||||
|
expMap[l[0]] = l[1]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return expMap
|
||||||
|
}
|
||||||
|
|
||||||
|
// Bool returns true if there is a boolean option with the given
|
||||||
|
// option name.
|
||||||
|
//
|
||||||
|
// Example usage by the user:
|
||||||
|
//
|
||||||
|
// IMAGE_BUILDER_EXPERIMENTAL=skip-foo,skip-bar=1,skip-baz=true
|
||||||
|
//
|
||||||
|
// would result in experimetnalflags.Bool("skip-foo") -> true
|
||||||
|
func Bool(option string) bool {
|
||||||
|
expMap := experimentalOptions()
|
||||||
|
b, err := strconv.ParseBool(expMap[option])
|
||||||
|
if err != nil {
|
||||||
|
// not much we can do for invalid inputs, just assume false
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
// String returns the user set string for the given experimental feature.
|
||||||
|
//
|
||||||
|
// Note that currently no quoting or escaping is supported, so a string
|
||||||
|
// can (currently) not contain a "," or a "=".
|
||||||
|
//
|
||||||
|
// Example usage by the user:
|
||||||
|
//
|
||||||
|
// IMAGE_BUILDER_EXPERIMENTAL=key=value
|
||||||
|
//
|
||||||
|
// would result in experimetnalflags.String("key") -> "value"
|
||||||
|
func String(option string) string {
|
||||||
|
expMap := experimentalOptions()
|
||||||
|
return expMap[option]
|
||||||
|
}
|
||||||
4
vendor/github.com/osbuild/images/pkg/image/disk.go
generated
vendored
4
vendor/github.com/osbuild/images/pkg/image/disk.go
generated
vendored
|
|
@ -39,8 +39,6 @@ type DiskImage struct {
|
||||||
// InstallWeakDeps enables installation of weak dependencies for packages
|
// InstallWeakDeps enables installation of weak dependencies for packages
|
||||||
// that are statically defined for the payload pipeline of the image.
|
// that are statically defined for the payload pipeline of the image.
|
||||||
InstallWeakDeps *bool
|
InstallWeakDeps *bool
|
||||||
|
|
||||||
FirstBoot bool
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewDiskImage() *DiskImage {
|
func NewDiskImage() *DiskImage {
|
||||||
|
|
@ -65,10 +63,10 @@ func (img *DiskImage) InstantiateManifest(m *manifest.Manifest,
|
||||||
osPipeline.OSProduct = img.OSProduct
|
osPipeline.OSProduct = img.OSProduct
|
||||||
osPipeline.OSVersion = img.OSVersion
|
osPipeline.OSVersion = img.OSVersion
|
||||||
osPipeline.OSNick = img.OSNick
|
osPipeline.OSNick = img.OSNick
|
||||||
|
|
||||||
if img.InstallWeakDeps != nil {
|
if img.InstallWeakDeps != nil {
|
||||||
osPipeline.InstallWeakDeps = *img.InstallWeakDeps
|
osPipeline.InstallWeakDeps = *img.InstallWeakDeps
|
||||||
}
|
}
|
||||||
osPipeline.FirstBoot = img.FirstBoot
|
|
||||||
|
|
||||||
rawImagePipeline := manifest.NewRawImage(buildPipeline, osPipeline)
|
rawImagePipeline := manifest.NewRawImage(buildPipeline, osPipeline)
|
||||||
rawImagePipeline.PartTool = img.PartTool
|
rawImagePipeline.PartTool = img.PartTool
|
||||||
|
|
|
||||||
62
vendor/github.com/osbuild/images/pkg/manifest/build.go
generated
vendored
62
vendor/github.com/osbuild/images/pkg/manifest/build.go
generated
vendored
|
|
@ -3,7 +3,9 @@ package manifest
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/osbuild/images/internal/common"
|
||||||
"github.com/osbuild/images/pkg/container"
|
"github.com/osbuild/images/pkg/container"
|
||||||
|
"github.com/osbuild/images/pkg/experimentalflags"
|
||||||
"github.com/osbuild/images/pkg/osbuild"
|
"github.com/osbuild/images/pkg/osbuild"
|
||||||
"github.com/osbuild/images/pkg/rpmmd"
|
"github.com/osbuild/images/pkg/rpmmd"
|
||||||
"github.com/osbuild/images/pkg/runner"
|
"github.com/osbuild/images/pkg/runner"
|
||||||
|
|
@ -57,6 +59,11 @@ func NewBuild(m *Manifest, runner runner.Runner, repos []rpmmd.RepoConfig, opts
|
||||||
repos: filterRepos(repos, name),
|
repos: filterRepos(repos, name),
|
||||||
containerBuildable: opts.ContainerBuildable,
|
containerBuildable: opts.ContainerBuildable,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This allows to bootstrap the buildroot with a custom container
|
||||||
|
// for e.g. cross-arch-build experiments,
|
||||||
|
maybeAddExperimentalContainerBootstrap(m, runner, opts, pipeline)
|
||||||
|
|
||||||
m.addPipeline(pipeline)
|
m.addPipeline(pipeline)
|
||||||
return pipeline
|
return pipeline
|
||||||
}
|
}
|
||||||
|
|
@ -149,6 +156,40 @@ func (p *BuildrootFromPackages) getSELinuxLabels() map[string]string {
|
||||||
return labels
|
return labels
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// maybeAddExperimentalContainerBootstrap will return a container buildroot
|
||||||
|
// if the "IMAGE_BUILDER_EXPERIMENTAL=bootstrap=<container-ref>" is
|
||||||
|
// defined. This allows us to do cross-arch build experimentation.
|
||||||
|
//
|
||||||
|
// A "bootstrap" container has only these requirements:
|
||||||
|
// - python3 for the runners
|
||||||
|
// - rpm so that the real buildroot rpms can get installed
|
||||||
|
// - setfiles so that the selinux stage for the real buildroot can run
|
||||||
|
// (and does not even need a working dnf or repo setup).
|
||||||
|
func maybeAddExperimentalContainerBootstrap(m *Manifest, runner runner.Runner, opts *BuildOptions, build *BuildrootFromPackages) {
|
||||||
|
bootstrapBuildrootRef := experimentalflags.String("bootstrap")
|
||||||
|
if bootstrapBuildrootRef == "" {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
cntSrcs := []container.SourceSpec{
|
||||||
|
{
|
||||||
|
Source: bootstrapBuildrootRef,
|
||||||
|
Name: bootstrapBuildrootRef,
|
||||||
|
TLSVerify: common.ToPtr(false),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
name := "bootstrap-buildroot"
|
||||||
|
bootstrapPipeline := &BuildrootFromContainer{
|
||||||
|
Base: NewBase(name, nil),
|
||||||
|
runner: runner,
|
||||||
|
dependents: make([]Pipeline, 0),
|
||||||
|
containers: cntSrcs,
|
||||||
|
disableSelinux: true,
|
||||||
|
}
|
||||||
|
m.addPipeline(bootstrapPipeline)
|
||||||
|
build.build = bootstrapPipeline
|
||||||
|
}
|
||||||
|
|
||||||
type BuildrootFromContainer struct {
|
type BuildrootFromContainer struct {
|
||||||
Base
|
Base
|
||||||
|
|
||||||
|
|
@ -159,6 +200,7 @@ type BuildrootFromContainer struct {
|
||||||
containerSpecs []container.Spec
|
containerSpecs []container.Spec
|
||||||
|
|
||||||
containerBuildable bool
|
containerBuildable bool
|
||||||
|
disableSelinux bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewBuildFromContainer creates a new build pipeline from the given
|
// NewBuildFromContainer creates a new build pipeline from the given
|
||||||
|
|
@ -213,6 +255,10 @@ func (p *BuildrootFromContainer) serializeEnd() {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *BuildrootFromContainer) getSELinuxLabels() map[string]string {
|
func (p *BuildrootFromContainer) getSELinuxLabels() map[string]string {
|
||||||
|
if p.disableSelinux {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
labels := map[string]string{
|
labels := map[string]string{
|
||||||
"/usr/bin/ostree": "system_u:object_r:install_exec_t:s0",
|
"/usr/bin/ostree": "system_u:object_r:install_exec_t:s0",
|
||||||
}
|
}
|
||||||
|
|
@ -242,13 +288,15 @@ func (p *BuildrootFromContainer) serialize() osbuild.Pipeline {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
pipeline.AddStage(stage)
|
pipeline.AddStage(stage)
|
||||||
pipeline.AddStage(osbuild.NewSELinuxStage(
|
if !p.disableSelinux {
|
||||||
&osbuild.SELinuxStageOptions{
|
pipeline.AddStage(osbuild.NewSELinuxStage(
|
||||||
FileContexts: "etc/selinux/targeted/contexts/files/file_contexts",
|
&osbuild.SELinuxStageOptions{
|
||||||
ExcludePaths: []string{"/sysroot"},
|
FileContexts: "etc/selinux/targeted/contexts/files/file_contexts",
|
||||||
Labels: p.getSELinuxLabels(),
|
ExcludePaths: []string{"/sysroot"},
|
||||||
},
|
Labels: p.getSELinuxLabels(),
|
||||||
))
|
},
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
return pipeline
|
return pipeline
|
||||||
}
|
}
|
||||||
|
|
|
||||||
9
vendor/github.com/osbuild/images/pkg/manifest/manifest.go
generated
vendored
9
vendor/github.com/osbuild/images/pkg/manifest/manifest.go
generated
vendored
|
|
@ -22,15 +22,6 @@ import (
|
||||||
"github.com/osbuild/images/pkg/rpmmd"
|
"github.com/osbuild/images/pkg/rpmmd"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Arch uint64
|
|
||||||
|
|
||||||
const (
|
|
||||||
ARCH_X86_64 Arch = iota
|
|
||||||
ARCH_AARCH64
|
|
||||||
ARCH_S390X
|
|
||||||
ARCH_PPC64LE
|
|
||||||
)
|
|
||||||
|
|
||||||
type Distro uint64
|
type Distro uint64
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|
|
||||||
69
vendor/github.com/osbuild/images/pkg/manifest/os.go
generated
vendored
69
vendor/github.com/osbuild/images/pkg/manifest/os.go
generated
vendored
|
|
@ -149,10 +149,14 @@ type OSCustomizations struct {
|
||||||
// instead of BLS. Required for legacy systems like RHEL 7.
|
// instead of BLS. Required for legacy systems like RHEL 7.
|
||||||
NoBLS bool
|
NoBLS bool
|
||||||
|
|
||||||
// FirstBoot sets if the machine-id should be written with the
|
// InstallWeakDeps enables installation of weak dependencies for packages
|
||||||
// magic value that determines if the machine is being booted for the
|
// that are statically defined for the pipeline.
|
||||||
// first time.
|
// Defaults to True.
|
||||||
FirstBoot bool
|
InstallWeakDeps bool
|
||||||
|
|
||||||
|
// Determines if the machine id should be set to "uninitialized" which allows
|
||||||
|
// "ConditionFirstBoot" to work in systemd
|
||||||
|
MachineIdUninitialized bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// OS represents the filesystem tree of the target image. This roughly
|
// OS represents the filesystem tree of the target image. This roughly
|
||||||
|
|
@ -184,6 +188,7 @@ type OS struct {
|
||||||
// content-related fields
|
// content-related fields
|
||||||
repos []rpmmd.RepoConfig
|
repos []rpmmd.RepoConfig
|
||||||
packageSpecs []rpmmd.PackageSpec
|
packageSpecs []rpmmd.PackageSpec
|
||||||
|
moduleSpecs []rpmmd.ModuleSpec
|
||||||
containerSpecs []container.Spec
|
containerSpecs []container.Spec
|
||||||
ostreeParentSpec *ostree.CommitSpec
|
ostreeParentSpec *ostree.CommitSpec
|
||||||
|
|
||||||
|
|
@ -193,11 +198,6 @@ type OS struct {
|
||||||
OSProduct string
|
OSProduct string
|
||||||
OSVersion string
|
OSVersion string
|
||||||
OSNick string
|
OSNick string
|
||||||
|
|
||||||
// InstallWeakDeps enables installation of weak dependencies for packages
|
|
||||||
// that are statically defined for the pipeline.
|
|
||||||
// Defaults to True.
|
|
||||||
InstallWeakDeps bool
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewOS creates a new OS pipeline. build is the build pipeline to use for
|
// NewOS creates a new OS pipeline. build is the build pipeline to use for
|
||||||
|
|
@ -206,10 +206,9 @@ type OS struct {
|
||||||
func NewOS(buildPipeline Build, platform platform.Platform, repos []rpmmd.RepoConfig) *OS {
|
func NewOS(buildPipeline Build, platform platform.Platform, repos []rpmmd.RepoConfig) *OS {
|
||||||
name := "os"
|
name := "os"
|
||||||
p := &OS{
|
p := &OS{
|
||||||
Base: NewBase(name, buildPipeline),
|
Base: NewBase(name, buildPipeline),
|
||||||
repos: filterRepos(repos, name),
|
repos: filterRepos(repos, name),
|
||||||
platform: platform,
|
platform: platform,
|
||||||
InstallWeakDeps: true,
|
|
||||||
}
|
}
|
||||||
buildPipeline.addDependent(p)
|
buildPipeline.addDependent(p)
|
||||||
return p
|
return p
|
||||||
|
|
@ -281,10 +280,17 @@ func (p *OS) getPackageSetChain(Distro) []rpmmd.PackageSet {
|
||||||
if p.Workload != nil {
|
if p.Workload != nil {
|
||||||
workloadPackages := p.Workload.GetPackages()
|
workloadPackages := p.Workload.GetPackages()
|
||||||
if len(workloadPackages) > 0 {
|
if len(workloadPackages) > 0 {
|
||||||
chain = append(chain, rpmmd.PackageSet{
|
ps := rpmmd.PackageSet{
|
||||||
Include: workloadPackages,
|
Include: workloadPackages,
|
||||||
Repositories: append(osRepos, p.Workload.GetRepos()...),
|
Repositories: append(osRepos, p.Workload.GetRepos()...),
|
||||||
})
|
}
|
||||||
|
|
||||||
|
workloadModules := p.Workload.GetEnabledModules()
|
||||||
|
if len(workloadModules) > 0 {
|
||||||
|
ps.EnabledModules = workloadModules
|
||||||
|
}
|
||||||
|
|
||||||
|
chain = append(chain, ps)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -387,6 +393,7 @@ func (p *OS) serializeStart(inputs Inputs) {
|
||||||
}
|
}
|
||||||
|
|
||||||
p.packageSpecs = inputs.Depsolved.Packages
|
p.packageSpecs = inputs.Depsolved.Packages
|
||||||
|
p.moduleSpecs = inputs.Depsolved.Modules
|
||||||
p.containerSpecs = inputs.Containers
|
p.containerSpecs = inputs.Containers
|
||||||
if len(inputs.Commits) > 0 {
|
if len(inputs.Commits) > 0 {
|
||||||
if len(inputs.Commits) > 1 {
|
if len(inputs.Commits) > 1 {
|
||||||
|
|
@ -742,6 +749,36 @@ func (p *OS) serialize() osbuild.Pipeline {
|
||||||
pipeline.AddStages(osbuild.GenFileNodesStages(p.Files)...)
|
pipeline.AddStages(osbuild.GenFileNodesStages(p.Files)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// write modularity related configuration files
|
||||||
|
if len(p.moduleSpecs) > 0 {
|
||||||
|
pipeline.AddStages(osbuild.GenDNFModuleConfigStages(p.moduleSpecs)...)
|
||||||
|
|
||||||
|
var failsafeFiles []*fsnode.File
|
||||||
|
|
||||||
|
// the failsafe file is a blob of YAML returned directly from the depsolver,
|
||||||
|
// we write them as 'normal files' without a special stage
|
||||||
|
for _, module := range p.moduleSpecs {
|
||||||
|
moduleFailsafeFile, err := fsnode.NewFile(module.FailsafeFile.Path, nil, nil, nil, []byte(module.FailsafeFile.Data))
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
panic("failed to create module failsafe file")
|
||||||
|
}
|
||||||
|
|
||||||
|
failsafeFiles = append(failsafeFiles, moduleFailsafeFile)
|
||||||
|
}
|
||||||
|
|
||||||
|
failsafeDir, err := fsnode.NewDirectory("/var/lib/dnf/modulefailsafe", nil, nil, nil, true)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
panic("failed to create module failsafe directory")
|
||||||
|
}
|
||||||
|
|
||||||
|
pipeline.AddStages(osbuild.GenDirectoryNodesStages([]*fsnode.Directory{failsafeDir})...)
|
||||||
|
pipeline.AddStages(osbuild.GenFileNodesStages(failsafeFiles)...)
|
||||||
|
|
||||||
|
p.Files = append(p.Files, failsafeFiles...)
|
||||||
|
}
|
||||||
|
|
||||||
enabledServices := []string{}
|
enabledServices := []string{}
|
||||||
disabledServices := []string{}
|
disabledServices := []string{}
|
||||||
maskedServices := []string{}
|
maskedServices := []string{}
|
||||||
|
|
@ -813,7 +850,7 @@ func (p *OS) serialize() osbuild.Pipeline {
|
||||||
pipeline.AddStage(osbuild.NewCAStageStage())
|
pipeline.AddStage(osbuild.NewCAStageStage())
|
||||||
}
|
}
|
||||||
|
|
||||||
if p.FirstBoot {
|
if p.MachineIdUninitialized {
|
||||||
pipeline.AddStage(osbuild.NewMachineIdStage(&osbuild.MachineIdStageOptions{
|
pipeline.AddStage(osbuild.NewMachineIdStage(&osbuild.MachineIdStageOptions{
|
||||||
FirstBoot: osbuild.MachineIdFirstBootYes,
|
FirstBoot: osbuild.MachineIdFirstBootYes,
|
||||||
}))
|
}))
|
||||||
|
|
|
||||||
15
vendor/github.com/osbuild/images/pkg/manifest/raw_bootc.go
generated
vendored
15
vendor/github.com/osbuild/images/pkg/manifest/raw_bootc.go
generated
vendored
|
|
@ -210,11 +210,22 @@ func (p *RawBootcImage) serialize() osbuild.Pipeline {
|
||||||
|
|
||||||
// First create custom directories, because some of the custom files may depend on them
|
// First create custom directories, because some of the custom files may depend on them
|
||||||
if len(p.Directories) > 0 {
|
if len(p.Directories) > 0 {
|
||||||
pipeline.AddStages(osbuild.GenDirectoryNodesStages(p.Directories)...)
|
|
||||||
|
stages := osbuild.GenDirectoryNodesStages(p.Directories)
|
||||||
|
for _, stage := range stages {
|
||||||
|
stage.Mounts = mounts
|
||||||
|
stage.Devices = devices
|
||||||
|
}
|
||||||
|
pipeline.AddStages(stages...)
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(p.Files) > 0 {
|
if len(p.Files) > 0 {
|
||||||
pipeline.AddStages(osbuild.GenFileNodesStages(p.Files)...)
|
stages := osbuild.GenFileNodesStages(p.Files)
|
||||||
|
for _, stage := range stages {
|
||||||
|
stage.Mounts = mounts
|
||||||
|
stage.Devices = devices
|
||||||
|
}
|
||||||
|
pipeline.AddStages(stages...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// XXX: maybe go back to adding this conditionally when we stop
|
// XXX: maybe go back to adding this conditionally when we stop
|
||||||
|
|
|
||||||
62
vendor/github.com/osbuild/images/pkg/osbuild/dnf_module_config_stage.go
generated
vendored
Normal file
62
vendor/github.com/osbuild/images/pkg/osbuild/dnf_module_config_stage.go
generated
vendored
Normal file
|
|
@ -0,0 +1,62 @@
|
||||||
|
package osbuild
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/osbuild/images/pkg/rpmmd"
|
||||||
|
)
|
||||||
|
|
||||||
|
type DNFModuleConfig struct {
|
||||||
|
Name string `json:"name,omitempty"`
|
||||||
|
Stream string `json:"stream,omitempty"`
|
||||||
|
State string `json:"state,omitempty"`
|
||||||
|
Profiles []string `json:"profiles"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type DNFModuleConfigStageOptions struct {
|
||||||
|
Config *DNFModuleConfig `json:"conf,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (DNFModuleConfigStageOptions) isStageOptions() {}
|
||||||
|
|
||||||
|
// NewDNFModuleConfigStageOptions creates a new DNFConfig Stage options object.
|
||||||
|
func NewDNFModuleConfigStageOptions(config *DNFModuleConfig) *DNFModuleConfigStageOptions {
|
||||||
|
return &DNFModuleConfigStageOptions{
|
||||||
|
Config: config,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o DNFModuleConfigStageOptions) validate() error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewDNFModuleConfigStage creates a new DNFModuleConfig Stage object.
|
||||||
|
func NewDNFModuleConfigStage(options *DNFModuleConfigStageOptions) *Stage {
|
||||||
|
if err := options.validate(); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return &Stage{
|
||||||
|
Type: "org.osbuild.dnf.module-config",
|
||||||
|
Options: options,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func GenDNFModuleConfigStages(modules []rpmmd.ModuleSpec) []*Stage {
|
||||||
|
stages := make([]*Stage, len(modules))
|
||||||
|
|
||||||
|
for _, module := range modules {
|
||||||
|
data := module.ModuleConfigFile.Data
|
||||||
|
|
||||||
|
stage := NewDNFModuleConfigStage(&DNFModuleConfigStageOptions{
|
||||||
|
Config: &DNFModuleConfig{
|
||||||
|
Name: data.Name,
|
||||||
|
Stream: data.Stream,
|
||||||
|
State: data.State,
|
||||||
|
Profiles: data.Profiles,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
stages = append(stages, stage)
|
||||||
|
}
|
||||||
|
|
||||||
|
return stages
|
||||||
|
}
|
||||||
6
vendor/github.com/osbuild/images/pkg/osbuild/machine_id_stage.go
generated
vendored
6
vendor/github.com/osbuild/images/pkg/osbuild/machine_id_stage.go
generated
vendored
|
|
@ -3,9 +3,9 @@ package osbuild
|
||||||
type MachineIdFirstBoot string
|
type MachineIdFirstBoot string
|
||||||
|
|
||||||
const (
|
const (
|
||||||
MachineIdFirstBootYes MachineIdFirstBoot = "yes"
|
MachineIdFirstBootYes MachineIdFirstBoot = "yes"
|
||||||
MachineIdFirstBootNo MachineIdFirstBoot = "no"
|
MachineIdFirstBootNo MachineIdFirstBoot = "no"
|
||||||
MachineIdFirstBootPreserver MachineIdFirstBoot = "preserve"
|
MachineIdFirstBootPreserve MachineIdFirstBoot = "preserve"
|
||||||
)
|
)
|
||||||
|
|
||||||
type MachineIdStageOptions struct {
|
type MachineIdStageOptions struct {
|
||||||
|
|
|
||||||
31
vendor/github.com/osbuild/images/pkg/osbuild/osbuild-exec.go
generated
vendored
31
vendor/github.com/osbuild/images/pkg/osbuild/osbuild-exec.go
generated
vendored
|
|
@ -9,7 +9,10 @@ import (
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"github.com/osbuild/images/data/dependencies"
|
||||||
"github.com/osbuild/images/pkg/datasizes"
|
"github.com/osbuild/images/pkg/datasizes"
|
||||||
|
|
||||||
|
"github.com/hashicorp/go-version"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Run an instance of osbuild, returning a parsed osbuild.Result.
|
// Run an instance of osbuild, returning a parsed osbuild.Result.
|
||||||
|
|
@ -18,6 +21,10 @@ import (
|
||||||
// does not return an error in this case. Instead, the failure is communicated
|
// does not return an error in this case. Instead, the failure is communicated
|
||||||
// with its corresponding logs through osbuild.Result.
|
// with its corresponding logs through osbuild.Result.
|
||||||
func RunOSBuild(manifest []byte, store, outputDirectory string, exports, checkpoints, extraEnv []string, result bool, errorWriter io.Writer) (*Result, error) {
|
func RunOSBuild(manifest []byte, store, outputDirectory string, exports, checkpoints, extraEnv []string, result bool, errorWriter io.Writer) (*Result, error) {
|
||||||
|
if err := CheckMinimumOSBuildVersion(); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
var stdoutBuffer bytes.Buffer
|
var stdoutBuffer bytes.Buffer
|
||||||
var res Result
|
var res Result
|
||||||
|
|
||||||
|
|
@ -96,6 +103,30 @@ func RunOSBuild(manifest []byte, store, outputDirectory string, exports, checkpo
|
||||||
return &res, nil
|
return &res, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func CheckMinimumOSBuildVersion() error {
|
||||||
|
osbuildVersion, err := OSBuildVersion()
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("error getting osbuild version: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
minVersion, err := version.NewVersion(dependencies.MinimumOSBuildVersion())
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("error parsing minimum osbuild version: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
currentVersion, err := version.NewVersion(osbuildVersion)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("error parsing current osbuild version: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if currentVersion.LessThan(minVersion) {
|
||||||
|
return fmt.Errorf("osbuild version %q is lower than the minimum required version %q",
|
||||||
|
osbuildVersion, dependencies.MinimumOSBuildVersion())
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// OSBuildVersion returns the version of osbuild.
|
// OSBuildVersion returns the version of osbuild.
|
||||||
func OSBuildVersion() (string, error) {
|
func OSBuildVersion() (string, error) {
|
||||||
var stdoutBuffer bytes.Buffer
|
var stdoutBuffer bytes.Buffer
|
||||||
|
|
|
||||||
24
vendor/github.com/osbuild/images/pkg/rpmmd/repository.go
generated
vendored
24
vendor/github.com/osbuild/images/pkg/rpmmd/repository.go
generated
vendored
|
|
@ -141,6 +141,7 @@ func (pkg Package) ToPackageInfo() PackageInfo {
|
||||||
type PackageSet struct {
|
type PackageSet struct {
|
||||||
Include []string
|
Include []string
|
||||||
Exclude []string
|
Exclude []string
|
||||||
|
EnabledModules []string
|
||||||
Repositories []RepoConfig
|
Repositories []RepoConfig
|
||||||
InstallWeakDeps bool
|
InstallWeakDeps bool
|
||||||
}
|
}
|
||||||
|
|
@ -150,6 +151,7 @@ type PackageSet struct {
|
||||||
func (ps PackageSet) Append(other PackageSet) PackageSet {
|
func (ps PackageSet) Append(other PackageSet) PackageSet {
|
||||||
ps.Include = append(ps.Include, other.Include...)
|
ps.Include = append(ps.Include, other.Include...)
|
||||||
ps.Exclude = append(ps.Exclude, other.Exclude...)
|
ps.Exclude = append(ps.Exclude, other.Exclude...)
|
||||||
|
ps.EnabledModules = append(ps.EnabledModules, other.EnabledModules...)
|
||||||
return ps
|
return ps
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -199,6 +201,28 @@ type PackageInfo struct {
|
||||||
Dependencies []PackageSpec `json:"dependencies,omitempty"`
|
Dependencies []PackageSpec `json:"dependencies,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type ModuleSpec struct {
|
||||||
|
ModuleConfigFile ModuleConfigFile `json:"module-file"`
|
||||||
|
FailsafeFile ModuleFailsafeFile `json:"failsafe-file"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type ModuleConfigFile struct {
|
||||||
|
Path string `json:"path"`
|
||||||
|
Data ModuleConfigData `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type ModuleConfigData struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
Stream string `json:"stream"`
|
||||||
|
Profiles []string `json:"profiles"`
|
||||||
|
State string `json:"state"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type ModuleFailsafeFile struct {
|
||||||
|
Path string `json:"path"`
|
||||||
|
Data string `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
// GetEVRA returns the package's Epoch:Version-Release.Arch string
|
// GetEVRA returns the package's Epoch:Version-Release.Arch string
|
||||||
func (ps *PackageSpec) GetEVRA() string {
|
func (ps *PackageSpec) GetEVRA() string {
|
||||||
if ps.Epoch == 0 {
|
if ps.Epoch == 0 {
|
||||||
|
|
|
||||||
4
vendor/modules.txt
vendored
4
vendor/modules.txt
vendored
|
|
@ -1037,8 +1037,9 @@ github.com/oracle/oci-go-sdk/v54/identity
|
||||||
github.com/oracle/oci-go-sdk/v54/objectstorage
|
github.com/oracle/oci-go-sdk/v54/objectstorage
|
||||||
github.com/oracle/oci-go-sdk/v54/objectstorage/transfer
|
github.com/oracle/oci-go-sdk/v54/objectstorage/transfer
|
||||||
github.com/oracle/oci-go-sdk/v54/workrequests
|
github.com/oracle/oci-go-sdk/v54/workrequests
|
||||||
# github.com/osbuild/images v0.120.0
|
# github.com/osbuild/images v0.123.0
|
||||||
## explicit; go 1.22.8
|
## explicit; go 1.22.8
|
||||||
|
github.com/osbuild/images/data/dependencies
|
||||||
github.com/osbuild/images/data/repositories
|
github.com/osbuild/images/data/repositories
|
||||||
github.com/osbuild/images/internal/common
|
github.com/osbuild/images/internal/common
|
||||||
github.com/osbuild/images/internal/environment
|
github.com/osbuild/images/internal/environment
|
||||||
|
|
@ -1073,6 +1074,7 @@ github.com/osbuild/images/pkg/distro/test_distro
|
||||||
github.com/osbuild/images/pkg/distrofactory
|
github.com/osbuild/images/pkg/distrofactory
|
||||||
github.com/osbuild/images/pkg/distroidparser
|
github.com/osbuild/images/pkg/distroidparser
|
||||||
github.com/osbuild/images/pkg/dnfjson
|
github.com/osbuild/images/pkg/dnfjson
|
||||||
|
github.com/osbuild/images/pkg/experimentalflags
|
||||||
github.com/osbuild/images/pkg/image
|
github.com/osbuild/images/pkg/image
|
||||||
github.com/osbuild/images/pkg/manifest
|
github.com/osbuild/images/pkg/manifest
|
||||||
github.com/osbuild/images/pkg/osbuild
|
github.com/osbuild/images/pkg/osbuild
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue