From 504069b802ea404b4c2f29ccfec83e5812604c6e Mon Sep 17 00:00:00 2001 From: Satish Matti Date: Fri, 5 Jun 2020 19:33:56 -0700 Subject: [PATCH] Add tests for ingress patch methods --- pkg/utils/patch/patch_test.go | 175 ++++++++++++++++++++++++++++++++++ 1 file changed, 175 insertions(+) diff --git a/pkg/utils/patch/patch_test.go b/pkg/utils/patch/patch_test.go index d23f337457..07c31cb2c9 100644 --- a/pkg/utils/patch/patch_test.go +++ b/pkg/utils/patch/patch_test.go @@ -14,10 +14,18 @@ limitations under the License. package patch import ( + "context" + "fmt" "testing" + "github.com/google/go-cmp/cmp" + + apiv1 "k8s.io/api/core/v1" "k8s.io/api/networking/v1beta1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/intstr" + "k8s.io/client-go/kubernetes/fake" + "k8s.io/kubernetes/pkg/util/slice" ) func TestStrategicMergePatchBytes(t *testing.T) { @@ -49,3 +57,170 @@ func TestStrategicMergePatchBytes(t *testing.T) { t.Errorf("StrategicMergePatchBytes(%+v, %+v) = %s ; want %s", ing, updated, string(b), expected) } } + +func TestPatchIngressObjectMetadata(t *testing.T) { + for _, tc := range []struct { + desc string + ing *v1beta1.Ingress + newMetaFunc func(*v1beta1.Ingress) *v1beta1.Ingress + }{ + { + desc: "add annotation", + ing: newTestIngress("ns1", "add-annotation-ing"), + newMetaFunc: func(ing *v1beta1.Ingress) *v1beta1.Ingress { + ret := ing.DeepCopy() + ret.Annotations["test-annotation-key3"] = "test-value3" + return ret + }, + }, + { + desc: "delete annotation", + ing: newTestIngress("ns2", "delete-annotation-ing"), + newMetaFunc: func(ing *v1beta1.Ingress) *v1beta1.Ingress { + ret := ing.DeepCopy() + delete(ret.Annotations, testAnnotationKey) + return ret + }, + }, + { + desc: "delete all annotations", + ing: newTestIngress("ns3", "delete-all-annotations-ing"), + newMetaFunc: func(ing *v1beta1.Ingress) *v1beta1.Ingress { + ret := ing.DeepCopy() + ret.Annotations = nil + return ret + }, + }, + { + desc: "add finalizer", + ing: newTestIngress("ns4", "add-finalizer-ing"), + newMetaFunc: func(ing *v1beta1.Ingress) *v1beta1.Ingress { + ret := ing.DeepCopy() + ret.Finalizers = append(ret.Finalizers, "new-test-ingress-finalizer") + return ret + }, + }, + { + desc: "delete finalizer", + ing: newTestIngress("ns5", "delete-finalizer-ing"), + newMetaFunc: func(ing *v1beta1.Ingress) *v1beta1.Ingress { + ret := ing.DeepCopy() + ret.Finalizers = slice.RemoveString(ret.Finalizers, testFinalizer, nil) + return ret + }, + }, + { + desc: "delete annotation and finalizer", + ing: newTestIngress("ns6", "delete-annotation-and-finalizer-ing"), + newMetaFunc: func(ing *v1beta1.Ingress) *v1beta1.Ingress { + ret := ing.DeepCopy() + ret.Annotations = nil + ret.Finalizers = nil + return ret + }, + }, + } { + t.Run(tc.desc, func(t *testing.T) { + ingKey := fmt.Sprintf("%s/%s", tc.ing.Namespace, tc.ing.Name) + ingClient := fake.NewSimpleClientset().NetworkingV1beta1().Ingresses(tc.ing.Namespace) + if _, err := ingClient.Create(context.TODO(), tc.ing, metav1.CreateOptions{}); err != nil { + t.Fatalf("Create(%s) = %v, want nil", ingKey, err) + } + expectIng := tc.newMetaFunc(tc.ing) + gotIng, err := PatchIngressObjectMetadata(ingClient, tc.ing, expectIng.ObjectMeta) + if err != nil { + t.Fatalf("PatchIngressObjectMetadata(%s) = %v, want nil", ingKey, err) + } + + if diff := cmp.Diff(expectIng, gotIng); diff != "" { + t.Errorf("Got mismatch for Ingress patch (-want +got):\n%s", diff) + } + }) + } +} + +func TestPatchIngressStatus(t *testing.T) { + for _, tc := range []struct { + desc string + ing *v1beta1.Ingress + newMetaFunc func(*v1beta1.Ingress) *v1beta1.Ingress + }{ + { + desc: "update status", + ing: newTestIngress("ns1", "update-status-ing"), + newMetaFunc: func(ing *v1beta1.Ingress) *v1beta1.Ingress { + ret := ing.DeepCopy() + ret.Status = v1beta1.IngressStatus{ + LoadBalancer: apiv1.LoadBalancerStatus{ + Ingress: []apiv1.LoadBalancerIngress{ + {IP: "10.0.0.1"}, + }, + }, + } + return ret + }, + }, + { + desc: "delete status", + ing: newTestIngress("ns2", "delete-status-ing"), + newMetaFunc: func(ing *v1beta1.Ingress) *v1beta1.Ingress { + ret := ing.DeepCopy() + ret.Status = v1beta1.IngressStatus{} + return ret + }, + }, + } { + t.Run(tc.desc, func(t *testing.T) { + ingKey := fmt.Sprintf("%s/%s", tc.ing.Namespace, tc.ing.Name) + ingClient := fake.NewSimpleClientset().NetworkingV1beta1().Ingresses(tc.ing.Namespace) + if _, err := ingClient.Create(context.TODO(), tc.ing, metav1.CreateOptions{}); err != nil { + t.Fatalf("Create(%s) = %v, want nil", ingKey, err) + } + expectIng := tc.newMetaFunc(tc.ing) + gotIng, err := PatchIngressStatus(ingClient, tc.ing, expectIng.Status) + if err != nil { + t.Fatalf("PatchIngressStatus(%s) = %v, want nil", ingKey, err) + } + + if diff := cmp.Diff(expectIng, gotIng); diff != "" { + t.Errorf("Got mismatch for Ingress patch (-want +got):\n%s", diff) + } + }) + } +} + +const ( + testAnnotationKey = "test-annotations-key1" + testFinalizer = "test-finalizer" +) + +func newTestIngress(namespace, name string) *v1beta1.Ingress { + return &v1beta1.Ingress{ + TypeMeta: metav1.TypeMeta{ + Kind: "Ingress", + APIVersion: "networking/v1beta1", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: name, + Namespace: namespace, + Annotations: map[string]string{ + testAnnotationKey: "test-value1", + "test-annotations-key2": "test-value2", + }, + Finalizers: []string{testFinalizer}, + }, + Spec: v1beta1.IngressSpec{ + Backend: &v1beta1.IngressBackend{ + ServiceName: "test-svc", + ServicePort: intstr.FromInt(8080), + }, + }, + Status: v1beta1.IngressStatus{ + LoadBalancer: apiv1.LoadBalancerStatus{ + Ingress: []apiv1.LoadBalancerIngress{ + {IP: "127.0.0.1"}, + }, + }, + }, + } +}