github.com/argoproj/argo-events@v1.9.1/controllers/eventbus/installer/nats_test.go (about) 1 package installer 2 3 import ( 4 "context" 5 "fmt" 6 "strconv" 7 "strings" 8 "testing" 9 10 "github.com/stretchr/testify/assert" 11 "go.uber.org/zap/zaptest" 12 appv1 "k8s.io/api/apps/v1" 13 corev1 "k8s.io/api/core/v1" 14 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 15 k8sfake "k8s.io/client-go/kubernetes/fake" 16 "k8s.io/client-go/kubernetes/scheme" 17 "sigs.k8s.io/controller-runtime/pkg/client" 18 "sigs.k8s.io/controller-runtime/pkg/client/fake" 19 20 "github.com/argoproj/argo-events/common/logging" 21 "github.com/argoproj/argo-events/pkg/apis/eventbus/v1alpha1" 22 ) 23 24 const ( 25 testNamespace = "test-ns" 26 testName = "test-name" 27 ) 28 29 var ( 30 testLabels = map[string]string{"controller": "test-controller"} 31 32 testNatsEventBus = &v1alpha1.EventBus{ 33 TypeMeta: metav1.TypeMeta{ 34 APIVersion: v1alpha1.SchemeGroupVersion.String(), 35 Kind: "EventBus", 36 }, 37 ObjectMeta: metav1.ObjectMeta{ 38 Namespace: testNamespace, 39 Name: testName, 40 }, 41 Spec: v1alpha1.EventBusSpec{ 42 NATS: &v1alpha1.NATSBus{ 43 Native: &v1alpha1.NativeStrategy{ 44 Auth: &v1alpha1.AuthStrategyToken, 45 ImagePullSecrets: []corev1.LocalObjectReference{ 46 { 47 Name: "test", 48 }, 49 }, 50 ServiceAccountName: "test", 51 }, 52 }, 53 }, 54 } 55 56 testEventBusPersist = &v1alpha1.EventBus{ 57 TypeMeta: metav1.TypeMeta{ 58 APIVersion: v1alpha1.SchemeGroupVersion.String(), 59 Kind: "EventBus", 60 }, 61 ObjectMeta: metav1.ObjectMeta{ 62 Namespace: testNamespace, 63 Name: testName, 64 }, 65 Spec: v1alpha1.EventBusSpec{ 66 NATS: &v1alpha1.NATSBus{ 67 Native: &v1alpha1.NativeStrategy{ 68 Persistence: &v1alpha1.PersistenceStrategy{}, 69 }, 70 }, 71 }, 72 } 73 74 testEventBusAuthNone = &v1alpha1.EventBus{ 75 TypeMeta: metav1.TypeMeta{ 76 APIVersion: v1alpha1.SchemeGroupVersion.String(), 77 Kind: "EventBus", 78 }, 79 ObjectMeta: metav1.ObjectMeta{ 80 Namespace: testNamespace, 81 Name: testName, 82 }, 83 Spec: v1alpha1.EventBusSpec{ 84 NATS: &v1alpha1.NATSBus{ 85 Native: &v1alpha1.NativeStrategy{ 86 Auth: &v1alpha1.AuthStrategyNone, 87 }, 88 }, 89 }, 90 } 91 92 testEventBusBad = &v1alpha1.EventBus{ 93 TypeMeta: metav1.TypeMeta{ 94 APIVersion: v1alpha1.SchemeGroupVersion.String(), 95 Kind: "EventBus", 96 }, 97 ObjectMeta: metav1.ObjectMeta{ 98 Namespace: testNamespace, 99 Name: testName, 100 }, 101 Spec: v1alpha1.EventBusSpec{}, 102 } 103 ) 104 105 func init() { 106 _ = v1alpha1.AddToScheme(scheme.Scheme) 107 _ = appv1.AddToScheme(scheme.Scheme) 108 _ = corev1.AddToScheme(scheme.Scheme) 109 } 110 111 func TestBadInstallation(t *testing.T) { 112 t.Run("bad installation", func(t *testing.T) { 113 installer := &natsInstaller{ 114 client: fake.NewClientBuilder().Build(), 115 eventBus: testEventBusBad, 116 config: fakeConfig, 117 labels: testLabels, 118 logger: logging.NewArgoEventsLogger(), 119 } 120 _, err := installer.Install(context.TODO()) 121 assert.Error(t, err) 122 }) 123 } 124 125 func TestInstallationAuthtoken(t *testing.T) { 126 kubeClient := k8sfake.NewSimpleClientset() 127 t.Run("auth token installation", func(t *testing.T) { 128 cl := fake.NewClientBuilder().Build() 129 installer := NewNATSInstaller(cl, testNatsEventBus, fakeConfig, testLabels, kubeClient, zaptest.NewLogger(t).Sugar()) 130 busconf, err := installer.Install(context.TODO()) 131 assert.NoError(t, err) 132 assert.NotNil(t, busconf.NATS) 133 assert.NotEmpty(t, busconf.NATS.URL) 134 assert.Equal(t, busconf.NATS.Auth, &v1alpha1.AuthStrategyToken) 135 136 ctx := context.TODO() 137 svcList := &corev1.ServiceList{} 138 err = cl.List(ctx, svcList, &client.ListOptions{ 139 Namespace: testNamespace, 140 }) 141 assert.NoError(t, err) 142 assert.Equal(t, 1, len(svcList.Items)) 143 for _, s := range svcList.Items { 144 assert.True(t, strings.Contains(s.Name, "stan") || strings.Contains(s.Name, "metrics")) 145 } 146 147 cmList := &corev1.ConfigMapList{} 148 err = cl.List(ctx, cmList, &client.ListOptions{ 149 Namespace: testNamespace, 150 }) 151 assert.NoError(t, err) 152 assert.Equal(t, 1, len(cmList.Items)) 153 assert.Equal(t, cmList.Items[0].Name, fmt.Sprintf("eventbus-%s-stan-configmap", testName)) 154 155 ssList := &appv1.StatefulSetList{} 156 err = cl.List(ctx, ssList, &client.ListOptions{ 157 Namespace: testNamespace, 158 }) 159 assert.NoError(t, err) 160 assert.Equal(t, 1, len(ssList.Items)) 161 assert.Equal(t, ssList.Items[0].Name, fmt.Sprintf("eventbus-%s-stan", testName)) 162 163 secretList := &corev1.SecretList{} 164 err = cl.List(ctx, secretList, &client.ListOptions{ 165 Namespace: testNamespace, 166 }) 167 assert.NoError(t, err) 168 assert.Equal(t, 2, len(secretList.Items)) 169 for _, s := range secretList.Items { 170 assert.True(t, strings.Contains(s.Name, "server") || strings.Contains(s.Name, "client")) 171 } 172 }) 173 } 174 175 func TestInstallationAuthNone(t *testing.T) { 176 kubeClient := k8sfake.NewSimpleClientset() 177 t.Run("auth none installation", func(t *testing.T) { 178 cl := fake.NewClientBuilder().Build() 179 installer := NewNATSInstaller(cl, testEventBusAuthNone, fakeConfig, testLabels, kubeClient, zaptest.NewLogger(t).Sugar()) 180 busconf, err := installer.Install(context.TODO()) 181 assert.NoError(t, err) 182 assert.NotNil(t, busconf.NATS) 183 assert.NotEmpty(t, busconf.NATS.URL) 184 assert.Equal(t, busconf.NATS.Auth, &v1alpha1.AuthStrategyNone) 185 186 ctx := context.TODO() 187 svcList := &corev1.ServiceList{} 188 err = cl.List(ctx, svcList, &client.ListOptions{ 189 Namespace: testNamespace, 190 }) 191 assert.NoError(t, err) 192 assert.Equal(t, 1, len(svcList.Items)) 193 194 cmList := &corev1.ConfigMapList{} 195 err = cl.List(ctx, cmList, &client.ListOptions{ 196 Namespace: testNamespace, 197 }) 198 assert.NoError(t, err) 199 assert.Equal(t, 1, len(cmList.Items)) 200 201 secretList := &corev1.SecretList{} 202 err = cl.List(ctx, secretList, &client.ListOptions{ 203 Namespace: testNamespace, 204 }) 205 assert.NoError(t, err) 206 assert.Equal(t, 1, len(secretList.Items)) 207 assert.True(t, strings.Contains(secretList.Items[0].Name, "server")) 208 assert.True(t, len(secretList.Items[0].Data[serverAuthSecretKey]) == 0) 209 }) 210 } 211 212 func TestBuildPersistStatefulSetSpec(t *testing.T) { 213 t.Run("installation with persistence", func(t *testing.T) { 214 cl := fake.NewClientBuilder().Build() 215 installer := &natsInstaller{ 216 client: cl, 217 eventBus: testEventBusPersist, 218 config: fakeConfig, 219 labels: testLabels, 220 logger: logging.NewArgoEventsLogger(), 221 } 222 ss, err := installer.buildStatefulSet("svcName", "cmName", "secretName") 223 assert.NoError(t, err) 224 assert.True(t, len(ss.Spec.VolumeClaimTemplates) > 0) 225 }) 226 227 t.Run("installation with image pull secrets", func(t *testing.T) { 228 cl := fake.NewClientBuilder().Build() 229 installer := &natsInstaller{ 230 client: cl, 231 eventBus: testNatsEventBus, 232 config: fakeConfig, 233 labels: testLabels, 234 logger: logging.NewArgoEventsLogger(), 235 } 236 ss, err := installer.buildStatefulSet("svcName", "cmName", "secretName") 237 assert.NoError(t, err) 238 assert.True(t, len(ss.Spec.Template.Spec.ImagePullSecrets) > 0) 239 }) 240 241 t.Run("installation with priority class", func(t *testing.T) { 242 cl := fake.NewClientBuilder().Build() 243 eb := testNatsEventBus.DeepCopy() 244 eb.Spec.NATS.Native.PriorityClassName = "test-class" 245 installer := &natsInstaller{ 246 client: cl, 247 eventBus: eb, 248 config: fakeConfig, 249 labels: testLabels, 250 logger: logging.NewArgoEventsLogger(), 251 } 252 ss, err := installer.buildStatefulSet("svcName", "cmName", "secretName") 253 assert.NoError(t, err) 254 assert.Equal(t, ss.Spec.Template.Spec.PriorityClassName, "test-class") 255 }) 256 } 257 258 func TestBuildServiceAccountStatefulSetSpec(t *testing.T) { 259 t.Run("installation with Service Account Name", func(t *testing.T) { 260 cl := fake.NewClientBuilder().Build() 261 installer := &natsInstaller{ 262 client: cl, 263 eventBus: testNatsEventBus, 264 config: fakeConfig, 265 labels: testLabels, 266 logger: logging.NewArgoEventsLogger(), 267 } 268 ss, err := installer.buildStatefulSet("svcName", "cmName", "secretName") 269 assert.NoError(t, err) 270 assert.True(t, len(ss.Spec.Template.Spec.ServiceAccountName) > 0) 271 }) 272 } 273 274 func TestBuildConfigMap(t *testing.T) { 275 t.Run("test build config map", func(t *testing.T) { 276 cl := fake.NewClientBuilder().Build() 277 installer := &natsInstaller{ 278 client: cl, 279 eventBus: testNatsEventBus, 280 config: fakeConfig, 281 labels: testLabels, 282 logger: logging.NewArgoEventsLogger(), 283 } 284 cm, err := installer.buildConfigMap() 285 assert.NoError(t, err) 286 assert.NotNil(t, cm) 287 conf, ok := cm.Data[configMapKey] 288 assert.True(t, ok) 289 assert.True(t, strings.Contains(conf, "routes:")) 290 svcName := generateServiceName(testNatsEventBus) 291 ssName := generateStatefulSetName(testNatsEventBus) 292 r := fmt.Sprintf("nats://%s-%s.%s.%s.svc:%s", ssName, "0", svcName, testNamespace, strconv.Itoa(int(clusterPort))) 293 lines := strings.Split(conf, `\n`) 294 for _, l := range lines { 295 l = strings.Trim(l, " ") 296 if strings.HasPrefix(l, "routes:") { 297 assert.True(t, strings.Contains(l, r)) 298 } 299 } 300 }) 301 }