Skip to content
This repository was archived by the owner on Dec 12, 2025. It is now read-only.

Commit 8fb6339

Browse files
CLOUDP-111968: Update automation config when updating TLS (#905)
1 parent a050934 commit 8fb6339

File tree

6 files changed

+77
-1
lines changed

6 files changed

+77
-1
lines changed

.action_templates/jobs/tests.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ tests:
3333
distro: ubi
3434
- test-name: replica_set_tls_rotate
3535
distro: ubi
36+
- test-name: replica_set_tls_rotate_delete_sts
37+
distro: ubi
3638
- test-name: replica_set_tls_upgrade
3739
distro: ubi
3840
- test-name: statefulset_arbitrary_config

.github/workflows/e2e-fork.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,8 @@ jobs:
115115
distro: ubi
116116
- test-name: replica_set_tls_rotate
117117
distro: ubi
118+
- test-name: replica_set_tls_rotate_delete_sts
119+
distro: ubi
118120
- test-name: replica_set_tls_upgrade
119121
distro: ubi
120122
- test-name: statefulset_arbitrary_config

.github/workflows/e2e.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,8 @@ jobs:
121121
distro: ubi
122122
- test-name: replica_set_tls_rotate
123123
distro: ubi
124+
- test-name: replica_set_tls_rotate_delete_sts
125+
distro: ubi
124126
- test-name: replica_set_tls_upgrade
125127
distro: ubi
126128
- test-name: statefulset_arbitrary_config

controllers/replica_set_controller.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -396,7 +396,11 @@ func (r *ReplicaSetReconciler) deployAutomationConfig(mdb mdbv1.MongoDBCommunity
396396
// functions should be sequential or not. A value of false indicates they will run in reversed order.
397397
func (r *ReplicaSetReconciler) shouldRunInOrder(mdb mdbv1.MongoDBCommunity) bool {
398398
// The only case when we push the StatefulSet first is when we are ensuring TLS for the already existing ReplicaSet
399-
_, err := r.client.GetStatefulSet(mdb.NamespacedName())
399+
sts, err := r.client.GetStatefulSet(mdb.NamespacedName())
400+
if !statefulset.IsReady(sts, mdb.StatefulSetReplicasThisReconciliation()) && mdb.Spec.Security.TLS.Enabled {
401+
r.log.Debug("Enabling TLS on a deployment with a StatefulSet that is not Ready, the Automation Config must be updated first")
402+
return true
403+
}
400404
if err == nil && mdb.Spec.Security.TLS.Enabled {
401405
r.log.Debug("Enabling TLS on an existing deployment, the StatefulSet must be updated first")
402406
return false

deploy/e2e/role.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ rules:
134134
- watch
135135
- create
136136
- delete
137+
- patch
137138
- update
138139
- apiGroups:
139140
- acme.cert-manager.io
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package replica_set_tls_rotate_delete_sts
2+
3+
import (
4+
"os"
5+
"testing"
6+
7+
"fmt"
8+
9+
. "github.com/mongodb/mongodb-kubernetes-operator/test/e2e/util/mongotester"
10+
11+
e2eutil "github.com/mongodb/mongodb-kubernetes-operator/test/e2e"
12+
"github.com/mongodb/mongodb-kubernetes-operator/test/e2e/mongodbtests"
13+
"github.com/mongodb/mongodb-kubernetes-operator/test/e2e/setup"
14+
"github.com/mongodb/mongodb-kubernetes-operator/test/e2e/tlstests"
15+
)
16+
17+
func TestMain(m *testing.M) {
18+
code, err := e2eutil.RunTest(m)
19+
if err != nil {
20+
fmt.Println(err)
21+
}
22+
os.Exit(code)
23+
}
24+
25+
func TestReplicaSetTLSRotateDeleteSts(t *testing.T) {
26+
resourceName := "mdb-tls"
27+
28+
ctx, testConfig := setup.SetupWithTLS(t, resourceName)
29+
defer ctx.Teardown()
30+
31+
mdb, user := e2eutil.NewTestMongoDB(ctx, resourceName, testConfig.Namespace)
32+
mdb.Spec.Security.TLS = e2eutil.NewTestTLSConfig(false)
33+
34+
_, err := setup.GeneratePasswordForUser(ctx, user, testConfig.Namespace)
35+
if err != nil {
36+
t.Fatal(err)
37+
}
38+
39+
tester, err := FromResource(t, mdb)
40+
if err != nil {
41+
t.Fatal(err)
42+
}
43+
44+
clientCert, err := GetClientCert(mdb)
45+
if err != nil {
46+
t.Fatal(err)
47+
}
48+
initialCertSerialNumber := clientCert.SerialNumber
49+
50+
t.Run("Create MongoDB Resource", mongodbtests.CreateMongoDBResource(&mdb, ctx))
51+
t.Run("Basic tests", mongodbtests.BasicFunctionality(&mdb))
52+
t.Run("Wait for TLS to be enabled", tester.HasTlsMode("requireSSL", 60, WithTls(mdb)))
53+
t.Run("Test Basic TLS Connectivity", tester.ConnectivitySucceeds(WithTls(mdb)))
54+
t.Run("Ensure Authentication", tester.EnsureAuthenticationIsConfigured(3, WithTls(mdb)))
55+
t.Run("Test TLS required", tester.ConnectivityFails(WithoutTls()))
56+
57+
t.Run("MongoDB is reachable while certificate is rotated", func(t *testing.T) {
58+
t.Run("Delete Statefulset", mongodbtests.DeleteStatefulSet(&mdb))
59+
t.Run("Update certificate secret", tlstests.RotateCertificate(&mdb))
60+
t.Run("Wait for certificate to be rotated", tester.WaitForRotatedCertificate(mdb, initialCertSerialNumber))
61+
t.Run("Test Replica Set Recovers", mongodbtests.StatefulSetBecomesReady(&mdb))
62+
t.Run("Wait for MongoDB to reach Running Phase", mongodbtests.MongoDBReachesRunningPhase(&mdb))
63+
t.Run("Test Basic TLS Connectivity", tester.ConnectivitySucceeds(WithTls(mdb)))
64+
})
65+
}

0 commit comments

Comments
 (0)