Skip to content

Commit 11b29d1

Browse files
authored
Merge pull request #943 from k8s-infra-cherrypick-robot/cherry-pick-942-to-release-1.21
[release-1.21] feat: support setting AzureStorageSPNClientID/TenantId in secret
2 parents afe2e24 + e8a5600 commit 11b29d1

File tree

3 files changed

+51
-17
lines changed

3 files changed

+51
-17
lines changed

docs/driver-parameters.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ volumeAttributes.keyVaultSecretVersion | Azure Key Vault secret version | existi
103103
kubectl create secret generic azure-secret --from-literal=azurestorageaccountname="xxx" --from-literal azurestorageaccountkey="xxx" --type=Opaque
104104
kubectl create secret generic azure-secret --from-literal=azurestorageaccountname="xxx" --from-literal azurestorageaccountsastoken="xxx" --type=Opaque
105105
kubectl create secret generic azure-secret --from-literal msisecret="xxx" --type=Opaque
106-
kubectl create secret generic azure-secret --from-literal azurestoragespnclientsecret="xxx" --type=Opaque
106+
kubectl create secret generic azure-secret --from-literal azurestoragespnclientsecret="xxx" azurestoragespnclientid="xxx" azurestoragespntenantid="xxx" --type=Opaque
107107
```
108108

109109
### Tips

pkg/blob/blob.go

Lines changed: 38 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,8 @@ const (
7575
softDeleteContainersField = "softdeletecontainers"
7676
enableBlobVersioningField = "enableblobversioning"
7777
getAccountKeyFromSecretField = "getaccountkeyfromsecret"
78+
storageSPNClientIDField = "azurestoragespnclientid"
79+
storageSPNTenantIDField = "azurestoragespntenantid"
7880
keyVaultURLField = "keyvaulturl"
7981
keyVaultSecretNameField = "keyvaultsecretname"
8082
keyVaultSecretVersionField = "keyvaultsecretversion"
@@ -369,6 +371,8 @@ func (d *Driver) GetAuthEnv(ctx context.Context, volumeID, protocol string, attr
369371
accountSasToken string
370372
msiSecret string
371373
storageSPNClientSecret string
374+
storageSPNClientID string
375+
storageSPNTenantID string
372376
secretName string
373377
pvcNamespace string
374378
keyVaultURL string
@@ -416,10 +420,10 @@ func (d *Driver) GetAuthEnv(ctx context.Context, volumeID, protocol string, attr
416420
authEnv = append(authEnv, "AZURE_STORAGE_IDENTITY_RESOURCE_ID="+v)
417421
case "msiendpoint":
418422
authEnv = append(authEnv, "MSI_ENDPOINT="+v)
419-
case "azurestoragespnclientid":
420-
authEnv = append(authEnv, "AZURE_STORAGE_SPN_CLIENT_ID="+v)
421-
case "azurestoragespntenantid":
422-
authEnv = append(authEnv, "AZURE_STORAGE_SPN_TENANT_ID="+v)
423+
case storageSPNClientIDField:
424+
storageSPNClientID = v
425+
case storageSPNTenantIDField:
426+
storageSPNTenantID = v
423427
case "azurestorageaadendpoint":
424428
authEnv = append(authEnv, "AZURE_STORAGE_AAD_ENDPOINT="+v)
425429
}
@@ -463,11 +467,17 @@ func (d *Driver) GetAuthEnv(ctx context.Context, volumeID, protocol string, attr
463467
}
464468
if secretName != "" {
465469
// read from k8s secret first
466-
var name string
467-
name, accountKey, accountSasToken, msiSecret, storageSPNClientSecret, err = d.GetInfoFromSecret(ctx, secretName, secretNamespace)
470+
var name, spnClientID, spnTenantID string
471+
name, accountKey, accountSasToken, msiSecret, storageSPNClientSecret, spnClientID, spnTenantID, err = d.GetInfoFromSecret(ctx, secretName, secretNamespace)
468472
if name != "" {
469473
accountName = name
470474
}
475+
if spnClientID != "" {
476+
storageSPNClientID = spnClientID
477+
}
478+
if spnTenantID != "" {
479+
storageSPNTenantID = spnTenantID
480+
}
471481
if err != nil && strings.EqualFold(azureStorageAuthType, "msi") {
472482
klog.V(2).Infof("ignore error(%v) since secret is optional for auth type(%s)", err, azureStorageAuthType)
473483
err = nil
@@ -499,6 +509,10 @@ func (d *Driver) GetAuthEnv(ctx context.Context, volumeID, protocol string, attr
499509
msiSecret = v
500510
case storageSPNClientSecretField:
501511
storageSPNClientSecret = v
512+
case storageSPNClientIDField:
513+
storageSPNClientID = v
514+
case storageSPNTenantIDField:
515+
storageSPNTenantID = v
502516
}
503517
}
504518
}
@@ -527,6 +541,16 @@ func (d *Driver) GetAuthEnv(ctx context.Context, volumeID, protocol string, attr
527541
authEnv = append(authEnv, "AZURE_STORAGE_SPN_CLIENT_SECRET="+storageSPNClientSecret)
528542
}
529543

544+
if storageSPNClientID != "" {
545+
klog.V(2).Infof("storageSPNClientID(%s) is not empty, use it to access storage account(%s), container(%s)", storageSPNClientID, accountName, containerName)
546+
authEnv = append(authEnv, "AZURE_STORAGE_SPN_CLIENT_ID="+storageSPNClientID)
547+
}
548+
549+
if storageSPNTenantID != "" {
550+
klog.V(2).Infof("storageSPNTenantID(%s) is not empty, use it to access storage account(%s), container(%s)", storageSPNTenantID, accountName, containerName)
551+
authEnv = append(authEnv, "AZURE_STORAGE_SPN_TENANT_ID="+storageSPNTenantID)
552+
}
553+
530554
return rgName, accountName, accountKey, containerName, authEnv, err
531555
}
532556

@@ -757,7 +781,7 @@ func (d *Driver) GetStorageAccesskey(ctx context.Context, accountOptions *azure.
757781
if secretName == "" {
758782
secretName = fmt.Sprintf(secretNameTemplate, accountOptions.Name)
759783
}
760-
_, accountKey, _, _, _, err := d.GetInfoFromSecret(ctx, secretName, secretNamespace) //nolint
784+
_, accountKey, _, _, _, _, _, err := d.GetInfoFromSecret(ctx, secretName, secretNamespace) //nolint
761785
if err != nil {
762786
klog.V(2).Infof("could not get account(%s) key from secret(%s) namespace(%s), error: %v, use cluster identity to get account key instead", accountOptions.Name, secretName, secretNamespace, err)
763787
accountKey, err = d.cloud.GetStorageAccesskey(ctx, accountOptions.SubscriptionID, accountOptions.Name, accountOptions.ResourceGroup)
@@ -766,25 +790,27 @@ func (d *Driver) GetStorageAccesskey(ctx context.Context, accountOptions *azure.
766790
}
767791

768792
// GetInfoFromSecret get info from k8s secret
769-
// return <accountName, accountKey, accountSasToken, msiSecret, spnClientSecret, error>
770-
func (d *Driver) GetInfoFromSecret(ctx context.Context, secretName, secretNamespace string) (string, string, string, string, string, error) {
793+
// return <accountName, accountKey, accountSasToken, msiSecret, spnClientSecret, spnClientID, spnTenantID, error>
794+
func (d *Driver) GetInfoFromSecret(ctx context.Context, secretName, secretNamespace string) (string, string, string, string, string, string, string, error) {
771795
if d.cloud.KubeClient == nil {
772-
return "", "", "", "", "", fmt.Errorf("could not get account key from secret(%s): KubeClient is nil", secretName)
796+
return "", "", "", "", "", "", "", fmt.Errorf("could not get account key from secret(%s): KubeClient is nil", secretName)
773797
}
774798

775799
secret, err := d.cloud.KubeClient.CoreV1().Secrets(secretNamespace).Get(ctx, secretName, metav1.GetOptions{})
776800
if err != nil {
777-
return "", "", "", "", "", fmt.Errorf("could not get secret(%v): %w", secretName, err)
801+
return "", "", "", "", "", "", "", fmt.Errorf("could not get secret(%v): %w", secretName, err)
778802
}
779803

780804
accountName := strings.TrimSpace(string(secret.Data[defaultSecretAccountName][:]))
781805
accountKey := strings.TrimSpace(string(secret.Data[defaultSecretAccountKey][:]))
782806
accountSasToken := strings.TrimSpace(string(secret.Data[accountSasTokenField][:]))
783807
msiSecret := strings.TrimSpace(string(secret.Data[msiSecretField][:]))
784808
spnClientSecret := strings.TrimSpace(string(secret.Data[storageSPNClientSecretField][:]))
809+
spnClientID := strings.TrimSpace(string(secret.Data[storageSPNClientIDField][:]))
810+
spnTenantID := strings.TrimSpace(string(secret.Data[storageSPNTenantIDField][:]))
785811

786812
klog.V(4).Infof("got storage account(%s) from secret", accountName)
787-
return accountName, accountKey, accountSasToken, msiSecret, spnClientSecret, nil
813+
return accountName, accountKey, accountSasToken, msiSecret, spnClientSecret, spnClientID, spnTenantID, nil
788814
}
789815

790816
// getSubnetResourceID get default subnet resource ID from cloud provider config

pkg/blob/blob_test.go

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1047,7 +1047,7 @@ func TestGetInfoFromSecret(t *testing.T) {
10471047
d.cloud.KubeClient = nil
10481048
secretName := "foo"
10491049
secretNamespace := "bar"
1050-
_, _, _, _, _, err := d.GetInfoFromSecret(context.TODO(), secretName, secretNamespace)
1050+
_, _, _, _, _, _, _, err := d.GetInfoFromSecret(context.TODO(), secretName, secretNamespace)
10511051
expectedErr := fmt.Errorf("could not get account key from secret(%s): KubeClient is nil", secretName)
10521052
if assert.Error(t, err) {
10531053
assert.Equal(t, expectedErr, err)
@@ -1062,7 +1062,7 @@ func TestGetInfoFromSecret(t *testing.T) {
10621062
d.cloud.KubeClient = fakeClient
10631063
secretName := ""
10641064
secretNamespace := ""
1065-
_, _, _, _, _, err := d.GetInfoFromSecret(context.TODO(), secretName, secretNamespace)
1065+
_, _, _, _, _, _, _, err := d.GetInfoFromSecret(context.TODO(), secretName, secretNamespace)
10661066
// expectedErr := fmt.Errorf("could not get secret(%v): %w", secretName, err)
10671067
assert.Error(t, err) // could not check what type of error, needs fix
10681068
/*if assert.Error(t, err) {
@@ -1095,12 +1095,14 @@ func TestGetInfoFromSecret(t *testing.T) {
10951095
if secretCreateErr != nil {
10961096
t.Error("failed to create secret")
10971097
}
1098-
an, ak, accountSasToken, msiSecret, storageSPNClientSecret, err := d.GetInfoFromSecret(context.TODO(), secretName, secretNamespace)
1098+
an, ak, accountSasToken, msiSecret, storageSPNClientSecret, storageSPNClientID, storageSPNTenantID, err := d.GetInfoFromSecret(context.TODO(), secretName, secretNamespace)
10991099
assert.Equal(t, accountName, an, "accountName should match")
11001100
assert.Equal(t, accountKey, ak, "accountKey should match")
11011101
assert.Equal(t, "", accountSasToken, "accountSasToken should be empty")
11021102
assert.Equal(t, "", msiSecret, "msiSecret should be empty")
11031103
assert.Equal(t, "", storageSPNClientSecret, "storageSPNClientSecret should be empty")
1104+
assert.Equal(t, "", storageSPNClientID, "storageSPNClientID should be empty")
1105+
assert.Equal(t, "", storageSPNTenantID, "storageSPNTenantID should be empty")
11041106
assert.Equal(t, nil, err, "error should be nil")
11051107
},
11061108
},
@@ -1116,6 +1118,8 @@ func TestGetInfoFromSecret(t *testing.T) {
11161118
accountSasTokenValue := "foo"
11171119
msiSecretValue := "msiSecret"
11181120
storageSPNClientSecretValue := "storageSPNClientSecret"
1121+
storageSPNClientIDValue := "storageSPNClientID"
1122+
storageSPNTenantIDValue := "storageSPNTenantID"
11191123
secret := &v1api.Secret{
11201124
ObjectMeta: metav1.ObjectMeta{
11211125
Namespace: secretNamespace,
@@ -1126,19 +1130,23 @@ func TestGetInfoFromSecret(t *testing.T) {
11261130
accountSasTokenField: []byte(accountSasTokenValue),
11271131
msiSecretField: []byte(msiSecretValue),
11281132
storageSPNClientSecretField: []byte(storageSPNClientSecretValue),
1133+
storageSPNClientIDField: []byte(storageSPNClientIDValue),
1134+
storageSPNTenantIDField: []byte(storageSPNTenantIDValue),
11291135
},
11301136
Type: "Opaque",
11311137
}
11321138
_, secretCreateErr := d.cloud.KubeClient.CoreV1().Secrets(secretNamespace).Create(context.TODO(), secret, metav1.CreateOptions{})
11331139
if secretCreateErr != nil {
11341140
t.Error("failed to create secret")
11351141
}
1136-
an, ak, accountSasToken, msiSecret, storageSPNClientSecret, err := d.GetInfoFromSecret(context.TODO(), secretName, secretNamespace)
1142+
an, ak, accountSasToken, msiSecret, storageSPNClientSecret, storageSPNClientID, storageSPNTenantID, err := d.GetInfoFromSecret(context.TODO(), secretName, secretNamespace)
11371143
assert.Equal(t, accountName, an, "accountName should match")
11381144
assert.Equal(t, "", ak, "accountKey should be empty")
11391145
assert.Equal(t, accountSasTokenValue, accountSasToken, "sasToken should match")
11401146
assert.Equal(t, msiSecretValue, msiSecret, "msiSecret should match")
11411147
assert.Equal(t, storageSPNClientSecretValue, storageSPNClientSecret, "storageSPNClientSecret should match")
1148+
assert.Equal(t, storageSPNClientIDValue, storageSPNClientID, "storageSPNClientID should match")
1149+
assert.Equal(t, storageSPNTenantIDValue, storageSPNTenantID, "storageSPNTenantID should match")
11421150
assert.Equal(t, nil, err, "error should be nil")
11431151
},
11441152
},

0 commit comments

Comments
 (0)