@@ -82,7 +82,7 @@ func (r *ReplicaSetReconciler) validateTLSConfig(mdb mdbv1.MongoDBCommunity) (bo
82
82
83
83
// validate whether the secret contains "tls.crt" and "tls.key", or it contains "tls.pem"
84
84
// 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 () )
86
86
if err != nil {
87
87
r .log .Warnf (err .Error ())
88
88
return false , nil
@@ -102,7 +102,7 @@ func getTLSConfigModification(getUpdateCreator secret.GetUpdateCreator, mdb mdbv
102
102
return automationconfig .NOOP (), nil
103
103
}
104
104
105
- certKey , err := getPemOrConcatenatedCrtAndKey (getUpdateCreator , mdb )
105
+ certKey , err := getPemOrConcatenatedCrtAndKey (getUpdateCreator , mdb , mdb . TLSSecretNamespacedName () )
106
106
if err != nil {
107
107
return automationconfig .NOOP (), err
108
108
}
@@ -111,13 +111,13 @@ func getTLSConfigModification(getUpdateCreator secret.GetUpdateCreator, mdb mdbv
111
111
}
112
112
113
113
// 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 )
116
116
if err != nil {
117
117
return ""
118
118
}
119
119
120
- key , err := secret .ReadKey (getter , tlsSecretKeyName , mdb . TLSSecretNamespacedName () )
120
+ key , err := secret .ReadKey (getter , tlsSecretKeyName , secretName )
121
121
if err != nil {
122
122
return ""
123
123
}
@@ -126,8 +126,8 @@ func getCertAndKey(getter secret.Getter, mdb mdbv1.MongoDBCommunity) string {
126
126
}
127
127
128
128
// 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 )
131
131
if err != nil {
132
132
return ""
133
133
}
@@ -144,9 +144,9 @@ func combineCertificateAndKey(cert, key string) string {
144
144
// This is either the tls.pem entry in the given secret, or the concatenation
145
145
// of tls.crt and tls.key
146
146
// 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 )
150
150
if certKey == "" && pem == "" {
151
151
return "" , fmt .Errorf (`Neither "%s" nor the pair "%s"/"%s" were present in the TLS secret` , tlsSecretPemName , tlsSecretCertName , tlsSecretKeyName )
152
152
}
@@ -165,7 +165,7 @@ func getPemOrConcatenatedCrtAndKey(getter secret.Getter, mdb mdbv1.MongoDBCommun
165
165
// ensureTLSSecret will create or update the operator-managed Secret containing
166
166
// the concatenated certificate and key from the user-provided Secret.
167
167
func ensureTLSSecret (getUpdateCreator secret.GetUpdateCreator , mdb mdbv1.MongoDBCommunity ) error {
168
- certKey , err := getPemOrConcatenatedCrtAndKey (getUpdateCreator , mdb )
168
+ certKey , err := getPemOrConcatenatedCrtAndKey (getUpdateCreator , mdb , mdb . TLSSecretNamespacedName () )
169
169
if err != nil {
170
170
return err
171
171
}
@@ -182,6 +182,26 @@ func ensureTLSSecret(getUpdateCreator secret.GetUpdateCreator, mdb mdbv1.MongoDB
182
182
return secret .CreateOrUpdate (getUpdateCreator , operatorSecret )
183
183
}
184
184
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
+
185
205
// tlsOperatorSecretFileName calculates the file name to use for the mounted
186
206
// certificate-key file. The name is based on the hash of the combined cert and key.
187
207
// 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
250
270
podtemplatespec .WithVolumeMounts (construct .MongodbName , tlsSecretVolumeMount , caVolumeMount ),
251
271
)
252
272
}
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