154 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			154 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Go
		
	
	
	
| package cluster
 | |
| 
 | |
| import (
 | |
| 	"encoding/json"
 | |
| 	"reflect"
 | |
| 
 | |
| 	"context"
 | |
| 	"testing"
 | |
| 
 | |
| 	"github.com/stretchr/testify/assert"
 | |
| 	acidv1 "github.com/zalando/postgres-operator/pkg/apis/acid.zalan.do/v1"
 | |
| 	fakezalandov1alpha1 "github.com/zalando/postgres-operator/pkg/generated/clientset/versioned/fake"
 | |
| 	"github.com/zalando/postgres-operator/pkg/util/config"
 | |
| 	"github.com/zalando/postgres-operator/pkg/util/k8sutil"
 | |
| 
 | |
| 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | |
| 	"k8s.io/apimachinery/pkg/types"
 | |
| 	"k8s.io/client-go/kubernetes/fake"
 | |
| )
 | |
| 
 | |
| func newFakeK8sStreamClient() (k8sutil.KubernetesClient, *fake.Clientset) {
 | |
| 	zalandoClientSet := fakezalandov1alpha1.NewSimpleClientset()
 | |
| 	clientSet := fake.NewSimpleClientset()
 | |
| 
 | |
| 	return k8sutil.KubernetesClient{
 | |
| 		FabricEventStreamsGetter: zalandoClientSet.ZalandoV1alpha1(),
 | |
| 		PostgresqlsGetter:        zalandoClientSet.AcidV1(),
 | |
| 		PodsGetter:               clientSet.CoreV1(),
 | |
| 	}, clientSet
 | |
| }
 | |
| 
 | |
| var (
 | |
| 	clusterName string = "acid-test-cluster"
 | |
| 	namespace   string = "default"
 | |
| 	pg                 = acidv1.Postgresql{
 | |
| 		TypeMeta: metav1.TypeMeta{
 | |
| 			Kind:       "Postgresql",
 | |
| 			APIVersion: "acid.zalan.do/v1",
 | |
| 		},
 | |
| 		ObjectMeta: metav1.ObjectMeta{
 | |
| 			Name:      clusterName,
 | |
| 			Namespace: namespace,
 | |
| 		},
 | |
| 		Spec: acidv1.PostgresSpec{
 | |
| 			Databases: map[string]string{
 | |
| 				"foo": "foo_user",
 | |
| 			},
 | |
| 			Streams: []acidv1.Stream{
 | |
| 				{
 | |
| 					Database: "foo",
 | |
| 					Tables: map[string]string{
 | |
| 						"bar": "stream_type_a",
 | |
| 					},
 | |
| 					BatchSize: uint32(100),
 | |
| 				},
 | |
| 			},
 | |
| 			Users: map[string]acidv1.UserFlags{
 | |
| 				"foo_user": []string{"replication"},
 | |
| 			},
 | |
| 			Volume: acidv1.Volume{
 | |
| 				Size: "1Gi",
 | |
| 			},
 | |
| 		},
 | |
| 	}
 | |
| )
 | |
| 
 | |
| func TestGenerateFabricEventStream(t *testing.T) {
 | |
| 	client, _ := newFakeK8sStreamClient()
 | |
| 
 | |
| 	var cluster = New(
 | |
| 		Config{
 | |
| 			OpConfig: config.Config{
 | |
| 				PodManagementPolicy: "ordered_ready",
 | |
| 				Resources: config.Resources{
 | |
| 					ClusterLabels:        map[string]string{"application": "spilo"},
 | |
| 					ClusterNameLabel:     "cluster-name",
 | |
| 					DefaultCPURequest:    "300m",
 | |
| 					DefaultCPULimit:      "300m",
 | |
| 					DefaultMemoryRequest: "300Mi",
 | |
| 					DefaultMemoryLimit:   "300Mi",
 | |
| 					PodRoleLabel:         "spilo-role",
 | |
| 				},
 | |
| 			},
 | |
| 		}, client, pg, logger, eventRecorder)
 | |
| 
 | |
| 	err := cluster.syncStreams()
 | |
| 	assert.NoError(t, err)
 | |
| 
 | |
| 	streamCRD, err := cluster.KubeClient.FabricEventStreams(namespace).Get(context.TODO(), cluster.Name, metav1.GetOptions{})
 | |
| 	assert.NoError(t, err)
 | |
| 
 | |
| 	result := cluster.generateFabricEventStream()
 | |
| 	if !reflect.DeepEqual(result, streamCRD) {
 | |
| 		t.Errorf("Malformed FabricEventStream, expected %#v, got %#v", streamCRD, result)
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func TestUpdateFabricEventStream(t *testing.T) {
 | |
| 	client, _ := newFakeK8sStreamClient()
 | |
| 
 | |
| 	var cluster = New(
 | |
| 		Config{
 | |
| 			OpConfig: config.Config{
 | |
| 				PodManagementPolicy: "ordered_ready",
 | |
| 				Resources: config.Resources{
 | |
| 					ClusterLabels:        map[string]string{"application": "spilo"},
 | |
| 					ClusterNameLabel:     "cluster-name",
 | |
| 					DefaultCPURequest:    "300m",
 | |
| 					DefaultCPULimit:      "300m",
 | |
| 					DefaultMemoryRequest: "300Mi",
 | |
| 					DefaultMemoryLimit:   "300Mi",
 | |
| 					PodRoleLabel:         "spilo-role",
 | |
| 				},
 | |
| 			},
 | |
| 		}, client, pg, logger, eventRecorder)
 | |
| 
 | |
| 	_, err := cluster.KubeClient.Postgresqls(namespace).Create(
 | |
| 		context.TODO(), &pg, metav1.CreateOptions{})
 | |
| 	assert.NoError(t, err)
 | |
| 	err = cluster.syncStreams()
 | |
| 	assert.NoError(t, err)
 | |
| 
 | |
| 	var pgSpec acidv1.PostgresSpec
 | |
| 	pgSpec.Streams = []acidv1.Stream{
 | |
| 		{
 | |
| 			Database: "foo",
 | |
| 			Tables: map[string]string{
 | |
| 				"bar": "stream_type_b",
 | |
| 			},
 | |
| 			BatchSize: uint32(250),
 | |
| 		},
 | |
| 	}
 | |
| 	patch, err := json.Marshal(struct {
 | |
| 		PostgresSpec interface{} `json:"spec"`
 | |
| 	}{&pgSpec})
 | |
| 	assert.NoError(t, err)
 | |
| 
 | |
| 	pgPatched, err := cluster.KubeClient.Postgresqls(namespace).Patch(
 | |
| 		context.TODO(), cluster.Name, types.MergePatchType, patch, metav1.PatchOptions{}, "spec")
 | |
| 	assert.NoError(t, err)
 | |
| 
 | |
| 	cluster.Postgresql.Spec = pgPatched.Spec
 | |
| 	err = cluster.syncStreams()
 | |
| 	assert.NoError(t, err)
 | |
| 
 | |
| 	streamCRD, err := cluster.KubeClient.FabricEventStreams(namespace).Get(context.TODO(), cluster.Name, metav1.GetOptions{})
 | |
| 	assert.NoError(t, err)
 | |
| 
 | |
| 	result := cluster.generateFabricEventStream()
 | |
| 	if !reflect.DeepEqual(result, streamCRD) {
 | |
| 		t.Errorf("Malformed FabricEventStream, expected %#v, got %#v", streamCRD, result)
 | |
| 	}
 | |
| }
 |