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  }