Skip to content

Commit 0be3efb

Browse files
authored
Merge pull request #227 from ArkaSaha30/auto-cert-provider
Add `AutoProvider` certificate manager
2 parents 21c68e6 + ed00a51 commit 0be3efb

File tree

6 files changed

+641
-31
lines changed

6 files changed

+641
-31
lines changed

api/v1alpha1/etcdcluster_types.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,8 @@ type CommonConfig struct {
9898
AltNames AltNames `json:"altNames,omitempty"`
9999

100100
// ValidityDuration is the expected duration until which the certificate will be valid,
101-
// expects in human-readable duration: 100d12h, if empty defaults to 90d
101+
// expects in human-readable duration: 100d12h, if empty defaults to 90d for cert-manager
102+
// and 365d for auto as per: https://github.com/etcd-io/etcd/blob/b87bc1c3a275d7d4904f4d201b963a2de2264f0d/client/pkg/transport/listener.go#L275
102103
// +optional
103104
ValidityDuration string `json:"validityDuration,omitempty"`
104105

config/crd/bases/operator.etcd.io_etcdclusters.yaml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,8 @@ spec:
149149
validityDuration:
150150
description: |-
151151
ValidityDuration is the expected duration until which the certificate will be valid,
152-
expects in human-readable duration: 100d12h, if empty defaults to 90d
152+
expects in human-readable duration: 100d12h, if empty defaults to 90d for cert-manager
153+
and 365d for auto as per: https://github.com/etcd-io/etcd/blob/b87bc1c3a275d7d4904f4d201b963a2de2264f0d/client/pkg/transport/listener.go#L275
153154
type: string
154155
type: object
155156
certManagerCfg:
@@ -203,7 +204,8 @@ spec:
203204
validityDuration:
204205
description: |-
205206
ValidityDuration is the expected duration until which the certificate will be valid,
206-
expects in human-readable duration: 100d12h, if empty defaults to 90d
207+
expects in human-readable duration: 100d12h, if empty defaults to 90d for cert-manager
208+
and 365d for auto as per: https://github.com/etcd-io/etcd/blob/b87bc1c3a275d7d4904f4d201b963a2de2264f0d/client/pkg/transport/listener.go#L275
207209
type: string
208210
required:
209211
- issuerKind

internal/controller/utils.go

Lines changed: 82 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -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

602602
func 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

608631
func 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

646675
func 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

652688
func 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

661701
func 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

Comments
 (0)