Skip to content

Commit 0fb2adf

Browse files
authored
Merge pull request #644 from andyzhangx/cross-subs
feat: support mount blob storage directory in another subscription
2 parents 195c726 + 126a41d commit 0fb2adf

37 files changed

+656
-250
lines changed

docs/driver-parameters.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ allowBlobPublicAccess | Allow or disallow public access to all blobs or containe
1919
storageEndpointSuffix | specify Azure storage endpoint suffix | `core.windows.net` | No | if empty, driver will use default storage endpoint suffix according to cloud environment, e.g. `core.windows.net`
2020
tags | [tags](https://docs.microsoft.com/en-us/azure/azure-resource-manager/management/tag-resources) would be created in newly created storage account | tag format: 'foo=aaa,bar=bbb' | No | ""
2121
--- | **Following parameters are only for blobfuse** | --- | --- |
22+
subscriptionID | specify Azure subscription ID in which blob storage directory will be created | Azure subscription ID | No | if not empty, `resourceGroup` must be provided
2223
storeAccountKey | whether store account key to k8s secret <br><br> Note: <br> `false` means driver would leverage kubelet identity to get account key | `true`,`false` | No | `true`
2324
secretName | specify secret name to store account key | | No |
2425
secretNamespace | specify the namespace of secret to store account key | `default`,`kube-system`, etc | No | pvc namespace

go.mod

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ module sigs.k8s.io/blob-csi-driver
33
go 1.17
44

55
require (
6-
github.com/Azure/azure-sdk-for-go v62.2.0+incompatible
7-
github.com/Azure/go-autorest/autorest v0.11.24
6+
github.com/Azure/azure-sdk-for-go v63.1.0+incompatible
7+
github.com/Azure/go-autorest/autorest v0.11.25
88
github.com/Azure/go-autorest/autorest/adal v0.9.18
99
github.com/Azure/go-autorest/autorest/to v0.4.0
1010
github.com/container-storage-interface/spec v1.5.0
@@ -14,11 +14,11 @@ require (
1414
github.com/imdario/mergo v0.3.9 // indirect
1515
github.com/kubernetes-csi/csi-lib-utils v0.9.1
1616
github.com/onsi/ginkgo v1.16.5
17-
github.com/onsi/gomega v1.18.1
17+
github.com/onsi/gomega v1.19.0
1818
github.com/pborman/uuid v1.2.0
1919
github.com/pelletier/go-toml v1.9.4
2020
github.com/stretchr/testify v1.7.1
21-
golang.org/x/net v0.0.0-20211209124913-491a49abca63
21+
golang.org/x/net v0.0.0-20220225172249-27dd8689420f
2222
google.golang.org/grpc v1.42.0
2323
google.golang.org/protobuf v1.27.1
2424
k8s.io/api v0.23.3
@@ -36,7 +36,7 @@ require (
3636
require (
3737
github.com/Azure/go-autorest v14.2.0+incompatible // indirect
3838
github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect
39-
github.com/Azure/go-autorest/autorest/mocks v0.4.1 // indirect
39+
github.com/Azure/go-autorest/autorest/mocks v0.4.2 // indirect
4040
github.com/Azure/go-autorest/autorest/validation v0.3.1 // indirect
4141
github.com/Azure/go-autorest/logger v0.2.1 // indirect
4242
github.com/Azure/go-autorest/tracing v0.6.0 // indirect
@@ -92,7 +92,7 @@ require (
9292
golang.org/x/crypto v0.0.0-20220112180741-5e0467b6c7ce // indirect
9393
golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 // indirect
9494
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9 // indirect
95-
golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b // indirect
95+
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect
9696
golang.org/x/text v0.3.7 // indirect
9797
golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac // indirect
9898
google.golang.org/appengine v1.6.7 // indirect
@@ -145,5 +145,5 @@ replace (
145145
k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.23.3
146146
k8s.io/sample-cli-plugin => k8s.io/sample-cli-plugin v0.23.3
147147
k8s.io/sample-controller => k8s.io/sample-controller v0.23.3
148-
sigs.k8s.io/cloud-provider-azure => sigs.k8s.io/cloud-provider-azure v0.7.4-0.20220318124122-66e1bec130df
148+
sigs.k8s.io/cloud-provider-azure => sigs.k8s.io/cloud-provider-azure v0.7.4-0.20220406062855-4f3bab6bc8b2
149149
)

go.sum

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -41,23 +41,24 @@ cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9
4141
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
4242
dmitri.shuralyov.com/gpu/mtl v0.0.0-20201218220906-28db891af037/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
4343
github.com/Azure/azure-sdk-for-go v55.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=
44-
github.com/Azure/azure-sdk-for-go v62.2.0+incompatible h1:o596qtwrgDH44VC3J0JOCwkT1xKekn8kPvCGpAceYs0=
45-
github.com/Azure/azure-sdk-for-go v62.2.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=
44+
github.com/Azure/azure-sdk-for-go v63.1.0+incompatible h1:yNC7qlSUWVF8p0TzxdmWW1FJ3DdIA+0Pge41IU/2+9U=
45+
github.com/Azure/azure-sdk-for-go v63.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=
4646
github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8=
4747
github.com/Azure/go-ansiterm v0.0.0-20210608223527-2377c96fe795/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8=
4848
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
4949
github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs=
5050
github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=
5151
github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA=
52-
github.com/Azure/go-autorest/autorest v0.11.24 h1:1fIGgHKqVm54KIPT+q8Zmd1QlVsmHqeUGso5qm2BqqE=
53-
github.com/Azure/go-autorest/autorest v0.11.24/go.mod h1:G6kyRlFnTuSbEYkQGawPfsCswgme4iYf6rfSKUDzbCc=
52+
github.com/Azure/go-autorest/autorest v0.11.25 h1:yp+V8DGur2aIUE87ebP8twPLz6k68jtJTlg61mEoByA=
53+
github.com/Azure/go-autorest/autorest v0.11.25/go.mod h1:7l8ybrIdUmGqZMTD0sRtAr8NvbHjfofbf8RSP2q7w7U=
5454
github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M=
5555
github.com/Azure/go-autorest/autorest/adal v0.9.18 h1:kLnPsRjzZZUF3K5REu/Kc+qMQrvuza2bwSnNdhmzLfQ=
5656
github.com/Azure/go-autorest/autorest/adal v0.9.18/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ=
5757
github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw=
5858
github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74=
59-
github.com/Azure/go-autorest/autorest/mocks v0.4.1 h1:K0laFcLE6VLTOwNgSxaGbUcLPuGXlNkbVvq4cW4nIHk=
6059
github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k=
60+
github.com/Azure/go-autorest/autorest/mocks v0.4.2 h1:PGN4EDXnuQbojHbU0UWoNvmu9AGVwYHG9/fkDYhtAfw=
61+
github.com/Azure/go-autorest/autorest/mocks v0.4.2/go.mod h1:Vy7OitM9Kei0i1Oj+LvyAWMXJHeKH1MVlzFugfVrmyU=
6162
github.com/Azure/go-autorest/autorest/to v0.4.0 h1:oXVqrxakqqV1UZdSazDOPOLvOIz+XA683u8EctwboHk=
6263
github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE=
6364
github.com/Azure/go-autorest/autorest/validation v0.1.0/go.mod h1:Ha3z/SqBeaalWQvokg3NZAlQTalVMtOIAs1aGK7G6u8=
@@ -494,14 +495,14 @@ github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9k
494495
github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0=
495496
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
496497
github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
497-
github.com/onsi/ginkgo/v2 v2.0.0 h1:CcuG/HvWNkkaqCUpJifQY8z7qEMBJya6aLPx6ftGyjQ=
498-
github.com/onsi/ginkgo/v2 v2.0.0/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c=
498+
github.com/onsi/ginkgo/v2 v2.1.3 h1:e/3Cwtogj0HA+25nMP1jCMDIf8RtRYbGwGGuBIFztkc=
499+
github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c=
499500
github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
500501
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
501502
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
502503
github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
503-
github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE=
504-
github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs=
504+
github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw=
505+
github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro=
505506
github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
506507
github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
507508
github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
@@ -782,8 +783,9 @@ golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qx
782783
golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
783784
golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
784785
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
785-
golang.org/x/net v0.0.0-20211209124913-491a49abca63 h1:iocB37TsdFuN6IBRZ+ry36wrkoV51/tl5vOWqkcPGvY=
786786
golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
787+
golang.org/x/net v0.0.0-20220225172249-27dd8689420f h1:oA4XRj0qtSt8Yo1Zms0CUlsT3KG69V2UGQWPBxujDmc=
788+
golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
787789
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
788790
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
789791
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -891,8 +893,9 @@ golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBc
891893
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9 h1:XfKQ4OlFl8okEOr5UvAqFRVj8pY/4yfcXrddB8qAbU0=
892894
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
893895
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
894-
golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b h1:9zKuko04nR4gjZ4+DNjHqRlAJqbJETHwiNKDqTfOjfE=
895896
golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
897+
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY=
898+
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
896899
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
897900
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
898901
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -1200,8 +1203,8 @@ rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
12001203
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
12011204
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.27 h1:KQOkVzXrLNb0EP6W0FD6u3CCPAwgXFYwZitbj7K0P0Y=
12021205
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.27/go.mod h1:tq2nT0Kx7W+/f2JVE+zxYtUhdjuELJkVpNz+x/QN5R4=
1203-
sigs.k8s.io/cloud-provider-azure v0.7.4-0.20220318124122-66e1bec130df h1:tlQ8bwVVhGQHPbvAj/hXRhUB+BlT6/Q44tDT5Ntw534=
1204-
sigs.k8s.io/cloud-provider-azure v0.7.4-0.20220318124122-66e1bec130df/go.mod h1:2MiXRRZcPROswhq3nNBtXfe/QsqvBRE3aZPjuUcSLlU=
1206+
sigs.k8s.io/cloud-provider-azure v0.7.4-0.20220406062855-4f3bab6bc8b2 h1:d5k/54npFCwuvcAMAqS6ROjQwwNTfCWbHjT2ivQ2vGA=
1207+
sigs.k8s.io/cloud-provider-azure v0.7.4-0.20220406062855-4f3bab6bc8b2/go.mod h1:QP8vTdPEAKK2W+sIgCDQIr15Ivc+tYMRMrJS+Clv85I=
12051208
sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6 h1:fD1pz4yfdADVNfFmcP2aBEtudwUQ1AlLnRBALr33v3s=
12061209
sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6/go.mod h1:p4QtZmO4uMYipTQNzagwnNoseA6OxSUutVw05NhYDRs=
12071210
sigs.k8s.io/kustomize/api v0.10.1/go.mod h1:2FigT1QN6xKdcnGS2Ppp1uIWrtWN28Ms8A3OZUZhwr8=

pkg/blob/blob.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ const (
5858
storageAccountField = "storageaccount"
5959
storageAccountTypeField = "storageaccounttype"
6060
skuNameField = "skuname"
61+
subscriptionIDField = "subscriptionid"
6162
resourceGroupField = "resourcegroup"
6263
locationField = "location"
6364
secretNameField = "secretname"
@@ -311,6 +312,7 @@ func (d *Driver) GetAuthEnv(ctx context.Context, volumeID, protocol string, attr
311312
}
312313

313314
var (
315+
subsID string
314316
accountKey string
315317
accountSasToken string
316318
secretName string
@@ -326,6 +328,8 @@ func (d *Driver) GetAuthEnv(ctx context.Context, volumeID, protocol string, attr
326328

327329
for k, v := range attrib {
328330
switch strings.ToLower(k) {
331+
case subscriptionIDField:
332+
subsID = v
329333
case containerNameField:
330334
containerName = v
331335
case keyVaultURLField:
@@ -413,7 +417,7 @@ func (d *Driver) GetAuthEnv(ctx context.Context, volumeID, protocol string, attr
413417
if err != nil && !getAccountKeyFromSecret {
414418
klog.V(2).Infof("get account(%s) key from secret(%s, %s) failed with error: %v, use cluster identity to get account key instead",
415419
accountName, secretNamespace, secretName, err)
416-
accountKey, err = d.cloud.GetStorageAccesskey(ctx, accountName, rgName)
420+
accountKey, err = d.cloud.GetStorageAccesskey(ctx, subsID, accountName, rgName)
417421
if err != nil {
418422
return rgName, accountName, accountKey, containerName, authEnv, fmt.Errorf("no key for storage account(%s) under resource group(%s), err %w", accountName, rgName, err)
419423
}
@@ -462,6 +466,7 @@ func (d *Driver) GetAuthEnv(ctx context.Context, volumeID, protocol string, attr
462466
// only for e2e testing
463467
func (d *Driver) GetStorageAccountAndContainer(ctx context.Context, volumeID string, attrib, secrets map[string]string) (string, string, string, string, error) {
464468
var (
469+
subsID string
465470
accountName string
466471
accountKey string
467472
accountSasToken string
@@ -474,6 +479,8 @@ func (d *Driver) GetStorageAccountAndContainer(ctx context.Context, volumeID str
474479

475480
for k, v := range attrib {
476481
switch strings.ToLower(k) {
482+
case subscriptionIDField:
483+
subsID = v
477484
case containerNameField:
478485
containerName = v
479486
case keyVaultURLField:
@@ -514,7 +521,7 @@ func (d *Driver) GetStorageAccountAndContainer(ctx context.Context, volumeID str
514521
rgName = d.cloud.ResourceGroup
515522
}
516523

517-
accountKey, err = d.cloud.GetStorageAccesskey(ctx, accountName, rgName)
524+
accountKey, err = d.cloud.GetStorageAccesskey(ctx, subsID, accountName, rgName)
518525
if err != nil {
519526
return "", "", "", "", fmt.Errorf("no key for storage account(%s) under resource group(%s), err %w", accountName, rgName, err)
520527
}
@@ -635,7 +642,7 @@ func (d *Driver) GetStorageAccesskey(ctx context.Context, accountOptions *azure.
635642
_, accountKey, err := d.GetStorageAccountFromSecret(secretName, secretNamespace)
636643
if err != nil {
637644
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)
638-
accountKey, err = d.cloud.GetStorageAccesskey(ctx, accountOptions.Name, accountOptions.ResourceGroup)
645+
accountKey, err = d.cloud.GetStorageAccesskey(ctx, accountOptions.SubscriptionID, accountOptions.Name, accountOptions.ResourceGroup)
639646
}
640647
return accountOptions.Name, accountKey, err
641648
}

pkg/blob/blob_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -460,7 +460,7 @@ func TestGetAuthEnv(t *testing.T) {
460460
rerr := &retry.Error{
461461
RawError: fmt.Errorf("test"),
462462
}
463-
mockStorageAccountsClient.EXPECT().ListKeys(gomock.Any(), gomock.Any(), gomock.Any()).Return(accountListKeysResult, rerr).AnyTimes()
463+
mockStorageAccountsClient.EXPECT().ListKeys(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(accountListKeysResult, rerr).AnyTimes()
464464
_, _, _, _, _, err := d.GetAuthEnv(context.TODO(), volumeID, "", attrib, secret)
465465
expectedErr := fmt.Errorf("no key for storage account(storageaccountname) under resource group(rg), err Retriable: false, RetryAfter: 0s, HTTPStatusCode: 0, RawError: test")
466466
if !strings.EqualFold(err.Error(), expectedErr.Error()) {
@@ -489,7 +489,7 @@ func TestGetAuthEnv(t *testing.T) {
489489
list := storage.AccountListKeysResult{
490490
Keys: &accountkeylist,
491491
}
492-
mockStorageAccountsClient.EXPECT().ListKeys(gomock.Any(), gomock.Any(), gomock.Any()).Return(list, nil).AnyTimes()
492+
mockStorageAccountsClient.EXPECT().ListKeys(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(list, nil).AnyTimes()
493493
_, _, _, _, _, err := d.GetAuthEnv(context.TODO(), volumeID, "", attrib, secret)
494494
expectedErr := error(nil)
495495
if !reflect.DeepEqual(err, expectedErr) {
@@ -573,7 +573,7 @@ func TestGetStorageAccountAndContainer(t *testing.T) {
573573
rerr := &retry.Error{
574574
RawError: fmt.Errorf("test"),
575575
}
576-
mockStorageAccountsClient.EXPECT().ListKeys(gomock.Any(), gomock.Any(), gomock.Any()).Return(accountListKeysResult, rerr).AnyTimes()
576+
mockStorageAccountsClient.EXPECT().ListKeys(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(accountListKeysResult, rerr).AnyTimes()
577577
_, _, _, _, err := d.GetStorageAccountAndContainer(context.TODO(), volumeID, attrib, secret)
578578
expectedErr := fmt.Errorf("no key for storage account(f5713de20cde511e8ba4900) under resource group(rg), err Retriable: false, RetryAfter: 0s, HTTPStatusCode: 0, RawError: test")
579579
if !strings.EqualFold(err.Error(), expectedErr.Error()) {
@@ -602,7 +602,7 @@ func TestGetStorageAccountAndContainer(t *testing.T) {
602602
list := storage.AccountListKeysResult{
603603
Keys: &accountkeylist,
604604
}
605-
mockStorageAccountsClient.EXPECT().ListKeys(gomock.Any(), gomock.Any(), gomock.Any()).Return(list, nil).AnyTimes()
605+
mockStorageAccountsClient.EXPECT().ListKeys(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(list, nil).AnyTimes()
606606
_, _, _, _, err := d.GetStorageAccountAndContainer(context.TODO(), volumeID, attrib, secret)
607607
expectedErr := error(nil)
608608
if !reflect.DeepEqual(err, expectedErr) {

pkg/blob/controllerserver.go

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ func (d *Driver) CreateVolume(ctx context.Context, req *csi.CreateVolumeRequest)
6767
if parameters == nil {
6868
parameters = make(map[string]string)
6969
}
70-
var storageAccountType, resourceGroup, location, account, containerName, protocol, customTags, secretName, secretNamespace, pvcNamespace string
70+
var storageAccountType, subsID, resourceGroup, location, account, containerName, protocol, customTags, secretName, secretNamespace, pvcNamespace string
7171
var isHnsEnabled *bool
7272
var vnetResourceGroup, vnetName, subnetName string
7373
// set allowBlobPublicAccess as false by default
@@ -88,6 +88,8 @@ func (d *Driver) CreateVolume(ctx context.Context, req *csi.CreateVolumeRequest)
8888
location = v
8989
case storageAccountField:
9090
account = v
91+
case subscriptionIDField:
92+
subsID = v
9193
case resourceGroupField:
9294
resourceGroup = v
9395
case containerNameField:
@@ -140,6 +142,15 @@ func (d *Driver) CreateVolume(ctx context.Context, req *csi.CreateVolumeRequest)
140142
}
141143
}
142144

145+
if subsID != "" && subsID != d.cloud.SubscriptionID {
146+
if protocol == nfs {
147+
return nil, status.Errorf(codes.InvalidArgument, fmt.Sprintf("NFS protocol is not supported in cross subscription(%s)", subsID))
148+
}
149+
if !storeAccountKey {
150+
return nil, status.Errorf(codes.InvalidArgument, fmt.Sprintf("storeAccountKey must set as true in cross subscription(%s)", subsID))
151+
}
152+
}
153+
143154
if resourceGroup == "" {
144155
resourceGroup = d.cloud.ResourceGroup
145156
}
@@ -199,6 +210,7 @@ func (d *Driver) CreateVolume(ctx context.Context, req *csi.CreateVolumeRequest)
199210
Name: account,
200211
Type: storageAccountType,
201212
Kind: accountKind,
213+
SubscriptionID: subsID,
202214
ResourceGroup: resourceGroup,
203215
Location: location,
204216
EnableHTTPSTrafficOnly: enableHTTPSTrafficOnly,
@@ -406,7 +418,7 @@ func (d *Driver) ValidateVolumeCapabilities(ctx context.Context, req *csi.Valida
406418

407419
var accountKey string
408420
if len(req.GetSecrets()) == 0 { // check whether account is provided by secret
409-
accountKey, err = d.cloud.GetStorageAccesskey(ctx, accountName, resourceGroupName)
421+
accountKey, err = d.cloud.GetStorageAccesskey(ctx, "", accountName, resourceGroupName)
410422
if err != nil {
411423
return nil, fmt.Errorf("no key for storage account(%s) under resource group(%s), err %w", accountName, resourceGroupName, err)
412424
}

0 commit comments

Comments
 (0)