Skip to content

Commit c638194

Browse files
[Storage][Batch] Fix Blob batch with TokenCredential from BlobContainerClient (Azure#48459)
1 parent 6fcabfc commit c638194

File tree

5 files changed

+82
-1
lines changed

5 files changed

+82
-1
lines changed

sdk/storage/Azure.Storage.Blobs.Batch/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
### Breaking Changes
88

99
### Bugs Fixed
10+
- Fixed an issue where batch subrequests would not authenticate properly if using `TokenCredential` authentication when the `BlobBatchClient` was created from `BlobContianerClient.GetBlobBatchClient`.
1011

1112
### Other Changes
1213

sdk/storage/Azure.Storage.Blobs.Batch/assets.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@
22
"AssetsRepo": "Azure/azure-sdk-assets",
33
"AssetsRepoPrefixPath": "net",
44
"TagPrefix": "net/storage/Azure.Storage.Blobs.Batch",
5-
"Tag": "net/storage/Azure.Storage.Blobs.Batch_91b5e838a2"
5+
"Tag": "net/storage/Azure.Storage.Blobs.Batch_9b2222572d"
66
}

sdk/storage/Azure.Storage.Blobs.Batch/tests/BlobBatchClientTests.cs

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -388,6 +388,21 @@ public async Task Delete_Basic_Convenience()
388388
await scenario.AssertDeleted(blobs);
389389
}
390390

391+
[RecordedTest]
392+
public async Task Delete_Basic_Convenience_OAuth()
393+
{
394+
BlobServiceClient service = BlobsClientBuilder.GetServiceClient_OAuth(TestEnvironment.Credential);
395+
await using TestScenario scenario = Scenario(service);
396+
BlobClient[] blobs = await scenario.CreateBlobsAsync(3);
397+
Uri[] uris = blobs.Select(b => b.Uri).ToArray();
398+
399+
BlobBatchClient client = scenario.GetBlobBatchClient();
400+
Response[] responses = await client.DeleteBlobsAsync(uris);
401+
402+
scenario.AssertStatus(202, responses);
403+
await scenario.AssertDeleted(blobs);
404+
}
405+
391406
[RecordedTest]
392407
[ServiceVersion(Min = BlobClientOptions.ServiceVersion.V2019_12_12)]
393408
public async Task Delete_Basic_Convenience_AccountSas()
@@ -419,6 +434,22 @@ public async Task Delete_ContainerScoped_Basic_Convenience()
419434
await scenario.AssertDeleted(blobs);
420435
}
421436

437+
[RecordedTest]
438+
[ServiceVersion(Min = BlobClientOptions.ServiceVersion.V2020_04_08)]
439+
public async Task Delete_ContainerScoped_Basic_Convenience_OAuth()
440+
{
441+
BlobServiceClient service = BlobsClientBuilder.GetServiceClient_OAuth(TestEnvironment.Credential);
442+
await using TestScenario scenario = Scenario(service);
443+
BlobClient[] blobs = await scenario.CreateBlobsAsync(3);
444+
Uri[] uris = blobs.Select(b => b.Uri).ToArray();
445+
446+
BlobBatchClient client = scenario.GetBlobBatchClient(scenario.Containers[0].Container.Name);
447+
Response[] responses = await client.DeleteBlobsAsync(uris);
448+
449+
scenario.AssertStatus(202, responses);
450+
await scenario.AssertDeleted(blobs);
451+
}
452+
422453
[RecordedTest]
423454
[ServiceVersion(Min = BlobClientOptions.ServiceVersion.V2020_04_08)]
424455
public async Task Delete_ContainerScoped_Basic_Convenience_ContainerSas()
@@ -796,6 +827,21 @@ public async Task SetBlobAccessTier_Basic_Convenience()
796827
await scenario.AssertTiers(AccessTier.Cool, blobs);
797828
}
798829

