func (pi *PodInject) execute(ipd *InjectProcessData) admission.Response {
	ipd.injectFileds.Inject(ipd.pod)
	ipd.injectFileds.injectSucceedAnnotation(&ipd.pod.Annotations)
	log.Info("inject successfully!")
	return PatchReq(ipd.pod, ipd.req)
}
PodInject will inject all fields to the pod
package injector
import (
	"context"
	"encoding/json"
	"net/http"
	"strings"
	"github.com/go-logr/logr"
	corev1 "k8s.io/api/core/v1"
	"sigs.k8s.io/controller-runtime/pkg/client"
	"sigs.k8s.io/controller-runtime/pkg/webhook/admission"
)
type Injection interface {
	execute(*InjectProcessData) admission.Response
	setNext(Injection)
}
type InjectProcessData struct {
	injectFileds      *SidecarInjectField
	annotation        *Annotations
	annotationOverlay *AnnotationOverlay
	pod               *corev1.Pod
	req               admission.Request
	log               logr.Logger
	kubeclient        client.Client
	ctx               context.Context
}
func PatchReq(pod *corev1.Pod, req admission.Request) admission.Response {
	marshaledPod, err := json.Marshal(pod)
	if err != nil {
		return admission.Errored(http.StatusInternalServerError, err)
	}
	return admission.PatchResponseFromRaw(req.Object.Raw, marshaledPod)
}
type GetStrategy struct {
	next Injection
}
func (gs *GetStrategy) execute(ipd *InjectProcessData) admission.Response {
	ipd.injectFileds.GetInjectStrategy(*ipd.annotation, &ipd.pod.ObjectMeta.Labels, &ipd.pod.ObjectMeta.Annotations)
	if !ipd.injectFileds.NeedInject {
		log.Info("don't inject agent")
		return admission.Allowed("ok")
	}
	return gs.next.execute(ipd)
}
func (gs *GetStrategy) setNext(next Injection) {
	gs.next = next
}
type OverlaySidecar struct {
	next Injection
}
func (os *OverlaySidecar) execute(ipd *InjectProcessData) admission.Response {
	if !ipd.injectFileds.OverlaySidecar(*ipd.annotation, ipd.annotationOverlay, &ipd.pod.ObjectMeta.Annotations) {
		return PatchReq(ipd.pod, ipd.req)
	}
	return os.next.execute(ipd)
}
func (os *OverlaySidecar) setNext(next Injection) {
	os.next = next
}
type OverlayAgent struct {
	next Injection
}
func (oa *OverlayAgent) execute(ipd *InjectProcessData) admission.Response {
	if !ipd.injectFileds.AgentOverlay {
		return oa.next.execute(ipd)
	}
	if !ipd.injectFileds.OverlayAgent(*ipd.annotation, ipd.annotationOverlay, &ipd.pod.ObjectMeta.Annotations) {
		ipd.log.Info("overlay agent config error!please look the error annotation!")
		return PatchReq(ipd.pod, ipd.req)
	}
	return oa.next.execute(ipd)
}
func (oa *OverlayAgent) setNext(next Injection) {
	oa.next = next
}
type OverlayPlugins struct {
	next Injection
}
func (op *OverlayPlugins) execute(ipd *InjectProcessData) admission.Response {
	if !ipd.injectFileds.AgentOverlay {
		return op.next.execute(ipd)
	}
	ipd.injectFileds.OverlayPlugins(&ipd.pod.ObjectMeta.Annotations)
	if ipd.injectFileds.JvmAgentConfigStr != "" {
		ipd.injectFileds.Env.Value = strings.Join([]string{ipd.injectFileds.Env.Value, ipd.injectFileds.JvmAgentConfigStr}, "=")
	}
	ipd.injectFileds.OverlayOptional(&ipd.pod.ObjectMeta.Annotations)
	return op.next.execute(ipd)
}
func (op *OverlayPlugins) setNext(next Injection) {
	op.next = next
}
type GetConfigmap struct {
	next Injection
}
func (gc *GetConfigmap) execute(ipd *InjectProcessData) admission.Response {
	if !ipd.injectFileds.CreateConfigmap(ipd.ctx, ipd.kubeclient, ipd.req.Namespace, &ipd.pod.ObjectMeta.Annotations) {
		return PatchReq(ipd.pod, ipd.req)
	}
	return gc.next.execute(ipd)
}
func (gc *GetConfigmap) setNext(next Injection) {
	gc.next = next
}
type PodInject struct {
	next Injection
}