4
4
"context"
5
5
"errors"
6
6
"fmt"
7
+ "log"
8
+ "net"
7
9
"slices"
8
10
"strconv"
9
11
"strings"
@@ -24,9 +26,12 @@ import (
24
26
"sigs.k8s.io/controller-runtime/pkg/client/apiutil"
25
27
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
26
28
29
+ clientv3 "go.etcd.io/etcd/client/v3"
30
+
27
31
ecv1alpha1 "go.etcd.io/etcd-operator/api/v1alpha1"
28
32
"go.etcd.io/etcd-operator/internal/etcdutils"
29
- clientv3 "go.etcd.io/etcd/client/v3"
33
+ "go.etcd.io/etcd-operator/pkg/certificate"
34
+ certInterface "go.etcd.io/etcd-operator/pkg/certificate/interfaces"
30
35
)
31
36
32
37
const (
@@ -522,3 +527,81 @@ func healthCheck(sts *appsv1.StatefulSet, lg klog.Logger) (*clientv3.MemberListR
522
527
523
528
return memberlistResp , healthInfos , nil
524
529
}
530
+
531
+ func createCMCertificateConfig (ec * ecv1alpha1.ProviderCertManagerConfig ) * certInterface.Config {
532
+ duration , err := time .ParseDuration (ec .ValidityDuration )
533
+ if err != nil {
534
+ log .Printf ("Failed to parse ValidityDuration: %s" , err )
535
+ }
536
+ config := & certInterface.Config {
537
+ CommonName : ec .CommonName ,
538
+ Organization : ec .Organization ,
539
+ ValidityDuration : duration ,
540
+ AltNames : certInterface.AltNames {
541
+ DNSNames : ec .AltNames .DNSNames ,
542
+ IPs : make ([]net.IP , len (ec .AltNames .DNSNames )),
543
+ },
544
+ ExtraConfig : map [string ]any {
545
+ "issuerName" : ec .IssuerName ,
546
+ "issuerKind" : ec .IssuerKind ,
547
+ },
548
+ }
549
+ return config
550
+ }
551
+
552
+ func createAutoCertificateConfig (ec * ecv1alpha1.ProviderAutoConfig ) * certInterface.Config {
553
+ // TODO
554
+ config := & certInterface.Config {}
555
+ return config
556
+ }
557
+
558
+ func (r * EtcdClusterReconciler ) createCertificate (ec * ecv1alpha1.EtcdCluster , ctx context.Context , podName , podNamespace , certType string ) error {
559
+ certName := fmt .Sprintf ("%s-%s-tls" , podName , certType )
560
+ // cert, certErr := certificate.NewProvider(certificate.ProviderType(ec.Spec.TLS.Provider))
561
+ cert , certErr := certificate .NewProvider (certificate .ProviderType (ec .Spec .TLS .Provider ), r .Client )
562
+ if certErr != nil {
563
+ // TODO: instead of error, set default autoConfig
564
+ return certErr
565
+ }
566
+ _ , getCertError := cert .GetCertificateConfig (ctx , certName , podNamespace )
567
+ if getCertError != nil {
568
+ if k8serrors .IsNotFound (getCertError ) {
569
+ log .Println ("Creating Client Certificate for etcd-operator to communicate with the etcdCluster" )
570
+ switch {
571
+ case ec .Spec .TLS .ProviderCfg .AutoCfg != nil :
572
+ cmConfig := createAutoCertificateConfig (ec .Spec .TLS .ProviderCfg .AutoCfg )
573
+ createCertErr := cert .EnsureCertificateSecret (ctx , certName , podNamespace , cmConfig )
574
+ if createCertErr != nil {
575
+ log .Printf ("Error creating certificate: %s" , createCertErr )
576
+ }
577
+ return nil
578
+ case ec .Spec .TLS .ProviderCfg .CertManagerCfg != nil :
579
+ cmConfig := createCMCertificateConfig (ec .Spec .TLS .ProviderCfg .CertManagerCfg )
580
+ createCertErr := cert .EnsureCertificateSecret (ctx , certName , podNamespace , cmConfig )
581
+ if createCertErr != nil {
582
+ log .Printf ("Error creating certificate: %s" , createCertErr )
583
+ }
584
+ return nil
585
+ default :
586
+ if ec .Spec .TLS .ProviderCfg .AutoCfg == nil {
587
+ // TODO: instead of error, set default autoConfig which will be applied if Provider/ProviderConfig is not set
588
+ return errors .New ("default autoCertificate config not defined" )
589
+ }
590
+ cmConfig := createAutoCertificateConfig (ec .Spec .TLS .ProviderCfg .AutoCfg )
591
+ createCertErr := cert .EnsureCertificateSecret (ctx , certName , podNamespace , cmConfig )
592
+ log .Printf ("Error creating certificate, maybe already present: %s" , createCertErr )
593
+ return nil
594
+ }
595
+ } else {
596
+ log .Printf ("Error getting certificate" )
597
+ return getCertError
598
+ }
599
+ }
600
+
601
+ return nil
602
+ }
603
+
604
+ func (r * EtcdClusterReconciler ) checkClientCertificate (ec * ecv1alpha1.EtcdCluster , ctx context.Context ) error {
605
+ createClientCertErr := r .createCertificate (ec , ctx , ec .Name , ec .Namespace , "client" )
606
+ return createClientCertErr
607
+ }
0 commit comments