Skip to content

Commit 3a20d12

Browse files
committed
fix bug with getting pg from pod
Signed-off-by: lucming <[email protected]>
1 parent 169d1aa commit 3a20d12

File tree

1 file changed

+58
-6
lines changed

1 file changed

+58
-6
lines changed

pkg/apis/helpers/helpers.go

Lines changed: 58 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,17 @@ package helpers
1919
import (
2020
"context"
2121
"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"
2227
"net"
2328
"net/http"
2429
"os"
2530
"os/signal"
2631
"reflect"
32+
"strings"
2733
"syscall"
2834
"time"
2935

@@ -163,23 +169,69 @@ func DeleteSecret(job *vcbatch.Job, kubeClients kubernetes.Interface, secretName
163169
}
164170

165171
// 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)
167180
pgName := vcbatch.PodgroupNamePrefix
168-
169181
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)
173185
return pgName
174186
}
175187
}
176188
}
177-
178189
pgName += string(pod.UID)
179190

180191
return pgName
181192
}
182193

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+
183235
// StartHealthz register healthz interface.
184236
func StartHealthz(healthzBindAddress, name string) error {
185237
listener, err := net.Listen("tcp", healthzBindAddress)

0 commit comments

Comments
 (0)