diff --git a/pkg/api/types.go b/pkg/api/types.go index 8b8554396e6..c02add8d19a 100644 --- a/pkg/api/types.go +++ b/pkg/api/types.go @@ -651,7 +651,7 @@ type EmptyDirVolumeSource struct { // The default is nil which means that the limit is undefined. // More info: http://kubernetes.io/docs/user-guide/volumes#emptydir // +optional - SizeLimit resource.Quantity + SizeLimit *resource.Quantity } // StorageMedium defines ways that storage can be allocated to a volume. diff --git a/pkg/api/v1/BUILD b/pkg/api/v1/BUILD index c79f190ccbd..a80efb82f56 100644 --- a/pkg/api/v1/BUILD +++ b/pkg/api/v1/BUILD @@ -23,6 +23,7 @@ go_library( "//pkg/util/parsers:go_default_library", "//pkg/util/pointer:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", diff --git a/pkg/api/validation/validation.go b/pkg/api/validation/validation.go index 5e07a458729..24eff298940 100644 --- a/pkg/api/validation/validation.go +++ b/pkg/api/validation/validation.go @@ -386,10 +386,13 @@ func validateVolumeSource(source *api.VolumeSource, fldPath *field.Path, volName if source.EmptyDir != nil { numVolumes++ if !utilfeature.DefaultFeatureGate.Enabled(features.LocalStorageCapacityIsolation) { - unsetSizeLimit := resource.Quantity{} - if unsetSizeLimit.Cmp(source.EmptyDir.SizeLimit) != 0 { + if source.EmptyDir.SizeLimit != nil && source.EmptyDir.SizeLimit.Cmp(resource.Quantity{}) != 0 { allErrs = append(allErrs, field.Forbidden(fldPath.Child("emptyDir").Child("sizeLimit"), "SizeLimit field disabled by feature-gate for EmptyDir volumes")) } + } else { + if source.EmptyDir.SizeLimit != nil && source.EmptyDir.SizeLimit.Cmp(resource.Quantity{}) < 0 { + allErrs = append(allErrs, field.Forbidden(fldPath.Child("emptyDir").Child("sizeLimit"), "SizeLimit field must be a valid resource quantity")) + } } } if source.HostPath != nil { diff --git a/pkg/api/validation/validation_test.go b/pkg/api/validation/validation_test.go index d7038753f30..f93548fb611 100644 --- a/pkg/api/validation/validation_test.go +++ b/pkg/api/validation/validation_test.go @@ -2656,7 +2656,7 @@ func TestValidateVolumes(t *testing.T) { func TestAlphaLocalStorageCapacityIsolation(t *testing.T) { testCases := []api.VolumeSource{ - {EmptyDir: &api.EmptyDirVolumeSource{SizeLimit: *resource.NewQuantity(int64(5), resource.BinarySI)}}, + {EmptyDir: &api.EmptyDirVolumeSource{SizeLimit: resource.NewQuantity(int64(5), resource.BinarySI)}}, } // Enable alpha feature LocalStorageCapacityIsolation err := utilfeature.DefaultFeatureGate.Set("LocalStorageCapacityIsolation=true") diff --git a/pkg/kubelet/eviction/eviction_manager.go b/pkg/kubelet/eviction/eviction_manager.go index f430b82502b..9f1bf54061a 100644 --- a/pkg/kubelet/eviction/eviction_manager.go +++ b/pkg/kubelet/eviction/eviction_manager.go @@ -496,7 +496,7 @@ func (m *managerImpl) emptyDirLimitEviction(podStats statsapi.PodStats, pod *v1. if source.EmptyDir != nil { size := source.EmptyDir.SizeLimit used := podVolumeUsed[pod.Spec.Volumes[i].Name] - if used != nil && size.Sign() == 1 && used.Cmp(size) > 0 { + if used != nil && size != nil && size.Sign() == 1 && used.Cmp(*size) > 0 { // the emptyDir usage exceeds the size limit, evict the pod return m.evictPod(pod, v1.ResourceName("EmptyDir"), fmt.Sprintf("emptyDir usage exceeds the limit %q", size.String())) } diff --git a/plugin/pkg/scheduler/algorithm/predicates/predicates_test.go b/plugin/pkg/scheduler/algorithm/predicates/predicates_test.go index 7c878c5ac3c..383107861a8 100644 --- a/plugin/pkg/scheduler/algorithm/predicates/predicates_test.go +++ b/plugin/pkg/scheduler/algorithm/predicates/predicates_test.go @@ -124,7 +124,7 @@ func addStorageLimit(pod *v1.Pod, sizeLimit int64, medium v1.StorageMedium) *v1. Name: "emptyDirVolumeName", VolumeSource: v1.VolumeSource{ EmptyDir: &v1.EmptyDirVolumeSource{ - SizeLimit: *resource.NewQuantity(sizeLimit, resource.BinarySI), + SizeLimit: resource.NewQuantity(sizeLimit, resource.BinarySI), Medium: medium, }, }, diff --git a/staging/src/k8s.io/api/core/v1/types.go b/staging/src/k8s.io/api/core/v1/types.go index f0fa7e6e576..c5b955ab01f 100644 --- a/staging/src/k8s.io/api/core/v1/types.go +++ b/staging/src/k8s.io/api/core/v1/types.go @@ -739,7 +739,7 @@ type EmptyDirVolumeSource struct { // The default is nil which means that the limit is undefined. // More info: http://kubernetes.io/docs/user-guide/volumes#emptydir // +optional - SizeLimit resource.Quantity `json:"sizeLimit,omitempty" protobuf:"bytes,2,opt,name=sizeLimit"` + SizeLimit *resource.Quantity `json:"sizeLimit,omitempty" protobuf:"bytes,2,opt,name=sizeLimit"` } // Represents a Glusterfs mount that lasts the lifetime of a pod. diff --git a/test/e2e_node/local_storage_isolation_eviction_test.go b/test/e2e_node/local_storage_isolation_eviction_test.go index 5d3408c4b2c..15ad4ddc0d0 100644 --- a/test/e2e_node/local_storage_isolation_eviction_test.go +++ b/test/e2e_node/local_storage_isolation_eviction_test.go @@ -75,7 +75,7 @@ var _ = framework.KubeDescribe("LocalStorageCapacityIsolationEviction [Slow] [Se Name: emptyDirVolumeName, VolumeSource: v1.VolumeSource{ EmptyDir: &v1.EmptyDirVolumeSource{ - SizeLimit: *resource.NewQuantity(int64(1000), resource.BinarySI), + SizeLimit: resource.NewQuantity(int64(1000), resource.BinarySI), }, }, }, @@ -112,7 +112,7 @@ var _ = framework.KubeDescribe("LocalStorageCapacityIsolationEviction [Slow] [Se VolumeSource: v1.VolumeSource{ EmptyDir: &v1.EmptyDirVolumeSource{ Medium: "Memory", - SizeLimit: *resource.NewQuantity(int64(10000), resource.BinarySI), + SizeLimit: resource.NewQuantity(int64(10000), resource.BinarySI), }, }, }, @@ -148,7 +148,7 @@ var _ = framework.KubeDescribe("LocalStorageCapacityIsolationEviction [Slow] [Se Name: emptyDirVolumeName, VolumeSource: v1.VolumeSource{ EmptyDir: &v1.EmptyDirVolumeSource{ - SizeLimit: *resource.NewQuantity(int64(100000), resource.BinarySI), + SizeLimit: resource.NewQuantity(int64(100000), resource.BinarySI), }, }, }, @@ -218,7 +218,7 @@ var _ = framework.KubeDescribe("LocalStorageCapacityIsolationEviction [Slow] [Se Name: emptyDirVolumeName, VolumeSource: v1.VolumeSource{ EmptyDir: &v1.EmptyDirVolumeSource{ - SizeLimit: *resource.NewQuantity(int64(100000), resource.BinarySI), + SizeLimit: resource.NewQuantity(int64(100000), resource.BinarySI), }, }, },