mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-11 21:12:07 +00:00
Merge pull request #118520 from jpbetz/validate-unique
Add merge map key validation to StorageVersions
This commit is contained in:
commit
fc798a8dc1
@ -21,6 +21,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
apimachineryvalidation "k8s.io/apimachinery/pkg/api/validation"
|
apimachineryvalidation "k8s.io/apimachinery/pkg/api/validation"
|
||||||
|
"k8s.io/apimachinery/pkg/util/sets"
|
||||||
utilvalidation "k8s.io/apimachinery/pkg/util/validation"
|
utilvalidation "k8s.io/apimachinery/pkg/util/validation"
|
||||||
"k8s.io/apimachinery/pkg/util/validation/field"
|
"k8s.io/apimachinery/pkg/util/validation/field"
|
||||||
"k8s.io/kubernetes/pkg/apis/apiserverinternal"
|
"k8s.io/kubernetes/pkg/apis/apiserverinternal"
|
||||||
@ -67,7 +68,13 @@ func ValidateStorageVersionStatusUpdate(sv, oldSV *apiserverinternal.StorageVers
|
|||||||
|
|
||||||
func validateStorageVersionStatus(ss apiserverinternal.StorageVersionStatus, fldPath *field.Path) field.ErrorList {
|
func validateStorageVersionStatus(ss apiserverinternal.StorageVersionStatus, fldPath *field.Path) field.ErrorList {
|
||||||
var allErrs field.ErrorList
|
var allErrs field.ErrorList
|
||||||
|
allAPIServerIDs := sets.New[string]()
|
||||||
for i, ssv := range ss.StorageVersions {
|
for i, ssv := range ss.StorageVersions {
|
||||||
|
if allAPIServerIDs.Has(ssv.APIServerID) {
|
||||||
|
allErrs = append(allErrs, field.Duplicate(fldPath.Child("storageVersions").Index(i).Child("apiServerID"), ssv.APIServerID))
|
||||||
|
} else {
|
||||||
|
allAPIServerIDs.Insert(ssv.APIServerID)
|
||||||
|
}
|
||||||
allErrs = append(allErrs, validateServerStorageVersion(ssv, fldPath.Child("storageVersions").Index(i))...)
|
allErrs = append(allErrs, validateServerStorageVersion(ssv, fldPath.Child("storageVersions").Index(i))...)
|
||||||
}
|
}
|
||||||
if err := validateCommonVersion(ss, fldPath); err != nil {
|
if err := validateCommonVersion(ss, fldPath); err != nil {
|
||||||
|
@ -22,6 +22,7 @@ import (
|
|||||||
|
|
||||||
"k8s.io/apimachinery/pkg/util/validation/field"
|
"k8s.io/apimachinery/pkg/util/validation/field"
|
||||||
"k8s.io/kubernetes/pkg/apis/apiserverinternal"
|
"k8s.io/kubernetes/pkg/apis/apiserverinternal"
|
||||||
|
"k8s.io/utils/pointer"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestValidateServerStorageVersion(t *testing.T) {
|
func TestValidateServerStorageVersion(t *testing.T) {
|
||||||
@ -193,6 +194,59 @@ func TestValidateServerStorageVersion(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestValidateStorageVersionStatus(t *testing.T) {
|
||||||
|
cases := []struct {
|
||||||
|
svs apiserverinternal.StorageVersionStatus
|
||||||
|
expectedErr string
|
||||||
|
}{{
|
||||||
|
svs: apiserverinternal.StorageVersionStatus{
|
||||||
|
StorageVersions: []apiserverinternal.ServerStorageVersion{{
|
||||||
|
APIServerID: "1",
|
||||||
|
EncodingVersion: "v1alpha1",
|
||||||
|
DecodableVersions: []string{"v1alpha1", "v1"},
|
||||||
|
}, {
|
||||||
|
APIServerID: "2",
|
||||||
|
EncodingVersion: "v1alpha1",
|
||||||
|
DecodableVersions: []string{"v1alpha1", "v1"},
|
||||||
|
}},
|
||||||
|
CommonEncodingVersion: pointer.String("v1alpha1"),
|
||||||
|
},
|
||||||
|
expectedErr: "",
|
||||||
|
}, {
|
||||||
|
svs: apiserverinternal.StorageVersionStatus{
|
||||||
|
StorageVersions: []apiserverinternal.ServerStorageVersion{{
|
||||||
|
APIServerID: "1",
|
||||||
|
EncodingVersion: "v1alpha1",
|
||||||
|
DecodableVersions: []string{"v1alpha1", "v1"},
|
||||||
|
}, {
|
||||||
|
APIServerID: "1",
|
||||||
|
EncodingVersion: "v1beta1",
|
||||||
|
DecodableVersions: []string{"v1alpha1", "v1"},
|
||||||
|
}},
|
||||||
|
CommonEncodingVersion: pointer.String("v1alpha1"),
|
||||||
|
},
|
||||||
|
expectedErr: "storageVersions[1].apiServerID: Duplicate value: \"1\"",
|
||||||
|
}}
|
||||||
|
|
||||||
|
for _, tc := range cases {
|
||||||
|
err := validateStorageVersionStatus(tc.svs, field.NewPath("")).ToAggregate()
|
||||||
|
if err == nil && len(tc.expectedErr) == 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if err != nil && len(tc.expectedErr) == 0 {
|
||||||
|
t.Errorf("unexpected error %v", err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if err == nil && len(tc.expectedErr) != 0 {
|
||||||
|
t.Errorf("unexpected empty error")
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if !strings.Contains(err.Error(), tc.expectedErr) {
|
||||||
|
t.Errorf("expected error to contain %s, got %s", tc.expectedErr, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestValidateCommonVersion(t *testing.T) {
|
func TestValidateCommonVersion(t *testing.T) {
|
||||||
cases := []struct {
|
cases := []struct {
|
||||||
status apiserverinternal.StorageVersionStatus
|
status apiserverinternal.StorageVersionStatus
|
||||||
|
Loading…
Reference in New Issue
Block a user