Skip to content

Commit a01d548

Browse files
Merge pull request #5556 from pablintino/mco-2028
MCO-2028: Add target OS version detection
2 parents 9e40c44 + 624ba8c commit a01d548

2 files changed

Lines changed: 53 additions & 5 deletions

File tree

pkg/daemon/rpm-ostree.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,38 @@ func (r *RpmOstreeClient) RebaseLayeredFromContainerStorage(podmanImageInfo *Pod
229229
return runRpmOstree("rebase", "--experimental", "ostree-unverified-image:containers-storage:"+podmanImageInfo.RepoDigest)
230230
}
231231

232+
// DeploymentVersion wraps rpm-ostree deployment information to provide
233+
// version checking methods similar to the osrelease package.
234+
type DeploymentVersion struct {
235+
// osName is the osname field from the deployment
236+
osName string
237+
// version is the version field from the deployment
238+
version string
239+
}
240+
241+
// NewTargetOSVersionFromDeployment creates a DeploymentVersion from the given deployment
242+
func NewTargetOSVersionFromDeployment(deployment *rpmostreeclient.Deployment) *DeploymentVersion {
243+
return &DeploymentVersion{
244+
osName: deployment.OSName,
245+
version: deployment.Version,
246+
}
247+
}
248+
249+
// BaseVersionMajor returns the first number in a `.` separated version.
250+
func (t *DeploymentVersion) BaseVersionMajor() string {
251+
return strings.Split(t.version, ".")[0]
252+
}
253+
254+
// IsEL is true if the OS is an Enterprise Linux variant of CoreOS
255+
func (t *DeploymentVersion) IsEL() bool {
256+
return t.osName == "rhcos" || t.osName == "scos"
257+
}
258+
259+
// IsEL10 is true if the target OS is RHCOS 10 or SCOS 10
260+
func (t *DeploymentVersion) IsEL10() bool {
261+
return t.IsEL() && (strings.HasPrefix(t.version, "10.") || t.version == "10")
262+
}
263+
232264
// patchPoliciesForContainerStorage temporarily overrides the container image policy visible
233265
// to rpm-ostreed to ensure pulls from the "containers-storage" transport are allowed for the
234266
// given image.

pkg/daemon/update.go

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1734,7 +1734,10 @@ func (dn *CoreOSDaemon) switchKernel(oldConfig, newConfig *mcfgv1.MachineConfig)
17341734
logSystem("Re-applying kernel type %s", newKtype)
17351735
}
17361736

1737-
kernelPackages := dn.getKernelPackagesForRelease()
1737+
kernelPackages, err := dn.getKernelPackagesForTargetRelease()
1738+
if err != nil {
1739+
return fmt.Errorf("failed to get kernel packages for target release: %w", err)
1740+
}
17381741
if newKtype == ctrlcommon.KernelTypeRealtime {
17391742
// Switch to RT kernel
17401743
args := []string{"override", "remove"}
@@ -1757,10 +1760,22 @@ func (dn *CoreOSDaemon) switchKernel(oldConfig, newConfig *mcfgv1.MachineConfig)
17571760
return fmt.Errorf("unhandled kernel type %s", newKtype)
17581761
}
17591762

1760-
// getKernelPackagesForRelease returns the list of kernel packaged for the running OS release.
1761-
func (dn *CoreOSDaemon) getKernelPackagesForRelease() releaseKernelPackages {
1763+
// getKernelPackagesForTargetRelease returns the list of kernel packaged for the running OS release.
1764+
func (dn *CoreOSDaemon) getKernelPackagesForTargetRelease() (releaseKernelPackages, error) {
17621765
// TODO: Drop this code and use https://github.com/coreos/rpm-ostree/issues/2542 instead
17631766

1767+
// Fetch the OS deployments to infer the target OS version from them
1768+
booted, staged, err := dn.NodeUpdaterClient.GetBootedAndStagedDeployment()
1769+
if err != nil {
1770+
return releaseKernelPackages{}, fmt.Errorf("error fetching OS deployments : %v", err)
1771+
}
1772+
1773+
// If there's a staged deployment the packages will be installed in it instead of in the current booted deployment
1774+
targetDeployment := booted
1775+
if staged != nil {
1776+
targetDeployment = staged
1777+
}
1778+
17641779
kernelPackages := releaseKernelPackages{
17651780
defaultKernel: []string{"kernel", "kernel-core", "kernel-modules", "kernel-modules-core", "kernel-modules-extra"},
17661781
hugePagesKernel: []string{"kernel-64k-core", "kernel-64k-modules", "kernel-64k-modules-core", "kernel-64k-modules-extra"},
@@ -1771,10 +1786,11 @@ func (dn *CoreOSDaemon) getKernelPackagesForRelease() releaseKernelPackages {
17711786

17721787
// RHEL10 early bugfix of OCPBUGS-62925
17731788
// RHEL10 doesn't ship with kernel-rt-kvm
1774-
if !dn.os.IsEL10() {
1789+
targetVersion := NewTargetOSVersionFromDeployment(targetDeployment)
1790+
if !targetVersion.IsEL10() {
17751791
kernelPackages.realtimeKernel = append(kernelPackages.realtimeKernel, "kernel-rt-kvm")
17761792
}
1777-
return kernelPackages
1793+
return kernelPackages, nil
17781794
}
17791795

17801796
// updateFiles writes files specified by the nodeconfig to disk. it also writes

0 commit comments

Comments
 (0)