github.com/argoproj/argo-events@v1.9.1/sensors/triggers/standard-k8s/standard-k8s_test.go (about) 1 /* 2 Copyright 2018 BlackRock, Inc. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package standard_k8s 18 19 import ( 20 "context" 21 "testing" 22 "time" 23 24 k8stypes "k8s.io/apimachinery/pkg/types" 25 26 "github.com/stretchr/testify/assert" 27 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 28 "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" 29 "k8s.io/apimachinery/pkg/runtime" 30 dynamicFake "k8s.io/client-go/dynamic/fake" 31 "k8s.io/client-go/kubernetes/fake" 32 33 "github.com/argoproj/argo-events/common" 34 "github.com/argoproj/argo-events/common/logging" 35 apicommon "github.com/argoproj/argo-events/pkg/apis/common" 36 "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1" 37 core "k8s.io/client-go/testing" 38 k8stesting "k8s.io/client-go/testing" 39 ) 40 41 var sensorObj = &v1alpha1.Sensor{ 42 ObjectMeta: metav1.ObjectMeta{ 43 Name: "fake-sensor", 44 Namespace: "fake", 45 }, 46 Spec: v1alpha1.SensorSpec{ 47 Triggers: []v1alpha1.Trigger{ 48 { 49 Template: &v1alpha1.TriggerTemplate{ 50 Name: "fake-trigger", 51 K8s: &v1alpha1.StandardK8STrigger{}, 52 }, 53 }, 54 }, 55 }, 56 } 57 58 func newUnstructured(apiVersion, kind, namespace, name string) *unstructured.Unstructured { 59 return &unstructured.Unstructured{ 60 Object: map[string]interface{}{ 61 "apiVersion": apiVersion, 62 "kind": kind, 63 "metadata": map[string]interface{}{ 64 "namespace": namespace, 65 "name": name, 66 "labels": map[string]interface{}{ 67 "name": name, 68 }, 69 }, 70 "spec": map[string]interface{}{ 71 "replica": "1", 72 }, 73 }, 74 } 75 } 76 77 func TestStandardK8sTrigger_FetchResource(t *testing.T) { 78 deployment := newUnstructured("apps/v1", "Deployment", "fake", "test") 79 artifact := apicommon.NewResource(deployment) 80 sensorObj.Spec.Triggers[0].Template.K8s.Source = &v1alpha1.ArtifactLocation{ 81 Resource: &artifact, 82 } 83 runtimeScheme := runtime.NewScheme() 84 client := dynamicFake.NewSimpleDynamicClient(runtimeScheme) 85 impl := NewStandardK8sTrigger(fake.NewSimpleClientset(), client, sensorObj, &sensorObj.Spec.Triggers[0], logging.NewArgoEventsLogger()) 86 resource, err := impl.FetchResource(context.TODO()) 87 assert.Nil(t, err) 88 assert.NotNil(t, resource) 89 90 uObj, ok := resource.(*unstructured.Unstructured) 91 assert.Equal(t, true, ok) 92 assert.Equal(t, deployment.GetName(), uObj.GetName()) 93 } 94 95 func TestStandardK8sTrigger_ApplyResourceParameters(t *testing.T) { 96 fakeSensor := sensorObj.DeepCopy() 97 98 event := &v1alpha1.Event{ 99 Context: &v1alpha1.EventContext{ 100 DataContentType: common.MediaTypeJSON, 101 Subject: "example-1", 102 SpecVersion: "0.3", 103 Source: "webhook-gateway", 104 Type: "webhook", 105 ID: "1", 106 Time: metav1.Time{Time: time.Now().UTC()}, 107 }, 108 Data: []byte("{\"name\": {\"first\": \"fake\", \"last\": \"user\"} }"), 109 } 110 111 testEvents := map[string]*v1alpha1.Event{ 112 "dep-1": event, 113 } 114 115 deployment := newUnstructured("apps/v1", "Deployment", "fake", "test") 116 artifact := apicommon.NewResource(deployment) 117 fakeSensor.Spec.Triggers[0].Template.K8s.Source = &v1alpha1.ArtifactLocation{ 118 Resource: &artifact, 119 } 120 121 fakeSensor.Spec.Triggers[0].Template.K8s.Parameters = []v1alpha1.TriggerParameter{ 122 { 123 Src: &v1alpha1.TriggerParameterSource{ 124 DependencyName: "dep-1", 125 DataKey: "name.first", 126 }, 127 Dest: "metadata.name", 128 Operation: "prepend", 129 }, 130 } 131 132 runtimeScheme := runtime.NewScheme() 133 client := dynamicFake.NewSimpleDynamicClient(runtimeScheme) 134 impl := NewStandardK8sTrigger(fake.NewSimpleClientset(), client, fakeSensor, &fakeSensor.Spec.Triggers[0], logging.NewArgoEventsLogger()) 135 136 out, err := impl.ApplyResourceParameters(testEvents, deployment) 137 assert.Nil(t, err) 138 139 updatedObj, ok := out.(*unstructured.Unstructured) 140 assert.Equal(t, true, ok) 141 assert.Equal(t, "faketest", updatedObj.GetName()) 142 } 143 144 func TestStandardK8sTrigger_Execute(t *testing.T) { 145 deployment := newUnstructured("apps/v1", "Deployment", "fake", "test") 146 artifact := apicommon.NewResource(deployment) 147 sensorObj.Spec.Triggers[0].Template.K8s.Source = &v1alpha1.ArtifactLocation{ 148 Resource: &artifact, 149 } 150 runtimeScheme := runtime.NewScheme() 151 client := dynamicFake.NewSimpleDynamicClient(runtimeScheme) 152 impl := NewStandardK8sTrigger(fake.NewSimpleClientset(), client, sensorObj, &sensorObj.Spec.Triggers[0], logging.NewArgoEventsLogger()) 153 ctx := context.TODO() 154 155 resource, err := impl.Execute(ctx, nil, deployment) 156 assert.Nil(t, err) 157 assert.NotNil(t, resource) 158 159 uObj, ok := resource.(*unstructured.Unstructured) 160 assert.Equal(t, true, ok) 161 assert.Equal(t, deployment.GetName(), uObj.GetName()) 162 163 labels := uObj.GetLabels() 164 labels["update"] = "ok" 165 uObj.SetLabels(labels) 166 167 sensorObj.Spec.Triggers[0].Template.K8s.Operation = v1alpha1.Update 168 impl = NewStandardK8sTrigger(fake.NewSimpleClientset(), client, sensorObj, &sensorObj.Spec.Triggers[0], logging.NewArgoEventsLogger()) 169 resource, err = impl.Execute(ctx, nil, uObj) 170 assert.Nil(t, err) 171 assert.NotNil(t, resource) 172 173 uObj, ok = resource.(*unstructured.Unstructured) 174 assert.Equal(t, true, ok) 175 assert.Equal(t, deployment.GetName(), uObj.GetName()) 176 assert.Equal(t, "ok", uObj.GetLabels()["update"]) 177 178 labels = uObj.GetLabels() 179 labels["foo"] = "bar" 180 uObj.SetLabels(labels) 181 182 sensorObj.Spec.Triggers[0].Template.K8s.Operation = v1alpha1.Patch 183 sensorObj.Spec.Triggers[0].Template.K8s.PatchStrategy = k8stypes.MergePatchType 184 185 impl = NewStandardK8sTrigger(fake.NewSimpleClientset(), client, sensorObj, &sensorObj.Spec.Triggers[0], logging.NewArgoEventsLogger()) 186 resource, err = impl.Execute(ctx, nil, uObj) 187 assert.Nil(t, err) 188 assert.NotNil(t, resource) 189 uObj, ok = resource.(*unstructured.Unstructured) 190 assert.Equal(t, true, ok) 191 assert.Equal(t, "bar", uObj.GetLabels()["foo"]) 192 193 deleted := false 194 195 sensorObj.Spec.Triggers[0].Template.K8s.Operation = v1alpha1.Delete 196 197 client.Fake.PrependReactor("delete", "deployments", func(action k8stesting.Action) (handled bool, ret runtime.Object, err error) { 198 deleteAction := action.(core.DeleteAction) 199 if deleteAction.GetName() == deployment.GetName() && deleteAction.GetNamespace() == deployment.GetNamespace() { 200 deleted = true 201 } 202 return true, nil, nil 203 }) 204 205 impl = NewStandardK8sTrigger(fake.NewSimpleClientset(), client, sensorObj, &sensorObj.Spec.Triggers[0], logging.NewArgoEventsLogger()) 206 resource, err = impl.Execute(ctx, nil, uObj) 207 assert.Nil(t, err) 208 assert.Nil(t, resource) 209 assert.True(t, deleted) 210 }