github.com/argoproj/argo-events@v1.9.1/test/e2e/fixtures/then.go (about) 1 package fixtures 2 3 import ( 4 "context" 5 "fmt" 6 "testing" 7 "time" 8 9 apierr "k8s.io/apimachinery/pkg/api/errors" 10 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 11 "k8s.io/client-go/kubernetes" 12 "k8s.io/client-go/rest" 13 14 eventbusv1alpha1 "github.com/argoproj/argo-events/pkg/apis/eventbus/v1alpha1" 15 eventsourcev1alpha1 "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1" 16 sensorv1alpha1 "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1" 17 eventbuspkg "github.com/argoproj/argo-events/pkg/client/eventbus/clientset/versioned/typed/eventbus/v1alpha1" 18 eventsourcepkg "github.com/argoproj/argo-events/pkg/client/eventsource/clientset/versioned/typed/eventsource/v1alpha1" 19 sensorpkg "github.com/argoproj/argo-events/pkg/client/sensor/clientset/versioned/typed/sensor/v1alpha1" 20 testutil "github.com/argoproj/argo-events/test/util" 21 ) 22 23 type Then struct { 24 t *testing.T 25 eventBusClient eventbuspkg.EventBusInterface 26 eventSourceClient eventsourcepkg.EventSourceInterface 27 sensorClient sensorpkg.SensorInterface 28 eventBus *eventbusv1alpha1.EventBus 29 eventSource *eventsourcev1alpha1.EventSource 30 sensor *sensorv1alpha1.Sensor 31 restConfig *rest.Config 32 kubeClient kubernetes.Interface 33 34 portForwarderStopChanels map[string]chan struct{} 35 } 36 37 func (t *Then) ExpectEventBusDeleted() *Then { 38 ctx := context.Background() 39 _, err := t.eventBusClient.Get(ctx, t.eventBus.Name, metav1.GetOptions{}) 40 if err == nil || !apierr.IsNotFound(err) { 41 t.t.Fatalf("expected event bus to be deleted: %v", err) 42 } 43 return t 44 } 45 46 func (t *Then) ExpectNoSensorPodFound() *Then { 47 ctx := context.Background() 48 labelSelector := fmt.Sprintf("controller=sensor-controller,sensor-name=%s", t.sensor.Name) 49 if err := testutil.WaitForNoPodFound(ctx, t.kubeClient, Namespace, labelSelector, 20*time.Second); err != nil { 50 t.t.Fatalf("expected no sensor pod found: %v", err) 51 } 52 return t 53 } 54 55 // look for regex match in Sensor pod's log 56 // if countOpt != nil, look for specific count of regex match; else look for at least one instance 57 func (t *Then) ExpectEventSourcePodLogContains(regex string, options ...testutil.PodLogCheckOption) *Then { 58 ctx := context.Background() 59 contains, err := testutil.EventSourcePodLogContains(ctx, t.kubeClient, Namespace, t.eventSource.Name, regex, options...) 60 if err != nil { 61 t.t.Fatalf("expected event source pod logs: %v", err) 62 } 63 if !contains { 64 t.t.Fatalf("expected event source pod log contains '%s'", regex) 65 } 66 return t 67 } 68 69 // look for regex match in EventSource pod's log 70 // if countOpt != nil, look for specific count of regex match; else look for at least one instance 71 func (t *Then) ExpectSensorPodLogContains(regex string, options ...testutil.PodLogCheckOption) *Then { 72 ctx := context.Background() 73 contains, err := testutil.SensorPodLogContains(ctx, t.kubeClient, Namespace, t.sensor.Name, regex, options...) 74 if err != nil { 75 t.t.Fatalf("expected sensor pod logs: %v", err) 76 } 77 if !contains { 78 t.t.Fatalf("expected sensor pod log contains '%s'", regex) 79 } 80 return t 81 } 82 83 func (t *Then) EventSourcePodPortForward(localPort, remotePort int) *Then { 84 labelSelector := fmt.Sprintf("controller=eventsource-controller,eventsource-name=%s", t.eventSource.Name) 85 ctx := context.Background() 86 podList, err := t.kubeClient.CoreV1().Pods(Namespace).List(ctx, metav1.ListOptions{LabelSelector: labelSelector, FieldSelector: "status.phase=Running"}) 87 if err != nil { 88 t.t.Fatalf("error getting event source pod name: %v", err) 89 } 90 podName := podList.Items[0].GetName() 91 t.t.Logf("EventSource POD name: %s", podName) 92 93 stopCh := make(chan struct{}, 1) 94 if err = testutil.PodPortForward(t.restConfig, Namespace, podName, localPort, remotePort, stopCh); err != nil { 95 t.t.Fatalf("expected eventsource pod port-forward: %v", err) 96 } 97 if t.portForwarderStopChanels == nil { 98 t.portForwarderStopChanels = make(map[string]chan struct{}) 99 } 100 t.portForwarderStopChanels[podName] = stopCh 101 return t 102 } 103 104 func (t *Then) SensorPodPortForward(localPort, remotePort int) *Then { 105 labelSelector := fmt.Sprintf("controller=sensor-controller,sensor-name=%s", t.sensor.Name) 106 ctx := context.Background() 107 podList, err := t.kubeClient.CoreV1().Pods(Namespace).List(ctx, metav1.ListOptions{LabelSelector: labelSelector, FieldSelector: "status.phase=Running"}) 108 if err != nil { 109 t.t.Fatalf("error getting sensor pod name: %v", err) 110 } 111 podName := podList.Items[0].GetName() 112 t.t.Logf("Sensor POD name: %s", podName) 113 114 stopCh := make(chan struct{}, 1) 115 if err = testutil.PodPortForward(t.restConfig, Namespace, podName, localPort, remotePort, stopCh); err != nil { 116 t.t.Fatalf("expected sensor pod port-forward: %v", err) 117 } 118 if t.portForwarderStopChanels == nil { 119 t.portForwarderStopChanels = make(map[string]chan struct{}) 120 } 121 t.portForwarderStopChanels[podName] = stopCh 122 return t 123 } 124 125 func (t *Then) TerminateAllPodPortForwards() *Then { 126 if len(t.portForwarderStopChanels) > 0 { 127 for k, v := range t.portForwarderStopChanels { 128 t.t.Logf("Terminating port-forward for POD %s", k) 129 close(v) 130 } 131 } 132 return t 133 } 134 135 func (t *Then) When() *When { 136 return &When{ 137 t: t.t, 138 eventBusClient: t.eventBusClient, 139 eventSourceClient: t.eventSourceClient, 140 sensorClient: t.sensorClient, 141 eventBus: t.eventBus, 142 eventSource: t.eventSource, 143 sensor: t.sensor, 144 restConfig: t.restConfig, 145 kubeClient: t.kubeClient, 146 } 147 }