github.com/argoproj/argo-events@v1.9.1/test/e2e/fixtures/e2e_suite.go (about)

     1  package fixtures
     2  
     3  import (
     4  	"context"
     5  	"os"
     6  	"strings"
     7  	"time"
     8  
     9  	"github.com/stretchr/testify/suite"
    10  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    11  	"k8s.io/apimachinery/pkg/runtime/schema"
    12  	"k8s.io/client-go/dynamic"
    13  	"k8s.io/client-go/kubernetes"
    14  	"k8s.io/client-go/rest"
    15  
    16  	"github.com/argoproj/argo-events/common"
    17  	"github.com/argoproj/argo-events/pkg/apis/eventbus"
    18  	"github.com/argoproj/argo-events/pkg/apis/eventsource"
    19  	"github.com/argoproj/argo-events/pkg/apis/sensor"
    20  	eventbusversiond "github.com/argoproj/argo-events/pkg/client/eventbus/clientset/versioned"
    21  	eventbuspkg "github.com/argoproj/argo-events/pkg/client/eventbus/clientset/versioned/typed/eventbus/v1alpha1"
    22  	eventsourceversiond "github.com/argoproj/argo-events/pkg/client/eventsource/clientset/versioned"
    23  	eventsourcepkg "github.com/argoproj/argo-events/pkg/client/eventsource/clientset/versioned/typed/eventsource/v1alpha1"
    24  	sensorversiond "github.com/argoproj/argo-events/pkg/client/sensor/clientset/versioned"
    25  	sensorpkg "github.com/argoproj/argo-events/pkg/client/sensor/clientset/versioned/typed/sensor/v1alpha1"
    26  )
    27  
    28  const (
    29  	Namespace      = "argo-events"
    30  	Label          = "argo-events-e2e"
    31  	LabelValue     = "true"
    32  	EventBusName   = "argo-events-e2e"
    33  	defaultTimeout = 60 * time.Second
    34  )
    35  
    36  var (
    37  	background = metav1.DeletePropagationBackground
    38  
    39  	E2EEventBusSTAN = `apiVersion: argoproj.io/v1alpha1
    40  kind: EventBus
    41  metadata:
    42    name: default
    43  spec:
    44    nats:
    45      native:
    46        auth: token`
    47  
    48  	E2EEventBusJetstream = `apiVersion: argoproj.io/v1alpha1
    49  kind: EventBus
    50  metadata:
    51    name: default
    52  spec:
    53    jetstream:
    54      version: latest`
    55  
    56  	E2EEventBusKafka = `apiVersion: argoproj.io/v1alpha1
    57  kind: EventBus
    58  metadata:
    59    name: default
    60  spec:
    61    kafka:
    62      url: kafka:9092`
    63  )
    64  
    65  type E2ESuite struct {
    66  	suite.Suite
    67  	restConfig        *rest.Config
    68  	eventBusClient    eventbuspkg.EventBusInterface
    69  	eventSourceClient eventsourcepkg.EventSourceInterface
    70  	sensorClient      sensorpkg.SensorInterface
    71  	kubeClient        kubernetes.Interface
    72  }
    73  
    74  func (s *E2ESuite) SetupSuite() {
    75  	var err error
    76  
    77  	kubeConfig, found := os.LookupEnv(common.EnvVarKubeConfig)
    78  	if !found {
    79  		home, _ := os.UserHomeDir()
    80  		kubeConfig = home + "/.kube/config"
    81  		if _, err := os.Stat(kubeConfig); err != nil && os.IsNotExist(err) {
    82  			kubeConfig = ""
    83  		}
    84  	}
    85  	s.restConfig, err = common.GetClientConfig(kubeConfig)
    86  	s.CheckError(err)
    87  	s.kubeClient, err = kubernetes.NewForConfig(s.restConfig)
    88  	s.CheckError(err)
    89  	s.eventBusClient = eventbusversiond.NewForConfigOrDie(s.restConfig).ArgoprojV1alpha1().EventBus(Namespace)
    90  	s.eventSourceClient = eventsourceversiond.NewForConfigOrDie(s.restConfig).ArgoprojV1alpha1().EventSources(Namespace)
    91  	s.sensorClient = sensorversiond.NewForConfigOrDie(s.restConfig).ArgoprojV1alpha1().Sensors(Namespace)
    92  
    93  	// Clean up resources if any
    94  	s.DeleteResources()
    95  	// Clean up test event bus if any
    96  	resources := []schema.GroupVersionResource{
    97  		{Group: eventsource.Group, Version: "v1alpha1", Resource: eventbus.Plural},
    98  	}
    99  	s.deleteResources(resources)
   100  
   101  	s.Given().EventBus(GetBusDriverSpec()).
   102  		When().
   103  		CreateEventBus().
   104  		WaitForEventBusReady()
   105  	s.T().Log("EventBus is ready")
   106  
   107  	time.Sleep(10 * time.Second) // give it a little extra time to be fully ready // todo: any issues with this? Otherwise, I need to increase the allowance in the backoff
   108  }
   109  
   110  func (s *E2ESuite) TearDownSuite() {
   111  	s.DeleteResources()
   112  	s.Given().EventBus(GetBusDriverSpec()).
   113  		When().
   114  		DeleteEventBus().
   115  		Wait(3 * time.Second).
   116  		Then().
   117  		ExpectEventBusDeleted()
   118  	s.T().Log("EventBus is deleted")
   119  }
   120  
   121  func (s *E2ESuite) BeforeTest(string, string) {
   122  	s.DeleteResources()
   123  }
   124  
   125  func (s *E2ESuite) deleteResources(resources []schema.GroupVersionResource) {
   126  	hasTestLabel := metav1.ListOptions{LabelSelector: Label}
   127  	ctx := context.Background()
   128  	for _, r := range resources {
   129  		err := s.dynamicFor(r).DeleteCollection(ctx, metav1.DeleteOptions{PropagationPolicy: &background}, hasTestLabel)
   130  		s.CheckError(err)
   131  	}
   132  
   133  	for _, r := range resources {
   134  		for {
   135  			list, err := s.dynamicFor(r).List(ctx, hasTestLabel)
   136  			s.CheckError(err)
   137  			if len(list.Items) == 0 {
   138  				break
   139  			}
   140  			time.Sleep(100 * time.Millisecond)
   141  		}
   142  	}
   143  }
   144  
   145  func (s *E2ESuite) DeleteResources() {
   146  	resources := []schema.GroupVersionResource{
   147  		{Group: eventsource.Group, Version: "v1alpha1", Resource: eventsource.Plural},
   148  		{Group: sensor.Group, Version: "v1alpha1", Resource: sensor.Plural},
   149  		{Group: "", Version: "v1", Resource: "pods"},
   150  	}
   151  	s.deleteResources(resources)
   152  }
   153  
   154  func (s *E2ESuite) dynamicFor(r schema.GroupVersionResource) dynamic.ResourceInterface {
   155  	resourceInterface := dynamic.NewForConfigOrDie(s.restConfig).Resource(r)
   156  	return resourceInterface.Namespace(Namespace)
   157  }
   158  
   159  func (s *E2ESuite) CheckError(err error) {
   160  	s.T().Helper()
   161  	if err != nil {
   162  		s.T().Fatal(err)
   163  	}
   164  }
   165  
   166  func (s *E2ESuite) Given() *Given {
   167  	return &Given{
   168  		t:                 s.T(),
   169  		eventBusClient:    s.eventBusClient,
   170  		eventSourceClient: s.eventSourceClient,
   171  		sensorClient:      s.sensorClient,
   172  		restConfig:        s.restConfig,
   173  		kubeClient:        s.kubeClient,
   174  	}
   175  }
   176  
   177  func GetBusDriverSpec() string {
   178  	x := strings.ToUpper(os.Getenv("EventBusDriver"))
   179  	if x == "JETSTREAM" {
   180  		return E2EEventBusJetstream
   181  	} else if x == "KAFKA" {
   182  		return E2EEventBusKafka
   183  	}
   184  	return E2EEventBusSTAN
   185  }