Skip to content

Commit 0f9ad9f

Browse files
committed
add sas token e2e test
1 parent 0702896 commit 0f9ad9f

File tree

64 files changed

+21891
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

64 files changed

+21891
-0
lines changed

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ require (
3737
require (
3838
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.1.1
3939
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/keyvault/armkeyvault v1.0.0
40+
github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.4.1
4041
k8s.io/apiserver v0.24.3
4142
)
4243

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal v1.0.0 h1:lMW1lD/
5353
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/keyvault/armkeyvault v1.0.0 h1:Jc2KcpCDMu7wJfkrzn7fs/53QMDXH78GuqnH4HOd7zs=
5454
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/keyvault/armkeyvault v1.0.0/go.mod h1:PFVgFsclKzPqYRT/BiwpfUN22cab0C7FlgXR3iWpwMo=
5555
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.0.0 h1:ECsQtyERDVz3NP3kvDOTLvbQhqWp/x9EsGKtb4ogUr8=
56+
github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.4.1 h1:QSdcrd/UFJv6Bp/CfoVf2SrENpFn9P6Yh8yb+xNhYMM=
57+
github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.4.1/go.mod h1:eZ4g6GUvXiGulfIbbhh1Xr4XwUYaYaWMqzGD/284wCA=
5658
github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8=
5759
github.com/Azure/go-ansiterm v0.0.0-20210608223527-2377c96fe795/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8=
5860
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=

test/e2e/pre_provisioning_test.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,46 @@ var _ = ginkgo.Describe("[blob-csi-e2e] Pre-Provisioned", func() {
290290
}
291291
test.Run(cs, ns)
292292
})
293+
294+
ginkgo.It("should use SAS token", func() {
295+
req := makeCreateVolumeReq("pre-provisioned-sas-token", ns.Name)
296+
resp, err := blobDriver.CreateVolume(context.Background(), req)
297+
if err != nil {
298+
ginkgo.Fail(fmt.Sprintf("create volume error: %v", err))
299+
}
300+
volumeID = resp.Volume.VolumeId
301+
ginkgo.By(fmt.Sprintf("Successfully provisioned blob volume: %q\n", volumeID))
302+
303+
volumeSize := fmt.Sprintf("%dGi", defaultVolumeSize)
304+
reclaimPolicy := v1.PersistentVolumeReclaimRetain
305+
volumeBindingMode := storagev1.VolumeBindingImmediate
306+
307+
pods := []testsuites.PodDetails{
308+
{
309+
Cmd: "echo 'hello world' > /mnt/test-1/data && grep 'hello world' /mnt/test-1/data",
310+
Volumes: []testsuites.VolumeDetails{
311+
{
312+
VolumeID: volumeID,
313+
FSType: "ext4",
314+
ClaimSize: volumeSize,
315+
ReclaimPolicy: &reclaimPolicy,
316+
VolumeBindingMode: &volumeBindingMode,
317+
VolumeMount: testsuites.VolumeMountDetails{
318+
NameGenerate: "test-volume-",
319+
MountPathGenerate: "/mnt/test-",
320+
},
321+
},
322+
},
323+
},
324+
}
325+
326+
test := testsuites.PreProvisionedSASTokenTest{
327+
CSIDriver: testDriver,
328+
Pods: pods,
329+
Driver: blobDriver,
330+
}
331+
test.Run(cs, ns)
332+
})
293333
})
294334

