@@ -82,7 +82,7 @@ func (r *ReplicaSetReconciler) validateTLSConfig(mdb mdbv1.MongoDBCommunity) (bo
8282
8383 // validate whether the secret contains "tls.crt" and "tls.key", or it contains "tls.pem"
8484 // if it contains all three, then the pem entry should be equal to the concatenation of crt and key
85- _ , err = getPemOrConcatenatedCrtAndKey (r .client , mdb )
85+ _ , err = getPemOrConcatenatedCrtAndKey (r .client , mdb , mdb . TLSSecretNamespacedName () )
8686 if err != nil {
8787 r .log .Warnf (err .Error ())
8888 return false , nil
@@ -102,7 +102,7 @@ func getTLSConfigModification(getUpdateCreator secret.GetUpdateCreator, mdb mdbv
102102 return automationconfig .NOOP (), nil
103103 }
104104
105- certKey , err := getPemOrConcatenatedCrtAndKey (getUpdateCreator , mdb )
105+ certKey , err := getPemOrConcatenatedCrtAndKey (getUpdateCreator , mdb , mdb . TLSSecretNamespacedName () )
106106 if err != nil {
107107 return automationconfig .NOOP (), err
108108 }
@@ -111,13 +111,13 @@ func getTLSConfigModification(getUpdateCreator secret.GetUpdateCreator, mdb mdbv
111111}
112112
113113// getCertAndKey will fetch the certificate and key from the user-provided Secret.
114- func getCertAndKey (getter secret.Getter , mdb mdbv1.MongoDBCommunity ) string {
115- cert , err := secret .ReadKey (getter , tlsSecretCertName , mdb . TLSSecretNamespacedName () )
114+ func getCertAndKey (getter secret.Getter , mdb mdbv1.MongoDBCommunity , secretName types. NamespacedName ) string {
115+ cert , err := secret .ReadKey (getter , tlsSecretCertName , secretName )
116116 if err != nil {
117117 return ""
118118 }
119119
120- key , err := secret .ReadKey (getter , tlsSecretKeyName , mdb . TLSSecretNamespacedName () )
120+ key , err := secret .ReadKey (getter , tlsSecretKeyName , secretName )
121121 if err != nil {
122122 return ""
123123 }
@@ -126,8 +126,8 @@ func getCertAndKey(getter secret.Getter, mdb mdbv1.MongoDBCommunity) string {
126126}
127127
128128// getPem will fetch the pem from the user-provided secret
129- func getPem (getter secret.Getter , mdb mdbv1.MongoDBCommunity ) string {
130- pem , err := secret .ReadKey (getter , tlsSecretPemName , mdb . TLSSecretNamespacedName () )
129+ func getPem (getter secret.Getter , mdb mdbv1.MongoDBCommunity , secretName types. NamespacedName ) string {
130+ pem , err := secret .ReadKey (getter , tlsSecretPemName , secretName )
131131 if err != nil {
132132 return ""
133133 }
@@ -144,9 +144,9 @@ func combineCertificateAndKey(cert, key string) string {
144144// This is either the tls.pem entry in the given secret, or the concatenation
145145// of tls.crt and tls.key
146146// It performs a basic validation on the entries.
147- func getPemOrConcatenatedCrtAndKey (getter secret.Getter , mdb mdbv1.MongoDBCommunity ) (string , error ) {
148- certKey := getCertAndKey (getter , mdb )
149- pem := getPem (getter , mdb )
147+ func getPemOrConcatenatedCrtAndKey (getter secret.Getter , mdb mdbv1.MongoDBCommunity , secretName types. NamespacedName ) (string , error ) {
148+ certKey := getCertAndKey (getter , mdb , secretName )
149+ pem := getPem (getter , mdb , secretName )
150150 if certKey == "" && pem == "" {
151151 return "" , fmt .Errorf (`Neither "%s" nor the pair "%s"/"%s" were present in the TLS secret` , tlsSecretPemName , tlsSecretCertName , tlsSecretKeyName )
152152 }
@@ -165,7 +165,7 @@ func getPemOrConcatenatedCrtAndKey(getter secret.Getter, mdb mdbv1.MongoDBCommun
165165// ensureTLSSecret will create or update the operator-managed Secret containing
166166// the concatenated certificate and key from the user-provided Secret.
167167func ensureTLSSecret (getUpdateCreator secret.GetUpdateCreator , mdb mdbv1.MongoDBCommunity ) error {
168- certKey , err := getPemOrConcatenatedCrtAndKey (getUpdateCreator , mdb )
168+ certKey , err := getPemOrConcatenatedCrtAndKey (getUpdateCreator , mdb , mdb . TLSSecretNamespacedName () )
169169 if err != nil {
170170 return err
171171 }
@@ -182,6 +182,26 @@ func ensureTLSSecret(getUpdateCreator secret.GetUpdateCreator, mdb mdbv1.MongoDB
182182 return secret .CreateOrUpdate (getUpdateCreator , operatorSecret )
183183}
184184
185+ // ensurePrometheusTLSSecret will create or update the operator-managed Secret containing
186+ // the concatenated certificate and key from the user-provided Secret.
187+ func ensurePrometheusTLSSecret (getUpdateCreator secret.GetUpdateCreator , mdb mdbv1.MongoDBCommunity ) error {
188+ certKey , err := getPemOrConcatenatedCrtAndKey (getUpdateCreator , mdb , mdb .DeepCopy ().PrometheusTLSSecretNamespacedName ())
189+ if err != nil {
190+ return err
191+ }
192+ // Calculate file name from certificate and key
193+ fileName := tlsOperatorSecretFileName (certKey )
194+
195+ operatorSecret := secret .Builder ().
196+ SetName (mdb .PrometheusTLSOperatorSecretNamespacedName ().Name ).
197+ SetNamespace (mdb .PrometheusTLSOperatorSecretNamespacedName ().Namespace ).
198+ SetField (fileName , certKey ).
199+ SetOwnerReferences (mdb .GetOwnerReferences ()).
200+ Build ()
201+
202+ return secret .CreateOrUpdate (getUpdateCreator , operatorSecret )
203+ }
204+
185205// tlsOperatorSecretFileName calculates the file name to use for the mounted
186206// certificate-key file. The name is based on the hash of the combined cert and key.
187207// If the certificate or key changes, the file path changes as well which will trigger
@@ -250,3 +270,27 @@ func buildTLSPodSpecModification(mdb mdbv1.MongoDBCommunity) podtemplatespec.Mod
250270 podtemplatespec .WithVolumeMounts (construct .MongodbName , tlsSecretVolumeMount , caVolumeMount ),
251271 )
252272}
273+
274+ // buildTLSPrometheus adds the TLS mounts for Prometheus.
275+ func buildTLSPrometheus (mdb mdbv1.MongoDBCommunity ) podtemplatespec.Modification {
276+ if mdb .Spec .Prometheus == nil || mdb .Spec .Prometheus .TLSSecretRef .Name == "" {
277+ return podtemplatespec .NOOP ()
278+ }
279+
280+ // Configure a volume which mounts the secret holding the server key and certificate
281+ // The same key-certificate pair is used for all servers
282+ tlsSecretVolume := statefulset .CreateVolumeFromSecret ("prom-tls-secret" , mdb .PrometheusTLSOperatorSecretNamespacedName ().Name )
283+
284+ // TODO: Is it ok to use the same `tlsOperatorSecretMountPath`
285+ tlsSecretVolumeMount := statefulset .CreateVolumeMount (tlsSecretVolume .Name , tlsOperatorSecretMountPath , statefulset .WithReadOnly (true ))
286+
287+ // MongoDB expects both key and certificate to be provided in a single PEM file
288+ // We are using a secret format where they are stored in separate fields, tls.crt and tls.key
289+ // Because of this we need to use an init container which reads the two files mounted from the secret and combines them into one
290+ return podtemplatespec .Apply (
291+ // podtemplatespec.WithVolume(caVolume),
292+ podtemplatespec .WithVolume (tlsSecretVolume ),
293+ podtemplatespec .WithVolumeMounts (construct .AgentName , tlsSecretVolumeMount ),
294+ podtemplatespec .WithVolumeMounts (construct .MongodbName , tlsSecretVolumeMount ),
295+ )
296+ }
0 commit comments