Skip to content

Commit

Permalink
Add cluster topology metadata validatino
Browse files Browse the repository at this point in the history
  • Loading branch information
LuBingtan committed Jul 15, 2023
1 parent 1239557 commit 11f5e2a
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 36 deletions.
16 changes: 16 additions & 0 deletions api/v1beta1/common_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,10 @@ package v1beta1

import (
corev1 "k8s.io/api/core/v1"
apivalidation "k8s.io/apimachinery/pkg/api/validation"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
metav1validation "k8s.io/apimachinery/pkg/apis/meta/v1/validation"
"k8s.io/apimachinery/pkg/util/validation/field"
)

const (
Expand Down Expand Up @@ -297,3 +300,16 @@ type ObjectMeta struct {
// +optional
Annotations map[string]string `json:"annotations,omitempty"`
}

// Validate validates the labels and annotations in ObjectMeta.
func (metadata *ObjectMeta) Validate(parent *field.Path) field.ErrorList {
allErrs := metav1validation.ValidateLabels(
metadata.Labels,
parent.Child("labels"),
)
allErrs = append(allErrs, apivalidation.ValidateAnnotations(
metadata.Annotations,
parent.Child("annotations"),
)...)
return allErrs
}
36 changes: 0 additions & 36 deletions api/v1beta1/common_validate.go

This file was deleted.

16 changes: 16 additions & 0 deletions internal/webhooks/cluster.go
Original file line number Diff line number Diff line change
Expand Up @@ -255,6 +255,9 @@ func (webhook *Cluster) validateTopology(ctx context.Context, oldCluster, newClu
)
}

// metadata in topology should be valid
allErrs = append(allErrs, validateTopologyMetadata(newCluster.Spec.Topology, fldPath)...)

// upgrade concurrency should be a numeric value.
if concurrency, ok := newCluster.Annotations[clusterv1.ClusterTopologyUpgradeConcurrencyAnnotation]; ok {
concurrencyAnnotationField := field.NewPath("metadata", "annotations", clusterv1.ClusterTopologyUpgradeConcurrencyAnnotation)
Expand Down Expand Up @@ -629,3 +632,16 @@ func clusterClassIsReconciled(clusterClass *clusterv1.ClusterClass) error {
}
return nil
}

func validateTopologyMetadata(topology *clusterv1.Topology, fldPath *field.Path) field.ErrorList {
var allErrs field.ErrorList
allErrs = append(allErrs, topology.ControlPlane.Metadata.Validate(fldPath.Child("controlPlane", "metadata"))...)
if topology.Workers != nil {
for idx, md := range topology.Workers.MachineDeployments {
allErrs = append(allErrs, md.Metadata.Validate(
fldPath.Child("workers", "machineDeployments").Index(idx).Child("metadata"),
)...)
}
}
return allErrs
}
15 changes: 15 additions & 0 deletions internal/webhooks/clusterclass.go
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,10 @@ func (webhook *ClusterClass) validate(ctx context.Context, oldClusterClass, newC
// Ensure no MachineHealthCheck currently in use has been removed from the ClusterClass.
allErrs = append(allErrs,
validateUpdatesToMachineHealthCheckClasses(clusters, oldClusterClass, newClusterClass)...)

// Ensure Topology metadata in every clusters is valid.
allErrs = append(allErrs,
validateClustersTopologyMetadata(clusters)...)
}

if len(allErrs) > 0 {
Expand Down Expand Up @@ -382,3 +386,14 @@ func validateClusterClassMetadata(clusterClass *clusterv1.ClusterClass) field.Er
func validateMachineDeploymentMetadata(m clusterv1.MachineDeploymentClass, fldPath *field.Path) field.ErrorList {
return m.Template.Metadata.Validate(fldPath.Child("template", "metadata"))
}

func validateClustersTopologyMetadata(clusters []clusterv1.Cluster) field.ErrorList {
var allErrs field.ErrorList
for _, c := range clusters {
if c.Spec.Topology != nil {
allErrs = append(allErrs,
validateTopologyMetadata(c.Spec.Topology, field.NewPath("spec", "topology"))...)
}
}
return allErrs
}

0 comments on commit 11f5e2a

Please sign in to comment.