830+
[RecordedTest]
831+
public async Task SetBlobAccessTier_Basic_Convenience_OAuth()
832+
{
833+
BlobServiceClient service = BlobsClientBuilder.GetServiceClient_OAuth(TestEnvironment.Credential);
834+
await using TestScenario scenario = Scenario(service);
835+
BlobClient[] blobs = await scenario.CreateBlobsAsync(3);
836+
Uri[] uris = blobs.Select(b => b.Uri).ToArray();
837+
838+
BlobBatchClient client = scenario.GetBlobBatchClient();
839+
Response[] responses = await client.SetBlobsAccessTierAsync(uris, AccessTier.Cool);
840+
841+
scenario.AssertStatus(200, responses);
842+
await scenario.AssertTiers(AccessTier.Cool, blobs);
843+
}
844+
799845
[RecordedTest]
800846
[ServiceVersion(Min = BlobClientOptions.ServiceVersion.V2019_12_12)]
801847
public async Task SetBlobAccessTier_Basic_Convenience_AccountSas()
@@ -827,6 +873,22 @@ public async Task SetBlobAccessTier_ContainerScoped_Basic_Convenience()
827873
await scenario.AssertTiers(AccessTier.Cool, blobs);
828874
}
829875

876+
[RecordedTest]
877+
[ServiceVersion(Min = BlobClientOptions.ServiceVersion.V2020_04_08)]
878+
public async Task SetBlobAccessTier_ContainerScoped_Basic_Convenience_OAuth()
879+
{
880+
BlobServiceClient service = BlobsClientBuilder.GetServiceClient_OAuth(TestEnvironment.Credential);
881+
await using TestScenario scenario = Scenario(service);
882+
BlobClient[] blobs = await scenario.CreateBlobsAsync(3);
883+
Uri[] uris = blobs.Select(b => b.Uri).ToArray();
884+
885+
BlobBatchClient client = scenario.GetBlobBatchClient(scenario.Containers[0].Container.Name);
886+
Response[] responses = await client.SetBlobsAccessTierAsync(uris, AccessTier.Cool);
887+
888+
scenario.AssertStatus(200, responses);
889+
await scenario.AssertTiers(AccessTier.Cool, blobs);
890+
}
891+
830892
[RecordedTest]
831893
[ServiceVersion(Min = BlobClientOptions.ServiceVersion.V2020_04_08)]
832894
public async Task SetBlobAccessTier_ContainerScoped_Basic_Convenience_ContainerSas()

sdk/storage/Azure.Storage.Blobs/src/BlobContainerClient.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -415,6 +415,22 @@ internal BlobContainerClient(
415415
BlobErrors.VerifyCpkAndEncryptionScopeNotBothSet(_clientConfiguration.CustomerProvidedKey, _clientConfiguration.EncryptionScope);
416416
}
417417

418+
internal BlobContainerClient(
419+
Uri containerUri,
420+
BlobClientConfiguration clientConfiguration,
421+
HttpPipelinePolicy authentication,
422+
ClientSideEncryptionOptions clientSideEncryption)
423+
{
424+
_uri = containerUri;
425+
_clientConfiguration = clientConfiguration;
426+
_authenticationPolicy = authentication;
427+
_clientSideEncryption = clientSideEncryption?.Clone();
428+
_containerRestClient = BuildContainerRestClient(containerUri);
429+
430+
BlobErrors.VerifyHttpsCustomerProvidedKey(_uri, _clientConfiguration.CustomerProvidedKey);
431+
BlobErrors.VerifyCpkAndEncryptionScopeNotBothSet(_clientConfiguration.CustomerProvidedKey, _clientConfiguration.EncryptionScope);
432+
}
433+
418434
/// <summary>
419435
/// Initializes a new instance of the <see cref="BlobContainerClient"/>
420436
/// class with Blob Container URI, <see cref="BlobClientOptions"/>, and <see cref="HttpPipeline"/>.
@@ -3374,6 +3390,7 @@ internal async Task<Response<BlobContainerClient>> RenameInternal(
33743390
BlobContainerClient destContainerClient = new BlobContainerClient(
33753391
uriBuilder.ToUri(),
33763392
ClientConfiguration,
3393+
AuthenticationPolicy,
33773394
ClientSideEncryption);
33783395

33793396
ResponseWithHeaders<ContainerRenameHeaders> response;

sdk/storage/Azure.Storage.Blobs/src/BlobServiceClient.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -574,6 +574,7 @@ public virtual BlobContainerClient GetBlobContainerClient(string blobContainerNa
574574
new BlobContainerClient(
575575
Uri.AppendToPath(blobContainerName),
576576
ClientConfiguration,
577+
AuthenticationPolicy,
577578
ClientSideEncryption);
578579

579580
#region protected static accessors for Azure.Storage.Blobs.Batch

0 commit comments

Comments
 (0)