package cluster import ( "testing" "time" "context" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" "github.com/stretchr/testify/assert" acidv1 "github.com/zalando/postgres-operator/pkg/apis/acid.zalan.do/v1" fakeacidv1 "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" "k8s.io/client-go/kubernetes/fake" ) func newFakeK8sSyncClient() (k8sutil.KubernetesClient, *fake.Clientset) { acidClientSet := fakeacidv1.NewSimpleClientset() clientSet := fake.NewSimpleClientset() return k8sutil.KubernetesClient{ PodsGetter: clientSet.CoreV1(), PostgresqlsGetter: acidClientSet.AcidV1(), StatefulSetsGetter: clientSet.AppsV1(), }, clientSet } func TestSyncStatefulSetsAnnotations(t *testing.T) { testName := "test syncing statefulsets annotations" client, _ := newFakeK8sSyncClient() clusterName := "acid-test-cluster" namespace := "default" inheritedAnnotation := "environment" pg := acidv1.Postgresql{ ObjectMeta: metav1.ObjectMeta{ Name: clusterName, Namespace: namespace, Annotations: map[string]string{inheritedAnnotation: "test"}, }, Spec: acidv1.PostgresSpec{ Volume: acidv1.Volume{ Size: "1Gi", }, }, } 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", InheritedAnnotations: []string{inheritedAnnotation}, PodRoleLabel: "spilo-role", ResourceCheckInterval: time.Duration(3), ResourceCheckTimeout: time.Duration(10), }, }, }, client, pg, logger, eventRecorder) cluster.Name = clusterName cluster.Namespace = namespace // create a statefulset _, err := cluster.createStatefulSet() assert.NoError(t, err) // patch statefulset and add annotation patchData, err := metaAnnotationsPatch(map[string]string{"test-anno": "true"}) assert.NoError(t, err) newSts, err := cluster.KubeClient.StatefulSets(namespace).Patch( context.TODO(), clusterName, types.MergePatchType, []byte(patchData), metav1.PatchOptions{}, "") assert.NoError(t, err) cluster.Statefulset = newSts // first compare running with desired statefulset - they should not match // because no inherited annotations or downscaler annotations are configured desiredSts, err := cluster.generateStatefulSet(&cluster.Postgresql.Spec) assert.NoError(t, err) cmp := cluster.compareStatefulSetWith(desiredSts) if cmp.match { t.Errorf("%s: match between current and desired statefulsets albeit differences: %#v", testName, cmp) } // now sync statefulset - the diff will trigger a replacement of the statefulset cluster.syncStatefulSet() // compare again after the SYNC - must be identical to the desired state cmp = cluster.compareStatefulSetWith(desiredSts) if !cmp.match { t.Errorf("%s: current and desired statefulsets are not matching %#v", testName, cmp) } // check if inherited annotation exists if _, exists := desiredSts.Annotations[inheritedAnnotation]; !exists { t.Errorf("%s: inherited annotation not found in desired statefulset: %#v", testName, desiredSts.Annotations) } }