github.com/argoproj/argo-events@v1.9.1/controllers/eventbus/installer/installer_test.go (about)

     1  package installer
     2  
     3  import (
     4  	"context"
     5  	"testing"
     6  
     7  	"github.com/stretchr/testify/assert"
     8  	"go.uber.org/zap/zaptest"
     9  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    10  	k8sfake "k8s.io/client-go/kubernetes/fake"
    11  	"k8s.io/client-go/kubernetes/scheme"
    12  	"sigs.k8s.io/controller-runtime/pkg/client"
    13  	"sigs.k8s.io/controller-runtime/pkg/client/fake"
    14  
    15  	"github.com/argoproj/argo-events/controllers"
    16  	eventsourcev1alpha1 "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1"
    17  	sensorv1alpha1 "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1"
    18  )
    19  
    20  const (
    21  	testJetStreamImage         = "test-js-image"
    22  	testJSReloaderImage        = "test-nats-rl-image"
    23  	testJetStreamExporterImage = "test-js-e-image"
    24  )
    25  
    26  var (
    27  	fakeConfig = &controllers.GlobalConfig{
    28  		EventBus: &controllers.EventBusConfig{
    29  			NATS: &controllers.StanConfig{
    30  				Versions: []controllers.StanVersion{
    31  					{
    32  						Version:              "0.22.1",
    33  						NATSStreamingImage:   "test-n-s-image",
    34  						MetricsExporterImage: "test-n-s-m-image",
    35  					},
    36  				},
    37  			},
    38  			JetStream: &controllers.JetStreamConfig{
    39  				Versions: []controllers.JetStreamVersion{
    40  					{
    41  						Version:              "2.7.3",
    42  						NatsImage:            testJetStreamImage,
    43  						ConfigReloaderImage:  testJSReloaderImage,
    44  						MetricsExporterImage: testJetStreamExporterImage,
    45  					},
    46  				},
    47  			},
    48  		},
    49  	}
    50  )
    51  
    52  func TestGetInstaller(t *testing.T) {
    53  	t.Run("get installer", func(t *testing.T) {
    54  		installer, err := getInstaller(testNatsEventBus, nil, nil, fakeConfig, zaptest.NewLogger(t).Sugar())
    55  		assert.NoError(t, err)
    56  		assert.NotNil(t, installer)
    57  		_, ok := installer.(*natsInstaller)
    58  		assert.True(t, ok)
    59  
    60  		installer, err = getInstaller(testNatsExoticBus, nil, nil, fakeConfig, zaptest.NewLogger(t).Sugar())
    61  		assert.NoError(t, err)
    62  		assert.NotNil(t, installer)
    63  		_, ok = installer.(*exoticNATSInstaller)
    64  		assert.True(t, ok)
    65  	})
    66  
    67  	t.Run("get jetstream installer", func(t *testing.T) {
    68  		installer, err := getInstaller(testJetStreamEventBus, nil, nil, fakeConfig, zaptest.NewLogger(t).Sugar())
    69  		assert.NoError(t, err)
    70  		assert.NotNil(t, installer)
    71  		_, ok := installer.(*jetStreamInstaller)
    72  		assert.True(t, ok)
    73  
    74  		installer, err = getInstaller(testJetStreamExoticBus, nil, nil, fakeConfig, zaptest.NewLogger(t).Sugar())
    75  		assert.NoError(t, err)
    76  		assert.NotNil(t, installer)
    77  		_, ok = installer.(*exoticJetStreamInstaller)
    78  		assert.True(t, ok)
    79  	})
    80  }
    81  
    82  func init() {
    83  	_ = eventsourcev1alpha1.AddToScheme(scheme.Scheme)
    84  	_ = sensorv1alpha1.AddToScheme(scheme.Scheme)
    85  }
    86  
    87  func TestGetLinkedEventSources(t *testing.T) {
    88  	t.Run("get linked eventsources", func(t *testing.T) {
    89  		es := fakeEmptyEventSource()
    90  		es.Spec.EventBusName = "test-sa"
    91  		es.Spec.Calendar = fakeCalendarEventSourceMap("test")
    92  		cl := fake.NewClientBuilder().Build()
    93  		ctx := context.Background()
    94  		err := cl.Create(ctx, es, &client.CreateOptions{})
    95  		assert.Nil(t, err)
    96  		n, err := linkedEventSources(ctx, testNamespace, "test-sa", cl)
    97  		assert.Nil(t, err)
    98  		assert.Equal(t, n, 1)
    99  	})
   100  }
   101  
   102  func TestGetLinkedSensors(t *testing.T) {
   103  	t.Run("get linked sensors", func(t *testing.T) {
   104  		s := fakeSensor()
   105  		s.Spec.EventBusName = "test-sa"
   106  		cl := fake.NewClientBuilder().Build()
   107  		ctx := context.Background()
   108  		err := cl.Create(ctx, s, &client.CreateOptions{})
   109  		assert.Nil(t, err)
   110  		n, err := linkedSensors(ctx, testNamespace, "test-sa", cl)
   111  		assert.Nil(t, err)
   112  		assert.Equal(t, n, 1)
   113  	})
   114  }
   115  
   116  func fakeEmptyEventSource() *eventsourcev1alpha1.EventSource {
   117  	return &eventsourcev1alpha1.EventSource{
   118  		ObjectMeta: metav1.ObjectMeta{
   119  			Namespace: testNamespace,
   120  			Name:      "test-es",
   121  		},
   122  		Spec: eventsourcev1alpha1.EventSourceSpec{},
   123  	}
   124  }
   125  
   126  func fakeCalendarEventSourceMap(name string) map[string]eventsourcev1alpha1.CalendarEventSource {
   127  	return map[string]eventsourcev1alpha1.CalendarEventSource{name: {Schedule: "*/5 * * * *"}}
   128  }
   129  
   130  func fakeSensor() *sensorv1alpha1.Sensor {
   131  	return &sensorv1alpha1.Sensor{
   132  		ObjectMeta: metav1.ObjectMeta{
   133  			Name:      "fake-sensor",
   134  			Namespace: testNamespace,
   135  		},
   136  		Spec: sensorv1alpha1.SensorSpec{
   137  			Triggers: []sensorv1alpha1.Trigger{
   138  				{
   139  					Template: &sensorv1alpha1.TriggerTemplate{
   140  						Name: "fake-trigger",
   141  						K8s: &sensorv1alpha1.StandardK8STrigger{
   142  							Operation: "create",
   143  							Source:    &sensorv1alpha1.ArtifactLocation{},
   144  						},
   145  					},
   146  				},
   147  			},
   148  			Dependencies: []sensorv1alpha1.EventDependency{
   149  				{
   150  					Name:            "fake-dep",
   151  					EventSourceName: "fake-source",
   152  					EventName:       "fake-one",
   153  				},
   154  			},
   155  		},
   156  	}
   157  }
   158  
   159  func TestInstall(t *testing.T) {
   160  	kubeClient := k8sfake.NewSimpleClientset()
   161  	cl := fake.NewClientBuilder().Build()
   162  	ctx := context.TODO()
   163  
   164  	t.Run("test nats error", func(t *testing.T) {
   165  		testObj := testNatsEventBus.DeepCopy()
   166  		testObj.Spec.NATS = nil
   167  		err := Install(ctx, testObj, cl, kubeClient, fakeConfig, zaptest.NewLogger(t).Sugar())
   168  		assert.Error(t, err)
   169  		assert.Equal(t, "invalid eventbus spec", err.Error())
   170  	})
   171  
   172  	t.Run("test nats install ok", func(t *testing.T) {
   173  		testObj := testNatsEventBus.DeepCopy()
   174  		err := Install(ctx, testObj, cl, kubeClient, fakeConfig, zaptest.NewLogger(t).Sugar())
   175  		assert.NoError(t, err)
   176  		assert.True(t, testObj.Status.IsReady())
   177  		assert.NotNil(t, testObj.Status.Config.NATS)
   178  		assert.NotEmpty(t, testObj.Status.Config.NATS.URL)
   179  		assert.NotNil(t, testObj.Status.Config.NATS.Auth)
   180  		assert.NotNil(t, testObj.Status.Config.NATS.AccessSecret)
   181  	})
   182  
   183  	t.Run("test jetstream error", func(t *testing.T) {
   184  		testObj := testJetStreamEventBus.DeepCopy()
   185  		testObj.Spec.JetStream = nil
   186  		err := Install(ctx, testObj, cl, kubeClient, fakeConfig, zaptest.NewLogger(t).Sugar())
   187  		assert.Error(t, err)
   188  		assert.Equal(t, "invalid eventbus spec", err.Error())
   189  	})
   190  
   191  	t.Run("test jetstream install ok", func(t *testing.T) {
   192  		testObj := testJetStreamEventBus.DeepCopy()
   193  		err := Install(ctx, testObj, cl, kubeClient, fakeConfig, zaptest.NewLogger(t).Sugar())
   194  		assert.NoError(t, err)
   195  		assert.True(t, testObj.Status.IsReady())
   196  		assert.NotNil(t, testObj.Status.Config.JetStream)
   197  		assert.NotEmpty(t, testObj.Status.Config.JetStream.URL)
   198  		assert.NotNil(t, testObj.Status.Config.JetStream.AccessSecret)
   199  	})
   200  }