From ac0fdcd8b27c33c7c3fcc6a85770b5a82db07c28 Mon Sep 17 00:00:00 2001 From: Neeraj Mishra Date: Tue, 19 May 2026 21:54:21 +0530 Subject: [PATCH] Enable platform external for s390x architecture - Add s390x to supported architectures for external platform - Update agent image generation to support s390x external platform - Modify kernel arguments handling for s390x - Update install config validation for s390x external platform --- pkg/asset/agent/common.go | 4 +++- pkg/asset/agent/image/agentimage.go | 4 ++-- pkg/asset/agent/image/kargs.go | 9 +++++++-- pkg/asset/agent/installconfig.go | 13 +++++++++++-- 4 files changed, 23 insertions(+), 7 deletions(-) diff --git a/pkg/asset/agent/common.go b/pkg/asset/agent/common.go index 0a8f4a6134a..b0d40f578fb 100644 --- a/pkg/asset/agent/common.go +++ b/pkg/asset/agent/common.go @@ -34,8 +34,10 @@ type nmStateConfig struct { } const ( - // ExternalPlatformNameOci is the name of the external platform for OCP. + // ExternalPlatformNameOci is the name of the external platform for Oracle Cloud Infrastructure. ExternalPlatformNameOci = "oci" + // ExternalPlatformNameIBMZ is the name of the external platform for IBM Z (s390x). + ExternalPlatformNameIBMZ = "ibmz" ) // SupportedInstallerPlatforms lists the supported platforms for agent installer. diff --git a/pkg/asset/agent/image/agentimage.go b/pkg/asset/agent/image/agentimage.go index 71bcbf97ba9..5226d596000 100644 --- a/pkg/asset/agent/image/agentimage.go +++ b/pkg/asset/agent/image/agentimage.go @@ -270,9 +270,9 @@ func (a *AgentImage) PersistToFile(directory string) error { if err != nil { return err } - // For external platform OCI, add CCM manifests in the openshift directory. + // For external platforms (OCI, IBM Z, etc.), add CCM manifests in the openshift directory. if a.platform == hiveext.ExternalPlatformType { - logrus.Infof("When using %s oci platform, always make sure CCM manifests were added in the %s directory.", hiveext.ExternalPlatformType, manifests.OpenshiftManifestDir()) + logrus.Infof("When using %s platform, always make sure CCM manifests were added in the %s directory.", hiveext.ExternalPlatformType, manifests.OpenshiftManifestDir()) } return nil diff --git a/pkg/asset/agent/image/kargs.go b/pkg/asset/agent/image/kargs.go index fb82c6596f9..f566d546351 100644 --- a/pkg/asset/agent/image/kargs.go +++ b/pkg/asset/agent/image/kargs.go @@ -39,10 +39,15 @@ func (a *Kargs) Generate(_ context.Context, dependencies asset.Parents) error { switch agentWorkflow.Workflow { case workflow.AgentWorkflowTypeInstall: a.fips = agentClusterInstall.FIPSEnabled() - // Add kernel args for external oci platform - if agentClusterInstall.GetExternalPlatformName() == agent.ExternalPlatformNameOci { + // Add kernel args for external platforms + externalPlatformName := agentClusterInstall.GetExternalPlatformName() + switch externalPlatformName { + case agent.ExternalPlatformNameOci: logrus.Debugf("Added kernel args to enable serial console for %s %s platform", hiveext.ExternalPlatformType, agent.ExternalPlatformNameOci) a.consoleArgs = " console=ttyS0" + case agent.ExternalPlatformNameIBMZ: + logrus.Debugf("Added kernel args to enable serial console for %s %s platform", hiveext.ExternalPlatformType, agent.ExternalPlatformNameIBMZ) + a.consoleArgs = " console=ttysclp0" } case workflow.AgentWorkflowTypeAddNodes: diff --git a/pkg/asset/agent/installconfig.go b/pkg/asset/agent/installconfig.go index 893dc47d78c..cbe1b385898 100644 --- a/pkg/asset/agent/installconfig.go +++ b/pkg/asset/agent/installconfig.go @@ -125,8 +125,8 @@ func ValidateSupportedPlatforms(platform types.Platform, controlPlaneArch string if platform.Name() != none.Name && controlPlaneArch == types.ArchitecturePPC64LE { allErrs = append(allErrs, field.Invalid(fieldPath, platform.Name(), fmt.Sprintf("CPU architecture \"%s\" only supports platform \"%s\".", types.ArchitecturePPC64LE, none.Name))) } - if platform.Name() != none.Name && controlPlaneArch == types.ArchitectureS390X { - allErrs = append(allErrs, field.Invalid(fieldPath, platform.Name(), fmt.Sprintf("CPU architecture \"%s\" only supports platform \"%s\".", types.ArchitectureS390X, none.Name))) + if platform.Name() != none.Name && platform.Name() != external.Name && controlPlaneArch == types.ArchitectureS390X { + allErrs = append(allErrs, field.Invalid(fieldPath, platform.Name(), fmt.Sprintf("CPU architecture \"%s\" only supports platform \"%s\" or \"%s\".", types.ArchitectureS390X, none.Name, external.Name))) } return allErrs } @@ -135,6 +135,7 @@ func (a *OptionalInstallConfig) validatePlatformsByName(installConfig *types.Ins var allErrs field.ErrorList if installConfig.Platform.Name() == external.Name { + // Validate OCI platform requirements if installConfig.Platform.External.PlatformName == ExternalPlatformNameOci && installConfig.Platform.External.CloudControllerManager != external.CloudControllerManagerTypeExternal { fieldPath := field.NewPath("platform", "external", "cloudControllerManager") @@ -142,6 +143,14 @@ func (a *OptionalInstallConfig) validatePlatformsByName(installConfig *types.Ins fmt.Sprintf("When using external %s platform, %s must be set to %s", ExternalPlatformNameOci, fieldPath, external.CloudControllerManagerTypeExternal))) } + // Validate IBM Z platform requirements + if installConfig.Platform.External.PlatformName == ExternalPlatformNameIBMZ && + installConfig.Platform.External.CloudControllerManager != external.CloudControllerManagerTypeExternal { + fieldPath := field.NewPath("platform", "external", "cloudControllerManager") + allErrs = append(allErrs, field.Invalid(fieldPath, installConfig.Platform.External.CloudControllerManager, + fmt.Sprintf("When using external %s platform, %s must be set to %s", + ExternalPlatformNameIBMZ, fieldPath, external.CloudControllerManagerTypeExternal))) + } } if installConfig.Platform.Name() == vsphere.Name {