diff --git a/go.mod b/go.mod index 80f2d253c..cdd95d4a2 100644 --- a/go.mod +++ b/go.mod @@ -45,7 +45,7 @@ require ( github.com/openshift-online/ocm-sdk-go v0.1.438 github.com/oracle/oci-go-sdk/v54 v54.0.0 github.com/osbuild/blueprint v1.6.0 - github.com/osbuild/images v0.134.1-0.20250416092909-a1ca7f34c770 + github.com/osbuild/images v0.137.0 github.com/osbuild/osbuild-composer/pkg/splunk_logger v0.0.0-20240814102216-0239db53236d github.com/osbuild/pulp-client v0.1.0 github.com/prometheus/client_golang v1.20.5 diff --git a/go.sum b/go.sum index 2e304bf55..39e4a496c 100644 --- a/go.sum +++ b/go.sum @@ -577,8 +577,8 @@ github.com/oracle/oci-go-sdk/v54 v54.0.0 h1:CDLjeSejv2aDpElAJrhKpi6zvT/zhZCZuXch github.com/oracle/oci-go-sdk/v54 v54.0.0/go.mod h1:+t+yvcFGVp+3ZnztnyxqXfQDsMlq8U25faBLa+mqCMc= github.com/osbuild/blueprint v1.6.0 h1:HUV1w/dMxpgqOgVtHhfTZE3zRmWQkuW/qTfx9smKImI= github.com/osbuild/blueprint v1.6.0/go.mod h1:0d3dlY8aSJ6jM6NHwBmJFF1VIySsp/GsDpcJQ0yrOqM= -github.com/osbuild/images v0.134.1-0.20250416092909-a1ca7f34c770 h1:w9h0KIV2p9QLCl6kMPlzJfb1kBV4QS672QSOKWOh50w= -github.com/osbuild/images v0.134.1-0.20250416092909-a1ca7f34c770/go.mod h1:Ag87vmyxooiPQBJEDILbypG8/SRIear75YA78NwLix0= +github.com/osbuild/images v0.137.0 h1:ypC/0BIkyoPbX8tSfobwoVcc4ExlEZVowgu7HbPCNfk= +github.com/osbuild/images v0.137.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/go.mod h1:zR1iu/hOuf+OQNJlk70tju9IqzzM4ycq0ectkFBm94U= github.com/osbuild/pulp-client v0.1.0 h1:L0C4ezBJGTamN3BKdv+rKLuq/WxXJbsFwz/Hj7aEmJ8= diff --git a/vendor/github.com/osbuild/images/pkg/distro/defs/rhel-10/distro.yaml b/vendor/github.com/osbuild/images/pkg/distro/defs/rhel-10/distro.yaml index 76e579a22..cecb74181 100644 --- a/vendor/github.com/osbuild/images/pkg/distro/defs/rhel-10/distro.yaml +++ b/vendor/github.com/osbuild/images/pkg/distro/defs/rhel-10/distro.yaml @@ -395,6 +395,7 @@ image_types: - "patch" - "rng-tools" - "selinux-policy-targeted" + - "system-reinstall-bootc" - "uuid" - "WALinuxAgent" - "yum-utils" @@ -503,6 +504,7 @@ image_types: - "redhat-release" - "redhat-release-eula" - "rsync" + - "system-reinstall-bootc" - "tuned" - "tar" exclude: diff --git a/vendor/github.com/osbuild/images/pkg/distro/defs/rhel-9/distro.yaml b/vendor/github.com/osbuild/images/pkg/distro/defs/rhel-9/distro.yaml index 5b64b66a4..dd6b84018 100644 --- a/vendor/github.com/osbuild/images/pkg/distro/defs/rhel-9/distro.yaml +++ b/vendor/github.com/osbuild/images/pkg/distro/defs/rhel-9/distro.yaml @@ -83,6 +83,10 @@ rhel: include: - "insights-client" + version_greater_or_equal: + "9.6": + include: + - "system-reinstall-bootc" sap_pkgset: &sap_pkgset include: @@ -579,6 +583,8 @@ image_types: - "insights-client" version_greater_or_equal: "9.6": + include: + - "system-reinstall-bootc" exclude: - "microcode_ctl" diff --git a/vendor/github.com/osbuild/images/pkg/distro/fedora/images.go b/vendor/github.com/osbuild/images/pkg/distro/fedora/images.go index 90be6815e..1bf9e16fc 100644 --- a/vendor/github.com/osbuild/images/pkg/distro/fedora/images.go +++ b/vendor/github.com/osbuild/images/pkg/distro/fedora/images.go @@ -232,6 +232,7 @@ func osCustomizations( osc.AuthConfig = imageConfig.Authconfig osc.PwQuality = imageConfig.PwQuality osc.WSLConfig = imageConfig.WSLConfStageOptions() + osc.NetworkManager = imageConfig.NetworkManager osc.Files = append(osc.Files, imageConfig.Files...) osc.Directories = append(osc.Directories, imageConfig.Directories...) diff --git a/vendor/github.com/osbuild/images/pkg/distro/image_config.go b/vendor/github.com/osbuild/images/pkg/distro/image_config.go index c4c05b982..f871e0631 100644 --- a/vendor/github.com/osbuild/images/pkg/distro/image_config.go +++ b/vendor/github.com/osbuild/images/pkg/distro/image_config.go @@ -69,6 +69,7 @@ type ImageConfig struct { Firewall *osbuild.FirewallStageOptions UdevRules *osbuild.UdevRulesStageOptions GCPGuestAgentConfig *osbuild.GcpGuestAgentConfigOptions + NetworkManager *osbuild.NMConfStageOptions WSLConfig *WSLConfig diff --git a/vendor/github.com/osbuild/images/pkg/distro/rhel/images.go b/vendor/github.com/osbuild/images/pkg/distro/rhel/images.go index 5508322cf..9e9f25142 100644 --- a/vendor/github.com/osbuild/images/pkg/distro/rhel/images.go +++ b/vendor/github.com/osbuild/images/pkg/distro/rhel/images.go @@ -271,6 +271,7 @@ func osCustomizations( osc.UdevRules = imageConfig.UdevRules osc.GCPGuestAgentConfig = imageConfig.GCPGuestAgentConfig osc.WSLConfig = imageConfig.WSLConfStageOptions() + osc.NetworkManager = imageConfig.NetworkManager osc.Files = append(osc.Files, imageConfig.Files...) osc.Directories = append(osc.Directories, imageConfig.Directories...) diff --git a/vendor/github.com/osbuild/images/pkg/distro/rhel/rhel9/azure.go b/vendor/github.com/osbuild/images/pkg/distro/rhel/rhel9/azure.go index d5a2cc8a1..08e5bfede 100644 --- a/vendor/github.com/osbuild/images/pkg/distro/rhel/rhel9/azure.go +++ b/vendor/github.com/osbuild/images/pkg/distro/rhel/rhel9/azure.go @@ -523,6 +523,18 @@ func defaultAzureImageConfig(rd *rhel.Distribution) *distro.ImageConfig { } ic.Files = append(ic.Files, datalossWarningScript) ic.SystemdUnit = append(ic.SystemdUnit, datalossSystemdUnit) + ic.EnabledServices = append(ic.EnabledServices, datalossSystemdUnit.Filename) + ic.NetworkManager = &osbuild.NMConfStageOptions{ + Path: "/etc/NetworkManager/conf.d/99-azure-unmanaged-devices.conf", + Settings: osbuild.NMConfStageSettings{ + Keyfile: &osbuild.NMConfSettingsKeyfile{ + UnmanagedDevices: []string{ + "driver:mlx4_core", + "driver:mlx5_core", + }, + }, + }, + } } } diff --git a/vendor/github.com/osbuild/images/pkg/manifest/os.go b/vendor/github.com/osbuild/images/pkg/manifest/os.go index 24a0ef20f..ad2c4522e 100644 --- a/vendor/github.com/osbuild/images/pkg/manifest/os.go +++ b/vendor/github.com/osbuild/images/pkg/manifest/os.go @@ -127,6 +127,7 @@ type OSCustomizations struct { UdevRules *osbuild.UdevRulesStageOptions WSLConfig *osbuild.WSLConfStageOptions InsightsClientConfig *osbuild.InsightsClientConfigStageOptions + NetworkManager *osbuild.NMConfStageOptions Presets []osbuild.Preset ContainersStorage *string @@ -650,6 +651,10 @@ func (p *OS) serialize() osbuild.Pipeline { pipeline.AddStage(osbuild.NewInsightsClientConfigStage(p.OSCustomizations.InsightsClientConfig)) } + if p.OSCustomizations.NetworkManager != nil { + pipeline.AddStage(osbuild.NewNMConfStage(p.OSCustomizations.NetworkManager)) + } + if p.OSCustomizations.AuthConfig != nil { pipeline.AddStage(osbuild.NewAuthconfigStage(p.OSCustomizations.AuthConfig)) } diff --git a/vendor/github.com/osbuild/images/pkg/osbuild/nm_conf_stage.go b/vendor/github.com/osbuild/images/pkg/osbuild/nm_conf_stage.go new file mode 100644 index 000000000..bbfb52d62 --- /dev/null +++ b/vendor/github.com/osbuild/images/pkg/osbuild/nm_conf_stage.go @@ -0,0 +1,117 @@ +package osbuild + +import "fmt" + +const nmConfStageType = "org.osbuild.nm.conf" + +type NMConfStageOptions struct { + Path string `json:"path"` + Settings NMConfStageSettings `json:"settings"` +} + +func (*NMConfStageOptions) isStageOptions() {} + +type NMConfStageSettings struct { + Main *NMConfSettingsMain `json:"main,omitempty"` + Device []NMConfSettingsDevice `json:"device,omitempty"` + GlobalDNSDomain []NMConfSettingsGlobalDNSDomain `json:"global-dns-domain,omitempty"` + Keyfile *NMConfSettingsKeyfile `json:"keyfile,omitempty"` +} + +type NMConfSettingsMain struct { + NoAutoDefault []string `json:"no-auto-default,omitempty"` + Plugins []string `json:"plugins,omitempty"` +} + +type NMConfSettingsDevice struct { + Name string `json:"name,omitempty"` + Config NMConfDeviceConfig `json:"config"` +} + +type NMConfSettingsGlobalDNSDomain struct { + Name string `json:"name"` + Config NMConfSettingsGlobalDNSDomainConfig `json:"config"` +} + +type NMConfSettingsGlobalDNSDomainConfig struct { + Servers []string `json:"servers"` +} + +type NMConfSettingsKeyfile struct { + UnmanagedDevices []string `json:"unmanaged-devices,omitempty"` +} + +type NMConfDeviceConfig struct { + Managed bool `json:"managed"` + WifiScanRandMacAddress bool `json:"wifi.scan-rand-mac-address"` +} + +func (o NMConfStageOptions) validate() error { + if o.Path == "" { + return fmt.Errorf("%s: path is a required property", nmConfStageType) + } + + if err := validatePath(o.Path); err != nil { + return fmt.Errorf("%s: %s", nmConfStageType, err) + } + + settings := o.Settings + // at least one of the settings must be defined + if settings.Main == nil && + settings.Device == nil && + settings.GlobalDNSDomain == nil && + settings.Keyfile == nil { + return fmt.Errorf("%s: at least one setting must be set", nmConfStageType) + } + + if main := settings.Main; main != nil { + if err := validateArrayHasItems(main.NoAutoDefault); err != nil { + return fmt.Errorf("%s: main.no-auto-default %s", nmConfStageType, err) + } + if err := validateArrayHasItems(main.Plugins); err != nil { + return fmt.Errorf("%s: main.plugins %s", nmConfStageType, err) + } + } + + if err := validateArrayHasItems(settings.Device); err != nil { + return fmt.Errorf("%s: device %s", nmConfStageType, err) + } + + if err := validateArrayHasItems(settings.GlobalDNSDomain); err != nil { + return fmt.Errorf("%s: global-dns-domain %s", nmConfStageType, err) + } + + for _, gdd := range settings.GlobalDNSDomain { + if gdd.Name == "" { + return fmt.Errorf("%s: global-dns-domain name is a required property", nmConfStageType) + } + + if err := validateArrayHasItems(gdd.Config.Servers); err != nil { + return fmt.Errorf("%s: global-dns-domain.config.servers %s", nmConfStageType, err) + } + } + + if keyfile := settings.Keyfile; keyfile != nil { + if err := validateArrayHasItems(keyfile.UnmanagedDevices); err != nil { + return fmt.Errorf("%s: keyfile.unmanaged-devices %s", nmConfStageType, err) + } + } + + return nil +} + +// validateArrayHasItems returns an error if an array is non-nil but also +// contains no items. +func validateArrayHasItems[T any](arr []T) error { + if arr != nil && len(arr) == 0 { + return fmt.Errorf("requires at least one element when defined") + } + return nil +} + +func NewNMConfStage(options *NMConfStageOptions) *Stage { + return &Stage{ + Type: nmConfStageType, + Options: options, + } +} diff --git a/vendor/modules.txt b/vendor/modules.txt index a1e279c64..67f12d704 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -1049,7 +1049,7 @@ github.com/oracle/oci-go-sdk/v54/workrequests ## explicit; go 1.22.8 github.com/osbuild/blueprint/internal/common github.com/osbuild/blueprint/pkg/blueprint -# github.com/osbuild/images v0.134.1-0.20250416092909-a1ca7f34c770 +# github.com/osbuild/images v0.137.0 ## explicit; go 1.22.8 github.com/osbuild/images/data/dependencies github.com/osbuild/images/data/repositories