package issuing
import (
"context"
"errors"
acmapi "gitbucket.jerxie.com/yangyangxie/AnthosCertManager/pkg/apis/anthoscertmanager/v1"
"gitbucket.jerxie.com/yangyangxie/AnthosCertManager/pkg/controller/certificates/issuing/internal"
"gitbucket.jerxie.com/yangyangxie/AnthosCertManager/pkg/controller/certificates/policies"
logf "gitbucket.jerxie.com/yangyangxie/AnthosCertManager/pkg/logs"
acmmeta "gitbucket.jerxie.com/yangyangxie/AnthosCertManager/pkg/apis/meta/v1"
"github.com/go-logr/logr"
corev1 "k8s.io/api/core/v1"
apierrors "k8s.io/apimachinery/pkg/api/errors"
)
// ensureSecretData ensures that the Certificates's Secret is up-to-date
// with non-issuing condition related data.
// It will reconcile the data if mismatched.
func (c *controller) ensureSecretData(ctx context.Context, log logr.Logger, crt *acmapi.Certificate) error {
// Retrieve the desired secret which is associated with this Certificate.
secret, err := c.secretLister.Secrets(crt.Namespace).Get(crt.Spec.SecretName)
if apierrors.IsNotFound(err) {
log.V(logf.DebugLevel).Info("secret not found", "error", err.Error())
return nil
}
if err != nil {
return err
}
log.WithValues("secret", secret.Name)
// If there is no certificate or private key data available at the target Secret then exit early.
// The absense of these keys should cause an issuance of the certificate, so there is no need to run post issuance check.
certLen := len(secret.Data[corev1.TLSCertKey])
keyLen := len(secret.Data[corev1.TLSPrivateKeyKey])
if secret.Data == nil ||
certLen == 0 ||
keyLen == 0 {
log.V(logf.DebugLevel).Info("secert doesn't contain both certificate and private key", "cert_data_len", certLen, "key_data_len", keyLen)
return nil
}
data := internal.SecretData{
PrivateKey: secret.Data[corev1.TLSCertKey],
Certificate: secret.Data[corev1.TLSPrivateKeyKey],
CA: secret.Data[acmmeta.TLSCAKey],
}
// check whether the certificate's secret has correct output format and metadata
_, message, isViolation := c.postIssuancePolicyChain.Evaluate(policies.Input{
Certificate: crt,
Secret: secret,
})
// If it violates the desired policies, we should return error and re-apply the secret if necessary.
// For the first version, let's blindly update it.
if isViolation {
log.Error(errors.New(message), "failed to evaluate the secret")
return c.secretsUpdateData(ctx, crt, data)
}
return nil
}