@@ -11,6 +11,7 @@ import (
1111 "k8s.io/apimachinery/pkg/api/resource"
1212 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1313 unstructuredv1 "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
14+ "k8s.io/apimachinery/pkg/labels"
1415 "k8s.io/apimachinery/pkg/runtime"
1516 "k8s.io/apimachinery/pkg/runtime/schema"
1617
@@ -53,35 +54,60 @@ func NewTargetController(c client.Interface, ref *autoscalingv1.CrossVersionObje
5354 }
5455 kind := obj .GetKind ()
5556
57+ isWellKnown := false
58+
5659 switch wellKnownControllerKind (kind ) {
5760 case cj , ds , deploy , job , rs , rc , sts , ro :
61+ isWellKnown = true
5862 case node :
5963 // Some pods specify nodes as their owners,
6064 // but they aren't valid controllers that
6165 // the VPA supports, so we just skip them.
6266 return nil , fmt .Errorf ("node is not a valid target" )
6367 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
7669 }
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+ }
84109 }
110+
85111 // The PodSpec template defined by a controller might not represent
86112 // the final spec of the pods. For example, a LimitRanger controller
87113 // could change the spec of pods to set default resource requests and
@@ -104,7 +130,7 @@ func NewTargetController(c client.Interface, ref *autoscalingv1.CrossVersionObje
104130 }
105131 if len (pods ) != 0 {
106132 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 ) {
108134 tc .podSpec = & p .Spec
109135 }
110136 }
0 commit comments