github.com/gocrane/crane@v0.11.0/pkg/utils/pod_template.go (about) 1 package utils 2 3 import ( 4 "context" 5 "encoding/json" 6 "fmt" 7 8 appsv1 "k8s.io/api/apps/v1" 9 v1 "k8s.io/api/core/v1" 10 "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" 11 "k8s.io/apimachinery/pkg/runtime/schema" 12 "k8s.io/klog/v2" 13 "sigs.k8s.io/controller-runtime/pkg/client" 14 ) 15 16 func GetPodTemplate(context context.Context, namespace string, name string, kind string, apiVersion string, kubeClient client.Client) (*v1.PodTemplateSpec, error) { 17 templateSpec := &v1.PodTemplateSpec{} 18 19 key := client.ObjectKey{ 20 Name: name, 21 Namespace: namespace, 22 } 23 gv, err := schema.ParseGroupVersion(apiVersion) 24 if err != nil { 25 return nil, err 26 } 27 if kind == "Deployment" && gv.Group == appsv1.GroupName { 28 deployment := &appsv1.Deployment{} 29 err = kubeClient.Get(context, key, deployment) 30 if err != nil { 31 return nil, err 32 } 33 templateSpec = &deployment.Spec.Template 34 } else if kind == "StatefulSet" && gv.Group == appsv1.GroupName { 35 statefulSet := &appsv1.StatefulSet{} 36 err = kubeClient.Get(context, key, statefulSet) 37 if err != nil { 38 return nil, err 39 } 40 templateSpec = &statefulSet.Spec.Template 41 } else { 42 unstructed := &unstructured.Unstructured{} 43 unstructed.SetAPIVersion(apiVersion) 44 unstructed.SetKind(kind) 45 err = kubeClient.Get(context, key, unstructed) 46 if err != nil { 47 return nil, err 48 } 49 50 template, found, err := unstructured.NestedMap(unstructed.Object, "spec", "template") 51 if !found || err != nil { 52 return nil, fmt.Errorf("get template from unstructed object %s failed. ", klog.KObj(unstructed)) 53 } 54 55 templateBytes, err := json.Marshal(template) 56 if err != nil { 57 return nil, fmt.Errorf("marshal unstructed object failed: %v. ", err) 58 } 59 60 err = json.Unmarshal(templateBytes, templateSpec) 61 if err != nil { 62 return nil, fmt.Errorf("unmarshal template bytes failed: %v. ", err) 63 } 64 } 65 66 return templateSpec, nil 67 }