@@ -53,7 +53,7 @@ func reconcileStatefulSet(ctx context.Context, logger logr.Logger, ec *ecv1alpha
5353 }
5454
5555 // Add server and peer certificate
56- err = applyEtcdMemberCerts (ctx , ec , c , logger )
56+ err = applyEtcdMemberCerts (ctx , ec , c )
5757 if err != nil {
5858 return nil , err
5959 }
@@ -600,13 +600,42 @@ func createCMCertificateConfig(ec *ecv1alpha1.EtcdCluster) *certInterface.Config
600600}
601601
602602func createAutoCertificateConfig (ec * ecv1alpha1.EtcdCluster ) * certInterface.Config {
603- // TODO
604- config := & certInterface.Config {}
603+ autoConfig := ec .Spec .TLS .ProviderCfg .AutoCfg
604+ duration , err := time .ParseDuration (autoConfig .ValidityDuration )
605+ if err != nil {
606+ log .Printf ("Failed to parse ValidityDuration: %s" , err )
607+ }
608+
609+ var altNames certInterface.AltNames
610+ if autoConfig .AltNames .DNSNames != nil {
611+ altNames = certInterface.AltNames {
612+ DNSNames : autoConfig .AltNames .DNSNames ,
613+ IPs : make ([]net.IP , len (autoConfig .AltNames .DNSNames )),
614+ }
615+ } else {
616+ defaultDNSNames := []string {fmt .Sprintf ("%s.svc.cluster.local" , autoConfig .CommonName )}
617+ altNames = certInterface.AltNames {
618+ DNSNames : defaultDNSNames ,
619+ }
620+ }
621+
622+ config := & certInterface.Config {
623+ CommonName : autoConfig .CommonName ,
624+ Organization : autoConfig .Organization ,
625+ ValidityDuration : duration ,
626+ AltNames : altNames ,
627+ }
605628 return config
606629}
607630
608631func createCertificate (ec * ecv1alpha1.EtcdCluster , ctx context.Context , c client.Client , certName string ) error {
609- cert , certErr := certificate .NewProvider (certificate .ProviderType (ec .Spec .TLS .Provider ), c )
632+ // The TLS field is present but spec is empty
633+ providerName := ec .Spec .TLS .Provider
634+ if providerName == "" {
635+ providerName = string (certificate .Auto )
636+ }
637+
638+ cert , certErr := certificate .NewProvider (certificate .ProviderType (providerName ), c )
610639 if certErr != nil {
611640 // TODO: instead of error, set default autoConfig
612641 return certErr
@@ -617,8 +646,8 @@ func createCertificate(ec *ecv1alpha1.EtcdCluster, ctx context.Context, c client
617646 log .Printf ("Creating certificate: %s for etcd-operator: %s\n " , certName , ec .Name )
618647 switch {
619648 case ec .Spec .TLS .ProviderCfg .AutoCfg != nil :
620- cmConfig := createAutoCertificateConfig (ec )
621- createCertErr := cert .EnsureCertificateSecret (ctx , certName , ec .Namespace , cmConfig )
649+ autoConfig := createAutoCertificateConfig (ec )
650+ createCertErr := cert .EnsureCertificateSecret (ctx , certName , ec .Namespace , autoConfig )
622651 if createCertErr != nil {
623652 log .Printf ("Error creating certificate: %s" , createCertErr )
624653 }
@@ -645,44 +674,70 @@ func createCertificate(ec *ecv1alpha1.EtcdCluster, ctx context.Context, c client
645674
646675func createClientCertificate (ctx context.Context , ec * ecv1alpha1.EtcdCluster , c client.Client ) error {
647676 certName := getClientCertName (ec .Name )
648- createClientCertErr := createCertificate (ec , ctx , c , certName )
649- return createClientCertErr
677+ err := createCertificate (ec , ctx , c , certName )
678+ if err != nil {
679+ return err
680+ }
681+ err = patchCertificateSecret (ctx , ec , c , certName )
682+ if err != nil {
683+ return fmt .Errorf ("patching certificate secret: %s with ownerReference failed: %w" , certName , err )
684+ }
685+ return err
650686}
651687
652688func createServerCertificate (ctx context.Context , ec * ecv1alpha1.EtcdCluster , c client.Client ) error {
653689 serverCertName := getServerCertName (ec .Name )
654- createServerCertErr := createCertificate (ec , ctx , c , serverCertName )
655- if createServerCertErr != nil {
656- return createServerCertErr
690+ err := createCertificate (ec , ctx , c , serverCertName )
691+ if err != nil {
692+ return err
693+ }
694+ err = patchCertificateSecret (ctx , ec , c , serverCertName )
695+ if err != nil {
696+ return fmt .Errorf ("patching certificate secret: %s with ownerReference failed: %w" , serverCertName , err )
657697 }
658698 return nil
659699}
660700
661701func createPeerCertificate (ctx context.Context , ec * ecv1alpha1.EtcdCluster , c client.Client ) error {
662702 peerCertName := getPeerCertName (ec .Name )
663- createPeerCertErr := createCertificate (ec , ctx , c , peerCertName )
664- if createPeerCertErr != nil {
665- return createPeerCertErr
703+ err := createCertificate (ec , ctx , c , peerCertName )
704+ if err != nil {
705+ return err
706+ }
707+ err = patchCertificateSecret (ctx , ec , c , peerCertName )
708+ if err != nil {
709+ return fmt .Errorf ("patching certificate secret: %s with ownerReference failed: %w" , peerCertName , err )
666710 }
667711 return nil
668712}
669713
670- func applyEtcdMemberCerts (ctx context.Context , ec * ecv1alpha1.EtcdCluster , c client.Client , logger logr.Logger ) error {
671- var err error
714+ func applyEtcdMemberCerts (ctx context.Context , ec * ecv1alpha1.EtcdCluster , c client.Client ) error {
672715 if ec .Spec .TLS != nil {
673- createServerCertErr := createServerCertificate (ctx , ec , c )
674- if createServerCertErr != nil {
675- err = createServerCertErr
676- logger .Error (createServerCertErr , "Error creating Server Certificate" )
677-
716+ err := createServerCertificate (ctx , ec , c )
717+ if err != nil {
718+ return err
678719 }
679- createPeerCertErr := createPeerCertificate (ctx , ec , c )
680- if createPeerCertErr != nil {
681- err = createPeerCertErr
682- logger .Error (createPeerCertErr , "Error creating Peer Certificate" )
683-
720+ err = createPeerCertificate (ctx , ec , c )
721+ if err != nil {
722+ return err
684723 }
724+ }
725+ return nil
726+ }
685727
728+ func patchCertificateSecret (ctx context.Context , ec * ecv1alpha1.EtcdCluster , c client.Client , certSecretName string ) error {
729+ getCertSecret := & corev1.Secret {}
730+ if err := c .Get (ctx , client.ObjectKey {Name : certSecretName , Namespace : ec .Namespace }, getCertSecret ); err != nil {
731+ return err
686732 }
687- return err
733+
734+ log .Printf ("Setting ownerReference for certificate secret: %s" , certSecretName )
735+ if err := controllerutil .SetControllerReference (ec , getCertSecret , c .Scheme ()); err != nil {
736+ return err
737+ }
738+ if err := c .Update (ctx , getCertSecret ); err != nil {
739+ return fmt .Errorf ("failed to update certificate secret with ownerReference: %w" , err )
740+ }
741+
742+ return nil
688743}
0 commit comments