Merge pull request #2095 from jbartosik/pod-limit-range-e2e
Clean up e2e vpa tests
This commit is contained in:
		
						commit
						037355ea2e
					
				| 
						 | 
				
			
			@ -197,7 +197,7 @@ var _ = AdmissionControllerE2eDescribe("Admission-controller", func() {
 | 
			
		|||
		}
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	ginkgo.It("caps request according to pod max limit set in pod LimitRange", func() {
 | 
			
		||||
	ginkgo.It("caps request according to pod max limit set in LimitRange", func() {
 | 
			
		||||
		d := NewHamsterDeploymentWithResourcesAndLimits(f,
 | 
			
		||||
			ParseQuantityOrDie("100m") /*cpu request*/, ParseQuantityOrDie("100Mi"), /*memory request*/
 | 
			
		||||
			ParseQuantityOrDie("150m") /*cpu limit*/, ParseQuantityOrDie("200Mi") /*memory limit*/)
 | 
			
		||||
| 
						 | 
				
			
			@ -247,7 +247,7 @@ var _ = AdmissionControllerE2eDescribe("Admission-controller", func() {
 | 
			
		|||
		}
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	ginkgo.It("raises request according to pod min limit set in pod LimitRange", func() {
 | 
			
		||||
	ginkgo.It("raises request according to pod min limit set in LimitRange", func() {
 | 
			
		||||
		d := NewHamsterDeploymentWithResourcesAndLimits(f,
 | 
			
		||||
			ParseQuantityOrDie("100m") /*cpu request*/, ParseQuantityOrDie("200Mi"), /*memory request*/
 | 
			
		||||
			ParseQuantityOrDie("150m") /*cpu limit*/, ParseQuantityOrDie("400Mi") /*memory limit*/)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -103,9 +103,9 @@ func SetupHamsterDeployment(f *framework.Framework, cpu, memory string, replicas
 | 
			
		|||
	d := NewHamsterDeploymentWithResources(f, cpuQuantity, memoryQuantity)
 | 
			
		||||
	d.Spec.Replicas = &replicas
 | 
			
		||||
	d, err := f.ClientSet.AppsV1().Deployments(f.Namespace.Name).Create(d)
 | 
			
		||||
	gomega.Expect(err).NotTo(gomega.HaveOccurred())
 | 
			
		||||
	gomega.Expect(err).NotTo(gomega.HaveOccurred(), "unexpected error when starting deployment creation")
 | 
			
		||||
	err = framework.WaitForDeploymentComplete(f.ClientSet, d)
 | 
			
		||||
	gomega.Expect(err).NotTo(gomega.HaveOccurred())
 | 
			
		||||
	gomega.Expect(err).NotTo(gomega.HaveOccurred(), "unexpected error waiting for deployment creation to finish")
 | 
			
		||||
	return d
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -234,18 +234,18 @@ func NewVPA(f *framework.Framework, name string, targetRef *autoscaling.CrossVer
 | 
			
		|||
func InstallVPA(f *framework.Framework, vpa *vpa_types.VerticalPodAutoscaler) {
 | 
			
		||||
	ns := f.Namespace.Name
 | 
			
		||||
	config, err := framework.LoadConfig()
 | 
			
		||||
	gomega.Expect(err).NotTo(gomega.HaveOccurred())
 | 
			
		||||
	gomega.Expect(err).NotTo(gomega.HaveOccurred(), "unexpected error loading framework")
 | 
			
		||||
	vpaClientSet := vpa_clientset.NewForConfigOrDie(config)
 | 
			
		||||
	vpaClient := vpaClientSet.AutoscalingV1beta2()
 | 
			
		||||
	_, err = vpaClient.VerticalPodAutoscalers(ns).Create(vpa)
 | 
			
		||||
	gomega.Expect(err).NotTo(gomega.HaveOccurred())
 | 
			
		||||
	gomega.Expect(err).NotTo(gomega.HaveOccurred(), "unexpected error creating VPA")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ParseQuantityOrDie parses quantity from string and dies with an error if
 | 
			
		||||
// unparsable.
 | 
			
		||||
func ParseQuantityOrDie(text string) resource.Quantity {
 | 
			
		||||
	quantity, err := resource.ParseQuantity(text)
 | 
			
		||||
	gomega.Expect(err).NotTo(gomega.HaveOccurred())
 | 
			
		||||
	gomega.Expect(err).NotTo(gomega.HaveOccurred(), "unexpected error parsing quantity: %s", text)
 | 
			
		||||
	return quantity
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -337,9 +337,9 @@ func GetEvictedPodsCount(currentPodSet PodSet, initialPodSet PodSet) int {
 | 
			
		|||
func CheckNoPodsEvicted(f *framework.Framework, initialPodSet PodSet) {
 | 
			
		||||
	time.Sleep(VpaEvictionTimeout)
 | 
			
		||||
	currentPodList, err := GetHamsterPods(f)
 | 
			
		||||
	gomega.Expect(err).NotTo(gomega.HaveOccurred())
 | 
			
		||||
	gomega.Expect(err).NotTo(gomega.HaveOccurred(), "unexpected error when listing hamster pods to check number of pod evictions")
 | 
			
		||||
	restarted := GetEvictedPodsCount(MakePodSet(currentPodList), initialPodSet)
 | 
			
		||||
	gomega.Expect(restarted).To(gomega.Equal(0))
 | 
			
		||||
	gomega.Expect(restarted).To(gomega.Equal(0), "there should be no pod evictions")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// WaitForVPAMatch pools VPA object until match function returns true. Returns
 | 
			
		||||
| 
						 | 
				
			
			@ -401,7 +401,7 @@ func installLimitRange(f *framework.Framework, minCpuLimit, minMemoryLimit, maxC
 | 
			
		|||
 | 
			
		||||
	if minMemoryLimit != nil || minCpuLimit != nil {
 | 
			
		||||
		lrItem := apiv1.LimitRangeItem{
 | 
			
		||||
			Type: apiv1.LimitTypeContainer,
 | 
			
		||||
			Type: lrType,
 | 
			
		||||
			Min:  apiv1.ResourceList{},
 | 
			
		||||
		}
 | 
			
		||||
		if minCpuLimit != nil {
 | 
			
		||||
| 
						 | 
				
			
			@ -413,7 +413,7 @@ func installLimitRange(f *framework.Framework, minCpuLimit, minMemoryLimit, maxC
 | 
			
		|||
		lr.Spec.Limits = append(lr.Spec.Limits, lrItem)
 | 
			
		||||
	}
 | 
			
		||||
	_, err := f.ClientSet.CoreV1().LimitRanges(f.Namespace.Name).Create(lr)
 | 
			
		||||
	gomega.Expect(err).NotTo(gomega.HaveOccurred())
 | 
			
		||||
	gomega.Expect(err).NotTo(gomega.HaveOccurred(), "unexpected error when creating limit range")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// InstallLimitRangeWithMax installs a LimitRange with a maximum limit for CPU and memory.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -320,7 +320,8 @@ func getBoundaryRecommendation(recommendation apiv1.ResourceList, container apiv
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func applyPodLimitRange(resources []vpa_types.RecommendedContainerResources,
 | 
			
		||||
	pod *apiv1.Pod, limitRange apiv1.LimitRangeItem, resourceName apiv1.ResourceName) []vpa_types.RecommendedContainerResources {
 | 
			
		||||
	pod *apiv1.Pod, limitRange apiv1.LimitRangeItem, resourceName apiv1.ResourceName,
 | 
			
		||||
	fieldGetter func(vpa_types.RecommendedContainerResources) *apiv1.ResourceList) []vpa_types.RecommendedContainerResources {
 | 
			
		||||
	minLimit := limitRange.Min[resourceName]
 | 
			
		||||
	maxLimit := limitRange.Max[resourceName]
 | 
			
		||||
	defaultLimit := limitRange.Default[resourceName]
 | 
			
		||||
| 
						 | 
				
			
			@ -332,7 +333,7 @@ func applyPodLimitRange(resources []vpa_types.RecommendedContainerResources,
 | 
			
		|||
		}
 | 
			
		||||
		limit := container.Resources.Limits[resourceName]
 | 
			
		||||
		request := container.Resources.Requests[resourceName]
 | 
			
		||||
		recommendation := resources[i].Target[resourceName]
 | 
			
		||||
		recommendation := (*fieldGetter(resources[i]))[resourceName]
 | 
			
		||||
		containerLimit, _ := getProportionalResourceLimit(resourceName, &limit, &request, &recommendation, &defaultLimit)
 | 
			
		||||
		if containerLimit != nil {
 | 
			
		||||
			sumLimit.Add(*containerLimit)
 | 
			
		||||
| 
						 | 
				
			
			@ -345,9 +346,9 @@ func applyPodLimitRange(resources []vpa_types.RecommendedContainerResources,
 | 
			
		|||
 | 
			
		||||
	if minLimit.Cmp(sumRecommendation) > 0 {
 | 
			
		||||
		for i := range pod.Spec.Containers {
 | 
			
		||||
			limit := resources[i].Target[resourceName]
 | 
			
		||||
			cappedContainerRequest, _ := scaleQuantityProportionally(&limit, &sumRecommendation, &minLimit)
 | 
			
		||||
			resources[i].Target[resourceName] = *cappedContainerRequest
 | 
			
		||||
			request := (*fieldGetter(resources[i]))[resourceName]
 | 
			
		||||
			cappedContainerRequest, _ := scaleQuantityProportionally(&request, &sumRecommendation, &minLimit)
 | 
			
		||||
			(*fieldGetter(resources[i]))[resourceName] = *cappedContainerRequest
 | 
			
		||||
		}
 | 
			
		||||
		return resources
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -376,7 +377,17 @@ func (c *cappingRecommendationProcessor) capProportionallyToPodLimitRange(
 | 
			
		|||
	if podLimitRange == nil {
 | 
			
		||||
		return containerRecommendations, nil
 | 
			
		||||
	}
 | 
			
		||||
	containerRecommendations = applyPodLimitRange(containerRecommendations, pod, *podLimitRange, apiv1.ResourceCPU)
 | 
			
		||||
	containerRecommendations = applyPodLimitRange(containerRecommendations, pod, *podLimitRange, apiv1.ResourceMemory)
 | 
			
		||||
	getTarget := func(rl vpa_types.RecommendedContainerResources) *apiv1.ResourceList { return &rl.Target }
 | 
			
		||||
	getUpper := func(rl vpa_types.RecommendedContainerResources) *apiv1.ResourceList { return &rl.UpperBound }
 | 
			
		||||
	getLower := func(rl vpa_types.RecommendedContainerResources) *apiv1.ResourceList { return &rl.LowerBound }
 | 
			
		||||
 | 
			
		||||
	containerRecommendations = applyPodLimitRange(containerRecommendations, pod, *podLimitRange, apiv1.ResourceCPU, getUpper)
 | 
			
		||||
	containerRecommendations = applyPodLimitRange(containerRecommendations, pod, *podLimitRange, apiv1.ResourceMemory, getUpper)
 | 
			
		||||
 | 
			
		||||
	containerRecommendations = applyPodLimitRange(containerRecommendations, pod, *podLimitRange, apiv1.ResourceCPU, getTarget)
 | 
			
		||||
	containerRecommendations = applyPodLimitRange(containerRecommendations, pod, *podLimitRange, apiv1.ResourceMemory, getTarget)
 | 
			
		||||
 | 
			
		||||
	containerRecommendations = applyPodLimitRange(containerRecommendations, pod, *podLimitRange, apiv1.ResourceCPU, getLower)
 | 
			
		||||
	containerRecommendations = applyPodLimitRange(containerRecommendations, pod, *podLimitRange, apiv1.ResourceMemory, getLower)
 | 
			
		||||
	return containerRecommendations, nil
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -489,7 +489,7 @@ func TestApplyPodLimitRange(t *testing.T) {
 | 
			
		|||
			},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "cap mem request to min",
 | 
			
		||||
			name: "cap mem request to pod min",
 | 
			
		||||
			resources: []vpa_types.RecommendedContainerResources{
 | 
			
		||||
				{
 | 
			
		||||
					ContainerName: "container1",
 | 
			
		||||
| 
						 | 
				
			
			@ -533,7 +533,7 @@ func TestApplyPodLimitRange(t *testing.T) {
 | 
			
		|||
			limitRange: apiv1.LimitRangeItem{
 | 
			
		||||
				Type: apiv1.LimitTypePod,
 | 
			
		||||
				Max: apiv1.ResourceList{
 | 
			
		||||
					apiv1.ResourceCPU: resource.MustParse("10G"),
 | 
			
		||||
					apiv1.ResourceMemory: resource.MustParse("10G"),
 | 
			
		||||
				},
 | 
			
		||||
				Min: apiv1.ResourceList{
 | 
			
		||||
					apiv1.ResourceMemory: resource.MustParse("4G"),
 | 
			
		||||
| 
						 | 
				
			
			@ -556,9 +556,10 @@ func TestApplyPodLimitRange(t *testing.T) {
 | 
			
		|||
			},
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
	getTarget := func(rl vpa_types.RecommendedContainerResources) *apiv1.ResourceList { return &rl.Target }
 | 
			
		||||
	for _, tc := range tests {
 | 
			
		||||
		t.Run(tc.name, func(t *testing.T) {
 | 
			
		||||
			got := applyPodLimitRange(tc.resources, &tc.pod, tc.limitRange, tc.resourceName)
 | 
			
		||||
			got := applyPodLimitRange(tc.resources, &tc.pod, tc.limitRange, tc.resourceName, getTarget)
 | 
			
		||||
			assert.Equal(t, tc.expect, got)
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue