@@ -51,7 +51,7 @@ func tenantUpdateCertificates(ctx context.Context, operatorClient OperatorClient
5151 if tenant .ExternalCert () && body .Minio != nil {
5252 minioCertSecretName := fmt .Sprintf ("%s-instance-external-certificates" , secretName )
5353 // update certificates
54- if _ , err := createOrReplaceExternalCertSecret (ctx , clientSet , namespace , body .Minio , minioCertSecretName , tenantName ); err != nil {
54+ if _ , err := createOrReplaceExternalCertSecrets (ctx , clientSet , namespace , body .Minio , minioCertSecretName , tenantName ); err != nil {
5555 return err
5656 }
5757 // restart MinIO pods
@@ -66,7 +66,8 @@ func tenantUpdateCertificates(ctx context.Context, operatorClient OperatorClient
6666 if tenant .ConsoleExternalCert () && tenant .HasConsoleEnabled () && body .Console != nil {
6767 consoleCertSecretName := fmt .Sprintf ("%s-console-external-certificates" , secretName )
6868 // update certificates
69- if _ , err := createOrReplaceExternalCertSecret (ctx , clientSet , namespace , body .Console , consoleCertSecretName , tenantName ); err != nil {
69+ certificates := []* models.KeyPairConfiguration {body .Console }
70+ if _ , err := createOrReplaceExternalCertSecrets (ctx , clientSet , namespace , certificates , consoleCertSecretName , tenantName ); err != nil {
7071 return err
7172 }
7273 // restart Console pods
@@ -119,15 +120,17 @@ func tenantUpdateEncryption(ctx context.Context, operatorClient OperatorClientI,
119120 if tenant .KESExternalCert () && body .Server != nil {
120121 kesExternalCertSecretName := fmt .Sprintf ("%s-kes-external-cert" , secretName )
121122 // update certificates
122- if _ , err := createOrReplaceExternalCertSecret (ctx , clientSet , namespace , body .Server , kesExternalCertSecretName , tenantName ); err != nil {
123+ certificates := []* models.KeyPairConfiguration {body .Server }
124+ if _ , err := createOrReplaceExternalCertSecrets (ctx , clientSet , namespace , certificates , kesExternalCertSecretName , tenantName ); err != nil {
123125 return err
124126 }
125127 }
126128 // check if Tenant is deployed with external client certificates and user provided new client keypaiir
127129 if tenant .ExternalClientCert () && body .Client != nil {
128130 tenantExternalClientCertSecretName := fmt .Sprintf ("%s-tenant-external-client-cert" , secretName )
129131 // Update certificates
130- if _ , err := createOrReplaceExternalCertSecret (ctx , clientSet , namespace , body .Client , tenantExternalClientCertSecretName , tenantName ); err != nil {
132+ certificates := []* models.KeyPairConfiguration {body .Client }
133+ if _ , err := createOrReplaceExternalCertSecrets (ctx , clientSet , namespace , certificates , tenantExternalClientCertSecretName , tenantName ); err != nil {
131134 return err
132135 }
133136 // Restart MinIO pods to mount the new client secrets
@@ -202,12 +205,15 @@ func getKESConfiguration(ctx context.Context, clientSet K8sClientI, ns string, e
202205 }
203206 // Generate server certificates for KES only if autoCert is disabled
204207 if ! autoCert {
205- kesExternalCertSecret , err := createOrReplaceExternalCertSecret (ctx , clientSet , ns , encryptionCfg .Server , kesExternalCertSecretName , tenantName )
208+ certificates := []* models.KeyPairConfiguration {encryptionCfg .Server }
209+ certificateSecrets , err := createOrReplaceExternalCertSecrets (ctx , clientSet , ns , certificates , kesExternalCertSecretName , tenantName )
206210 if err != nil {
207211 return nil , err
208212 }
209- // External TLS certificates used by KES
210- kesConfiguration .ExternalCertSecret = kesExternalCertSecret
213+ if len (certificateSecrets ) > 0 {
214+ // External TLS certificates used by KES
215+ kesConfiguration .ExternalCertSecret = certificateSecrets [0 ]
216+ }
211217 }
212218 // Prepare kesConfiguration for KES
213219 serverConfigSecret , clientCertSecret , err := createOrReplaceKesConfigurationSecrets (ctx , clientSet , ns , encryptionCfg , kesConfigurationSecretName , kesClientCertSecretName , tenantName )
@@ -221,50 +227,54 @@ func getKESConfiguration(ctx context.Context, clientSet K8sClientI, ns string, e
221227 return kesConfiguration , nil
222228}
223229
224- // createOrReplaceExternalCertSecret receives a keypair, public and private key, encoded in base64, decode it and generate a new kubernetes secret
225- // to be used by the operator for TLS encryption
226- func createOrReplaceExternalCertSecret (ctx context.Context , clientSet K8sClientI , ns string , keyPair * models.KeyPairConfiguration , secretName , tenantName string ) (* operator.LocalCertificateReference , error ) {
227- if keyPair == nil || keyPair .Crt == nil || keyPair .Key == nil || * keyPair .Crt == "" || * keyPair .Key == "" {
228- return nil , errors .New ("certificate files must not be empty" )
229- }
230- // delete secret with same name if exists
231- err := clientSet .deleteSecret (ctx , ns , secretName , metav1.DeleteOptions {})
232- if err != nil {
233- // log the error if any and continue
234- log .Println (err )
235- }
236- imm := true
237- tlsCrt , err := base64 .StdEncoding .DecodeString (* keyPair .Crt )
238- if err != nil {
239- return nil , err
240- }
241- tlsKey , err := base64 .StdEncoding .DecodeString (* keyPair .Key )
242- if err != nil {
243- return nil , err
244- }
245- externalTLSCertificateSecret := & corev1.Secret {
246- ObjectMeta : metav1.ObjectMeta {
247- Name : secretName ,
248- Labels : map [string ]string {
249- operator .TenantLabel : tenantName ,
230+ // createOrReplaceExternalCertSecrets receives an array of KeyPairs (public and private key), encoded in base64, decode it and generate an equivalent number of kubernetes
231+ // secrets to be used by the operator for TLS encryption
232+ func createOrReplaceExternalCertSecrets (ctx context.Context , clientSet K8sClientI , ns string , keyPairs []* models.KeyPairConfiguration , secretName , tenantName string ) ([]* operator.LocalCertificateReference , error ) {
233+ var keyPairSecrets []* operator.LocalCertificateReference
234+ for _ , keyPair := range keyPairs {
235+ if keyPair == nil || keyPair .Crt == nil || keyPair .Key == nil || * keyPair .Crt == "" || * keyPair .Key == "" {
236+ return nil , errors .New ("certificate files must not be empty" )
237+ }
238+ // delete secret with same name if exists
239+ err := clientSet .deleteSecret (ctx , ns , secretName , metav1.DeleteOptions {})
240+ if err != nil {
241+ // log the error if any and continue
242+ log .Println (err )
243+ }
244+ imm := true
245+ tlsCrt , err := base64 .StdEncoding .DecodeString (* keyPair .Crt )
246+ if err != nil {
247+ return nil , err
248+ }
249+ tlsKey , err := base64 .StdEncoding .DecodeString (* keyPair .Key )
250+ if err != nil {
251+ return nil , err
252+ }
253+ externalTLSCertificateSecret := & corev1.Secret {
254+ ObjectMeta : metav1.ObjectMeta {
255+ Name : secretName ,
256+ Labels : map [string ]string {
257+ operator .TenantLabel : tenantName ,
258+ },
250259 },
251- },
252- Type : corev1 .SecretTypeTLS ,
253- Immutable : & imm ,
254- Data : map [string ][]byte {
255- "tls.crt" : tlsCrt ,
256- "tls.key" : tlsKey ,
257- },
258- }
259- _ , err = clientSet .createSecret (ctx , ns , externalTLSCertificateSecret , metav1.CreateOptions {})
260- if err != nil {
261- return nil , err
260+ Type : corev1 .SecretTypeTLS ,
261+ Immutable : & imm ,
262+ Data : map [string ][]byte {
263+ "tls.crt" : tlsCrt ,
264+ "tls.key" : tlsKey ,
265+ },
266+ }
267+ _ , err = clientSet .createSecret (ctx , ns , externalTLSCertificateSecret , metav1.CreateOptions {})
268+ if err != nil {
269+ return nil , err
270+ }
271+ // Certificates used by the minio instance
272+ keyPairSecrets = append (keyPairSecrets , & operator.LocalCertificateReference {
273+ Name : secretName ,
274+ Type : "kubernetes.io/tls" ,
275+ })
262276 }
263- // Certificates used by the minio instance
264- return & operator.LocalCertificateReference {
265- Name : secretName ,
266- Type : "kubernetes.io/tls" ,
267- }, nil
277+ return keyPairSecrets , nil
268278}
269279
270280func createOrReplaceKesConfigurationSecrets (ctx context.Context , clientSet K8sClientI , ns string , encryptionCfg * models.EncryptionConfiguration , kesConfigurationSecretName , kesClientCertSecretName , tenantName string ) (* corev1.LocalObjectReference , * operator.LocalCertificateReference , error ) {
0 commit comments