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  }