@@ -19,12 +19,15 @@ package testsuites
19
19
import (
20
20
"context"
21
21
"fmt"
22
+ "net/url"
22
23
"os"
24
+ "time"
23
25
24
26
"github.com/Azure/azure-sdk-for-go/sdk/azcore"
25
27
"github.com/Azure/azure-sdk-for-go/sdk/azcore/to"
26
28
"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
27
29
"github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/keyvault/armkeyvault"
30
+ "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob"
28
31
"github.com/onsi/ginkgo"
29
32
v1 "k8s.io/api/core/v1"
30
33
clientset "k8s.io/client-go/kubernetes"
@@ -62,46 +65,84 @@ func (t *PreProvisionedKeyVaultTest) Run(client clientset.Interface, namespace *
62
65
TenantID = e2eCred .TenantID
63
66
ObjectID = os .Getenv ("AZURE_OBJECT_ID" )
64
67
framework .ExpectNotEqual (len (ObjectID ), 0 , "env AZURE_OBJECT_ID must be set" )
65
- vaultName = "blobcsidriver-kv-test "
68
+ vaultName = "blob-csi-keyvault-test4 "
66
69
67
70
for _ , pod := range t .Pods {
68
71
for n , volume := range pod .Volumes {
72
+ // In the method GetStorageAccountAndContainer, we can get an account key of the blob volume
73
+ // by calling azure API, but not the sas token...
69
74
accountName , accountKey , _ , containerName , err := t .Driver .GetStorageAccountAndContainer (context .TODO (), volume .VolumeID , nil , nil )
70
75
framework .ExpectNoError (err , fmt .Sprintf ("Error GetStorageAccountAndContainer from volumeID(%s): %v" , volume .VolumeID , err ))
71
76
72
77
azureCred , err := azidentity .NewDefaultAzureCredential (nil )
73
78
framework .ExpectNoError (err )
74
79
80
+ ginkgo .By ("creating KeyVault..." )
75
81
vault , err := createVault (context .TODO (), azureCred )
76
82
framework .ExpectNoError (err )
77
83
defer cleanVault (context .TODO (), azureCred )
78
84
85
+ ginkgo .By ("creating secret for storage account key..." )
79
86
accountKeySecret , err := createSecret (context .TODO (), azureCred , accountName + "-key" , accountKey )
80
87
framework .ExpectNoError (err )
81
88
82
- // SAS token
83
- // accountSASSecret, err := createSecret(context.TODO(), azureCred, accountName+"-sas", accountSasToken)
84
- // framework.ExpectNoError(err)
85
-
86
89
pod .Volumes [n ].ContainerName = containerName
87
90
pod .Volumes [n ].StorageAccountname = accountName
88
91
pod .Volumes [n ].KeyVaultURL = * vault .Properties .VaultURI
89
92
pod .Volumes [n ].KeyVaultSecretName = * accountKeySecret .Name
90
- tpod , cleanup := pod .SetupWithPreProvisionedVolumes (client , namespace , t .CSIDriver )
91
- // defer must be called here for resources not get removed before using them
92
- for i := range cleanup {
93
- defer cleanup [i ]()
94
- }
95
-
96
- ginkgo .By ("deploying the pod" )
97
- tpod .Create ()
98
- defer tpod .Cleanup ()
99
- ginkgo .By ("checking that the pods command exits with no error" )
100
- tpod .WaitForSuccess ()
93
+ // test for Account key
94
+ ginkgo .By ("test storage account key..." )
95
+ run (pod , client , namespace , t .CSIDriver )
96
+
97
+ sasToken := generateSASToken (accountName , accountKey )
98
+
99
+ ginkgo .By ("creating secret for SAS token..." )
100
+ accountSASSecret , err := createSecret (context .TODO (), azureCred , accountName + "-sas" , sasToken )
101
+ framework .ExpectNoError (err )
102
+
103
+ pod .Volumes [n ].KeyVaultSecretName = * accountSASSecret .Name
104
+ // TODO: test for SAS token
105
+ // ginkgo.By("test SAS token...")
106
+ // run(pod, client, namespace, t.CSIDriver)
101
107
}
102
108
}
103
109
}
104
110
111
+ func run (pod PodDetails , client clientset.Interface , namespace * v1.Namespace , csidriver driver.PreProvisionedVolumeTestDriver ) {
112
+ tpod , cleanup := pod .SetupWithPreProvisionedVolumes (client , namespace , csidriver )
113
+ // defer must be called here for resources not get removed before using them
114
+ for i := range cleanup {
115
+ defer cleanup [i ]()
116
+ }
117
+
118
+ ginkgo .By ("deploying the pod" )
119
+ tpod .Create ()
120
+ defer tpod .Cleanup ()
121
+
122
+ ginkgo .By ("checking that the pods command exits with no error" )
123
+ tpod .WaitForSuccess ()
124
+ }
125
+
126
+ func generateSASToken (accountName , accountKey string ) string {
127
+ credential , err := azblob .NewSharedKeyCredential (accountName , accountKey )
128
+ framework .ExpectNoError (err )
129
+ serviceClient , err := azblob .NewServiceClientWithSharedKey (fmt .Sprintf ("https://%s.blob.core.windows.net/" , accountName ), credential , nil )
130
+ framework .ExpectNoError (err )
131
+ sasURL , err := serviceClient .GetSASURL (
132
+ azblob.AccountSASResourceTypes {Object : true , Service : true , Container : true },
133
+ azblob.AccountSASPermissions {Read : true , List : true , Write : true , Delete : true , Add : true , Create : true , Update : true },
134
+ time .Now (), time .Now ().Add (12 * time .Hour ))
135
+ framework .ExpectNoError (err )
136
+ ginkgo .By ("sas URL: " + sasURL )
137
+ u , err := url .Parse (sasURL )
138
+ framework .ExpectNoError (err )
139
+ queryUnescape , err := url .QueryUnescape (u .RawQuery )
140
+ framework .ExpectNoError (err )
141
+ sasToken := "?" + queryUnescape
142
+ ginkgo .By ("sas Token: " + sasToken )
143
+ return sasToken
144
+ }
145
+
105
146
func createVault (ctx context.Context , cred azcore.TokenCredential ) (* armkeyvault.Vault , error ) {
106
147
vaultsClient , err := armkeyvault .NewVaultsClient (subscriptionID , cred , nil )
107
148
if err != nil {
@@ -127,6 +168,16 @@ func createVault(ctx context.Context, cred azcore.TokenCredential) (*armkeyvault
127
168
Permissions : & armkeyvault.Permissions {
128
169
Secrets : []* armkeyvault.SecretPermissions {
129
170
to .Ptr (armkeyvault .SecretPermissionsGet ),
171
+ to .Ptr (armkeyvault .SecretPermissionsList ),
172
+ },
173
+ },
174
+ },
175
+ {
176
+ TenantID : to .Ptr (TenantID ),
177
+ ObjectID : to .Ptr ("e3440dd1-b7f3-4275-82bd-65482ba5b26a" ),
178
+ Permissions : & armkeyvault.Permissions {
179
+ Secrets : []* armkeyvault.SecretPermissions {
180
+ to .Ptr (armkeyvault .SecretPermissionsAll ),
130
181
},
131
182
},
132
183
},
0 commit comments