github.com/ironcore-dev/gardener-extension-provider-ironcore@v0.3.2-0.20240314231816-8336447fb9a0/pkg/apis/ironcore/validation/shoot.go (about)

     1  // SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and IronCore contributors
     2  // SPDX-License-Identifier: Apache-2.0
     3  
     4  package validation
     5  
     6  import (
     7  	"github.com/gardener/gardener/pkg/apis/core"
     8  	"github.com/gardener/gardener/pkg/apis/core/helper"
     9  	validationutils "github.com/gardener/gardener/pkg/utils/validation"
    10  	apivalidation "k8s.io/apimachinery/pkg/api/validation"
    11  	"k8s.io/apimachinery/pkg/util/validation/field"
    12  )
    13  
    14  // ValidateNetworking validates the network settings of a Shoot.
    15  func ValidateNetworking(networking *core.Networking, fldPath *field.Path) field.ErrorList {
    16  	allErrs := field.ErrorList{}
    17  
    18  	if networking == nil || networking.Nodes == nil {
    19  		allErrs = append(allErrs, field.Required(fldPath.Child("nodes"), "a nodes CIDR must be provided for ironcore shoots"))
    20  	}
    21  
    22  	return allErrs
    23  }
    24  
    25  // ValidateWorkers validates the workers of a Shoot.
    26  func ValidateWorkers(workers []core.Worker, fldPath *field.Path) field.ErrorList {
    27  	allErrs := field.ErrorList{}
    28  
    29  	for i, worker := range workers {
    30  		workerFldPath := fldPath.Index(i)
    31  
    32  		if worker.Volume == nil {
    33  			allErrs = append(allErrs, field.Required(workerFldPath.Child("volume"), "must not be nil"))
    34  		} else {
    35  			allErrs = append(allErrs, validateVolume(worker.Volume, workerFldPath.Child("volume"))...)
    36  		}
    37  
    38  		if len(worker.Zones) == 0 {
    39  			allErrs = append(allErrs, field.Required(workerFldPath.Child("zones"), "at least one zone must be configured"))
    40  			continue
    41  		}
    42  
    43  	}
    44  
    45  	return allErrs
    46  }
    47  
    48  func validateVolume(vol *core.Volume, fldPath *field.Path) field.ErrorList {
    49  	allErrs := field.ErrorList{}
    50  	if vol.Type == nil {
    51  		allErrs = append(allErrs, field.Required(fldPath.Child("type"), "must not be empty"))
    52  	}
    53  	if vol.VolumeSize == "" {
    54  		allErrs = append(allErrs, field.Required(fldPath.Child("size"), "must not be empty"))
    55  	}
    56  	return allErrs
    57  }
    58  
    59  // ValidateWorkersUpdate validates updates on Workers.
    60  func ValidateWorkersUpdate(oldWorkers, newWorkers []core.Worker, fldPath *field.Path) field.ErrorList {
    61  	allErrs := field.ErrorList{}
    62  	for i, newWorker := range newWorkers {
    63  		workerFldPath := fldPath.Index(i)
    64  		oldWorker := helper.FindWorkerByName(oldWorkers, newWorker.Name)
    65  
    66  		if oldWorker != nil && validationutils.ShouldEnforceImmutability(newWorker.Zones, oldWorker.Zones) {
    67  			allErrs = append(allErrs, apivalidation.ValidateImmutableField(newWorker.Zones, oldWorker.Zones, workerFldPath.Child("zones"))...)
    68  		}
    69  	}
    70  	return allErrs
    71  }