@@ -20,59 +20,31 @@ type RecResult struct {
2020 ScaleDownLocking bool
2121}
2222
23- func GetRecommendation (ctx context.Context , workload * workload.State , recommenders []Interface ) (* tfv1.Resources , error ) {
24- recResults := map [string ]* RecResult {}
25- for _ , recommender := range recommenders {
26- result , err := recommender .Recommend (ctx , workload )
27- if err != nil {
28- return nil , fmt .Errorf ("failed to get recommendation from %s: %v" , recommender .Name (), err )
29- }
30- if result != nil {
31- recResults [recommender .Name ()] = result
32- }
33- }
23+ type recommenderToRecResult map [string ]* RecResult
3424
35- if len (recResults ) <= 0 {
36- return nil , nil
37- }
38-
39- resources := getResourcesFromRecResults (recResults )
40- if resources != nil {
41- curRes := workload .GetCurrentResourcesSpec ()
42- // If a resource value is zero, replace it with current value
43- if resources .Requests .Tflops .IsZero () || resources .Limits .Tflops .IsZero () {
44- resources .Requests .Tflops = curRes .Requests .Tflops
45- resources .Limits .Tflops = curRes .Limits .Tflops
46- }
47-
48- if resources .Requests .Vram .IsZero () || resources .Limits .Vram .IsZero () {
49- resources .Requests .Vram = curRes .Requests .Vram
50- resources .Limits .Vram = curRes .Limits .Vram
51- }
25+ func (r recommenderToRecResult ) generateRecommendation () * tfv1.Resources {
26+ if len (r ) == 0 {
27+ return nil
5228 }
5329
54- return resources , nil
55- }
56-
57- func getResourcesFromRecResults (recResults map [string ]* RecResult ) * tfv1.Resources {
58- targetRes := & tfv1.Resources {}
30+ recommendation := & tfv1.Resources {}
5931 minRes := & tfv1.Resources {}
60- for _ , rec := range recResults {
61- if ! rec .HasApplied {
62- mergeResourcesByLargerRequests (targetRes , & rec .Resources )
32+ for _ , result := range r {
33+ if ! result .HasApplied {
34+ mergeResourcesByLargerRequests (recommendation , & result .Resources )
6335 }
64- if rec .ScaleDownLocking {
65- mergeResourcesByLargerRequests (minRes , & rec .Resources )
36+ if result .ScaleDownLocking {
37+ mergeResourcesByLargerRequests (minRes , & result .Resources )
6638 }
6739 }
6840
69- if targetRes .IsZero () ||
70- (targetRes .Requests .Tflops .Cmp (minRes .Requests .Tflops ) < 0 &&
71- targetRes .Requests .Vram .Cmp (minRes .Requests .Vram ) < 0 ) {
41+ if recommendation .IsZero () ||
42+ (recommendation .Requests .Tflops .Cmp (minRes .Requests .Tflops ) < 0 &&
43+ recommendation .Requests .Vram .Cmp (minRes .Requests .Vram ) < 0 ) {
7244 return nil
7345 }
7446
75- return targetRes
47+ return recommendation
7648}
7749
7850func mergeResourcesByLargerRequests (src * tfv1.Resources , target * tfv1.Resources ) {
@@ -85,3 +57,33 @@ func mergeResourcesByLargerRequests(src *tfv1.Resources, target *tfv1.Resources)
8557 src .Limits .Vram = target .Limits .Vram
8658 }
8759}
60+
61+ func GetRecommendation (ctx context.Context , workload * workload.State , recommenders []Interface ) (* tfv1.Resources , error ) {
62+ recResults := make (recommenderToRecResult )
63+ for _ , recommender := range recommenders {
64+ result , err := recommender .Recommend (ctx , workload )
65+ if err != nil {
66+ return nil , fmt .Errorf ("failed to get recommendation from %s: %v" , recommender .Name (), err )
67+ }
68+ if result != nil {
69+ recResults [recommender .Name ()] = result
70+ }
71+ }
72+
73+ recommendation := recResults .generateRecommendation ()
74+ if recommendation != nil {
75+ curRes := workload .GetCurrentResourcesSpec ()
76+ // If a resource value is zero, replace it with current value
77+ if recommendation .Requests .Tflops .IsZero () || recommendation .Limits .Tflops .IsZero () {
78+ recommendation .Requests .Tflops = curRes .Requests .Tflops
79+ recommendation .Limits .Tflops = curRes .Limits .Tflops
80+ }
81+
82+ if recommendation .Requests .Vram .IsZero () || recommendation .Limits .Vram .IsZero () {
83+ recommendation .Requests .Vram = curRes .Requests .Vram
84+ recommendation .Limits .Vram = curRes .Limits .Vram
85+ }
86+ }
87+
88+ return recommendation , nil
89+ }
0 commit comments