@@ -436,12 +436,22 @@ func (d *Driver) CreateVolume(ctx context.Context, req *csi.CreateVolumeRequest)
436
436
return nil , status .Errorf (codes .Internal , "failed to create container(%s) on account(%s) type(%s) rg(%s) location(%s) size(%d), error: %v" , validContainerName , accountName , storageAccountType , resourceGroup , location , requestGiB , err )
437
437
}
438
438
if volContentSource != nil {
439
- accountSASToken , authAzcopyEnv , err := d .getAzcopyAuth (ctx , accountName , accountKey , storageEndpointSuffix , accountOptions , secrets , secretName , secretNamespace )
439
+ accountSASToken , authAzcopyEnv , err := d .getAzcopyAuth (ctx , accountName , accountKey , storageEndpointSuffix , accountOptions , secrets , secretName , secretNamespace , false )
440
440
if err != nil {
441
441
return nil , status .Errorf (codes .Internal , "failed to getAzcopyAuth on account(%s) rg(%s), error: %v" , accountOptions .Name , accountOptions .ResourceGroup , err )
442
442
}
443
- if err := d .copyVolume (ctx , req , accountName , accountSASToken , authAzcopyEnv , validContainerName , secretNamespace , accountOptions , storageEndpointSuffix ); err != nil {
444
- return nil , err
443
+ var copyErr error
444
+ copyErr = d .copyVolume (ctx , req , accountName , accountSASToken , authAzcopyEnv , validContainerName , secretNamespace , accountOptions , storageEndpointSuffix )
445
+ if accountSASToken == "" && copyErr != nil && strings .Contains (copyErr .Error (), authorizationPermissionMismatch ) {
446
+ klog .Warningf ("azcopy copy failed with AuthorizationPermissionMismatch error, should assign \" Storage Blob Data Contributor\" role to controller identity, fall back to use sas token, original error: %v" , copyErr )
447
+ accountSASToken , authAzcopyEnv , err := d .getAzcopyAuth (ctx , accountName , accountKey , storageEndpointSuffix , accountOptions , secrets , secretName , secretNamespace , true )
448
+ if err != nil {
449
+ return nil , status .Errorf (codes .Internal , "failed to getAzcopyAuth on account(%s) rg(%s), error: %v" , accountOptions .Name , accountOptions .ResourceGroup , err )
450
+ }
451
+ copyErr = d .copyVolume (ctx , req , accountName , accountSASToken , authAzcopyEnv , validContainerName , secretNamespace , accountOptions , storageEndpointSuffix )
452
+ }
453
+ if copyErr != nil {
454
+ return nil , copyErr
445
455
}
446
456
}
447
457
@@ -775,7 +785,7 @@ func (d *Driver) copyBlobContainer(ctx context.Context, req *csi.CreateVolumeReq
775
785
SubscriptionID : srcSubscriptionID ,
776
786
GetLatestAccountKey : accountOptions .GetLatestAccountKey ,
777
787
}
778
- if srcAccountSasToken , _ , err = d .getAzcopyAuth (ctx , srcAccountName , "" , storageEndpointSuffix , srcAccountOptions , nil , "" , secretNamespace ); err != nil {
788
+ if srcAccountSasToken , _ , err = d .getAzcopyAuth (ctx , srcAccountName , "" , storageEndpointSuffix , srcAccountOptions , nil , "" , secretNamespace , true ); err != nil {
779
789
return err
780
790
}
781
791
}
@@ -868,11 +878,10 @@ func (d *Driver) authorizeAzcopyWithIdentity() ([]string, error) {
868
878
// getAzcopyAuth will only generate sas token for azcopy in following conditions:
869
879
// 1. secrets is not empty
870
880
// 2. driver is not using managed identity and service principal
871
- // 3. azcopy returns AuthorizationPermissionMismatch error when using service principal or managed identity
872
- func (d * Driver ) getAzcopyAuth (ctx context.Context , accountName , accountKey , storageEndpointSuffix string , accountOptions * azure.AccountOptions , secrets map [string ]string , secretName , secretNamespace string ) (string , []string , error ) {
881
+ // 3. parameter useSasToken is true
882
+ func (d * Driver ) getAzcopyAuth (ctx context.Context , accountName , accountKey , storageEndpointSuffix string , accountOptions * azure.AccountOptions , secrets map [string ]string , secretName , secretNamespace string , useSasToken bool ) (string , []string , error ) {
873
883
var authAzcopyEnv []string
874
884
var err error
875
- useSasToken := false
876
885
if ! d .useDataPlaneAPI ("" , accountName ) && len (secrets ) == 0 && len (secretName ) == 0 {
877
886
// search in cache first
878
887
if cache , err := d .azcopySasTokenCache .Get (accountName , azcache .CacheReadTypeDefault ); err == nil && cache != nil {
@@ -883,17 +892,6 @@ func (d *Driver) getAzcopyAuth(ctx context.Context, accountName, accountKey, sto
883
892
authAzcopyEnv , err = d .authorizeAzcopyWithIdentity ()
884
893
if err != nil {
885
894
klog .Warningf ("failed to authorize azcopy with identity, error: %v" , err )
886
- } else {
887
- if len (authAzcopyEnv ) > 0 {
888
- out , testErr := d .azcopy .TestListJobs (accountName , storageEndpointSuffix , authAzcopyEnv )
889
- if testErr != nil {
890
- return "" , nil , fmt .Errorf ("azcopy list command failed with error(%v): %v" , testErr , out )
891
- }
892
- if strings .Contains (out , authorizationPermissionMismatch ) {
893
- klog .Warningf ("azcopy list failed with AuthorizationPermissionMismatch error, should assign \" Storage Blob Data Contributor\" role to controller identity, fall back to use sas token, original output: %v" , out )
894
- useSasToken = true
895
- }
896
- }
897
895
}
898
896
}
899
897
0 commit comments