77
88 "github.com/mongodb/mongodb-kubernetes-operator/controllers/construct"
99 "github.com/mongodb/mongodb-kubernetes-operator/pkg/automationconfig"
10+ "github.com/pkg/errors"
1011
1112 "github.com/mongodb/mongodb-kubernetes-operator/pkg/kube/secret"
1213
@@ -15,7 +16,6 @@ import (
1516 "github.com/mongodb/mongodb-kubernetes-operator/pkg/kube/podtemplatespec"
1617 "github.com/mongodb/mongodb-kubernetes-operator/pkg/kube/statefulset"
1718
18- v1 "k8s.io/api/core/v1"
1919 apiErrors "k8s.io/apimachinery/pkg/api/errors"
2020 "k8s.io/apimachinery/pkg/types"
2121
@@ -40,35 +40,17 @@ func (r *ReplicaSetReconciler) validateTLSConfig(mdb mdbv1.MongoDBCommunity) (bo
4040 r .log .Info ("Ensuring TLS is correctly configured" )
4141
4242 // Ensure CA cert is configured
43- var caResourceName types.NamespacedName
44- var caResourceType string
45- var caData map [string ]string
46- var err error
47- if mdb .Spec .Security .TLS .CaCertificateSecret != nil {
48- caResourceName = mdb .TLSCaCertificateSecretNamespacedName ()
49- caResourceType = "Secret"
50- caData , err = secret .ReadStringData (r .client , caResourceName )
51- } else {
52- caResourceName = mdb .TLSConfigMapNamespacedName ()
53- caResourceType = "ConfigMap"
54- caData , err = configmap .ReadData (r .client , caResourceName )
55- }
43+ _ , err := getCaCrt (r .client , r .client , mdb )
5644
5745 if err != nil {
5846 if apiErrors .IsNotFound (err ) {
59- r .log .Warnf (` CA %s "%s" not found` , caResourceType , caResourceName )
47+ r .log .Warnf (" CA resource not found: %s" , err )
6048 return false , nil
6149 }
6250
6351 return false , err
6452 }
6553
66- // Ensure Secret or ConfigMap has a "ca.crt" field
67- if cert , ok := caData [tlsCACertName ]; ! ok || cert == "" {
68- r .log .Warnf (`%s "%s" should have a CA certificate in field "%s"` , caResourceType , caResourceName , tlsCACertName )
69- return false , nil
70- }
71-
7254 // Ensure Secret exists
7355 _ , err = secret .ReadStringData (r .client , mdb .TLSSecretNamespacedName ())
7456 if err != nil {
@@ -91,23 +73,35 @@ func (r *ReplicaSetReconciler) validateTLSConfig(mdb mdbv1.MongoDBCommunity) (bo
9173 // Watch certificate-key secret to handle rotations
9274 r .secretWatcher .Watch (mdb .TLSSecretNamespacedName (), mdb .NamespacedName ())
9375
76+ // Watch CA certificate changes
77+ if mdb .Spec .Security .TLS .CaCertificateSecret != nil {
78+ r .secretWatcher .Watch (mdb .TLSCaCertificateSecretNamespacedName (), mdb .NamespacedName ())
79+ } else {
80+ r .configMapWatcher .Watch (mdb .TLSConfigMapNamespacedName (), mdb .NamespacedName ())
81+ }
82+
9483 r .log .Infof ("Successfully validated TLS config" )
9584 return true , nil
9685}
9786
9887// getTLSConfigModification creates a modification function which enables TLS in the automation config.
9988// It will also ensure that the combined cert-key secret is created.
100- func getTLSConfigModification (getUpdateCreator secret.GetUpdateCreator , mdb mdbv1.MongoDBCommunity ) (automationconfig.Modification , error ) {
89+ func getTLSConfigModification (cmGetter configmap. Getter , secretGetter secret.Getter , mdb mdbv1.MongoDBCommunity ) (automationconfig.Modification , error ) {
10190 if ! mdb .Spec .Security .TLS .Enabled {
10291 return automationconfig .NOOP (), nil
10392 }
10493
105- certKey , err := getPemOrConcatenatedCrtAndKey ( getUpdateCreator , mdb , mdb . TLSSecretNamespacedName () )
94+ caCert , err := getCaCrt ( cmGetter , secretGetter , mdb )
10695 if err != nil {
10796 return automationconfig .NOOP (), err
10897 }
10998
110- return tlsConfigModification (mdb , certKey ), nil
99+ certKey , err := getPemOrConcatenatedCrtAndKey (secretGetter , mdb , mdb .TLSSecretNamespacedName ())
100+ if err != nil {
101+ return automationconfig .NOOP (), err
102+ }
103+
104+ return tlsConfigModification (mdb , certKey , caCert ), nil
111105}
112106
113107// getCertAndKey will fetch the certificate and key from the user-provided Secret.
@@ -162,6 +156,48 @@ func getPemOrConcatenatedCrtAndKey(getter secret.Getter, mdb mdbv1.MongoDBCommun
162156 return certKey , nil
163157}
164158
159+ func getCaCrt (cmGetter configmap.Getter , secretGetter secret.Getter , mdb mdbv1.MongoDBCommunity ) (string , error ) {
160+ var caResourceName types.NamespacedName
161+ var caData map [string ]string
162+ var err error
163+ if mdb .Spec .Security .TLS .CaCertificateSecret != nil {
164+ caResourceName = mdb .TLSCaCertificateSecretNamespacedName ()
165+ caData , err = secret .ReadStringData (secretGetter , caResourceName )
166+ } else {
167+ caResourceName = mdb .TLSConfigMapNamespacedName ()
168+ caData , err = configmap .ReadData (cmGetter , caResourceName )
169+ }
170+ if err != nil {
171+ return "" , err
172+ }
173+
174+ if cert , ok := caData [tlsCACertName ]; ! ok || cert == "" {
175+ return "" , errors .Errorf (`CA certificate resource "%s" should have a CA certificate in field "%s"` , caResourceName , tlsCACertName )
176+ } else {
177+ return cert , nil
178+ }
179+ }
180+
181+ // ensureCASecret will create or update the operator managed Secret containing
182+ // the CA certficate from the user provided Secret or ConfigMap.
183+ func ensureCASecret (cmGetter configmap.Getter , secretGetter secret.Getter , getUpdateCreator secret.GetUpdateCreator , mdb mdbv1.MongoDBCommunity ) error {
184+ cert , err := getCaCrt (cmGetter , secretGetter , mdb )
185+ if err != nil {
186+ return err
187+ }
188+
189+ caFileName := tlsOperatorSecretFileName (cert )
190+
191+ operatorSecret := secret .Builder ().
192+ SetName (mdb .TLSOperatorCASecretNamespacedName ().Name ).
193+ SetNamespace (mdb .TLSOperatorCASecretNamespacedName ().Namespace ).
194+ SetField (caFileName , cert ).
195+ SetOwnerReferences (mdb .GetOwnerReferences ()).
196+ Build ()
197+
198+ return secret .CreateOrUpdate (getUpdateCreator , operatorSecret )
199+ }
200+
165201// ensureTLSSecret will create or update the operator-managed Secret containing
166202// the concatenated certificate and key from the user-provided Secret.
167203func ensureTLSSecret (getUpdateCreator secret.GetUpdateCreator , mdb mdbv1.MongoDBCommunity ) error {
@@ -214,8 +250,8 @@ func tlsOperatorSecretFileName(certKey string) string {
214250}
215251
216252// tlsConfigModification will enable TLS in the automation config.
217- func tlsConfigModification (mdb mdbv1.MongoDBCommunity , certKey string ) automationconfig.Modification {
218- caCertificatePath := tlsCAMountPath + tlsCACertName
253+ func tlsConfigModification (mdb mdbv1.MongoDBCommunity , certKey , caCert string ) automationconfig.Modification {
254+ caCertificatePath := tlsCAMountPath + tlsOperatorSecretFileName ( caCert )
219255 certificateKeyPath := tlsOperatorSecretMountPath + tlsOperatorSecretFileName (certKey )
220256
221257 mode := automationconfig .TLSModeRequired
@@ -247,12 +283,7 @@ func buildTLSPodSpecModification(mdb mdbv1.MongoDBCommunity) podtemplatespec.Mod
247283
248284 // Configure a volume which mounts the CA certificate from either a Secret or a ConfigMap
249285 // The certificate is used by both mongod and the agent
250- var caVolume v1.Volume
251- if mdb .Spec .Security .TLS .CaCertificateSecret != nil {
252- caVolume = statefulset .CreateVolumeFromSecret ("tls-ca" , mdb .Spec .Security .TLS .CaCertificateSecret .Name )
253- } else {
254- caVolume = statefulset .CreateVolumeFromConfigMap ("tls-ca" , mdb .Spec .Security .TLS .CaConfigMap .Name )
255- }
286+ caVolume := statefulset .CreateVolumeFromSecret ("tls-ca" , mdb .TLSOperatorCASecretNamespacedName ().Name )
256287 caVolumeMount := statefulset .CreateVolumeMount (caVolume .Name , tlsCAMountPath , statefulset .WithReadOnly (true ))
257288
258289 // Configure a volume which mounts the secret holding the server key and certificate
0 commit comments