Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions pkg/controller/perconaservermongodb/secrets.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,6 @@ func ensureConnectionStringSecret(
cr *api.PerconaServerMongoDB,
secretName, keyPrefix string,
cred psmdb.Credentials,
owner metav1.Object,
includeReplsets bool,
) error {
connStrSecret := &corev1.Secret{
Expand All @@ -73,7 +72,7 @@ func ensureConnectionStringSecret(
if err := fillUserConnectionString(ctx, cl, connStrSecret.Data, cr, keyPrefix, cred, includeReplsets); err != nil {
return errors.Wrap(err, "fill user connection string")
}
if err := controllerutil.SetOwnerReference(owner, connStrSecret, cl.Scheme()); err != nil {
if err := controllerutil.SetOwnerReference(cr, connStrSecret, cl.Scheme()); err != nil {
return errors.Wrap(err, "set owner reference")
}
return nil
Expand Down
10 changes: 5 additions & 5 deletions pkg/controller/perconaservermongodb/secrets_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,7 @@ func TestEnsureConnectionStringSecret(t *testing.T) {
}
},
expected: map[string][]byte{
"app_user_mongos_connectionString": []byte("mongodb://app-user:p%40ss%2Fword@10.0.0.20:27017/?authSource=application"),
"app_user_mongos_connectionString": []byte("mongodb://app-user:p%40ss%2Fword@cluster-mongos-0.database.svc.cluster.local:27017/?authSource=application"),
"app_user_mongos_connectionStringExposed": []byte("mongodb://app-user:p%40ss%2Fword@mongos.example.com:27017/?authSource=application"),
},
},
Expand Down Expand Up @@ -173,7 +173,6 @@ func TestEnsureConnectionStringSecret(t *testing.T) {
Password: "p@ss/word",
AuthSource: "application",
},
owner,
tt.includeReplsets,
)
require.NoError(t, err)
Expand All @@ -188,8 +187,8 @@ func TestEnsureConnectionStringSecret(t *testing.T) {
assert.Empty(t, validation.IsConfigMapKey(key))
}
require.Len(t, actual.OwnerReferences, 1)
assert.Equal(t, owner.UID, actual.OwnerReferences[0].UID)
assert.Equal(t, "Secret", actual.OwnerReferences[0].Kind)
assert.Equal(t, cr.UID, actual.OwnerReferences[0].UID)
assert.Equal(t, "PerconaServerMongoDB", actual.OwnerReferences[0].Kind)
})
}
}
Expand Down Expand Up @@ -231,7 +230,8 @@ func TestReconcileUsersCreatesConnectionStringSecretWhenCredentialsUnchanged(t *
Namespace: cr.Namespace,
}
require.NoError(t, r.client.Get(t.Context(), key, actual))
assert.Equal(t,
assert.Equal(
t,
[]byte("mongodb://databaseAdmin:password@cluster-rs0-0.cluster-rs0.database.svc.cluster.local:27017/?authSource=admin&replicaSet=rs0"),
actual.Data["databaseAdmin_rs0_connectionString"],
)
Expand Down
1 change: 0 additions & 1 deletion pkg/controller/perconaservermongodb/users.go
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,6 @@ func (r *ReconcilePerconaServerMongoDB) reconcileUsers(ctx context.Context, cr *
naming.SecretDatabaseAdminConnStrName(cr),
string(api.RoleDatabaseAdmin),
cred,
&sysUsersSecretObj,
true,
); err != nil {
return errors.Wrap(err, "ensure connection string secret")
Expand Down
69 changes: 68 additions & 1 deletion pkg/psmdb/client_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -210,6 +210,54 @@ func TestMongoConfigReturnsServiceImportLookupError(t *testing.T) {
}
}

func TestMongoConfigSkipsTerminatingPods(t *testing.T) {
cr := clientTestCluster()
rs := cr.Spec.Replsets[0]
rs.Size = 2

stsLabels := naming.RSLabels(cr, rs)
stsLabels[naming.LabelKubernetesComponent] = naming.ComponentMongod

pod0 := clientTestPod(cr, "cluster-rs0-0", naming.RSLabels(cr, rs))
pod0.Labels[naming.LabelKubernetesComponent] = naming.ComponentMongod

pod1 := clientTestPod(cr, "cluster-rs0-1", naming.RSLabels(cr, rs))
pod1.Labels[naming.LabelKubernetesComponent] = naming.ComponentMongod
now := metav1.Now()
pod1.DeletionTimestamp = &now
pod1.Finalizers = []string{"test/finalizer"}

cl := fake.NewClientBuilder().
WithScheme(clientTestScheme(t)).
WithObjects(
&appsv1.StatefulSet{
ObjectMeta: metav1.ObjectMeta{
Name: "cluster-rs0",
Namespace: cr.Namespace,
Labels: stsLabels,
},
},
pod0,
pod1,
).
Build()

cfg, err := MongoConfig(
t.Context(),
cl,
cr,
api.DNSModeInternal,
rs,
clientTestCredentials(),
false,
)
require.NoError(t, err)
assert.Equal(t,
"mongodb://app-user:p%40ss%2Fword@cluster-rs0-0.cluster-rs0.database.svc.cluster.local:27017/?authSource=application&replicaSet=rs0",
cfg.URI(),
)
}

func TestMongosConfigURIFromMongosAddrs(t *testing.T) {
tests := map[string]struct {
servicePerPod bool
Expand Down Expand Up @@ -239,6 +287,25 @@ func TestMongosConfigURIFromMongosAddrs(t *testing.T) {
},
expectedURI: "mongodb://app-user:p%40ss%2Fword@cluster-mongos-0.database.svc.cluster.local:27017,cluster-mongos-1.database.svc.cluster.local:27017/?authSource=application",
},
"service per pod skips terminating pods": {
servicePerPod: true,
useInternalAddr: true,
objects: func(cr *api.PerconaServerMongoDB) []client.Object {
labels := naming.MongosLabels(cr)
pod0 := clientTestPod(cr, "cluster-mongos-0", labels)
pod1 := clientTestPod(cr, "cluster-mongos-1", labels)
now := metav1.Now()
pod1.DeletionTimestamp = &now
pod1.Finalizers = []string{"test/finalizer"}
return []client.Object{
pod0,
pod1,
clientTestMongosService(cr, "cluster-mongos-0"),
clientTestMongosService(cr, "cluster-mongos-1"),
}
},
expectedURI: "mongodb://app-user:p%40ss%2Fword@cluster-mongos-0.database.svc.cluster.local:27017/?authSource=application",
},
"load balancer internal address": {
exposeType: corev1.ServiceTypeLoadBalancer,
useInternalAddr: true,
Expand All @@ -248,7 +315,7 @@ func TestMongosConfigURIFromMongosAddrs(t *testing.T) {
svc.Spec.ClusterIP = "10.0.0.20"
return []client.Object{svc}
},
expectedURI: "mongodb://app-user:p%40ss%2Fword@10.0.0.20:27017/?authSource=application",
expectedURI: "mongodb://app-user:p%40ss%2Fword@cluster-mongos.database.svc.cluster.local:27017/?authSource=application",
},
"load balancer external address": {
exposeType: corev1.ServiceTypeLoadBalancer,
Expand Down
30 changes: 10 additions & 20 deletions pkg/psmdb/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -232,21 +232,15 @@ func getServiceIngressAddr(ctx context.Context, cl client.Client, serviceNN type
return "", ErrNoIngressPoints
}

func getServiceClusterIP(ctx context.Context, cl client.Client, serviceNN types.NamespacedName) (string, error) {
svc := &corev1.Service{}
err := cl.Get(ctx, serviceNN, svc)
if err != nil {
return "", errors.Wrap(err, "failed to fetch service")
}

return svc.Spec.ClusterIP, nil
}

// GetReplsetAddrs returns a slice of replset host:port addresses
func GetReplsetAddrs(ctx context.Context, cl client.Client, cr *api.PerconaServerMongoDB, dnsMode api.DNSMode, rs *api.ReplsetSpec, rsExposed bool, pods []corev1.Pod) ([]string, error) {
addrs := make([]string, 0)

for _, pod := range pods {
if pod.DeletionTimestamp != nil {
continue
}

Comment on lines 239 to +243
host, err := MongoHost(ctx, cl, cr, dnsMode, rs, rsExposed, pod)
if err != nil {
return nil, errors.Wrapf(err, "failed to get external hostname for pod %s", pod.Name)
Expand Down Expand Up @@ -274,6 +268,10 @@ func GetMongosAddrs(ctx context.Context, cl client.Client, cr *api.PerconaServer

addrs := make([]string, 0, len(list.Items))
for _, pod := range list.Items {
if pod.DeletionTimestamp != nil {
continue
}

Comment on lines 270 to +274
host, err := MongosHost(ctx, cl, cr, &pod, useInternalAddr)
if err != nil {
return nil, errors.Wrap(err, "failed to get mongos host")
Expand Down Expand Up @@ -374,16 +372,8 @@ func MongosHost(ctx context.Context, cl client.Client, cr *api.PerconaServerMong
}

mongos := cr.Spec.Sharding.Mongos
if mongos.Expose.ExposeType == corev1.ServiceTypeLoadBalancer && svc.Spec.Type == corev1.ServiceTypeLoadBalancer {
var host string
var err error

if useInternalAddr {
host, err = getServiceClusterIP(ctx, cl, nn)
} else {
host, err = getServiceIngressAddr(ctx, cl, nn)
}

if !useInternalAddr && mongos.Expose.ExposeType == corev1.ServiceTypeLoadBalancer && svc.Spec.Type == corev1.ServiceTypeLoadBalancer {
host, err := getServiceIngressAddr(ctx, cl, nn)
if err != nil {
return "", errors.Wrap(err, "get ingress endpoint")
}
Expand Down
2 changes: 1 addition & 1 deletion pkg/psmdb/service_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ func TestMongosHost(t *testing.T) {
},
useInternal: true,
exposeType: corev1.ServiceTypeLoadBalancer,
expectedHost: "10.0.0.20:27018",
expectedHost: "test-cluster-mongos.default.svc.cluster.local:27018",
},
"err: clusterip service type and port not found": {
init: func(cl client.Client) {
Expand Down
Loading