@@ -11,6 +11,7 @@ import (
11
11
"k8s.io/apimachinery/pkg/api/resource"
12
12
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
13
13
unstructuredv1 "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
14
+ "k8s.io/apimachinery/pkg/labels"
14
15
"k8s.io/apimachinery/pkg/runtime"
15
16
"k8s.io/apimachinery/pkg/runtime/schema"
16
17
@@ -53,35 +54,60 @@ func NewTargetController(c client.Interface, ref *autoscalingv1.CrossVersionObje
53
54
}
54
55
kind := obj .GetKind ()
55
56
57
+ isWellKnown := false
58
+
56
59
switch wellKnownControllerKind (kind ) {
57
60
case cj , ds , deploy , job , rs , rc , sts , ro :
61
+ isWellKnown = true
58
62
case node :
59
63
// Some pods specify nodes as their owners,
60
64
// but they aren't valid controllers that
61
65
// the VPA supports, so we just skip them.
62
66
return nil , fmt .Errorf ("node is not a valid target" )
63
67
default :
64
- return nil , fmt .Errorf ("unsupported target kind: %s" , kind )
65
- }
66
- tc := & TargetController {
67
- Name : obj .GetName (),
68
- Namespace : obj .GetNamespace (),
69
- GroupVersionKind : obj .GetObjectKind ().GroupVersionKind (),
70
- controllerKind : wellKnownControllerKind (kind ),
71
- controllerObj : obj ,
72
- }
73
- tc .podSpec , err = resolvePodSpec (obj )
74
- if err != nil {
75
- return nil , err
68
+ isWellKnown = false
76
69
}
77
- labelSelector , err := resolveLabelSelector (obj )
78
- if err != nil {
79
- return nil , err
80
- }
81
- selector , err := metav1 .LabelSelectorAsSelector (labelSelector )
82
- if err != nil {
83
- return nil , err
70
+ var tc * TargetController
71
+ var selector labels.Selector
72
+
73
+ if isWellKnown {
74
+ tc = & TargetController {
75
+ Name : obj .GetName (),
76
+ Namespace : obj .GetNamespace (),
77
+ GroupVersionKind : obj .GetObjectKind ().GroupVersionKind (),
78
+ controllerKind : wellKnownControllerKind (kind ),
79
+ controllerObj : obj ,
80
+ }
81
+ tc .podSpec , err = resolvePodSpec (obj )
82
+ if err != nil {
83
+ return nil , err
84
+ }
85
+
86
+ labelSelector , err := resolveLabelSelector (obj )
87
+ if err != nil {
88
+ return nil , err
89
+ }
90
+
91
+ selector , err = metav1 .LabelSelectorAsSelector (labelSelector )
92
+ if err != nil {
93
+ return nil , err
94
+ }
95
+
96
+ } else {
97
+ tc = & TargetController {
98
+ Name : obj .GetName (),
99
+ Namespace : obj .GetNamespace (),
100
+ GroupVersionKind : obj .GetObjectKind ().GroupVersionKind (),
101
+ controllerKind : wellKnownControllerKind (kind ),
102
+ controllerObj : obj ,
103
+ }
104
+ selector , err = c .GetLabelSelectorFromResource (tc .GroupVersionKind .GroupKind (), tc .Namespace , tc .Name )
105
+
106
+ if err != nil {
107
+ return nil , err
108
+ }
84
109
}
110
+
85
111
// The PodSpec template defined by a controller might not represent
86
112
// the final spec of the pods. For example, a LimitRanger controller
87
113
// could change the spec of pods to set default resource requests and
@@ -104,7 +130,7 @@ func NewTargetController(c client.Interface, ref *autoscalingv1.CrossVersionObje
104
130
}
105
131
if len (pods ) != 0 {
106
132
p := pods [0 ]
107
- if ! reflect .DeepEqual (p .Spec .Containers , tc .podSpec .Containers ) {
133
+ if tc . podSpec == nil || ! reflect .DeepEqual (p .Spec .Containers , tc .podSpec .Containers ) {
108
134
tc .podSpec = & p .Spec
109
135
}
110
136
}
0 commit comments