@@ -65,7 +65,7 @@ func prepareOwnerReference(ec *ecv1alpha1.EtcdCluster, scheme *runtime.Scheme) (
65
65
return owners , nil
66
66
}
67
67
68
- func reconcileStatefulSet (ctx context.Context , logger logr.Logger , ec * ecv1alpha1.EtcdCluster , c client.Client , replicas int32 , scheme * runtime.Scheme ) (* appsv1.StatefulSet , error ) {
68
+ func reconcileStatefulSet (ctx context.Context , logger logr.Logger , ec * ecv1alpha1.EtcdCluster , c client.Client , replicas int32 , scheme * runtime.Scheme , addMember bool ) (* appsv1.StatefulSet , error ) {
69
69
70
70
// prepare/update configmap for StatefulSet
71
71
err := applyEtcdClusterState (ctx , ec , int (replicas ), c , scheme , logger )
@@ -85,6 +85,26 @@ func reconcileStatefulSet(ctx context.Context, logger logr.Logger, ec *ecv1alpha
85
85
return nil , err
86
86
}
87
87
88
+ // Add or remove server and peer certificate
89
+ if addMember {
90
+ if replicas > 0 {
91
+ if ec .Spec .TLS != nil {
92
+ createServerPeerCertErr := createServerPeerCertificate (ec , replicas , ctx , c )
93
+ if createServerPeerCertErr != nil {
94
+ logger .Error (createServerPeerCertErr , "Error creating Server or Peer Certificate" )
95
+ }
96
+ } else {
97
+ // TODO: instead of logging error, set default autoConfig
98
+ logger .Error (nil , fmt .Sprintf ("missing TLS config for %s" , ec .Name ))
99
+ }
100
+ }
101
+ } else {
102
+ deleteServerPeerCertErr := deleteServerPeerCertificate (ec , replicas , ctx , c )
103
+ if deleteServerPeerCertErr != nil {
104
+ logger .Error (deleteServerPeerCertErr , "Error deleting Server or Peer Certificate" )
105
+ }
106
+ }
107
+
88
108
// Return latest Stateful set. (This is to ensure that we return the latest statefulset for next operation to act on)
89
109
return getStatefulSet (ctx , c , ec .Name , ec .Namespace )
90
110
}
@@ -528,15 +548,6 @@ func healthCheck(sts *appsv1.StatefulSet, lg klog.Logger) (*clientv3.MemberListR
528
548
return memberlistResp , healthInfos , nil
529
549
}
530
550
531
- func (r * EtcdClusterReconciler ) getStatefulSetPods (sts * appsv1.StatefulSet , ctx context.Context ) (* corev1.PodList , error ) {
532
- podList := corev1.PodList {}
533
- err := r .Client .List (ctx , & podList , client .InNamespace (sts .Namespace ), client .MatchingLabels (sts .Spec .Selector .MatchLabels ))
534
- if err != nil {
535
- return nil , err
536
- }
537
- return & podList , nil
538
- }
539
-
540
551
func createCMCertificateConfig (ec * ecv1alpha1.ProviderCertManagerConfig ) * certInterface.Config {
541
552
duration , err := time .ParseDuration (ec .ValidityDuration )
542
553
if err != nil {
@@ -564,8 +575,8 @@ func createAutoCertificateConfig(ec *ecv1alpha1.ProviderAutoConfig) *certInterfa
564
575
return config
565
576
}
566
577
567
- func ( r * EtcdClusterReconciler ) createCertificate (ec * ecv1alpha1.EtcdCluster , ctx context.Context , certName string ) error {
568
- cert , certErr := certificate .NewProvider (certificate .ProviderType (ec .Spec .TLS .Provider ), r . Client )
578
+ func createCertificate (ec * ecv1alpha1.EtcdCluster , ctx context.Context , c client. Client , certName string ) error {
579
+ cert , certErr := certificate .NewProvider (certificate .ProviderType (ec .Spec .TLS .Provider ), c )
569
580
if certErr != nil {
570
581
// TODO: instead of error, set default autoConfig
571
582
return certErr
@@ -608,24 +619,51 @@ func (r *EtcdClusterReconciler) createCertificate(ec *ecv1alpha1.EtcdCluster, ct
608
619
return nil
609
620
}
610
621
611
- func (r * EtcdClusterReconciler ) checkClientCertificate (ec * ecv1alpha1.EtcdCluster , ctx context.Context ) error {
622
+ func deleteCertificate (ec * ecv1alpha1.EtcdCluster , ctx context.Context , c client.Client , certName string ) error {
623
+ cert , certErr := certificate .NewProvider (certificate .ProviderType (ec .Spec .TLS .Provider ), c )
624
+ if certErr != nil {
625
+ // TODO: instead of error, set default autoConfig
626
+ return certErr
627
+ }
628
+ deleteCertErr := cert .DeleteCertificateSecret (ctx , certName , ec .Namespace )
629
+ if deleteCertErr != nil {
630
+ log .Printf ("Error deleting certificate with name %s: %s" , certName , deleteCertErr )
631
+ return deleteCertErr
632
+ }
633
+ log .Printf ("Successfully deleted certificate with name %s" , certName )
634
+ return nil
635
+ }
636
+
637
+ func createClientCertificate (ec * ecv1alpha1.EtcdCluster , ctx context.Context , c client.Client ) error {
612
638
certName := fmt .Sprintf ("%s-%s-tls" , ec .Name , "client" )
613
- createClientCertErr := r . createCertificate (ec , ctx , certName )
639
+ createClientCertErr := createCertificate (ec , ctx , c , certName )
614
640
return createClientCertErr
615
641
}
616
642
617
- func (r * EtcdClusterReconciler ) checkServerPeerCertificate (ec * ecv1alpha1.EtcdCluster , sts * appsv1.StatefulSet , ctx context.Context ) error {
618
- podList , podListErr := r .getStatefulSetPods (sts , ctx )
619
- if podListErr != nil {
620
- return podListErr
621
- }
622
- for _ , pod := range podList .Items {
623
- serverCertName := fmt .Sprintf ("%s-%s-tls" , pod .Name , "server" )
624
- peerCertName := fmt .Sprintf ("%s-%s-tls" , pod .Name , "peer" )
625
- createServerCertErr := r .createCertificate (ec , ctx , serverCertName )
626
- log .Println (createServerCertErr )
627
- createPeerCertErr := r .createCertificate (ec , ctx , peerCertName )
628
- log .Println (createPeerCertErr )
643
+ func createServerPeerCertificate (ec * ecv1alpha1.EtcdCluster , replicas int32 , ctx context.Context , c client.Client ) error {
644
+ serverCertName := fmt .Sprintf ("%s-%s-%s-tls" , ec .Name , string (replicas - 1 ), "server" )
645
+ peerCertName := fmt .Sprintf ("%s-%s-%s-tls" , ec .Name , string (replicas - 1 ), "peer" )
646
+ createServerCertErr := createCertificate (ec , ctx , c , serverCertName )
647
+ if createServerCertErr != nil {
648
+ return createServerCertErr
649
+ }
650
+ createPeerCertErr := createCertificate (ec , ctx , c , peerCertName )
651
+ if createPeerCertErr != nil {
652
+ return createPeerCertErr
653
+ }
654
+ return nil
655
+ }
656
+
657
+ func deleteServerPeerCertificate (ec * ecv1alpha1.EtcdCluster , replicas int32 , ctx context.Context , c client.Client ) error {
658
+ serverCertName := fmt .Sprintf ("%s-%s-%s-tls" , ec .Name , string (replicas ), "server" )
659
+ peerCertName := fmt .Sprintf ("%s-%s-%s-tls" , ec .Name , string (replicas ), "peer" )
660
+ deleteServerCertErr := deleteCertificate (ec , ctx , c , serverCertName )
661
+ if deleteServerCertErr != nil {
662
+ return deleteServerCertErr
663
+ }
664
+ deletePeerCertErr := deleteCertificate (ec , ctx , c , peerCertName )
665
+ if deletePeerCertErr != nil {
666
+ return deletePeerCertErr
629
667
}
630
668
return nil
631
669
}
0 commit comments