From 52e625eb8cd7b33bf03f3fbbeac80719607c3602 Mon Sep 17 00:00:00 2001 From: mlycore Date: Fri, 5 Aug 2022 14:35:07 +0800 Subject: [PATCH 1/3] refactor: injection Signed-off-by: mlycore --- pisa-controller/pkg/webhook/injection.go | 137 +++++++++++++++-------- 1 file changed, 93 insertions(+), 44 deletions(-) diff --git a/pisa-controller/pkg/webhook/injection.go b/pisa-controller/pkg/webhook/injection.go index 00734016..c142e1de 100644 --- a/pisa-controller/pkg/webhook/injection.go +++ b/pisa-controller/pkg/webhook/injection.go @@ -15,6 +15,7 @@ package webhook import ( + "errors" "fmt" "net/http" "os" @@ -37,32 +38,47 @@ var ( ) const ( - SidecarNamePisaProxy = "pisa-proxy" - EnvPisaProxyAdminListenHost = "PISA_PROXY_ADMIN_LISTEN_HOST" - EnvPisaProxyAdminListenPort = "PISA_PROXY_ADMIN_LISTEN_PORT" - EnvPisaProxyLoglevel = "PISA_PROXY_ADMIN_LOG_LEVEL" + pisaProxyContainerName = "pisa-proxy" + + EnvPisaProxyAdminListenHost = "PISA_PROXY_ADMIN_LISTEN_HOST" + EnvPisaProxyAdminListenPort = "PISA_PROXY_ADMIN_LISTEN_PORT" + EnvPisaProxyLoglevel = "PISA_PROXY_ADMIN_LOG_LEVEL" + EnvPisaProxyImage = "PISA_PROXY_IMAGE" + EnvPisaControllerService = "PISA_CONTROLLER_SERVIE" + EnvPisaControllerNamespace = "PISA_CONTROLLER_NAMESPACE" + DefaultPisaProxyAdminListenHost = "0.0.0.0" DefaultPisaProxyAdminListenPort = 5591 DefaultPisaProxyLoglevel = "INFO" + DefaultPisaProxyImage = "pisanixio/proxy:latest" + DefaultPisaControllerService = "default" + DefaultPisaControllerNamespace = "default" ) func init() { - pisaProxyImage = os.Getenv("PISA_PROXY_IMAGE") - if pisaProxyImage == "" { - pisaProxyImage = "pisanixio/proxy:latest" + if pisaProxyImage = os.Getenv(EnvPisaProxyImage); pisaProxyImage == "" { + pisaProxyImage = DefaultPisaProxyImage + } + + if pisaControllerService = os.Getenv(EnvPisaControllerService); pisaControllerService == "" { + pisaControllerService = DefaultPisaControllerService + } + if pisaControllerNamespace = os.Getenv(EnvPisaControllerNamespace); pisaControllerNamespace == "" { + pisaControllerNamespace = DefaultPisaControllerNamespace } - pisaControllerService = os.Getenv("PISA_CONTROLLER_SERVICE") - pisaControllerNamespace = os.Getenv("PISA_CONTROLLER_NAMESPACE") + if host := os.Getenv(EnvPisaProxyAdminListenHost); host == "" { pisaProxyAdminListenHost = DefaultPisaProxyAdminListenHost } else { pisaProxyAdminListenHost = host } + if port, err := strconv.Atoi(os.Getenv(EnvPisaProxyAdminListenPort)); port <= 0 || err != nil { pisaProxyAdminListenPort = DefaultPisaProxyAdminListenPort } else { pisaProxyAdminListenPort = uint32(port) } + if lv := os.Getenv(EnvPisaProxyLoglevel); lv == "" { pisaProxyLoglevel = DefaultPisaProxyLoglevel } else { @@ -96,7 +112,12 @@ const ( "value": "%s" },{ "name": "PISA_DEPLOYED_NAMESPACE", - "value": "%s" + "valueFrom": { + "fieldRef": { + "apiVersion": "v1", + "fieldPath": "metadata.namespace" + } + } },{ "name": "PISA_DEPLOYED_NAME", "value": "%s" @@ -130,74 +151,102 @@ type PodInfo struct { func InjectSidecar(ctx *gin.Context) { rawData, err := ctx.GetRawData() - if err != nil { + if err != nil || len(rawData) == 0 { log.Error("get body raw data error.") - ctx.JSON(http.StatusBadRequest, toV1AdmissionResponse(err)) + ctx.JSON(http.StatusBadRequest, NewV1AdmissionResponseFromError(err)) } - if len(rawData) == 0 { - log.Errorf("get a empty body!") + + ar := &v1.AdmissionReview{} + if _, _, err := deserializer.Decode(rawData, nil, ar); err != nil { + log.Errorf("can not decode body to AdmissionReview: %v", err) + ctx.JSON(http.StatusBadRequest, NewV1AdmissionResponseFromError(err)) return } - ar := v1.AdmissionReview{} - if _, _, err := deserializer.Decode(rawData, nil, &ar); err != nil { - log.Errorf("can't decode body to AdmissionReview: %v", err) - ctx.JSON(http.StatusBadRequest, toV1AdmissionResponse(err)) + if err = injection(ar); err != nil { + log.Errorf("injection error: %v", err) + ctx.JSON(http.StatusInternalServerError, NewV1AdmissionResponseFromError(err)) return } - shouldPatchPod := func(pod *corev1.Pod) bool { - return !hasContainer(pod.Spec.Containers, SidecarNamePisaProxy) - } + + log.Infof("mutating Success %s/%s", ar.Request.Namespace, ar.Request.Name) + ctx.JSON(http.StatusOK, ar) +} + +func injection(ar *v1.AdmissionReview) error { podinfo := &PodInfo{} - _ = json.Unmarshal(ar.Request.Object.Raw, podinfo) + err := json.Unmarshal(ar.Request.Object.Raw, podinfo) + if err != nil { + return err + } + + //FIXME: Considering only the Pod whose name contains two segments as suffix. + // e.g. the Pod of Deployment podSlice := strings.Split(podinfo.Metadata.GenerateName, "-") podSlice = podSlice[:len(podSlice)-2] patch := fmt.Sprintf(podsSidecarPatch, pisaProxyImage, - SidecarNamePisaProxy, + pisaProxyContainerName, pisaProxyAdminListenPort, pisaControllerService, pisaControllerNamespace, - ar.Request.Namespace, strings.Join(podSlice, "-"), pisaProxyAdminListenHost, pisaProxyAdminListenPort, pisaProxyLoglevel, ) - ar.Response = applyPodPatch(ar, shouldPatchPod, patch) - log.Infof("mutating Success %v", patch) - ctx.JSON(http.StatusOK, ar) + if err = applyPodPatch(ar, patch); err != nil { + return err + } + + return nil } -func applyPodPatch(ar v1.AdmissionReview, shouldPatchPod func(*corev1.Pod) bool, patch string) *v1.AdmissionResponse { +func applyPodPatch(ar *v1.AdmissionReview, patch string) error { log.Info("mutating pods") - podResource := metav1.GroupVersionResource{Group: "", Version: "v1", Resource: "pods"} - if ar.Request.Resource != podResource { - log.Errorf("expect resource to be %s", podResource) - return nil - } - raw := ar.Request.Object.Raw - pod := corev1.Pod{} - if _, _, err := deserializer.Decode(raw, nil, &pod); err != nil { - log.Error(err) - return toV1AdmissionResponse(err) + pod := retrievePodFromAdmissionRequest(ar.Request) + if pod == nil { + return errors.New("retrieve pod from admission request error") } + log.Infof("pod %v", pod) - reviewResponse := v1.AdmissionResponse{} - reviewResponse.UID = ar.Request.UID - reviewResponse.Allowed = true - if shouldPatchPod(&pod) { + + reviewResponse := &v1.AdmissionResponse{ + UID: ar.Request.UID, + Allowed: true, + } + + if !hasContainer(pod.Spec.Containers, pisaProxyContainerName) { reviewResponse.Patch = []byte(patch) pt := v1.PatchTypeJSONPatch reviewResponse.PatchType = &pt } - return &reviewResponse + + ar.Response = reviewResponse + + return nil +} + +func retrievePodFromAdmissionRequest(req *v1.AdmissionRequest) *corev1.Pod { + gvr := metav1.GroupVersionResource{Group: "", Version: "v1", Resource: "pods"} + if req.Resource != gvr { + log.Errorf("expect resource to be %s", gvr) + return nil + } + + pod := &corev1.Pod{} + if _, _, err := deserializer.Decode(req.Object.Raw, nil, pod); err != nil { + log.Error(err) + return nil + } + + return pod } -func toV1AdmissionResponse(err error) *v1.AdmissionResponse { +func NewV1AdmissionResponseFromError(err error) *v1.AdmissionResponse { return &v1.AdmissionResponse{ Result: &metav1.Status{ Message: err.Error(), From 32a80bf548b5acbb8677655c3a4fdbba7f84d569 Mon Sep 17 00:00:00 2001 From: mlycore Date: Fri, 5 Aug 2022 18:01:05 +0800 Subject: [PATCH 2/3] refactor: refactor injection Signed-off-by: mlycore --- pisa-controller/pkg/webhook/injection.go | 235 ++++++++--------------- pisa-controller/pkg/webhook/server.go | 2 +- pisa-controller/pkg/webhook/types.go | 125 ++++++++++++ 3 files changed, 201 insertions(+), 161 deletions(-) create mode 100644 pisa-controller/pkg/webhook/types.go diff --git a/pisa-controller/pkg/webhook/injection.go b/pisa-controller/pkg/webhook/injection.go index c142e1de..df6ec991 100644 --- a/pisa-controller/pkg/webhook/injection.go +++ b/pisa-controller/pkg/webhook/injection.go @@ -18,8 +18,6 @@ import ( "errors" "fmt" "net/http" - "os" - "strconv" "strings" "github.com/gin-gonic/gin" @@ -29,112 +27,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/serializer" - "k8s.io/apimachinery/pkg/util/json" -) - -var ( - pisaProxyImage, pisaControllerService, pisaControllerNamespace, pisaProxyAdminListenHost, pisaProxyLoglevel string - pisaProxyAdminListenPort uint32 -) - -const ( - pisaProxyContainerName = "pisa-proxy" - - EnvPisaProxyAdminListenHost = "PISA_PROXY_ADMIN_LISTEN_HOST" - EnvPisaProxyAdminListenPort = "PISA_PROXY_ADMIN_LISTEN_PORT" - EnvPisaProxyLoglevel = "PISA_PROXY_ADMIN_LOG_LEVEL" - EnvPisaProxyImage = "PISA_PROXY_IMAGE" - EnvPisaControllerService = "PISA_CONTROLLER_SERVIE" - EnvPisaControllerNamespace = "PISA_CONTROLLER_NAMESPACE" - - DefaultPisaProxyAdminListenHost = "0.0.0.0" - DefaultPisaProxyAdminListenPort = 5591 - DefaultPisaProxyLoglevel = "INFO" - DefaultPisaProxyImage = "pisanixio/proxy:latest" - DefaultPisaControllerService = "default" - DefaultPisaControllerNamespace = "default" -) - -func init() { - if pisaProxyImage = os.Getenv(EnvPisaProxyImage); pisaProxyImage == "" { - pisaProxyImage = DefaultPisaProxyImage - } - - if pisaControllerService = os.Getenv(EnvPisaControllerService); pisaControllerService == "" { - pisaControllerService = DefaultPisaControllerService - } - if pisaControllerNamespace = os.Getenv(EnvPisaControllerNamespace); pisaControllerNamespace == "" { - pisaControllerNamespace = DefaultPisaControllerNamespace - } - - if host := os.Getenv(EnvPisaProxyAdminListenHost); host == "" { - pisaProxyAdminListenHost = DefaultPisaProxyAdminListenHost - } else { - pisaProxyAdminListenHost = host - } - - if port, err := strconv.Atoi(os.Getenv(EnvPisaProxyAdminListenPort)); port <= 0 || err != nil { - pisaProxyAdminListenPort = DefaultPisaProxyAdminListenPort - } else { - pisaProxyAdminListenPort = uint32(port) - } - - if lv := os.Getenv(EnvPisaProxyLoglevel); lv == "" { - pisaProxyLoglevel = DefaultPisaProxyLoglevel - } else { - pisaProxyLoglevel = lv - } -} - -const ( - podsSidecarPatch = `[ - { - "op":"add", - "path":"/spec/containers/-", - "value":{ - "image":"%v", - "name":"%s", - "args": ["sidecar"], - "ports": [ - { - "containerPort": %d, - "name": "pisa-admin", - "protocol": "TCP" - } - ], - "resources":{}, - "env": [ - { - "name": "PISA_CONTROLLER_SERVICE", - "value": "%s" - },{ - "name": "PISA_CONTROLLER_NAMESPACE", - "value": "%s" - },{ - "name": "PISA_DEPLOYED_NAMESPACE", - "valueFrom": { - "fieldRef": { - "apiVersion": "v1", - "fieldPath": "metadata.namespace" - } - } - },{ - "name": "PISA_DEPLOYED_NAME", - "value": "%s" - },{ - "name": "PISA_PROXY_ADMIN_LISTEN_HOST", - "value": "%s" - },{ - "name": "PISA_PROXY_ADMIN_LISTEN_PORT", - "value": "%d" - },{ - "name": "PISA_PROXY_ADMIN_LOG_LEVEL", - "value": "%s" - } - ] - } - } - ]` + "k8s.io/apimachinery/pkg/types" ) var ( @@ -143,17 +36,12 @@ var ( deserializer = codecs.UniversalDeserializer() ) -type PodInfo struct { - Metadata struct { - GenerateName string `json:"generateName"` - } `json:"metadata"` -} - -func InjectSidecar(ctx *gin.Context) { +func Injection(ctx *gin.Context) { rawData, err := ctx.GetRawData() if err != nil || len(rawData) == 0 { log.Error("get body raw data error.") ctx.JSON(http.StatusBadRequest, NewV1AdmissionResponseFromError(err)) + return } ar := &v1.AdmissionReview{} @@ -174,78 +62,105 @@ func InjectSidecar(ctx *gin.Context) { } func injection(ar *v1.AdmissionReview) error { - podinfo := &PodInfo{} - err := json.Unmarshal(ar.Request.Object.Raw, podinfo) - if err != nil { - return err + pod := retrievePodFromAdmissionRequest(ar.Request) + if pod == nil { + return errors.New("retrieve pod from admission request error") } - //FIXME: Considering only the Pod whose name contains two segments as suffix. - // e.g. the Pod of Deployment - podSlice := strings.Split(podinfo.Metadata.GenerateName, "-") - podSlice = podSlice[:len(podSlice)-2] + patch := buildPatch(pod) + + resp := buildPodPatchResponse(ar.Request.UID, pod, patch) + if resp != nil { + return errors.New("build pod patch response error") + } + + ar.Response = resp + return nil +} + +func retrievePodFromAdmissionRequest(req *v1.AdmissionRequest) *corev1.Pod { + gvr := metav1.GroupVersionResource{Group: "", Version: "v1", Resource: "pods"} + if req.Resource != gvr { + log.Errorf("expect resource to be %s", gvr) + return nil + } - patch := fmt.Sprintf(podsSidecarPatch, + pod := &corev1.Pod{} + if _, _, err := deserializer.Decode(req.Object.Raw, nil, pod); err != nil { + log.Errorf("retrieve from raw object error: %s", err) + return nil + } + + return pod +} + +func buildPatch(pod *corev1.Pod) string { + var pisaProxyDeployedName string + + if pod.OwnerReferences == nil || pod.OwnerReferences[0].Kind == "" { + pisaProxyDeployedName = pod.ObjectMeta.Name + } else { + pisaProxyDeployedName = getPisaProxyDeployedNameFromPod(pod.OwnerReferences[0].Kind, pod.ObjectMeta.GenerateName) + } + + return fmt.Sprintf(podsSidecarPatch, pisaProxyImage, pisaProxyContainerName, pisaProxyAdminListenPort, pisaControllerService, pisaControllerNamespace, - strings.Join(podSlice, "-"), + pisaProxyDeployedName, pisaProxyAdminListenHost, pisaProxyAdminListenPort, pisaProxyLoglevel, ) - - if err = applyPodPatch(ar, patch); err != nil { - return err - } - - return nil } -func applyPodPatch(ar *v1.AdmissionReview, patch string) error { - log.Info("mutating pods") +func getPisaProxyDeployedNameFromPod(kind, generatedName string) string { + var name string - pod := retrievePodFromAdmissionRequest(ar.Request) - if pod == nil { - return errors.New("retrieve pod from admission request error") + switch kind { + case "ReplicaSet": + fallthrough + case "Job": + name = getPodNameFromGeneratedName(generatedName, 2) + case "StatefulSet": + fallthrough + case "DaemonSet": + name = getPodNameFromGeneratedName(generatedName, 1) } + return name +} - log.Infof("pod %v", pod) +func getPodNameFromGeneratedName(generatedName string, offset uint) string { + podSlice := strings.Split(generatedName, "-") + l := len(podSlice) - reviewResponse := &v1.AdmissionResponse{ - UID: ar.Request.UID, - Allowed: true, + if l > int(offset) { + podSlice = podSlice[:l-int(offset)] + return strings.Join(podSlice, "-") } + return generatedName +} + +func buildPodPatchResponse(UID types.UID, pod *corev1.Pod, patch string) *v1.AdmissionResponse { + log.Info("mutating pods") if !hasContainer(pod.Spec.Containers, pisaProxyContainerName) { - reviewResponse.Patch = []byte(patch) + resp := &v1.AdmissionResponse{ + UID: UID, + Allowed: true, + Patch: []byte(patch), + } + pt := v1.PatchTypeJSONPatch - reviewResponse.PatchType = &pt + resp.PatchType = &pt + return resp } - ar.Response = reviewResponse - return nil } -func retrievePodFromAdmissionRequest(req *v1.AdmissionRequest) *corev1.Pod { - gvr := metav1.GroupVersionResource{Group: "", Version: "v1", Resource: "pods"} - if req.Resource != gvr { - log.Errorf("expect resource to be %s", gvr) - return nil - } - - pod := &corev1.Pod{} - if _, _, err := deserializer.Decode(req.Object.Raw, nil, pod); err != nil { - log.Error(err) - return nil - } - - return pod -} - func NewV1AdmissionResponseFromError(err error) *v1.AdmissionResponse { return &v1.AdmissionResponse{ Result: &metav1.Status{ diff --git a/pisa-controller/pkg/webhook/server.go b/pisa-controller/pkg/webhook/server.go index 8f350c93..a7b7d2b8 100644 --- a/pisa-controller/pkg/webhook/server.go +++ b/pisa-controller/pkg/webhook/server.go @@ -43,7 +43,7 @@ func Handler() http.Handler { // NOTE: there is not API path in this request // TODO: test trailing slash g.GET("", ApiCheck) - g.POST("/mutate", InjectSidecar) + g.POST("/mutate", Injection) return r } diff --git a/pisa-controller/pkg/webhook/types.go b/pisa-controller/pkg/webhook/types.go new file mode 100644 index 00000000..e57ea02d --- /dev/null +++ b/pisa-controller/pkg/webhook/types.go @@ -0,0 +1,125 @@ +// Copyright 2022 SphereEx Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package webhook + +import ( + "os" + "strconv" +) + +var ( + pisaProxyImage, pisaControllerService, pisaControllerNamespace, pisaProxyAdminListenHost, pisaProxyLoglevel string + pisaProxyAdminListenPort uint32 +) + +func init() { + if pisaProxyImage = os.Getenv(EnvPisaProxyImage); pisaProxyImage == "" { + pisaProxyImage = DefaultPisaProxyImage + } + + if pisaControllerService = os.Getenv(EnvPisaControllerService); pisaControllerService == "" { + pisaControllerService = DefaultPisaControllerService + } + if pisaControllerNamespace = os.Getenv(EnvPisaControllerNamespace); pisaControllerNamespace == "" { + pisaControllerNamespace = DefaultPisaControllerNamespace + } + + if host := os.Getenv(EnvPisaProxyAdminListenHost); host == "" { + pisaProxyAdminListenHost = DefaultPisaProxyAdminListenHost + } else { + pisaProxyAdminListenHost = host + } + + if port, err := strconv.Atoi(os.Getenv(EnvPisaProxyAdminListenPort)); port <= 0 || err != nil { + pisaProxyAdminListenPort = DefaultPisaProxyAdminListenPort + } else { + pisaProxyAdminListenPort = uint32(port) + } + + if lv := os.Getenv(EnvPisaProxyLoglevel); lv == "" { + pisaProxyLoglevel = DefaultPisaProxyLoglevel + } else { + pisaProxyLoglevel = lv + } +} + +const ( + pisaProxyContainerName = "pisa-proxy" + + EnvPisaProxyAdminListenHost = "PISA_PROXY_ADMIN_LISTEN_HOST" + EnvPisaProxyAdminListenPort = "PISA_PROXY_ADMIN_LISTEN_PORT" + EnvPisaProxyLoglevel = "PISA_PROXY_ADMIN_LOG_LEVEL" + EnvPisaProxyImage = "PISA_PROXY_IMAGE" + EnvPisaControllerService = "PISA_CONTROLLER_SERVIE" + EnvPisaControllerNamespace = "PISA_CONTROLLER_NAMESPACE" + + DefaultPisaProxyAdminListenHost = "0.0.0.0" + DefaultPisaProxyAdminListenPort = 5591 + DefaultPisaProxyLoglevel = "INFO" + DefaultPisaProxyImage = "pisanixio/proxy:latest" + DefaultPisaControllerService = "default" + DefaultPisaControllerNamespace = "default" +) + +const ( + podsSidecarPatch = `[ + { + "op":"add", + "path":"/spec/containers/-", + "value":{ + "image":"%v", + "name":"%s", + "args": ["sidecar"], + "ports": [ + { + "containerPort": %d, + "name": "pisa-admin", + "protocol": "TCP" + } + ], + "resources":{}, + "env": [ + { + "name": "PISA_CONTROLLER_SERVICE", + "value": "%s" + },{ + "name": "PISA_CONTROLLER_NAMESPACE", + "value": "%s" + },{ + "name": "PISA_DEPLOYED_NAMESPACE", + "valueFrom": { + "fieldRef": { + "apiVersion": "v1", + "fieldPath": "metadata.namespace" + } + } + },{ + "name": "PISA_DEPLOYED_NAME", + "value": "%s" + },{ + "name": "PISA_PROXY_ADMIN_LISTEN_HOST", + "value": "%s" + },{ + "name": "PISA_PROXY_ADMIN_LISTEN_PORT", + "value": "%d" + },{ + "name": "PISA_PROXY_ADMIN_LOG_LEVEL", + "value": "%s" + } + ] + } + } + ]` +) From 08ce0f3e36873dfac2e20d80bec21c112bb09388 Mon Sep 17 00:00:00 2001 From: mlycore Date: Fri, 5 Aug 2022 18:01:37 +0800 Subject: [PATCH 3/3] test(webhook): add test for build patch Signed-off-by: mlycore --- pisa-controller/pkg/webhook/injection_test.go | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 pisa-controller/pkg/webhook/injection_test.go diff --git a/pisa-controller/pkg/webhook/injection_test.go b/pisa-controller/pkg/webhook/injection_test.go new file mode 100644 index 00000000..0b9c9dd5 --- /dev/null +++ b/pisa-controller/pkg/webhook/injection_test.go @@ -0,0 +1,50 @@ +// Copyright 2022 SphereEx Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package webhook + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func Test_GetPisaProxyDeployedNameFromPod(t *testing.T) { + cases := []struct { + name string + generatedName string + kind string + exp string + msg string + }{ + { + name: "a-b-c-6668ddbf55-abcde", + generatedName: "a-b-c-6668ddbf55-", + kind: "ReplicaSet", + exp: "a-b-c", + msg: "Deployment or CronJob name should be equal", + }, + { + name: "a-b-0", + generatedName: "a-b-", + kind: "StatefulSet", + exp: "a-b", + msg: "StatefulSet, Job or DaemonSet name should be equal", + }, + } + + for _, c := range cases { + assert.Equal(t, c.exp, getPisaProxyDeployedNameFromPod(c.kind, c.generatedName), c.msg) + } +}