@@ -18,40 +18,126 @@ import (
1818 "github.com/adobe/kratos/metrics"
1919 . "github.com/onsi/ginkgo"
2020 . "github.com/onsi/gomega"
21+ corev1 "k8s.io/api/core/v1"
2122 "k8s.io/apimachinery/pkg/api/resource"
2223)
2324
25+ var noRequestedResources = map [string ]* corev1.ResourceList {
26+ "" : {
27+ corev1 .ResourceCPU : * resource .NewQuantity (0 , resource .DecimalSI ),
28+ corev1 .ResourceMemory : * resource .NewQuantity (0 , resource .BinarySI ),
29+ corev1 .ResourceStorage : * resource .NewQuantity (0 , resource .BinarySI ),
30+ },
31+ "nginx" : {
32+ corev1 .ResourceCPU : * resource .NewQuantity (0 , resource .DecimalSI ),
33+ corev1 .ResourceMemory : * resource .NewQuantity (0 , resource .BinarySI ),
34+ corev1 .ResourceStorage : * resource .NewQuantity (0 , resource .BinarySI ),
35+ },
36+ }
37+ var requestedResources = map [string ]* corev1.ResourceList {
38+ "" : {
39+ corev1 .ResourceCPU : * resource .NewQuantity (10 , resource .DecimalSI ),
40+ corev1 .ResourceMemory : * resource .NewQuantity (1000 , resource .BinarySI ),
41+ corev1 .ResourceStorage : * resource .NewQuantity (10 , resource .BinarySI ),
42+ },
43+ "nginx" : {
44+ corev1 .ResourceCPU : * resource .NewQuantity (10 , resource .DecimalSI ),
45+ corev1 .ResourceMemory : * resource .NewQuantity (1000 , resource .BinarySI ),
46+ corev1 .ResourceStorage : * resource .NewQuantity (10 , resource .BinarySI ),
47+ },
48+ }
49+
2450var _ = Describe ("ReplicaCalculator" , func () {
2551 It ("Not implemented target metric type" , func () {
2652 replicaCalculator := NewReplicaCalculator (0.1 )
2753
28- metricTarget := v1alpha1.MetricTarget {
29- Type : v1alpha1 .UtilizationMetricType ,
54+ scaleMetric := v1alpha1.ScaleMetric {
55+ Type : v1alpha1 .ExternalScaleMetricType ,
56+ Prometheus : & v1alpha1.PrometheusMetricSource {
57+ Target : v1alpha1.MetricTarget {
58+ Type : v1alpha1 .AverageValueMetricType ,
59+ AverageValue : resource .NewMilliQuantity (500 , resource .DecimalSI ),
60+ },
61+ },
3062 }
3163
32- _ , err := replicaCalculator .CalculateReplicas (1 , metricTarget , nil )
64+ _ , err := replicaCalculator .CalculateReplicas (1 , noRequestedResources , scaleMetric , nil )
3365
3466 Expect (err ).ToNot (BeNil (), "not implemented metric target should result in error" )
3567 })
3668
37- It ("Target value calculator" , func () {
69+ It ("Prometheus target value calculator" , func () {
3870 replicaCalculator := NewReplicaCalculator (0.1 )
3971
40- quantity , _ := resource .ParseQuantity ("5" )
41- metricTarget := v1alpha1.MetricTarget {
42- Type : v1alpha1 .ValueMetricType ,
43- Value : & quantity ,
72+ scaleMetric := v1alpha1.ScaleMetric {
73+ Type : v1alpha1 .PrometheusScaleMetricType ,
74+ Prometheus : & v1alpha1.PrometheusMetricSource {
75+ Target : v1alpha1.MetricTarget {
76+ Type : v1alpha1 .AverageValueMetricType ,
77+ AverageValue : resource .NewQuantity (5 , resource .DecimalSI ),
78+ },
79+ },
4480 }
4581
4682 metrics := []metrics.MetricValue {
47- metrics. MetricValue {
83+ {
4884 Value : 10 ,
4985 },
5086 }
51- replicas , err := replicaCalculator .CalculateReplicas (1 , metricTarget , metrics )
87+ replicas , err := replicaCalculator .CalculateReplicas (1 , noRequestedResources , scaleMetric , metrics )
5288
5389 Expect (err ).To (BeNil (), "no errors expected for valid arguments" )
54- Expect (replicas ).To (Equal (int32 (2 )), "wrong NR. of replicas" )
90+ Expect (replicas ).To (Equal (int32 (2 )), "wrong number of replicas" )
5591 })
5692
93+ It ("Resource target - no requests specified" , func () {
94+ replicaCalculator := NewReplicaCalculator (0.1 )
95+
96+ averageUtilization := int32 (50 )
97+ scaleMetric := v1alpha1.ScaleMetric {
98+ Type : v1alpha1 .ResourceScaleMetricType ,
99+ Resource : & v1alpha1.ResourceMetricSource {
100+ Name : corev1 .ResourceCPU ,
101+ Target : v1alpha1.MetricTarget {
102+ Type : v1alpha1 .UtilizationMetricType ,
103+ AverageUtilization : & averageUtilization ,
104+ },
105+ },
106+ }
107+
108+ metrics := []metrics.MetricValue {
109+ {
110+ Value : 10 ,
111+ },
112+ }
113+ _ , err := replicaCalculator .CalculateReplicas (1 , noRequestedResources , scaleMetric , metrics )
114+
115+ Expect (err ).ToNot (BeNil (), "should fail proposal for pods without requested resources" )
116+ })
117+
118+ It ("Resource target - value calculator" , func () {
119+ replicaCalculator := NewReplicaCalculator (0.1 )
120+
121+ averageUtilization := int32 (50 )
122+ scaleMetric := v1alpha1.ScaleMetric {
123+ Type : v1alpha1 .ResourceScaleMetricType ,
124+ Resource : & v1alpha1.ResourceMetricSource {
125+ Name : corev1 .ResourceCPU ,
126+ Target : v1alpha1.MetricTarget {
127+ Type : v1alpha1 .UtilizationMetricType ,
128+ AverageUtilization : & averageUtilization ,
129+ },
130+ },
131+ }
132+
133+ metrics := []metrics.MetricValue {
134+ {
135+ Value : 10 ,
136+ },
137+ }
138+ replicas , err := replicaCalculator .CalculateReplicas (1 , requestedResources , scaleMetric , metrics )
139+
140+ Expect (err ).To (BeNil (), "no errors expected for valid arguments" )
141+ Expect (replicas ).To (Equal (int32 (2 )), "wrong number of replicas" )
142+ })
57143})
0 commit comments