mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-20 18:31:15 +00:00
pkg/admission/storageclass: pick random storageclass if >1 present
Signed-off-by: danishprakash <grafitykoncept@gmail.com>
This commit is contained in:
parent
429f71d958
commit
f12325add3
@ -17,9 +17,9 @@ limitations under the License.
|
|||||||
package util
|
package util
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"sort"
|
||||||
|
|
||||||
storagev1 "k8s.io/api/storage/v1"
|
storagev1 "k8s.io/api/storage/v1"
|
||||||
"k8s.io/apimachinery/pkg/api/errors"
|
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apimachinery/pkg/labels"
|
"k8s.io/apimachinery/pkg/labels"
|
||||||
storagev1listers "k8s.io/client-go/listers/storage/v1"
|
storagev1listers "k8s.io/client-go/listers/storage/v1"
|
||||||
@ -54,10 +54,17 @@ func GetDefaultClass(lister storagev1listers.StorageClassLister) (*storagev1.Sto
|
|||||||
if len(defaultClasses) == 0 {
|
if len(defaultClasses) == 0 {
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sort.Slice(defaultClasses, func(i, j int) bool {
|
||||||
|
if defaultClasses[i].CreationTimestamp.UnixNano() == defaultClasses[j].CreationTimestamp.UnixNano() {
|
||||||
|
return defaultClasses[i].Name < defaultClasses[j].Name
|
||||||
|
}
|
||||||
|
return defaultClasses[i].CreationTimestamp.UnixNano() > defaultClasses[j].CreationTimestamp.UnixNano()
|
||||||
|
})
|
||||||
if len(defaultClasses) > 1 {
|
if len(defaultClasses) > 1 {
|
||||||
klog.V(4).Infof("GetDefaultClass %d defaults found", len(defaultClasses))
|
klog.V(4).Infof("%d default StorageClasses were found, choosing the newest: %s", len(defaultClasses), defaultClasses[0].Name)
|
||||||
return nil, errors.NewInternalError(fmt.Errorf("%d default StorageClasses were found", len(defaultClasses)))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return defaultClasses[0], nil
|
return defaultClasses[0], nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20,6 +20,7 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
|
||||||
"k8s.io/kubernetes/pkg/volume/util"
|
"k8s.io/kubernetes/pkg/volume/util"
|
||||||
|
|
||||||
"k8s.io/klog/v2"
|
"k8s.io/klog/v2"
|
||||||
|
@ -19,6 +19,7 @@ package setdefault
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"testing"
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
"k8s.io/klog/v2"
|
"k8s.io/klog/v2"
|
||||||
|
|
||||||
@ -96,6 +97,30 @@ func TestAdmission(t *testing.T) {
|
|||||||
},
|
},
|
||||||
Provisioner: "nondefault1",
|
Provisioner: "nondefault1",
|
||||||
}
|
}
|
||||||
|
classWithCreateTime1 := &storagev1.StorageClass{
|
||||||
|
TypeMeta: metav1.TypeMeta{
|
||||||
|
Kind: "StorageClass",
|
||||||
|
},
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
Name: "default1",
|
||||||
|
CreationTimestamp: metav1.NewTime(time.Date(2022, time.Month(1), 1, 0, 0, 0, 1, time.UTC)),
|
||||||
|
Annotations: map[string]string{
|
||||||
|
storageutil.IsDefaultStorageClassAnnotation: "true",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
classWithCreateTime2 := &storagev1.StorageClass{
|
||||||
|
TypeMeta: metav1.TypeMeta{
|
||||||
|
Kind: "StorageClass",
|
||||||
|
},
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
Name: "default2",
|
||||||
|
CreationTimestamp: metav1.NewTime(time.Date(2022, time.Month(1), 1, 0, 0, 0, 0, time.UTC)),
|
||||||
|
Annotations: map[string]string{
|
||||||
|
storageutil.IsDefaultStorageClassAnnotation: "true",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
claimWithClass := &api.PersistentVolumeClaim{
|
claimWithClass := &api.PersistentVolumeClaim{
|
||||||
TypeMeta: metav1.TypeMeta{
|
TypeMeta: metav1.TypeMeta{
|
||||||
@ -166,13 +191,6 @@ func TestAdmission(t *testing.T) {
|
|||||||
false,
|
false,
|
||||||
"foo",
|
"foo",
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"two defaults, error with PVC with class=nil",
|
|
||||||
[]*storagev1.StorageClass{defaultClass1, defaultClass2, classWithFalseDefault, classWithNoDefault, classWithEmptyDefault},
|
|
||||||
claimWithNoClass,
|
|
||||||
true,
|
|
||||||
"",
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"two defaults, no modification of PVC with class=''",
|
"two defaults, no modification of PVC with class=''",
|
||||||
[]*storagev1.StorageClass{defaultClass1, defaultClass2, classWithFalseDefault, classWithNoDefault, classWithEmptyDefault},
|
[]*storagev1.StorageClass{defaultClass1, defaultClass2, classWithFalseDefault, classWithNoDefault, classWithEmptyDefault},
|
||||||
@ -187,6 +205,20 @@ func TestAdmission(t *testing.T) {
|
|||||||
false,
|
false,
|
||||||
"foo",
|
"foo",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"two defaults with same creation time, choose the one with smaller name",
|
||||||
|
[]*storagev1.StorageClass{defaultClass1, defaultClass2, classWithFalseDefault, classWithNoDefault, classWithEmptyDefault},
|
||||||
|
claimWithNoClass,
|
||||||
|
false,
|
||||||
|
defaultClass1.Name,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"two defaults, choose the one with newer creation time",
|
||||||
|
[]*storagev1.StorageClass{classWithCreateTime1, classWithCreateTime2, classWithFalseDefault, classWithNoDefault, classWithEmptyDefault},
|
||||||
|
claimWithNoClass,
|
||||||
|
false,
|
||||||
|
classWithCreateTime1.Name,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, test := range tests {
|
for _, test := range tests {
|
||||||
|
Loading…
Reference in New Issue
Block a user