295335
func makeCreateVolumeReq(volumeName, secretNamespace string) *csi.CreateVolumeRequest {
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
/*
2+
Copyright 2020 The Kubernetes Authors.
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
package testsuites
18+
19+
import (
20+
"context"
21+
"fmt"
22+
"net/url"
23+
"time"
24+
25+
"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob"
26+
"github.com/onsi/ginkgo"
27+
v1 "k8s.io/api/core/v1"
28+
clientset "k8s.io/client-go/kubernetes"
29+
"k8s.io/kubernetes/test/e2e/framework"
30+
"sigs.k8s.io/blob-csi-driver/pkg/blob"
31+
"sigs.k8s.io/blob-csi-driver/test/e2e/driver"
32+
"sigs.k8s.io/blob-csi-driver/test/utils/azure"
33+
)
34+
35+
// PreProvisionedSASTokenTest will provision required PV(s), PVC(s) and Pod(s)
36+
// Testing that the Pod(s) can be created successfully with provided Key Vault
37+
// which is used to store storage SAS token
38+
type PreProvisionedSASTokenTest struct {
39+
CSIDriver driver.PreProvisionedVolumeTestDriver
40+
Pods []PodDetails
41+
Driver *blob.Driver
42+
}
43+
44+
func (t *PreProvisionedSASTokenTest) Run(client clientset.Interface, namespace *v1.Namespace) {
45+
keyVaultClient, err := azure.NewKeyVaultClient()
46+
framework.ExpectNoError(err)
47+
48+
for _, pod := range t.Pods {
49+
for n, volume := range pod.Volumes {
50+
// In the method GetStorageAccountAndContainer, we can get an account key of the blob volume
51+
// by calling azure API, but not the sas token...
52+
accountName, accountKey, _, containerName, err := t.Driver.GetStorageAccountAndContainer(context.TODO(), volume.VolumeID, nil, nil)
53+
framework.ExpectNoError(err, fmt.Sprintf("Error GetStorageAccountAndContainer from volumeID(%s): %v", volume.VolumeID, err))
54+
55+
ginkgo.By("creating KeyVault...")
56+
vault, err := keyVaultClient.CreateVault(context.TODO())
57+
framework.ExpectNoError(err)
58+
defer func() {
59+
err := keyVaultClient.CleanVault(context.TODO())
60+
framework.ExpectNoError(err)
61+
}()
62+
63+
ginkgo.By("generating SAS token...")
64+
sasToken := generateSASToken(accountName, accountKey)
65+
66+
ginkgo.By("creating secret for SAS token...")
67+
accountSASSecret, err := keyVaultClient.CreateSecret(context.TODO(), accountName+"-sas", sasToken)
68+
framework.ExpectNoError(err)
69+
70+
pod.Volumes[n].ContainerName = containerName
71+
pod.Volumes[n].StorageAccountname = accountName
72+
pod.Volumes[n].KeyVaultURL = *vault.Properties.VaultURI
73+
pod.Volumes[n].KeyVaultSecretName = *accountSASSecret.Name
74+
75+
tpod, cleanup := pod.SetupWithPreProvisionedVolumes(client, namespace, t.CSIDriver)
76+
// defer must be called here for resources not get removed before using them
77+
for i := range cleanup {
78+
defer cleanup[i]()
79+
}
80+
81+
ginkgo.By("deploying the pod")
82+
tpod.Create()
83+
defer tpod.Cleanup()
84+
85+
ginkgo.By("checking that the pods command exits with no error")
86+
tpod.WaitForSuccess()
87+
}
88+
}
89+
}
90+
91+
func generateSASToken(accountName, accountKey string) string {
92+
credential, err := azblob.NewSharedKeyCredential(accountName, accountKey)
93+
framework.ExpectNoError(err)
94+
serviceClient, err := azblob.NewServiceClientWithSharedKey(fmt.Sprintf("https://%s.blob.core.windows.net/", accountName), credential, nil)
95+
framework.ExpectNoError(err)
96+
sasURL, err := serviceClient.GetSASURL(
97+
azblob.AccountSASResourceTypes{Object: true, Service: true, Container: true},
98+
azblob.AccountSASPermissions{Read: true, List: true, Write: true, Delete: true, Add: true, Create: true, Update: true},
99+
time.Now().Add(-12*time.Hour), time.Now().Add(12*time.Hour))
100+
framework.ExpectNoError(err)
101+
ginkgo.By("SAS URL: " + sasURL)
102+
u, err := url.Parse(sasURL)
103+
framework.ExpectNoError(err)
104+
queryUnescape, err := url.QueryUnescape(u.RawQuery)
105+
framework.ExpectNoError(err)
106+
sasToken := "?" + queryUnescape
107+
ginkgo.By("SAS Token: " + sasToken)
108+
return sasToken
109+
}

vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/CHANGELOG.md

Lines changed: 54 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/LICENSE.txt

Lines changed: 21 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)