diff --git a/sdk/storage/azure-storage-blob/assets.json b/sdk/storage/azure-storage-blob/assets.json index f94cd70f1a2d..000375f36025 100644 --- a/sdk/storage/azure-storage-blob/assets.json +++ b/sdk/storage/azure-storage-blob/assets.json @@ -2,5 +2,5 @@ "AssetsRepo": "Azure/azure-sdk-assets", "AssetsRepoPrefixPath": "python", "TagPrefix": "python/storage/azure-storage-blob", - "Tag": "python/storage/azure-storage-blob_16c5acad24" + "Tag": "python/storage/azure-storage-blob_365db1596b" } diff --git a/sdk/storage/azure-storage-blob/tests/conftest.py b/sdk/storage/azure-storage-blob/tests/conftest.py index 5925851aebb9..fcd64db13d4c 100644 --- a/sdk/storage/azure-storage-blob/tests/conftest.py +++ b/sdk/storage/azure-storage-blob/tests/conftest.py @@ -31,3 +31,7 @@ def add_sanitizers(test_proxy): add_general_regex_sanitizer(regex=r'"EncryptionLibrary": "Python .*?"', value='"EncryptionLibrary": "Python x.x.x"') add_uri_regex_sanitizer(regex=r"\.preprod\.", value=".") + add_uri_regex_sanitizer( + regex=r"([?&]sktid=)[^&#]+", + value=r"\g<1>00000000-0000-0000-0000-000000000000", + ) diff --git a/sdk/storage/azure-storage-blob/tests/test_block_blob.py b/sdk/storage/azure-storage-blob/tests/test_block_blob.py index f6c3e0205cc3..be679816e824 100644 --- a/sdk/storage/azure-storage-blob/tests/test_block_blob.py +++ b/sdk/storage/azure-storage-blob/tests/test_block_blob.py @@ -1984,4 +1984,82 @@ def test_upload_blob_copy_source_error_and_status_code(self, **kwargs): finally: self.bsc.delete_container(self.container_name) + @BlobPreparer() + @recorded_by_proxy + def test_stage_block_from_url_uds(self, **kwargs): + storage_account_name = kwargs.pop("storage_account_name") + variables = kwargs.pop("variables", {}) + + token_credential = self.get_credential(BlobServiceClient) + service = BlobServiceClient(self.account_url(storage_account_name, "blob"), credential=token_credential) + container_name, blob_name = self.get_resource_name('oauthcontainer'), self.get_resource_name('oauthblob') + container = service.create_container(container_name) + blob = container.get_blob_client(blob_name) + + start = self.get_datetime_variable(variables, 'start', datetime.utcnow()) + expiry = self.get_datetime_variable(variables, 'expiry', datetime.utcnow() + timedelta(hours=1)) + user_delegation_key = service.get_user_delegation_key(key_start_time=start, key_expiry_time=expiry) + dst_sas = self.generate_sas( + generate_blob_sas, + blob.account_name, + blob.container_name, + blob.blob_name, + user_delegation_key=user_delegation_key, + permission=BlobSasPermissions(create=True), + expiry=expiry, + ) + dst_blob = BlobClient.from_blob_url(f"{blob.url}?{dst_sas}") + + src_blob_name = self.get_resource_name('oauthblob2') + src_sas = self.generate_sas( + generate_blob_sas, + blob.account_name, + blob.container_name, + src_blob_name, + user_delegation_key=user_delegation_key, + permission=BlobSasPermissions(read=True, add=True, create=True, write=True, delete=True), + expiry=expiry, + ) + data = b"abc123" + src_blob = BlobClient.from_blob_url(f"{container.url}/{src_blob_name}?{src_sas}") + src_blob.upload_blob(data) + + dst_blob.stage_block_from_url('1', src_blob.url) + + return variables + + @BlobPreparer() + @recorded_by_proxy + def test_commit_block_list_uds(self, **kwargs): + storage_account_name = kwargs.pop("storage_account_name") + variables = kwargs.pop("variables", {}) + + token_credential = self.get_credential(BlobServiceClient) + service = BlobServiceClient(self.account_url(storage_account_name, "blob"), credential=token_credential) + container_name, blob_name = self.get_resource_name('oauthcontainer'), self.get_resource_name('oauthblob') + container = service.create_container(container_name) + blob = container.get_blob_client(blob_name) + + start = self.get_datetime_variable(variables, 'start', datetime.utcnow()) + expiry = self.get_datetime_variable(variables, 'expiry', datetime.utcnow() + timedelta(hours=1)) + user_delegation_key = service.get_user_delegation_key(key_start_time=start, key_expiry_time=expiry) + sas = self.generate_sas( + generate_blob_sas, + blob.account_name, + blob.container_name, + blob.blob_name, + user_delegation_key=user_delegation_key, + permission=BlobSasPermissions(create=True), + expiry=expiry, + ) + + identity_blob = BlobClient.from_blob_url(f"{blob.url}?{sas}") + identity_blob.stage_block('1', b'AAA') + identity_blob.stage_block('2', b'BBB') + identity_blob.stage_block('3', b'CCC') + block_list = [BlobBlock(block_id='3'), BlobBlock(block_id='2'), BlobBlock(block_id='1')] + identity_blob.commit_block_list(block_list=block_list) + + return variables + #------------------------------------------------------------------------------ diff --git a/sdk/storage/azure-storage-blob/tests/test_block_blob_async.py b/sdk/storage/azure-storage-blob/tests/test_block_blob_async.py index 46f3db2e50b3..360a9f90ba6c 100644 --- a/sdk/storage/azure-storage-blob/tests/test_block_blob_async.py +++ b/sdk/storage/azure-storage-blob/tests/test_block_blob_async.py @@ -2102,4 +2102,88 @@ async def test_upload_blob_copy_source_error_and_status_code(self, **kwargs): finally: await self.bsc.delete_container(self.container_name) + @BlobPreparer() + @recorded_by_proxy_async + async def test_stage_block_from_url_uds(self, **kwargs): + storage_account_name = kwargs.pop("storage_account_name") + variables = kwargs.pop("variables", {}) + + token_credential = self.get_credential(BlobServiceClient, is_async=True) + service = BlobServiceClient( + self.account_url(storage_account_name, "blob"), + credential=token_credential + ) + container_name, blob_name = self.get_resource_name('oauthcontainer'), self.get_resource_name('oauthblob') + container = await service.create_container(container_name) + blob = container.get_blob_client(blob_name) + + start = self.get_datetime_variable(variables, 'start', datetime.utcnow()) + expiry = self.get_datetime_variable(variables, 'expiry', datetime.utcnow() + timedelta(hours=1)) + user_delegation_key = await service.get_user_delegation_key(key_start_time=start, key_expiry_time=expiry) + dst_sas = self.generate_sas( + generate_blob_sas, + blob.account_name, + blob.container_name, + blob.blob_name, + user_delegation_key=user_delegation_key, + permission=BlobSasPermissions(create=True), + expiry=expiry, + ) + dst_blob = BlobClient.from_blob_url(f"{blob.url}?{dst_sas}") + + src_blob_name = self.get_resource_name('oauthblob2') + src_sas = self.generate_sas( + generate_blob_sas, + blob.account_name, + blob.container_name, + src_blob_name, + user_delegation_key=user_delegation_key, + permission=BlobSasPermissions(read=True, add=True, create=True, write=True, delete=True), + expiry=expiry, + ) + data = b"abc123" + src_blob = BlobClient.from_blob_url(f"{container.url}/{src_blob_name}?{src_sas}") + await src_blob.upload_blob(data) + + await dst_blob.stage_block_from_url('1', src_blob.url) + + return variables + + @BlobPreparer() + @recorded_by_proxy_async + async def test_commit_block_list_uds(self, **kwargs): + storage_account_name = kwargs.pop("storage_account_name") + variables = kwargs.pop("variables", {}) + + token_credential = self.get_credential(BlobServiceClient, is_async=True) + service = BlobServiceClient( + self.account_url(storage_account_name, "blob"), + credential=token_credential + ) + container_name, blob_name = self.get_resource_name('oauthcontainer'), self.get_resource_name('oauthblob') + container = await service.create_container(container_name) + blob = container.get_blob_client(blob_name) + + start = self.get_datetime_variable(variables, 'start', datetime.utcnow()) + expiry = self.get_datetime_variable(variables, 'expiry', datetime.utcnow() + timedelta(hours=1)) + user_delegation_key = await service.get_user_delegation_key(key_start_time=start, key_expiry_time=expiry) + sas = self.generate_sas( + generate_blob_sas, + blob.account_name, + blob.container_name, + blob.blob_name, + user_delegation_key=user_delegation_key, + permission=BlobSasPermissions(create=True), + expiry=expiry, + ) + + identity_blob = BlobClient.from_blob_url(f"{blob.url}?{sas}") + await blob.stage_block('1', b'AAA') + await blob.stage_block('2', b'BBB') + await blob.stage_block('3', b'CCC') + block_list = [BlobBlock(block_id='3'), BlobBlock(block_id='2'), BlobBlock(block_id='1')] + await identity_blob.commit_block_list(block_list=block_list) + + return variables + # ------------------------------------------------------------------------------ diff --git a/sdk/storage/azure-storage-file-share/tests/conftest.py b/sdk/storage/azure-storage-file-share/tests/conftest.py index 66cd7dd21ae2..6df952e979c1 100644 --- a/sdk/storage/azure-storage-file-share/tests/conftest.py +++ b/sdk/storage/azure-storage-file-share/tests/conftest.py @@ -33,3 +33,7 @@ def add_sanitizers(test_proxy): add_body_regex_sanitizer(regex=r".*?", value="0.0.0.0:0") add_uri_string_sanitizer(target=".preprod.", value=".") + add_uri_regex_sanitizer( + regex=r"([?&]sktid=)[^&#]+", + value=r"\g<1>00000000-0000-0000-0000-000000000000", + ) diff --git a/sdk/storage/azure-storage-queue/tests/conftest.py b/sdk/storage/azure-storage-queue/tests/conftest.py index ca09905c2ca6..341f181de4cd 100644 --- a/sdk/storage/azure-storage-queue/tests/conftest.py +++ b/sdk/storage/azure-storage-queue/tests/conftest.py @@ -33,3 +33,7 @@ def add_sanitizers(test_proxy): add_general_regex_sanitizer(regex=r'"EncryptionLibrary": "Python .*?"', value='"EncryptionLibrary": "Python x.x.x"') add_uri_string_sanitizer(target=".preprod.", value=".") + add_uri_regex_sanitizer( + regex=r"([?&]sktid=)[^&#]+", + value=r"\g<1>00000000-0000-0000-0000-000000000000", + )