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 }