Skip to content

Commit 37d6993

Browse files
authored
remove stream resources after drop from Postgres manifest (#2563)
* remove stream resources after drop from Postgres manifest
1 parent 7cdc23f commit 37d6993

File tree

4 files changed

+44
-4
lines changed

4 files changed

+44
-4
lines changed

pkg/cluster/cluster.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1082,7 +1082,7 @@ func (c *Cluster) Update(oldSpec, newSpec *acidv1.Postgresql) error {
10821082
}
10831083

10841084
// streams
1085-
if len(newSpec.Spec.Streams) > 0 {
1085+
if len(newSpec.Spec.Streams) > 0 || len(oldSpec.Spec.Streams) != len(newSpec.Spec.Streams) {
10861086
if err := c.syncStreams(); err != nil {
10871087
c.logger.Errorf("could not sync streams: %v", err)
10881088
updateFailed = true

pkg/cluster/streams.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -327,7 +327,8 @@ func (c *Cluster) syncStreams() error {
327327
if len(slotsToSync) > 0 {
328328
requiredPatroniConfig.Slots = slotsToSync
329329
} else {
330-
return nil
330+
// try to delete existing stream resources
331+
return c.deleteStreams()
331332
}
332333

333334
c.logger.Debug("syncing logical replication slots")

pkg/cluster/streams_test.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -455,4 +455,21 @@ func TestUpdateFabricEventStream(t *testing.T) {
455455
if match, _ := sameStreams(streams.Items[0].Spec.EventStreams, result.Spec.EventStreams); !match {
456456
t.Errorf("Malformed FabricEventStream after disabling event recovery, expected %#v, got %#v", streams.Items[0], result)
457457
}
458+
459+
mockClient := k8sutil.NewMockKubernetesClient()
460+
cluster.KubeClient.CustomResourceDefinitionsGetter = mockClient.CustomResourceDefinitionsGetter
461+
462+
// remove streams from manifest
463+
pgPatched.Spec.Streams = nil
464+
pgUpdated, err := cluster.KubeClient.Postgresqls(namespace).Update(
465+
context.TODO(), pgPatched, metav1.UpdateOptions{})
466+
assert.NoError(t, err)
467+
468+
cluster.Postgresql.Spec = pgUpdated.Spec
469+
cluster.syncStreams()
470+
471+
streamList, err := cluster.KubeClient.FabricEventStreams(namespace).List(context.TODO(), listOptions)
472+
if len(streamList.Items) > 0 || err != nil {
473+
t.Errorf("stream resource has not been removed or unexpected error %v", err)
474+
}
458475
}

pkg/util/k8sutil/k8sutil.go

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,9 @@ import (
1616
"github.com/zalando/postgres-operator/pkg/spec"
1717
apiappsv1 "k8s.io/api/apps/v1"
1818
v1 "k8s.io/api/core/v1"
19+
apiextv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
1920
apiextclient "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
20-
apiextv1 "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1"
21+
apiextv1client "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1"
2122
apierrors "k8s.io/apimachinery/pkg/api/errors"
2223
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2324
"k8s.io/apimachinery/pkg/types"
@@ -59,7 +60,7 @@ type KubernetesClient struct {
5960
appsv1.DeploymentsGetter
6061
rbacv1.RoleBindingsGetter
6162
policyv1.PodDisruptionBudgetsGetter
62-
apiextv1.CustomResourceDefinitionsGetter
63+
apiextv1client.CustomResourceDefinitionsGetter
6364
clientbatchv1.CronJobsGetter
6465
acidv1.OperatorConfigurationsGetter
6566
acidv1.PostgresTeamsGetter
@@ -71,6 +72,13 @@ type KubernetesClient struct {
7172
Zalandov1ClientSet *zalandoclient.Clientset
7273
}
7374

75+
type mockCustomResourceDefinition struct {
76+
apiextv1client.CustomResourceDefinitionInterface
77+
}
78+
79+
type MockCustomResourceDefinitionsGetter struct {
80+
}
81+
7482
type mockSecret struct {
7583
corev1.SecretInterface
7684
}
@@ -240,6 +248,18 @@ func (client *KubernetesClient) SetFinalizer(clusterName spec.NamespacedName, pg
240248
return updatedPg, nil
241249
}
242250

251+
func (c *mockCustomResourceDefinition) Get(ctx context.Context, name string, options metav1.GetOptions) (*apiextv1.CustomResourceDefinition, error) {
252+
return &apiextv1.CustomResourceDefinition{}, nil
253+
}
254+
255+
func (c *mockCustomResourceDefinition) Create(ctx context.Context, crd *apiextv1.CustomResourceDefinition, options metav1.CreateOptions) (*apiextv1.CustomResourceDefinition, error) {
256+
return &apiextv1.CustomResourceDefinition{}, nil
257+
}
258+
259+
func (mock *MockCustomResourceDefinitionsGetter) CustomResourceDefinitions() apiextv1client.CustomResourceDefinitionInterface {
260+
return &mockCustomResourceDefinition{}
261+
}
262+
243263
func (c *mockSecret) Get(ctx context.Context, name string, options metav1.GetOptions) (*v1.Secret, error) {
244264
oldFormatSecret := &v1.Secret{}
245265
oldFormatSecret.Name = "testcluster"
@@ -444,6 +464,8 @@ func NewMockKubernetesClient() KubernetesClient {
444464
ConfigMapsGetter: &MockConfigMapsGetter{},
445465
DeploymentsGetter: &MockDeploymentGetter{},
446466
ServicesGetter: &MockServiceGetter{},
467+
468+
CustomResourceDefinitionsGetter: &MockCustomResourceDefinitionsGetter{},
447469
}
448470
}
449471

0 commit comments

Comments
 (0)