Skip to content

Commit 1eb8229

Browse files
committed
Add doc info on certPath for Service Principal with Certificate
1 parent 7ad2b68 commit 1eb8229

File tree

4 files changed

+47
-18
lines changed

4 files changed

+47
-18
lines changed

api/v1beta1/azureclusteridentity_types.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ type AzureClusterIdentitySpec struct {
5959
// ClientSecret is a secret reference which should contain either a Service Principal password or certificate secret.
6060
// +optional
6161
ClientSecret corev1.SecretReference `json:"clientSecret,omitempty"`
62-
// certPath is the path where certicates exist. When set, it takes precedence over ClientSecret for types that uses certs like ServicePrincipalCertificate.
62+
// certPath is the path where certificates exist. When set, it takes precedence over ClientSecret for types that uses certs like ServicePrincipalCertificate.
6363
// +optional
6464
CertPath string `json:"certPath,omitempty"`
6565
// TenantID is the service principal primary tenant id.

config/crd/bases/infrastructure.cluster.x-k8s.io_azureclusteridentities.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ spec:
124124
x-kubernetes-map-type: atomic
125125
type: object
126126
certPath:
127-
description: certPath is the path where certicates exist. When set,
127+
description: certPath is the path where certificates exist. When set,
128128
it takes precedence over ClientSecret for types that uses certs
129129
like ServicePrincipalCertificate.
130130
type: string

controllers/asosecret_controller.go

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package controllers
1919
import (
2020
"context"
2121
"fmt"
22+
"os"
2223

2324
asoconfig "github.com/Azure/azure-service-operator/v2/pkg/common/config"
2425
"github.com/pkg/errors"
@@ -287,23 +288,33 @@ func (asos *ASOSecretReconciler) createSecretFromClusterIdentity(ctx context.Con
287288
return newASOSecret, nil
288289
}
289290

290-
// Fetch identity secret, if it exists
291-
key = types.NamespacedName{
292-
Namespace: identity.Spec.ClientSecret.Namespace,
293-
Name: identity.Spec.ClientSecret.Name,
294-
}
295-
identitySecret := &corev1.Secret{}
296-
err := asos.Get(ctx, key, identitySecret)
297-
if err != nil {
298-
return nil, errors.Wrap(err, "failed to fetch AzureClusterIdentity secret")
299-
}
291+
if identity.Spec.CertPath != "" {
292+
certsContent, err := os.ReadFile(identity.Spec.CertPath)
293+
if err != nil {
294+
return nil, errors.Wrap(err, "failed to read certificate file")
295+
}
300296

301-
switch identity.Spec.Type {
302-
case infrav1.ServicePrincipal, infrav1.ManualServicePrincipal:
303-
newASOSecret.Data[asoconfig.AzureClientSecret] = identitySecret.Data[scope.AzureSecretKey]
304-
case infrav1.ServicePrincipalCertificate:
305-
newASOSecret.Data[asoconfig.AzureClientCertificate] = identitySecret.Data["certificate"]
306-
newASOSecret.Data[asoconfig.AzureClientCertificatePassword] = identitySecret.Data["password"]
297+
newASOSecret.Data[asoconfig.AzureClientCertificate] = []byte(certsContent)
298+
newASOSecret.Data[asoconfig.AzureClientCertificatePassword] = []byte{}
299+
} else {
300+
// Fetch identity secret, if it exists
301+
key = types.NamespacedName{
302+
Namespace: identity.Spec.ClientSecret.Namespace,
303+
Name: identity.Spec.ClientSecret.Name,
304+
}
305+
identitySecret := &corev1.Secret{}
306+
err := asos.Get(ctx, key, identitySecret)
307+
if err != nil {
308+
return nil, errors.Wrap(err, "failed to fetch AzureClusterIdentity secret")
309+
}
310+
311+
switch identity.Spec.Type {
312+
case infrav1.ServicePrincipal, infrav1.ManualServicePrincipal:
313+
newASOSecret.Data[asoconfig.AzureClientSecret] = identitySecret.Data[scope.AzureSecretKey]
314+
case infrav1.ServicePrincipalCertificate:
315+
newASOSecret.Data[asoconfig.AzureClientCertificate] = identitySecret.Data["certificate"]
316+
newASOSecret.Data[asoconfig.AzureClientCertificatePassword] = identitySecret.Data["password"]
317+
}
307318
}
308319
return newASOSecret, nil
309320
}

docs/book/src/topics/identities.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,24 @@ data:
125125
password: PASSWORD
126126
```
127127

128+
Alternatively, the path to a certificate can be specified instead of the k8s secret:
129+
130+
```yaml
131+
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
132+
kind: AzureClusterIdentity
133+
metadata:
134+
name: example-identity
135+
namespace: default
136+
spec:
137+
type: ServicePrincipalCertificate
138+
tenantID: <azure-tenant-id>
139+
clientID: <client-id-of-SP-identity>
140+
certPath: <path-to-the-cert>
141+
allowedNamespaces:
142+
list:
143+
- <cluster-namespace>
144+
```
145+
128146
## User-Assigned Managed Identity
129147

130148
<aside class="note">

0 commit comments

Comments
 (0)