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  }