Skip to content

Commit 6ad3a0a

Browse files
committed
Add e2e tests to test whole lifecyle of CPU startup boost
1 parent 449f57e commit 6ad3a0a

File tree

2 files changed

+121
-2
lines changed

2 files changed

+121
-2
lines changed

vertical-pod-autoscaler/e2e/v1/actuation.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import (
3535
"k8s.io/apimachinery/pkg/util/wait"
3636
"k8s.io/autoscaler/vertical-pod-autoscaler/e2e/utils"
3737
vpa_types "k8s.io/autoscaler/vertical-pod-autoscaler/pkg/apis/autoscaling.k8s.io/v1"
38+
"k8s.io/autoscaler/vertical-pod-autoscaler/pkg/features"
3839
restriction "k8s.io/autoscaler/vertical-pod-autoscaler/pkg/updater/restriction"
3940
updaterutils "k8s.io/autoscaler/vertical-pod-autoscaler/pkg/updater/utils"
4041
"k8s.io/autoscaler/vertical-pod-autoscaler/pkg/utils/annotations"
@@ -57,7 +58,7 @@ var _ = ActuationSuiteE2eDescribe("Actuation", ginkgo.Label("FG:InPlaceOrRecreat
5758
f.NamespacePodSecurityEnforceLevel = podsecurity.LevelBaseline
5859

5960
ginkgo.BeforeEach(func() {
60-
checkInPlaceOrRecreateTestsEnabled(f, true, true)
61+
checkFeatureGateTestsEnabled(f, features.InPlaceOrRecreate, true, true)
6162
})
6263

6364
ginkgo.It("still applies recommendations on restart when update mode is InPlaceOrRecreate", func() {

vertical-pod-autoscaler/e2e/v1/full_vpa.go

Lines changed: 119 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import (
2727
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2828
"k8s.io/apimachinery/pkg/util/wait"
2929
vpa_types "k8s.io/autoscaler/vertical-pod-autoscaler/pkg/apis/autoscaling.k8s.io/v1"
30+
"k8s.io/autoscaler/vertical-pod-autoscaler/pkg/features"
3031
"k8s.io/autoscaler/vertical-pod-autoscaler/pkg/utils/test"
3132
"k8s.io/kubernetes/test/e2e/framework"
3233
podsecurity "k8s.io/pod-security-admission/api"
@@ -63,7 +64,7 @@ var _ = FullVpaE2eDescribe("Pods under VPA", func() {
6364

6465
ginkgo.Describe("with InPlaceOrRecreate update mode", ginkgo.Label("FG:InPlaceOrRecreate"), func() {
6566
ginkgo.BeforeEach(func() {
66-
checkInPlaceOrRecreateTestsEnabled(f, true, false)
67+
checkFeatureGateTestsEnabled(f, features.InPlaceOrRecreate, true, false)
6768

6869
ns := f.Namespace.Name
6970
ginkgo.By("Setting up a hamster deployment")
@@ -347,6 +348,123 @@ var _ = FullVpaE2eDescribe("Pods under VPA with non-recognized recommender expli
347348
})
348349
})
349350

351+
var _ = FullVpaE2eDescribe("Pods under VPA with CPUStartupBoost", ginkgo.Label("FG:CPUStartupBoost"), func() {
352+
var (
353+
rc *ResourceConsumer
354+
)
355+
replicas := 3
356+
357+
ginkgo.AfterEach(func() {
358+
rc.CleanUp()
359+
})
360+
361+
f := framework.NewDefaultFramework("vertical-pod-autoscaling")
362+
f.NamespacePodSecurityEnforceLevel = podsecurity.LevelBaseline
363+
364+
ginkgo.Describe("have CPU startup boost recommendation applied", func() {
365+
ginkgo.BeforeEach(func() {
366+
checkFeatureGateTestsEnabled(f, features.CPUStartupBoost, true, true)
367+
waitForVpaWebhookRegistration(f)
368+
})
369+
370+
ginkgo.It("to all containers of a pod", func() {
371+
ns := f.Namespace.Name
372+
ginkgo.By("Setting up a VPA CRD with CPUStartupBoost")
373+
targetRef := &autoscaling.CrossVersionObjectReference{
374+
APIVersion: "apps/v1",
375+
Kind: "Deployment",
376+
Name: "hamster",
377+
}
378+
379+
containerName := GetHamsterContainerNameByIndex(0)
380+
factor := int32(100)
381+
vpaCRD := test.VerticalPodAutoscaler().
382+
WithName("hamster-vpa").
383+
WithNamespace(f.Namespace.Name).
384+
WithTargetRef(targetRef).
385+
WithUpdateMode(vpa_types.UpdateModeInPlaceOrRecreate).
386+
WithContainer(containerName).
387+
WithCPUStartupBoost(&factor, nil, "10s").
388+
Get()
389+
390+
InstallVPA(f, vpaCRD)
391+
392+
ginkgo.By("Setting up a hamster deployment")
393+
rc = NewDynamicResourceConsumer("hamster", ns, KindDeployment,
394+
replicas,
395+
1, /*initCPUTotal*/
396+
10, /*initMemoryTotal*/
397+
1, /*initCustomMetric*/
398+
initialCPU, /*cpuRequest*/
399+
initialMemory, /*memRequest*/
400+
f.ClientSet,
401+
f.ScalesGetter)
402+
403+
// Pods should be created with boosted CPU (10m * 100 = 1000m)
404+
err := waitForResourceRequestInRangeInPods(
405+
f, pollTimeout, metav1.ListOptions{LabelSelector: "name=hamster"}, apiv1.ResourceCPU,
406+
ParseQuantityOrDie("800m"), ParseQuantityOrDie("1200m"))
407+
gomega.Expect(err).NotTo(gomega.HaveOccurred())
408+
409+
// Pods should be scaled back down in-place after they become Ready and
410+
// StartupBoost.CPU.Duration has elapsed
411+
err = waitForResourceRequestInRangeInPods(
412+
f, pollTimeout, metav1.ListOptions{LabelSelector: "name=hamster"}, apiv1.ResourceCPU,
413+
ParseQuantityOrDie(minimalCPULowerBound), ParseQuantityOrDie(minimalCPUUpperBound))
414+
gomega.Expect(err).NotTo(gomega.HaveOccurred())
415+
})
416+
417+
ginkgo.It("to a subset of containers in a pod", func() {
418+
ns := f.Namespace.Name
419+
420+
ginkgo.By("Setting up a VPA CRD with CPUStartupBoost")
421+
targetRef := &autoscaling.CrossVersionObjectReference{
422+
APIVersion: "apps/v1",
423+
Kind: "Deployment",
424+
Name: "hamster",
425+
}
426+
427+
containerName := GetHamsterContainerNameByIndex(0)
428+
factor := int32(100)
429+
vpaCRD := test.VerticalPodAutoscaler().
430+
WithName("hamster-vpa").
431+
WithNamespace(f.Namespace.Name).
432+
WithTargetRef(targetRef).
433+
WithUpdateMode(vpa_types.UpdateModeInPlaceOrRecreate).
434+
WithContainer(containerName).
435+
WithCPUStartupBoost(&factor, nil, "10s").
436+
Get()
437+
438+
InstallVPA(f, vpaCRD)
439+
440+
ginkgo.By("Setting up a hamster deployment")
441+
rc = NewDynamicResourceConsumer("hamster", ns, KindDeployment,
442+
replicas,
443+
1, /*initCPUTotal*/
444+
10, /*initMemoryTotal*/
445+
1, /*initCustomMetric*/
446+
initialCPU, /*cpuRequest*/
447+
initialMemory, /*memRequest*/
448+
f.ClientSet,
449+
f.ScalesGetter)
450+
451+
// Pods should be created with boosted CPU (10m * 100 = 1000m)
452+
err := waitForResourceRequestInRangeInPods(
453+
f, pollTimeout, metav1.ListOptions{LabelSelector: "name=hamster"}, apiv1.ResourceCPU,
454+
ParseQuantityOrDie("999m"), ParseQuantityOrDie("1001m"))
455+
gomega.Expect(err).NotTo(gomega.HaveOccurred())
456+
457+
// Pods should be scaled back down in-place after they become Ready and
458+
// StartupBoost.CPU.Duration has elapsed
459+
err = waitForResourceRequestInRangeInPods(
460+
f, pollTimeout, metav1.ListOptions{LabelSelector: "name=hamster"}, apiv1.ResourceCPU,
461+
ParseQuantityOrDie(minimalCPULowerBound), ParseQuantityOrDie(minimalCPUUpperBound))
462+
gomega.Expect(err).NotTo(gomega.HaveOccurred())
463+
})
464+
})
465+
466+
})
467+
350468
var _ = FullVpaE2eDescribe("OOMing pods under VPA", func() {
351469
const replicas = 3
352470

0 commit comments

Comments
 (0)