diff --git a/pkg/admission/validator/shoot.go b/pkg/admission/validator/shoot.go index def9f07d9..4610314b1 100644 --- a/pkg/admission/validator/shoot.go +++ b/pkg/admission/validator/shoot.go @@ -73,9 +73,15 @@ func (s *shoot) validateShoot(ctx context.Context, shoot *core.Shoot) error { // InfrastructureConfig infraConfigFldPath := fldPath.Child("infrastructureConfig") + // ControlPlaneConfig + controlPlaneConfigFldPath := fldPath.Child("controlPlaneConfig") + if shoot.Spec.Provider.InfrastructureConfig == nil { return field.Required(infraConfigFldPath, "InfrastructureConfig must be set for metal shoots") } + if shoot.Spec.Provider.ControlPlaneConfig == nil { + return field.Required(controlPlaneConfigFldPath, "ControlPlaneConfig must be set for metal shoots") + } infraConfig, err := decodeInfrastructureConfig(s.decoder, shoot.Spec.Provider.InfrastructureConfig, infraConfigFldPath) if err != nil { @@ -100,8 +106,6 @@ func (s *shoot) validateShoot(ctx context.Context, shoot *core.Shoot) error { return errList.ToAggregate() } - controlPlaneConfigFldPath := fldPath.Child("controlPlaneConfig") - controlPlaneConfig, err := decodeControlPlaneConfig(s.decoder, shoot.Spec.Provider.ControlPlaneConfig, fldPath.Child("controlPlaneConfig")) if err != nil { return err diff --git a/pkg/apis/metal/validation/infrastructure.go b/pkg/apis/metal/validation/infrastructure.go index 85fd9bb08..e0f4ff294 100644 --- a/pkg/apis/metal/validation/infrastructure.go +++ b/pkg/apis/metal/validation/infrastructure.go @@ -36,6 +36,15 @@ func ValidateInfrastructureConfigAgainstCloudProfile(infra *apismetal.Infrastruc return allErrs } + cloudConfigPath := fldPath.Child("cloudConfig") + + if cloudProfileConfig.Kind == "" { + allErrs = append(allErrs, field.Required(cloudConfigPath.Child("kind"), "at least kind is required")) + } + if cloudProfileConfig.APIVersion == "" { + allErrs = append(allErrs, field.Required(cloudConfigPath.Child("apiVersion"), "at least apiVersion is required")) + } + mcp, p, err := helper.FindMetalControlPlane(cloudProfileConfig, infra.PartitionID) if err != nil { allErrs = append(allErrs, field.Invalid(fldPath.Child("partitionID"), infra.PartitionID, "cloud profile does not define the given shoot partition")) diff --git a/pkg/apis/metal/validation/infrastructure_test.go b/pkg/apis/metal/validation/infrastructure_test.go index 5a0337603..38d36bfbb 100644 --- a/pkg/apis/metal/validation/infrastructure_test.go +++ b/pkg/apis/metal/validation/infrastructure_test.go @@ -3,6 +3,7 @@ package validation_test import ( "github.com/gardener/gardener/pkg/apis/core" gardencorev1beta1 "github.com/gardener/gardener/pkg/apis/core/v1beta1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/validation/field" apismetal "github.com/metal-stack/gardener-extension-provider-metal/pkg/apis/metal" @@ -254,5 +255,9 @@ func createCloudProfileConfig() *apismetal.CloudProfileConfig { }, }, }, + TypeMeta: v1.TypeMeta{ + Kind: "cloudProfile", + APIVersion: "v1alpha1", + }, } }