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

     1  package eventbus
     2  
     3  import (
     4  	"context"
     5  	"testing"
     6  
     7  	"github.com/stretchr/testify/assert"
     8  	"go.uber.org/zap/zaptest"
     9  	appv1 "k8s.io/api/apps/v1"
    10  	corev1 "k8s.io/api/core/v1"
    11  	apiresource "k8s.io/apimachinery/pkg/api/resource"
    12  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    13  	k8sfake "k8s.io/client-go/kubernetes/fake"
    14  	"k8s.io/client-go/kubernetes/scheme"
    15  	"sigs.k8s.io/controller-runtime/pkg/client/fake"
    16  	"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
    17  
    18  	"github.com/argoproj/argo-events/controllers"
    19  	"github.com/argoproj/argo-events/pkg/apis/eventbus/v1alpha1"
    20  )
    21  
    22  const (
    23  	testBusName   = "test-bus"
    24  	testNamespace = "testNamespace"
    25  	testURL       = "http://test"
    26  )
    27  
    28  var (
    29  	volumeSize = apiresource.MustParse("5Gi")
    30  
    31  	nativeBus = &v1alpha1.EventBus{
    32  		TypeMeta: metav1.TypeMeta{
    33  			APIVersion: v1alpha1.SchemeGroupVersion.String(),
    34  			Kind:       "EventBus",
    35  		},
    36  		ObjectMeta: metav1.ObjectMeta{
    37  			Namespace: testNamespace,
    38  			Name:      testBusName,
    39  		},
    40  		Spec: v1alpha1.EventBusSpec{
    41  			NATS: &v1alpha1.NATSBus{
    42  				Native: &v1alpha1.NativeStrategy{
    43  					Replicas: 1,
    44  					Auth:     &v1alpha1.AuthStrategyToken,
    45  					Persistence: &v1alpha1.PersistenceStrategy{
    46  						VolumeSize: &volumeSize,
    47  					},
    48  				},
    49  			},
    50  		},
    51  	}
    52  
    53  	cID = "test-cluster-id"
    54  
    55  	exoticBus = &v1alpha1.EventBus{
    56  		TypeMeta: metav1.TypeMeta{
    57  			APIVersion: v1alpha1.SchemeGroupVersion.String(),
    58  			Kind:       "EventBus",
    59  		},
    60  		ObjectMeta: metav1.ObjectMeta{
    61  			Namespace: testNamespace,
    62  			Name:      testBusName,
    63  		},
    64  		Spec: v1alpha1.EventBusSpec{
    65  			NATS: &v1alpha1.NATSBus{
    66  				Exotic: &v1alpha1.NATSConfig{
    67  					ClusterID: &cID,
    68  					URL:       testURL,
    69  				},
    70  			},
    71  		},
    72  	}
    73  
    74  	fakeConfig = &controllers.GlobalConfig{
    75  		EventBus: &controllers.EventBusConfig{
    76  			NATS: &controllers.StanConfig{
    77  				Versions: []controllers.StanVersion{
    78  					{
    79  						Version:              "0.22.1",
    80  						NATSStreamingImage:   "test-n-s-image",
    81  						MetricsExporterImage: "test-n-s-m-image",
    82  					},
    83  				},
    84  			},
    85  			JetStream: &controllers.JetStreamConfig{
    86  				Versions: []controllers.JetStreamVersion{
    87  					{
    88  						Version:              "testVersion",
    89  						NatsImage:            "testJSImage",
    90  						ConfigReloaderImage:  "test-nats-rl-image",
    91  						MetricsExporterImage: "testJSMetricsImage",
    92  					},
    93  				},
    94  			},
    95  		},
    96  	}
    97  )
    98  
    99  func init() {
   100  	_ = v1alpha1.AddToScheme(scheme.Scheme)
   101  	_ = appv1.AddToScheme(scheme.Scheme)
   102  	_ = corev1.AddToScheme(scheme.Scheme)
   103  }
   104  
   105  func TestReconcileNative(t *testing.T) {
   106  	t.Run("native nats installation", func(t *testing.T) {
   107  		testBus := nativeBus.DeepCopy()
   108  		ctx := context.TODO()
   109  		cl := fake.NewClientBuilder().Build()
   110  		r := &reconciler{
   111  			client:     cl,
   112  			kubeClient: k8sfake.NewSimpleClientset(),
   113  			scheme:     scheme.Scheme,
   114  			config:     fakeConfig,
   115  			logger:     zaptest.NewLogger(t).Sugar(),
   116  		}
   117  		err := r.reconcile(ctx, testBus)
   118  		assert.NoError(t, err)
   119  		assert.True(t, testBus.Status.IsReady())
   120  		assert.NotNil(t, testBus.Status.Config.NATS)
   121  		assert.NotEmpty(t, testBus.Status.Config.NATS.URL)
   122  		assert.NotEmpty(t, testBus.Status.Config.NATS.ClusterID)
   123  	})
   124  }
   125  
   126  func TestReconcileExotic(t *testing.T) {
   127  	t.Run("native nats exotic", func(t *testing.T) {
   128  		testBus := exoticBus.DeepCopy()
   129  		ctx := context.TODO()
   130  		cl := fake.NewClientBuilder().Build()
   131  		r := &reconciler{
   132  			client:     cl,
   133  			kubeClient: k8sfake.NewSimpleClientset(),
   134  			scheme:     scheme.Scheme,
   135  			config:     fakeConfig,
   136  			logger:     zaptest.NewLogger(t).Sugar(),
   137  		}
   138  		err := r.reconcile(ctx, testBus)
   139  		assert.NoError(t, err)
   140  		assert.NotNil(t, testBus.Status.Config.NATS)
   141  		assert.Equal(t, testURL, testBus.Status.Config.NATS.URL)
   142  	})
   143  }
   144  
   145  func TestNeedsUpdate(t *testing.T) {
   146  	t.Run("needs update", func(t *testing.T) {
   147  		testBus := nativeBus.DeepCopy()
   148  		cl := fake.NewClientBuilder().Build()
   149  		r := &reconciler{
   150  			client:     cl,
   151  			kubeClient: k8sfake.NewSimpleClientset(),
   152  			scheme:     scheme.Scheme,
   153  			config:     fakeConfig,
   154  			logger:     zaptest.NewLogger(t).Sugar(),
   155  		}
   156  		assert.False(t, r.needsUpdate(nativeBus, testBus))
   157  		controllerutil.AddFinalizer(testBus, finalizerName)
   158  		assert.True(t, contains(testBus.Finalizers, finalizerName))
   159  		assert.True(t, r.needsUpdate(nativeBus, testBus))
   160  		controllerutil.RemoveFinalizer(testBus, finalizerName)
   161  		assert.False(t, contains(testBus.Finalizers, finalizerName))
   162  		assert.False(t, r.needsUpdate(nativeBus, testBus))
   163  		testBus.Status.MarkConfigured()
   164  		assert.False(t, r.needsUpdate(nativeBus, testBus))
   165  	})
   166  }
   167  
   168  func contains(arr []string, str string) bool {
   169  	for _, a := range arr {
   170  		if a == str {
   171  			return true
   172  		}
   173  	}
   174  	return false
   175  }