Skip to content

Commit

Permalink
helm mode: add recursive deprecated secret logic
Browse files Browse the repository at this point in the history
Previously, we had logic to look for deprecated names like
clustermesh-apiserver-client-certs when
clustermesh-apiserver-client-cert was expected. With helm-based
installations, we now need to also look for
clustermesh-apiserver-client-cert when clustermesh-apiserver-remote-cert
is expected, and do this recursively.

Signed-off-by: Andrew Sauber <andrew.sauber@isovalent.com>
  • Loading branch information
asauber committed May 5, 2023
1 parent a1ad5a3 commit 127d6f9
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 22 deletions.
13 changes: 7 additions & 6 deletions clustermesh/certs.go
Expand Up @@ -110,16 +110,16 @@ func (k *K8sClusterMesh) createClusterMeshClientCertificate(ctx context.Context)
signConf := &config.Signing{
Default: &config.SigningProfile{Expiry: 5 * 365 * 24 * time.Hour},
Profiles: map[string]*config.SigningProfile{
defaults.ClusterMeshClientSecretName: {
defaults.ClusterMeshRemoteSecretName: {
Expiry: 5 * 365 * 24 * time.Hour,
Usage: []string{"signing", "key encipherment", "server auth", "client auth"},
},
},
}

cert, key, err := k.certManager.GenerateCertificate(defaults.ClusterMeshClientSecretName, certReq, signConf)
cert, key, err := k.certManager.GenerateCertificate(defaults.ClusterMeshRemoteSecretName, certReq, signConf)
if err != nil {
return fmt.Errorf("unable to generate certificate %s: %w", defaults.ClusterMeshClientSecretName, err)
return fmt.Errorf("unable to generate certificate %s: %w", defaults.ClusterMeshRemoteSecretName, err)
}

data := map[string][]byte{
Expand All @@ -128,9 +128,9 @@ func (k *K8sClusterMesh) createClusterMeshClientCertificate(ctx context.Context)
defaults.CASecretCertName: k.certManager.CACertBytes(),
}

_, err = k.client.CreateSecret(ctx, k.params.Namespace, k8s.NewTLSSecret(defaults.ClusterMeshClientSecretName, k.params.Namespace, data), metav1.CreateOptions{})
_, err = k.client.CreateSecret(ctx, k.params.Namespace, k8s.NewTLSSecret(defaults.ClusterMeshRemoteSecretName, k.params.Namespace, data), metav1.CreateOptions{})
if err != nil {
return fmt.Errorf("unable to create secret %s/%s: %w", k.params.Namespace, defaults.ClusterMeshClientSecretName, err)
return fmt.Errorf("unable to create secret %s/%s: %w", k.params.Namespace, defaults.ClusterMeshRemoteSecretName, err)
}

return nil
Expand Down Expand Up @@ -177,8 +177,9 @@ func (k *K8sClusterMesh) deleteCertificates(ctx context.Context) error {
k.Log("🔥 Deleting ClusterMesh certificates...")
k.client.DeleteSecret(ctx, k.params.Namespace, defaults.ClusterMeshServerSecretName, metav1.DeleteOptions{})
k.client.DeleteSecret(ctx, k.params.Namespace, defaults.ClusterMeshAdminSecretName, metav1.DeleteOptions{})
k.client.DeleteSecret(ctx, k.params.Namespace, defaults.ClusterMeshClientSecretName, metav1.DeleteOptions{})
k.client.DeleteSecret(ctx, k.params.Namespace, defaults.ClusterMeshRemoteSecretName, metav1.DeleteOptions{})
k.client.DeleteSecret(ctx, k.params.Namespace, defaults.ClusterMeshExternalWorkloadSecretName, metav1.DeleteOptions{})
k.client.DeleteSecret(ctx, k.params.Namespace, defaults.ClusterMeshClientSecretName, metav1.DeleteOptions{})
return nil
}

Expand Down
41 changes: 25 additions & 16 deletions clustermesh/clustermesh.go
Expand Up @@ -662,6 +662,8 @@ func (ai *accessInformation) validate() bool {

func getDeprecatedName(secretName string) string {
switch secretName {
case defaults.ClusterMeshRemoteSecretName:
return defaults.ClusterMeshClientSecretName
case defaults.ClusterMeshServerSecretName,
defaults.ClusterMeshAdminSecretName,
defaults.ClusterMeshClientSecretName,
Expand All @@ -672,6 +674,27 @@ func getDeprecatedName(secretName string) string {
}
}

// getDeprecatedSecret attempts to retrieve a secret using one or more deprecated names
// There are now multiple "layers" of deprecated secret names, so we call this function recursively if needed
func (k *K8sClusterMesh) getDeprecatedSecret(ctx context.Context, client k8sClusterMeshImplementation, secretName string, defaultName string) (*corev1.Secret, error) {

deprecatedSecretName := getDeprecatedName(secretName)
if deprecatedSecretName == "" {
return nil, fmt.Errorf("unable to get secret %q and no deprecated names to try", secretName)
}

k.Log("Trying to get secret %s by deprecated name %s", secretName, deprecatedSecretName)

secret, err := client.GetSecret(ctx, k.params.Namespace, deprecatedSecretName, metav1.GetOptions{})
if err != nil {
return k.getDeprecatedSecret(ctx, client, deprecatedSecretName, defaultName)
}

k.Log("⚠️ Deprecated secret name %q, should be changed to %q", secret.Name, defaultName)

return secret, err
}

// We had inconsistency in naming clustermesh secrets between Helm installation and Cilium CLI installation
// Cilium CLI was naming clustermesh secrets with trailing 's'. eg. 'clustermesh-apiserver-client-certs' instead of `clustermesh-apiserver-client-cert`
// This caused Cilium CLI 'clustermesh status' command to fail when Cilium is installed using Helm
Expand All @@ -680,22 +703,8 @@ func (k *K8sClusterMesh) getSecret(ctx context.Context, client k8sClusterMeshImp

secret, err := client.GetSecret(ctx, k.params.Namespace, secretName, metav1.GetOptions{})
if err != nil {
deprecatedSecretName := getDeprecatedName(secretName)
if deprecatedSecretName == "" {
return nil, fmt.Errorf("unable to get secret %q: %w", secretName, err)
}

k.Log("Trying to get secret %s by deprecated name %s", secretName, deprecatedSecretName)

secret, err = client.GetSecret(ctx, k.params.Namespace, deprecatedSecretName, metav1.GetOptions{})
if err != nil {
return nil, fmt.Errorf("unable to get secret %q: %w", deprecatedSecretName, err)
}

k.Log("⚠️ Deprecated secret name %q, should be changed to %q", secret.Name, secretName)

return k.getDeprecatedSecret(ctx, client, secretName, secretName)
}

return secret, err
}

Expand Down Expand Up @@ -733,7 +742,7 @@ func (k *K8sClusterMesh) extractAccessInformation(ctx context.Context, client k8
return nil, fmt.Errorf("secret %q does not contain CA cert %q", defaults.CASecretName, defaults.CASecretCertName)
}

meshSecret, err := k.getSecret(ctx, client, defaults.ClusterMeshClientSecretName)
meshSecret, err := k.getSecret(ctx, client, defaults.ClusterMeshRemoteSecretName)
if err != nil {
return nil, fmt.Errorf("unable to get client secret to access clustermesh service: %w", err)
}
Expand Down
1 change: 1 addition & 0 deletions defaults/defaults.go
Expand Up @@ -63,6 +63,7 @@ const (
ClusterMeshServerSecretName = "clustermesh-apiserver-server-cert"
ClusterMeshAdminSecretName = "clustermesh-apiserver-admin-cert"
ClusterMeshClientSecretName = "clustermesh-apiserver-client-cert"
ClusterMeshRemoteSecretName = "clustermesh-apiserver-remote-cert"
ClusterMeshExternalWorkloadSecretName = "clustermesh-apiserver-external-workload-cert"

ConnectivityCheckNamespace = "cilium-test"
Expand Down

0 comments on commit 127d6f9

Please sign in to comment.