@@ -19,11 +19,17 @@ package helpers
19
19
import (
20
20
"context"
21
21
"fmt"
22
+ "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
23
+ "k8s.io/apimachinery/pkg/runtime"
24
+ "k8s.io/apimachinery/pkg/runtime/schema"
25
+ "k8s.io/client-go/dynamic"
26
+ "k8s.io/client-go/restmapper"
22
27
"net"
23
28
"net/http"
24
29
"os"
25
30
"os/signal"
26
31
"reflect"
32
+ "strings"
27
33
"syscall"
28
34
"time"
29
35
@@ -163,23 +169,69 @@ func DeleteSecret(job *vcbatch.Job, kubeClients kubernetes.Interface, secretName
163
169
}
164
170
165
171
// GeneratePodgroupName generate podgroup name of normal pod.
166
- func GeneratePodgroupName (pod * v1.Pod ) string {
172
+ func GeneratePodgroupName (dyClient dynamic.Interface , kubeClient kubernetes.Interface , pod * v1.Pod ) string {
173
+ unstructuredPod , err := runtime .DefaultUnstructuredConverter .ToUnstructured (pod )
174
+ if err != nil {
175
+ klog .Errorf ("failed to convert pod to unstructed.error=%v" , err )
176
+ return ""
177
+ }
178
+ owners := make ([]metav1.OwnerReference , 0 )
179
+ GetOutestOwner (dyClient , kubeClient , & unstructured.Unstructured {unstructuredPod }, & owners )
167
180
pgName := vcbatch .PodgroupNamePrefix
168
-
169
181
if len (pod .OwnerReferences ) != 0 {
170
- for _ , ownerReference := range pod . OwnerReferences {
171
- if ownerReference .Controller != nil && * ownerReference .Controller {
172
- pgName += string (ownerReference .UID )
182
+ for _ , owner := range owners {
183
+ if owner .Controller != nil && * owner .Controller {
184
+ pgName += string (owner .UID )
173
185
return pgName
174
186
}
175
187
}
176
188
}
177
-
178
189
pgName += string (pod .UID )
179
190
180
191
return pgName
181
192
}
182
193
194
+ func GetOutestOwner (dyClient dynamic.Interface , kubeClient kubernetes.Interface , object * unstructured.Unstructured , result * []metav1.OwnerReference ) {
195
+ owners := object .GetOwnerReferences ()
196
+ if len (owners ) == 0 {
197
+ ref := metav1 .NewControllerRef (object , object .GroupVersionKind ())
198
+ * result = append (* result , * ref )
199
+ }
200
+
201
+ for _ , owner := range owners {
202
+ if owner .Controller == nil {
203
+ continue
204
+ }
205
+ apiversionList := strings .Split (owner .APIVersion , "/" )
206
+ var group , version string
207
+ if len (apiversionList ) == 2 {
208
+ group , version = apiversionList [0 ], apiversionList [1 ]
209
+ } else if len (apiversionList ) == 1 {
210
+ version = apiversionList [0 ]
211
+ }
212
+ gk := schema.GroupKind {
213
+ Group : group ,
214
+ Kind : owner .Kind ,
215
+ }
216
+
217
+ groupResources , err := restmapper .GetAPIGroupResources (kubeClient .Discovery ())
218
+ if err != nil {
219
+ klog .Errorf ("failed to get resouces(%s:%s)in ns(%s),error=%v" , gk .String (), owner .Name , object .GetNamespace ())
220
+ return
221
+ }
222
+ rm := restmapper .NewDiscoveryRESTMapper (groupResources )
223
+ mapping , err := rm .RESTMapping (gk , version )
224
+ parentObj , err := dyClient .Resource (mapping .Resource ).
225
+ Namespace (object .GetNamespace ()).
226
+ Get (context .Background (), owner .Name , metav1.GetOptions {})
227
+ if err != nil {
228
+ klog .Errorf ("failed to get resouces(%s:%s)in ns(%s),error=%v" , gk .String (), owner .Name , object .GetNamespace ())
229
+ return
230
+ }
231
+ GetOutestOwner (dyClient , kubeClient , parentObj , result )
232
+ }
233
+ }
234
+
183
235
// StartHealthz register healthz interface.
184
236
func StartHealthz (healthzBindAddress , name string ) error {
185
237
listener , err := net .Listen ("tcp" , healthzBindAddress )
0 commit comments