@@ -2,9 +2,11 @@ package k8s
22
33import (
44 "context"
5+ "fmt"
56
67 "github.com/intelops/go-common/logging"
78 "github.com/kube-tarian/kad/capten/common-pkg/cert"
9+ "github.com/kube-tarian/kad/capten/common-pkg/credential"
810 "github.com/pkg/errors"
911
1012 certmanagerv1 "github.com/cert-manager/cert-manager/pkg/apis/certmanager/v1"
@@ -17,15 +19,52 @@ import (
1719
1820var log = logging .NewLogger ()
1921
20- func CreateOrUpdateClusterIssuer (clusterCAIssuer string ) error {
22+ func SetupCACertIssuser (clusterIssuerName string , log logging.Logger ) error {
23+ k8sclient , err := NewK8SClient (log )
24+ if err != nil {
25+ log .Errorf ("failed to initalize k8s client, %v" , err )
26+ return err
27+ }
28+
29+ err = setupCertificateIssuer (k8sclient , clusterIssuerName , log )
30+ if err != nil {
31+ log .Errorf ("Setup Certificates Issuer failed, %v" , err )
32+ return err
33+ }
34+ return nil
35+ }
36+
37+ // Setup agent certificate issuer
38+ func setupCertificateIssuer (k8sClient * K8SClient , clusterIssuerName string , log logging.Logger ) error {
39+ // Create Agent Cluster Issuer
40+ certsData , err := CreateOrUpdateClusterIssuer (clusterIssuerName , k8sClient , false )
41+ if err != nil {
42+ return fmt .Errorf ("failed to create/update CA Issuer %s in cert-manager: %v" , clusterIssuerName , err )
43+ }
44+
45+ // Update Vault
46+ err = credential .PutClusterCerts (context .TODO (), "kad-agent" , "kad-agent" , string (certsData .CaChainCertData ), string (certsData .RootKey .KeyData ), string (certsData .RootCert .CertData ))
47+ if err != nil {
48+ log .Errorf ("Failed to write to vault, %v" , err )
49+ log .Infof ("Continued to start the agent as these certs from vault are not used..." )
50+ }
51+ return nil
52+ }
53+
54+ func CreateOrUpdateClusterIssuer (clusterCAIssuer string , k8sclient * K8SClient , forceUpdate bool ) (* cert.CertificatesData , error ) {
2155 config , err := rest .InClusterConfig ()
2256 if err != nil {
23- return errors .WithMessage (err , "error while building kubeconfig" )
57+ return nil , errors .WithMessage (err , "error while building kubeconfig" )
2458 }
2559
2660 cmClient , err := cmclient .NewForConfig (config )
2761 if err != nil {
28- return err
62+ return nil , err
63+ }
64+
65+ certsData , err := cert .GenerateRootCerts ()
66+ if err != nil {
67+ return nil , err
2968 }
3069
3170 issuer := & certmanagerv1.ClusterIssuer {
@@ -42,23 +81,48 @@ func CreateOrUpdateClusterIssuer(clusterCAIssuer string) error {
4281 }
4382
4483 serverIssuer , err := cmClient .CertmanagerV1 ().ClusterIssuers ().Get (context .Background (), issuer .Name , metav1.GetOptions {})
45- if err != nil && k8serrors .IsNotFound (err ) {
46- result , err := cmClient .CertmanagerV1 ().ClusterIssuers ().Create (context .Background (), issuer , metav1.CreateOptions {})
47- if err != nil {
48- return errors .WithMessage (err , "error in creating cert issuer" )
84+ if err != nil {
85+ if k8serrors .IsNotFound (err ) {
86+ err = CreateOrUpdateClusterCAIssuerSecret (k8sclient , certsData .RootCert .CertData , certsData .RootKey .KeyData , certsData .CaChainCertData )
87+ if err != nil {
88+ return nil , fmt .Errorf ("failed to create/update CA Issuer Secret: %v" , err )
89+ }
90+
91+ result , err := cmClient .CertmanagerV1 ().ClusterIssuers ().Create (context .Background (), issuer , metav1.CreateOptions {})
92+ if err != nil {
93+ return nil , errors .WithMessage (err , "error in creating cert issuer" )
94+ }
95+ log .Debugf ("ClusterIssuer %s created successfully" , result .Name )
96+ return certsData , nil
97+ } else if k8serrors .IsAlreadyExists (err ) {
98+ secret , err := k8sclient .GetSecretObject (cert .CertManagerNamespace , cert .ClusterCACertSecretName )
99+ if err != nil {
100+ log .Errorf ("Failed to read secert %s, %v" , cert .ClusterCACertSecretName , err )
101+ return nil , err
102+ }
103+ certsData .CaChainCertData = secret .Data ["ca.crt" ]
104+ certsData .RootCert .CertData = secret .Data [corev1 .TLSCertKey ]
105+ certsData .RootKey .KeyData = secret .Data [corev1 .TLSPrivateKeyKey ]
106+ return certsData , nil
49107 }
50- log .Debugf ("ClusterIssuer %s created successfully" , result .Name )
51- return nil
108+ return nil , err
52109 }
53110
54- serverIssuer .Spec .IssuerConfig .CA .SecretName = cert .ClusterCACertSecretName
55- issuerClient := cmClient .CertmanagerV1 ().ClusterIssuers ()
56- result , err := issuerClient .Update (context .TODO (), serverIssuer , metav1.UpdateOptions {})
57- if err != nil {
58- return errors .WithMessage (err , "error while updating cluster issuer" )
111+ if forceUpdate {
112+ err = CreateOrUpdateClusterCAIssuerSecret (k8sclient , certsData .RootCert .CertData , certsData .RootKey .KeyData , certsData .CaChainCertData )
113+ if err != nil {
114+ return nil , fmt .Errorf ("failed to create/update CA Issuer Secret: %v" , err )
115+ }
116+
117+ serverIssuer .Spec .IssuerConfig .CA .SecretName = cert .ClusterCACertSecretName
118+ issuerClient := cmClient .CertmanagerV1 ().ClusterIssuers ()
119+ _ , err := issuerClient .Update (context .TODO (), serverIssuer , metav1.UpdateOptions {})
120+ if err != nil {
121+ return nil , errors .WithMessage (err , "error while updating cluster issuer" )
122+ }
59123 }
60- log .Debugf ("ClusterIssuer %s updated successfully" , result .Name )
61- return nil
124+ log .Debugf ("ClusterIssuer %s updated successfully" , issuer .Name )
125+ return certsData , nil
62126}
63127
64128func CreateOrUpdateClusterCAIssuerSecret (k8sClient * K8SClient , caCertData , caKeyData , caCertChainData []byte ) error {
0 commit comments