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  }