@@ -12,6 +12,7 @@ import (
1212 "github.com/openshift/assisted-service/models"
1313 "github.com/openshift/installer/pkg/asset"
1414 "github.com/openshift/installer/pkg/asset/installconfig"
15+ "github.com/openshift/installer/pkg/asset/releaseimage"
1516 "github.com/openshift/installer/pkg/types"
1617 "github.com/openshift/installer/pkg/types/baremetal"
1718 baremetaldefaults "github.com/openshift/installer/pkg/types/baremetal/defaults"
@@ -79,6 +80,9 @@ func (a *OptionalInstallConfig) validateInstallConfig(installConfig *types.Insta
7980 if err := a .validateSupportedArchs (installConfig ); err != nil {
8081 allErrs = append (allErrs , err ... )
8182 }
83+ if err := a .validateReleaseArch (installConfig ); err != nil {
84+ allErrs = append (allErrs , err ... )
85+ }
8286
8387 if installConfig .FeatureSet != configv1 .Default {
8488 allErrs = append (allErrs , field .NotSupported (field .NewPath ("FeatureSet" ), installConfig .FeatureSet , []string {string (configv1 .Default )}))
@@ -129,6 +133,34 @@ func (a *OptionalInstallConfig) validateSupportedPlatforms(installConfig *types.
129133 return allErrs
130134}
131135
136+ func (a * OptionalInstallConfig ) validateReleaseArch (installConfig * types.InstallConfig ) field.ErrorList {
137+ var allErrs field.ErrorList
138+
139+ fieldPath := field .NewPath ("ControlPlane" , "Architecture" )
140+ releaseImage := & releaseimage.Image {}
141+ asseterr := releaseImage .Generate (asset.Parents {})
142+ if asseterr != nil {
143+ allErrs = append (allErrs , field .InternalError (fieldPath , asseterr ))
144+ }
145+ releaseArch , err := DetermineReleaseImageArch (installConfig .PullSecret , releaseImage .PullSpec )
146+ if err != nil {
147+ logrus .Warnf ("Unable to validate the release image architecture, skipping validation" )
148+ } else {
149+ // Validate that the release image supports the install-config architectures.
150+ switch releaseArch {
151+ // Check the release image to see if it is multi.
152+ case "multi" :
153+ logrus .Debugf ("multi architecture release image %s found, all archs supported" , releaseImage .PullSpec )
154+ // If the release image isn't multi, then its single arch, and it must match the cpu architecture.
155+ case string (installConfig .ControlPlane .Architecture ):
156+ logrus .Debugf ("Supported architecture %s found for the release image: %s" , installConfig .ControlPlane .Architecture , releaseImage .PullSpec )
157+ default :
158+ allErrs = append (allErrs , field .Forbidden (fieldPath , fmt .Sprintf ("unsupported release image architecture. ControlPlane Arch: %s doesn't match Release Image Arch: %s" , installConfig .ControlPlane .Architecture , releaseArch )))
159+ }
160+ }
161+ return allErrs
162+ }
163+
132164func (a * OptionalInstallConfig ) validateSupportedArchs (installConfig * types.InstallConfig ) field.ErrorList {
133165 var allErrs field.ErrorList
134166
0 commit comments