mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-23 19:56:01 +00:00
pod-overhead: add Overhead to RuntimeClass internal type
Signed-off-by: Eric Ernst <eric.ernst@intel.com>
This commit is contained in:
parent
bcb046a443
commit
2c52cc3412
@ -18,6 +18,7 @@ package node
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
"k8s.io/kubernetes/pkg/apis/core"
|
||||||
)
|
)
|
||||||
|
|
||||||
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
|
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
|
||||||
@ -45,6 +46,21 @@ type RuntimeClass struct {
|
|||||||
// The Handler must conform to the DNS Label (RFC 1123) requirements, and is
|
// The Handler must conform to the DNS Label (RFC 1123) requirements, and is
|
||||||
// immutable.
|
// immutable.
|
||||||
Handler string
|
Handler string
|
||||||
|
|
||||||
|
// Overhead represents the resource overhead associated with running a pod for a
|
||||||
|
// given RuntimeClass. For more details, see
|
||||||
|
// https://git.k8s.io/enhancements/keps/sig-node/20190226-pod-overhead.md
|
||||||
|
// This field is alpha-level as of Kubernetes v1.16, and is only honored by servers
|
||||||
|
// that enable the PodOverhead feature.
|
||||||
|
// +optional
|
||||||
|
Overhead *Overhead
|
||||||
|
}
|
||||||
|
|
||||||
|
// Overhead structure represents the resource overhead associated with running a pod.
|
||||||
|
type Overhead struct {
|
||||||
|
// PodFixed represents the fixed resource overhead associated with running a pod.
|
||||||
|
// +optional
|
||||||
|
PodFixed core.ResourceList
|
||||||
}
|
}
|
||||||
|
|
||||||
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
|
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
|
||||||
|
@ -19,7 +19,11 @@ package validation
|
|||||||
import (
|
import (
|
||||||
apivalidation "k8s.io/apimachinery/pkg/api/validation"
|
apivalidation "k8s.io/apimachinery/pkg/api/validation"
|
||||||
"k8s.io/apimachinery/pkg/util/validation/field"
|
"k8s.io/apimachinery/pkg/util/validation/field"
|
||||||
|
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
||||||
|
"k8s.io/kubernetes/pkg/apis/core"
|
||||||
|
corevalidation "k8s.io/kubernetes/pkg/apis/core/validation"
|
||||||
"k8s.io/kubernetes/pkg/apis/node"
|
"k8s.io/kubernetes/pkg/apis/node"
|
||||||
|
"k8s.io/kubernetes/pkg/features"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ValidateRuntimeClass validates the RuntimeClass
|
// ValidateRuntimeClass validates the RuntimeClass
|
||||||
@ -30,6 +34,10 @@ func ValidateRuntimeClass(rc *node.RuntimeClass) field.ErrorList {
|
|||||||
allErrs = append(allErrs, field.Invalid(field.NewPath("handler"), rc.Handler, msg))
|
allErrs = append(allErrs, field.Invalid(field.NewPath("handler"), rc.Handler, msg))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if rc.Overhead != nil && utilfeature.DefaultFeatureGate.Enabled(features.PodOverhead) {
|
||||||
|
allErrs = append(allErrs, validateOverhead(rc.Overhead, field.NewPath("overhead"))...)
|
||||||
|
}
|
||||||
|
|
||||||
return allErrs
|
return allErrs
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -41,3 +49,8 @@ func ValidateRuntimeClassUpdate(new, old *node.RuntimeClass) field.ErrorList {
|
|||||||
|
|
||||||
return allErrs
|
return allErrs
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func validateOverhead(overhead *node.Overhead, fldPath *field.Path) field.ErrorList {
|
||||||
|
// reuse the ResourceRequirements validation logic
|
||||||
|
return corevalidation.ValidateResourceRequirements(&core.ResourceRequirements{Limits: overhead.PodFixed}, fldPath)
|
||||||
|
}
|
||||||
|
@ -19,8 +19,13 @@ package validation
|
|||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"k8s.io/apimachinery/pkg/api/resource"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
||||||
|
featuregatetesting "k8s.io/component-base/featuregate/testing"
|
||||||
|
"k8s.io/kubernetes/pkg/apis/core"
|
||||||
"k8s.io/kubernetes/pkg/apis/node"
|
"k8s.io/kubernetes/pkg/apis/node"
|
||||||
|
"k8s.io/kubernetes/pkg/features"
|
||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
)
|
)
|
||||||
@ -126,3 +131,58 @@ func TestValidateRuntimeUpdate(t *testing.T) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestValidateOverhead(t *testing.T) {
|
||||||
|
|
||||||
|
defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.PodOverhead, true)()
|
||||||
|
|
||||||
|
successCase := []struct {
|
||||||
|
Name string
|
||||||
|
overhead *node.Overhead
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
Name: "Overhead with valid cpu and memory resources",
|
||||||
|
overhead: &node.Overhead{
|
||||||
|
PodFixed: core.ResourceList{
|
||||||
|
core.ResourceName(core.ResourceCPU): resource.MustParse("10"),
|
||||||
|
core.ResourceName(core.ResourceMemory): resource.MustParse("10G"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tc := range successCase {
|
||||||
|
rc := &node.RuntimeClass{
|
||||||
|
ObjectMeta: metav1.ObjectMeta{Name: "foo"},
|
||||||
|
Handler: "bar",
|
||||||
|
Overhead: tc.overhead,
|
||||||
|
}
|
||||||
|
if errs := ValidateRuntimeClass(rc); len(errs) != 0 {
|
||||||
|
t.Errorf("%q unexpected error: %v", tc.Name, errs)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
errorCase := []struct {
|
||||||
|
Name string
|
||||||
|
overhead *node.Overhead
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
Name: "Invalid Resources",
|
||||||
|
overhead: &node.Overhead{
|
||||||
|
PodFixed: core.ResourceList{
|
||||||
|
core.ResourceName("my.org"): resource.MustParse("10m"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tc := range errorCase {
|
||||||
|
rc := &node.RuntimeClass{
|
||||||
|
ObjectMeta: metav1.ObjectMeta{Name: "foo"},
|
||||||
|
Handler: "bar",
|
||||||
|
Overhead: tc.overhead,
|
||||||
|
}
|
||||||
|
if errs := ValidateRuntimeClass(rc); len(errs) == 0 {
|
||||||
|
t.Errorf("%q expected error", tc.Name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user