From 689e7fa9897a4797f1a2801b135be1d0f57c8bad Mon Sep 17 00:00:00 2001 From: williexu Date: Mon, 30 Apr 2018 11:50:42 -0700 Subject: [PATCH 01/19] added codeowner for storage extension --- .github/CODEOWNERS | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 4c2a488e6e1..e2c0b4f91e2 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -27,3 +27,4 @@ /src/botservice/ @swagatmishra2007 /src/storage-preview/ @williexu + From 02e898fa500ea608efee7f365fabc746213549bc Mon Sep 17 00:00:00 2001 From: williexu Date: Fri, 27 Apr 2018 13:44:37 -0700 Subject: [PATCH 02/19] vendored oauth sdk and added test --- .../azure_storage/__init__.py | 0 .../azure_storage/blob/__init__.py | 31 + .../azure_storage/blob/_constants.py | 14 + .../azure_storage/blob/_deserialization.py | 436 +++ .../azure_storage/blob/_download_chunking.py | 127 + .../azure_storage/blob/_encryption.py | 187 + .../azure_storage/blob/_error.py | 29 + .../azure_storage/blob/_serialization.py | 118 + .../azure_storage/blob/_upload_chunking.py | 485 +++ .../azure_storage/blob/appendblobservice.py | 556 +++ .../azure_storage/blob/baseblobservice.py | 3246 +++++++++++++++++ .../azure_storage/blob/blockblobservice.py | 1007 +++++ .../azure_storage/blob/models.py | 755 ++++ .../azure_storage/blob/pageblobservice.py | 1392 +++++++ .../blob/sharedaccesssignature.py | 179 + .../azure_storage/common/__init__.py | 37 + .../azure_storage/common/_auth.py | 125 + .../common/_common_conversion.py | 126 + .../azure_storage/common/_connection.py | 160 + .../azure_storage/common/_constants.py | 47 + .../azure_storage/common/_deserialization.py | 361 ++ .../azure_storage/common/_encryption.py | 233 ++ .../azure_storage/common/_error.py | 179 + .../azure_storage/common/_http/__init__.py | 74 + .../azure_storage/common/_http/httpclient.py | 107 + .../azure_storage/common/_serialization.py | 352 ++ .../common/cloudstorageaccount.py | 188 + .../azure_storage/common/models.py | 646 ++++ .../azure_storage/common/retry.py | 292 ++ .../common/sharedaccesssignature.py | 217 ++ .../azure_storage/common/storageclient.py | 364 ++ .../azure_storage/common/tokencredential.py | 33 + .../azure_storage/file/__init__.py | 20 + .../azure_storage/file/_constants.py | 11 + .../azure_storage/file/_deserialization.py | 241 ++ .../azure_storage/file/_download_chunking.py | 107 + .../azure_storage/file/_serialization.py | 66 + .../azure_storage/file/_upload_chunking.py | 133 + .../azure_storage/file/fileservice.py | 2468 +++++++++++++ .../azure_storage/file/models.py | 407 +++ .../file/sharedaccesssignature.py | 188 + .../azure_storage/queue/__init__.py | 13 + .../azure_storage/queue/_constants.py | 11 + .../azure_storage/queue/_deserialization.py | 150 + .../azure_storage/queue/_encryption.py | 159 + .../azure_storage/queue/_error.py | 27 + .../azure_storage/queue/_serialization.py | 73 + .../azure_storage/queue/models.py | 239 ++ .../azure_storage/queue/queueservice.py | 996 +++++ .../queue/sharedaccesssignature.py | 81 + .../azext_storage_preview/commands.py | 1 + .../operations/account.py | 6 + 52 files changed, 17500 insertions(+) create mode 100644 src/storage-preview/azext_storage_preview/azure_storage/__init__.py create mode 100644 src/storage-preview/azext_storage_preview/azure_storage/blob/__init__.py create mode 100644 src/storage-preview/azext_storage_preview/azure_storage/blob/_constants.py create mode 100644 src/storage-preview/azext_storage_preview/azure_storage/blob/_deserialization.py create mode 100644 src/storage-preview/azext_storage_preview/azure_storage/blob/_download_chunking.py create mode 100644 src/storage-preview/azext_storage_preview/azure_storage/blob/_encryption.py create mode 100644 src/storage-preview/azext_storage_preview/azure_storage/blob/_error.py create mode 100644 src/storage-preview/azext_storage_preview/azure_storage/blob/_serialization.py create mode 100644 src/storage-preview/azext_storage_preview/azure_storage/blob/_upload_chunking.py create mode 100644 src/storage-preview/azext_storage_preview/azure_storage/blob/appendblobservice.py create mode 100644 src/storage-preview/azext_storage_preview/azure_storage/blob/baseblobservice.py create mode 100644 src/storage-preview/azext_storage_preview/azure_storage/blob/blockblobservice.py create mode 100644 src/storage-preview/azext_storage_preview/azure_storage/blob/models.py create mode 100644 src/storage-preview/azext_storage_preview/azure_storage/blob/pageblobservice.py create mode 100644 src/storage-preview/azext_storage_preview/azure_storage/blob/sharedaccesssignature.py create mode 100644 src/storage-preview/azext_storage_preview/azure_storage/common/__init__.py create mode 100644 src/storage-preview/azext_storage_preview/azure_storage/common/_auth.py create mode 100644 src/storage-preview/azext_storage_preview/azure_storage/common/_common_conversion.py create mode 100644 src/storage-preview/azext_storage_preview/azure_storage/common/_connection.py create mode 100644 src/storage-preview/azext_storage_preview/azure_storage/common/_constants.py create mode 100644 src/storage-preview/azext_storage_preview/azure_storage/common/_deserialization.py create mode 100644 src/storage-preview/azext_storage_preview/azure_storage/common/_encryption.py create mode 100644 src/storage-preview/azext_storage_preview/azure_storage/common/_error.py create mode 100644 src/storage-preview/azext_storage_preview/azure_storage/common/_http/__init__.py create mode 100644 src/storage-preview/azext_storage_preview/azure_storage/common/_http/httpclient.py create mode 100644 src/storage-preview/azext_storage_preview/azure_storage/common/_serialization.py create mode 100644 src/storage-preview/azext_storage_preview/azure_storage/common/cloudstorageaccount.py create mode 100644 src/storage-preview/azext_storage_preview/azure_storage/common/models.py create mode 100644 src/storage-preview/azext_storage_preview/azure_storage/common/retry.py create mode 100644 src/storage-preview/azext_storage_preview/azure_storage/common/sharedaccesssignature.py create mode 100644 src/storage-preview/azext_storage_preview/azure_storage/common/storageclient.py create mode 100644 src/storage-preview/azext_storage_preview/azure_storage/common/tokencredential.py create mode 100644 src/storage-preview/azext_storage_preview/azure_storage/file/__init__.py create mode 100644 src/storage-preview/azext_storage_preview/azure_storage/file/_constants.py create mode 100644 src/storage-preview/azext_storage_preview/azure_storage/file/_deserialization.py create mode 100644 src/storage-preview/azext_storage_preview/azure_storage/file/_download_chunking.py create mode 100644 src/storage-preview/azext_storage_preview/azure_storage/file/_serialization.py create mode 100644 src/storage-preview/azext_storage_preview/azure_storage/file/_upload_chunking.py create mode 100644 src/storage-preview/azext_storage_preview/azure_storage/file/fileservice.py create mode 100644 src/storage-preview/azext_storage_preview/azure_storage/file/models.py create mode 100644 src/storage-preview/azext_storage_preview/azure_storage/file/sharedaccesssignature.py create mode 100644 src/storage-preview/azext_storage_preview/azure_storage/queue/__init__.py create mode 100644 src/storage-preview/azext_storage_preview/azure_storage/queue/_constants.py create mode 100644 src/storage-preview/azext_storage_preview/azure_storage/queue/_deserialization.py create mode 100644 src/storage-preview/azext_storage_preview/azure_storage/queue/_encryption.py create mode 100644 src/storage-preview/azext_storage_preview/azure_storage/queue/_error.py create mode 100644 src/storage-preview/azext_storage_preview/azure_storage/queue/_serialization.py create mode 100644 src/storage-preview/azext_storage_preview/azure_storage/queue/models.py create mode 100644 src/storage-preview/azext_storage_preview/azure_storage/queue/queueservice.py create mode 100644 src/storage-preview/azext_storage_preview/azure_storage/queue/sharedaccesssignature.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/__init__.py b/src/storage-preview/azext_storage_preview/azure_storage/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/src/storage-preview/azext_storage_preview/azure_storage/blob/__init__.py b/src/storage-preview/azext_storage_preview/azure_storage/blob/__init__.py new file mode 100644 index 00000000000..eb3e5d0fde3 --- /dev/null +++ b/src/storage-preview/azext_storage_preview/azure_storage/blob/__init__.py @@ -0,0 +1,31 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- +from .appendblobservice import AppendBlobService +from .blockblobservice import BlockBlobService +from .models import ( + Container, + ContainerProperties, + Blob, + BlobProperties, + BlobBlock, + BlobBlockList, + PageRange, + ContentSettings, + CopyProperties, + ContainerPermissions, + BlobPermissions, + _LeaseActions, + AppendBlockProperties, + PageBlobProperties, + ResourceProperties, + Include, + SequenceNumberAction, + BlockListType, + PublicAccess, + BlobPrefix, + DeleteSnapshot, +) +from .pageblobservice import PageBlobService diff --git a/src/storage-preview/azext_storage_preview/azure_storage/blob/_constants.py b/src/storage-preview/azext_storage_preview/azure_storage/blob/_constants.py new file mode 100644 index 00000000000..b1b09ba3269 --- /dev/null +++ b/src/storage-preview/azext_storage_preview/azure_storage/blob/_constants.py @@ -0,0 +1,14 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- + +__author__ = 'Microsoft Corp. ' +__version__ = '1.2.0rc0' + +# x-ms-version for storage service. +X_MS_VERSION = '2017-11-09' + +# internal configurations, should not be changed +_LARGE_BLOB_UPLOAD_MAX_READ_BUFFER_SIZE = 4 * 1024 * 1024 diff --git a/src/storage-preview/azext_storage_preview/azure_storage/blob/_deserialization.py b/src/storage-preview/azext_storage_preview/azure_storage/blob/_deserialization.py new file mode 100644 index 00000000000..93aae9590e1 --- /dev/null +++ b/src/storage-preview/azext_storage_preview/azure_storage/blob/_deserialization.py @@ -0,0 +1,436 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- +from azure.common import AzureException +from dateutil import parser + +try: + from xml.etree import cElementTree as ETree +except ImportError: + from xml.etree import ElementTree as ETree +from azure.storage.common._common_conversion import ( + _decode_base64_to_text, + _to_str, + _get_content_md5 +) +from azure.storage.common._deserialization import ( + _parse_properties, + _to_int, + _parse_metadata, + _convert_xml_to_signed_identifiers, + _bool, +) +from .models import ( + Container, + Blob, + BlobBlock, + BlobBlockList, + BlobBlockState, + BlobProperties, + PageRange, + ContainerProperties, + AppendBlockProperties, + PageBlobProperties, + ResourceProperties, + BlobPrefix, +) +from ._encryption import _decrypt_blob +from azure.storage.common.models import _list +from azure.storage.common._error import ( + _validate_content_match, + _ERROR_DECRYPTION_FAILURE, +) + + +def _parse_base_properties(response): + ''' + Extracts basic response headers. + ''' + resource_properties = ResourceProperties() + resource_properties.last_modified = parser.parse(response.headers.get('last-modified')) + resource_properties.etag = response.headers.get('etag') + + return resource_properties + + +def _parse_page_properties(response): + ''' + Extracts page response headers. + ''' + put_page = PageBlobProperties() + put_page.last_modified = parser.parse(response.headers.get('last-modified')) + put_page.etag = response.headers.get('etag') + put_page.sequence_number = _to_int(response.headers.get('x-ms-blob-sequence-number')) + + return put_page + + +def _parse_append_block(response): + ''' + Extracts append block response headers. + ''' + append_block = AppendBlockProperties() + append_block.last_modified = parser.parse(response.headers.get('last-modified')) + append_block.etag = response.headers.get('etag') + append_block.append_offset = _to_int(response.headers.get('x-ms-blob-append-offset')) + append_block.committed_block_count = _to_int(response.headers.get('x-ms-blob-committed-block-count')) + + return append_block + + +def _parse_snapshot_blob(response, name): + ''' + Extracts snapshot return header. + ''' + snapshot = response.headers.get('x-ms-snapshot') + + return _parse_blob(response, name, snapshot) + + +def _parse_lease(response): + ''' + Extracts lease time and ID return headers. + ''' + lease = {'time': response.headers.get('x-ms-lease-time')} + if lease['time']: + lease['time'] = _to_int(lease['time']) + + lease['id'] = response.headers.get('x-ms-lease-id') + + return lease + + +def _parse_blob(response, name, snapshot, validate_content=False, require_encryption=False, + key_encryption_key=None, key_resolver_function=None, start_offset=None, end_offset=None): + if response is None: + return None + + metadata = _parse_metadata(response) + props = _parse_properties(response, BlobProperties) + + # For range gets, only look at 'x-ms-blob-content-md5' for overall MD5 + content_settings = getattr(props, 'content_settings') + if 'content-range' in response.headers: + if 'x-ms-blob-content-md5' in response.headers: + setattr(content_settings, 'content_md5', _to_str(response.headers['x-ms-blob-content-md5'])) + else: + delattr(content_settings, 'content_md5') + + if validate_content: + computed_md5 = _get_content_md5(response.body) + _validate_content_match(response.headers['content-md5'], computed_md5) + + if key_encryption_key is not None or key_resolver_function is not None: + try: + response.body = _decrypt_blob(require_encryption, key_encryption_key, key_resolver_function, + response, start_offset, end_offset) + except: + raise AzureException(_ERROR_DECRYPTION_FAILURE) + + return Blob(name, snapshot, response.body, props, metadata) + + +def _parse_container(response, name): + if response is None: + return None + + metadata = _parse_metadata(response) + props = _parse_properties(response, ContainerProperties) + return Container(name, props, metadata) + + +def _convert_xml_to_signed_identifiers_and_access(response): + acl = _convert_xml_to_signed_identifiers(response) + acl.public_access = response.headers.get('x-ms-blob-public-access') + + return acl + + +def _convert_xml_to_containers(response): + ''' + + + string-value + string-value + int-value + + + container-name + + date/time-value + etag + locked | unlocked + available | leased | expired | breaking | broken + infinite | fixed + blob | container + + + value + + + + marker-value + + ''' + if response is None or response.body is None: + return None + + containers = _list() + list_element = ETree.fromstring(response.body) + + # Set next marker + setattr(containers, 'next_marker', list_element.findtext('NextMarker')) + + containers_element = list_element.find('Containers') + + for container_element in containers_element.findall('Container'): + # Name element + container = Container() + container.name = container_element.findtext('Name') + + # Metadata + metadata_root_element = container_element.find('Metadata') + if metadata_root_element is not None: + container.metadata = dict() + for metadata_element in metadata_root_element: + container.metadata[metadata_element.tag] = metadata_element.text + + # Properties + properties_element = container_element.find('Properties') + container.properties.etag = properties_element.findtext('Etag') + container.properties.last_modified = parser.parse(properties_element.findtext('Last-Modified')) + container.properties.lease_status = properties_element.findtext('LeaseStatus') + container.properties.lease_state = properties_element.findtext('LeaseState') + container.properties.lease_duration = properties_element.findtext('LeaseDuration') + container.properties.public_access = properties_element.findtext('PublicAccess') + + # Add container to list + containers.append(container) + + return containers + + +LIST_BLOBS_ATTRIBUTE_MAP = { + 'Last-Modified': (None, 'last_modified', parser.parse), + 'Etag': (None, 'etag', _to_str), + 'x-ms-blob-sequence-number': (None, 'sequence_number', _to_int), + 'BlobType': (None, 'blob_type', _to_str), + 'Content-Length': (None, 'content_length', _to_int), + 'ServerEncrypted': (None, 'server_encrypted', _bool), + 'Content-Type': ('content_settings', 'content_type', _to_str), + 'Content-Encoding': ('content_settings', 'content_encoding', _to_str), + 'Content-Disposition': ('content_settings', 'content_disposition', _to_str), + 'Content-Language': ('content_settings', 'content_language', _to_str), + 'Content-MD5': ('content_settings', 'content_md5', _to_str), + 'Cache-Control': ('content_settings', 'cache_control', _to_str), + 'LeaseStatus': ('lease', 'status', _to_str), + 'LeaseState': ('lease', 'state', _to_str), + 'LeaseDuration': ('lease', 'duration', _to_str), + 'CopyId': ('copy', 'id', _to_str), + 'CopySource': ('copy', 'source', _to_str), + 'CopyStatus': ('copy', 'status', _to_str), + 'CopyProgress': ('copy', 'progress', _to_str), + 'CopyCompletionTime': ('copy', 'completion_time', _to_str), + 'CopyStatusDescription': ('copy', 'status_description', _to_str), + 'AccessTier': (None, 'blob_tier', _to_str), + 'AccessTierChangeTime': (None, 'blob_tier_change_time', parser.parse), + 'AccessTierInferred': (None, 'blob_tier_inferred', _bool), + 'ArchiveStatus': (None, 'rehydration_status', _to_str), + 'DeletedTime': (None, 'deleted_time', parser.parse), + 'RemainingRetentionDays': (None, 'remaining_retention_days', _to_int), +} + + +def _convert_xml_to_blob_list(response): + ''' + + + string-value + string-value + int-value + string-value + + + blob-name + true + date-time-value + + date-time-value + etag + size-in-bytes + blob-content-type + + + + + sequence-number + BlockBlob|PageBlob|AppendBlob + locked|unlocked + available | leased | expired | breaking | broken + infinite | fixed + id + pending | success | aborted | failed + source url + bytes copied/bytes total + datetime + error string + P4 | P6 | P10 | P20 | P30 | P40 | P50 | P60 | Archive | Cool | Hot + date-time-value + true + datetime + int + + + value + + + + blob-prefix + + + + + ''' + if response is None or response.body is None: + return None + + blob_list = _list() + list_element = ETree.fromstring(response.body) + + setattr(blob_list, 'next_marker', list_element.findtext('NextMarker')) + + blobs_element = list_element.find('Blobs') + blob_prefix_elements = blobs_element.findall('BlobPrefix') + if blob_prefix_elements is not None: + for blob_prefix_element in blob_prefix_elements: + prefix = BlobPrefix() + prefix.name = blob_prefix_element.findtext('Name') + blob_list.append(prefix) + + for blob_element in blobs_element.findall('Blob'): + blob = Blob() + blob.name = blob_element.findtext('Name') + blob.snapshot = blob_element.findtext('Snapshot') + + deleted = blob_element.findtext('Deleted') + if deleted: + blob.deleted = _bool(deleted) + + # Properties + properties_element = blob_element.find('Properties') + if properties_element is not None: + for property_element in properties_element: + info = LIST_BLOBS_ATTRIBUTE_MAP.get(property_element.tag) + if info is None: + setattr(blob.properties, property_element.tag, _to_str(property_element.text)) + elif info[0] is None: + setattr(blob.properties, info[1], info[2](property_element.text)) + else: + attr = getattr(blob.properties, info[0]) + setattr(attr, info[1], info[2](property_element.text)) + + # Metadata + metadata_root_element = blob_element.find('Metadata') + if metadata_root_element is not None: + blob.metadata = dict() + for metadata_element in metadata_root_element: + blob.metadata[metadata_element.tag] = metadata_element.text + + # Add blob to list + blob_list.append(blob) + + return blob_list + + +def _convert_xml_to_block_list(response): + ''' + + + + + base64-encoded-block-id + size-in-bytes + + + + + base64-encoded-block-id + size-in-bytes + + + + + Converts xml response to block list class. + ''' + if response is None or response.body is None: + return None + + block_list = BlobBlockList() + + list_element = ETree.fromstring(response.body) + + committed_blocks_element = list_element.find('CommittedBlocks') + if committed_blocks_element is not None: + for block_element in committed_blocks_element.findall('Block'): + block_id = _decode_base64_to_text(block_element.findtext('Name', '')) + block_size = int(block_element.findtext('Size')) + block = BlobBlock(id=block_id, state=BlobBlockState.Committed) + block._set_size(block_size) + block_list.committed_blocks.append(block) + + uncommitted_blocks_element = list_element.find('UncommittedBlocks') + if uncommitted_blocks_element is not None: + for block_element in uncommitted_blocks_element.findall('Block'): + block_id = _decode_base64_to_text(block_element.findtext('Name', '')) + block_size = int(block_element.findtext('Size')) + block = BlobBlock(id=block_id, state=BlobBlockState.Uncommitted) + block._set_size(block_size) + block_list.uncommitted_blocks.append(block) + + return block_list + + +def _convert_xml_to_page_ranges(response): + ''' + + + + Start Byte + End Byte + + + Start Byte + End Byte + + + Start Byte + End Byte + + + ''' + if response is None or response.body is None: + return None + + page_list = list() + + list_element = ETree.fromstring(response.body) + + for page_range_element in list_element: + if page_range_element.tag == 'PageRange': + is_cleared = False + elif page_range_element.tag == 'ClearRange': + is_cleared = True + else: + pass # ignore any unrecognized Page Range types + + page_list.append( + PageRange( + int(page_range_element.findtext('Start')), + int(page_range_element.findtext('End')), + is_cleared + ) + ) + + return page_list diff --git a/src/storage-preview/azext_storage_preview/azure_storage/blob/_download_chunking.py b/src/storage-preview/azext_storage_preview/azure_storage/blob/_download_chunking.py new file mode 100644 index 00000000000..bd0c5a74374 --- /dev/null +++ b/src/storage-preview/azext_storage_preview/azure_storage/blob/_download_chunking.py @@ -0,0 +1,127 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- +import threading + +from azure.storage.common._error import _ERROR_NO_SINGLE_THREAD_CHUNKING + + +def _download_blob_chunks(blob_service, container_name, blob_name, snapshot, + download_size, block_size, progress, start_range, end_range, + stream, max_connections, progress_callback, validate_content, + lease_id, if_modified_since, if_unmodified_since, if_match, + if_none_match, timeout, operation_context): + if max_connections <= 1: + raise ValueError(_ERROR_NO_SINGLE_THREAD_CHUNKING.format('blob')) + + downloader = _BlobChunkDownloader( + blob_service, + container_name, + blob_name, + snapshot, + download_size, + block_size, + progress, + start_range, + end_range, + stream, + progress_callback, + validate_content, + lease_id, + if_modified_since, + if_unmodified_since, + if_match, + if_none_match, + timeout, + operation_context, + ) + + import concurrent.futures + executor = concurrent.futures.ThreadPoolExecutor(max_connections) + result = list(executor.map(downloader.process_chunk, downloader.get_chunk_offsets())) + + +class _BlobChunkDownloader(object): + def __init__(self, blob_service, container_name, blob_name, snapshot, download_size, + chunk_size, progress, start_range, end_range, stream, + progress_callback, validate_content, lease_id, if_modified_since, + if_unmodified_since, if_match, if_none_match, timeout, operation_context): + self.blob_service = blob_service + self.container_name = container_name + self.blob_name = blob_name + self.snapshot = snapshot + self.chunk_size = chunk_size + + self.download_size = download_size + self.start_index = start_range + self.blob_end = end_range + + self.stream = stream + self.stream_start = stream.tell() + self.stream_lock = threading.Lock() + self.progress_callback = progress_callback + self.progress_total = progress + self.progress_lock = threading.Lock() + self.timeout = timeout + self.operation_context = operation_context + + self.validate_content = validate_content + self.lease_id = lease_id + self.if_modified_since = if_modified_since + self.if_unmodified_since = if_unmodified_since + self.if_match = if_match + self.if_none_match = if_none_match + + def get_chunk_offsets(self): + index = self.start_index + while index < self.blob_end: + yield index + index += self.chunk_size + + def process_chunk(self, chunk_start): + if chunk_start + self.chunk_size > self.blob_end: + chunk_end = self.blob_end + else: + chunk_end = chunk_start + self.chunk_size + + chunk_data = self._download_chunk(chunk_start, chunk_end).content + length = chunk_end - chunk_start + if length > 0: + self._write_to_stream(chunk_data, chunk_start) + self._update_progress(length) + + def _update_progress(self, length): + if self.progress_callback is not None: + with self.progress_lock: + self.progress_total += length + total = self.progress_total + self.progress_callback(total, self.download_size) + + def _write_to_stream(self, chunk_data, chunk_start): + with self.stream_lock: + self.stream.seek(self.stream_start + (chunk_start - self.start_index)) + self.stream.write(chunk_data) + + def _download_chunk(self, chunk_start, chunk_end): + response = self.blob_service._get_blob( + self.container_name, + self.blob_name, + snapshot=self.snapshot, + start_range=chunk_start, + end_range=chunk_end - 1, + validate_content=self.validate_content, + lease_id=self.lease_id, + if_modified_since=self.if_modified_since, + if_unmodified_since=self.if_unmodified_since, + if_match=self.if_match, + if_none_match=self.if_none_match, + timeout=self.timeout, + _context=self.operation_context + ) + + # This makes sure that if_match is set so that we can validate + # that subsequent downloads are to an unmodified blob + self.if_match = response.properties.etag + return response diff --git a/src/storage-preview/azext_storage_preview/azure_storage/blob/_encryption.py b/src/storage-preview/azext_storage_preview/azure_storage/blob/_encryption.py new file mode 100644 index 00000000000..b7705a167ae --- /dev/null +++ b/src/storage-preview/azext_storage_preview/azure_storage/blob/_encryption.py @@ -0,0 +1,187 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- + +from json import ( + dumps, + loads, +) +from os import urandom + +from cryptography.hazmat.primitives.padding import PKCS7 + +from azure.storage.common._encryption import ( + _generate_encryption_data_dict, + _generate_AES_CBC_cipher, + _dict_to_encryption_data, + _validate_and_unwrap_cek, + _EncryptionAlgorithm, +) +from azure.storage.common._error import ( + _validate_not_none, + _validate_key_encryption_key_wrap, + _ERROR_DATA_NOT_ENCRYPTED, + _ERROR_UNSUPPORTED_ENCRYPTION_ALGORITHM, +) + + +def _encrypt_blob(blob, key_encryption_key): + ''' + Encrypts the given blob using AES256 in CBC mode with 128 bit padding. + Wraps the generated content-encryption-key using the user-provided key-encryption-key (kek). + Returns a json-formatted string containing the encryption metadata. This method should + only be used when a blob is small enough for single shot upload. Encrypting larger blobs + is done as a part of the _upload_blob_chunks method. + + :param bytes blob: + The blob to be encrypted. + :param object key_encryption_key: + The user-provided key-encryption-key. Must implement the following methods: + wrap_key(key)--wraps the specified key using an algorithm of the user's choice. + get_key_wrap_algorithm()--returns the algorithm used to wrap the specified symmetric key. + get_kid()--returns a string key id for this key-encryption-key. + :return: A tuple of json-formatted string containing the encryption metadata and the encrypted blob data. + :rtype: (str, bytes) + ''' + + _validate_not_none('blob', blob) + _validate_not_none('key_encryption_key', key_encryption_key) + _validate_key_encryption_key_wrap(key_encryption_key) + + # AES256 uses 256 bit (32 byte) keys and always with 16 byte blocks + content_encryption_key = urandom(32) + initialization_vector = urandom(16) + + cipher = _generate_AES_CBC_cipher(content_encryption_key, initialization_vector) + + # PKCS7 with 16 byte blocks ensures compatibility with AES. + padder = PKCS7(128).padder() + padded_data = padder.update(blob) + padder.finalize() + + # Encrypt the data. + encryptor = cipher.encryptor() + encrypted_data = encryptor.update(padded_data) + encryptor.finalize() + encryption_data = _generate_encryption_data_dict(key_encryption_key, content_encryption_key, + initialization_vector) + encryption_data['EncryptionMode'] = 'FullBlob' + + return dumps(encryption_data), encrypted_data + + +def _generate_blob_encryption_data(key_encryption_key): + ''' + Generates the encryption_metadata for the blob. + + :param bytes key_encryption_key: + The key-encryption-key used to wrap the cek associate with this blob. + :return: A tuple containing the cek and iv for this blob as well as the + serialized encryption metadata for the blob. + :rtype: (bytes, bytes, str) + ''' + encryption_data = None + content_encryption_key = None + initialization_vector = None + if key_encryption_key: + _validate_key_encryption_key_wrap(key_encryption_key) + content_encryption_key = urandom(32) + initialization_vector = urandom(16) + encryption_data = _generate_encryption_data_dict(key_encryption_key, + content_encryption_key, + initialization_vector) + encryption_data['EncryptionMode'] = 'FullBlob' + encryption_data = dumps(encryption_data) + + return content_encryption_key, initialization_vector, encryption_data + + +def _decrypt_blob(require_encryption, key_encryption_key, key_resolver, + response, start_offset, end_offset): + ''' + Decrypts the given blob contents and returns only the requested range. + + :param bool require_encryption: + Whether or not the calling blob service requires objects to be decrypted. + :param object key_encryption_key: + The user-provided key-encryption-key. Must implement the following methods: + wrap_key(key)--wraps the specified key using an algorithm of the user's choice. + get_key_wrap_algorithm()--returns the algorithm used to wrap the specified symmetric key. + get_kid()--returns a string key id for this key-encryption-key. + :param key_resolver(kid): + The user-provided key resolver. Uses the kid string to return a key-encryption-key + implementing the interface defined above. + :return: The decrypted blob content. + :rtype: bytes + ''' + _validate_not_none('response', response) + content = response.body + _validate_not_none('content', content) + + try: + encryption_data = _dict_to_encryption_data(loads(response.headers['x-ms-meta-encryptiondata'])) + except: + if require_encryption: + raise ValueError(_ERROR_DATA_NOT_ENCRYPTED) + else: + return content + + if not (encryption_data.encryption_agent.encryption_algorithm == _EncryptionAlgorithm.AES_CBC_256): + raise ValueError(_ERROR_UNSUPPORTED_ENCRYPTION_ALGORITHM) + + blob_type = response.headers['x-ms-blob-type'] + + iv = None + unpad = False + start_range, end_range = 0, len(content) + if 'content-range' in response.headers: + content_range = response.headers['content-range'] + # Format: 'bytes x-y/size' + + # Ignore the word 'bytes' + content_range = content_range.split(' ') + + content_range = content_range[1].split('-') + start_range = int(content_range[0]) + content_range = content_range[1].split('/') + end_range = int(content_range[0]) + blob_size = int(content_range[1]) + + if start_offset >= 16: + iv = content[:16] + content = content[16:] + start_offset -= 16 + else: + iv = encryption_data.content_encryption_IV + + if end_range == blob_size - 1: + unpad = True + else: + unpad = True + iv = encryption_data.content_encryption_IV + + if blob_type == 'PageBlob': + unpad = False + + content_encryption_key = _validate_and_unwrap_cek(encryption_data, key_encryption_key, key_resolver) + cipher = _generate_AES_CBC_cipher(content_encryption_key, iv) + decryptor = cipher.decryptor() + + content = decryptor.update(content) + decryptor.finalize() + if unpad: + unpadder = PKCS7(128).unpadder() + content = unpadder.update(content) + unpadder.finalize() + + return content[start_offset: len(content) - end_offset] + + +def _get_blob_encryptor_and_padder(cek, iv, should_pad): + encryptor = None + padder = None + + if cek is not None and iv is not None: + cipher = _generate_AES_CBC_cipher(cek, iv) + encryptor = cipher.encryptor() + padder = PKCS7(128).padder() if should_pad else None + + return encryptor, padder diff --git a/src/storage-preview/azext_storage_preview/azure_storage/blob/_error.py b/src/storage-preview/azext_storage_preview/azure_storage/blob/_error.py new file mode 100644 index 00000000000..f24edc81377 --- /dev/null +++ b/src/storage-preview/azext_storage_preview/azure_storage/blob/_error.py @@ -0,0 +1,29 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- + +_ERROR_PAGE_BLOB_SIZE_ALIGNMENT = \ + 'Invalid page blob size: {0}. ' + \ + 'The size must be aligned to a 512-byte boundary.' + +_ERROR_PAGE_BLOB_START_ALIGNMENT = \ + 'start_range must align with 512 page size' + +_ERROR_PAGE_BLOB_END_ALIGNMENT = \ + 'end_range must align with 512 page size' + +_ERROR_INVALID_BLOCK_ID = \ + 'All blocks in block list need to have valid block ids.' + +_ERROR_INVALID_LEASE_DURATION = \ + "lease_duration param needs to be between 15 and 60 or -1." + +_ERROR_INVALID_LEASE_BREAK_PERIOD = \ + "lease_break_period param needs to be between 0 and 60." + +_ERROR_NO_SINGLE_THREAD_CHUNKING = \ + 'To use blob chunk downloader more than 1 thread must be ' + \ + 'used since get_blob_to_bytes should be called for single threaded ' + \ + 'blob downloads.' diff --git a/src/storage-preview/azext_storage_preview/azure_storage/blob/_serialization.py b/src/storage-preview/azext_storage_preview/azure_storage/blob/_serialization.py new file mode 100644 index 00000000000..4540a7e9310 --- /dev/null +++ b/src/storage-preview/azext_storage_preview/azure_storage/blob/_serialization.py @@ -0,0 +1,118 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- +from xml.sax.saxutils import escape as xml_escape + +try: + from xml.etree import cElementTree as ETree +except ImportError: + from xml.etree import ElementTree as ETree +from azure.storage.common._common_conversion import ( + _encode_base64, + _str, +) +from azure.storage.common._error import ( + _validate_not_none, + _ERROR_START_END_NEEDED_FOR_MD5, + _ERROR_RANGE_TOO_LARGE_FOR_MD5, +) +from ._error import ( + _ERROR_PAGE_BLOB_START_ALIGNMENT, + _ERROR_PAGE_BLOB_END_ALIGNMENT, + _ERROR_INVALID_BLOCK_ID, +) +from io import BytesIO + + +def _get_path(container_name=None, blob_name=None): + ''' + Creates the path to access a blob resource. + + container_name: + Name of container. + blob_name: + The path to the blob. + ''' + if container_name and blob_name: + return '/{0}/{1}'.format( + _str(container_name), + _str(blob_name)) + elif container_name: + return '/{0}'.format(_str(container_name)) + else: + return '/' + + +def _validate_and_format_range_headers(request, start_range, end_range, start_range_required=True, + end_range_required=True, check_content_md5=False, align_to_page=False): + # If end range is provided, start range must be provided + if start_range_required or end_range is not None: + _validate_not_none('start_range', start_range) + if end_range_required: + _validate_not_none('end_range', end_range) + + # Page ranges must be 512 aligned + if align_to_page: + if start_range is not None and start_range % 512 != 0: + raise ValueError(_ERROR_PAGE_BLOB_START_ALIGNMENT) + if end_range is not None and end_range % 512 != 511: + raise ValueError(_ERROR_PAGE_BLOB_END_ALIGNMENT) + + # Format based on whether end_range is present + request.headers = request.headers or {} + if end_range is not None: + request.headers['x-ms-range'] = 'bytes={0}-{1}'.format(start_range, end_range) + elif start_range is not None: + request.headers['x-ms-range'] = "bytes={0}-".format(start_range) + + # Content MD5 can only be provided for a complete range less than 4MB in size + if check_content_md5: + if start_range is None or end_range is None: + raise ValueError(_ERROR_START_END_NEEDED_FOR_MD5) + if end_range - start_range > 4 * 1024 * 1024: + raise ValueError(_ERROR_RANGE_TOO_LARGE_FOR_MD5) + + request.headers['x-ms-range-get-content-md5'] = 'true' + + +def _convert_block_list_to_xml(block_id_list): + ''' + + + first-base64-encoded-block-id + second-base64-encoded-block-id + third-base64-encoded-block-id + + + Convert a block list to xml to send. + + block_id_list: + A list of BlobBlock containing the block ids and block state that are used in put_block_list. + Only get block from latest blocks. + ''' + if block_id_list is None: + return '' + + block_list_element = ETree.Element('BlockList') + + # Enabled + for block in block_id_list: + if block.id is None: + raise ValueError(_ERROR_INVALID_BLOCK_ID) + id = xml_escape(_str(format(_encode_base64(block.id)))) + ETree.SubElement(block_list_element, block.state).text = id + + # Add xml declaration and serialize + try: + stream = BytesIO() + ETree.ElementTree(block_list_element).write(stream, xml_declaration=True, encoding='utf-8', method='xml') + except: + raise + finally: + output = stream.getvalue() + stream.close() + + # return xml value + return output diff --git a/src/storage-preview/azext_storage_preview/azure_storage/blob/_upload_chunking.py b/src/storage-preview/azext_storage_preview/azure_storage/blob/_upload_chunking.py new file mode 100644 index 00000000000..10bee848713 --- /dev/null +++ b/src/storage-preview/azext_storage_preview/azure_storage/blob/_upload_chunking.py @@ -0,0 +1,485 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- +from io import (BytesIO, IOBase, SEEK_CUR, SEEK_END, SEEK_SET, UnsupportedOperation) +from math import ceil +from threading import Lock + +from azure.storage.common._common_conversion import _encode_base64 +from azure.storage.common._error import _ERROR_VALUE_SHOULD_BE_SEEKABLE_STREAM +from azure.storage.common._serialization import ( + url_quote, + _get_data_bytes_only, + _len_plus +) +from ._encryption import ( + _get_blob_encryptor_and_padder, +) +from .models import BlobBlock +from ._constants import ( + _LARGE_BLOB_UPLOAD_MAX_READ_BUFFER_SIZE +) + + +def _upload_blob_chunks(blob_service, container_name, blob_name, + blob_size, block_size, stream, max_connections, + progress_callback, validate_content, lease_id, uploader_class, + maxsize_condition=None, if_match=None, timeout=None, + content_encryption_key=None, initialization_vector=None, resource_properties=None): + encryptor, padder = _get_blob_encryptor_and_padder(content_encryption_key, initialization_vector, + uploader_class is not _PageBlobChunkUploader) + + uploader = uploader_class( + blob_service, + container_name, + blob_name, + blob_size, + block_size, + stream, + max_connections > 1, + progress_callback, + validate_content, + lease_id, + timeout, + encryptor, + padder + ) + + uploader.maxsize_condition = maxsize_condition + + # ETag matching does not work with parallelism as a ranged upload may start + # before the previous finishes and provides an etag + uploader.if_match = if_match if not max_connections > 1 else None + + if progress_callback is not None: + progress_callback(0, blob_size) + + if max_connections > 1: + import concurrent.futures + from threading import BoundedSemaphore + + ''' + Ensures we bound the chunking so we only buffer and submit 'max_connections' amount of work items to the executor. + This is necessary as the executor queue will keep accepting submitted work items, which results in buffering all the blocks if + the max_connections + 1 ensures the next chunk is already buffered and ready for when the worker thread is available. + ''' + chunk_throttler = BoundedSemaphore(max_connections + 1) + + executor = concurrent.futures.ThreadPoolExecutor(max_connections) + futures = [] + running_futures = [] + + # Check for exceptions and fail fast. + for chunk in uploader.get_chunk_streams(): + for f in running_futures: + if f.done(): + if f.exception(): + raise f.exception() + else: + running_futures.remove(f) + + chunk_throttler.acquire() + future = executor.submit(uploader.process_chunk, chunk) + + # Calls callback upon completion (even if the callback was added after the Future task is done). + future.add_done_callback(lambda x: chunk_throttler.release()) + futures.append(future) + running_futures.append(future) + + # result() will wait until completion and also raise any exceptions that may have been set. + range_ids = [f.result() for f in futures] + else: + range_ids = [uploader.process_chunk(result) for result in uploader.get_chunk_streams()] + + if resource_properties: + resource_properties.last_modified = uploader.last_modified + resource_properties.etag = uploader.etag + + return range_ids + + +def _upload_blob_substream_blocks(blob_service, container_name, blob_name, + blob_size, block_size, stream, max_connections, + progress_callback, validate_content, lease_id, uploader_class, + maxsize_condition=None, if_match=None, timeout=None): + uploader = uploader_class( + blob_service, + container_name, + blob_name, + blob_size, + block_size, + stream, + max_connections > 1, + progress_callback, + validate_content, + lease_id, + timeout, + None, + None + ) + + uploader.maxsize_condition = maxsize_condition + + # ETag matching does not work with parallelism as a ranged upload may start + # before the previous finishes and provides an etag + uploader.if_match = if_match if not max_connections > 1 else None + + if progress_callback is not None: + progress_callback(0, blob_size) + + if max_connections > 1: + import concurrent.futures + executor = concurrent.futures.ThreadPoolExecutor(max_connections) + range_ids = list(executor.map(uploader.process_substream_block, uploader.get_substream_blocks())) + else: + range_ids = [uploader.process_substream_block(result) for result in uploader.get_substream_blocks()] + + return range_ids + + +class _BlobChunkUploader(object): + def __init__(self, blob_service, container_name, blob_name, blob_size, + chunk_size, stream, parallel, progress_callback, + validate_content, lease_id, timeout, encryptor, padder): + self.blob_service = blob_service + self.container_name = container_name + self.blob_name = blob_name + self.blob_size = blob_size + self.chunk_size = chunk_size + self.stream = stream + self.parallel = parallel + self.stream_start = stream.tell() if parallel else None + self.stream_lock = Lock() if parallel else None + self.progress_callback = progress_callback + self.progress_total = 0 + self.progress_lock = Lock() if parallel else None + self.validate_content = validate_content + self.lease_id = lease_id + self.timeout = timeout + self.encryptor = encryptor + self.padder = padder + self.last_modified = None + self.etag = None + + def get_chunk_streams(self): + index = 0 + while True: + data = b'' + read_size = self.chunk_size + + # Buffer until we either reach the end of the stream or get a whole chunk. + while True: + if self.blob_size: + read_size = min(self.chunk_size - len(data), self.blob_size - (index + len(data))) + temp = self.stream.read(read_size) + temp = _get_data_bytes_only('temp', temp) + data += temp + + # We have read an empty string and so are at the end + # of the buffer or we have read a full chunk. + if temp == b'' or len(data) == self.chunk_size: + break + + if len(data) == self.chunk_size: + if self.padder: + data = self.padder.update(data) + if self.encryptor: + data = self.encryptor.update(data) + yield index, data + else: + if self.padder: + data = self.padder.update(data) + self.padder.finalize() + if self.encryptor: + data = self.encryptor.update(data) + self.encryptor.finalize() + if len(data) > 0: + yield index, data + break + index += len(data) + + def process_chunk(self, chunk_data): + chunk_bytes = chunk_data[1] + chunk_offset = chunk_data[0] + return self._upload_chunk_with_progress(chunk_offset, chunk_bytes) + + def _update_progress(self, length): + if self.progress_callback is not None: + if self.progress_lock is not None: + with self.progress_lock: + self.progress_total += length + total = self.progress_total + else: + self.progress_total += length + total = self.progress_total + self.progress_callback(total, self.blob_size) + + def _upload_chunk_with_progress(self, chunk_offset, chunk_data): + range_id = self._upload_chunk(chunk_offset, chunk_data) + self._update_progress(len(chunk_data)) + return range_id + + def get_substream_blocks(self): + assert self.chunk_size is not None + lock = self.stream_lock + blob_length = self.blob_size + + if blob_length is None: + blob_length = _len_plus(self.stream) + if blob_length is None: + raise ValueError(_ERROR_VALUE_SHOULD_BE_SEEKABLE_STREAM.format('stream')) + + blocks = int(ceil(blob_length / (self.chunk_size * 1.0))) + last_block_size = self.chunk_size if blob_length % self.chunk_size == 0 else blob_length % self.chunk_size + + for i in range(blocks): + yield ('BlockId{}'.format("%05d" % i), + _SubStream(self.stream, i * self.chunk_size, last_block_size if i == blocks - 1 else self.chunk_size, + lock)) + + def process_substream_block(self, block_data): + return self._upload_substream_block_with_progress(block_data[0], block_data[1]) + + def _upload_substream_block_with_progress(self, block_id, block_stream): + range_id = self._upload_substream_block(block_id, block_stream) + self._update_progress(len(block_stream)) + return range_id + + def set_response_properties(self, resp): + self.etag = resp.etag + self.last_modified = resp.last_modified + + +class _BlockBlobChunkUploader(_BlobChunkUploader): + def _upload_chunk(self, chunk_offset, chunk_data): + block_id = url_quote(_encode_base64('{0:032d}'.format(chunk_offset))) + self.blob_service._put_block( + self.container_name, + self.blob_name, + chunk_data, + block_id, + validate_content=self.validate_content, + lease_id=self.lease_id, + timeout=self.timeout, + ) + return BlobBlock(block_id) + + def _upload_substream_block(self, block_id, block_stream): + try: + self.blob_service._put_block( + self.container_name, + self.blob_name, + block_stream, + block_id, + validate_content=self.validate_content, + lease_id=self.lease_id, + timeout=self.timeout, + ) + finally: + block_stream.close() + return BlobBlock(block_id) + + +class _PageBlobChunkUploader(_BlobChunkUploader): + def _is_chunk_empty(self, chunk_data): + # read until non-zero byte is encountered + # if reached the end without returning, then chunk_data is all 0's + for each_byte in chunk_data: + if each_byte != 0: + return False + return True + + def _upload_chunk(self, chunk_start, chunk_data): + # avoid uploading the empty pages + if not self._is_chunk_empty(chunk_data): + chunk_end = chunk_start + len(chunk_data) - 1 + resp = self.blob_service._update_page( + self.container_name, + self.blob_name, + chunk_data, + chunk_start, + chunk_end, + validate_content=self.validate_content, + lease_id=self.lease_id, + if_match=self.if_match, + timeout=self.timeout, + ) + + if not self.parallel: + self.if_match = resp.etag + + self.set_response_properties(resp) + + +class _AppendBlobChunkUploader(_BlobChunkUploader): + def _upload_chunk(self, chunk_offset, chunk_data): + if not hasattr(self, 'current_length'): + resp = self.blob_service.append_block( + self.container_name, + self.blob_name, + chunk_data, + validate_content=self.validate_content, + lease_id=self.lease_id, + maxsize_condition=self.maxsize_condition, + timeout=self.timeout, + ) + + self.current_length = resp.append_offset + else: + resp = self.blob_service.append_block( + self.container_name, + self.blob_name, + chunk_data, + validate_content=self.validate_content, + lease_id=self.lease_id, + maxsize_condition=self.maxsize_condition, + appendpos_condition=self.current_length + chunk_offset, + timeout=self.timeout, + ) + + self.set_response_properties(resp) + + +class _SubStream(IOBase): + def __init__(self, wrapped_stream, stream_begin_index, length, lockObj): + # Python 2.7: file-like objects created with open() typically support seek(), but are not + # derivations of io.IOBase and thus do not implement seekable(). + # Python > 3.0: file-like objects created with open() are derived from io.IOBase. + try: + # only the main thread runs this, so there's no need grabbing the lock + wrapped_stream.seek(0, SEEK_CUR) + except: + raise ValueError("Wrapped stream must support seek().") + + self._lock = lockObj + self._wrapped_stream = wrapped_stream + self._position = 0 + self._stream_begin_index = stream_begin_index + self._length = length + self._buffer = BytesIO() + + # we must avoid buffering more than necessary, and also not use up too much memory + # so the max buffer size is capped at 4MB + self._max_buffer_size = length if length < _LARGE_BLOB_UPLOAD_MAX_READ_BUFFER_SIZE \ + else _LARGE_BLOB_UPLOAD_MAX_READ_BUFFER_SIZE + self._current_buffer_start = 0 + self._current_buffer_size = 0 + + def __len__(self): + return self._length + + def close(self): + if self._buffer: + self._buffer.close() + self._wrapped_stream = None + IOBase.close(self) + + def fileno(self): + return self._wrapped_stream.fileno() + + def flush(self): + pass + + def read(self, n): + if self.closed: + raise ValueError("Stream is closed.") + + # adjust if out of bounds + if n + self._position >= self._length: + n = self._length - self._position + + # return fast + if n is 0 or self._buffer.closed: + return b'' + + # attempt first read from the read buffer and update position + read_buffer = self._buffer.read(n) + bytes_read = len(read_buffer) + bytes_remaining = n - bytes_read + self._position += bytes_read + + # repopulate the read buffer from the underlying stream to fulfill the request + # ensure the seek and read operations are done atomically (only if a lock is provided) + if bytes_remaining > 0: + with self._buffer: + # either read in the max buffer size specified on the class + # or read in just enough data for the current block/sub stream + current_max_buffer_size = min(self._max_buffer_size, self._length - self._position) + + # lock is only defined if max_connections > 1 (parallel uploads) + if self._lock: + with self._lock: + # reposition the underlying stream to match the start of the data to read + absolute_position = self._stream_begin_index + self._position + self._wrapped_stream.seek(absolute_position, SEEK_SET) + # If we can't seek to the right location, our read will be corrupted so fail fast. + if self._wrapped_stream.tell() != absolute_position: + raise IOError("Stream failed to seek to the desired location.") + buffer_from_stream = self._wrapped_stream.read(current_max_buffer_size) + else: + buffer_from_stream = self._wrapped_stream.read(current_max_buffer_size) + + if buffer_from_stream: + # update the buffer with new data from the wrapped stream + # we need to note down the start position and size of the buffer, in case seek is performed later + self._buffer = BytesIO(buffer_from_stream) + self._current_buffer_start = self._position + self._current_buffer_size = len(buffer_from_stream) + + # read the remaining bytes from the new buffer and update position + second_read_buffer = self._buffer.read(bytes_remaining) + read_buffer += second_read_buffer + self._position += len(second_read_buffer) + + return read_buffer + + def readable(self): + return True + + def readinto(self, b): + raise UnsupportedOperation + + def seek(self, offset, whence=0): + if whence is SEEK_SET: + start_index = 0 + elif whence is SEEK_CUR: + start_index = self._position + elif whence is SEEK_END: + start_index = self._length + offset = - offset + else: + raise ValueError("Invalid argument for the 'whence' parameter.") + + pos = start_index + offset + + if pos > self._length: + pos = self._length + elif pos < 0: + pos = 0 + + # check if buffer is still valid + # if not, drop buffer + if pos < self._current_buffer_start or pos >= self._current_buffer_start + self._current_buffer_size: + self._buffer.close() + self._buffer = BytesIO() + else: # if yes seek to correct position + delta = pos - self._current_buffer_start + self._buffer.seek(delta, SEEK_SET) + + self._position = pos + return pos + + def seekable(self): + return True + + def tell(self): + return self._position + + def write(self): + raise UnsupportedOperation + + def writelines(self): + raise UnsupportedOperation + + def writeable(self): + return False diff --git a/src/storage-preview/azext_storage_preview/azure_storage/blob/appendblobservice.py b/src/storage-preview/azext_storage_preview/azure_storage/blob/appendblobservice.py new file mode 100644 index 00000000000..81e5f837025 --- /dev/null +++ b/src/storage-preview/azext_storage_preview/azure_storage/blob/appendblobservice.py @@ -0,0 +1,556 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- +import sys +from os import path + +from azure.storage.common._common_conversion import ( + _to_str, + _int_to_str, + _datetime_to_utc_string, + _get_content_md5, +) +from azure.storage.common._constants import ( + SERVICE_HOST_BASE, + DEFAULT_PROTOCOL, +) +from azure.storage.common._error import ( + _validate_not_none, + _validate_type_bytes, + _validate_encryption_unsupported, + _ERROR_VALUE_NEGATIVE, +) +from azure.storage.common._http import HTTPRequest +from azure.storage.common._serialization import ( + _get_data_bytes_only, + _add_metadata_headers, +) +from ._deserialization import ( + _parse_append_block, + _parse_base_properties, +) +from ._serialization import ( + _get_path, +) +from ._upload_chunking import ( + _AppendBlobChunkUploader, + _upload_blob_chunks, +) +from .baseblobservice import BaseBlobService +from .models import ( + _BlobTypes, + ResourceProperties +) + +if sys.version_info >= (3,): + from io import BytesIO +else: + from cStringIO import StringIO as BytesIO + + +class AppendBlobService(BaseBlobService): + ''' + An append blob is comprised of blocks and is optimized for append operations. + When you modify an append blob, blocks are added to the end of the blob only, + via the append_block operation. Updating or deleting of existing blocks is not + supported. Unlike a block blob, an append blob does not expose its block IDs. + + Each block in an append blob can be a different size, up to a maximum of 4 MB, + and an append blob can include up to 50,000 blocks. The maximum size of an + append blob is therefore slightly more than 195 GB (4 MB X 50,000 blocks). + + :ivar int MAX_BLOCK_SIZE: + The size of the blocks put by append_blob_from_* methods. Smaller blocks + may be put if there is less data provided. The maximum block size the service + supports is 4MB. + ''' + MAX_BLOCK_SIZE = 4 * 1024 * 1024 + + def __init__(self, account_name=None, account_key=None, sas_token=None, is_emulated=False, + protocol=DEFAULT_PROTOCOL, endpoint_suffix=SERVICE_HOST_BASE, custom_domain=None, request_session=None, + connection_string=None, socket_timeout=None, token_credential=None): + ''' + :param str account_name: + The storage account name. This is used to authenticate requests + signed with an account key and to construct the storage endpoint. It + is required unless a connection string is given, or if a custom + domain is used with anonymous authentication. + :param str account_key: + The storage account key. This is used for shared key authentication. + If neither account key or sas token is specified, anonymous access + will be used. + :param str sas_token: + A shared access signature token to use to authenticate requests + instead of the account key. If account key and sas token are both + specified, account key will be used to sign. If neither are + specified, anonymous access will be used. + :param bool is_emulated: + Whether to use the emulator. Defaults to False. If specified, will + override all other parameters besides connection string and request + session. + :param str protocol: + The protocol to use for requests. Defaults to https. + :param str endpoint_suffix: + The host base component of the url, minus the account name. Defaults + to Azure (core.windows.net). Override this to use the China cloud + (core.chinacloudapi.cn). + :param str custom_domain: + The custom domain to use. This can be set in the Azure Portal. For + example, 'www.mydomain.com'. + :param requests.Session request_session: + The session object to use for http requests. + :param str connection_string: + If specified, this will override all other parameters besides + request session. See + http://azure.microsoft.com/en-us/documentation/articles/storage-configure-connection-string/ + for the connection string format. + :param int socket_timeout: + If specified, this will override the default socket timeout. The timeout specified is in seconds. + See DEFAULT_SOCKET_TIMEOUT in _constants.py for the default value. + :param token_credential: + A token credential used to authenticate HTTPS requests. The token value + should be updated before its expiration. + :type `~azure.storage.common.TokenCredential` + ''' + self.blob_type = _BlobTypes.AppendBlob + super(AppendBlobService, self).__init__( + account_name, account_key, sas_token, is_emulated, protocol, endpoint_suffix, + custom_domain, request_session, connection_string, socket_timeout, token_credential) + + def create_blob(self, container_name, blob_name, content_settings=None, + metadata=None, lease_id=None, + if_modified_since=None, if_unmodified_since=None, + if_match=None, if_none_match=None, timeout=None): + ''' + Creates a blob or overrides an existing blob. Use if_none_match=* to + prevent overriding an existing blob. + + See create_blob_from_* for high level + functions that handle the creation and upload of large blobs with + automatic chunking and progress notifications. + + :param str container_name: + Name of existing container. + :param str blob_name: + Name of blob to create or update. + :param ~azure.storage.blob.models.ContentSettings content_settings: + ContentSettings object used to set blob properties. + :param metadata: + Name-value pairs associated with the blob as metadata. + :type metadata: dict(str, str) + :param str lease_id: + Required if the blob has an active lease. + :param datetime if_modified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only + if the resource has been modified since the specified time. + :param datetime if_unmodified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only if + the resource has not been modified since the specified date/time. + :param str if_match: + An ETag value, or the wildcard character (*). Specify this header to + perform the operation only if the resource's ETag matches the value specified. + :param str if_none_match: + An ETag value, or the wildcard character (*). Specify this header + to perform the operation only if the resource's ETag does not match + the value specified. Specify the wildcard character (*) to perform + the operation only if the resource does not exist, and fail the + operation if it does exist. + :param int timeout: + The timeout parameter is expressed in seconds. + :return: ETag and last modified properties for the updated Append Blob + :rtype: :class:`~azure.storage.blob.models.ResourceProperties` + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + _validate_encryption_unsupported(self.require_encryption, self.key_encryption_key) + + request = HTTPRequest() + request.method = 'PUT' + request.host_locations = self._get_host_locations() + request.path = _get_path(container_name, blob_name) + request.query = {'timeout': _int_to_str(timeout)} + request.headers = { + 'x-ms-blob-type': _to_str(self.blob_type), + 'x-ms-lease-id': _to_str(lease_id), + 'If-Modified-Since': _datetime_to_utc_string(if_modified_since), + 'If-Unmodified-Since': _datetime_to_utc_string(if_unmodified_since), + 'If-Match': _to_str(if_match), + 'If-None-Match': _to_str(if_none_match) + } + _add_metadata_headers(metadata, request) + if content_settings is not None: + request.headers.update(content_settings._to_headers()) + + return self._perform_request(request, _parse_base_properties) + + def append_block(self, container_name, blob_name, block, + validate_content=False, maxsize_condition=None, + appendpos_condition=None, + lease_id=None, if_modified_since=None, + if_unmodified_since=None, if_match=None, + if_none_match=None, timeout=None): + ''' + Commits a new block of data to the end of an existing append blob. + + :param str container_name: + Name of existing container. + :param str blob_name: + Name of existing blob. + :param bytes block: + Content of the block in bytes. + :param bool validate_content: + If true, calculates an MD5 hash of the block content. The storage + service checks the hash of the content that has arrived + with the hash that was sent. This is primarily valuable for detecting + bitflips on the wire if using http instead of https as https (the default) + will already validate. Note that this MD5 hash is not stored with the + blob. + :param int maxsize_condition: + Optional conditional header. The max length in bytes permitted for + the append blob. If the Append Block operation would cause the blob + to exceed that limit or if the blob size is already greater than the + value specified in this header, the request will fail with + MaxBlobSizeConditionNotMet error (HTTP status code 412 - Precondition Failed). + :param int appendpos_condition: + Optional conditional header, used only for the Append Block operation. + A number indicating the byte offset to compare. Append Block will + succeed only if the append position is equal to this number. If it + is not, the request will fail with the + AppendPositionConditionNotMet error + (HTTP status code 412 - Precondition Failed). + :param str lease_id: + Required if the blob has an active lease. + :param datetime if_modified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only + if the resource has been modified since the specified time. + :param datetime if_unmodified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only if + the resource has not been modified since the specified date/time. + :param str if_match: + An ETag value, or the wildcard character (*). Specify this header to perform + the operation only if the resource's ETag matches the value specified. + :param str if_none_match: + An ETag value, or the wildcard character (*). Specify this header + to perform the operation only if the resource's ETag does not match + the value specified. Specify the wildcard character (*) to perform + the operation only if the resource does not exist, and fail the + operation if it does exist. + :param int timeout: + The timeout parameter is expressed in seconds. + :return: + ETag, last modified, append offset, and committed block count + properties for the updated Append Blob + :rtype: :class:`~azure.storage.blob.models.AppendBlockProperties` + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + _validate_not_none('block', block) + _validate_encryption_unsupported(self.require_encryption, self.key_encryption_key) + + request = HTTPRequest() + request.method = 'PUT' + request.host_locations = self._get_host_locations() + request.path = _get_path(container_name, blob_name) + request.query = { + 'comp': 'appendblock', + 'timeout': _int_to_str(timeout), + } + request.headers = { + 'x-ms-blob-condition-maxsize': _to_str(maxsize_condition), + 'x-ms-blob-condition-appendpos': _to_str(appendpos_condition), + 'x-ms-lease-id': _to_str(lease_id), + 'If-Modified-Since': _datetime_to_utc_string(if_modified_since), + 'If-Unmodified-Since': _datetime_to_utc_string(if_unmodified_since), + 'If-Match': _to_str(if_match), + 'If-None-Match': _to_str(if_none_match) + } + request.body = _get_data_bytes_only('block', block) + + if validate_content: + computed_md5 = _get_content_md5(request.body) + request.headers['Content-MD5'] = _to_str(computed_md5) + + return self._perform_request(request, _parse_append_block) + + # ----Convenience APIs---------------------------------------------- + + def append_blob_from_path( + self, container_name, blob_name, file_path, validate_content=False, + maxsize_condition=None, progress_callback=None, lease_id=None, timeout=None): + ''' + Appends to the content of an existing blob from a file path, with automatic + chunking and progress notifications. + + :param str container_name: + Name of existing container. + :param str blob_name: + Name of blob to create or update. + :param str file_path: + Path of the file to upload as the blob content. + :param bool validate_content: + If true, calculates an MD5 hash for each chunk of the blob. The storage + service checks the hash of the content that has arrived with the hash + that was sent. This is primarily valuable for detecting bitflips on + the wire if using http instead of https as https (the default) will + already validate. Note that this MD5 hash is not stored with the + blob. + :param int maxsize_condition: + Optional conditional header. The max length in bytes permitted for + the append blob. If the Append Block operation would cause the blob + to exceed that limit or if the blob size is already greater than the + value specified in this header, the request will fail with + MaxBlobSizeConditionNotMet error (HTTP status code 412 - Precondition Failed). + :param progress_callback: + Callback for progress with signature function(current, total) where + current is the number of bytes transfered so far, and total is the + size of the blob, or None if the total size is unknown. + :type progress_callback: func(current, total) + :param str lease_id: + Required if the blob has an active lease. + :param int timeout: + The timeout parameter is expressed in seconds. This method may make + multiple calls to the Azure service and the timeout will apply to + each call individually. + :return: ETag and last modified properties for the Append Blob + :rtype: :class:`~azure.storage.blob.models.ResourceProperties` + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + _validate_not_none('file_path', file_path) + _validate_encryption_unsupported(self.require_encryption, self.key_encryption_key) + + count = path.getsize(file_path) + with open(file_path, 'rb') as stream: + return self.append_blob_from_stream( + container_name, + blob_name, + stream, + count=count, + validate_content=validate_content, + maxsize_condition=maxsize_condition, + progress_callback=progress_callback, + lease_id=lease_id, + timeout=timeout) + + def append_blob_from_bytes( + self, container_name, blob_name, blob, index=0, count=None, + validate_content=False, maxsize_condition=None, progress_callback=None, + lease_id=None, timeout=None): + ''' + Appends to the content of an existing blob from an array of bytes, with + automatic chunking and progress notifications. + + :param str container_name: + Name of existing container. + :param str blob_name: + Name of blob to create or update. + :param bytes blob: + Content of blob as an array of bytes. + :param int index: + Start index in the array of bytes. + :param int count: + Number of bytes to upload. Set to None or negative value to upload + all bytes starting from index. + :param bool validate_content: + If true, calculates an MD5 hash for each chunk of the blob. The storage + service checks the hash of the content that has arrived with the hash + that was sent. This is primarily valuable for detecting bitflips on + the wire if using http instead of https as https (the default) will + already validate. Note that this MD5 hash is not stored with the + blob. + :param int maxsize_condition: + Optional conditional header. The max length in bytes permitted for + the append blob. If the Append Block operation would cause the blob + to exceed that limit or if the blob size is already greater than the + value specified in this header, the request will fail with + MaxBlobSizeConditionNotMet error (HTTP status code 412 - Precondition Failed). + :param progress_callback: + Callback for progress with signature function(current, total) where + current is the number of bytes transfered so far, and total is the + size of the blob, or None if the total size is unknown. + :type progress_callback: func(current, total) + :param str lease_id: + Required if the blob has an active lease. + :param int timeout: + The timeout parameter is expressed in seconds. This method may make + multiple calls to the Azure service and the timeout will apply to + each call individually. + :return: ETag and last modified properties for the Append Blob + :rtype: :class:`~azure.storage.blob.models.ResourceProperties` + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + _validate_not_none('blob', blob) + _validate_not_none('index', index) + _validate_type_bytes('blob', blob) + _validate_encryption_unsupported(self.require_encryption, self.key_encryption_key) + + if index < 0: + raise IndexError(_ERROR_VALUE_NEGATIVE.format('index')) + + if count is None or count < 0: + count = len(blob) - index + + stream = BytesIO(blob) + stream.seek(index) + + return self.append_blob_from_stream( + container_name, + blob_name, + stream, + count=count, + validate_content=validate_content, + maxsize_condition=maxsize_condition, + lease_id=lease_id, + progress_callback=progress_callback, + timeout=timeout) + + def append_blob_from_text( + self, container_name, blob_name, text, encoding='utf-8', + validate_content=False, maxsize_condition=None, progress_callback=None, + lease_id=None, timeout=None): + ''' + Appends to the content of an existing blob from str/unicode, with + automatic chunking and progress notifications. + + :param str container_name: + Name of existing container. + :param str blob_name: + Name of blob to create or update. + :param str text: + Text to upload to the blob. + :param str encoding: + Python encoding to use to convert the text to bytes. + :param bool validate_content: + If true, calculates an MD5 hash for each chunk of the blob. The storage + service checks the hash of the content that has arrived with the hash + that was sent. This is primarily valuable for detecting bitflips on + the wire if using http instead of https as https (the default) will + already validate. Note that this MD5 hash is not stored with the + blob. + :param int maxsize_condition: + Optional conditional header. The max length in bytes permitted for + the append blob. If the Append Block operation would cause the blob + to exceed that limit or if the blob size is already greater than the + value specified in this header, the request will fail with + MaxBlobSizeConditionNotMet error (HTTP status code 412 - Precondition Failed). + :param progress_callback: + Callback for progress with signature function(current, total) where + current is the number of bytes transfered so far, and total is the + size of the blob, or None if the total size is unknown. + :type progress_callback: func(current, total) + :param str lease_id: + Required if the blob has an active lease. + :param int timeout: + The timeout parameter is expressed in seconds. This method may make + multiple calls to the Azure service and the timeout will apply to + each call individually. + :return: ETag and last modified properties for the Append Blob + :rtype: :class:`~azure.storage.blob.models.ResourceProperties` + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + _validate_not_none('text', text) + _validate_encryption_unsupported(self.require_encryption, self.key_encryption_key) + + if not isinstance(text, bytes): + _validate_not_none('encoding', encoding) + text = text.encode(encoding) + + return self.append_blob_from_bytes( + container_name, + blob_name, + text, + index=0, + count=len(text), + validate_content=validate_content, + maxsize_condition=maxsize_condition, + lease_id=lease_id, + progress_callback=progress_callback, + timeout=timeout) + + def append_blob_from_stream( + self, container_name, blob_name, stream, count=None, + validate_content=False, maxsize_condition=None, progress_callback=None, + lease_id=None, timeout=None): + ''' + Appends to the content of an existing blob from a file/stream, with + automatic chunking and progress notifications. + + :param str container_name: + Name of existing container. + :param str blob_name: + Name of blob to create or update. + :param io.IOBase stream: + Opened stream to upload as the blob content. + :param int count: + Number of bytes to read from the stream. This is optional, but + should be supplied for optimal performance. + :param bool validate_content: + If true, calculates an MD5 hash for each chunk of the blob. The storage + service checks the hash of the content that has arrived with the hash + that was sent. This is primarily valuable for detecting bitflips on + the wire if using http instead of https as https (the default) will + already validate. Note that this MD5 hash is not stored with the + blob. + :param int maxsize_condition: + Conditional header. The max length in bytes permitted for + the append blob. If the Append Block operation would cause the blob + to exceed that limit or if the blob size is already greater than the + value specified in this header, the request will fail with + MaxBlobSizeConditionNotMet error (HTTP status code 412 - Precondition Failed). + :param progress_callback: + Callback for progress with signature function(current, total) where + current is the number of bytes transfered so far, and total is the + size of the blob, or None if the total size is unknown. + :type progress_callback: func(current, total) + :param str lease_id: + Required if the blob has an active lease. + :param int timeout: + The timeout parameter is expressed in seconds. This method may make + multiple calls to the Azure service and the timeout will apply to + each call individually. + :return: ETag and last modified properties for the Append Blob + :rtype: :class:`~azure.storage.blob.models.ResourceProperties` + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + _validate_not_none('stream', stream) + _validate_encryption_unsupported(self.require_encryption, self.key_encryption_key) + + # _upload_blob_chunks returns the block ids for block blobs so resource_properties + # is passed as a parameter to get the last_modified and etag for page and append blobs. + # this info is not needed for block_blobs since _put_block_list is called after which gets this info + resource_properties = ResourceProperties() + _upload_blob_chunks( + blob_service=self, + container_name=container_name, + blob_name=blob_name, + blob_size=count, + block_size=self.MAX_BLOCK_SIZE, + stream=stream, + max_connections=1, # upload not easily parallelizable + progress_callback=progress_callback, + validate_content=validate_content, + lease_id=lease_id, + uploader_class=_AppendBlobChunkUploader, + maxsize_condition=maxsize_condition, + timeout=timeout, + resource_properties=resource_properties + ) + + return resource_properties diff --git a/src/storage-preview/azext_storage_preview/azure_storage/blob/baseblobservice.py b/src/storage-preview/azext_storage_preview/azure_storage/blob/baseblobservice.py new file mode 100644 index 00000000000..1ce79e6c6f1 --- /dev/null +++ b/src/storage-preview/azext_storage_preview/azure_storage/blob/baseblobservice.py @@ -0,0 +1,3246 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- +import sys +from abc import ABCMeta + +from azure.common import AzureHttpError + +from azure.storage.common._auth import ( + _StorageSASAuthentication, + _StorageSharedKeyAuthentication, + _StorageNoAuthentication, + _StorageTokenAuthentication, +) +from azure.storage.common._common_conversion import ( + _int_to_str, + _to_str, + _datetime_to_utc_string, +) +from azure.storage.common._connection import _ServiceParameters +from azure.storage.common._constants import ( + SERVICE_HOST_BASE, + DEFAULT_PROTOCOL, +) +from azure.storage.common._deserialization import ( + _convert_xml_to_service_properties, + _parse_metadata, + _parse_properties, + _convert_xml_to_service_stats, + _parse_length_from_content_range, +) +from azure.storage.common._error import ( + _dont_fail_not_exist, + _dont_fail_on_exist, + _validate_not_none, + _validate_decryption_required, + _validate_access_policies, + _ERROR_PARALLEL_NOT_SEEKABLE, +) +from azure.storage.common._http import HTTPRequest +from azure.storage.common._serialization import ( + _get_request_body, + _convert_signed_identifiers_to_xml, + _convert_service_properties_to_xml, + _add_metadata_headers, +) +from azure.storage.common.models import ( + Services, + ListGenerator, + _OperationContext, +) +from .sharedaccesssignature import ( + BlobSharedAccessSignature, +) +from azure.storage.common.storageclient import StorageClient +from ._deserialization import ( + _convert_xml_to_containers, + _parse_blob, + _convert_xml_to_blob_list, + _parse_container, + _parse_snapshot_blob, + _parse_lease, + _convert_xml_to_signed_identifiers_and_access, + _parse_base_properties, +) +from ._download_chunking import _download_blob_chunks +from ._error import ( + _ERROR_INVALID_LEASE_DURATION, + _ERROR_INVALID_LEASE_BREAK_PERIOD, +) +from ._serialization import ( + _get_path, + _validate_and_format_range_headers, +) +from .models import ( + BlobProperties, + _LeaseActions, + ContainerPermissions, + BlobPermissions, +) + +from ._constants import ( + X_MS_VERSION, + __version__ as package_version, +) + +if sys.version_info >= (3,): + from io import BytesIO +else: + from cStringIO import StringIO as BytesIO + + +class BaseBlobService(StorageClient): + ''' + This is the main class managing Blob resources. + + The Blob service stores text and binary data as blobs in the cloud. + The Blob service offers the following three resources: the storage account, + containers, and blobs. Within your storage account, containers provide a + way to organize sets of blobs. For more information please see: + https://msdn.microsoft.com/en-us/library/azure/ee691964.aspx + + :ivar int MAX_SINGLE_GET_SIZE: + The size of the first range get performed by get_blob_to_* methods if + max_connections is greater than 1. Less data will be returned if the + blob is smaller than this. + :ivar int MAX_CHUNK_GET_SIZE: + The size of subsequent range gets performed by get_blob_to_* methods if + max_connections is greater than 1 and the blob is larger than MAX_SINGLE_GET_SIZE. + Less data will be returned if the remainder of the blob is smaller than + this. If this is set to larger than 4MB, content_validation will throw an + error if enabled. However, if content_validation is not desired a size + greater than 4MB may be optimal. Setting this below 4MB is not recommended. + :ivar object key_encryption_key: + The key-encryption-key optionally provided by the user. If provided, will be used to + encrypt/decrypt in supported methods. + For methods requiring decryption, either the key_encryption_key OR the resolver must be provided. + If both are provided, the resolver will take precedence. + Must implement the following methods for APIs requiring encryption: + wrap_key(key)--wraps the specified key (bytes) using an algorithm of the user's choice. Returns the encrypted key as bytes. + get_key_wrap_algorithm()--returns the algorithm used to wrap the specified symmetric key. + get_kid()--returns a string key id for this key-encryption-key. + Must implement the following methods for APIs requiring decryption: + unwrap_key(key, algorithm)--returns the unwrapped form of the specified symmetric key using the string-specified algorithm. + get_kid()--returns a string key id for this key-encryption-key. + :ivar function key_resolver_function(kid): + A function to resolve keys optionally provided by the user. If provided, will be used to decrypt in supported methods. + For methods requiring decryption, either the key_encryption_key OR + the resolver must be provided. If both are provided, the resolver will take precedence. + It uses the kid string to return a key-encryption-key implementing the interface defined above. + :ivar bool require_encryption: + A flag that may be set to ensure that all messages successfully uploaded to the queue and all those downloaded and + successfully read from the queue are/were encrypted while on the server. If this flag is set, all required + parameters for encryption/decryption must be provided. See the above comments on the key_encryption_key and resolver. + ''' + + __metaclass__ = ABCMeta + MAX_SINGLE_GET_SIZE = 32 * 1024 * 1024 + MAX_CHUNK_GET_SIZE = 4 * 1024 * 1024 + + def __init__(self, account_name=None, account_key=None, sas_token=None, is_emulated=False, + protocol=DEFAULT_PROTOCOL, endpoint_suffix=SERVICE_HOST_BASE, custom_domain=None, request_session=None, + connection_string=None, socket_timeout=None, token_credential=None): + ''' + :param str account_name: + The storage account name. This is used to authenticate requests + signed with an account key and to construct the storage endpoint. It + is required unless a connection string is given, or if a custom + domain is used with anonymous authentication. + :param str account_key: + The storage account key. This is used for shared key authentication. + If neither account key or sas token is specified, anonymous access + will be used. + :param str sas_token: + A shared access signature token to use to authenticate requests + instead of the account key. If account key and sas token are both + specified, account key will be used to sign. If neither are + specified, anonymous access will be used. + :param bool is_emulated: + Whether to use the emulator. Defaults to False. If specified, will + override all other parameters besides connection string and request + session. + :param str protocol: + The protocol to use for requests. Defaults to https. + :param str endpoint_suffix: + The host base component of the url, minus the account name. Defaults + to Azure (core.windows.net). Override this to use the China cloud + (core.chinacloudapi.cn). + :param str custom_domain: + The custom domain to use. This can be set in the Azure Portal. For + example, 'www.mydomain.com'. + :param requests.Session request_session: + The session object to use for http requests. + :param str connection_string: + If specified, this will override all other parameters besides + request session. See + http://azure.microsoft.com/en-us/documentation/articles/storage-configure-connection-string/ + for the connection string format + :param int socket_timeout: + If specified, this will override the default socket timeout. The timeout specified is in seconds. + See DEFAULT_SOCKET_TIMEOUT in _constants.py for the default value. + :param token_credential: + A token credential used to authenticate HTTPS requests. The token value + should be updated before its expiration. + :type `~azure.storage.common.TokenCredential` + ''' + service_params = _ServiceParameters.get_service_parameters( + 'blob', + account_name=account_name, + account_key=account_key, + sas_token=sas_token, + token_credential=token_credential, + is_emulated=is_emulated, + protocol=protocol, + endpoint_suffix=endpoint_suffix, + custom_domain=custom_domain, + request_session=request_session, + connection_string=connection_string, + socket_timeout=socket_timeout) + + super(BaseBlobService, self).__init__(service_params) + + if self.account_key: + self.authentication = _StorageSharedKeyAuthentication( + self.account_name, + self.account_key, + self.is_emulated + ) + elif self.sas_token: + self.authentication = _StorageSASAuthentication(self.sas_token) + elif self.token_credential: + self.authentication = _StorageTokenAuthentication(self.token_credential) + else: + self.authentication = _StorageNoAuthentication() + + self.require_encryption = False + self.key_encryption_key = None + self.key_resolver_function = None + self._X_MS_VERSION = X_MS_VERSION + self._update_user_agent_string(package_version) + + def make_blob_url(self, container_name, blob_name, protocol=None, sas_token=None, snapshot=None): + ''' + Creates the url to access a blob. + + :param str container_name: + Name of container. + :param str blob_name: + Name of blob. + :param str protocol: + Protocol to use: 'http' or 'https'. If not specified, uses the + protocol specified when BaseBlobService was initialized. + :param str sas_token: + Shared access signature token created with + generate_shared_access_signature. + :param str snapshot: + An string value that uniquely identifies the snapshot. The value of + this query parameter indicates the snapshot version. + :return: blob access URL. + :rtype: str + ''' + + url = '{}://{}/{}/{}'.format( + protocol or self.protocol, + self.primary_endpoint, + container_name, + blob_name, + ) + + if snapshot and sas_token: + url = '{}?snapshot={}&{}'.format(url, snapshot, sas_token) + elif snapshot: + url = '{}?snapshot={}'.format(url, snapshot) + elif sas_token: + url = '{}?{}'.format(url, sas_token) + + return url + + def make_container_url(self, container_name, protocol=None, sas_token=None): + ''' + Creates the url to access a container. + + :param str container_name: + Name of container. + :param str protocol: + Protocol to use: 'http' or 'https'. If not specified, uses the + protocol specified when BaseBlobService was initialized. + :param str sas_token: + Shared access signature token created with + generate_shared_access_signature. + :return: container access URL. + :rtype: str + ''' + + url = '{}://{}/{}?restype=container'.format( + protocol or self.protocol, + self.primary_endpoint, + container_name, + ) + + if sas_token: + url = '{}&{}'.format(url, sas_token) + + return url + + def generate_account_shared_access_signature(self, resource_types, permission, + expiry, start=None, ip=None, protocol=None): + ''' + Generates a shared access signature for the blob service. + Use the returned signature with the sas_token parameter of any BlobService. + + :param ResourceTypes resource_types: + Specifies the resource types that are accessible with the account SAS. + :param AccountPermissions permission: + The permissions associated with the shared access signature. The + user is restricted to operations allowed by the permissions. + Required unless an id is given referencing a stored access policy + which contains this field. This field must be omitted if it has been + specified in an associated stored access policy. + :param expiry: + The time at which the shared access signature becomes invalid. + Required unless an id is given referencing a stored access policy + which contains this field. This field must be omitted if it has + been specified in an associated stored access policy. Azure will always + convert values to UTC. If a date is passed in without timezone info, it + is assumed to be UTC. + :type expiry: datetime or str + :param start: + The time at which the shared access signature becomes valid. If + omitted, start time for this call is assumed to be the time when the + storage service receives the request. Azure will always convert values + to UTC. If a date is passed in without timezone info, it is assumed to + be UTC. + :type start: datetime or str + :param str ip: + Specifies an IP address or a range of IP addresses from which to accept requests. + If the IP address from which the request originates does not match the IP address + or address range specified on the SAS token, the request is not authenticated. + For example, specifying sip=168.1.5.65 or sip=168.1.5.60-168.1.5.70 on the SAS + restricts the request to those IP addresses. + :param str protocol: + Specifies the protocol permitted for a request made. The default value + is https,http. See :class:`~azure.storage.common.models.Protocol` for possible values. + :return: A Shared Access Signature (sas) token. + :rtype: str + ''' + _validate_not_none('self.account_name', self.account_name) + _validate_not_none('self.account_key', self.account_key) + + sas = BlobSharedAccessSignature(self.account_name, self.account_key) + return sas.generate_account(Services.BLOB, resource_types, permission, + expiry, start=start, ip=ip, protocol=protocol) + + def generate_container_shared_access_signature(self, container_name, + permission=None, expiry=None, + start=None, id=None, ip=None, protocol=None, + cache_control=None, content_disposition=None, + content_encoding=None, content_language=None, + content_type=None): + ''' + Generates a shared access signature for the container. + Use the returned signature with the sas_token parameter of any BlobService. + + :param str container_name: + Name of container. + :param ContainerPermissions permission: + The permissions associated with the shared access signature. The + user is restricted to operations allowed by the permissions. + Permissions must be ordered read, write, delete, list. + Required unless an id is given referencing a stored access policy + which contains this field. This field must be omitted if it has been + specified in an associated stored access policy. + :param expiry: + The time at which the shared access signature becomes invalid. + Required unless an id is given referencing a stored access policy + which contains this field. This field must be omitted if it has + been specified in an associated stored access policy. Azure will always + convert values to UTC. If a date is passed in without timezone info, it + is assumed to be UTC. + :type expiry: datetime or str + :param start: + The time at which the shared access signature becomes valid. If + omitted, start time for this call is assumed to be the time when the + storage service receives the request. Azure will always convert values + to UTC. If a date is passed in without timezone info, it is assumed to + be UTC. + :type start: datetime or str + :param str id: + A unique value up to 64 characters in length that correlates to a + stored access policy. To create a stored access policy, use + set_blob_service_properties. + :param str ip: + Specifies an IP address or a range of IP addresses from which to accept requests. + If the IP address from which the request originates does not match the IP address + or address range specified on the SAS token, the request is not authenticated. + For example, specifying sip=168.1.5.65 or sip=168.1.5.60-168.1.5.70 on the SAS + restricts the request to those IP addresses. + :param str protocol: + Specifies the protocol permitted for a request made. The default value + is https,http. See :class:`~azure.storage.common.models.Protocol` for possible values. + :param str cache_control: + Response header value for Cache-Control when resource is accessed + using this shared access signature. + :param str content_disposition: + Response header value for Content-Disposition when resource is accessed + using this shared access signature. + :param str content_encoding: + Response header value for Content-Encoding when resource is accessed + using this shared access signature. + :param str content_language: + Response header value for Content-Language when resource is accessed + using this shared access signature. + :param str content_type: + Response header value for Content-Type when resource is accessed + using this shared access signature. + :return: A Shared Access Signature (sas) token. + :rtype: str + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('self.account_name', self.account_name) + _validate_not_none('self.account_key', self.account_key) + + sas = BlobSharedAccessSignature(self.account_name, self.account_key) + return sas.generate_container( + container_name, + permission, + expiry, + start=start, + id=id, + ip=ip, + protocol=protocol, + cache_control=cache_control, + content_disposition=content_disposition, + content_encoding=content_encoding, + content_language=content_language, + content_type=content_type, + ) + + def generate_blob_shared_access_signature( + self, container_name, blob_name, permission=None, + expiry=None, start=None, id=None, ip=None, protocol=None, + cache_control=None, content_disposition=None, + content_encoding=None, content_language=None, + content_type=None): + ''' + Generates a shared access signature for the blob. + Use the returned signature with the sas_token parameter of any BlobService. + + :param str container_name: + Name of container. + :param str blob_name: + Name of blob. + :param BlobPermissions permission: + The permissions associated with the shared access signature. The + user is restricted to operations allowed by the permissions. + Permissions must be ordered read, write, delete, list. + Required unless an id is given referencing a stored access policy + which contains this field. This field must be omitted if it has been + specified in an associated stored access policy. + :param expiry: + The time at which the shared access signature becomes invalid. + Required unless an id is given referencing a stored access policy + which contains this field. This field must be omitted if it has + been specified in an associated stored access policy. Azure will always + convert values to UTC. If a date is passed in without timezone info, it + is assumed to be UTC. + :type expiry: datetime or str + :param start: + The time at which the shared access signature becomes valid. If + omitted, start time for this call is assumed to be the time when the + storage service receives the request. Azure will always convert values + to UTC. If a date is passed in without timezone info, it is assumed to + be UTC. + :type start: datetime or str + :param str id: + A unique value up to 64 characters in length that correlates to a + stored access policy. To create a stored access policy, use :func:`~set_container_acl`. + :param str ip: + Specifies an IP address or a range of IP addresses from which to accept requests. + If the IP address from which the request originates does not match the IP address + or address range specified on the SAS token, the request is not authenticated. + For example, specifying sip=168.1.5.65 or sip=168.1.5.60-168.1.5.70 on the SAS + restricts the request to those IP addresses. + :param str protocol: + Specifies the protocol permitted for a request made. The default value + is https,http. See :class:`~azure.storage.common.models.Protocol` for possible values. + :param str cache_control: + Response header value for Cache-Control when resource is accessed + using this shared access signature. + :param str content_disposition: + Response header value for Content-Disposition when resource is accessed + using this shared access signature. + :param str content_encoding: + Response header value for Content-Encoding when resource is accessed + using this shared access signature. + :param str content_language: + Response header value for Content-Language when resource is accessed + using this shared access signature. + :param str content_type: + Response header value for Content-Type when resource is accessed + using this shared access signature. + :return: A Shared Access Signature (sas) token. + :rtype: str + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + _validate_not_none('self.account_name', self.account_name) + _validate_not_none('self.account_key', self.account_key) + + sas = BlobSharedAccessSignature(self.account_name, self.account_key) + return sas.generate_blob( + container_name, + blob_name, + permission, + expiry, + start=start, + id=id, + ip=ip, + protocol=protocol, + cache_control=cache_control, + content_disposition=content_disposition, + content_encoding=content_encoding, + content_language=content_language, + content_type=content_type, + ) + + def list_containers(self, prefix=None, num_results=None, include_metadata=False, + marker=None, timeout=None): + ''' + Returns a generator to list the containers under the specified account. + The generator will lazily follow the continuation tokens returned by + the service and stop when all containers have been returned or num_results is reached. + + If num_results is specified and the account has more than that number of + containers, the generator will have a populated next_marker field once it + finishes. This marker can be used to create a new generator if more + results are desired. + + :param str prefix: + Filters the results to return only containers whose names + begin with the specified prefix. + :param int num_results: + Specifies the maximum number of containers to return. A single list + request may return up to 1000 contianers and potentially a continuation + token which should be followed to get additional resutls. + :param bool include_metadata: + Specifies that container metadata be returned in the response. + :param str marker: + An opaque continuation token. This value can be retrieved from the + next_marker field of a previous generator object if num_results was + specified and that generator has finished enumerating results. If + specified, this generator will begin returning results from the point + where the previous generator stopped. + :param int timeout: + The timeout parameter is expressed in seconds. + ''' + include = 'metadata' if include_metadata else None + operation_context = _OperationContext(location_lock=True) + kwargs = {'prefix': prefix, 'marker': marker, 'max_results': num_results, + 'include': include, 'timeout': timeout, '_context': operation_context} + resp = self._list_containers(**kwargs) + + return ListGenerator(resp, self._list_containers, (), kwargs) + + def _list_containers(self, prefix=None, marker=None, max_results=None, + include=None, timeout=None, _context=None): + ''' + Returns a list of the containers under the specified account. + + :param str prefix: + Filters the results to return only containers whose names + begin with the specified prefix. + :param str marker: + A string value that identifies the portion of the list + to be returned with the next list operation. The operation returns + a next_marker value within the response body if the list returned was + not complete. The marker value may then be used in a subsequent + call to request the next set of list items. The marker value is + opaque to the client. + :param int max_results: + Specifies the maximum number of containers to return. A single list + request may return up to 1000 contianers and potentially a continuation + token which should be followed to get additional resutls. + :param str include: + Include this parameter to specify that the container's + metadata be returned as part of the response body. set this + parameter to string 'metadata' to get container's metadata. + :param int timeout: + The timeout parameter is expressed in seconds. + ''' + request = HTTPRequest() + request.method = 'GET' + request.host_locations = self._get_host_locations(secondary=True) + request.path = _get_path() + request.query = { + 'comp': 'list', + 'prefix': _to_str(prefix), + 'marker': _to_str(marker), + 'maxresults': _int_to_str(max_results), + 'include': _to_str(include), + 'timeout': _int_to_str(timeout) + } + + return self._perform_request(request, _convert_xml_to_containers, operation_context=_context) + + def create_container(self, container_name, metadata=None, + public_access=None, fail_on_exist=False, timeout=None): + ''' + Creates a new container under the specified account. If the container + with the same name already exists, the operation fails if + fail_on_exist is True. + + :param str container_name: + Name of container to create. + :param metadata: + A dict with name_value pairs to associate with the + container as metadata. Example:{'Category':'test'} + :type metadata: dict(str, str) + :param ~azure.storage.blob.models.PublicAccess public_access: + Possible values include: container, blob. + :param bool fail_on_exist: + Specify whether to throw an exception when the container exists. + :param int timeout: + The timeout parameter is expressed in seconds. + :return: True if container is created, False if container already exists. + :rtype: bool + ''' + _validate_not_none('container_name', container_name) + request = HTTPRequest() + request.method = 'PUT' + request.host_locations = self._get_host_locations() + request.path = _get_path(container_name) + request.query = { + 'restype': 'container', + 'timeout': _int_to_str(timeout), + } + request.headers = { + 'x-ms-blob-public-access': _to_str(public_access) + } + _add_metadata_headers(metadata, request) + + if not fail_on_exist: + try: + self._perform_request(request) + return True + except AzureHttpError as ex: + _dont_fail_on_exist(ex) + return False + else: + self._perform_request(request) + return True + + def get_container_properties(self, container_name, lease_id=None, timeout=None): + ''' + Returns all user-defined metadata and system properties for the specified + container. The data returned does not include the container's list of blobs. + + :param str container_name: + Name of existing container. + :param str lease_id: + If specified, get_container_properties only succeeds if the + container's lease is active and matches this ID. + :param int timeout: + The timeout parameter is expressed in seconds. + :return: properties for the specified container within a container object. + :rtype: :class:`~azure.storage.blob.models.Container` + ''' + _validate_not_none('container_name', container_name) + request = HTTPRequest() + request.method = 'GET' + request.host_locations = self._get_host_locations(secondary=True) + request.path = _get_path(container_name) + request.query = { + 'restype': 'container', + 'timeout': _int_to_str(timeout), + } + request.headers = {'x-ms-lease-id': _to_str(lease_id)} + + return self._perform_request(request, _parse_container, [container_name]) + + def get_container_metadata(self, container_name, lease_id=None, timeout=None): + ''' + Returns all user-defined metadata for the specified container. + + :param str container_name: + Name of existing container. + :param str lease_id: + If specified, get_container_metadata only succeeds if the + container's lease is active and matches this ID. + :param int timeout: + The timeout parameter is expressed in seconds. + :return: + A dictionary representing the container metadata name, value pairs. + :rtype: dict(str, str) + ''' + _validate_not_none('container_name', container_name) + request = HTTPRequest() + request.method = 'GET' + request.host_locations = self._get_host_locations(secondary=True) + request.path = _get_path(container_name) + request.query = { + 'restype': 'container', + 'comp': 'metadata', + 'timeout': _int_to_str(timeout), + } + request.headers = {'x-ms-lease-id': _to_str(lease_id)} + + return self._perform_request(request, _parse_metadata) + + def set_container_metadata(self, container_name, metadata=None, + lease_id=None, if_modified_since=None, timeout=None): + ''' + Sets one or more user-defined name-value pairs for the specified + container. Each call to this operation replaces all existing metadata + attached to the container. To remove all metadata from the container, + call this operation with no metadata dict. + + :param str container_name: + Name of existing container. + :param metadata: + A dict containing name-value pairs to associate with the container as + metadata. Example: {'category':'test'} + :type metadata: dict(str, str) + :param str lease_id: + If specified, set_container_metadata only succeeds if the + container's lease is active and matches this ID. + :param datetime if_modified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only + if the resource has been modified since the specified time. + :param int timeout: + The timeout parameter is expressed in seconds. + :return: ETag and last modified properties for the updated Container + :rtype: :class:`~azure.storage.blob.models.ResourceProperties` + ''' + _validate_not_none('container_name', container_name) + request = HTTPRequest() + request.method = 'PUT' + request.host_locations = self._get_host_locations() + request.path = _get_path(container_name) + request.query = { + 'restype': 'container', + 'comp': 'metadata', + 'timeout': _int_to_str(timeout), + } + request.headers = { + 'If-Modified-Since': _datetime_to_utc_string(if_modified_since), + 'x-ms-lease-id': _to_str(lease_id), + } + _add_metadata_headers(metadata, request) + + return self._perform_request(request, _parse_base_properties) + + def get_container_acl(self, container_name, lease_id=None, timeout=None): + ''' + Gets the permissions for the specified container. + The permissions indicate whether container data may be accessed publicly. + + :param str container_name: + Name of existing container. + :param lease_id: + If specified, get_container_acl only succeeds if the + container's lease is active and matches this ID. + :param int timeout: + The timeout parameter is expressed in seconds. + :return: A dictionary of access policies associated with the container. dict of str to + :class:`azure.storage.common.models.AccessPolicy` and a public_access property + if public access is turned on + ''' + _validate_not_none('container_name', container_name) + request = HTTPRequest() + request.method = 'GET' + request.host_locations = self._get_host_locations(secondary=True) + request.path = _get_path(container_name) + request.query = { + 'restype': 'container', + 'comp': 'acl', + 'timeout': _int_to_str(timeout), + } + request.headers = {'x-ms-lease-id': _to_str(lease_id)} + + return self._perform_request(request, _convert_xml_to_signed_identifiers_and_access) + + def set_container_acl(self, container_name, signed_identifiers=None, + public_access=None, lease_id=None, + if_modified_since=None, if_unmodified_since=None, timeout=None): + ''' + Sets the permissions for the specified container or stored access + policies that may be used with Shared Access Signatures. The permissions + indicate whether blobs in a container may be accessed publicly. + + :param str container_name: + Name of existing container. + :param signed_identifiers: + A dictionary of access policies to associate with the container. The + dictionary may contain up to 5 elements. An empty dictionary + will clear the access policies set on the service. + :type signed_identifiers: dict(str, :class:`~azure.storage.common.models.AccessPolicy`) + :param ~azure.storage.blob.models.PublicAccess public_access: + Possible values include: container, blob. + :param str lease_id: + If specified, set_container_acl only succeeds if the + container's lease is active and matches this ID. + :param datetime if_modified_since: + A datetime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only + if the resource has been modified since the specified date/time. + :param datetime if_unmodified_since: + A datetime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only if + the resource has not been modified since the specified date/time. + :param int timeout: + The timeout parameter is expressed in seconds. + :return: ETag and last modified properties for the updated Container + :rtype: :class:`~azure.storage.blob.models.ResourceProperties` + ''' + _validate_not_none('container_name', container_name) + _validate_access_policies(signed_identifiers) + request = HTTPRequest() + request.method = 'PUT' + request.host_locations = self._get_host_locations() + request.path = _get_path(container_name) + request.query = { + 'restype': 'container', + 'comp': 'acl', + 'timeout': _int_to_str(timeout), + } + request.headers = { + 'x-ms-blob-public-access': _to_str(public_access), + 'If-Modified-Since': _datetime_to_utc_string(if_modified_since), + 'If-Unmodified-Since': _datetime_to_utc_string(if_unmodified_since), + 'x-ms-lease-id': _to_str(lease_id), + } + request.body = _get_request_body( + _convert_signed_identifiers_to_xml(signed_identifiers)) + + return self._perform_request(request, _parse_base_properties) + + def delete_container(self, container_name, fail_not_exist=False, + lease_id=None, if_modified_since=None, + if_unmodified_since=None, timeout=None): + ''' + Marks the specified container for deletion. The container and any blobs + contained within it are later deleted during garbage collection. + + :param str container_name: + Name of container to delete. + :param bool fail_not_exist: + Specify whether to throw an exception when the container doesn't + exist. + :param str lease_id: + If specified, delete_container only succeeds if the + container's lease is active and matches this ID. + Required if the container has an active lease. + :param datetime if_modified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only + if the resource has been modified since the specified time. + :param datetime if_unmodified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only if + the resource has not been modified since the specified date/time. + :param int timeout: + The timeout parameter is expressed in seconds. + :return: True if container is deleted, False container doesn't exist. + :rtype: bool + ''' + _validate_not_none('container_name', container_name) + request = HTTPRequest() + request.method = 'DELETE' + request.host_locations = self._get_host_locations() + request.path = _get_path(container_name) + request.query = { + 'restype': 'container', + 'timeout': _int_to_str(timeout), + } + request.headers = { + 'x-ms-lease-id': _to_str(lease_id), + 'If-Modified-Since': _datetime_to_utc_string(if_modified_since), + 'If-Unmodified-Since': _datetime_to_utc_string(if_unmodified_since), + } + + if not fail_not_exist: + try: + self._perform_request(request) + return True + except AzureHttpError as ex: + _dont_fail_not_exist(ex) + return False + else: + self._perform_request(request) + return True + + def _lease_container_impl( + self, container_name, lease_action, lease_id, lease_duration, + lease_break_period, proposed_lease_id, if_modified_since, + if_unmodified_since, timeout): + ''' + Establishes and manages a lease on a container. + The Lease Container operation can be called in one of five modes + Acquire, to request a new lease + Renew, to renew an existing lease + Change, to change the ID of an existing lease + Release, to free the lease if it is no longer needed so that another + client may immediately acquire a lease against the container + Break, to end the lease but ensure that another client cannot acquire + a new lease until the current lease period has expired + + :param str container_name: + Name of existing container. + :param str lease_action: + Possible _LeaseActions values: acquire|renew|release|break|change + :param str lease_id: + Required if the container has an active lease. + :param int lease_duration: + Specifies the duration of the lease, in seconds, or negative one + (-1) for a lease that never expires. A non-infinite lease can be + between 15 and 60 seconds. A lease duration cannot be changed + using renew or change. For backwards compatibility, the default is + 60, and the value is only used on an acquire operation. + :param int lease_break_period: + For a break operation, this is the proposed duration of + seconds that the lease should continue before it is broken, between + 0 and 60 seconds. This break period is only used if it is shorter + than the time remaining on the lease. If longer, the time remaining + on the lease is used. A new lease will not be available before the + break period has expired, but the lease may be held for longer than + the break period. If this header does not appear with a break + operation, a fixed-duration lease breaks after the remaining lease + period elapses, and an infinite lease breaks immediately. + :param str proposed_lease_id: + Optional for Acquire, required for Change. Proposed lease ID, in a + GUID string format. The Blob service returns 400 (Invalid request) + if the proposed lease ID is not in the correct format. + :param datetime if_modified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only + if the resource has been modified since the specified time. + :param datetime if_unmodified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only if + the resource has not been modified since the specified date/time. + :param int timeout: + The timeout parameter is expressed in seconds. + :return: + Response headers returned from the service call. + :rtype: dict(str, str) + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('lease_action', lease_action) + request = HTTPRequest() + request.method = 'PUT' + request.host_locations = self._get_host_locations() + request.path = _get_path(container_name) + request.query = { + 'restype': 'container', + 'comp': 'lease', + 'timeout': _int_to_str(timeout), + } + request.headers = { + 'x-ms-lease-id': _to_str(lease_id), + 'x-ms-lease-action': _to_str(lease_action), + 'x-ms-lease-duration': _to_str(lease_duration), + 'x-ms-lease-break-period': _to_str(lease_break_period), + 'x-ms-proposed-lease-id': _to_str(proposed_lease_id), + 'If-Modified-Since': _datetime_to_utc_string(if_modified_since), + 'If-Unmodified-Since': _datetime_to_utc_string(if_unmodified_since), + } + + return self._perform_request(request, _parse_lease) + + def acquire_container_lease( + self, container_name, lease_duration=-1, proposed_lease_id=None, + if_modified_since=None, if_unmodified_since=None, timeout=None): + ''' + Requests a new lease. If the container does not have an active lease, + the Blob service creates a lease on the container and returns a new + lease ID. + + :param str container_name: + Name of existing container. + :param int lease_duration: + Specifies the duration of the lease, in seconds, or negative one + (-1) for a lease that never expires. A non-infinite lease can be + between 15 and 60 seconds. A lease duration cannot be changed + using renew or change. Default is -1 (infinite lease). + :param str proposed_lease_id: + Proposed lease ID, in a GUID string format. The Blob service returns + 400 (Invalid request) if the proposed lease ID is not in the correct format. + :param datetime if_modified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only + if the resource has been modified since the specified time. + :param datetime if_unmodified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only if + the resource has not been modified since the specified date/time. + :param int timeout: + The timeout parameter is expressed in seconds. + :return: the lease ID of the newly created lease. + :return: str + ''' + _validate_not_none('lease_duration', lease_duration) + if lease_duration is not -1 and \ + (lease_duration < 15 or lease_duration > 60): + raise ValueError(_ERROR_INVALID_LEASE_DURATION) + + lease = self._lease_container_impl(container_name, + _LeaseActions.Acquire, + None, # lease_id + lease_duration, + None, # lease_break_period + proposed_lease_id, + if_modified_since, + if_unmodified_since, + timeout) + return lease['id'] + + def renew_container_lease( + self, container_name, lease_id, if_modified_since=None, + if_unmodified_since=None, timeout=None): + ''' + Renews the lease. The lease can be renewed if the lease ID specified + matches that associated with the container. Note that + the lease may be renewed even if it has expired as long as the container + has not been leased again since the expiration of that lease. When you + renew a lease, the lease duration clock resets. + + :param str container_name: + Name of existing container. + :param str lease_id: + Lease ID for active lease. + :param datetime if_modified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only + if the resource has been modified since the specified time. + :param datetime if_unmodified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only if + the resource has not been modified since the specified date/time. + :param int timeout: + The timeout parameter is expressed in seconds. + :return: the lease ID of the renewed lease. + :return: str + ''' + _validate_not_none('lease_id', lease_id) + + lease = self._lease_container_impl(container_name, + _LeaseActions.Renew, + lease_id, + None, # lease_duration + None, # lease_break_period + None, # proposed_lease_id + if_modified_since, + if_unmodified_since, + timeout) + return lease['id'] + + def release_container_lease( + self, container_name, lease_id, if_modified_since=None, + if_unmodified_since=None, timeout=None): + ''' + Release the lease. The lease may be released if the lease_id specified matches + that associated with the container. Releasing the lease allows another client + to immediately acquire the lease for the container as soon as the release is complete. + + :param str container_name: + Name of existing container. + :param str lease_id: + Lease ID for active lease. + :param datetime if_modified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only + if the resource has been modified since the specified time. + :param datetime if_unmodified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only if + the resource has not been modified since the specified date/time. + :param int timeout: + The timeout parameter is expressed in seconds. + ''' + _validate_not_none('lease_id', lease_id) + + self._lease_container_impl(container_name, + _LeaseActions.Release, + lease_id, + None, # lease_duration + None, # lease_break_period + None, # proposed_lease_id + if_modified_since, + if_unmodified_since, + timeout) + + def break_container_lease( + self, container_name, lease_break_period=None, + if_modified_since=None, if_unmodified_since=None, timeout=None): + ''' + Break the lease, if the container has an active lease. Once a lease is + broken, it cannot be renewed. Any authorized request can break the lease; + the request is not required to specify a matching lease ID. When a lease + is broken, the lease break period is allowed to elapse, during which time + no lease operation except break and release can be performed on the container. + When a lease is successfully broken, the response indicates the interval + in seconds until a new lease can be acquired. + + :param str container_name: + Name of existing container. + :param int lease_break_period: + This is the proposed duration of seconds that the lease + should continue before it is broken, between 0 and 60 seconds. This + break period is only used if it is shorter than the time remaining + on the lease. If longer, the time remaining on the lease is used. + A new lease will not be available before the break period has + expired, but the lease may be held for longer than the break + period. If this header does not appear with a break + operation, a fixed-duration lease breaks after the remaining lease + period elapses, and an infinite lease breaks immediately. + :param datetime if_modified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only + if the resource has been modified since the specified time. + :param datetime if_unmodified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only if + the resource has not been modified since the specified date/time. + :param int timeout: + The timeout parameter is expressed in seconds. + :return: Approximate time remaining in the lease period, in seconds. + :return: int + ''' + if (lease_break_period is not None) and (lease_break_period < 0 or lease_break_period > 60): + raise ValueError(_ERROR_INVALID_LEASE_BREAK_PERIOD) + + lease = self._lease_container_impl(container_name, + _LeaseActions.Break, + None, # lease_id + None, # lease_duration + lease_break_period, + None, # proposed_lease_id + if_modified_since, + if_unmodified_since, + timeout) + return lease['time'] + + def change_container_lease( + self, container_name, lease_id, proposed_lease_id, + if_modified_since=None, if_unmodified_since=None, timeout=None): + ''' + Change the lease ID of an active lease. A change must include the current + lease ID and a new lease ID. + + :param str container_name: + Name of existing container. + :param str lease_id: + Lease ID for active lease. + :param str proposed_lease_id: + Proposed lease ID, in a GUID string format. The Blob service returns 400 + (Invalid request) if the proposed lease ID is not in the correct format. + :param datetime if_modified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only + if the resource has been modified since the specified time. + :param datetime if_unmodified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only if + the resource has not been modified since the specified date/time. + :param int timeout: + The timeout parameter is expressed in seconds. + ''' + _validate_not_none('lease_id', lease_id) + + self._lease_container_impl(container_name, + _LeaseActions.Change, + lease_id, + None, # lease_duration + None, # lease_break_period + proposed_lease_id, + if_modified_since, + if_unmodified_since, + timeout) + + def list_blobs(self, container_name, prefix=None, num_results=None, include=None, + delimiter=None, marker=None, timeout=None): + ''' + Returns a generator to list the blobs under the specified container. + The generator will lazily follow the continuation tokens returned by + the service and stop when all blobs have been returned or num_results is reached. + + If num_results is specified and the account has more than that number of + blobs, the generator will have a populated next_marker field once it + finishes. This marker can be used to create a new generator if more + results are desired. + + :param str container_name: + Name of existing container. + :param str prefix: + Filters the results to return only blobs whose names + begin with the specified prefix. + :param int num_results: + Specifies the maximum number of blobs to return, + including all :class:`BlobPrefix` elements. If the request does not specify + num_results or specifies a value greater than 5,000, the server will + return up to 5,000 items. Setting num_results to a value less than + or equal to zero results in error response code 400 (Bad Request). + :param ~azure.storage.blob.models.Include include: + Specifies one or more additional datasets to include in the response. + :param str delimiter: + When the request includes this parameter, the operation + returns a :class:`~azure.storage.blob.models.BlobPrefix` element in the + result list that acts as a placeholder for all blobs whose names begin + with the same substring up to the appearance of the delimiter character. + The delimiter may be a single character or a string. + :param str marker: + An opaque continuation token. This value can be retrieved from the + next_marker field of a previous generator object if num_results was + specified and that generator has finished enumerating results. If + specified, this generator will begin returning results from the point + where the previous generator stopped. + :param int timeout: + The timeout parameter is expressed in seconds. + ''' + operation_context = _OperationContext(location_lock=True) + args = (container_name,) + kwargs = {'prefix': prefix, 'marker': marker, 'max_results': num_results, + 'include': include, 'delimiter': delimiter, 'timeout': timeout, + '_context': operation_context} + resp = self._list_blobs(*args, **kwargs) + + return ListGenerator(resp, self._list_blobs, args, kwargs) + + def _list_blobs(self, container_name, prefix=None, marker=None, + max_results=None, include=None, delimiter=None, timeout=None, + _context=None): + ''' + Returns the list of blobs under the specified container. + + :param str container_name: + Name of existing container. + :parm str prefix: + Filters the results to return only blobs whose names + begin with the specified prefix. + :param str marker: + A string value that identifies the portion of the list + to be returned with the next list operation. The operation returns + a next_marker value within the response body if the list returned was + not complete. The marker value may then be used in a subsequent + call to request the next set of list items. The marker value is + opaque to the client. + :param int max_results: + Specifies the maximum number of blobs to return, + including all :class:`~azure.storage.blob.models.BlobPrefix` elements. If the request does not specify + max_results or specifies a value greater than 5,000, the server will + return up to 5,000 items. Setting max_results to a value less than + or equal to zero results in error response code 400 (Bad Request). + :param str include: + Specifies one or more datasets to include in the + response. To specify more than one of these options on the URI, + you must separate each option with a comma. Valid values are: + snapshots: + Specifies that snapshots should be included in the + enumeration. Snapshots are listed from oldest to newest in + the response. + metadata: + Specifies that blob metadata be returned in the response. + uncommittedblobs: + Specifies that blobs for which blocks have been uploaded, + but which have not been committed using Put Block List + (REST API), be included in the response. + copy: + Version 2012-02-12 and newer. Specifies that metadata + related to any current or previous Copy Blob operation + should be included in the response. + deleted: + Version 2017-07-29 and newer. Specifies that soft deleted blobs + which are retained by the service should be included + in the response. + :param str delimiter: + When the request includes this parameter, the operation + returns a :class:`~azure.storage.blob.models.BlobPrefix` element in the response body that acts as a + placeholder for all blobs whose names begin with the same + substring up to the appearance of the delimiter character. The + delimiter may be a single character or a string. + :param int timeout: + The timeout parameter is expressed in seconds. + ''' + _validate_not_none('container_name', container_name) + request = HTTPRequest() + request.method = 'GET' + request.host_locations = self._get_host_locations(secondary=True) + request.path = _get_path(container_name) + request.query = { + 'restype': 'container', + 'comp': 'list', + 'prefix': _to_str(prefix), + 'delimiter': _to_str(delimiter), + 'marker': _to_str(marker), + 'maxresults': _int_to_str(max_results), + 'include': _to_str(include), + 'timeout': _int_to_str(timeout), + } + + return self._perform_request(request, _convert_xml_to_blob_list, operation_context=_context) + + def get_blob_service_stats(self, timeout=None): + ''' + Retrieves statistics related to replication for the Blob service. It is + only available when read-access geo-redundant replication is enabled for + the storage account. + + With geo-redundant replication, Azure Storage maintains your data durable + in two locations. In both locations, Azure Storage constantly maintains + multiple healthy replicas of your data. The location where you read, + create, update, or delete data is the primary storage account location. + The primary location exists in the region you choose at the time you + create an account via the Azure Management Azure classic portal, for + example, North Central US. The location to which your data is replicated + is the secondary location. The secondary location is automatically + determined based on the location of the primary; it is in a second data + center that resides in the same region as the primary location. Read-only + access is available from the secondary location, if read-access geo-redundant + replication is enabled for your storage account. + + :param int timeout: + The timeout parameter is expressed in seconds. + :return: The blob service stats. + :rtype: :class:`~azure.storage.common.models.ServiceStats` + ''' + request = HTTPRequest() + request.method = 'GET' + request.host_locations = self._get_host_locations(primary=False, secondary=True) + request.path = _get_path() + request.query = { + 'restype': 'service', + 'comp': 'stats', + 'timeout': _int_to_str(timeout), + } + + return self._perform_request(request, _convert_xml_to_service_stats) + + def set_blob_service_properties( + self, logging=None, hour_metrics=None, minute_metrics=None, + cors=None, target_version=None, timeout=None, delete_retention_policy=None): + ''' + Sets the properties of a storage account's Blob service, including + Azure Storage Analytics. If an element (ex Logging) is left as None, the + existing settings on the service for that functionality are preserved. + + :param logging: + Groups the Azure Analytics Logging settings. + :type logging: + :class:`~azure.storage.common.models.Logging` + :param hour_metrics: + The hour metrics settings provide a summary of request + statistics grouped by API in hourly aggregates for blobs. + :type hour_metrics: + :class:`~azure.storage.common.models.Metrics` + :param minute_metrics: + The minute metrics settings provide request statistics + for each minute for blobs. + :type minute_metrics: + :class:`~azure.storage.common.models.Metrics` + :param cors: + You can include up to five CorsRule elements in the + list. If an empty list is specified, all CORS rules will be deleted, + and CORS will be disabled for the service. + :type cors: list(:class:`~azure.storage.common.models.CorsRule`) + :param str target_version: + Indicates the default version to use for requests if an incoming + request's version is not specified. + :param int timeout: + The timeout parameter is expressed in seconds. + :param delete_retention_policy: + The delete retention policy specifies whether to retain deleted blobs. + It also specifies the number of days and versions of blob to keep. + :type delete_retention_policy: + :class:`~azure.storage.common.models.DeleteRetentionPolicy` + ''' + request = HTTPRequest() + request.method = 'PUT' + request.host_locations = self._get_host_locations() + request.path = _get_path() + request.query = { + 'restype': 'service', + 'comp': 'properties', + 'timeout': _int_to_str(timeout), + } + request.body = _get_request_body( + _convert_service_properties_to_xml(logging, hour_metrics, minute_metrics, + cors, target_version, delete_retention_policy)) + + self._perform_request(request) + + def get_blob_service_properties(self, timeout=None): + ''' + Gets the properties of a storage account's Blob service, including + Azure Storage Analytics. + + :param int timeout: + The timeout parameter is expressed in seconds. + :return: The blob :class:`~azure.storage.common.models.ServiceProperties` with an attached + target_version property. + ''' + request = HTTPRequest() + request.method = 'GET' + request.host_locations = self._get_host_locations(secondary=True) + request.path = _get_path() + request.query = { + 'restype': 'service', + 'comp': 'properties', + 'timeout': _int_to_str(timeout), + } + + return self._perform_request(request, _convert_xml_to_service_properties) + + def get_blob_properties( + self, container_name, blob_name, snapshot=None, lease_id=None, + if_modified_since=None, if_unmodified_since=None, if_match=None, + if_none_match=None, timeout=None): + ''' + Returns all user-defined metadata, standard HTTP properties, and + system properties for the blob. It does not return the content of the blob. + Returns :class:`~azure.storage.blob.models.Blob` + with :class:`~azure.storage.blob.models.BlobProperties` and a metadata dict. + + :param str container_name: + Name of existing container. + :param str blob_name: + Name of existing blob. + :param str snapshot: + The snapshot parameter is an opaque DateTime value that, + when present, specifies the blob snapshot to retrieve. + :param str lease_id: + Required if the blob has an active lease. + :param datetime if_modified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only + if the resource has been modified since the specified time. + :param datetime if_unmodified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only if + the resource has not been modified since the specified date/time. + :param str if_match: + An ETag value, or the wildcard character (*). Specify this header to perform + the operation only if the resource's ETag matches the value specified. + :param str if_none_match: + An ETag value, or the wildcard character (*). Specify this header + to perform the operation only if the resource's ETag does not match + the value specified. Specify the wildcard character (*) to perform + the operation only if the resource does not exist, and fail the + operation if it does exist. + :param int timeout: + The timeout parameter is expressed in seconds. + :return: a blob object including properties and metadata. + :rtype: :class:`~azure.storage.blob.models.Blob` + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + request = HTTPRequest() + request.method = 'HEAD' + request.host_locations = self._get_host_locations(secondary=True) + request.path = _get_path(container_name, blob_name) + request.query = { + 'snapshot': _to_str(snapshot), + 'timeout': _int_to_str(timeout), + } + request.headers = { + 'x-ms-lease-id': _to_str(lease_id), + 'If-Modified-Since': _datetime_to_utc_string(if_modified_since), + 'If-Unmodified-Since': _datetime_to_utc_string(if_unmodified_since), + 'If-Match': _to_str(if_match), + 'If-None-Match': _to_str(if_none_match), + } + + return self._perform_request(request, _parse_blob, [blob_name, snapshot]) + + def set_blob_properties( + self, container_name, blob_name, content_settings=None, lease_id=None, + if_modified_since=None, if_unmodified_since=None, if_match=None, + if_none_match=None, timeout=None): + ''' + Sets system properties on the blob. If one property is set for the + content_settings, all properties will be overriden. + + :param str container_name: + Name of existing container. + :param str blob_name: + Name of existing blob. + :param ~azure.storage.blob.models.ContentSettings content_settings: + ContentSettings object used to set blob properties. + :param str lease_id: + Required if the blob has an active lease. + :param datetime if_modified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only + if the resource has been modified since the specified time. + :param datetime if_unmodified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only if + the resource has not been modified since the specified date/time. + :param str if_match: + An ETag value, or the wildcard character (*). Specify this header to perform + the operation only if the resource's ETag matches the value specified. + :param str if_none_match: + An ETag value, or the wildcard character (*). Specify this header + to perform the operation only if the resource's ETag does not match + the value specified. Specify the wildcard character (*) to perform + the operation only if the resource does not exist, and fail the + operation if it does exist. + :param int timeout: + The timeout parameter is expressed in seconds. + :return: ETag and last modified properties for the updated Blob + :rtype: :class:`~azure.storage.blob.models.ResourceProperties` + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + request = HTTPRequest() + request.method = 'PUT' + request.host_locations = self._get_host_locations() + request.path = _get_path(container_name, blob_name) + request.query = { + 'comp': 'properties', + 'timeout': _int_to_str(timeout), + } + request.headers = { + 'If-Modified-Since': _datetime_to_utc_string(if_modified_since), + 'If-Unmodified-Since': _datetime_to_utc_string(if_unmodified_since), + 'If-Match': _to_str(if_match), + 'If-None-Match': _to_str(if_none_match), + 'x-ms-lease-id': _to_str(lease_id) + } + if content_settings is not None: + request.headers.update(content_settings._to_headers()) + + return self._perform_request(request, _parse_base_properties) + + def exists(self, container_name, blob_name=None, snapshot=None, timeout=None): + ''' + Returns a boolean indicating whether the container exists (if blob_name + is None), or otherwise a boolean indicating whether the blob exists. + + :param str container_name: + Name of a container. + :param str blob_name: + Name of a blob. If None, the container will be checked for existence. + :param str snapshot: + The snapshot parameter is an opaque DateTime value that, + when present, specifies the snapshot. + :param int timeout: + The timeout parameter is expressed in seconds. + :return: A boolean indicating whether the resource exists. + :rtype: bool + ''' + _validate_not_none('container_name', container_name) + try: + if blob_name is None: + self.get_container_properties(container_name, timeout=timeout) + else: + self.get_blob_properties(container_name, blob_name, snapshot=snapshot, timeout=timeout) + return True + except AzureHttpError as ex: + _dont_fail_not_exist(ex) + return False + + def _get_blob( + self, container_name, blob_name, snapshot=None, start_range=None, + end_range=None, validate_content=False, lease_id=None, if_modified_since=None, + if_unmodified_since=None, if_match=None, if_none_match=None, timeout=None, + _context=None): + ''' + Downloads a blob's content, metadata, and properties. You can also + call this API to read a snapshot. You can specify a range if you don't + need to download the blob in its entirety. If no range is specified, + the full blob will be downloaded. + + See get_blob_to_* for high level functions that handle the download + of large blobs with automatic chunking and progress notifications. + + :param str container_name: + Name of existing container. + :param str blob_name: + Name of existing blob. + :param str snapshot: + The snapshot parameter is an opaque DateTime value that, + when present, specifies the blob snapshot to retrieve. + :param int start_range: + Start of byte range to use for downloading a section of the blob. + If no end_range is given, all bytes after the start_range will be downloaded. + The start_range and end_range params are inclusive. + Ex: start_range=0, end_range=511 will download first 512 bytes of blob. + :param int end_range: + End of byte range to use for downloading a section of the blob. + If end_range is given, start_range must be provided. + The start_range and end_range params are inclusive. + Ex: start_range=0, end_range=511 will download first 512 bytes of blob. + :param bool validate_content: + When this is set to True and specified together with the Range header, + the service returns the MD5 hash for the range, as long as the range + is less than or equal to 4 MB in size. + :param str lease_id: + Required if the blob has an active lease. + :param datetime if_modified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only + if the resource has been modified since the specified time. + :param datetime if_unmodified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only if + the resource has not been modified since the specified date/time. + :param str if_match: + An ETag value, or the wildcard character (*). Specify this header to perform + the operation only if the resource's ETag matches the value specified. + :param str if_none_match: + An ETag value, or the wildcard character (*). Specify this header + to perform the operation only if the resource's ETag does not match + the value specified. Specify the wildcard character (*) to perform + the operation only if the resource does not exist, and fail the + operation if it does exist. + :param int timeout: + The timeout parameter is expressed in seconds. + :return: A Blob with content, properties, and metadata. + :rtype: :class:`~azure.storage.blob.models.Blob` + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + _validate_decryption_required(self.require_encryption, + self.key_encryption_key, + self.key_resolver_function) + + start_offset, end_offset = 0, 0 + if self.key_encryption_key is not None or self.key_resolver_function is not None: + if start_range is not None: + # Align the start of the range along a 16 byte block + start_offset = start_range % 16 + start_range -= start_offset + + # Include an extra 16 bytes for the IV if necessary + # Because of the previous offsetting, start_range will always + # be a multiple of 16. + if start_range > 0: + start_offset += 16 + start_range -= 16 + + if end_range is not None: + # Align the end of the range along a 16 byte block + end_offset = 15 - (end_range % 16) + end_range += end_offset + + request = HTTPRequest() + request.method = 'GET' + request.host_locations = self._get_host_locations(secondary=True) + request.path = _get_path(container_name, blob_name) + request.query = { + 'snapshot': _to_str(snapshot), + 'timeout': _int_to_str(timeout), + } + request.headers = { + 'x-ms-lease-id': _to_str(lease_id), + 'If-Modified-Since': _datetime_to_utc_string(if_modified_since), + 'If-Unmodified-Since': _datetime_to_utc_string(if_unmodified_since), + 'If-Match': _to_str(if_match), + 'If-None-Match': _to_str(if_none_match), + } + _validate_and_format_range_headers( + request, + start_range, + end_range, + start_range_required=False, + end_range_required=False, + check_content_md5=validate_content) + + return self._perform_request(request, _parse_blob, + [blob_name, snapshot, validate_content, self.require_encryption, + self.key_encryption_key, self.key_resolver_function, + start_offset, end_offset], + operation_context=_context) + + def get_blob_to_path( + self, container_name, blob_name, file_path, open_mode='wb', + snapshot=None, start_range=None, end_range=None, + validate_content=False, progress_callback=None, + max_connections=2, lease_id=None, if_modified_since=None, + if_unmodified_since=None, if_match=None, if_none_match=None, + timeout=None): + ''' + Downloads a blob to a file path, with automatic chunking and progress + notifications. Returns an instance of :class:`~azure.storage.blob.models.Blob` with + properties and metadata. + + :param str container_name: + Name of existing container. + :param str blob_name: + Name of existing blob. + :param str file_path: + Path of file to write out to. + :param str open_mode: + Mode to use when opening the file. Note that specifying append only + open_mode prevents parallel download. So, max_connections must be set + to 1 if this open_mode is used. + :param str snapshot: + The snapshot parameter is an opaque DateTime value that, + when present, specifies the blob snapshot to retrieve. + :param int start_range: + Start of byte range to use for downloading a section of the blob. + If no end_range is given, all bytes after the start_range will be downloaded. + The start_range and end_range params are inclusive. + Ex: start_range=0, end_range=511 will download first 512 bytes of blob. + :param int end_range: + End of byte range to use for downloading a section of the blob. + If end_range is given, start_range must be provided. + The start_range and end_range params are inclusive. + Ex: start_range=0, end_range=511 will download first 512 bytes of blob. + :param bool validate_content: + If set to true, validates an MD5 hash for each retrieved portion of + the blob. This is primarily valuable for detecting bitflips on the wire + if using http instead of https as https (the default) will already + validate. Note that the service will only return transactional MD5s + for chunks 4MB or less so the first get request will be of size + self.MAX_CHUNK_GET_SIZE instead of self.MAX_SINGLE_GET_SIZE. If + self.MAX_CHUNK_GET_SIZE was set to greater than 4MB an error will be + thrown. As computing the MD5 takes processing time and more requests + will need to be done due to the reduced chunk size there may be some + increase in latency. + :param progress_callback: + Callback for progress with signature function(current, total) + where current is the number of bytes transfered so far, and total is + the size of the blob if known. + :type progress_callback: func(current, total) + :param int max_connections: + If set to 2 or greater, an initial get will be done for the first + self.MAX_SINGLE_GET_SIZE bytes of the blob. If this is the entire blob, + the method returns at this point. If it is not, it will download the + remaining data parallel using the number of threads equal to + max_connections. Each chunk will be of size self.MAX_CHUNK_GET_SIZE. + If set to 1, a single large get request will be done. This is not + generally recommended but available if very few threads should be + used, network requests are very expensive, or a non-seekable stream + prevents parallel download. This may also be useful if many blobs are + expected to be empty as an extra request is required for empty blobs + if max_connections is greater than 1. + :param str lease_id: + Required if the blob has an active lease. + :param datetime if_modified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only + if the resource has been modified since the specified time. + :param datetime if_unmodified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only if + the resource has not been modified since the specified date/time. + :param str if_match: + An ETag value, or the wildcard character (*). Specify this header to perform + the operation only if the resource's ETag matches the value specified. + :param str if_none_match: + An ETag value, or the wildcard character (*). Specify this header + to perform the operation only if the resource's ETag does not match + the value specified. Specify the wildcard character (*) to perform + the operation only if the resource does not exist, and fail the + operation if it does exist. + :param int timeout: + The timeout parameter is expressed in seconds. This method may make + multiple calls to the Azure service and the timeout will apply to + each call individually. + :return: A Blob with properties and metadata. If max_connections is greater + than 1, the content_md5 (if set on the blob) will not be returned. If you + require this value, either use get_blob_properties or set max_connections + to 1. + :rtype: :class:`~azure.storage.blob.models.Blob` + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + _validate_not_none('file_path', file_path) + _validate_not_none('open_mode', open_mode) + + if max_connections > 1 and 'a' in open_mode: + raise ValueError(_ERROR_PARALLEL_NOT_SEEKABLE) + + with open(file_path, open_mode) as stream: + blob = self.get_blob_to_stream( + container_name, + blob_name, + stream, + snapshot, + start_range, + end_range, + validate_content, + progress_callback, + max_connections, + lease_id, + if_modified_since, + if_unmodified_since, + if_match, + if_none_match, + timeout) + + return blob + + def get_blob_to_stream( + self, container_name, blob_name, stream, snapshot=None, + start_range=None, end_range=None, validate_content=False, + progress_callback=None, max_connections=2, lease_id=None, + if_modified_since=None, if_unmodified_since=None, if_match=None, + if_none_match=None, timeout=None): + + ''' + Downloads a blob to a stream, with automatic chunking and progress + notifications. Returns an instance of :class:`~azure.storage.blob.models.Blob` with + properties and metadata. + + :param str container_name: + Name of existing container. + :param str blob_name: + Name of existing blob. + :param io.IOBase stream: + Opened stream to write to. + :param str snapshot: + The snapshot parameter is an opaque DateTime value that, + when present, specifies the blob snapshot to retrieve. + :param int start_range: + Start of byte range to use for downloading a section of the blob. + If no end_range is given, all bytes after the start_range will be downloaded. + The start_range and end_range params are inclusive. + Ex: start_range=0, end_range=511 will download first 512 bytes of blob. + :param int end_range: + End of byte range to use for downloading a section of the blob. + If end_range is given, start_range must be provided. + The start_range and end_range params are inclusive. + Ex: start_range=0, end_range=511 will download first 512 bytes of blob. + :param bool validate_content: + If set to true, validates an MD5 hash for each retrieved portion of + the blob. This is primarily valuable for detecting bitflips on the wire + if using http instead of https as https (the default) will already + validate. Note that the service will only return transactional MD5s + for chunks 4MB or less so the first get request will be of size + self.MAX_CHUNK_GET_SIZE instead of self.MAX_SINGLE_GET_SIZE. If + self.MAX_CHUNK_GET_SIZE was set to greater than 4MB an error will be + thrown. As computing the MD5 takes processing time and more requests + will need to be done due to the reduced chunk size there may be some + increase in latency. + :param progress_callback: + Callback for progress with signature function(current, total) + where current is the number of bytes transfered so far, and total is + the size of the blob if known. + :type progress_callback: func(current, total) + :param int max_connections: + If set to 2 or greater, an initial get will be done for the first + self.MAX_SINGLE_GET_SIZE bytes of the blob. If this is the entire blob, + the method returns at this point. If it is not, it will download the + remaining data parallel using the number of threads equal to + max_connections. Each chunk will be of size self.MAX_CHUNK_GET_SIZE. + If set to 1, a single large get request will be done. This is not + generally recommended but available if very few threads should be + used, network requests are very expensive, or a non-seekable stream + prevents parallel download. This may also be useful if many blobs are + expected to be empty as an extra request is required for empty blobs + if max_connections is greater than 1. + :param str lease_id: + Required if the blob has an active lease. + :param datetime if_modified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only + if the resource has been modified since the specified time. + :param datetime if_unmodified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only if + the resource has not been modified since the specified date/time. + :param str if_match: + An ETag value, or the wildcard character (*). Specify this header to perform + the operation only if the resource's ETag matches the value specified. + :param str if_none_match: + An ETag value, or the wildcard character (*). Specify this header + to perform the operation only if the resource's ETag does not match + the value specified. Specify the wildcard character (*) to perform + the operation only if the resource does not exist, and fail the + operation if it does exist. + :param int timeout: + The timeout parameter is expressed in seconds. This method may make + multiple calls to the Azure service and the timeout will apply to + each call individually. + :return: A Blob with properties and metadata. If max_connections is greater + than 1, the content_md5 (if set on the blob) will not be returned. If you + require this value, either use get_blob_properties or set max_connections + to 1. + :rtype: :class:`~azure.storage.blob.models.Blob` + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + _validate_not_none('stream', stream) + + if end_range is not None: + _validate_not_none("start_range", start_range) + + # If the user explicitly sets max_connections to 1, do a single shot download + if max_connections == 1: + blob = self._get_blob(container_name, + blob_name, + snapshot, + start_range=start_range, + end_range=end_range, + validate_content=validate_content, + lease_id=lease_id, + if_modified_since=if_modified_since, + if_unmodified_since=if_unmodified_since, + if_match=if_match, + if_none_match=if_none_match, + timeout=timeout) + + # Set the download size + download_size = blob.properties.content_length + + # If max_connections is greater than 1, do the first get to establish the + # size of the blob and get the first segment of data + else: + if sys.version_info >= (3,) and not stream.seekable(): + raise ValueError(_ERROR_PARALLEL_NOT_SEEKABLE) + + # The service only provides transactional MD5s for chunks under 4MB. + # If validate_content is on, get only self.MAX_CHUNK_GET_SIZE for the first + # chunk so a transactional MD5 can be retrieved. + first_get_size = self.MAX_SINGLE_GET_SIZE if not validate_content else self.MAX_CHUNK_GET_SIZE + + initial_request_start = start_range if start_range is not None else 0 + + if end_range is not None and end_range - start_range < first_get_size: + initial_request_end = end_range + else: + initial_request_end = initial_request_start + first_get_size - 1 + + # Send a context object to make sure we always retry to the initial location + operation_context = _OperationContext(location_lock=True) + try: + blob = self._get_blob(container_name, + blob_name, + snapshot, + start_range=initial_request_start, + end_range=initial_request_end, + validate_content=validate_content, + lease_id=lease_id, + if_modified_since=if_modified_since, + if_unmodified_since=if_unmodified_since, + if_match=if_match, + if_none_match=if_none_match, + timeout=timeout, + _context=operation_context) + + # Parse the total blob size and adjust the download size if ranges + # were specified + blob_size = _parse_length_from_content_range(blob.properties.content_range) + if end_range is not None: + # Use the end_range unless it is over the end of the blob + download_size = min(blob_size, end_range - start_range + 1) + elif start_range is not None: + download_size = blob_size - start_range + else: + download_size = blob_size + except AzureHttpError as ex: + if start_range is None and ex.status_code == 416: + # Get range will fail on an empty blob. If the user did not + # request a range, do a regular get request in order to get + # any properties. + blob = self._get_blob(container_name, + blob_name, + snapshot, + validate_content=validate_content, + lease_id=lease_id, + if_modified_since=if_modified_since, + if_unmodified_since=if_unmodified_since, + if_match=if_match, + if_none_match=if_none_match, + timeout=timeout, + _context=operation_context) + + # Set the download size to empty + download_size = 0 + else: + raise ex + + # Mark the first progress chunk. If the blob is small or this is a single + # shot download, this is the only call + if progress_callback: + progress_callback(blob.properties.content_length, download_size) + + # Write the content to the user stream + # Clear blob content since output has been written to user stream + if blob.content is not None: + stream.write(blob.content) + blob.content = None + + # If the blob is small or single shot download was used, the download is + # complete at this point. If blob size is large, use parallel download. + if blob.properties.content_length != download_size: + # Lock on the etag. This can be overriden by the user by specifying '*' + if_match = if_match if if_match is not None else blob.properties.etag + + end_blob = blob_size + if end_range is not None: + # Use the end_range unless it is over the end of the blob + end_blob = min(blob_size, end_range + 1) + + _download_blob_chunks( + self, + container_name, + blob_name, + snapshot, + download_size, + self.MAX_CHUNK_GET_SIZE, + first_get_size, + initial_request_end + 1, # start where the first download ended + end_blob, + stream, + max_connections, + progress_callback, + validate_content, + lease_id, + if_modified_since, + if_unmodified_since, + if_match, + if_none_match, + timeout, + operation_context + ) + + # Set the content length to the download size instead of the size of + # the last range + blob.properties.content_length = download_size + + # Overwrite the content range to the user requested range + blob.properties.content_range = 'bytes {0}-{1}/{2}'.format(start_range, end_range, blob_size) + + # Overwrite the content MD5 as it is the MD5 for the last range instead + # of the stored MD5 + # TODO: Set to the stored MD5 when the service returns this + blob.properties.content_md5 = None + + return blob + + def get_blob_to_bytes( + self, container_name, blob_name, snapshot=None, + start_range=None, end_range=None, validate_content=False, + progress_callback=None, max_connections=2, lease_id=None, + if_modified_since=None, if_unmodified_since=None, if_match=None, + if_none_match=None, timeout=None): + ''' + Downloads a blob as an array of bytes, with automatic chunking and + progress notifications. Returns an instance of :class:`~azure.storage.blob.models.Blob` with + properties, metadata, and content. + + :param str container_name: + Name of existing container. + :param str blob_name: + Name of existing blob. + :param str snapshot: + The snapshot parameter is an opaque DateTime value that, + when present, specifies the blob snapshot to retrieve. + :param int start_range: + Start of byte range to use for downloading a section of the blob. + If no end_range is given, all bytes after the start_range will be downloaded. + The start_range and end_range params are inclusive. + Ex: start_range=0, end_range=511 will download first 512 bytes of blob. + :param int end_range: + End of byte range to use for downloading a section of the blob. + If end_range is given, start_range must be provided. + The start_range and end_range params are inclusive. + Ex: start_range=0, end_range=511 will download first 512 bytes of blob. + :param bool validate_content: + If set to true, validates an MD5 hash for each retrieved portion of + the blob. This is primarily valuable for detecting bitflips on the wire + if using http instead of https as https (the default) will already + validate. Note that the service will only return transactional MD5s + for chunks 4MB or less so the first get request will be of size + self.MAX_CHUNK_GET_SIZE instead of self.MAX_SINGLE_GET_SIZE. If + self.MAX_CHUNK_GET_SIZE was set to greater than 4MB an error will be + thrown. As computing the MD5 takes processing time and more requests + will need to be done due to the reduced chunk size there may be some + increase in latency. + :param progress_callback: + Callback for progress with signature function(current, total) + where current is the number of bytes transfered so far, and total is + the size of the blob if known. + :type progress_callback: func(current, total) + :param int max_connections: + If set to 2 or greater, an initial get will be done for the first + self.MAX_SINGLE_GET_SIZE bytes of the blob. If this is the entire blob, + the method returns at this point. If it is not, it will download the + remaining data parallel using the number of threads equal to + max_connections. Each chunk will be of size self.MAX_CHUNK_GET_SIZE. + If set to 1, a single large get request will be done. This is not + generally recommended but available if very few threads should be + used, network requests are very expensive, or a non-seekable stream + prevents parallel download. This may also be useful if many blobs are + expected to be empty as an extra request is required for empty blobs + if max_connections is greater than 1. + :param str lease_id: + Required if the blob has an active lease. + :param datetime if_modified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only + if the resource has been modified since the specified time. + :param datetime if_unmodified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only if + the resource has not been modified since the specified date/time. + :param str if_match: + An ETag value, or the wildcard character (*). Specify this header to perform + the operation only if the resource's ETag matches the value specified. + :param str if_none_match: + An ETag value, or the wildcard character (*). Specify this header + to perform the operation only if the resource's ETag does not match + the value specified. Specify the wildcard character (*) to perform + the operation only if the resource does not exist, and fail the + operation if it does exist. + :param int timeout: + The timeout parameter is expressed in seconds. This method may make + multiple calls to the Azure service and the timeout will apply to + each call individually. + :return: A Blob with properties and metadata. If max_connections is greater + than 1, the content_md5 (if set on the blob) will not be returned. If you + require this value, either use get_blob_properties or set max_connections + to 1. + :rtype: :class:`~azure.storage.blob.models.Blob` + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + + stream = BytesIO() + blob = self.get_blob_to_stream( + container_name, + blob_name, + stream, + snapshot, + start_range, + end_range, + validate_content, + progress_callback, + max_connections, + lease_id, + if_modified_since, + if_unmodified_since, + if_match, + if_none_match, + timeout) + + blob.content = stream.getvalue() + return blob + + def get_blob_to_text( + self, container_name, blob_name, encoding='utf-8', snapshot=None, + start_range=None, end_range=None, validate_content=False, + progress_callback=None, max_connections=2, lease_id=None, + if_modified_since=None, if_unmodified_since=None, if_match=None, + if_none_match=None, timeout=None): + ''' + Downloads a blob as unicode text, with automatic chunking and progress + notifications. Returns an instance of :class:`~azure.storage.blob.models.Blob` with + properties, metadata, and content. + + :param str container_name: + Name of existing container. + :param str blob_name: + Name of existing blob. + :param str encoding: + Python encoding to use when decoding the blob data. + :param str snapshot: + The snapshot parameter is an opaque DateTime value that, + when present, specifies the blob snapshot to retrieve. + :param int start_range: + Start of byte range to use for downloading a section of the blob. + If no end_range is given, all bytes after the start_range will be downloaded. + The start_range and end_range params are inclusive. + Ex: start_range=0, end_range=511 will download first 512 bytes of blob. + :param int end_range: + End of byte range to use for downloading a section of the blob. + If end_range is given, start_range must be provided. + The start_range and end_range params are inclusive. + Ex: start_range=0, end_range=511 will download first 512 bytes of blob. + :param bool validate_content: + If set to true, validates an MD5 hash for each retrieved portion of + the blob. This is primarily valuable for detecting bitflips on the wire + if using http instead of https as https (the default) will already + validate. Note that the service will only return transactional MD5s + for chunks 4MB or less so the first get request will be of size + self.MAX_CHUNK_GET_SIZE instead of self.MAX_SINGLE_GET_SIZE. If + self.MAX_CHUNK_GET_SIZE was set to greater than 4MB an error will be + thrown. As computing the MD5 takes processing time and more requests + will need to be done due to the reduced chunk size there may be some + increase in latency. + :param progress_callback: + Callback for progress with signature function(current, total) + where current is the number of bytes transfered so far, and total is + the size of the blob if known. + :type progress_callback: func(current, total) + :param int max_connections: + If set to 2 or greater, an initial get will be done for the first + self.MAX_SINGLE_GET_SIZE bytes of the blob. If this is the entire blob, + the method returns at this point. If it is not, it will download the + remaining data parallel using the number of threads equal to + max_connections. Each chunk will be of size self.MAX_CHUNK_GET_SIZE. + If set to 1, a single large get request will be done. This is not + generally recommended but available if very few threads should be + used, network requests are very expensive, or a non-seekable stream + prevents parallel download. This may also be useful if many blobs are + expected to be empty as an extra request is required for empty blobs + if max_connections is greater than 1. + :param str lease_id: + Required if the blob has an active lease. + :param datetime if_modified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only + if the resource has been modified since the specified time. + :param datetime if_unmodified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only if + the resource has not been modified since the specified date/time. + :param str if_match: + An ETag value, or the wildcard character (*). Specify this header to perform + the operation only if the resource's ETag matches the value specified. + :param str if_none_match: + An ETag value, or the wildcard character (*). Specify this header + to perform the operation only if the resource's ETag does not match + the value specified. Specify the wildcard character (*) to perform + the operation only if the resource does not exist, and fail the + operation if it does exist. + :param int timeout: + The timeout parameter is expressed in seconds. This method may make + multiple calls to the Azure service and the timeout will apply to + each call individually. + :return: A Blob with properties and metadata. If max_connections is greater + than 1, the content_md5 (if set on the blob) will not be returned. If you + require this value, either use get_blob_properties or set max_connections + to 1. + :rtype: :class:`~azure.storage.blob.models.Blob` + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + _validate_not_none('encoding', encoding) + + blob = self.get_blob_to_bytes(container_name, + blob_name, + snapshot, + start_range, + end_range, + validate_content, + progress_callback, + max_connections, + lease_id, + if_modified_since, + if_unmodified_since, + if_match, + if_none_match, + timeout) + blob.content = blob.content.decode(encoding) + return blob + + def get_blob_metadata( + self, container_name, blob_name, snapshot=None, lease_id=None, + if_modified_since=None, if_unmodified_since=None, if_match=None, + if_none_match=None, timeout=None): + ''' + Returns all user-defined metadata for the specified blob or snapshot. + + :param str container_name: + Name of existing container. + :param str blob_name: + Name of existing blob. + :param str snapshot: + The snapshot parameter is an opaque value that, + when present, specifies the blob snapshot to retrieve. + :param str lease_id: + Required if the blob has an active lease. + :param datetime if_modified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only + if the resource has been modified since the specified time. + :param datetime if_unmodified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only if + the resource has not been modified since the specified date/time. + :param str if_match: + An ETag value, or the wildcard character (*). Specify this header to perform + the operation only if the resource's ETag matches the value specified. + :param str if_none_match: + An ETag value, or the wildcard character (*). Specify this header + to perform the operation only if the resource's ETag does not match + the value specified. Specify the wildcard character (*) to perform + the operation only if the resource does not exist, and fail the + operation if it does exist. + :param int timeout: + The timeout parameter is expressed in seconds. + :return: + A dictionary representing the blob metadata name, value pairs. + :rtype: dict(str, str) + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + request = HTTPRequest() + request.method = 'GET' + request.host_locations = self._get_host_locations(secondary=True) + request.path = _get_path(container_name, blob_name) + request.query = { + 'snapshot': _to_str(snapshot), + 'comp': 'metadata', + 'timeout': _int_to_str(timeout), + } + request.headers = { + 'x-ms-lease-id': _to_str(lease_id), + 'If-Modified-Since': _datetime_to_utc_string(if_modified_since), + 'If-Unmodified-Since': _datetime_to_utc_string(if_unmodified_since), + 'If-Match': _to_str(if_match), + 'If-None-Match': _to_str(if_none_match), + } + + return self._perform_request(request, _parse_metadata) + + def set_blob_metadata(self, container_name, blob_name, + metadata=None, lease_id=None, + if_modified_since=None, if_unmodified_since=None, + if_match=None, if_none_match=None, timeout=None): + ''' + Sets user-defined metadata for the specified blob as one or more + name-value pairs. + + :param str container_name: + Name of existing container. + :param str blob_name: + Name of existing blob. + :param metadata: + Dict containing name and value pairs. Each call to this operation + replaces all existing metadata attached to the blob. To remove all + metadata from the blob, call this operation with no metadata headers. + :type metadata: dict(str, str) + :param str lease_id: + Required if the blob has an active lease. + :param datetime if_modified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only + if the resource has been modified since the specified time. + :param datetime if_unmodified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only if + the resource has not been modified since the specified date/time. + :param str if_match: + An ETag value, or the wildcard character (*). Specify this header to perform + the operation only if the resource's ETag matches the value specified. + :param str if_none_match: + An ETag value, or the wildcard character (*). Specify this header + to perform the operation only if the resource's ETag does not match + the value specified. Specify the wildcard character (*) to perform + the operation only if the resource does not exist, and fail the + operation if it does exist. + :param int timeout: + The timeout parameter is expressed in seconds. + :return: ETag and last modified properties for the updated Blob + :rtype: :class:`~azure.storage.blob.models.ResourceProperties` + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + request = HTTPRequest() + request.method = 'PUT' + request.host_locations = self._get_host_locations() + request.path = _get_path(container_name, blob_name) + request.query = { + 'comp': 'metadata', + 'timeout': _int_to_str(timeout), + } + request.headers = { + 'If-Modified-Since': _datetime_to_utc_string(if_modified_since), + 'If-Unmodified-Since': _datetime_to_utc_string(if_unmodified_since), + 'If-Match': _to_str(if_match), + 'If-None-Match': _to_str(if_none_match), + 'x-ms-lease-id': _to_str(lease_id), + } + _add_metadata_headers(metadata, request) + + return self._perform_request(request, _parse_base_properties) + + def _lease_blob_impl(self, container_name, blob_name, + lease_action, lease_id, + lease_duration, lease_break_period, + proposed_lease_id, if_modified_since, + if_unmodified_since, if_match, if_none_match, timeout=None): + ''' + Establishes and manages a lease on a blob for write and delete operations. + The Lease Blob operation can be called in one of five modes: + Acquire, to request a new lease. + Renew, to renew an existing lease. + Change, to change the ID of an existing lease. + Release, to free the lease if it is no longer needed so that another + client may immediately acquire a lease against the blob. + Break, to end the lease but ensure that another client cannot acquire + a new lease until the current lease period has expired. + + :param str container_name: + Name of existing container. + :param str blob_name: + Name of existing blob. + :param str lease_action: + Possible _LeaseActions acquire|renew|release|break|change + :param str lease_id: + Required if the blob has an active lease. + :param int lease_duration: + Specifies the duration of the lease, in seconds, or negative one + (-1) for a lease that never expires. A non-infinite lease can be + between 15 and 60 seconds. A lease duration cannot be changed + using renew or change. + :param int lease_break_period: + For a break operation, this is the proposed duration of + seconds that the lease should continue before it is broken, between + 0 and 60 seconds. This break period is only used if it is shorter + than the time remaining on the lease. If longer, the time remaining + on the lease is used. A new lease will not be available before the + break period has expired, but the lease may be held for longer than + the break period. If this header does not appear with a break + operation, a fixed-duration lease breaks after the remaining lease + period elapses, and an infinite lease breaks immediately. + :param str proposed_lease_id: + Optional for acquire, required for change. Proposed lease ID, in a + GUID string format. The Blob service returns 400 (Invalid request) + if the proposed lease ID is not in the correct format. + :param datetime if_modified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only + if the resource has been modified since the specified time. + :param datetime if_unmodified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only if + the resource has not been modified since the specified date/time. + :param str if_match: + An ETag value, or the wildcard character (*). Specify this header to perform + the operation only if the resource's ETag matches the value specified. + :param str if_none_match: + An ETag value, or the wildcard character (*). Specify this header + to perform the operation only if the resource's ETag does not match + the value specified. Specify the wildcard character (*) to perform + the operation only if the resource does not exist, and fail the + operation if it does exist. + :param int timeout: + The timeout parameter is expressed in seconds. + :return: + Response headers returned from the service call. + :rtype: dict(str, str) + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + _validate_not_none('lease_action', lease_action) + request = HTTPRequest() + request.method = 'PUT' + request.host_locations = self._get_host_locations() + request.path = _get_path(container_name, blob_name) + request.query = { + 'comp': 'lease', + 'timeout': _int_to_str(timeout), + } + request.headers = { + 'x-ms-lease-id': _to_str(lease_id), + 'x-ms-lease-action': _to_str(lease_action), + 'x-ms-lease-duration': _to_str(lease_duration), + 'x-ms-lease-break-period': _to_str(lease_break_period), + 'x-ms-proposed-lease-id': _to_str(proposed_lease_id), + 'If-Modified-Since': _datetime_to_utc_string(if_modified_since), + 'If-Unmodified-Since': _datetime_to_utc_string(if_unmodified_since), + 'If-Match': _to_str(if_match), + 'If-None-Match': _to_str(if_none_match), + } + + return self._perform_request(request, _parse_lease) + + def acquire_blob_lease(self, container_name, blob_name, + lease_duration=-1, + proposed_lease_id=None, + if_modified_since=None, + if_unmodified_since=None, + if_match=None, + if_none_match=None, timeout=None): + ''' + Requests a new lease. If the blob does not have an active lease, the Blob + service creates a lease on the blob and returns a new lease ID. + + :param str container_name: + Name of existing container. + :param str blob_name: + Name of existing blob. + :param int lease_duration: + Specifies the duration of the lease, in seconds, or negative one + (-1) for a lease that never expires. A non-infinite lease can be + between 15 and 60 seconds. A lease duration cannot be changed + using renew or change. Default is -1 (infinite lease). + :param str proposed_lease_id: + Proposed lease ID, in a GUID string format. The Blob service + returns 400 (Invalid request) if the proposed lease ID is not + in the correct format. + :param datetime if_modified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only + if the resource has been modified since the specified time. + :param datetime if_unmodified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only if + the resource has not been modified since the specified date/time. + :param str if_match: + An ETag value, or the wildcard character (*). Specify this header to perform + the operation only if the resource's ETag matches the value specified. + :param str if_none_match: + An ETag value, or the wildcard character (*). Specify this header + to perform the operation only if the resource's ETag does not match + the value specified. Specify the wildcard character (*) to perform + the operation only if the resource does not exist, and fail the + operation if it does exist. + :param int timeout: + The timeout parameter is expressed in seconds. + :return: the lease ID of the newly created lease. + :return: str + ''' + _validate_not_none('lease_duration', lease_duration) + + if lease_duration is not -1 and \ + (lease_duration < 15 or lease_duration > 60): + raise ValueError(_ERROR_INVALID_LEASE_DURATION) + lease = self._lease_blob_impl(container_name, + blob_name, + _LeaseActions.Acquire, + None, # lease_id + lease_duration, + None, # lease_break_period + proposed_lease_id, + if_modified_since, + if_unmodified_since, + if_match, + if_none_match, + timeout) + return lease['id'] + + def renew_blob_lease(self, container_name, blob_name, + lease_id, if_modified_since=None, + if_unmodified_since=None, if_match=None, + if_none_match=None, timeout=None): + ''' + Renews the lease. The lease can be renewed if the lease ID specified on + the request matches that associated with the blob. Note that the lease may + be renewed even if it has expired as long as the blob has not been modified + or leased again since the expiration of that lease. When you renew a lease, + the lease duration clock resets. + + :param str container_name: + Name of existing container. + :param str blob_name: + Name of existing blob. + :param str lease_id: + Lease ID for active lease. + :param datetime if_modified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only + if the resource has been modified since the specified time. + :param datetime if_unmodified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only if + the resource has not been modified since the specified date/time. + :param str if_match: + An ETag value, or the wildcard character (*). Specify this header to perform + the operation only if the resource's ETag matches the value specified. + :param str if_none_match: + An ETag value, or the wildcard character (*). Specify this header + to perform the operation only if the resource's ETag does not match + the value specified. Specify the wildcard character (*) to perform + the operation only if the resource does not exist, and fail the + operation if it does exist. + :param int timeout: + The timeout parameter is expressed in seconds. + :return: the lease ID of the renewed lease. + :return: str + ''' + _validate_not_none('lease_id', lease_id) + + lease = self._lease_blob_impl(container_name, + blob_name, + _LeaseActions.Renew, + lease_id, + None, # lease_duration + None, # lease_break_period + None, # proposed_lease_id + if_modified_since, + if_unmodified_since, + if_match, + if_none_match, + timeout) + return lease['id'] + + def release_blob_lease(self, container_name, blob_name, + lease_id, if_modified_since=None, + if_unmodified_since=None, if_match=None, + if_none_match=None, timeout=None): + ''' + Releases the lease. The lease may be released if the lease ID specified on the + request matches that associated with the blob. Releasing the lease allows another + client to immediately acquire the lease for the blob as soon as the release is complete. + + :param str container_name: + Name of existing container. + :param str blob_name: + Name of existing blob. + :param str lease_id: + Lease ID for active lease. + :param datetime if_modified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only + if the resource has been modified since the specified time. + :param datetime if_unmodified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only if + the resource has not been modified since the specified date/time. + :param str if_match: + An ETag value, or the wildcard character (*). Specify this header to perform + the operation only if the resource's ETag matches the value specified. + :param str if_none_match: + An ETag value, or the wildcard character (*). Specify this header + to perform the operation only if the resource's ETag does not match + the value specified. Specify the wildcard character (*) to perform + the operation only if the resource does not exist, and fail the + operation if it does exist. + :param int timeout: + The timeout parameter is expressed in seconds. + ''' + _validate_not_none('lease_id', lease_id) + + self._lease_blob_impl(container_name, + blob_name, + _LeaseActions.Release, + lease_id, + None, # lease_duration + None, # lease_break_period + None, # proposed_lease_id + if_modified_since, + if_unmodified_since, + if_match, + if_none_match, + timeout) + + def break_blob_lease(self, container_name, blob_name, + lease_break_period=None, + if_modified_since=None, + if_unmodified_since=None, + if_match=None, + if_none_match=None, timeout=None): + ''' + Breaks the lease, if the blob has an active lease. Once a lease is broken, + it cannot be renewed. Any authorized request can break the lease; the request + is not required to specify a matching lease ID. When a lease is broken, + the lease break period is allowed to elapse, during which time no lease operation + except break and release can be performed on the blob. When a lease is successfully + broken, the response indicates the interval in seconds until a new lease can be acquired. + + A lease that has been broken can also be released, in which case another client may + immediately acquire the lease on the blob. + + :param str container_name: + Name of existing container. + :param str blob_name: + Name of existing blob. + :param int lease_break_period: + For a break operation, this is the proposed duration of + seconds that the lease should continue before it is broken, between + 0 and 60 seconds. This break period is only used if it is shorter + than the time remaining on the lease. If longer, the time remaining + on the lease is used. A new lease will not be available before the + break period has expired, but the lease may be held for longer than + the break period. If this header does not appear with a break + operation, a fixed-duration lease breaks after the remaining lease + period elapses, and an infinite lease breaks immediately. + :param datetime if_modified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only + if the resource has been modified since the specified time. + :param datetime if_unmodified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only if + the resource has not been modified since the specified date/time. + :param str if_match: + An ETag value, or the wildcard character (*). Specify this header to perform + the operation only if the resource's ETag matches the value specified. + :param str if_none_match: + An ETag value, or the wildcard character (*). Specify this header + to perform the operation only if the resource's ETag does not match + the value specified. Specify the wildcard character (*) to perform + the operation only if the resource does not exist, and fail the + operation if it does exist. + :param int timeout: + The timeout parameter is expressed in seconds. + :return: Approximate time remaining in the lease period, in seconds. + :return: int + ''' + if (lease_break_period is not None) and (lease_break_period < 0 or lease_break_period > 60): + raise ValueError(_ERROR_INVALID_LEASE_BREAK_PERIOD) + + lease = self._lease_blob_impl(container_name, + blob_name, + _LeaseActions.Break, + None, # lease_id + None, # lease_duration + lease_break_period, + None, # proposed_lease_id + if_modified_since, + if_unmodified_since, + if_match, + if_none_match, + timeout) + return lease['time'] + + def change_blob_lease(self, container_name, blob_name, + lease_id, + proposed_lease_id, + if_modified_since=None, + if_unmodified_since=None, + if_match=None, + if_none_match=None, timeout=None): + ''' + Changes the lease ID of an active lease. A change must include the current + lease ID and a new lease ID. + + :param str container_name: + Name of existing container. + :param str blob_name: + Name of existing blob. + :param str lease_id: + Required if the blob has an active lease. + :param str proposed_lease_id: + Proposed lease ID, in a GUID string format. The Blob service returns + 400 (Invalid request) if the proposed lease ID is not in the correct format. + :param datetime if_modified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only + if the resource has been modified since the specified time. + :param datetime if_unmodified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only if + the resource has not been modified since the specified date/time. + :param str if_match: + An ETag value, or the wildcard character (*). Specify this header to perform + the operation only if the resource's ETag matches the value specified. + :param str if_none_match: + An ETag value, or the wildcard character (*). Specify this header + to perform the operation only if the resource's ETag does not match + the value specified. Specify the wildcard character (*) to perform + the operation only if the resource does not exist, and fail the + operation if it does exist. + :param int timeout: + The timeout parameter is expressed in seconds. + ''' + self._lease_blob_impl(container_name, + blob_name, + _LeaseActions.Change, + lease_id, + None, # lease_duration + None, # lease_break_period + proposed_lease_id, + if_modified_since, + if_unmodified_since, + if_match, + if_none_match, + timeout) + + def snapshot_blob(self, container_name, blob_name, + metadata=None, if_modified_since=None, + if_unmodified_since=None, if_match=None, + if_none_match=None, lease_id=None, timeout=None): + ''' + Creates a read-only snapshot of a blob. + + :param str container_name: + Name of existing container. + :param str blob_name: + Name of existing blob. + :param metadata: + Specifies a user-defined name-value pair associated with the blob. + If no name-value pairs are specified, the operation will copy the + base blob metadata to the snapshot. If one or more name-value pairs + are specified, the snapshot is created with the specified metadata, + and metadata is not copied from the base blob. + :type metadata: dict(str, str) + :param datetime if_modified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only + if the resource has been modified since the specified time. + :param datetime if_unmodified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only if + the resource has not been modified since the specified date/time. + :param str if_match: + An ETag value, or the wildcard character (*). Specify this header to perform + the operation only if the resource's ETag matches the value specified. + :param str if_none_match: + An ETag value, or the wildcard character (*). Specify this header + to perform the operation only if the resource's ETag does not match + the value specified. Specify the wildcard character (*) to perform + the operation only if the resource does not exist, and fail the + operation if it does exist. + :param str lease_id: + Required if the blob has an active lease. + :param int timeout: + The timeout parameter is expressed in seconds. + :return: snapshot properties + :rtype: :class:`~azure.storage.blob.models.Blob` + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + request = HTTPRequest() + request.method = 'PUT' + request.host_locations = self._get_host_locations() + request.path = _get_path(container_name, blob_name) + request.query = { + 'comp': 'snapshot', + 'timeout': _int_to_str(timeout), + } + request.headers = { + 'If-Modified-Since': _datetime_to_utc_string(if_modified_since), + 'If-Unmodified-Since': _datetime_to_utc_string(if_unmodified_since), + 'If-Match': _to_str(if_match), + 'If-None-Match': _to_str(if_none_match), + 'x-ms-lease-id': _to_str(lease_id) + } + _add_metadata_headers(metadata, request) + + return self._perform_request(request, _parse_snapshot_blob, [blob_name]) + + def copy_blob(self, container_name, blob_name, copy_source, + metadata=None, + source_if_modified_since=None, + source_if_unmodified_since=None, + source_if_match=None, source_if_none_match=None, + destination_if_modified_since=None, + destination_if_unmodified_since=None, + destination_if_match=None, + destination_if_none_match=None, + destination_lease_id=None, + source_lease_id=None, timeout=None): + ''' + Copies a blob asynchronously. This operation returns a copy operation + properties object, including a copy ID you can use to check or abort the + copy operation. The Blob service copies blobs on a best-effort basis. + + The source blob for a copy operation may be a block blob, an append blob, + or a page blob. If the destination blob already exists, it must be of the + same blob type as the source blob. Any existing destination blob will be + overwritten. The destination blob cannot be modified while a copy operation + is in progress. + + When copying from a page blob, the Blob service creates a destination page + blob of the source blob's length, initially containing all zeroes. Then + the source page ranges are enumerated, and non-empty ranges are copied. + + For a block blob or an append blob, the Blob service creates a committed + blob of zero length before returning from this operation. When copying + from a block blob, all committed blocks and their block IDs are copied. + Uncommitted blocks are not copied. At the end of the copy operation, the + destination blob will have the same committed block count as the source. + + When copying from an append blob, all committed blocks are copied. At the + end of the copy operation, the destination blob will have the same committed + block count as the source. + + For all blob types, you can call get_blob_properties on the destination + blob to check the status of the copy operation. The final blob will be + committed when the copy completes. + + :param str container_name: + Name of the destination container. The container must exist. + :param str blob_name: + Name of the destination blob. If the destination blob exists, it will + be overwritten. Otherwise, it will be created. + :param str copy_source: + A URL of up to 2 KB in length that specifies an Azure file or blob. + The value should be URL-encoded as it would appear in a request URI. + If the source is in another account, the source must either be public + or must be authenticated via a shared access signature. If the source + is public, no authentication is required. + Examples: + https://myaccount.blob.core.windows.net/mycontainer/myblob + https://myaccount.blob.core.windows.net/mycontainer/myblob?snapshot= + https://otheraccount.blob.core.windows.net/mycontainer/myblob?sastoken + :param metadata: + Name-value pairs associated with the blob as metadata. If no name-value + pairs are specified, the operation will copy the metadata from the + source blob or file to the destination blob. If one or more name-value + pairs are specified, the destination blob is created with the specified + metadata, and metadata is not copied from the source blob or file. + :type metadata: dict(str, str) + :param datetime source_if_modified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this conditional header to copy the blob only if the source + blob has been modified since the specified date/time. + :param datetime source_if_unmodified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this conditional header to copy the blob only if the source blob + has not been modified since the specified date/time. + :param ETag source_if_match: + An ETag value, or the wildcard character (*). Specify this conditional + header to copy the source blob only if its ETag matches the value + specified. If the ETag values do not match, the Blob service returns + status code 412 (Precondition Failed). This header cannot be specified + if the source is an Azure File. + :param ETag source_if_none_match: + An ETag value, or the wildcard character (*). Specify this conditional + header to copy the blob only if its ETag does not match the value + specified. If the values are identical, the Blob service returns status + code 412 (Precondition Failed). This header cannot be specified if the + source is an Azure File. + :param datetime destination_if_modified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this conditional header to copy the blob only + if the destination blob has been modified since the specified date/time. + If the destination blob has not been modified, the Blob service returns + status code 412 (Precondition Failed). + :param datetime destination_if_unmodified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this conditional header to copy the blob only + if the destination blob has not been modified since the specified + date/time. If the destination blob has been modified, the Blob service + returns status code 412 (Precondition Failed). + :param ETag destination_if_match: + An ETag value, or the wildcard character (*). Specify an ETag value for + this conditional header to copy the blob only if the specified ETag value + matches the ETag value for an existing destination blob. If the ETag for + the destination blob does not match the ETag specified for If-Match, the + Blob service returns status code 412 (Precondition Failed). + :param ETag destination_if_none_match: + An ETag value, or the wildcard character (*). Specify an ETag value for + this conditional header to copy the blob only if the specified ETag value + does not match the ETag value for the destination blob. Specify the wildcard + character (*) to perform the operation only if the destination blob does not + exist. If the specified condition isn't met, the Blob service returns status + code 412 (Precondition Failed). + :param str destination_lease_id: + The lease ID specified for this header must match the lease ID of the + destination blob. If the request does not include the lease ID or it is not + valid, the operation fails with status code 412 (Precondition Failed). + :param str source_lease_id: + Specify this to perform the Copy Blob operation only if + the lease ID given matches the active lease ID of the source blob. + :param int timeout: + The timeout parameter is expressed in seconds. + :return: Copy operation properties such as status, source, and ID. + :rtype: :class:`~azure.storage.blob.models.CopyProperties` + ''' + return self._copy_blob(container_name, blob_name, copy_source, + metadata, + None, + source_if_modified_since, source_if_unmodified_since, + source_if_match, source_if_none_match, + destination_if_modified_since, + destination_if_unmodified_since, + destination_if_match, + destination_if_none_match, + destination_lease_id, + source_lease_id, timeout, + False) + + def _copy_blob(self, container_name, blob_name, copy_source, + metadata=None, + premium_page_blob_tier=None, + source_if_modified_since=None, + source_if_unmodified_since=None, + source_if_match=None, source_if_none_match=None, + destination_if_modified_since=None, + destination_if_unmodified_since=None, + destination_if_match=None, + destination_if_none_match=None, + destination_lease_id=None, + source_lease_id=None, timeout=None, + incremental_copy=False): + ''' + See copy_blob for more details. This helper method + allows for standard copies as well as incremental copies which are only supported for page blobs. + :param bool incremental_copy: + The timeout parameter is expressed in seconds. + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + _validate_not_none('copy_source', copy_source) + + if copy_source.startswith('/'): + # Backwards compatibility for earlier versions of the SDK where + # the copy source can be in the following formats: + # - Blob in named container: + # /accountName/containerName/blobName + # - Snapshot in named container: + # /accountName/containerName/blobName?snapshot= + # - Blob in root container: + # /accountName/blobName + # - Snapshot in root container: + # /accountName/blobName?snapshot= + account, _, source = \ + copy_source.partition('/')[2].partition('/') + copy_source = self.protocol + '://' + \ + self.primary_endpoint + '/' + source + + request = HTTPRequest() + request.method = 'PUT' + request.host_locations = self._get_host_locations() + request.path = _get_path(container_name, blob_name) + + if incremental_copy: + request.query = { + 'comp': 'incrementalcopy', + 'timeout': _int_to_str(timeout), + } + else: + request.query = {'timeout': _int_to_str(timeout)} + + request.headers = { + 'x-ms-copy-source': _to_str(copy_source), + 'x-ms-source-if-modified-since': _to_str(source_if_modified_since), + 'x-ms-source-if-unmodified-since': _to_str(source_if_unmodified_since), + 'x-ms-source-if-match': _to_str(source_if_match), + 'x-ms-source-if-none-match': _to_str(source_if_none_match), + 'If-Modified-Since': _datetime_to_utc_string(destination_if_modified_since), + 'If-Unmodified-Since': _datetime_to_utc_string(destination_if_unmodified_since), + 'If-Match': _to_str(destination_if_match), + 'If-None-Match': _to_str(destination_if_none_match), + 'x-ms-lease-id': _to_str(destination_lease_id), + 'x-ms-source-lease-id': _to_str(source_lease_id), + 'x-ms-access-tier': _to_str(premium_page_blob_tier) + } + _add_metadata_headers(metadata, request) + + return self._perform_request(request, _parse_properties, [BlobProperties]).copy + + def abort_copy_blob(self, container_name, blob_name, copy_id, + lease_id=None, timeout=None): + ''' + Aborts a pending copy_blob operation, and leaves a destination blob + with zero length and full metadata. + + :param str container_name: + Name of destination container. + :param str blob_name: + Name of destination blob. + :param str copy_id: + Copy identifier provided in the copy.id of the original + copy_blob operation. + :param str lease_id: + Required if the destination blob has an active infinite lease. + :param int timeout: + The timeout parameter is expressed in seconds. + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + _validate_not_none('copy_id', copy_id) + request = HTTPRequest() + request.method = 'PUT' + request.host_locations = self._get_host_locations() + request.path = _get_path(container_name, blob_name) + request.query = { + 'comp': 'copy', + 'copyid': _to_str(copy_id), + 'timeout': _int_to_str(timeout), + } + request.headers = { + 'x-ms-lease-id': _to_str(lease_id), + 'x-ms-copy-action': 'abort', + } + + self._perform_request(request) + + def delete_blob(self, container_name, blob_name, snapshot=None, + lease_id=None, delete_snapshots=None, + if_modified_since=None, if_unmodified_since=None, + if_match=None, if_none_match=None, timeout=None): + ''' + Marks the specified blob or snapshot for deletion. + The blob is later deleted during garbage collection. + + Note that in order to delete a blob, you must delete all of its + snapshots. You can delete both at the same time with the Delete + Blob operation. + + If a delete retention policy is enabled for the service, then this operation soft deletes the blob or snapshot + and retains the blob or snapshot for specified number of days. + After specified number of days, blob's data is removed from the service during garbage collection. + Soft deleted blob or snapshot is accessible through List Blobs API specifying include=Include.Deleted option. + Soft-deleted blob or snapshot can be restored using Undelete API. + + :param str container_name: + Name of existing container. + :param str blob_name: + Name of existing blob. + :param str snapshot: + The snapshot parameter is an opaque DateTime value that, + when present, specifies the blob snapshot to delete. + :param str lease_id: + Required if the blob has an active lease. + :param ~azure.storage.blob.models.DeleteSnapshot delete_snapshots: + Required if the blob has associated snapshots. + :param datetime if_modified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only + if the resource has been modified since the specified time. + :param datetime if_unmodified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only if + the resource has not been modified since the specified date/time. + :param str if_match: + An ETag value, or the wildcard character (*). Specify this header to perform + the operation only if the resource's ETag matches the value specified. + :param str if_none_match: + An ETag value, or the wildcard character (*). Specify this header + to perform the operation only if the resource's ETag does not match + the value specified. Specify the wildcard character (*) to perform + the operation only if the resource does not exist, and fail the + operation if it does exist. + :param int timeout: + The timeout parameter is expressed in seconds. + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + request = HTTPRequest() + request.method = 'DELETE' + request.host_locations = self._get_host_locations() + request.path = _get_path(container_name, blob_name) + request.headers = { + 'x-ms-lease-id': _to_str(lease_id), + 'x-ms-delete-snapshots': _to_str(delete_snapshots), + 'If-Modified-Since': _datetime_to_utc_string(if_modified_since), + 'If-Unmodified-Since': _datetime_to_utc_string(if_unmodified_since), + 'If-Match': _to_str(if_match), + 'If-None-Match': _to_str(if_none_match), + } + request.query = { + 'snapshot': _to_str(snapshot), + 'timeout': _int_to_str(timeout) + } + + self._perform_request(request) + + def undelete_blob(self, container_name, blob_name, timeout=None): + ''' + The undelete Blob operation restores the contents and metadata of soft deleted blob or snapshot. + Attempting to undelete a blob or snapshot that is not soft deleted will succeed without any changes. + + :param str container_name: + Name of existing container. + :param str blob_name: + Name of existing blob. + :param int timeout: + The timeout parameter is expressed in seconds. + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + request = HTTPRequest() + request.method = 'PUT' + request.host_locations = self._get_host_locations() + request.path = _get_path(container_name, blob_name) + request.query = { + 'comp': 'undelete', + 'timeout': _int_to_str(timeout) + } + + self._perform_request(request) diff --git a/src/storage-preview/azext_storage_preview/azure_storage/blob/blockblobservice.py b/src/storage-preview/azext_storage_preview/azure_storage/blob/blockblobservice.py new file mode 100644 index 00000000000..f289de8a88b --- /dev/null +++ b/src/storage-preview/azext_storage_preview/azure_storage/blob/blockblobservice.py @@ -0,0 +1,1007 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- +from io import ( + BytesIO +) +from os import ( + path, +) + +from azure.storage.common._common_conversion import ( + _encode_base64, + _to_str, + _int_to_str, + _datetime_to_utc_string, + _get_content_md5, +) +from azure.storage.common._constants import ( + SERVICE_HOST_BASE, + DEFAULT_PROTOCOL, +) +from azure.storage.common._error import ( + _validate_not_none, + _validate_type_bytes, + _validate_encryption_required, + _validate_encryption_unsupported, + _ERROR_VALUE_NEGATIVE, + _ERROR_VALUE_SHOULD_BE_STREAM +) +from azure.storage.common._http import HTTPRequest +from azure.storage.common._serialization import ( + _get_request_body, + _get_data_bytes_only, + _get_data_bytes_or_stream_only, + _add_metadata_headers, +) +from azure.storage.common._serialization import ( + _len_plus +) +from ._deserialization import ( + _convert_xml_to_block_list, + _parse_base_properties, +) +from ._encryption import ( + _encrypt_blob, + _generate_blob_encryption_data, +) +from ._serialization import ( + _convert_block_list_to_xml, + _get_path, +) +from ._upload_chunking import ( + _BlockBlobChunkUploader, + _upload_blob_chunks, + _upload_blob_substream_blocks, +) +from .baseblobservice import BaseBlobService +from .models import ( + _BlobTypes, +) + + +class BlockBlobService(BaseBlobService): + ''' + Block blobs let you upload large blobs efficiently. Block blobs are comprised + of blocks, each of which is identified by a block ID. You create or modify a + block blob by writing a set of blocks and committing them by their block IDs. + Each block can be a different size, up to a maximum of 100 MB, and a block blob + can include up to 50,000 blocks. The maximum size of a block blob is therefore + approximately 4.75 TB (100 MB X 50,000 blocks). If you are writing a block + blob that is no more than 64 MB in size, you can upload it in its entirety with + a single write operation; see create_blob_from_bytes. + + :ivar int MAX_SINGLE_PUT_SIZE: + The largest size upload supported in a single put call. This is used by + the create_blob_from_* methods if the content length is known and is less + than this value. + :ivar int MAX_BLOCK_SIZE: + The size of the blocks put by create_blob_from_* methods if the content + length is unknown or is larger than MAX_SINGLE_PUT_SIZE. Smaller blocks + may be put. The maximum block size the service supports is 100MB. + :ivar int MIN_LARGE_BLOCK_UPLOAD_THRESHOLD: + The minimum block size at which the the memory-optimized, block upload + algorithm is considered. This algorithm is only applicable to the create_blob_from_file and + create_blob_from_stream methods and will prevent the full buffering of blocks. + In addition to the block size, ContentMD5 validation and Encryption must be disabled as + these options require the blocks to be buffered. + ''' + + MAX_SINGLE_PUT_SIZE = 64 * 1024 * 1024 + MAX_BLOCK_SIZE = 4 * 1024 * 1024 + MIN_LARGE_BLOCK_UPLOAD_THRESHOLD = 4 * 1024 * 1024 + 1 + + def __init__(self, account_name=None, account_key=None, sas_token=None, is_emulated=False, + protocol=DEFAULT_PROTOCOL, endpoint_suffix=SERVICE_HOST_BASE, custom_domain=None, + request_session=None, connection_string=None, socket_timeout=None, token_credential=None): + ''' + :param str account_name: + The storage account name. This is used to authenticate requests + signed with an account key and to construct the storage endpoint. It + is required unless a connection string is given, or if a custom + domain is used with anonymous authentication. + :param str account_key: + The storage account key. This is used for shared key authentication. + If neither account key or sas token is specified, anonymous access + will be used. + :param str sas_token: + A shared access signature token to use to authenticate requests + instead of the account key. If account key and sas token are both + specified, account key will be used to sign. If neither are + specified, anonymous access will be used. + :param bool is_emulated: + Whether to use the emulator. Defaults to False. If specified, will + override all other parameters besides connection string and request + session. + :param str protocol: + The protocol to use for requests. Defaults to https. + :param str endpoint_suffix: + The host base component of the url, minus the account name. Defaults + to Azure (core.windows.net). Override this to use the China cloud + (core.chinacloudapi.cn). + :param str custom_domain: + The custom domain to use. This can be set in the Azure Portal. For + example, 'www.mydomain.com'. + :param requests.Session request_session: + The session object to use for http requests. + :param str connection_string: + If specified, this will override all other parameters besides + request session. See + http://azure.microsoft.com/en-us/documentation/articles/storage-configure-connection-string/ + for the connection string format. + :param int socket_timeout: + If specified, this will override the default socket timeout. The timeout specified is in seconds. + See DEFAULT_SOCKET_TIMEOUT in _constants.py for the default value. + :param token_credential: + A token credential used to authenticate HTTPS requests. The token value + should be updated before its expiration. + :type `~azure.storage.common.TokenCredential` + ''' + self.blob_type = _BlobTypes.BlockBlob + super(BlockBlobService, self).__init__( + account_name, account_key, sas_token, is_emulated, protocol, endpoint_suffix, + custom_domain, request_session, connection_string, socket_timeout, token_credential) + + def put_block(self, container_name, blob_name, block, block_id, + validate_content=False, lease_id=None, timeout=None): + ''' + Creates a new block to be committed as part of a blob. + + :param str container_name: + Name of existing container. + :param str blob_name: + Name of existing blob. + :param block: Content of the block. + :type block: io.IOBase or bytes + Content of the block. + :param str block_id: + A valid Base64 string value that identifies the block. Prior to + encoding, the string must be less than or equal to 64 bytes in size. + For a given blob, the length of the value specified for the blockid + parameter must be the same size for each block. Note that the Base64 + string must be URL-encoded. + :param bool validate_content: + If true, calculates an MD5 hash of the block content. The storage + service checks the hash of the content that has arrived + with the hash that was sent. This is primarily valuable for detecting + bitflips on the wire if using http instead of https as https (the default) + will already validate. Note that this MD5 hash is not stored with the + blob. + :param str lease_id: + Required if the blob has an active lease. + :param int timeout: + The timeout parameter is expressed in seconds. + ''' + _validate_encryption_unsupported(self.require_encryption, self.key_encryption_key) + + self._put_block( + container_name, + blob_name, + block, + block_id, + validate_content=validate_content, + lease_id=lease_id, + timeout=timeout + ) + + def put_block_list( + self, container_name, blob_name, block_list, content_settings=None, + metadata=None, validate_content=False, lease_id=None, if_modified_since=None, + if_unmodified_since=None, if_match=None, if_none_match=None, + timeout=None): + ''' + Writes a blob by specifying the list of block IDs that make up the blob. + In order to be written as part of a blob, a block must have been + successfully written to the server in a prior Put Block operation. + + You can call Put Block List to update a blob by uploading only those + blocks that have changed, then committing the new and existing blocks + together. You can do this by specifying whether to commit a block from + the committed block list or from the uncommitted block list, or to commit + the most recently uploaded version of the block, whichever list it may + belong to. + + :param str container_name: + Name of existing container. + :param str blob_name: + Name of existing blob. + :param block_list: + A list of :class:`~azure.storeage.blob.models.BlobBlock` containing the block ids and block state. + :type block_list: list(:class:`~azure.storage.blob.models.BlobBlock`) + :param ~azure.storage.blob.models.ContentSettings content_settings: + ContentSettings object used to set properties on the blob. + :param metadata: + Name-value pairs associated with the blob as metadata. + :type metadata: dict(str, str) + :param bool validate_content: + If true, calculates an MD5 hash of the block list content. The storage + service checks the hash of the block list content that has arrived + with the hash that was sent. This is primarily valuable for detecting + bitflips on the wire if using http instead of https as https (the default) + will already validate. Note that this check is associated with + the block list content, and not with the content of the blob itself. + :param str lease_id: + Required if the blob has an active lease. + :param datetime if_modified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only + if the resource has been modified since the specified time. + :param datetime if_unmodified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only if + the resource has not been modified since the specified date/time. + :param str if_match: + An ETag value, or the wildcard character (*). Specify this header to perform + the operation only if the resource's ETag matches the value specified. + :param str if_none_match: + An ETag value, or the wildcard character (*). Specify this header + to perform the operation only if the resource's ETag does not match + the value specified. Specify the wildcard character (*) to perform + the operation only if the resource does not exist, and fail the + operation if it does exist. + :param int timeout: + The timeout parameter is expressed in seconds. + :return: ETag and last modified properties for the updated Block Blob + :rtype: :class:`~azure.storage.blob.models.ResourceProperties` + ''' + + _validate_encryption_unsupported(self.require_encryption, self.key_encryption_key) + + return self._put_block_list( + container_name, + blob_name, + block_list, + content_settings=content_settings, + metadata=metadata, + validate_content=validate_content, + lease_id=lease_id, + if_modified_since=if_modified_since, + if_unmodified_since=if_unmodified_since, + if_match=if_match, + if_none_match=if_none_match, + timeout=timeout + ) + + def get_block_list(self, container_name, blob_name, snapshot=None, + block_list_type=None, lease_id=None, timeout=None): + ''' + Retrieves the list of blocks that have been uploaded as part of a + block blob. There are two block lists maintained for a blob: + Committed Block List: + The list of blocks that have been successfully committed to a + given blob with Put Block List. + Uncommitted Block List: + The list of blocks that have been uploaded for a blob using + Put Block, but that have not yet been committed. These blocks + are stored in Azure in association with a blob, but do not yet + form part of the blob. + + :param str container_name: + Name of existing container. + :param str blob_name: + Name of existing blob. + :param str snapshot: + Datetime to determine the time to retrieve the blocks. + :param str block_list_type: + Specifies whether to return the list of committed blocks, the list + of uncommitted blocks, or both lists together. Valid values are: + committed, uncommitted, or all. + :param str lease_id: + Required if the blob has an active lease. + :param int timeout: + The timeout parameter is expressed in seconds. + :return: list committed and/or uncommitted blocks for Block Blob + :rtype: :class:`~azure.storage.blob.models.BlobBlockList` + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + request = HTTPRequest() + request.method = 'GET' + request.host_locations = self._get_host_locations(secondary=True) + request.path = _get_path(container_name, blob_name) + request.query = { + 'comp': 'blocklist', + 'snapshot': _to_str(snapshot), + 'blocklisttype': _to_str(block_list_type), + 'timeout': _int_to_str(timeout), + } + request.headers = {'x-ms-lease-id': _to_str(lease_id)} + + return self._perform_request(request, _convert_xml_to_block_list) + + # ----Convenience APIs----------------------------------------------------- + + def create_blob_from_path( + self, container_name, blob_name, file_path, content_settings=None, + metadata=None, validate_content=False, progress_callback=None, + max_connections=2, lease_id=None, if_modified_since=None, + if_unmodified_since=None, if_match=None, if_none_match=None, timeout=None): + ''' + Creates a new blob from a file path, or updates the content of an + existing blob, with automatic chunking and progress notifications. + + :param str container_name: + Name of existing container. + :param str blob_name: + Name of blob to create or update. + :param str file_path: + Path of the file to upload as the blob content. + :param ~azure.storage.blob.models.ContentSettings content_settings: + ContentSettings object used to set blob properties. + :param metadata: + Name-value pairs associated with the blob as metadata. + :type metadata: dict(str, str) + :param bool validate_content: + If true, calculates an MD5 hash for each chunk of the blob. The storage + service checks the hash of the content that has arrived with the hash + that was sent. This is primarily valuable for detecting bitflips on + the wire if using http instead of https as https (the default) will + already validate. Note that this MD5 hash is not stored with the + blob. Also note that if enabled, the memory-efficient upload algorithm + will not be used, because computing the MD5 hash requires buffering + entire blocks, and doing so defeats the purpose of the memory-efficient algorithm. + :param progress_callback: + Callback for progress with signature function(current, total) where + current is the number of bytes transfered so far, and total is the + size of the blob, or None if the total size is unknown. + :type progress_callback: func(current, total) + :param int max_connections: + Maximum number of parallel connections to use when the blob size exceeds + 64MB. + :param str lease_id: + Required if the blob has an active lease. + :param datetime if_modified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only + if the resource has been modified since the specified time. + :param datetime if_unmodified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only if + the resource has not been modified since the specified date/time. + :param str if_match: + An ETag value, or the wildcard character (*). Specify this header to perform + the operation only if the resource's ETag matches the value specified. + :param str if_none_match: + An ETag value, or the wildcard character (*). Specify this header + to perform the operation only if the resource's ETag does not match + the value specified. Specify the wildcard character (*) to perform + the operation only if the resource does not exist, and fail the + operation if it does exist. + :param int timeout: + The timeout parameter is expressed in seconds. This method may make + multiple calls to the Azure service and the timeout will apply to + each call individually. + :return: ETag and last modified properties for the Block Blob + :rtype: :class:`~azure.storage.blob.models.ResourceProperties` + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + _validate_not_none('file_path', file_path) + + count = path.getsize(file_path) + with open(file_path, 'rb') as stream: + return self.create_blob_from_stream( + container_name=container_name, + blob_name=blob_name, + stream=stream, + count=count, + content_settings=content_settings, + metadata=metadata, + validate_content=validate_content, + lease_id=lease_id, + progress_callback=progress_callback, + max_connections=max_connections, + if_modified_since=if_modified_since, + if_unmodified_since=if_unmodified_since, + if_match=if_match, + if_none_match=if_none_match, + timeout=timeout) + + def create_blob_from_stream( + self, container_name, blob_name, stream, count=None, + content_settings=None, metadata=None, validate_content=False, + progress_callback=None, max_connections=2, lease_id=None, + if_modified_since=None, if_unmodified_since=None, if_match=None, + if_none_match=None, timeout=None, use_byte_buffer=False): + ''' + Creates a new blob from a file/stream, or updates the content of + an existing blob, with automatic chunking and progress + notifications. + + :param str container_name: + Name of existing container. + :param str blob_name: + Name of blob to create or update. + :param io.IOBase stream: + Opened file/stream to upload as the blob content. + :param int count: + Number of bytes to read from the stream. This is optional, but + should be supplied for optimal performance. + :param ~azure.storage.blob.models.ContentSettings content_settings: + ContentSettings object used to set blob properties. + :param metadata: + Name-value pairs associated with the blob as metadata. + :type metadata: dict(str, str) + :param bool validate_content: + If true, calculates an MD5 hash for each chunk of the blob. The storage + service checks the hash of the content that has arrived with the hash + that was sent. This is primarily valuable for detecting bitflips on + the wire if using http instead of https as https (the default) will + already validate. Note that this MD5 hash is not stored with the + blob. Also note that if enabled, the memory-efficient upload algorithm + will not be used, because computing the MD5 hash requires buffering + entire blocks, and doing so defeats the purpose of the memory-efficient algorithm. + :param progress_callback: + Callback for progress with signature function(current, total) where + current is the number of bytes transfered so far, and total is the + size of the blob, or None if the total size is unknown. + :type progress_callback: func(current, total) + :param int max_connections: + Maximum number of parallel connections to use when the blob size exceeds + 64MB. Note that parallel upload requires the stream to be seekable. + :param str lease_id: + Required if the blob has an active lease. + :param datetime if_modified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only + if the resource has been modified since the specified time. + :param datetime if_unmodified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only if + the resource has not been modified since the specified date/time. + :param str if_match: + An ETag value, or the wildcard character (*). Specify this header to perform + the operation only if the resource's ETag matches the value specified. + :param str if_none_match: + An ETag value, or the wildcard character (*). Specify this header + to perform the operation only if the resource's ETag does not match + the value specified. Specify the wildcard character (*) to perform + the operation only if the resource does not exist, and fail the + operation if it does exist. + :param int timeout: + The timeout parameter is expressed in seconds. This method may make + multiple calls to the Azure service and the timeout will apply to + each call individually. + :param bool use_byte_buffer: + If True, this will force usage of the original full block buffering upload path. + By default, this value is False and will employ a memory-efficient, + streaming upload algorithm under the following conditions: + The provided stream is seekable, 'require_encryption' is False, and + MAX_BLOCK_SIZE >= MIN_LARGE_BLOCK_UPLOAD_THRESHOLD. + One should consider the drawbacks of using this approach. In order to achieve + memory-efficiency, a IOBase stream or file-like object is segmented into logical blocks + using a SubStream wrapper. In order to read the correct data, each SubStream must acquire + a lock so that it can safely seek to the right position on the shared, underlying stream. + If max_connections > 1, the concurrency will result in a considerable amount of seeking on + the underlying stream. For the most common inputs such as a file-like stream object, seeking + is an inexpensive operation and this is not much of a concern. However, for other variants of streams + this may not be the case. The trade-off for memory-efficiency must be weighed against the cost of seeking + with your input stream. + The SubStream class will attempt to buffer up to 4 MB internally to reduce the amount of + seek and read calls to the underlying stream. This is particularly beneficial when uploading larger blocks. + :return: ETag and last modified properties for the Block Blob + :rtype: :class:`~azure.storage.blob.models.ResourceProperties` + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + _validate_not_none('stream', stream) + _validate_encryption_required(self.require_encryption, self.key_encryption_key) + + # Adjust count to include padding if we are expected to encrypt. + adjusted_count = count + if (self.key_encryption_key is not None) and (adjusted_count is not None): + adjusted_count += (16 - (count % 16)) + + # Do single put if the size is smaller than MAX_SINGLE_PUT_SIZE + if adjusted_count is not None and (adjusted_count < self.MAX_SINGLE_PUT_SIZE): + if progress_callback: + progress_callback(0, count) + + data = stream.read(count) + resp = self._put_blob( + container_name=container_name, + blob_name=blob_name, + blob=data, + content_settings=content_settings, + metadata=metadata, + validate_content=validate_content, + lease_id=lease_id, + if_modified_since=if_modified_since, + if_unmodified_since=if_unmodified_since, + if_match=if_match, + if_none_match=if_none_match, + timeout=timeout) + + if progress_callback: + progress_callback(count, count) + + return resp + else: # Size is larger than MAX_SINGLE_PUT_SIZE, must upload with multiple put_block calls + cek, iv, encryption_data = None, None, None + + use_original_upload_path = use_byte_buffer or validate_content or self.require_encryption or \ + self.MAX_BLOCK_SIZE < self.MIN_LARGE_BLOCK_UPLOAD_THRESHOLD or \ + hasattr(stream, 'seekable') and not stream.seekable() or \ + not hasattr(stream, 'seek') or not hasattr(stream, 'tell') + + if use_original_upload_path: + if self.key_encryption_key: + cek, iv, encryption_data = _generate_blob_encryption_data(self.key_encryption_key) + + block_ids = _upload_blob_chunks( + blob_service=self, + container_name=container_name, + blob_name=blob_name, + blob_size=count, + block_size=self.MAX_BLOCK_SIZE, + stream=stream, + max_connections=max_connections, + progress_callback=progress_callback, + validate_content=validate_content, + lease_id=lease_id, + uploader_class=_BlockBlobChunkUploader, + timeout=timeout, + content_encryption_key=cek, + initialization_vector=iv + ) + else: + block_ids = _upload_blob_substream_blocks( + blob_service=self, + container_name=container_name, + blob_name=blob_name, + blob_size=count, + block_size=self.MAX_BLOCK_SIZE, + stream=stream, + max_connections=max_connections, + progress_callback=progress_callback, + validate_content=validate_content, + lease_id=lease_id, + uploader_class=_BlockBlobChunkUploader, + timeout=timeout, + ) + + return self._put_block_list( + container_name=container_name, + blob_name=blob_name, + block_list=block_ids, + content_settings=content_settings, + metadata=metadata, + validate_content=validate_content, + lease_id=lease_id, + if_modified_since=if_modified_since, + if_unmodified_since=if_unmodified_since, + if_match=if_match, + if_none_match=if_none_match, + timeout=timeout, + encryption_data=encryption_data + ) + + def create_blob_from_bytes( + self, container_name, blob_name, blob, index=0, count=None, + content_settings=None, metadata=None, validate_content=False, + progress_callback=None, max_connections=2, lease_id=None, + if_modified_since=None, if_unmodified_since=None, if_match=None, + if_none_match=None, timeout=None): + ''' + Creates a new blob from an array of bytes, or updates the content + of an existing blob, with automatic chunking and progress + notifications. + + :param str container_name: + Name of existing container. + :param str blob_name: + Name of blob to create or update. + :param bytes blob: + Content of blob as an array of bytes. + :param int index: + Start index in the array of bytes. + :param int count: + Number of bytes to upload. Set to None or negative value to upload + all bytes starting from index. + :param ~azure.storage.blob.models.ContentSettings content_settings: + ContentSettings object used to set blob properties. + :param metadata: + Name-value pairs associated with the blob as metadata. + :type metadata: dict(str, str) + :param bool validate_content: + If true, calculates an MD5 hash for each chunk of the blob. The storage + service checks the hash of the content that has arrived with the hash + that was sent. This is primarily valuable for detecting bitflips on + the wire if using http instead of https as https (the default) will + already validate. Note that this MD5 hash is not stored with the + blob. + :param progress_callback: + Callback for progress with signature function(current, total) where + current is the number of bytes transfered so far, and total is the + size of the blob, or None if the total size is unknown. + :type progress_callback: func(current, total) + :param int max_connections: + Maximum number of parallel connections to use when the blob size exceeds + 64MB. + :param str lease_id: + Required if the blob has an active lease. + :param datetime if_modified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only + if the resource has been modified since the specified time. + :param datetime if_unmodified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only if + the resource has not been modified since the specified date/time. + :param str if_match: + An ETag value, or the wildcard character (*). Specify this header to perform + the operation only if the resource's ETag matches the value specified. + :param str if_none_match: + An ETag value, or the wildcard character (*). Specify this header + to perform the operation only if the resource's ETag does not match + the value specified. Specify the wildcard character (*) to perform + the operation only if the resource does not exist, and fail the + operation if it does exist. + :param int timeout: + The timeout parameter is expressed in seconds. This method may make + multiple calls to the Azure service and the timeout will apply to + each call individually. + :return: ETag and last modified properties for the Block Blob + :rtype: :class:`~azure.storage.blob.models.ResourceProperties` + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + _validate_not_none('blob', blob) + _validate_not_none('index', index) + _validate_type_bytes('blob', blob) + + if index < 0: + raise IndexError(_ERROR_VALUE_NEGATIVE.format('index')) + + if count is None or count < 0: + count = len(blob) - index + + stream = BytesIO(blob) + stream.seek(index) + + return self.create_blob_from_stream( + container_name=container_name, + blob_name=blob_name, + stream=stream, + count=count, + content_settings=content_settings, + metadata=metadata, + validate_content=validate_content, + progress_callback=progress_callback, + max_connections=max_connections, + lease_id=lease_id, + if_modified_since=if_modified_since, + if_unmodified_since=if_unmodified_since, + if_match=if_match, + if_none_match=if_none_match, + timeout=timeout, + use_byte_buffer=True + ) + + def create_blob_from_text( + self, container_name, blob_name, text, encoding='utf-8', + content_settings=None, metadata=None, validate_content=False, + progress_callback=None, max_connections=2, lease_id=None, + if_modified_since=None, if_unmodified_since=None, if_match=None, + if_none_match=None, timeout=None): + ''' + Creates a new blob from str/unicode, or updates the content of an + existing blob, with automatic chunking and progress notifications. + + :param str container_name: + Name of existing container. + :param str blob_name: + Name of blob to create or update. + :param str text: + Text to upload to the blob. + :param str encoding: + Python encoding to use to convert the text to bytes. + :param ~azure.storage.blob.models.ContentSettings content_settings: + ContentSettings object used to set blob properties. + :param metadata: + Name-value pairs associated with the blob as metadata. + :type metadata: dict(str, str) + :param bool validate_content: + If true, calculates an MD5 hash for each chunk of the blob. The storage + service checks the hash of the content that has arrived with the hash + that was sent. This is primarily valuable for detecting bitflips on + the wire if using http instead of https as https (the default) will + already validate. Note that this MD5 hash is not stored with the + blob. + :param progress_callback: + Callback for progress with signature function(current, total) where + current is the number of bytes transfered so far, and total is the + size of the blob, or None if the total size is unknown. + :type progress_callback: func(current, total) + :param int max_connections: + Maximum number of parallel connections to use when the blob size exceeds + 64MB. + :param str lease_id: + Required if the blob has an active lease. + :param datetime if_modified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only + if the resource has been modified since the specified time. + :param datetime if_unmodified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only if + the resource has not been modified since the specified date/time. + :param str if_match: + An ETag value, or the wildcard character (*). Specify this header to perform + the operation only if the resource's ETag matches the value specified. + :param str if_none_match: + An ETag value, or the wildcard character (*). Specify this header + to perform the operation only if the resource's ETag does not match + the value specified. Specify the wildcard character (*) to perform + the operation only if the resource does not exist, and fail the + operation if it does exist. + :param int timeout: + The timeout parameter is expressed in seconds. This method may make + multiple calls to the Azure service and the timeout will apply to + each call individually. + :return: ETag and last modified properties for the Block Blob + :rtype: :class:`~azure.storage.blob.models.ResourceProperties` + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + _validate_not_none('text', text) + + if not isinstance(text, bytes): + _validate_not_none('encoding', encoding) + text = text.encode(encoding) + + return self.create_blob_from_bytes( + container_name=container_name, + blob_name=blob_name, + blob=text, + index=0, + count=len(text), + content_settings=content_settings, + metadata=metadata, + validate_content=validate_content, + lease_id=lease_id, + progress_callback=progress_callback, + max_connections=max_connections, + if_modified_since=if_modified_since, + if_unmodified_since=if_unmodified_since, + if_match=if_match, + if_none_match=if_none_match, + timeout=timeout) + + def set_standard_blob_tier( + self, container_name, blob_name, standard_blob_tier, timeout=None): + ''' + Sets the block blob tiers on the blob. This API is only supported for block blobs on standard storage accounts. + + :param str container_name: + Name of existing container. + :param str blob_name: + Name of blob to update. + :param StandardBlobTier standard_blob_tier: + A standard blob tier value to set the blob to. For this version of the library, + this is only applicable to block blobs on standard storage accounts. + :param int timeout: + The timeout parameter is expressed in seconds. This method may make + multiple calls to the Azure service and the timeout will apply to + each call individually. + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + _validate_not_none('standard_blob_tier', standard_blob_tier) + + request = HTTPRequest() + request.method = 'PUT' + request.host_locations = self._get_host_locations() + request.path = _get_path(container_name, blob_name) + request.query = { + 'comp': 'tier', + 'timeout': _int_to_str(timeout), + } + request.headers = { + 'x-ms-access-tier': _to_str(standard_blob_tier) + } + + self._perform_request(request) + + # -----Helper methods------------------------------------ + def _put_blob(self, container_name, blob_name, blob, content_settings=None, + metadata=None, validate_content=False, lease_id=None, if_modified_since=None, + if_unmodified_since=None, if_match=None, if_none_match=None, + timeout=None): + ''' + Creates a blob or updates an existing blob. + + See create_blob_from_* for high level + functions that handle the creation and upload of large blobs with + automatic chunking and progress notifications. + + :param str container_name: + Name of existing container. + :param str blob_name: + Name of blob to create or update. + :param bytes blob: + Content of blob as bytes (size < 64MB). For larger size, you + must call put_block and put_block_list to set content of blob. + :param ~azure.storage.blob.models.ContentSettings content_settings: + ContentSettings object used to set properties on the blob. + :param metadata: + Name-value pairs associated with the blob as metadata. + :param bool validate_content: + If true, calculates an MD5 hash of the blob content. The storage + service checks the hash of the content that has arrived + with the hash that was sent. This is primarily valuable for detecting + bitflips on the wire if using http instead of https as https (the default) + will already validate. Note that this MD5 hash is not stored with the + blob. + :param str lease_id: + Required if the blob has an active lease. + :param datetime if_modified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only + if the resource has been modified since the specified time. + :param datetime if_unmodified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only if + the resource has not been modified since the specified date/time. + :param str if_match: + An ETag value, or the wildcard character (*). Specify this header to perform + the operation only if the resource's ETag matches the value specified. + :param str if_none_match: + An ETag value, or the wildcard character (*). Specify this header + to perform the operation only if the resource's ETag does not match + the value specified. Specify the wildcard character (*) to perform + the operation only if the resource does not exist, and fail the + operation if it does exist. + :param int timeout: + The timeout parameter is expressed in seconds. + :return: ETag and last modified properties for the new Block Blob + :rtype: :class:`~azure.storage.blob.models.ResourceProperties` + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + _validate_encryption_required(self.require_encryption, self.key_encryption_key) + + request = HTTPRequest() + request.method = 'PUT' + request.host_locations = self._get_host_locations() + request.path = _get_path(container_name, blob_name) + request.query = {'timeout': _int_to_str(timeout)} + request.headers = { + 'x-ms-blob-type': _to_str(self.blob_type), + 'x-ms-lease-id': _to_str(lease_id), + 'If-Modified-Since': _datetime_to_utc_string(if_modified_since), + 'If-Unmodified-Since': _datetime_to_utc_string(if_unmodified_since), + 'If-Match': _to_str(if_match), + 'If-None-Match': _to_str(if_none_match) + } + _add_metadata_headers(metadata, request) + if content_settings is not None: + request.headers.update(content_settings._to_headers()) + blob = _get_data_bytes_only('blob', blob) + if self.key_encryption_key: + encryption_data, blob = _encrypt_blob(blob, self.key_encryption_key) + request.headers['x-ms-meta-encryptiondata'] = encryption_data + request.body = blob + + if validate_content: + computed_md5 = _get_content_md5(request.body) + request.headers['Content-MD5'] = _to_str(computed_md5) + + return self._perform_request(request, _parse_base_properties) + + def _put_block(self, container_name, blob_name, block, block_id, + validate_content=False, lease_id=None, timeout=None): + ''' + See put_block for more details. This helper method + allows for encryption or other such special behavior because + it is safely handled by the library. These behaviors are + prohibited in the public version of this function. + ''' + + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + _validate_not_none('block', block) + _validate_not_none('block_id', block_id) + request = HTTPRequest() + request.method = 'PUT' + request.host_locations = self._get_host_locations() + request.path = _get_path(container_name, blob_name) + request.query = { + 'comp': 'block', + 'blockid': _encode_base64(_to_str(block_id)), + 'timeout': _int_to_str(timeout), + } + request.headers = { + 'x-ms-lease-id': _to_str(lease_id) + } + request.body = _get_data_bytes_or_stream_only('block', block) + if hasattr(request.body, 'read'): + if _len_plus(request.body) is None: + try: + data = b'' + for chunk in iter(lambda: request.body.read(4096), b""): + data += chunk + request.body = data + except AttributeError: + raise ValueError(_ERROR_VALUE_SHOULD_BE_STREAM.format('request.body')) + + if validate_content: + computed_md5 = _get_content_md5(request.body) + request.headers['Content-MD5'] = _to_str(computed_md5) + + self._perform_request(request) + + def _put_block_list( + self, container_name, blob_name, block_list, content_settings=None, + metadata=None, validate_content=False, lease_id=None, if_modified_since=None, + if_unmodified_since=None, if_match=None, if_none_match=None, + timeout=None, encryption_data=None): + ''' + See put_block_list for more details. This helper method + allows for encryption or other such special behavior because + it is safely handled by the library. These behaviors are + prohibited in the public version of this function. + :param str encryption_data: + A JSON formatted string containing the encryption metadata generated for this + blob if it was encrypted all at once upon upload. This should only be passed + in by internal methods. + ''' + + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + _validate_not_none('block_list', block_list) + request = HTTPRequest() + request.method = 'PUT' + request.host_locations = self._get_host_locations() + request.path = _get_path(container_name, blob_name) + request.query = { + 'comp': 'blocklist', + 'timeout': _int_to_str(timeout), + } + request.headers = { + 'x-ms-lease-id': _to_str(lease_id), + 'If-Modified-Since': _datetime_to_utc_string(if_modified_since), + 'If-Unmodified-Since': _datetime_to_utc_string(if_unmodified_since), + 'If-Match': _to_str(if_match), + 'If-None-Match': _to_str(if_none_match), + } + _add_metadata_headers(metadata, request) + if content_settings is not None: + request.headers.update(content_settings._to_headers()) + request.body = _get_request_body( + _convert_block_list_to_xml(block_list)) + + if validate_content: + computed_md5 = _get_content_md5(request.body) + request.headers['Content-MD5'] = _to_str(computed_md5) + + if encryption_data is not None: + request.headers['x-ms-meta-encryptiondata'] = encryption_data + + return self._perform_request(request, _parse_base_properties) diff --git a/src/storage-preview/azext_storage_preview/azure_storage/blob/models.py b/src/storage-preview/azext_storage_preview/azure_storage/blob/models.py new file mode 100644 index 00000000000..7611e823468 --- /dev/null +++ b/src/storage-preview/azext_storage_preview/azure_storage/blob/models.py @@ -0,0 +1,755 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- +from azure.storage.common._common_conversion import _to_str + + +class Container(object): + ''' + Blob container class. + + :ivar str name: + The name of the container. + :ivar metadata: + A dict containing name-value pairs associated with the container as metadata. + This var is set to None unless the include=metadata param was included + for the list containers operation. If this parameter was specified but the + container has no metadata, metadata will be set to an empty dictionary. + :vartype metadata: dict(str, str) + :ivar ContainerProperties properties: + System properties for the container. + ''' + + def __init__(self, name=None, props=None, metadata=None): + self.name = name + self.properties = props or ContainerProperties() + self.metadata = metadata + + +class ContainerProperties(object): + ''' + Blob container's properties class. + + :ivar datetime last_modified: + A datetime object representing the last time the container was modified. + :ivar str etag: + The ETag contains a value that you can use to perform operations + conditionally. + :ivar LeaseProperties lease: + Stores all the lease information for the container. + ''' + + def __init__(self): + self.last_modified = None + self.etag = None + self.lease = LeaseProperties() + self.public_access = None + + +class Blob(object): + ''' + Blob class. + + :ivar str name: + Name of blob. + :ivar str snapshot: + A DateTime value that uniquely identifies the snapshot. The value of + this header indicates the snapshot version, and may be used in + subsequent requests to access the snapshot. + :ivar content: + Blob content. + :vartype content: str or bytes + :ivar BlobProperties properties: + Stores all the system properties for the blob. + :ivar metadata: + Name-value pairs associated with the blob as metadata. + :ivar bool deleted: + Specify whether the blob was soft deleted. + In other words, if the blob is being retained by the delete retention policy, + this field would be True. The blob could be undeleted or it will be garbage collected after the specified + time period. + ''' + + def __init__(self, name=None, snapshot=None, content=None, props=None, metadata=None, deleted=False): + self.name = name + self.snapshot = snapshot + self.content = content + self.properties = props or BlobProperties() + self.metadata = metadata + self.deleted = deleted + + +class BlobProperties(object): + ''' + Blob Properties + + :ivar str blob_type: + String indicating this blob's type. + :ivar datetime last_modified: + A datetime object representing the last time the blob was modified. + :ivar str etag: + The ETag contains a value that you can use to perform operations + conditionally. + :ivar int content_length: + The length of the content returned. If the entire blob was requested, + the length of blob in bytes. If a subset of the blob was requested, the + length of the returned subset. + :ivar str content_range: + Indicates the range of bytes returned in the event that the client + requested a subset of the blob. + :ivar int append_blob_committed_block_count: + (For Append Blobs) Number of committed blocks in the blob. + :ivar int page_blob_sequence_number: + (For Page Blobs) Sequence number for page blob used for coordinating + concurrent writes. + :ivar bool server_encrypted: + Set to true if the blob is encrypted on the server. + :ivar ~azure.storage.blob.models.CopyProperties copy: + Stores all the copy properties for the blob. + :ivar ~azure.storage.blob.models.ContentSettings content_settings: + Stores all the content settings for the blob. + :ivar ~azure.storage.blob.models.LeaseProperties lease: + Stores all the lease information for the blob. + :ivar StandardBlobTier blob_tier: + Indicates the access tier of the blob. The hot tier is optimized + for storing data that is accessed frequently. The cool storage tier + is optimized for storing data that is infrequently accessed and stored + for at least a month. The archive tier is optimized for storing + data that is rarely accessed and stored for at least six months + with flexible latency requirements. + :ivar datetime blob_tier_change_time: + Indicates when the access tier was last changed. + :ivar bool blob_tier_inferred: + Indicates whether the access tier was inferred by the service. + If false, it indicates that the tier was set explicitly. + :ivar datetime deleted_time: + A datetime object representing the time at which the blob was deleted. + :ivar int remaining_retention_days: + The number of days that the blob will be retained before being permanently deleted by the service. + ''' + + def __init__(self): + self.blob_type = None + self.last_modified = None + self.etag = None + self.content_length = None + self.content_range = None + self.append_blob_committed_block_count = None + self.page_blob_sequence_number = None + self.server_encrypted = None + self.copy = CopyProperties() + self.content_settings = ContentSettings() + self.lease = LeaseProperties() + self.blob_tier = None + self.blob_tier_change_time = None + self.blob_tier_inferred = False + self.deleted_time = None + self.remaining_retention_days = None + + +class ContentSettings(object): + ''' + Used to store the content settings of a blob. + + :ivar str content_type: + The content type specified for the blob. If no content type was + specified, the default content type is application/octet-stream. + :ivar str content_encoding: + If the content_encoding has previously been set + for the blob, that value is stored. + :ivar str content_language: + If the content_language has previously been set + for the blob, that value is stored. + :ivar str content_disposition: + content_disposition conveys additional information about how to + process the response payload, and also can be used to attach + additional metadata. If content_disposition has previously been set + for the blob, that value is stored. + :ivar str cache_control: + If the cache_control has previously been set for + the blob, that value is stored. + :ivar str content_md5: + If the content_md5 has been set for the blob, this response + header is stored so that the client can check for message content + integrity. + ''' + + def __init__( + self, content_type=None, content_encoding=None, + content_language=None, content_disposition=None, + cache_control=None, content_md5=None): + self.content_type = content_type + self.content_encoding = content_encoding + self.content_language = content_language + self.content_disposition = content_disposition + self.cache_control = cache_control + self.content_md5 = content_md5 + + def _to_headers(self): + return { + 'x-ms-blob-cache-control': _to_str(self.cache_control), + 'x-ms-blob-content-type': _to_str(self.content_type), + 'x-ms-blob-content-disposition': _to_str(self.content_disposition), + 'x-ms-blob-content-md5': _to_str(self.content_md5), + 'x-ms-blob-content-encoding': _to_str(self.content_encoding), + 'x-ms-blob-content-language': _to_str(self.content_language), + } + + +class CopyProperties(object): + ''' + Blob Copy Properties. + + :ivar str id: + String identifier for the last attempted Copy Blob operation where this blob + was the destination blob. This header does not appear if this blob has never + been the destination in a Copy Blob operation, or if this blob has been + modified after a concluded Copy Blob operation using Set Blob Properties, + Put Blob, or Put Block List. + :ivar str source: + URL up to 2 KB in length that specifies the source blob used in the last attempted + Copy Blob operation where this blob was the destination blob. This header does not + appear if this blob has never been the destination in a Copy Blob operation, or if + this blob has been modified after a concluded Copy Blob operation using + Set Blob Properties, Put Blob, or Put Block List. + :ivar str status: + State of the copy operation identified by Copy ID, with these values: + success: + Copy completed successfully. + pending: + Copy is in progress. Check copy_status_description if intermittent, + non-fatal errors impede copy progress but don't cause failure. + aborted: + Copy was ended by Abort Copy Blob. + failed: + Copy failed. See copy_status_description for failure details. + :ivar str progress: + Contains the number of bytes copied and the total bytes in the source in the last + attempted Copy Blob operation where this blob was the destination blob. Can show + between 0 and Content-Length bytes copied. + :ivar datetime completion_time: + Conclusion time of the last attempted Copy Blob operation where this blob was the + destination blob. This value can specify the time of a completed, aborted, or + failed copy attempt. + :ivar str status_description: + only appears when x-ms-copy-status is failed or pending. Describes cause of fatal + or non-fatal copy operation failure. + ''' + + def __init__(self): + self.id = None + self.source = None + self.status = None + self.progress = None + self.completion_time = None + self.status_description = None + + +class LeaseProperties(object): + ''' + Blob Lease Properties. + + :ivar str status: + The lease status of the blob. + Possible values: locked|unlocked + :ivar str state: + Lease state of the blob. + Possible values: available|leased|expired|breaking|broken + :ivar str duration: + When a blob is leased, specifies whether the lease is of infinite or fixed duration. + ''' + + def __init__(self): + self.status = None + self.state = None + self.duration = None + + +class BlobPrefix(object): + ''' + BlobPrefix objects may potentially returned in the blob list when + :func:`~azure.storage.blob.baseblobservice.BaseBlobService.list_blobs` is + used with a delimiter. Prefixes can be thought of as virtual blob directories. + + :ivar str name: The name of the blob prefix. + ''' + + def __init__(self): + self.name = None + + +class BlobBlockState(object): + '''Block blob block types.''' + + Committed = 'Committed' + '''Committed blocks.''' + + Latest = 'Latest' + '''Latest blocks.''' + + Uncommitted = 'Uncommitted' + '''Uncommitted blocks.''' + + +class BlobBlock(object): + ''' + BlockBlob Block class. + + :ivar str id: + Block id. + :ivar str state: + Block state. + Possible valuse: committed|uncommitted + :ivar int size: + Block size in bytes. + ''' + + def __init__(self, id=None, state=BlobBlockState.Latest): + self.id = id + self.state = state + + def _set_size(self, size): + self.size = size + + +class BlobBlockList(object): + ''' + Blob Block List class. + + :ivar committed_blocks: + List of committed blocks. + :vartype committed_blocks: list(:class:`~azure.storage.blob.models.BlobBlock`) + :ivar uncommitted_blocks: + List of uncommitted blocks. + :vartype uncommitted_blocks: list(:class:`~azure.storage.blob.models.BlobBlock`) + ''' + + def __init__(self): + self.committed_blocks = list() + self.uncommitted_blocks = list() + + +class PageRange(object): + ''' + Page Range for page blob. + + :ivar int start: + Start of page range in bytes. + :ivar int end: + End of page range in bytes. + :ivar bool is_cleared: + Indicates if a page range is cleared or not. Only applicable + for get_page_range_diff API. + ''' + + def __init__(self, start=None, end=None, is_cleared=False): + self.start = start + self.end = end + self.is_cleared = is_cleared + + +class ResourceProperties(object): + ''' + Base response for a resource request. + + :ivar str etag: + Opaque etag value that can be used to check if resource + has been modified. + :ivar datetime last_modified: + Datetime for last time resource was modified. + ''' + + def __init__(self): + self.last_modified = None + self.etag = None + + +class AppendBlockProperties(ResourceProperties): + ''' + Response for an append block request. + + :ivar int append_offset: + Position to start next append. + :ivar int committed_block_count: + Number of committed append blocks. + ''' + + def __init__(self): + super(ResourceProperties, self).__init__() + self.append_offset = None + self.committed_block_count = None + + +class PageBlobProperties(ResourceProperties): + ''' + Response for a page request. + + :ivar int sequence_number: + Identifer for page blobs to help handle concurrent writes. + ''' + + def __init__(self): + super(ResourceProperties, self).__init__() + self.sequence_number = None + + +class PublicAccess(object): + ''' + Specifies whether data in the container may be accessed publicly and the level of access. + ''' + + OFF = 'off' + ''' + Specifies that there is no public read access for both the container and blobs within the container. + Clients cannot enumerate the containers within the storage account as well as the blobs within the container. + ''' + + Blob = 'blob' + ''' + Specifies public read access for blobs. Blob data within this container can be read + via anonymous request, but container data is not available. Clients cannot enumerate + blobs within the container via anonymous request. + ''' + + Container = 'container' + ''' + Specifies full public read access for container and blob data. Clients can enumerate + blobs within the container via anonymous request, but cannot enumerate containers + within the storage account. + ''' + + +class DeleteSnapshot(object): + ''' + Required if the blob has associated snapshots. Specifies how to handle the snapshots. + ''' + + Include = 'include' + ''' + Delete the base blob and all of its snapshots. + ''' + + Only = 'only' + ''' + Delete only the blob's snapshots and not the blob itself. + ''' + + +class BlockListType(object): + ''' + Specifies whether to return the list of committed blocks, the list of uncommitted + blocks, or both lists together. + ''' + + All = 'all' + '''Both committed and uncommitted blocks.''' + + Committed = 'committed' + '''Committed blocks.''' + + Uncommitted = 'uncommitted' + '''Uncommitted blocks.''' + + +class SequenceNumberAction(object): + '''Sequence number actions.''' + + Increment = 'increment' + ''' + Increments the value of the sequence number by 1. If specifying this option, + do not include the x-ms-blob-sequence-number header. + ''' + + Max = 'max' + ''' + Sets the sequence number to be the higher of the value included with the + request and the value currently stored for the blob. + ''' + + Update = 'update' + '''Sets the sequence number to the value included with the request.''' + + +class _LeaseActions(object): + '''Actions for a lease.''' + + Acquire = 'acquire' + '''Acquire the lease.''' + + Break = 'break' + '''Break the lease.''' + + Change = 'change' + '''Change the lease ID.''' + + Release = 'release' + '''Release the lease.''' + + Renew = 'renew' + '''Renew the lease.''' + + +class _BlobTypes(object): + '''Blob type options.''' + + AppendBlob = 'AppendBlob' + '''Append blob type.''' + + BlockBlob = 'BlockBlob' + '''Block blob type.''' + + PageBlob = 'PageBlob' + '''Page blob type.''' + + +class Include(object): + ''' + Specifies the datasets to include in the blob list response. + + :ivar ~azure.storage.blob.models.Include Include.COPY: + Specifies that metadata related to any current or previous Copy Blob operation + should be included in the response. + :ivar ~azure.storage.blob.models.Include Include.METADATA: + Specifies that metadata be returned in the response. + :ivar ~azure.storage.blob.models.Include Include.SNAPSHOTS: + Specifies that snapshots should be included in the enumeration. + :ivar ~azure.storage.blob.models.Include Include.UNCOMMITTED_BLOBS: + Specifies that blobs for which blocks have been uploaded, but which have not + been committed using Put Block List, be included in the response. + :ivar ~azure.storage.blob.models.Include Include.DELETED: + Specifies that deleted blobs should be returned in the response. + ''' + + def __init__(self, snapshots=False, metadata=False, uncommitted_blobs=False, + copy=False, deleted=False, _str=None): + ''' + :param bool snapshots: + Specifies that snapshots should be included in the enumeration. + :param bool metadata: + Specifies that metadata be returned in the response. + :param bool uncommitted_blobs: + Specifies that blobs for which blocks have been uploaded, but which have + not been committed using Put Block List, be included in the response. + :param bool copy: + Specifies that metadata related to any current or previous Copy Blob + operation should be included in the response. + :param bool deleted: + Specifies that deleted blobs should be returned in the response. + :param str _str: + A string representing the includes. + ''' + if not _str: + _str = '' + components = _str.split(',') + self.snapshots = snapshots or ('snapshots' in components) + self.metadata = metadata or ('metadata' in components) + self.uncommitted_blobs = uncommitted_blobs or ('uncommittedblobs' in components) + self.copy = copy or ('copy' in components) + self.deleted = deleted or ('deleted' in components) + + def __or__(self, other): + return Include(_str=str(self) + str(other)) + + def __add__(self, other): + return Include(_str=str(self) + str(other)) + + def __str__(self): + include = (('snapshots,' if self.snapshots else '') + + ('metadata,' if self.metadata else '') + + ('uncommittedblobs,' if self.uncommitted_blobs else '') + + ('copy,' if self.copy else '') + + ('deleted,' if self.deleted else '')) + return include.rstrip(',') + + +Include.COPY = Include(copy=True) +Include.METADATA = Include(metadata=True) +Include.SNAPSHOTS = Include(snapshots=True) +Include.UNCOMMITTED_BLOBS = Include(uncommitted_blobs=True) +Include.DELETED = Include(deleted=True) + + +class BlobPermissions(object): + ''' + BlobPermissions class to be used with + :func:`~azure.storage.blob.baseblobservice.BaseBlobService.generate_blob_shared_access_signature` API. + + :ivar BlobPermissions BlobPermissions.ADD: + Add a block to an append blob. + :ivar BlobPermissions BlobPermissions.CREATE: + Write a new blob, snapshot a blob, or copy a blob to a new blob. + :ivar BlobPermissions BlobPermissions.DELETE: + Delete the blob. + :ivar BlobPermissions BlobPermissions.READ: + Read the content, properties, metadata and block list. Use the blob as the source of a copy operation. + :ivar BlobPermissions BlobPermissions.WRITE: + Create or write content, properties, metadata, or block list. Snapshot or lease + the blob. Resize the blob (page blob only). Use the blob as the destination of a + copy operation within the same account. + ''' + + def __init__(self, read=False, add=False, create=False, write=False, + delete=False, _str=None): + ''' + :param bool read: + Read the content, properties, metadata and block list. Use the blob as + the source of a copy operation. + :param bool add: + Add a block to an append blob. + :param bool create: + Write a new blob, snapshot a blob, or copy a blob to a new blob. + :param bool write: + Create or write content, properties, metadata, or block list. Snapshot + or lease the blob. Resize the blob (page blob only). Use the blob as the + destination of a copy operation within the same account. + :param bool delete: + Delete the blob. + :param str _str: + A string representing the permissions. + ''' + if not _str: + _str = '' + self.read = read or ('r' in _str) + self.add = add or ('a' in _str) + self.create = create or ('c' in _str) + self.write = write or ('w' in _str) + self.delete = delete or ('d' in _str) + + def __or__(self, other): + return BlobPermissions(_str=str(self) + str(other)) + + def __add__(self, other): + return BlobPermissions(_str=str(self) + str(other)) + + def __str__(self): + return (('r' if self.read else '') + + ('a' if self.add else '') + + ('c' if self.create else '') + + ('w' if self.write else '') + + ('d' if self.delete else '')) + + +BlobPermissions.ADD = BlobPermissions(add=True) +BlobPermissions.CREATE = BlobPermissions(create=True) +BlobPermissions.DELETE = BlobPermissions(delete=True) +BlobPermissions.READ = BlobPermissions(read=True) +BlobPermissions.WRITE = BlobPermissions(write=True) + + +class ContainerPermissions(object): + ''' + ContainerPermissions class to be used with :func:`~azure.storage.blob.baseblobservice.BaseBlobService.generate_container_shared_access_signature` + API and for the AccessPolicies used with :func:`~azure.storage.blob.baseblobservice.BaseBlobService.set_container_acl`. + + :ivar ContainerPermissions ContainerPermissions.DELETE: + Delete any blob in the container. Note: You cannot grant permissions to + delete a container with a container SAS. Use an account SAS instead. + :ivar ContainerPermissions ContainerPermissions.LIST: + List blobs in the container. + :ivar ContainerPermissions ContainerPermissions.READ: + Read the content, properties, metadata or block list of any blob in the + container. Use any blob in the container as the source of a copy operation. + :ivar ContainerPermissions ContainerPermissions.WRITE: + For any blob in the container, create or write content, properties, + metadata, or block list. Snapshot or lease the blob. Resize the blob + (page blob only). Use the blob as the destination of a copy operation + within the same account. Note: You cannot grant permissions to read or + write container properties or metadata, nor to lease a container, with + a container SAS. Use an account SAS instead. + ''' + + def __init__(self, read=False, write=False, delete=False, list=False, + _str=None): + ''' + :param bool read: + Read the content, properties, metadata or block list of any blob in the + container. Use any blob in the container as the source of a copy operation. + :param bool write: + For any blob in the container, create or write content, properties, + metadata, or block list. Snapshot or lease the blob. Resize the blob + (page blob only). Use the blob as the destination of a copy operation + within the same account. Note: You cannot grant permissions to read or + write container properties or metadata, nor to lease a container, with + a container SAS. Use an account SAS instead. + :param bool delete: + Delete any blob in the container. Note: You cannot grant permissions to + delete a container with a container SAS. Use an account SAS instead. + :param bool list: + List blobs in the container. + :param str _str: + A string representing the permissions. + ''' + if not _str: + _str = '' + self.read = read or ('r' in _str) + self.write = write or ('w' in _str) + self.delete = delete or ('d' in _str) + self.list = list or ('l' in _str) + + def __or__(self, other): + return ContainerPermissions(_str=str(self) + str(other)) + + def __add__(self, other): + return ContainerPermissions(_str=str(self) + str(other)) + + def __str__(self): + return (('r' if self.read else '') + + ('w' if self.write else '') + + ('d' if self.delete else '') + + ('l' if self.list else '')) + + +ContainerPermissions.DELETE = ContainerPermissions(delete=True) +ContainerPermissions.LIST = ContainerPermissions(list=True) +ContainerPermissions.READ = ContainerPermissions(read=True) +ContainerPermissions.WRITE = ContainerPermissions(write=True) + + +class PremiumPageBlobTier(object): + ''' + Specifies the page blob tier to set the blob to. This is only applicable to page + blobs on premium storage accounts. + Please take a look at https://docs.microsoft.com/en-us/azure/storage/storage-premium-storage#scalability-and-performance-targets + for detailed information on the corresponding IOPS and throughtput per PageBlobTier. + ''' + + P4 = 'P4' + ''' P4 Tier ''' + + P6 = 'P6' + ''' P6 Tier ''' + + P10 = 'P10' + ''' P10 Tier ''' + + P20 = 'P20' + ''' P20 Tier ''' + + P30 = 'P30' + ''' P30 Tier ''' + + P40 = 'P40' + ''' P40 Tier ''' + + P50 = 'P50' + ''' P50 Tier ''' + + P60 = 'P60' + ''' P60 Tier ''' + + +class StandardBlobTier(object): + ''' + Specifies the blob tier to set the blob to. This is only applicable for block blobs on standard storage accounts. + ''' + + Archive = 'Archive' + ''' Archive ''' + + Cool = 'Cool' + ''' Cool ''' + + Hot = 'Hot' + ''' Hot ''' diff --git a/src/storage-preview/azext_storage_preview/azure_storage/blob/pageblobservice.py b/src/storage-preview/azext_storage_preview/azure_storage/blob/pageblobservice.py new file mode 100644 index 00000000000..4fe198b49ab --- /dev/null +++ b/src/storage-preview/azext_storage_preview/azure_storage/blob/pageblobservice.py @@ -0,0 +1,1392 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- +import sys +from os import path + +from azure.storage.common._common_conversion import ( + _int_to_str, + _to_str, + _datetime_to_utc_string, + _get_content_md5, +) +from azure.storage.common._constants import ( + SERVICE_HOST_BASE, + DEFAULT_PROTOCOL, +) +from azure.storage.common._error import ( + _validate_not_none, + _validate_type_bytes, + _validate_encryption_required, + _validate_encryption_unsupported, + _ERROR_VALUE_NEGATIVE, +) +from azure.storage.common._http import HTTPRequest +from azure.storage.common._serialization import ( + _get_data_bytes_only, + _add_metadata_headers, +) +from ._deserialization import ( + _convert_xml_to_page_ranges, + _parse_page_properties, + _parse_base_properties, +) +from ._encryption import _generate_blob_encryption_data +from ._error import ( + _ERROR_PAGE_BLOB_SIZE_ALIGNMENT, +) +from ._serialization import ( + _get_path, + _validate_and_format_range_headers, +) +from ._upload_chunking import ( + _PageBlobChunkUploader, + _upload_blob_chunks, +) +from .baseblobservice import BaseBlobService +from .models import ( + _BlobTypes, + ResourceProperties) + +if sys.version_info >= (3,): + from io import BytesIO +else: + from cStringIO import StringIO as BytesIO + +# Keep this value sync with _ERROR_PAGE_BLOB_SIZE_ALIGNMENT +_PAGE_ALIGNMENT = 512 + + +class PageBlobService(BaseBlobService): + ''' + Page blobs are a collection of 512-byte pages optimized for random read and + write operations. To create a page blob, you initialize the page blob and + specify the maximum size the page blob will grow. To add or update the + contents of a page blob, you write a page or pages by specifying an offset + and a range that align to 512-byte page boundaries. A write to a page blob + can overwrite just one page, some pages, or up to 4 MB of the page blob. + Writes to page blobs happen in-place and are immediately committed to the + blob. The maximum size for a page blob is 8 TB. + + :ivar int MAX_PAGE_SIZE: + The size of the pages put by create_blob_from_* methods. Smaller pages + may be put if there is less data provided. The maximum page size the service + supports is 4MB. When using the create_blob_from_* methods, empty pages are skipped. + ''' + + MAX_PAGE_SIZE = 4 * 1024 * 1024 + + def __init__(self, account_name=None, account_key=None, sas_token=None, is_emulated=False, + protocol=DEFAULT_PROTOCOL, endpoint_suffix=SERVICE_HOST_BASE, custom_domain=None, + request_session=None, connection_string=None, socket_timeout=None, token_credential=None): + ''' + :param str account_name: + The storage account name. This is used to authenticate requests + signed with an account key and to construct the storage endpoint. It + is required unless a connection string is given, or if a custom + domain is used with anonymous authentication. + :param str account_key: + The storage account key. This is used for shared key authentication. + If neither account key or sas token is specified, anonymous access + will be used. + :param str sas_token: + A shared access signature token to use to authenticate requests + instead of the account key. If account key and sas token are both + specified, account key will be used to sign. If neither are + specified, anonymous access will be used. + :param bool is_emulated: + Whether to use the emulator. Defaults to False. If specified, will + override all other parameters besides connection string and request + session. + :param str protocol: + The protocol to use for requests. Defaults to https. + :param str endpoint_suffix: + The host base component of the url, minus the account name. Defaults + to Azure (core.windows.net). Override this to use the China cloud + (core.chinacloudapi.cn). + :param str custom_domain: + The custom domain to use. This can be set in the Azure Portal. For + example, 'www.mydomain.com'. + :param requests.Session request_session: + The session object to use for http requests. + :param str connection_string: + If specified, this will override all other parameters besides + request session. See + http://azure.microsoft.com/en-us/documentation/articles/storage-configure-connection-string/ + for the connection string format. + :param int socket_timeout: + If specified, this will override the default socket timeout. The timeout specified is in seconds. + See DEFAULT_SOCKET_TIMEOUT in _constants.py for the default value. + :param token_credential: + A token credential used to authenticate HTTPS requests. The token value + should be updated before its expiration. + :type `~azure.storage.common.TokenCredential` + ''' + self.blob_type = _BlobTypes.PageBlob + super(PageBlobService, self).__init__( + account_name, account_key, sas_token, is_emulated, protocol, endpoint_suffix, + custom_domain, request_session, connection_string, socket_timeout, token_credential) + + def create_blob( + self, container_name, blob_name, content_length, content_settings=None, + sequence_number=None, metadata=None, lease_id=None, if_modified_since=None, + if_unmodified_since=None, if_match=None, if_none_match=None, timeout=None, premium_page_blob_tier=None): + ''' + Creates a new Page Blob. + + See create_blob_from_* for high level functions that handle the + creation and upload of large blobs with automatic chunking and + progress notifications. + + :param str container_name: + Name of existing container. + :param str blob_name: + Name of blob to create or update. + :param int content_length: + Required. This header specifies the maximum size + for the page blob, up to 1 TB. The page blob size must be aligned + to a 512-byte boundary. + :param ~azure.storage.blob.models.ContentSettings content_settings: + ContentSettings object used to set properties on the blob. + :param int sequence_number: + The sequence number is a user-controlled value that you can use to + track requests. The value of the sequence number must be between 0 + and 2^63 - 1.The default value is 0. + :param metadata: + Name-value pairs associated with the blob as metadata. + :type metadata: dict(str, str) + :param str lease_id: + Required if the blob has an active lease. + :param datetime if_modified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only + if the resource has been modified since the specified time. + :param datetime if_unmodified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only if + the resource has not been modified since the specified date/time. + :param str if_match: + An ETag value, or the wildcard character (*). Specify this header to perform + the operation only if the resource's ETag matches the value specified. + :param str if_none_match: + An ETag value, or the wildcard character (*). Specify this header + to perform the operation only if the resource's ETag does not match + the value specified. Specify the wildcard character (*) to perform + the operation only if the resource does not exist, and fail the + operation if it does exist. + :param int timeout: + The timeout parameter is expressed in seconds. + :param PremiumPageBlobTier premium_page_blob_tier: + A page blob tier value to set the blob to. The tier correlates to the size of the + blob and number of allowed IOPS. This is only applicable to page blobs on + premium storage accounts. + :return: ETag and last modified properties for the new Page Blob + :rtype: :class:`~azure.storage.blob.models.ResourceProperties` + ''' + _validate_encryption_unsupported(self.require_encryption, self.key_encryption_key) + + return self._create_blob( + container_name, + blob_name, + content_length, + content_settings=content_settings, + sequence_number=sequence_number, + metadata=metadata, + lease_id=lease_id, + premium_page_blob_tier=premium_page_blob_tier, + if_modified_since=if_modified_since, + if_unmodified_since=if_unmodified_since, + if_match=if_match, + if_none_match=if_none_match, + timeout=timeout + ) + + def incremental_copy_blob(self, container_name, blob_name, copy_source, + metadata=None, destination_if_modified_since=None, destination_if_unmodified_since=None, + destination_if_match=None, destination_if_none_match=None, destination_lease_id=None, + source_lease_id=None, timeout=None): + ''' + Copies an incremental copy of a blob asynchronously. This operation returns a copy operation + properties object, including a copy ID you can use to check or abort the + copy operation. The Blob service copies blobs on a best-effort basis. + + The source blob for an incremental copy operation must be a page blob. + Call get_blob_properties on the destination blob to check the status of the copy operation. + The final blob will be committed when the copy completes. + + :param str container_name: + Name of the destination container. The container must exist. + :param str blob_name: + Name of the destination blob. If the destination blob exists, it will + be overwritten. Otherwise, it will be created. + :param str copy_source: + A URL of up to 2 KB in length that specifies an Azure page blob. + The value should be URL-encoded as it would appear in a request URI. + The copy source must be a snapshot and include a valid SAS token or be public. + Example: + https://myaccount.blob.core.windows.net/mycontainer/myblob?snapshot=&sastoken + :param metadata: + Name-value pairs associated with the blob as metadata. If no name-value + pairs are specified, the operation will copy the metadata from the + source blob or file to the destination blob. If one or more name-value + pairs are specified, the destination blob is created with the specified + metadata, and metadata is not copied from the source blob or file. + :type metadata: dict(str, str). + :param datetime destination_if_modified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this conditional header to copy the blob only + if the destination blob has been modified since the specified date/time. + If the destination blob has not been modified, the Blob service returns + status code 412 (Precondition Failed). + :param datetime destination_if_unmodified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this conditional header to copy the blob only if the destination blob + has not been modified since the specified ate/time. If the destination blob + has been modified, the Blob service returns status code 412 (Precondition Failed). + :param ETag destination_if_match: + An ETag value, or the wildcard character (*). Specify an ETag value for + this conditional header to copy the blob only if the specified ETag value + matches the ETag value for an existing destination blob. If the ETag for + the destination blob does not match the ETag specified for If-Match, the + Blob service returns status code 412 (Precondition Failed). + :param ETag destination_if_none_match: + An ETag value, or the wildcard character (*). Specify an ETag value for + this conditional header to copy the blob only if the specified ETag value + does not match the ETag value for the destination blob. Specify the wildcard + character (*) to perform the operation only if the destination blob does not + exist. If the specified condition isn't met, the Blob service returns status + code 412 (Precondition Failed). + :param str destination_lease_id: + The lease ID specified for this header must match the lease ID of the + destination blob. If the request does not include the lease ID or it is not + valid, the operation fails with status code 412 (Precondition Failed). + :param str source_lease_id: + Specify this to perform the Copy Blob operation only if + the lease ID given matches the active lease ID of the source blob. + :param int timeout: + The timeout parameter is expressed in seconds. + :return: Copy operation properties such as status, source, and ID. + :rtype: :class:`~azure.storage.blob.models.CopyProperties` + ''' + return self._copy_blob(container_name, blob_name, copy_source, + metadata, + source_if_modified_since=None, source_if_unmodified_since=None, + source_if_match=None, source_if_none_match=None, + destination_if_modified_since=destination_if_modified_since, + destination_if_unmodified_since=destination_if_unmodified_since, + destination_if_match=destination_if_match, + destination_if_none_match=destination_if_none_match, + destination_lease_id=destination_lease_id, + source_lease_id=source_lease_id, timeout=timeout, + incremental_copy=True) + + def update_page( + self, container_name, blob_name, page, start_range, end_range, + validate_content=False, lease_id=None, if_sequence_number_lte=None, + if_sequence_number_lt=None, if_sequence_number_eq=None, + if_modified_since=None, if_unmodified_since=None, + if_match=None, if_none_match=None, timeout=None): + ''' + Updates a range of pages. + + :param str container_name: + Name of existing container. + :param str blob_name: + Name of existing blob. + :param bytes page: + Content of the page. + :param int start_range: + Start of byte range to use for writing to a section of the blob. + Pages must be aligned with 512-byte boundaries, the start offset + must be a modulus of 512 and the end offset must be a modulus of + 512-1. Examples of valid byte ranges are 0-511, 512-1023, etc. + :param int end_range: + End of byte range to use for writing to a section of the blob. + Pages must be aligned with 512-byte boundaries, the start offset + must be a modulus of 512 and the end offset must be a modulus of + 512-1. Examples of valid byte ranges are 0-511, 512-1023, etc. + :param bool validate_content: + If true, calculates an MD5 hash of the page content. The storage + service checks the hash of the content that has arrived + with the hash that was sent. This is primarily valuable for detecting + bitflips on the wire if using http instead of https as https (the default) + will already validate. Note that this MD5 hash is not stored with the + blob. + :param str lease_id: + Required if the blob has an active lease. + :param int if_sequence_number_lte: + If the blob's sequence number is less than or equal to + the specified value, the request proceeds; otherwise it fails. + :param int if_sequence_number_lt: + If the blob's sequence number is less than the specified + value, the request proceeds; otherwise it fails. + :param int if_sequence_number_eq: + If the blob's sequence number is equal to the specified + value, the request proceeds; otherwise it fails. + :param datetime if_modified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only + if the resource has been modified since the specified time. + :param datetime if_unmodified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only if + the resource has not been modified since the specified date/time. + :param str if_match: + An ETag value, or the wildcard character (*). Specify an ETag value for this conditional + header to write the page only if the blob's ETag value matches the + value specified. If the values do not match, the Blob service fails. + :param str if_none_match: + An ETag value, or the wildcard character (*). Specify an ETag value for this conditional + header to write the page only if the blob's ETag value does not + match the value specified. If the values are identical, the Blob + service fails. + :param int timeout: + The timeout parameter is expressed in seconds. + :return: ETag and last modified properties for the updated Page Blob + :rtype: :class:`~azure.storage.blob.models.ResourceProperties` + ''' + + _validate_encryption_unsupported(self.require_encryption, self.key_encryption_key) + + return self._update_page( + container_name, + blob_name, + page, + start_range, + end_range, + validate_content=validate_content, + lease_id=lease_id, + if_sequence_number_lte=if_sequence_number_lte, + if_sequence_number_lt=if_sequence_number_lt, + if_sequence_number_eq=if_sequence_number_eq, + if_modified_since=if_modified_since, + if_unmodified_since=if_unmodified_since, + if_match=if_match, + if_none_match=if_none_match, + timeout=timeout + ) + + def clear_page( + self, container_name, blob_name, start_range, end_range, + lease_id=None, if_sequence_number_lte=None, + if_sequence_number_lt=None, if_sequence_number_eq=None, + if_modified_since=None, if_unmodified_since=None, + if_match=None, if_none_match=None, timeout=None): + ''' + Clears a range of pages. + + :param str container_name: + Name of existing container. + :param str blob_name: + Name of existing blob. + :param int start_range: + Start of byte range to use for writing to a section of the blob. + Pages must be aligned with 512-byte boundaries, the start offset + must be a modulus of 512 and the end offset must be a modulus of + 512-1. Examples of valid byte ranges are 0-511, 512-1023, etc. + :param int end_range: + End of byte range to use for writing to a section of the blob. + Pages must be aligned with 512-byte boundaries, the start offset + must be a modulus of 512 and the end offset must be a modulus of + 512-1. Examples of valid byte ranges are 0-511, 512-1023, etc. + :param str lease_id: + Required if the blob has an active lease. + :param int if_sequence_number_lte: + If the blob's sequence number is less than or equal to + the specified value, the request proceeds; otherwise it fails. + :param int if_sequence_number_lt: + If the blob's sequence number is less than the specified + value, the request proceeds; otherwise it fails. + :param int if_sequence_number_eq: + If the blob's sequence number is equal to the specified + value, the request proceeds; otherwise it fails. + :param datetime if_modified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only + if the resource has been modified since the specified time. + :param datetime if_unmodified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only if + the resource has not been modified since the specified date/time. + :param str if_match: + An ETag value, or the wildcard character (*). Specify an ETag value for this conditional + header to write the page only if the blob's ETag value matches the + value specified. If the values do not match, the Blob service fails. + :param str if_none_match: + An ETag value, or the wildcard character (*). Specify an ETag value for this conditional + header to write the page only if the blob's ETag value does not + match the value specified. If the values are identical, the Blob + service fails. + :param int timeout: + The timeout parameter is expressed in seconds. + :return: ETag and last modified properties for the updated Page Blob + :rtype: :class:`~azure.storage.blob.models.ResourceProperties` + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + + request = HTTPRequest() + request.method = 'PUT' + request.host_locations = self._get_host_locations() + request.path = _get_path(container_name, blob_name) + request.query = { + 'comp': 'page', + 'timeout': _int_to_str(timeout), + } + request.headers = { + 'x-ms-page-write': 'clear', + 'x-ms-lease-id': _to_str(lease_id), + 'x-ms-if-sequence-number-le': _to_str(if_sequence_number_lte), + 'x-ms-if-sequence-number-lt': _to_str(if_sequence_number_lt), + 'x-ms-if-sequence-number-eq': _to_str(if_sequence_number_eq), + 'If-Modified-Since': _datetime_to_utc_string(if_modified_since), + 'If-Unmodified-Since': _datetime_to_utc_string(if_unmodified_since), + 'If-Match': _to_str(if_match), + 'If-None-Match': _to_str(if_none_match) + } + _validate_and_format_range_headers( + request, + start_range, + end_range, + align_to_page=True) + + return self._perform_request(request, _parse_page_properties) + + def get_page_ranges( + self, container_name, blob_name, snapshot=None, start_range=None, + end_range=None, lease_id=None, if_modified_since=None, + if_unmodified_since=None, if_match=None, if_none_match=None, timeout=None): + ''' + Returns the list of valid page ranges for a Page Blob or snapshot + of a page blob. + + :param str container_name: + Name of existing container. + :param str blob_name: + Name of existing blob. + :param str snapshot: + The snapshot parameter is an opaque DateTime value that, + when present, specifies the blob snapshot to retrieve information + from. + :param int start_range: + Start of byte range to use for getting valid page ranges. + If no end_range is given, all bytes after the start_range will be searched. + Pages must be aligned with 512-byte boundaries, the start offset + must be a modulus of 512 and the end offset must be a modulus of + 512-1. Examples of valid byte ranges are 0-511, 512-, etc. + :param int end_range: + End of byte range to use for getting valid page ranges. + If end_range is given, start_range must be provided. + This range will return valid page ranges for from the offset start up to + offset end. + Pages must be aligned with 512-byte boundaries, the start offset + must be a modulus of 512 and the end offset must be a modulus of + 512-1. Examples of valid byte ranges are 0-511, 512-, etc. + :param str lease_id: + Required if the blob has an active lease. + :param datetime if_modified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only + if the resource has been modified since the specified time. + :param datetime if_unmodified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only if + the resource has not been modified since the specified date/time. + :param str if_match: + An ETag value, or the wildcard character (*). Specify this header to perform + the operation only if the resource's ETag matches the value specified. + :param str if_none_match: + An ETag value, or the wildcard character (*). Specify this header + to perform the operation only if the resource's ETag does not match + the value specified. Specify the wildcard character (*) to perform + the operation only if the resource does not exist, and fail the + operation if it does exist. + :param int timeout: + The timeout parameter is expressed in seconds. + :return: A list of valid Page Ranges for the Page Blob. + :rtype: list(:class:`~azure.storage.blob.models.PageRange`) + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + request = HTTPRequest() + request.method = 'GET' + request.host_locations = self._get_host_locations(secondary=True) + request.path = _get_path(container_name, blob_name) + request.query = { + 'comp': 'pagelist', + 'snapshot': _to_str(snapshot), + 'timeout': _int_to_str(timeout), + } + request.headers = { + 'x-ms-lease-id': _to_str(lease_id), + 'If-Modified-Since': _datetime_to_utc_string(if_modified_since), + 'If-Unmodified-Since': _datetime_to_utc_string(if_unmodified_since), + 'If-Match': _to_str(if_match), + 'If-None-Match': _to_str(if_none_match), + } + if start_range is not None: + _validate_and_format_range_headers( + request, + start_range, + end_range, + start_range_required=False, + end_range_required=False, + align_to_page=True) + + return self._perform_request(request, _convert_xml_to_page_ranges) + + def get_page_ranges_diff( + self, container_name, blob_name, previous_snapshot, snapshot=None, + start_range=None, end_range=None, lease_id=None, if_modified_since=None, + if_unmodified_since=None, if_match=None, if_none_match=None, timeout=None): + ''' + The response will include only the pages that are different between either a + recent snapshot or the current blob and a previous snapshot, including pages + that were cleared. + + :param str container_name: + Name of existing container. + :param str blob_name: + Name of existing blob. + :param str previous_snapshot: + The snapshot parameter is an opaque DateTime value that + specifies a previous blob snapshot to be compared + against a more recent snapshot or the current blob. + :param str snapshot: + The snapshot parameter is an opaque DateTime value that + specifies a more recent blob snapshot to be compared + against a previous snapshot (previous_snapshot). + :param int start_range: + Start of byte range to use for getting different page ranges. + If no end_range is given, all bytes after the start_range will be searched. + Pages must be aligned with 512-byte boundaries, the start offset + must be a modulus of 512 and the end offset must be a modulus of + 512-1. Examples of valid byte ranges are 0-511, 512-, etc. + :param int end_range: + End of byte range to use for getting different page ranges. + If end_range is given, start_range must be provided. + This range will return valid page ranges for from the offset start up to + offset end. + Pages must be aligned with 512-byte boundaries, the start offset + must be a modulus of 512 and the end offset must be a modulus of + 512-1. Examples of valid byte ranges are 0-511, 512-, etc. + :param str lease_id: + Required if the blob has an active lease. + :param datetime if_modified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only + if the resource has been modified since the specified time. + :param datetime if_unmodified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only if + the resource has not been modified since the specified date/time. + :param str if_match: + An ETag value, or the wildcard character (*). Specify this header to perform + the operation only if the resource's ETag matches the value specified. + :param str if_none_match: + An ETag value, or the wildcard character (*). Specify this header + to perform the operation only if the resource's ETag does not match + the value specified. Specify the wildcard character (*) to perform + the operation only if the resource does not exist, and fail the + operation if it does exist. + :param int timeout: + The timeout parameter is expressed in seconds. + :return: A list of different Page Ranges for the Page Blob. + :rtype: list(:class:`~azure.storage.blob.models.PageRange`) + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + _validate_not_none('previous_snapshot', previous_snapshot) + request = HTTPRequest() + request.method = 'GET' + request.host_locations = self._get_host_locations(secondary=True) + request.path = _get_path(container_name, blob_name) + request.query = { + 'comp': 'pagelist', + 'snapshot': _to_str(snapshot), + 'prevsnapshot': _to_str(previous_snapshot), + 'timeout': _int_to_str(timeout), + } + request.headers = { + 'x-ms-lease-id': _to_str(lease_id), + 'If-Modified-Since': _datetime_to_utc_string(if_modified_since), + 'If-Unmodified-Since': _datetime_to_utc_string(if_unmodified_since), + 'If-Match': _to_str(if_match), + 'If-None-Match': _to_str(if_none_match), + } + if start_range is not None: + _validate_and_format_range_headers( + request, + start_range, + end_range, + start_range_required=False, + end_range_required=False, + align_to_page=True) + + return self._perform_request(request, _convert_xml_to_page_ranges) + + def set_sequence_number( + self, container_name, blob_name, sequence_number_action, sequence_number=None, + lease_id=None, if_modified_since=None, if_unmodified_since=None, + if_match=None, if_none_match=None, timeout=None): + + ''' + Sets the blob sequence number. + + :param str container_name: + Name of existing container. + :param str blob_name: + Name of existing blob. + :param str sequence_number_action: + This property indicates how the service should modify the blob's sequence + number. See :class:`~azure.storage.blob.models.SequenceNumberAction` for more information. + :param str sequence_number: + This property sets the blob's sequence number. The sequence number is a + user-controlled property that you can use to track requests and manage + concurrency issues. + :param str lease_id: + Required if the blob has an active lease. + :param datetime if_modified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only + if the resource has been modified since the specified time. + :param datetime if_unmodified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only if + the resource has not been modified since the specified date/time. + :param str if_match: + An ETag value, or the wildcard character (*). Specify this header to perform + the operation only if the resource's ETag matches the value specified. + :param str if_none_match: + An ETag value, or the wildcard character (*). Specify this header + to perform the operation only if the resource's ETag does not match + the value specified. Specify the wildcard character (*) to perform + the operation only if the resource does not exist, and fail the + operation if it does exist. + :param int timeout: + The timeout parameter is expressed in seconds. + :return: ETag and last modified properties for the updated Page Blob + :rtype: :class:`~azure.storage.blob.models.ResourceProperties` + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + _validate_not_none('sequence_number_action', sequence_number_action) + request = HTTPRequest() + request.method = 'PUT' + request.host_locations = self._get_host_locations() + request.path = _get_path(container_name, blob_name) + request.query = { + 'comp': 'properties', + 'timeout': _int_to_str(timeout), + } + request.headers = { + 'x-ms-blob-sequence-number': _to_str(sequence_number), + 'x-ms-sequence-number-action': _to_str(sequence_number_action), + 'x-ms-lease-id': _to_str(lease_id), + 'If-Modified-Since': _datetime_to_utc_string(if_modified_since), + 'If-Unmodified-Since': _datetime_to_utc_string(if_unmodified_since), + 'If-Match': _to_str(if_match), + 'If-None-Match': _to_str(if_none_match), + } + + return self._perform_request(request, _parse_page_properties) + + def resize_blob( + self, container_name, blob_name, content_length, + lease_id=None, if_modified_since=None, if_unmodified_since=None, + if_match=None, if_none_match=None, timeout=None): + + ''' + Resizes a page blob to the specified size. If the specified value is less + than the current size of the blob, then all pages above the specified value + are cleared. + + :param str container_name: + Name of existing container. + :param str blob_name: + Name of existing blob. + :param int content_length: + Size to resize blob to. + :param str lease_id: + Required if the blob has an active lease. + :param datetime if_modified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only + if the resource has been modified since the specified time. + :param datetime if_unmodified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only if + the resource has not been modified since the specified date/time. + :param str if_match: + An ETag value, or the wildcard character (*). Specify this header to perform + the operation only if the resource's ETag matches the value specified. + :param str if_none_match: + An ETag value, or the wildcard character (*). Specify this header + to perform the operation only if the resource's ETag does not match + the value specified. Specify the wildcard character (*) to perform + the operation only if the resource does not exist, and fail the + operation if it does exist. + :param int timeout: + The timeout parameter is expressed in seconds. + :return: ETag and last modified properties for the updated Page Blob + :rtype: :class:`~azure.storage.blob.models.ResourceProperties` + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + _validate_not_none('content_length', content_length) + request = HTTPRequest() + request.method = 'PUT' + request.host_locations = self._get_host_locations() + request.path = _get_path(container_name, blob_name) + request.query = { + 'comp': 'properties', + 'timeout': _int_to_str(timeout), + } + request.headers = { + 'x-ms-blob-content-length': _to_str(content_length), + 'x-ms-lease-id': _to_str(lease_id), + 'If-Modified-Since': _datetime_to_utc_string(if_modified_since), + 'If-Unmodified-Since': _datetime_to_utc_string(if_unmodified_since), + 'If-Match': _to_str(if_match), + 'If-None-Match': _to_str(if_none_match), + } + + return self._perform_request(request, _parse_page_properties) + + # ----Convenience APIs----------------------------------------------------- + + def create_blob_from_path( + self, container_name, blob_name, file_path, content_settings=None, + metadata=None, validate_content=False, progress_callback=None, max_connections=2, + lease_id=None, if_modified_since=None, if_unmodified_since=None, + if_match=None, if_none_match=None, timeout=None, premium_page_blob_tier=None): + ''' + Creates a new blob from a file path, or updates the content of an + existing blob, with automatic chunking and progress notifications. + Empty chunks are skipped, while non-emtpy ones(even if only partly filled) are uploaded. + + :param str container_name: + Name of existing container. + :param str blob_name: + Name of blob to create or update. + :param str file_path: + Path of the file to upload as the blob content. + :param ~azure.storage.blob.models.ContentSettings content_settings: + ContentSettings object used to set blob properties. + :param metadata: + Name-value pairs associated with the blob as metadata. + :type metadata: dict(str, str) + :param bool validate_content: + If true, calculates an MD5 hash for each page of the blob. The storage + service checks the hash of the content that has arrived with the hash + that was sent. This is primarily valuable for detecting bitflips on + the wire if using http instead of https as https (the default) will + already validate. Note that this MD5 hash is not stored with the + blob. + :param progress_callback: + Callback for progress with signature function(current, total) where + current is the number of bytes transfered so far, and total is the + size of the blob, or None if the total size is unknown. + :type progress_callback: func(current, total) + :param int max_connections: + Maximum number of parallel connections to use. + :param str lease_id: + Required if the blob has an active lease. + :param datetime if_modified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only + if the resource has been modified since the specified time. + :param datetime if_unmodified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only if + the resource has not been modified since the specified date/time. + :param str if_match: + An ETag value, or the wildcard character (*). Specify this header to perform + the operation only if the resource's ETag matches the value specified. + :param str if_none_match: + An ETag value, or the wildcard character (*). Specify this header + to perform the operation only if the resource's ETag does not match + the value specified. Specify the wildcard character (*) to perform + the operation only if the resource does not exist, and fail the + operation if it does exist. + :param int timeout: + The timeout parameter is expressed in seconds. This method may make + multiple calls to the Azure service and the timeout will apply to + each call individually. + :param premium_page_blob_tier: + A page blob tier value to set the blob to. The tier correlates to the size of the + blob and number of allowed IOPS. This is only applicable to page blobs on + premium storage accounts. + :return: ETag and last modified properties for the Page Blob + :rtype: :class:`~azure.storage.blob.models.ResourceProperties` + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + _validate_not_none('file_path', file_path) + + count = path.getsize(file_path) + with open(file_path, 'rb') as stream: + return self.create_blob_from_stream( + container_name=container_name, + blob_name=blob_name, + stream=stream, + count=count, + content_settings=content_settings, + metadata=metadata, + validate_content=validate_content, + progress_callback=progress_callback, + max_connections=max_connections, + lease_id=lease_id, + if_modified_since=if_modified_since, + if_unmodified_since=if_unmodified_since, + if_match=if_match, + if_none_match=if_none_match, + timeout=timeout, + premium_page_blob_tier=premium_page_blob_tier) + + def create_blob_from_stream( + self, container_name, blob_name, stream, count, content_settings=None, + metadata=None, validate_content=False, progress_callback=None, + max_connections=2, lease_id=None, if_modified_since=None, + if_unmodified_since=None, if_match=None, if_none_match=None, timeout=None, + premium_page_blob_tier=None): + ''' + Creates a new blob from a file/stream, or updates the content of an + existing blob, with automatic chunking and progress notifications. + Empty chunks are skipped, while non-emtpy ones(even if only partly filled) are uploaded. + + :param str container_name: + Name of existing container. + :param str blob_name: + Name of blob to create or update. + :param io.IOBase stream: + Opened file/stream to upload as the blob content. + :param int count: + Number of bytes to read from the stream. This is required, a page + blob cannot be created if the count is unknown. + :param ~azure.storage.blob.models.ContentSettings content_settings: + ContentSettings object used to set the blob properties. + :param metadata: + Name-value pairs associated with the blob as metadata. + :type metadata: dict(str, str) + :param bool validate_content: + If true, calculates an MD5 hash for each page of the blob. The storage + service checks the hash of the content that has arrived with the hash + that was sent. This is primarily valuable for detecting bitflips on + the wire if using http instead of https as https (the default) will + already validate. Note that this MD5 hash is not stored with the + blob. + :param progress_callback: + Callback for progress with signature function(current, total) where + current is the number of bytes transfered so far, and total is the + size of the blob, or None if the total size is unknown. + :type progress_callback: func(current, total) + :param int max_connections: + Maximum number of parallel connections to use. Note that parallel upload + requires the stream to be seekable. + :param str lease_id: + Required if the blob has an active lease. + :param datetime if_modified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only + if the resource has been modified since the specified time. + :param datetime if_unmodified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only if + the resource has not been modified since the specified date/time. + :param str if_match: + An ETag value, or the wildcard character (*). Specify this header to perform + the operation only if the resource's ETag matches the value specified. + :param str if_none_match: + An ETag value, or the wildcard character (*). Specify this header + to perform the operation only if the resource's ETag does not match + the value specified. Specify the wildcard character (*) to perform + the operation only if the resource does not exist, and fail the + operation if it does exist. + :param int timeout: + The timeout parameter is expressed in seconds. This method may make + multiple calls to the Azure service and the timeout will apply to + each call individually. + :param premium_page_blob_tier: + A page blob tier value to set the blob to. The tier correlates to the size of the + blob and number of allowed IOPS. This is only applicable to page blobs on + premium storage accounts. + :return: ETag and last modified properties for the Page Blob + :rtype: :class:`~azure.storage.blob.models.ResourceProperties` + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + _validate_not_none('stream', stream) + _validate_not_none('count', count) + _validate_encryption_required(self.require_encryption, self.key_encryption_key) + + if count < 0: + raise ValueError(_ERROR_VALUE_NEGATIVE.format('count')) + + if count % _PAGE_ALIGNMENT != 0: + raise ValueError(_ERROR_PAGE_BLOB_SIZE_ALIGNMENT.format(count)) + + cek, iv, encryption_data = None, None, None + if self.key_encryption_key is not None: + cek, iv, encryption_data = _generate_blob_encryption_data(self.key_encryption_key) + + response = self._create_blob( + container_name=container_name, + blob_name=blob_name, + content_length=count, + content_settings=content_settings, + metadata=metadata, + lease_id=lease_id, + premium_page_blob_tier=premium_page_blob_tier, + if_modified_since=if_modified_since, + if_unmodified_since=if_unmodified_since, + if_match=if_match, + if_none_match=if_none_match, + timeout=timeout, + encryption_data=encryption_data + ) + + if count == 0: + return response + + # _upload_blob_chunks returns the block ids for block blobs so resource_properties + # is passed as a parameter to get the last_modified and etag for page and append blobs. + # this info is not needed for block_blobs since _put_block_list is called after which gets this info + resource_properties = ResourceProperties() + _upload_blob_chunks( + blob_service=self, + container_name=container_name, + blob_name=blob_name, + blob_size=count, + block_size=self.MAX_PAGE_SIZE, + stream=stream, + max_connections=max_connections, + progress_callback=progress_callback, + validate_content=validate_content, + lease_id=lease_id, + uploader_class=_PageBlobChunkUploader, + if_match=response.etag, + timeout=timeout, + content_encryption_key=cek, + initialization_vector=iv, + resource_properties=resource_properties + ) + + return resource_properties + + def create_blob_from_bytes( + self, container_name, blob_name, blob, index=0, count=None, + content_settings=None, metadata=None, validate_content=False, + progress_callback=None, max_connections=2, lease_id=None, + if_modified_since=None, if_unmodified_since=None, if_match=None, + if_none_match=None, timeout=None, premium_page_blob_tier=None): + ''' + Creates a new blob from an array of bytes, or updates the content + of an existing blob, with automatic chunking and progress + notifications. Empty chunks are skipped, while non-emtpy ones(even if only partly filled) are uploaded. + + :param str container_name: + Name of existing container. + :param str blob_name: + Name of blob to create or update. + :param bytes blob: + Content of blob as an array of bytes. + :param int index: + Start index in the byte array. + :param int count: + Number of bytes to upload. Set to None or negative value to upload + all bytes starting from index. + :param ~azure.storage.blob.models.ContentSettings content_settings: + ContentSettings object used to set blob properties. + :param metadata: + Name-value pairs associated with the blob as metadata. + :type metadata: dict(str, str) + :param bool validate_content: + If true, calculates an MD5 hash for each page of the blob. The storage + service checks the hash of the content that has arrived with the hash + that was sent. This is primarily valuable for detecting bitflips on + the wire if using http instead of https as https (the default) will + already validate. Note that this MD5 hash is not stored with the + blob. + :param progress_callback: + Callback for progress with signature function(current, total) where + current is the number of bytes transfered so far, and total is the + size of the blob, or None if the total size is unknown. + :type progress_callback: func(current, total) + :param int max_connections: + Maximum number of parallel connections to use. + :param str lease_id: + Required if the blob has an active lease. + :param datetime if_modified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only + if the resource has been modified since the specified time. + :param datetime if_unmodified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only if + the resource has not been modified since the specified date/time. + :param str if_match: + An ETag value, or the wildcard character (*). Specify this header to perform + the operation only if the resource's ETag matches the value specified. + :param str if_none_match: + An ETag value, or the wildcard character (*). Specify this header + to perform the operation only if the resource's ETag does not match + the value specified. Specify the wildcard character (*) to perform + the operation only if the resource does not exist, and fail the + operation if it does exist. + :param int timeout: + The timeout parameter is expressed in seconds. This method may make + multiple calls to the Azure service and the timeout will apply to + each call individually. + :param premium_page_blob_tier: + A page blob tier value to set the blob to. The tier correlates to the size of the + blob and number of allowed IOPS. This is only applicable to page blobs on + premium storage accounts. + :return: ETag and last modified properties for the Page Blob + :rtype: :class:`~azure.storage.blob.models.ResourceProperties` + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + _validate_not_none('blob', blob) + _validate_type_bytes('blob', blob) + + if index < 0: + raise IndexError(_ERROR_VALUE_NEGATIVE.format('index')) + + if count is None or count < 0: + count = len(blob) - index + + stream = BytesIO(blob) + stream.seek(index) + + return self.create_blob_from_stream( + container_name=container_name, + blob_name=blob_name, + stream=stream, + count=count, + content_settings=content_settings, + metadata=metadata, + validate_content=validate_content, + lease_id=lease_id, + progress_callback=progress_callback, + max_connections=max_connections, + if_modified_since=if_modified_since, + if_unmodified_since=if_unmodified_since, + if_match=if_match, + if_none_match=if_none_match, + timeout=timeout, + premium_page_blob_tier=premium_page_blob_tier) + + def set_premium_page_blob_tier( + self, container_name, blob_name, premium_page_blob_tier, + timeout=None): + ''' + Sets the page blob tiers on the blob. This API is only supported for page blobs on premium accounts. + + :param str container_name: + Name of existing container. + :param str blob_name: + Name of blob to update. + :param PremiumPageBlobTier premium_page_blob_tier: + A page blob tier value to set the blob to. The tier correlates to the size of the + blob and number of allowed IOPS. This is only applicable to page blobs on + premium storage accounts. + :param int timeout: + The timeout parameter is expressed in seconds. This method may make + multiple calls to the Azure service and the timeout will apply to + each call individually. + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + _validate_not_none('premium_page_blob_tier', premium_page_blob_tier) + + request = HTTPRequest() + request.method = 'PUT' + request.host_locations = self._get_host_locations() + request.path = _get_path(container_name, blob_name) + request.query = { + 'comp': 'tier', + 'timeout': _int_to_str(timeout), + } + request.headers = { + 'x-ms-access-tier': _to_str(premium_page_blob_tier) + } + + self._perform_request(request) + + def copy_blob(self, container_name, blob_name, copy_source, + metadata=None, + source_if_modified_since=None, + source_if_unmodified_since=None, + source_if_match=None, source_if_none_match=None, + destination_if_modified_since=None, + destination_if_unmodified_since=None, + destination_if_match=None, + destination_if_none_match=None, + destination_lease_id=None, + source_lease_id=None, timeout=None, + premium_page_blob_tier=None): + ''' + Copies a blob asynchronously. This operation returns a copy operation + properties object, including a copy ID you can use to check or abort the + copy operation. The Blob service copies blobs on a best-effort basis. + + The source blob for a copy operation must be a page blob. If the destination + blob already exists, it must be of the same blob type as the source blob. + Any existing destination blob will be overwritten. + The destination blob cannot be modified while a copy operation is in progress. + + When copying from a page blob, the Blob service creates a destination page + blob of the source blob's length, initially containing all zeroes. Then + the source page ranges are enumerated, and non-empty ranges are copied. + + If the tier on the source blob is larger than the tier being passed to this + copy operation or if the size of the blob exceeds the tier being passed to + this copy operation then the operation will fail. + + You can call get_blob_properties on the destination + blob to check the status of the copy operation. The final blob will be + committed when the copy completes. + + :param str container_name: + Name of the destination container. The container must exist. + :param str blob_name: + Name of the destination blob. If the destination blob exists, it will + be overwritten. Otherwise, it will be created. + :param str copy_source: + A URL of up to 2 KB in length that specifies an Azure file or blob. + The value should be URL-encoded as it would appear in a request URI. + If the source is in another account, the source must either be public + or must be authenticated via a shared access signature. If the source + is public, no authentication is required. + Examples: + https://myaccount.blob.core.windows.net/mycontainer/myblob + https://myaccount.blob.core.windows.net/mycontainer/myblob?snapshot= + https://otheraccount.blob.core.windows.net/mycontainer/myblob?sastoken + :param metadata: + Name-value pairs associated with the blob as metadata. If no name-value + pairs are specified, the operation will copy the metadata from the + source blob or file to the destination blob. If one or more name-value + pairs are specified, the destination blob is created with the specified + metadata, and metadata is not copied from the source blob or file. + :type metadata: dict(str, str). + :param datetime source_if_modified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this conditional header to copy the blob only if the source + blob has been modified since the specified date/time. + :param datetime source_if_unmodified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this conditional header to copy the blob only if the source blob + has not been modified since the specified date/time. + :param ETag source_if_match: + An ETag value, or the wildcard character (*). Specify this conditional + header to copy the source blob only if its ETag matches the value + specified. If the ETag values do not match, the Blob service returns + status code 412 (Precondition Failed). This header cannot be specified + if the source is an Azure File. + :param ETag source_if_none_match: + An ETag value, or the wildcard character (*). Specify this conditional + header to copy the blob only if its ETag does not match the value + specified. If the values are identical, the Blob service returns status + code 412 (Precondition Failed). This header cannot be specified if the + source is an Azure File. + :param datetime destination_if_modified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this conditional header to copy the blob only + if the destination blob has been modified since the specified date/time. + If the destination blob has not been modified, the Blob service returns + status code 412 (Precondition Failed). + :param datetime destination_if_unmodified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this conditional header to copy the blob only + if the destination blob has not been modified since the specified + date/time. If the destination blob has been modified, the Blob service + returns status code 412 (Precondition Failed). + :param ETag destination_if_match: + An ETag value, or the wildcard character (*). Specify an ETag value for + this conditional header to copy the blob only if the specified ETag value + matches the ETag value for an existing destination blob. If the ETag for + the destination blob does not match the ETag specified for If-Match, the + Blob service returns status code 412 (Precondition Failed). + :param ETag destination_if_none_match: + An ETag value, or the wildcard character (*). Specify an ETag value for + this conditional header to copy the blob only if the specified ETag value + does not match the ETag value for the destination blob. Specify the wildcard + character (*) to perform the operation only if the destination blob does not + exist. If the specified condition isn't met, the Blob service returns status + code 412 (Precondition Failed). + :param str destination_lease_id: + The lease ID specified for this header must match the lease ID of the + destination blob. If the request does not include the lease ID or it is not + valid, the operation fails with status code 412 (Precondition Failed). + :param str source_lease_id: + Specify this to perform the Copy Blob operation only if + the lease ID given matches the active lease ID of the source blob. + :param int timeout: + The timeout parameter is expressed in seconds. + :param PageBlobTier premium_page_blob_tier: + A page blob tier value to set on the destination blob. The tier correlates to + the size of the blob and number of allowed IOPS. This is only applicable to + page blobs on premium storage accounts. + If the tier on the source blob is larger than the tier being passed to this + copy operation or if the size of the blob exceeds the tier being passed to + this copy operation then the operation will fail. + :return: Copy operation properties such as status, source, and ID. + :rtype: :class:`~azure.storage.blob.models.CopyProperties` + ''' + return self._copy_blob(container_name, blob_name, copy_source, + metadata, premium_page_blob_tier, + source_if_modified_since, source_if_unmodified_since, + source_if_match, source_if_none_match, + destination_if_modified_since, + destination_if_unmodified_since, + destination_if_match, + destination_if_none_match, + destination_lease_id, + source_lease_id, timeout, + False) + + # -----Helper methods----------------------------------------------------- + + def _create_blob( + self, container_name, blob_name, content_length, content_settings=None, + sequence_number=None, metadata=None, lease_id=None, premium_page_blob_tier=None, if_modified_since=None, + if_unmodified_since=None, if_match=None, if_none_match=None, timeout=None, + encryption_data=None): + ''' + See create_blob for more details. This helper method + allows for encryption or other such special behavior because + it is safely handled by the library. These behaviors are + prohibited in the public version of this function. + :param str encryption_data: + The JSON formatted encryption metadata to upload as a part of the blob. + This should only be passed internally from other methods and only applied + when uploading entire blob contents immediately follows creation of the blob. + ''' + + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + _validate_not_none('content_length', content_length) + request = HTTPRequest() + request.method = 'PUT' + request.host_locations = self._get_host_locations() + request.path = _get_path(container_name, blob_name) + request.query = {'timeout': _int_to_str(timeout)} + request.headers = { + 'x-ms-blob-type': _to_str(self.blob_type), + 'x-ms-blob-content-length': _to_str(content_length), + 'x-ms-lease-id': _to_str(lease_id), + 'x-ms-blob-sequence-number': _to_str(sequence_number), + 'x-ms-access-tier': _to_str(premium_page_blob_tier), + 'If-Modified-Since': _datetime_to_utc_string(if_modified_since), + 'If-Unmodified-Since': _datetime_to_utc_string(if_unmodified_since), + 'If-Match': _to_str(if_match), + 'If-None-Match': _to_str(if_none_match) + } + _add_metadata_headers(metadata, request) + if content_settings is not None: + request.headers.update(content_settings._to_headers()) + + if encryption_data is not None: + request.headers['x-ms-meta-encryptiondata'] = encryption_data + + return self._perform_request(request, _parse_base_properties) + + def _update_page( + self, container_name, blob_name, page, start_range, end_range, + validate_content=False, lease_id=None, if_sequence_number_lte=None, + if_sequence_number_lt=None, if_sequence_number_eq=None, + if_modified_since=None, if_unmodified_since=None, + if_match=None, if_none_match=None, timeout=None): + ''' + See update_page for more details. This helper method + allows for encryption or other such special behavior because + it is safely handled by the library. These behaviors are + prohibited in the public version of this function. + ''' + + request = HTTPRequest() + request.method = 'PUT' + request.host_locations = self._get_host_locations() + request.path = _get_path(container_name, blob_name) + request.query = { + 'comp': 'page', + 'timeout': _int_to_str(timeout), + } + request.headers = { + 'x-ms-page-write': 'update', + 'x-ms-lease-id': _to_str(lease_id), + 'x-ms-if-sequence-number-le': _to_str(if_sequence_number_lte), + 'x-ms-if-sequence-number-lt': _to_str(if_sequence_number_lt), + 'x-ms-if-sequence-number-eq': _to_str(if_sequence_number_eq), + 'If-Modified-Since': _datetime_to_utc_string(if_modified_since), + 'If-Unmodified-Since': _datetime_to_utc_string(if_unmodified_since), + 'If-Match': _to_str(if_match), + 'If-None-Match': _to_str(if_none_match) + } + _validate_and_format_range_headers( + request, + start_range, + end_range, + align_to_page=True) + request.body = _get_data_bytes_only('page', page) + + if validate_content: + computed_md5 = _get_content_md5(request.body) + request.headers['Content-MD5'] = _to_str(computed_md5) + + return self._perform_request(request, _parse_page_properties) diff --git a/src/storage-preview/azext_storage_preview/azure_storage/blob/sharedaccesssignature.py b/src/storage-preview/azext_storage_preview/azure_storage/blob/sharedaccesssignature.py new file mode 100644 index 00000000000..67dcfb1d4de --- /dev/null +++ b/src/storage-preview/azext_storage_preview/azure_storage/blob/sharedaccesssignature.py @@ -0,0 +1,179 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- + +from azure.storage.common.sharedaccesssignature import ( + SharedAccessSignature, + _SharedAccessHelper, +) +from ._constants import X_MS_VERSION + + +class BlobSharedAccessSignature(SharedAccessSignature): + ''' + Provides a factory for creating blob and container access + signature tokens with a common account name and account key. Users can either + use the factory or can construct the appropriate service and use the + generate_*_shared_access_signature method directly. + ''' + + def __init__(self, account_name, account_key): + ''' + :param str account_name: + The storage account name used to generate the shared access signatures. + :param str account_key: + The access key to generate the shares access signatures. + ''' + super(BlobSharedAccessSignature, self).__init__(account_name, account_key, x_ms_version=X_MS_VERSION) + + def generate_blob(self, container_name, blob_name, permission=None, + expiry=None, start=None, id=None, ip=None, protocol=None, + cache_control=None, content_disposition=None, + content_encoding=None, content_language=None, + content_type=None): + ''' + Generates a shared access signature for the blob. + Use the returned signature with the sas_token parameter of any BlobService. + + :param str container_name: + Name of container. + :param str blob_name: + Name of blob. + :param BlobPermissions permission: + The permissions associated with the shared access signature. The + user is restricted to operations allowed by the permissions. + Permissions must be ordered read, write, delete, list. + Required unless an id is given referencing a stored access policy + which contains this field. This field must be omitted if it has been + specified in an associated stored access policy. + :param expiry: + The time at which the shared access signature becomes invalid. + Required unless an id is given referencing a stored access policy + which contains this field. This field must be omitted if it has + been specified in an associated stored access policy. Azure will always + convert values to UTC. If a date is passed in without timezone info, it + is assumed to be UTC. + :type expiry: datetime or str + :param start: + The time at which the shared access signature becomes valid. If + omitted, start time for this call is assumed to be the time when the + storage service receives the request. Azure will always convert values + to UTC. If a date is passed in without timezone info, it is assumed to + be UTC. + :type start: datetime or str + :param str id: + A unique value up to 64 characters in length that correlates to a + stored access policy. To create a stored access policy, use + set_blob_service_properties. + :param str ip: + Specifies an IP address or a range of IP addresses from which to accept requests. + If the IP address from which the request originates does not match the IP address + or address range specified on the SAS token, the request is not authenticated. + For example, specifying sip=168.1.5.65 or sip=168.1.5.60-168.1.5.70 on the SAS + restricts the request to those IP addresses. + :param str protocol: + Specifies the protocol permitted for a request made. The default value + is https,http. See :class:`~azure.storage.common.models.Protocol` for possible values. + :param str cache_control: + Response header value for Cache-Control when resource is accessed + using this shared access signature. + :param str content_disposition: + Response header value for Content-Disposition when resource is accessed + using this shared access signature. + :param str content_encoding: + Response header value for Content-Encoding when resource is accessed + using this shared access signature. + :param str content_language: + Response header value for Content-Language when resource is accessed + using this shared access signature. + :param str content_type: + Response header value for Content-Type when resource is accessed + using this shared access signature. + ''' + resource_path = container_name + '/' + blob_name + + sas = _SharedAccessHelper() + sas.add_base(permission, expiry, start, ip, protocol, self.x_ms_version) + sas.add_id(id) + sas.add_resource('b') + sas.add_override_response_headers(cache_control, content_disposition, + content_encoding, content_language, + content_type) + sas.add_resource_signature(self.account_name, self.account_key, 'blob', resource_path) + + return sas.get_token() + + def generate_container(self, container_name, permission=None, expiry=None, + start=None, id=None, ip=None, protocol=None, + cache_control=None, content_disposition=None, + content_encoding=None, content_language=None, + content_type=None): + ''' + Generates a shared access signature for the container. + Use the returned signature with the sas_token parameter of any BlobService. + + :param str container_name: + Name of container. + :param ContainerPermissions permission: + The permissions associated with the shared access signature. The + user is restricted to operations allowed by the permissions. + Permissions must be ordered read, write, delete, list. + Required unless an id is given referencing a stored access policy + which contains this field. This field must be omitted if it has been + specified in an associated stored access policy. + :param expiry: + The time at which the shared access signature becomes invalid. + Required unless an id is given referencing a stored access policy + which contains this field. This field must be omitted if it has + been specified in an associated stored access policy. Azure will always + convert values to UTC. If a date is passed in without timezone info, it + is assumed to be UTC. + :type expiry: datetime or str + :param start: + The time at which the shared access signature becomes valid. If + omitted, start time for this call is assumed to be the time when the + storage service receives the request. Azure will always convert values + to UTC. If a date is passed in without timezone info, it is assumed to + be UTC. + :type start: datetime or str + :param str id: + A unique value up to 64 characters in length that correlates to a + stored access policy. To create a stored access policy, use + set_blob_service_properties. + :param str ip: + Specifies an IP address or a range of IP addresses from which to accept requests. + If the IP address from which the request originates does not match the IP address + or address range specified on the SAS token, the request is not authenticated. + For example, specifying sip=168.1.5.65 or sip=168.1.5.60-168.1.5.70 on the SAS + restricts the request to those IP addresses. + :param str protocol: + Specifies the protocol permitted for a request made. The default value + is https,http. See :class:`~azure.storage.common.models.Protocol` for possible values. + :param str cache_control: + Response header value for Cache-Control when resource is accessed + using this shared access signature. + :param str content_disposition: + Response header value for Content-Disposition when resource is accessed + using this shared access signature. + :param str content_encoding: + Response header value for Content-Encoding when resource is accessed + using this shared access signature. + :param str content_language: + Response header value for Content-Language when resource is accessed + using this shared access signature. + :param str content_type: + Response header value for Content-Type when resource is accessed + using this shared access signature. + ''' + sas = _SharedAccessHelper() + sas.add_base(permission, expiry, start, ip, protocol, self.x_ms_version) + sas.add_id(id) + sas.add_resource('c') + sas.add_override_response_headers(cache_control, content_disposition, + content_encoding, content_language, + content_type) + sas.add_resource_signature(self.account_name, self.account_key, 'blob', container_name) + + return sas.get_token() diff --git a/src/storage-preview/azext_storage_preview/azure_storage/common/__init__.py b/src/storage-preview/azext_storage_preview/azure_storage/common/__init__.py new file mode 100644 index 00000000000..1307fe624b9 --- /dev/null +++ b/src/storage-preview/azext_storage_preview/azure_storage/common/__init__.py @@ -0,0 +1,37 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- +from ._constants import ( + __author__, + __version__, + DEFAULT_X_MS_VERSION, +) +from .cloudstorageaccount import CloudStorageAccount +from .models import ( + RetentionPolicy, + Logging, + Metrics, + CorsRule, + DeleteRetentionPolicy, + ServiceProperties, + AccessPolicy, + ResourceTypes, + Services, + AccountPermissions, + Protocol, + ServiceStats, + GeoReplication, + LocationMode, + RetryContext, +) +from .retry import ( + ExponentialRetry, + LinearRetry, + no_retry, +) +from .sharedaccesssignature import ( + SharedAccessSignature, +) +from .tokencredential import TokenCredential diff --git a/src/storage-preview/azext_storage_preview/azure_storage/common/_auth.py b/src/storage-preview/azext_storage_preview/azure_storage/common/_auth.py new file mode 100644 index 00000000000..6ae446fc82e --- /dev/null +++ b/src/storage-preview/azext_storage_preview/azure_storage/common/_auth.py @@ -0,0 +1,125 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- +from ._common_conversion import ( + _sign_string, +) +from ._constants import ( + DEV_ACCOUNT_NAME, + DEV_ACCOUNT_SECONDARY_NAME +) + +import logging +logger = logging.getLogger(__name__) + + +class _StorageSharedKeyAuthentication(object): + def __init__(self, account_name, account_key, is_emulated=False): + self.account_name = account_name + self.account_key = account_key + self.is_emulated = is_emulated + + def _get_headers(self, request, headers_to_sign): + headers = dict((name.lower(), value) for name, value in request.headers.items() if value) + if 'content-length' in headers and headers['content-length'] == '0': + del headers['content-length'] + return '\n'.join(headers.get(x, '') for x in headers_to_sign) + '\n' + + def _get_verb(self, request): + return request.method + '\n' + + def _get_canonicalized_resource(self, request): + uri_path = request.path.split('?')[0] + + # for emulator, use the DEV_ACCOUNT_NAME instead of DEV_ACCOUNT_SECONDARY_NAME + # as this is how the emulator works + if self.is_emulated and uri_path.find(DEV_ACCOUNT_SECONDARY_NAME) == 1: + # only replace the first instance + uri_path = uri_path.replace(DEV_ACCOUNT_SECONDARY_NAME, DEV_ACCOUNT_NAME, 1) + + return '/' + self.account_name + uri_path + + def _get_canonicalized_headers(self, request): + string_to_sign = '' + x_ms_headers = [] + for name, value in request.headers.items(): + if name.startswith('x-ms-'): + x_ms_headers.append((name.lower(), value)) + x_ms_headers.sort() + for name, value in x_ms_headers: + if value is not None: + string_to_sign += ''.join([name, ':', value, '\n']) + return string_to_sign + + def _add_authorization_header(self, request, string_to_sign): + signature = _sign_string(self.account_key, string_to_sign) + auth_string = 'SharedKey ' + self.account_name + ':' + signature + request.headers['Authorization'] = auth_string + + +class _StorageSharedKeyAuthentication(_StorageSharedKeyAuthentication): + def sign_request(self, request): + string_to_sign = \ + self._get_verb(request) + \ + self._get_headers( + request, + [ + 'content-encoding', 'content-language', 'content-length', + 'content-md5', 'content-type', 'date', 'if-modified-since', + 'if-match', 'if-none-match', 'if-unmodified-since', 'byte_range' + ] + ) + \ + self._get_canonicalized_headers(request) + \ + self._get_canonicalized_resource(request) + \ + self._get_canonicalized_resource_query(request) + + self._add_authorization_header(request, string_to_sign) + logger.debug("String_to_sign=%s", string_to_sign) + + def _get_canonicalized_resource_query(self, request): + sorted_queries = [(name, value) for name, value in request.query.items()] + sorted_queries.sort() + + string_to_sign = '' + for name, value in sorted_queries: + if value: + string_to_sign += '\n' + name.lower() + ':' + value + + return string_to_sign + + +class _StorageNoAuthentication(object): + def sign_request(self, request): + pass + + +class _StorageSASAuthentication(object): + def __init__(self, sas_token): + # ignore ?-prefix (added by tools such as Azure Portal) on sas tokens + # doing so avoids double question marks when signing + if sas_token[0] == '?': + self.sas_token = sas_token[1:] + else: + self.sas_token = sas_token + + def sign_request(self, request): + # if 'sig=' is present, then the request has already been signed + # as is the case when performing retries + if 'sig=' in request.path: + return + if '?' in request.path: + request.path += '&' + else: + request.path += '?' + + request.path += self.sas_token + + +class _StorageTokenAuthentication(object): + def __init__(self, token): + self.token_credential = token + + def sign_request(self, request): + request.headers['Authorization'] = str.format("Bearer {}", self.token_credential.get_token()) diff --git a/src/storage-preview/azext_storage_preview/azure_storage/common/_common_conversion.py b/src/storage-preview/azext_storage_preview/azure_storage/common/_common_conversion.py new file mode 100644 index 00000000000..8b50afbe1af --- /dev/null +++ b/src/storage-preview/azext_storage_preview/azure_storage/common/_common_conversion.py @@ -0,0 +1,126 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- + +import base64 +import hashlib +import hmac +import sys +from io import (SEEK_SET) + +from dateutil.tz import tzutc + +from ._error import ( + _ERROR_VALUE_SHOULD_BE_BYTES_OR_STREAM, + _ERROR_VALUE_SHOULD_BE_SEEKABLE_STREAM, +) +from .models import ( + _unicode_type, +) + +if sys.version_info < (3,): + def _str(value): + if isinstance(value, unicode): + return value.encode('utf-8') + + return str(value) +else: + _str = str + + +def _to_str(value): + return _str(value) if value is not None else None + + +def _int_to_str(value): + return str(int(value)) if value is not None else None + + +def _bool_to_str(value): + if value is None: + return None + + if isinstance(value, bool): + if value: + return 'true' + else: + return 'false' + + return str(value) + + +def _to_utc_datetime(value): + return value.strftime('%Y-%m-%dT%H:%M:%SZ') + + +def _datetime_to_utc_string(value): + # Azure expects the date value passed in to be UTC. + # Azure will always return values as UTC. + # If a date is passed in without timezone info, it is assumed to be UTC. + if value is None: + return None + + if value.tzinfo: + value = value.astimezone(tzutc()) + + return value.strftime('%a, %d %b %Y %H:%M:%S GMT') + + +def _encode_base64(data): + if isinstance(data, _unicode_type): + data = data.encode('utf-8') + encoded = base64.b64encode(data) + return encoded.decode('utf-8') + + +def _decode_base64_to_bytes(data): + if isinstance(data, _unicode_type): + data = data.encode('utf-8') + return base64.b64decode(data) + + +def _decode_base64_to_text(data): + decoded_bytes = _decode_base64_to_bytes(data) + return decoded_bytes.decode('utf-8') + + +def _sign_string(key, string_to_sign, key_is_base64=True): + if key_is_base64: + key = _decode_base64_to_bytes(key) + else: + if isinstance(key, _unicode_type): + key = key.encode('utf-8') + if isinstance(string_to_sign, _unicode_type): + string_to_sign = string_to_sign.encode('utf-8') + signed_hmac_sha256 = hmac.HMAC(key, string_to_sign, hashlib.sha256) + digest = signed_hmac_sha256.digest() + encoded_digest = _encode_base64(digest) + return encoded_digest + + +def _get_content_md5(data): + md5 = hashlib.md5() + if isinstance(data, bytes): + md5.update(data) + elif hasattr(data, 'read'): + pos = 0 + try: + pos = data.tell() + except: + pass + for chunk in iter(lambda: data.read(4096), b""): + md5.update(chunk) + try: + data.seek(pos, SEEK_SET) + except (AttributeError, IOError): + raise ValueError(_ERROR_VALUE_SHOULD_BE_SEEKABLE_STREAM.format('data')) + else: + raise ValueError(_ERROR_VALUE_SHOULD_BE_BYTES_OR_STREAM.format('data')) + + return base64.b64encode(md5.digest()).decode('utf-8') + + +def _lower(text): + return text.lower() diff --git a/src/storage-preview/azext_storage_preview/azure_storage/common/_connection.py b/src/storage-preview/azext_storage_preview/azure_storage/common/_connection.py new file mode 100644 index 00000000000..1388fddeb62 --- /dev/null +++ b/src/storage-preview/azext_storage_preview/azure_storage/common/_connection.py @@ -0,0 +1,160 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- +import sys + +if sys.version_info >= (3,): + from urllib.parse import urlparse +else: + from urlparse import urlparse + +from ._constants import ( + SERVICE_HOST_BASE, + DEFAULT_PROTOCOL, + DEV_ACCOUNT_NAME, + DEV_ACCOUNT_SECONDARY_NAME, + DEV_ACCOUNT_KEY, + DEV_BLOB_HOST, + DEV_QUEUE_HOST, +) +from ._error import ( + _ERROR_STORAGE_MISSING_INFO, +) + +_EMULATOR_ENDPOINTS = { + 'blob': DEV_BLOB_HOST, + 'queue': DEV_QUEUE_HOST, + 'file': '', +} + +_CONNECTION_ENDPOINTS = { + 'blob': 'BlobEndpoint', + 'queue': 'QueueEndpoint', + 'file': 'FileEndpoint', +} + +_CONNECTION_ENDPOINTS_SECONDARY = { + 'blob': 'BlobSecondaryEndpoint', + 'queue': 'QueueSecondaryEndpoint', + 'file': 'FileSecondaryEndpoint', +} + + +class _ServiceParameters(object): + def __init__(self, service, account_name=None, account_key=None, sas_token=None, token_credential=None, + is_emulated=False, protocol=DEFAULT_PROTOCOL, endpoint_suffix=SERVICE_HOST_BASE, + custom_domain=None, custom_domain_secondary=None): + + self.account_name = account_name + self.account_key = account_key + self.sas_token = sas_token + self.token_credential = token_credential + self.protocol = protocol or DEFAULT_PROTOCOL + self.is_emulated = is_emulated + + if is_emulated: + self.account_name = DEV_ACCOUNT_NAME + self.protocol = 'http' + + # Only set the account key if a sas_token is not present to allow sas to be used with the emulator + self.account_key = DEV_ACCOUNT_KEY if not self.sas_token else None + + self.primary_endpoint = '{}/{}'.format(_EMULATOR_ENDPOINTS[service], DEV_ACCOUNT_NAME) + self.secondary_endpoint = '{}/{}'.format(_EMULATOR_ENDPOINTS[service], DEV_ACCOUNT_SECONDARY_NAME) + else: + # Strip whitespace from the key + if self.account_key: + self.account_key = self.account_key.strip() + + endpoint_suffix = endpoint_suffix or SERVICE_HOST_BASE + + # Setup the primary endpoint + if custom_domain: + parsed_url = urlparse(custom_domain) + + # Trim any trailing slashes from the path + path = parsed_url.path.rstrip('/') + + self.primary_endpoint = parsed_url.netloc + path + self.protocol = self.protocol if parsed_url.scheme is '' else parsed_url.scheme + else: + if not self.account_name: + raise ValueError(_ERROR_STORAGE_MISSING_INFO) + self.primary_endpoint = '{}.{}.{}'.format(self.account_name, service, endpoint_suffix) + + # Setup the secondary endpoint + if custom_domain_secondary: + if not custom_domain: + raise ValueError(_ERROR_STORAGE_MISSING_INFO) + + parsed_url = urlparse(custom_domain_secondary) + + # Trim any trailing slashes from the path + path = parsed_url.path.rstrip('/') + + self.secondary_endpoint = parsed_url.netloc + path + else: + if self.account_name: + self.secondary_endpoint = '{}-secondary.{}.{}'.format(self.account_name, service, endpoint_suffix) + else: + self.secondary_endpoint = None + + @staticmethod + def get_service_parameters(service, account_name=None, account_key=None, sas_token=None, token_credential= None, + is_emulated=None, protocol=None, endpoint_suffix=None, custom_domain=None, + request_session=None, connection_string=None, socket_timeout=None): + if connection_string: + params = _ServiceParameters._from_connection_string(connection_string, service) + elif is_emulated: + params = _ServiceParameters(service, is_emulated=True) + elif account_name: + if protocol.lower() != 'https' and token_credential is not None: + raise ValueError("Token credential is only supported with HTTPS.") + params = _ServiceParameters(service, + account_name=account_name, + account_key=account_key, + sas_token=sas_token, + token_credential=token_credential, + is_emulated=is_emulated, + protocol=protocol, + endpoint_suffix=endpoint_suffix, + custom_domain=custom_domain) + else: + raise ValueError(_ERROR_STORAGE_MISSING_INFO) + + params.request_session = request_session + params.socket_timeout = socket_timeout + return params + + @staticmethod + def _from_connection_string(connection_string, service): + # Split into key=value pairs removing empties, then split the pairs into a dict + config = dict(s.split('=', 1) for s in connection_string.split(';') if s) + + # Authentication + account_name = config.get('AccountName') + account_key = config.get('AccountKey') + sas_token = config.get('SharedAccessSignature') + + # Emulator + is_emulated = config.get('UseDevelopmentStorage') + + # Basic URL Configuration + protocol = config.get('DefaultEndpointsProtocol') + endpoint_suffix = config.get('EndpointSuffix') + + # Custom URLs + endpoint = config.get(_CONNECTION_ENDPOINTS[service]) + endpoint_secondary = config.get(_CONNECTION_ENDPOINTS_SECONDARY[service]) + + return _ServiceParameters(service, + account_name=account_name, + account_key=account_key, + sas_token=sas_token, + is_emulated=is_emulated, + protocol=protocol, + endpoint_suffix=endpoint_suffix, + custom_domain=endpoint, + custom_domain_secondary=endpoint_secondary) diff --git a/src/storage-preview/azext_storage_preview/azure_storage/common/_constants.py b/src/storage-preview/azext_storage_preview/azure_storage/common/_constants.py new file mode 100644 index 00000000000..5994579e212 --- /dev/null +++ b/src/storage-preview/azext_storage_preview/azure_storage/common/_constants.py @@ -0,0 +1,47 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- +import platform +import sys + +__author__ = 'Microsoft Corp. ' +__version__ = '1.2.0rc0' + +# UserAgent string sample: 'Azure-Storage/0.37.0-0.38.0 (Python CPython 3.4.2; Windows 8)' +# First version(0.37.0) is the common package, and the second version(0.38.0) is the service package +USER_AGENT_STRING_PREFIX = 'Azure-Storage/{}-'.format(__version__) +USER_AGENT_STRING_SUFFIX = '(Python {} {}; {} {})'.format(platform.python_implementation(), + platform.python_version(), platform.system(), + platform.release()) + +# default values for common package, in case it is used directly +DEFAULT_X_MS_VERSION = '2017-07-29' +DEFAULT_USER_AGENT_STRING = '{}None {}'.format(USER_AGENT_STRING_PREFIX, USER_AGENT_STRING_SUFFIX) + +# Live ServiceClient URLs +SERVICE_HOST_BASE = 'core.windows.net' +DEFAULT_PROTOCOL = 'https' + +# Development ServiceClient URLs +DEV_BLOB_HOST = '127.0.0.1:10000' +DEV_QUEUE_HOST = '127.0.0.1:10001' + +# Default credentials for Development Storage Service +DEV_ACCOUNT_NAME = 'devstoreaccount1' +DEV_ACCOUNT_SECONDARY_NAME = 'devstoreaccount1-secondary' +DEV_ACCOUNT_KEY = 'Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==' + +# Socket timeout in seconds +DEFAULT_SOCKET_TIMEOUT = 20 + +# for python 3.5+, there was a change to the definition of the socket timeout (as far as socket.sendall is concerned) +# The socket timeout is now the maximum total duration to send all data. +if sys.version_info >= (3, 5): + # the timeout to connect is 20 seconds, and the read timeout is 2000 seconds + # the 2000 seconds was calculated with: 100MB (max block size)/ 50KB/s (an arbitrarily chosen minimum upload speed) + DEFAULT_SOCKET_TIMEOUT = (20, 2000) + +# Encryption constants +_ENCRYPTION_PROTOCOL_V1 = '1.0' diff --git a/src/storage-preview/azext_storage_preview/azure_storage/common/_deserialization.py b/src/storage-preview/azext_storage_preview/azure_storage/common/_deserialization.py new file mode 100644 index 00000000000..986d2647617 --- /dev/null +++ b/src/storage-preview/azext_storage_preview/azure_storage/common/_deserialization.py @@ -0,0 +1,361 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- +from dateutil import parser + +from ._common_conversion import _to_str + +try: + from xml.etree import cElementTree as ETree +except ImportError: + from xml.etree import ElementTree as ETree + +from .models import ( + ServiceProperties, + Logging, + Metrics, + CorsRule, + AccessPolicy, + _dict, + GeoReplication, + ServiceStats, + DeleteRetentionPolicy, +) + + +def _to_int(value): + return value if value is None else int(value) + + +def _bool(value): + return value.lower() == 'true' + + +def _to_upper_str(value): + return _to_str(value).upper() if value is not None else None + + +def _get_download_size(start_range, end_range, resource_size): + if start_range is not None: + end_range = end_range if end_range else (resource_size if resource_size else None) + if end_range is not None: + return end_range - start_range + else: + return None + else: + return resource_size + + +GET_PROPERTIES_ATTRIBUTE_MAP = { + 'last-modified': (None, 'last_modified', parser.parse), + 'etag': (None, 'etag', _to_str), + 'x-ms-blob-type': (None, 'blob_type', _to_str), + 'content-length': (None, 'content_length', _to_int), + 'content-range': (None, 'content_range', _to_str), + 'x-ms-blob-sequence-number': (None, 'page_blob_sequence_number', _to_int), + 'x-ms-blob-committed-block-count': (None, 'append_blob_committed_block_count', _to_int), + 'x-ms-blob-public-access': (None, 'public_access', _to_str), + 'x-ms-access-tier': (None, 'blob_tier', _to_str), + 'x-ms-access-tier-change-time': (None, 'blob_tier_change_time', parser.parse), + 'x-ms-access-tier-inferred': (None, 'blob_tier_inferred', _bool), + 'x-ms-archive-status': (None, 'rehydration_status', _to_str), + 'x-ms-share-quota': (None, 'quota', _to_int), + 'x-ms-server-encrypted': (None, 'server_encrypted', _bool), + 'content-type': ('content_settings', 'content_type', _to_str), + 'cache-control': ('content_settings', 'cache_control', _to_str), + 'content-encoding': ('content_settings', 'content_encoding', _to_str), + 'content-disposition': ('content_settings', 'content_disposition', _to_str), + 'content-language': ('content_settings', 'content_language', _to_str), + 'content-md5': ('content_settings', 'content_md5', _to_str), + 'x-ms-lease-status': ('lease', 'status', _to_str), + 'x-ms-lease-state': ('lease', 'state', _to_str), + 'x-ms-lease-duration': ('lease', 'duration', _to_str), + 'x-ms-copy-id': ('copy', 'id', _to_str), + 'x-ms-copy-source': ('copy', 'source', _to_str), + 'x-ms-copy-status': ('copy', 'status', _to_str), + 'x-ms-copy-progress': ('copy', 'progress', _to_str), + 'x-ms-copy-completion-time': ('copy', 'completion_time', parser.parse), + 'x-ms-copy-destination-snapshot': ('copy', 'destination_snapshot_time', _to_str), + 'x-ms-copy-status-description': ('copy', 'status_description', _to_str), +} + + +def _parse_metadata(response): + ''' + Extracts out resource metadata information. + ''' + + if response is None or response.headers is None: + return None + + metadata = _dict() + for key, value in response.headers.items(): + if key.lower().startswith('x-ms-meta-'): + metadata[key[10:]] = _to_str(value) + + return metadata + + +def _parse_properties(response, result_class): + ''' + Extracts out resource properties and metadata information. + Ignores the standard http headers. + ''' + + if response is None or response.headers is None: + return None + + props = result_class() + for key, value in response.headers.items(): + info = GET_PROPERTIES_ATTRIBUTE_MAP.get(key) + if info: + if info[0] is None: + setattr(props, info[1], info[2](value)) + else: + attr = getattr(props, info[0]) + setattr(attr, info[1], info[2](value)) + + if hasattr(props, 'blob_type') and props.blob_type == 'PageBlob' and hasattr(props, 'blob_tier') and props.blob_tier is not None: + props.blob_tier = _to_upper_str(props.blob_tier) + return props + + +def _parse_length_from_content_range(content_range): + ''' + Parses the blob length from the content range header: bytes 1-3/65537 + ''' + if content_range is None: + return None + + # First, split in space and take the second half: '1-3/65537' + # Next, split on slash and take the second half: '65537' + # Finally, convert to an int: 65537 + return int(content_range.split(' ', 1)[1].split('/', 1)[1]) + + +def _convert_xml_to_signed_identifiers(response): + ''' + + + + unique-value + + start-time + expiry-time + abbreviated-permission-list + + + + ''' + if response is None or response.body is None: + return None + + list_element = ETree.fromstring(response.body) + signed_identifiers = _dict() + + for signed_identifier_element in list_element.findall('SignedIdentifier'): + # Id element + id = signed_identifier_element.find('Id').text + + # Access policy element + access_policy = AccessPolicy() + access_policy_element = signed_identifier_element.find('AccessPolicy') + if access_policy_element is not None: + start_element = access_policy_element.find('Start') + if start_element is not None: + access_policy.start = parser.parse(start_element.text) + + expiry_element = access_policy_element.find('Expiry') + if expiry_element is not None: + access_policy.expiry = parser.parse(expiry_element.text) + + access_policy.permission = access_policy_element.findtext('Permission') + + signed_identifiers[id] = access_policy + + return signed_identifiers + + +def _convert_xml_to_service_stats(response): + ''' + + + + live|bootstrap|unavailable + sync-time| + + + ''' + if response is None or response.body is None: + return None + + service_stats_element = ETree.fromstring(response.body) + + geo_replication_element = service_stats_element.find('GeoReplication') + + geo_replication = GeoReplication() + geo_replication.status = geo_replication_element.find('Status').text + last_sync_time = geo_replication_element.find('LastSyncTime').text + geo_replication.last_sync_time = parser.parse(last_sync_time) if last_sync_time else None + + service_stats = ServiceStats() + service_stats.geo_replication = geo_replication + return service_stats + + +def _convert_xml_to_service_properties(response): + ''' + + + + version-number + true|false + true|false + true|false + + true|false + number-of-days + + + + version-number + true|false + true|false + + true|false + number-of-days + + + + version-number + true|false + true|false + + true|false + number-of-days + + + + + comma-separated-list-of-allowed-origins + comma-separated-list-of-HTTP-verb + max-caching-age-in-seconds + comma-seperated-list-of-response-headers + comma-seperated-list-of-request-headers + + + + true|false + number-of-days + + + ''' + if response is None or response.body is None: + return None + + service_properties_element = ETree.fromstring(response.body) + service_properties = ServiceProperties() + + # Logging + logging = service_properties_element.find('Logging') + if logging is not None: + service_properties.logging = Logging() + service_properties.logging.version = logging.find('Version').text + service_properties.logging.delete = _bool(logging.find('Delete').text) + service_properties.logging.read = _bool(logging.find('Read').text) + service_properties.logging.write = _bool(logging.find('Write').text) + + _convert_xml_to_retention_policy(logging.find('RetentionPolicy'), + service_properties.logging.retention_policy) + # HourMetrics + hour_metrics_element = service_properties_element.find('HourMetrics') + if hour_metrics_element is not None: + service_properties.hour_metrics = Metrics() + _convert_xml_to_metrics(hour_metrics_element, service_properties.hour_metrics) + + # MinuteMetrics + minute_metrics_element = service_properties_element.find('MinuteMetrics') + if minute_metrics_element is not None: + service_properties.minute_metrics = Metrics() + _convert_xml_to_metrics(minute_metrics_element, service_properties.minute_metrics) + + # CORS + cors = service_properties_element.find('Cors') + if cors is not None: + service_properties.cors = list() + for rule in cors.findall('CorsRule'): + allowed_origins = rule.find('AllowedOrigins').text.split(',') + + allowed_methods = rule.find('AllowedMethods').text.split(',') + + max_age_in_seconds = int(rule.find('MaxAgeInSeconds').text) + + cors_rule = CorsRule(allowed_origins, allowed_methods, max_age_in_seconds) + + exposed_headers = rule.find('ExposedHeaders').text + if exposed_headers is not None: + cors_rule.exposed_headers = exposed_headers.split(',') + + allowed_headers = rule.find('AllowedHeaders').text + if allowed_headers is not None: + cors_rule.allowed_headers = allowed_headers.split(',') + + service_properties.cors.append(cors_rule) + + # Target version + target_version = service_properties_element.find('DefaultServiceVersion') + if target_version is not None: + service_properties.target_version = target_version.text + + # DeleteRetentionPolicy + delete_retention_policy_element = service_properties_element.find('DeleteRetentionPolicy') + if delete_retention_policy_element is not None: + service_properties.delete_retention_policy = DeleteRetentionPolicy() + policy_enabled = _bool(delete_retention_policy_element.find('Enabled').text) + service_properties.delete_retention_policy.enabled = policy_enabled + + if policy_enabled: + service_properties.delete_retention_policy.days = int(delete_retention_policy_element.find('Days').text) + + return service_properties + + +def _convert_xml_to_metrics(xml, metrics): + ''' + version-number + true|false + true|false + + true|false + number-of-days + + ''' + # Version + metrics.version = xml.find('Version').text + + # Enabled + metrics.enabled = _bool(xml.find('Enabled').text) + + # IncludeAPIs + include_apis_element = xml.find('IncludeAPIs') + if include_apis_element is not None: + metrics.include_apis = _bool(include_apis_element.text) + + # RetentionPolicy + _convert_xml_to_retention_policy(xml.find('RetentionPolicy'), metrics.retention_policy) + + +def _convert_xml_to_retention_policy(xml, retention_policy): + ''' + true|false + number-of-days + ''' + # Enabled + retention_policy.enabled = _bool(xml.find('Enabled').text) + + # Days + days_element = xml.find('Days') + if days_element is not None: + retention_policy.days = int(days_element.text) diff --git a/src/storage-preview/azext_storage_preview/azure_storage/common/_encryption.py b/src/storage-preview/azext_storage_preview/azure_storage/common/_encryption.py new file mode 100644 index 00000000000..cd7d92e66e0 --- /dev/null +++ b/src/storage-preview/azext_storage_preview/azure_storage/common/_encryption.py @@ -0,0 +1,233 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- +from collections import OrderedDict + +from cryptography.hazmat.backends import default_backend +from cryptography.hazmat.primitives.ciphers import Cipher +from cryptography.hazmat.primitives.ciphers.algorithms import AES +from cryptography.hazmat.primitives.ciphers.modes import CBC + +from ._common_conversion import ( + _encode_base64, + _decode_base64_to_bytes, +) +from ._constants import ( + _ENCRYPTION_PROTOCOL_V1, + __version__, +) +from ._error import ( + _ERROR_UNSUPPORTED_ENCRYPTION_VERSION, + _validate_not_none, + _validate_encryption_protocol_version, + _validate_key_encryption_key_unwrap, + _validate_kek_id, +) + + +class _EncryptionAlgorithm(object): + ''' + Specifies which client encryption algorithm is used. + ''' + AES_CBC_256 = 'AES_CBC_256' + + +class _WrappedContentKey: + ''' + Represents the envelope key details stored on the service. + ''' + + def __init__(self, algorithm, encrypted_key, key_id): + ''' + :param str algorithm: + The algorithm used for wrapping. + :param bytes encrypted_key: + The encrypted content-encryption-key. + :param str key_id: + The key-encryption-key identifier string. + ''' + + _validate_not_none('algorithm', algorithm) + _validate_not_none('encrypted_key', encrypted_key) + _validate_not_none('key_id', key_id) + + self.algorithm = algorithm + self.encrypted_key = encrypted_key + self.key_id = key_id + + +class _EncryptionAgent: + ''' + Represents the encryption agent stored on the service. + It consists of the encryption protocol version and encryption algorithm used. + ''' + + def __init__(self, encryption_algorithm, protocol): + ''' + :param _EncryptionAlgorithm encryption_algorithm: + The algorithm used for encrypting the message contents. + :param str protocol: + The protocol version used for encryption. + ''' + + _validate_not_none('encryption_algorithm', encryption_algorithm) + _validate_not_none('protocol', protocol) + + self.encryption_algorithm = str(encryption_algorithm) + self.protocol = protocol + + +class _EncryptionData: + ''' + Represents the encryption data that is stored on the service. + ''' + + def __init__(self, content_encryption_IV, encryption_agent, wrapped_content_key, + key_wrapping_metadata): + ''' + :param bytes content_encryption_IV: + The content encryption initialization vector. + :param _EncryptionAgent encryption_agent: + The encryption agent. + :param _WrappedContentKey wrapped_content_key: + An object that stores the wrapping algorithm, the key identifier, + and the encrypted key bytes. + :param dict key_wrapping_metadata: + A dict containing metadata related to the key wrapping. + ''' + + _validate_not_none('content_encryption_IV', content_encryption_IV) + _validate_not_none('encryption_agent', encryption_agent) + _validate_not_none('wrapped_content_key', wrapped_content_key) + + self.content_encryption_IV = content_encryption_IV + self.encryption_agent = encryption_agent + self.wrapped_content_key = wrapped_content_key + self.key_wrapping_metadata = key_wrapping_metadata + + +def _generate_encryption_data_dict(kek, cek, iv): + ''' + Generates and returns the encryption metadata as a dict. + + :param object kek: The key encryption key. See calling functions for more information. + :param bytes cek: The content encryption key. + :param bytes iv: The initialization vector. + :return: A dict containing all the encryption metadata. + :rtype: dict + ''' + # Encrypt the cek. + wrapped_cek = kek.wrap_key(cek) + + # Build the encryption_data dict. + # Use OrderedDict to comply with Java's ordering requirement. + wrapped_content_key = OrderedDict() + wrapped_content_key['KeyId'] = kek.get_kid() + wrapped_content_key['EncryptedKey'] = _encode_base64(wrapped_cek) + wrapped_content_key['Algorithm'] = kek.get_key_wrap_algorithm() + + encryption_agent = OrderedDict() + encryption_agent['Protocol'] = _ENCRYPTION_PROTOCOL_V1 + encryption_agent['EncryptionAlgorithm'] = _EncryptionAlgorithm.AES_CBC_256 + + encryption_data_dict = OrderedDict() + encryption_data_dict['WrappedContentKey'] = wrapped_content_key + encryption_data_dict['EncryptionAgent'] = encryption_agent + encryption_data_dict['ContentEncryptionIV'] = _encode_base64(iv) + encryption_data_dict['KeyWrappingMetadata'] = {'EncryptionLibrary': 'Python ' + __version__} + + return encryption_data_dict + + +def _dict_to_encryption_data(encryption_data_dict): + ''' + Converts the specified dictionary to an EncryptionData object for + eventual use in decryption. + + :param dict encryption_data_dict: + The dictionary containing the encryption data. + :return: an _EncryptionData object built from the dictionary. + :rtype: _EncryptionData + ''' + try: + if encryption_data_dict['EncryptionAgent']['Protocol'] != _ENCRYPTION_PROTOCOL_V1: + raise ValueError(_ERROR_UNSUPPORTED_ENCRYPTION_VERSION) + except KeyError: + raise ValueError(_ERROR_UNSUPPORTED_ENCRYPTION_VERSION) + wrapped_content_key = encryption_data_dict['WrappedContentKey'] + wrapped_content_key = _WrappedContentKey(wrapped_content_key['Algorithm'], + _decode_base64_to_bytes(wrapped_content_key['EncryptedKey']), + wrapped_content_key['KeyId']) + + encryption_agent = encryption_data_dict['EncryptionAgent'] + encryption_agent = _EncryptionAgent(encryption_agent['EncryptionAlgorithm'], + encryption_agent['Protocol']) + + if 'KeyWrappingMetadata' in encryption_data_dict: + key_wrapping_metadata = encryption_data_dict['KeyWrappingMetadata'] + else: + key_wrapping_metadata = None + + encryption_data = _EncryptionData(_decode_base64_to_bytes(encryption_data_dict['ContentEncryptionIV']), + encryption_agent, + wrapped_content_key, + key_wrapping_metadata) + + return encryption_data + + +def _generate_AES_CBC_cipher(cek, iv): + ''' + Generates and returns an encryption cipher for AES CBC using the given cek and iv. + + :param bytes[] cek: The content encryption key for the cipher. + :param bytes[] iv: The initialization vector for the cipher. + :return: A cipher for encrypting in AES256 CBC. + :rtype: ~cryptography.hazmat.primitives.ciphers.Cipher + ''' + + backend = default_backend() + algorithm = AES(cek) + mode = CBC(iv) + return Cipher(algorithm, mode, backend) + + +def _validate_and_unwrap_cek(encryption_data, key_encryption_key=None, key_resolver=None): + ''' + Extracts and returns the content_encryption_key stored in the encryption_data object + and performs necessary validation on all parameters. + :param _EncryptionData encryption_data: + The encryption metadata of the retrieved value. + :param obj key_encryption_key: + The key_encryption_key used to unwrap the cek. Please refer to high-level service object + instance variables for more details. + :param func key_resolver: + A function used that, given a key_id, will return a key_encryption_key. Please refer + to high-level service object instance variables for more details. + :return: the content_encryption_key stored in the encryption_data object. + :rtype: bytes[] + ''' + + _validate_not_none('content_encryption_IV', encryption_data.content_encryption_IV) + _validate_not_none('encrypted_key', encryption_data.wrapped_content_key.encrypted_key) + + _validate_encryption_protocol_version(encryption_data.encryption_agent.protocol) + + content_encryption_key = None + + # If the resolver exists, give priority to the key it finds. + if key_resolver is not None: + key_encryption_key = key_resolver(encryption_data.wrapped_content_key.key_id) + + _validate_not_none('key_encryption_key', key_encryption_key) + _validate_key_encryption_key_unwrap(key_encryption_key) + _validate_kek_id(encryption_data.wrapped_content_key.key_id, key_encryption_key.get_kid()) + + # Will throw an exception if the specified algorithm is not supported. + content_encryption_key = key_encryption_key.unwrap_key(encryption_data.wrapped_content_key.encrypted_key, + encryption_data.wrapped_content_key.algorithm) + _validate_not_none('content_encryption_key', content_encryption_key) + + return content_encryption_key diff --git a/src/storage-preview/azext_storage_preview/azure_storage/common/_error.py b/src/storage-preview/azext_storage_preview/azure_storage/common/_error.py new file mode 100644 index 00000000000..a8f67864db4 --- /dev/null +++ b/src/storage-preview/azext_storage_preview/azure_storage/common/_error.py @@ -0,0 +1,179 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- +from sys import version_info + +if version_info < (3,): + def _str(value): + if isinstance(value, unicode): + return value.encode('utf-8') + + return str(value) +else: + _str = str + + +def _to_str(value): + return _str(value) if value is not None else None + + +from azure.common import ( + AzureHttpError, + AzureConflictHttpError, + AzureMissingResourceHttpError, + AzureException, +) +from ._constants import ( + _ENCRYPTION_PROTOCOL_V1, +) + +_ERROR_CONFLICT = 'Conflict ({0})' +_ERROR_NOT_FOUND = 'Not found ({0})' +_ERROR_UNKNOWN = 'Unknown error ({0})' +_ERROR_STORAGE_MISSING_INFO = \ + 'You need to provide an account name and either an account_key or sas_token when creating a storage service.' +_ERROR_EMULATOR_DOES_NOT_SUPPORT_FILES = \ + 'The emulator does not support the file service.' +_ERROR_ACCESS_POLICY = \ + 'share_access_policy must be either SignedIdentifier or AccessPolicy ' + \ + 'instance' +_ERROR_PARALLEL_NOT_SEEKABLE = 'Parallel operations require a seekable stream.' +_ERROR_VALUE_SHOULD_BE_BYTES = '{0} should be of type bytes.' +_ERROR_VALUE_SHOULD_BE_BYTES_OR_STREAM = '{0} should be of type bytes or a readable file-like/io.IOBase stream object.' +_ERROR_VALUE_SHOULD_BE_SEEKABLE_STREAM = '{0} should be a seekable file-like/io.IOBase type stream object.' +_ERROR_VALUE_SHOULD_BE_STREAM = '{0} should be a file-like/io.IOBase type stream object with a read method.' +_ERROR_VALUE_NONE = '{0} should not be None.' +_ERROR_VALUE_NONE_OR_EMPTY = '{0} should not be None or empty.' +_ERROR_VALUE_NEGATIVE = '{0} should not be negative.' +_ERROR_NO_SINGLE_THREAD_CHUNKING = \ + 'To use {0} chunk downloader more than 1 thread must be ' + \ + 'used since get_{0}_to_bytes should be called for single threaded ' + \ + '{0} downloads.' +_ERROR_START_END_NEEDED_FOR_MD5 = \ + 'Both end_range and start_range need to be specified ' + \ + 'for getting content MD5.' +_ERROR_RANGE_TOO_LARGE_FOR_MD5 = \ + 'Getting content MD5 for a range greater than 4MB ' + \ + 'is not supported.' +_ERROR_MD5_MISMATCH = \ + 'MD5 mismatch. Expected value is \'{0}\', computed value is \'{1}\'.' +_ERROR_TOO_MANY_ACCESS_POLICIES = \ + 'Too many access policies provided. The server does not support setting more than 5 access policies on a single resource.' +_ERROR_OBJECT_INVALID = \ + '{0} does not define a complete interface. Value of {1} is either missing or invalid.' +_ERROR_UNSUPPORTED_ENCRYPTION_VERSION = \ + 'Encryption version is not supported.' +_ERROR_DECRYPTION_FAILURE = \ + 'Decryption failed' +_ERROR_ENCRYPTION_REQUIRED = \ + 'Encryption required but no key was provided.' +_ERROR_DECRYPTION_REQUIRED = \ + 'Decryption required but neither key nor resolver was provided.' + \ + ' If you do not want to decypt, please do not set the require encryption flag.' +_ERROR_INVALID_KID = \ + 'Provided or resolved key-encryption-key does not match the id of key used to encrypt.' +_ERROR_UNSUPPORTED_ENCRYPTION_ALGORITHM = \ + 'Specified encryption algorithm is not supported.' +_ERROR_UNSUPPORTED_METHOD_FOR_ENCRYPTION = 'The require_encryption flag is set, but encryption is not supported' + \ + ' for this method.' +_ERROR_UNKNOWN_KEY_WRAP_ALGORITHM = 'Unknown key wrap algorithm.' +_ERROR_DATA_NOT_ENCRYPTED = 'Encryption required, but received data does not contain appropriate metatadata.' + \ + 'Data was either not encrypted or metadata has been lost.' + + +def _dont_fail_on_exist(error): + ''' don't throw exception if the resource exists. + This is called by create_* APIs with fail_on_exist=False''' + if isinstance(error, AzureConflictHttpError): + return False + else: + raise error + + +def _dont_fail_not_exist(error): + ''' don't throw exception if the resource doesn't exist. + This is called by create_* APIs with fail_on_exist=False''' + if isinstance(error, AzureMissingResourceHttpError): + return False + else: + raise error + + +def _http_error_handler(http_error): + ''' Simple error handler for azure.''' + message = str(http_error) + if 'x-ms-error-code' in http_error.respheader: + message += 'ErrorCode: ' + http_error.respheader['x-ms-error-code'] + if http_error.respbody is not None: + message += '\n' + http_error.respbody.decode('utf-8-sig') + raise AzureHttpError(message, http_error.status) + + +def _validate_type_bytes(param_name, param): + if not isinstance(param, bytes): + raise TypeError(_ERROR_VALUE_SHOULD_BE_BYTES.format(param_name)) + + +def _validate_type_bytes_or_stream(param_name, param): + if not (isinstance(param, bytes) or hasattr(param, 'read')): + raise TypeError(_ERROR_VALUE_SHOULD_BE_BYTES_OR_STREAM.format(param_name)) + + +def _validate_not_none(param_name, param): + if param is None: + raise ValueError(_ERROR_VALUE_NONE.format(param_name)) + + +def _validate_content_match(server_md5, computed_md5): + if server_md5 != computed_md5: + raise AzureException(_ERROR_MD5_MISMATCH.format(server_md5, computed_md5)) + + +def _validate_access_policies(identifiers): + if identifiers and len(identifiers) > 5: + raise AzureException(_ERROR_TOO_MANY_ACCESS_POLICIES) + + +def _validate_key_encryption_key_wrap(kek): + # Note that None is not callable and so will fail the second clause of each check. + if not hasattr(kek, 'wrap_key') or not callable(kek.wrap_key): + raise AttributeError(_ERROR_OBJECT_INVALID.format('key encryption key', 'wrap_key')) + if not hasattr(kek, 'get_kid') or not callable(kek.get_kid): + raise AttributeError(_ERROR_OBJECT_INVALID.format('key encryption key', 'get_kid')) + if not hasattr(kek, 'get_key_wrap_algorithm') or not callable(kek.get_key_wrap_algorithm): + raise AttributeError(_ERROR_OBJECT_INVALID.format('key encryption key', 'get_key_wrap_algorithm')) + + +def _validate_key_encryption_key_unwrap(kek): + if not hasattr(kek, 'get_kid') or not callable(kek.get_kid): + raise AttributeError(_ERROR_OBJECT_INVALID.format('key encryption key', 'get_kid')) + if not hasattr(kek, 'unwrap_key') or not callable(kek.unwrap_key): + raise AttributeError(_ERROR_OBJECT_INVALID.format('key encryption key', 'unwrap_key')) + + +def _validate_encryption_required(require_encryption, kek): + if require_encryption and (kek is None): + raise ValueError(_ERROR_ENCRYPTION_REQUIRED) + + +def _validate_decryption_required(require_encryption, kek, resolver): + if (require_encryption and (kek is None) and + (resolver is None)): + raise ValueError(_ERROR_DECRYPTION_REQUIRED) + + +def _validate_encryption_protocol_version(encryption_protocol): + if not (_ENCRYPTION_PROTOCOL_V1 == encryption_protocol): + raise ValueError(_ERROR_UNSUPPORTED_ENCRYPTION_VERSION) + + +def _validate_kek_id(kid, resolved_id): + if not (kid == resolved_id): + raise ValueError(_ERROR_INVALID_KID) + + +def _validate_encryption_unsupported(require_encryption, key_encryption_key): + if require_encryption or (key_encryption_key is not None): + raise ValueError(_ERROR_UNSUPPORTED_METHOD_FOR_ENCRYPTION) diff --git a/src/storage-preview/azext_storage_preview/azure_storage/common/_http/__init__.py b/src/storage-preview/azext_storage_preview/azure_storage/common/_http/__init__.py new file mode 100644 index 00000000000..2990ec80abe --- /dev/null +++ b/src/storage-preview/azext_storage_preview/azure_storage/common/_http/__init__.py @@ -0,0 +1,74 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- + + +class HTTPError(Exception): + ''' + Represents an HTTP Exception when response status code >= 300. + + :ivar int status: + the status code of the response + :ivar str message: + the message + :ivar list headers: + the returned headers, as a list of (name, value) pairs + :ivar bytes body: + the body of the response + ''' + + def __init__(self, status, message, respheader, respbody): + self.status = status + self.respheader = respheader + self.respbody = respbody + Exception.__init__(self, message) + + +class HTTPResponse(object): + ''' + Represents a response from an HTTP request. + + :ivar int status: + the status code of the response + :ivar str message: + the message + :ivar dict headers: + the returned headers + :ivar bytes body: + the body of the response + ''' + + def __init__(self, status, message, headers, body): + self.status = status + self.message = message + self.headers = headers + self.body = body + + +class HTTPRequest(object): + ''' + Represents an HTTP Request. + + :ivar str host: + the host name to connect to + :ivar str method: + the method to use to connect (string such as GET, POST, PUT, etc.) + :ivar str path: + the uri fragment + :ivar dict query: + query parameters + :ivar dict headers: + header values + :ivar bytes body: + the body of the request. + ''' + + def __init__(self): + self.host = '' + self.method = '' + self.path = '' + self.query = {} # list of (name, value) + self.headers = {} # list of (header name, header value) + self.body = '' diff --git a/src/storage-preview/azext_storage_preview/azure_storage/common/_http/httpclient.py b/src/storage-preview/azext_storage_preview/azure_storage/common/_http/httpclient.py new file mode 100644 index 00000000000..b5847660e29 --- /dev/null +++ b/src/storage-preview/azext_storage_preview/azure_storage/common/_http/httpclient.py @@ -0,0 +1,107 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- + +import logging +from . import HTTPResponse +from .._serialization import _get_data_bytes_or_stream_only +logger = logging.getLogger(__name__) + + +class _HTTPClient(object): + ''' + Takes the request and sends it to cloud service and returns the response. + ''' + + def __init__(self, protocol=None, session=None, timeout=None): + ''' + :param str protocol: + http or https. + :param requests.Session session: + session object created with requests library (or compatible). + :param int timeout: + timeout for the http request, in seconds. + ''' + self.protocol = protocol + self.session = session + self.timeout = timeout + + # By default, requests adds an Accept:*/* and Accept-Encoding to the session, + # which causes issues with some Azure REST APIs. Removing these here gives us + # the flexibility to add it back on a case by case basis. + if 'Accept' in self.session.headers: + del self.session.headers['Accept'] + + if 'Accept-Encoding' in self.session.headers: + del self.session.headers['Accept-Encoding'] + + self.proxies = None + + def set_proxy(self, host, port, user, password): + ''' + Sets the proxy server host and port for the HTTP CONNECT Tunnelling. + + Note that we set the proxies directly on the request later on rather than + using the session object as requests has a bug where session proxy is ignored + in favor of environment proxy. So, auth will not work unless it is passed + directly when making the request as this overrides both. + + :param str host: + Address of the proxy. Ex: '192.168.0.100' + :param int port: + Port of the proxy. Ex: 6000 + :param str user: + User for proxy authorization. + :param str password: + Password for proxy authorization. + ''' + if user and password: + proxy_string = '{}:{}@{}:{}'.format(user, password, host, port) + else: + proxy_string = '{}:{}'.format(host, port) + + self.proxies = {'http': 'http://{}'.format(proxy_string), + 'https': 'https://{}'.format(proxy_string)} + + def perform_request(self, request): + ''' + Sends an HTTPRequest to Azure Storage and returns an HTTPResponse. If + the response code indicates an error, raise an HTTPError. + + :param HTTPRequest request: + The request to serialize and send. + :return: An HTTPResponse containing the parsed HTTP response. + :rtype: :class:`~azure.storage.common._http.HTTPResponse` + ''' + # Verify the body is in bytes or either a file-like/stream object + if request.body: + request.body = _get_data_bytes_or_stream_only('request.body', request.body) + + # Construct the URI + uri = self.protocol.lower() + '://' + request.host + request.path + + # Send the request + response = self.session.request(request.method, + uri, + params=request.query, + headers=request.headers, + data=request.body or None, + timeout=self.timeout, + proxies=self.proxies) + + # Parse the response + status = int(response.status_code) + response_headers = {} + for key, name in response.headers.items(): + # Preserve the case of metadata + if key.lower().startswith('x-ms-meta-'): + response_headers[key] = name + else: + response_headers[key.lower()] = name + + wrap = HTTPResponse(status, response.reason, response_headers, response.content) + response.close() + + return wrap diff --git a/src/storage-preview/azext_storage_preview/azure_storage/common/_serialization.py b/src/storage-preview/azext_storage_preview/azure_storage/common/_serialization.py new file mode 100644 index 00000000000..fd34d5816e2 --- /dev/null +++ b/src/storage-preview/azext_storage_preview/azure_storage/common/_serialization.py @@ -0,0 +1,352 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- +import sys +import uuid +from datetime import date +from io import (BytesIO, IOBase, SEEK_SET, SEEK_END, UnsupportedOperation) +from os import fstat +from time import time +from wsgiref.handlers import format_date_time + +from dateutil.tz import tzutc + +if sys.version_info >= (3,): + from urllib.parse import quote as url_quote +else: + from urllib2 import quote as url_quote + +try: + from xml.etree import cElementTree as ETree +except ImportError: + from xml.etree import ElementTree as ETree + +from ._error import ( + _ERROR_VALUE_SHOULD_BE_BYTES, + _ERROR_VALUE_SHOULD_BE_BYTES_OR_STREAM, + _ERROR_VALUE_SHOULD_BE_SEEKABLE_STREAM +) +from .models import ( + _unicode_type, +) +from ._common_conversion import ( + _str, +) + + +def _to_utc_datetime(value): + # Azure expects the date value passed in to be UTC. + # Azure will always return values as UTC. + # If a date is passed in without timezone info, it is assumed to be UTC. + if value.tzinfo: + value = value.astimezone(tzutc()) + return value.strftime('%Y-%m-%dT%H:%M:%SZ') + + +def _update_request(request, x_ms_version, user_agent_string): + # Verify body + if request.body: + request.body = _get_data_bytes_or_stream_only('request.body', request.body) + length = _len_plus(request.body) + + # only scenario where this case is plausible is if the stream object is not seekable. + if length is None: + raise ValueError(_ERROR_VALUE_SHOULD_BE_SEEKABLE_STREAM) + + # if it is PUT, POST, MERGE, DELETE, need to add content-length to header. + if request.method in ['PUT', 'POST', 'MERGE', 'DELETE']: + request.headers['Content-Length'] = str(length) + + # append addtional headers based on the service + request.headers['x-ms-version'] = x_ms_version + request.headers['User-Agent'] = user_agent_string + request.headers['x-ms-client-request-id'] = str(uuid.uuid1()) + + # If the host has a path component (ex local storage), move it + path = request.host.split('/', 1) + if len(path) == 2: + request.host = path[0] + request.path = '/{}{}'.format(path[1], request.path) + + # Encode and optionally add local storage prefix to path + request.path = url_quote(request.path, '/()$=\',~') + + +def _add_metadata_headers(metadata, request): + if metadata: + if not request.headers: + request.headers = {} + for name, value in metadata.items(): + request.headers['x-ms-meta-' + name] = value + + +def _add_date_header(request): + current_time = format_date_time(time()) + request.headers['x-ms-date'] = current_time + + +def _get_data_bytes_only(param_name, param_value): + '''Validates the request body passed in and converts it to bytes + if our policy allows it.''' + if param_value is None: + return b'' + + if isinstance(param_value, bytes): + return param_value + + raise TypeError(_ERROR_VALUE_SHOULD_BE_BYTES.format(param_name)) + + +def _get_data_bytes_or_stream_only(param_name, param_value): + '''Validates the request body passed in is a stream/file-like or bytes + object.''' + if param_value is None: + return b'' + + if isinstance(param_value, bytes) or hasattr(param_value, 'read'): + return param_value + + raise TypeError(_ERROR_VALUE_SHOULD_BE_BYTES_OR_STREAM.format(param_name)) + + +def _get_request_body(request_body): + '''Converts an object into a request body. If it's None + we'll return an empty string, if it's one of our objects it'll + convert it to XML and return it. Otherwise we just use the object + directly''' + if request_body is None: + return b'' + + if isinstance(request_body, bytes) or isinstance(request_body, IOBase): + return request_body + + if isinstance(request_body, _unicode_type): + return request_body.encode('utf-8') + + request_body = str(request_body) + if isinstance(request_body, _unicode_type): + return request_body.encode('utf-8') + + return request_body + + +def _convert_signed_identifiers_to_xml(signed_identifiers): + if signed_identifiers is None: + return '' + + sis = ETree.Element('SignedIdentifiers') + for id, access_policy in signed_identifiers.items(): + # Root signed identifers element + si = ETree.SubElement(sis, 'SignedIdentifier') + + # Id element + ETree.SubElement(si, 'Id').text = id + + # Access policy element + policy = ETree.SubElement(si, 'AccessPolicy') + + if access_policy.start: + start = access_policy.start + if isinstance(access_policy.start, date): + start = _to_utc_datetime(start) + ETree.SubElement(policy, 'Start').text = start + + if access_policy.expiry: + expiry = access_policy.expiry + if isinstance(access_policy.expiry, date): + expiry = _to_utc_datetime(expiry) + ETree.SubElement(policy, 'Expiry').text = expiry + + if access_policy.permission: + ETree.SubElement(policy, 'Permission').text = _str(access_policy.permission) + + # Add xml declaration and serialize + try: + stream = BytesIO() + ETree.ElementTree(sis).write(stream, xml_declaration=True, encoding='utf-8', method='xml') + except: + raise + finally: + output = stream.getvalue() + stream.close() + + return output + + +def _convert_service_properties_to_xml(logging, hour_metrics, minute_metrics, + cors, target_version=None, delete_retention_policy=None): + ''' + + + + version-number + true|false + true|false + true|false + + true|false + number-of-days + + + + version-number + true|false + true|false + + true|false + number-of-days + + + + version-number + true|false + true|false + + true|false + number-of-days + + + + + comma-separated-list-of-allowed-origins + comma-separated-list-of-HTTP-verb + max-caching-age-in-seconds + comma-seperated-list-of-response-headers + comma-seperated-list-of-request-headers + + + + true|false + number-of-days + + + ''' + service_properties_element = ETree.Element('StorageServiceProperties') + + # Logging + if logging: + logging_element = ETree.SubElement(service_properties_element, 'Logging') + ETree.SubElement(logging_element, 'Version').text = logging.version + ETree.SubElement(logging_element, 'Delete').text = str(logging.delete) + ETree.SubElement(logging_element, 'Read').text = str(logging.read) + ETree.SubElement(logging_element, 'Write').text = str(logging.write) + + retention_element = ETree.SubElement(logging_element, 'RetentionPolicy') + _convert_retention_policy_to_xml(logging.retention_policy, retention_element) + + # HourMetrics + if hour_metrics: + hour_metrics_element = ETree.SubElement(service_properties_element, 'HourMetrics') + _convert_metrics_to_xml(hour_metrics, hour_metrics_element) + + # MinuteMetrics + if minute_metrics: + minute_metrics_element = ETree.SubElement(service_properties_element, 'MinuteMetrics') + _convert_metrics_to_xml(minute_metrics, minute_metrics_element) + + # CORS + # Make sure to still serialize empty list + if cors is not None: + cors_element = ETree.SubElement(service_properties_element, 'Cors') + for rule in cors: + cors_rule = ETree.SubElement(cors_element, 'CorsRule') + ETree.SubElement(cors_rule, 'AllowedOrigins').text = ",".join(rule.allowed_origins) + ETree.SubElement(cors_rule, 'AllowedMethods').text = ",".join(rule.allowed_methods) + ETree.SubElement(cors_rule, 'MaxAgeInSeconds').text = str(rule.max_age_in_seconds) + ETree.SubElement(cors_rule, 'ExposedHeaders').text = ",".join(rule.exposed_headers) + ETree.SubElement(cors_rule, 'AllowedHeaders').text = ",".join(rule.allowed_headers) + + # Target version + if target_version: + ETree.SubElement(service_properties_element, 'DefaultServiceVersion').text = target_version + + # DeleteRetentionPolicy + if delete_retention_policy: + policy_element = ETree.SubElement(service_properties_element, 'DeleteRetentionPolicy') + ETree.SubElement(policy_element, 'Enabled').text = str(delete_retention_policy.enabled) + + if delete_retention_policy.enabled: + ETree.SubElement(policy_element, 'Days').text = str(delete_retention_policy.days) + + # Add xml declaration and serialize + try: + stream = BytesIO() + ETree.ElementTree(service_properties_element).write(stream, xml_declaration=True, encoding='utf-8', + method='xml') + except: + raise + finally: + output = stream.getvalue() + stream.close() + + return output + + +def _convert_metrics_to_xml(metrics, root): + ''' + version-number + true|false + true|false + + true|false + number-of-days + + ''' + # Version + ETree.SubElement(root, 'Version').text = metrics.version + + # Enabled + ETree.SubElement(root, 'Enabled').text = str(metrics.enabled) + + # IncludeAPIs + if metrics.enabled and metrics.include_apis is not None: + ETree.SubElement(root, 'IncludeAPIs').text = str(metrics.include_apis) + + # RetentionPolicy + retention_element = ETree.SubElement(root, 'RetentionPolicy') + _convert_retention_policy_to_xml(metrics.retention_policy, retention_element) + + +def _convert_retention_policy_to_xml(retention_policy, root): + ''' + true|false + number-of-days + ''' + # Enabled + ETree.SubElement(root, 'Enabled').text = str(retention_policy.enabled) + + # Days + if retention_policy.enabled and retention_policy.days: + ETree.SubElement(root, 'Days').text = str(retention_policy.days) + + +def _len_plus(data): + length = None + # Check if object implements the __len__ method, covers most input cases such as bytearray. + try: + length = len(data) + except: + pass + + if not length: + # Check if the stream is a file-like stream object. + # If so, calculate the size using the file descriptor. + try: + fileno = data.fileno() + except (AttributeError, UnsupportedOperation): + pass + else: + return fstat(fileno).st_size + + # If the stream is seekable and tell() is implemented, calculate the stream size. + try: + current_position = data.tell() + data.seek(0, SEEK_END) + length = data.tell() - current_position + data.seek(current_position, SEEK_SET) + except (AttributeError, UnsupportedOperation): + pass + + return length diff --git a/src/storage-preview/azext_storage_preview/azure_storage/common/cloudstorageaccount.py b/src/storage-preview/azext_storage_preview/azure_storage/common/cloudstorageaccount.py new file mode 100644 index 00000000000..5ea30e0843b --- /dev/null +++ b/src/storage-preview/azext_storage_preview/azure_storage/common/cloudstorageaccount.py @@ -0,0 +1,188 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- + +# Note that we import BlobService/QueueService/FileService on demand +# because this module is imported by azure/storage/__init__ +# ie. we don't want 'import azure.storage' to trigger an automatic import +# of blob/queue/file packages. + +from azure.storage.common._error import _validate_not_none +from azure.storage.common.models import ( + ResourceTypes, + Services, + AccountPermissions, +) +from azure.storage.common.sharedaccesssignature import ( + SharedAccessSignature, +) + + +class CloudStorageAccount(object): + """ + Provides a factory for creating the blob, queue, and file services + with a common account name and account key or sas token. Users can either + use the factory or can construct the appropriate service directly. + """ + + def __init__(self, account_name=None, account_key=None, sas_token=None, is_emulated=None): + ''' + :param str account_name: + The storage account name. This is used to authenticate requests + signed with an account key and to construct the storage endpoint. It + is required unless is_emulated is used. + :param str account_key: + The storage account key. This is used for shared key authentication. + :param str sas_token: + A shared access signature token to use to authenticate requests + instead of the account key. If account key and sas token are both + specified, account key will be used to sign. + :param bool is_emulated: + Whether to use the emulator. Defaults to False. If specified, will + override all other parameters. + ''' + self.account_name = account_name + self.account_key = account_key + self.sas_token = sas_token + self.is_emulated = is_emulated + + def create_block_blob_service(self): + ''' + Creates a BlockBlobService object with the settings specified in the + CloudStorageAccount. + + :return: A service object. + :rtype: :class:`~azure.storage.blob.blockblobservice.BlockBlobService` + ''' + try: + from azure.storage.blob.blockblobservice import BlockBlobService + return BlockBlobService(self.account_name, self.account_key, + sas_token=self.sas_token, + is_emulated=self.is_emulated) + except ImportError: + raise Exception('The package azure-storage-blob is required. ' + + 'Please install it using "pip install azure-storage-blob"') + + def create_page_blob_service(self): + ''' + Creates a PageBlobService object with the settings specified in the + CloudStorageAccount. + + :return: A service object. + :rtype: :class:`~azure.storage.blob.pageblobservice.PageBlobService` + ''' + try: + from azure.storage.blob.pageblobservice import PageBlobService + return PageBlobService(self.account_name, self.account_key, + sas_token=self.sas_token, + is_emulated=self.is_emulated) + except ImportError: + raise Exception('The package azure-storage-blob is required. ' + + 'Please install it using "pip install azure-storage-blob"') + + def create_append_blob_service(self): + ''' + Creates a AppendBlobService object with the settings specified in the + CloudStorageAccount. + + :return: A service object. + :rtype: :class:`~azure.storage.blob.appendblobservice.AppendBlobService` + ''' + try: + from azure.storage.blob.appendblobservice import AppendBlobService + return AppendBlobService(self.account_name, self.account_key, + sas_token=self.sas_token, + is_emulated=self.is_emulated) + except ImportError: + raise Exception('The package azure-storage-blob is required. ' + + 'Please install it using "pip install azure-storage-blob"') + + def create_queue_service(self): + ''' + Creates a QueueService object with the settings specified in the + CloudStorageAccount. + + :return: A service object. + :rtype: :class:`~azure.storage.queue.queueservice.QueueService` + ''' + try: + from azure.storage.queue.queueservice import QueueService + return QueueService(self.account_name, self.account_key, + sas_token=self.sas_token, + is_emulated=self.is_emulated) + except ImportError: + raise Exception('The package azure-storage-queue is required. ' + + 'Please install it using "pip install azure-storage-queue"') + + def create_file_service(self): + ''' + Creates a FileService object with the settings specified in the + CloudStorageAccount. + + :return: A service object. + :rtype: :class:`~azure.storage.file.fileservice.FileService` + ''' + try: + from azure.storage.file.fileservice import FileService + return FileService(self.account_name, self.account_key, + sas_token=self.sas_token) + except ImportError: + raise Exception('The package azure-storage-file is required. ' + + 'Please install it using "pip install azure-storage-file"') + + def generate_shared_access_signature(self, services, resource_types, + permission, expiry, start=None, + ip=None, protocol=None): + ''' + Generates a shared access signature for the account. + Use the returned signature with the sas_token parameter of the service + or to create a new account object. + + :param Services services: + Specifies the services accessible with the account SAS. You can + combine values to provide access to more than one service. + :param ResourceTypes resource_types: + Specifies the resource types that are accessible with the account + SAS. You can combine values to provide access to more than one + resource type. + :param AccountPermissions permission: + The permissions associated with the shared access signature. The + user is restricted to operations allowed by the permissions. + Required unless an id is given referencing a stored access policy + which contains this field. This field must be omitted if it has been + specified in an associated stored access policy. You can combine + values to provide more than one permission. + :param expiry: + The time at which the shared access signature becomes invalid. + Required unless an id is given referencing a stored access policy + which contains this field. This field must be omitted if it has + been specified in an associated stored access policy. Azure will always + convert values to UTC. If a date is passed in without timezone info, it + is assumed to be UTC. + :type expiry: datetime or str + :param start: + The time at which the shared access signature becomes valid. If + omitted, start time for this call is assumed to be the time when the + storage service receives the request. Azure will always convert values + to UTC. If a date is passed in without timezone info, it is assumed to + be UTC. + :type start: datetime or str + :param str ip: + Specifies an IP address or a range of IP addresses from which to accept requests. + If the IP address from which the request originates does not match the IP address + or address range specified on the SAS token, the request is not authenticated. + For example, specifying sip=168.1.5.65 or sip=168.1.5.60-168.1.5.70 on the SAS + restricts the request to those IP addresses. + :param str protocol: + Specifies the protocol permitted for a request made. Possible values are + both HTTPS and HTTP (https,http) or HTTPS only (https). The default value + is https,http. Note that HTTP only is not a permitted value. + ''' + _validate_not_none('self.account_name', self.account_name) + _validate_not_none('self.account_key', self.account_key) + + sas = SharedAccessSignature(self.account_name, self.account_key) + return sas.generate_account(services, resource_types, permission, + expiry, start=start, ip=ip, protocol=protocol) diff --git a/src/storage-preview/azext_storage_preview/azure_storage/common/models.py b/src/storage-preview/azext_storage_preview/azure_storage/common/models.py new file mode 100644 index 00000000000..e11153c2810 --- /dev/null +++ b/src/storage-preview/azext_storage_preview/azure_storage/common/models.py @@ -0,0 +1,646 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- +import sys + +if sys.version_info < (3,): + from collections import Iterable + + _unicode_type = unicode +else: + from collections.abc import Iterable + + _unicode_type = str + +from ._error import ( + _validate_not_none +) + + +class _HeaderDict(dict): + def __getitem__(self, index): + return super(_HeaderDict, self).__getitem__(index.lower()) + + +class _list(list): + '''Used so that additional properties can be set on the return list''' + pass + + +class _dict(dict): + '''Used so that additional properties can be set on the return dictionary''' + pass + + +class _OperationContext(object): + ''' + Contains information that lasts the lifetime of an operation. This operation + may span multiple calls to the Azure service. + + :ivar bool location_lock: + Whether the location should be locked for this operation. + :ivar str location: + The location to lock to. + ''' + + def __init__(self, location_lock=False): + self.location_lock = location_lock + self.host_location = None + + +class ListGenerator(Iterable): + ''' + A generator object used to list storage resources. The generator will lazily + follow the continuation tokens returned by the service and stop when all + resources have been returned or max_results is reached. + + If max_results is specified and the account has more than that number of + resources, the generator will have a populated next_marker field once it + finishes. This marker can be used to create a new generator if more + results are desired. + ''' + + def __init__(self, resources, list_method, list_args, list_kwargs): + self.items = resources + self.next_marker = resources.next_marker + + self._list_method = list_method + self._list_args = list_args + self._list_kwargs = list_kwargs + + def __iter__(self): + # return results + for i in self.items: + yield i + + while True: + # if no more results on the service, return + if not self.next_marker: + break + + # update the marker args + self._list_kwargs['marker'] = self.next_marker + + # handle max results, if present + max_results = self._list_kwargs.get('max_results') + if max_results is not None: + max_results = max_results - len(self.items) + + # if we've reached max_results, return + # else, update the max_results arg + if max_results <= 0: + break + else: + self._list_kwargs['max_results'] = max_results + + # get the next segment + resources = self._list_method(*self._list_args, **self._list_kwargs) + self.items = resources + self.next_marker = resources.next_marker + + # return results + for i in self.items: + yield i + + +class RetryContext(object): + ''' + Contains the request and response information that can be used to determine + whether and how to retry. This context is stored across retries and may be + used to store other information relevant to the retry strategy. + + :ivar ~azure.storage.common._http.HTTPRequest request: + The request sent to the storage service. + :ivar ~azure.storage.common._http.HTTPResponse response: + The response returned by the storage service. + :ivar LocationMode location_mode: + The location the request was sent to. + :ivar Exception exception: + The exception that just occurred. The type could either be AzureException (for HTTP errors), + or other Exception types from lower layers, which are kept unwrapped for easier processing. + :ivar bool is_emulated: + Whether retry is targeting the emulator. The default value is False. + ''' + + def __init__(self): + self.request = None + self.response = None + self.location_mode = None + self.exception = None + self.is_emulated = False + + +class LocationMode(object): + ''' + Specifies the location the request should be sent to. This mode only applies + for RA-GRS accounts which allow secondary read access. All other account types + must use PRIMARY. + ''' + + PRIMARY = 'primary' + ''' Requests should be sent to the primary location. ''' + + SECONDARY = 'secondary' + ''' Requests should be sent to the secondary location, if possible. ''' + + +class RetentionPolicy(object): + ''' + By default, Storage Analytics will not delete any logging or metrics data. Blobs + will continue to be written until the shared 20TB limit is + reached. Once the 20TB limit is reached, Storage Analytics will stop writing + new data and will not resume until free space is available. This 20TB limit + is independent of the total limit for your storage account. + + There are two ways to delete Storage Analytics data: by manually making deletion + requests or by setting a data retention policy. Manual requests to delete Storage + Analytics data are billable, but delete requests resulting from a retention policy + are not billable. + ''' + + def __init__(self, enabled=False, days=None): + ''' + :param bool enabled: + Indicates whether a retention policy is enabled for the + storage service. If disabled, logging and metrics data will be retained + infinitely by the service unless explicitly deleted. + :param int days: + Required if enabled is true. Indicates the number of + days that metrics or logging data should be retained. All data older + than this value will be deleted. The minimum value you can specify is 1; + the largest value is 365 (one year). + ''' + _validate_not_none("enabled", enabled) + if enabled: + _validate_not_none("days", days) + + self.enabled = enabled + self.days = days + + +class Logging(object): + ''' + Storage Analytics logs detailed information about successful and failed requests + to a storage service. This information can be used to monitor individual requests + and to diagnose issues with a storage service. Requests are logged on a best-effort + basis. + + All logs are stored in block blobs in a container named $logs, which is + automatically created when Storage Analytics is enabled for a storage account. + The $logs container is located in the blob namespace of the storage account. + This container cannot be deleted once Storage Analytics has been enabled, though + its contents can be deleted. + + For more information, see https://msdn.microsoft.com/en-us/library/azure/hh343262.aspx + ''' + + def __init__(self, delete=False, read=False, write=False, + retention_policy=None): + ''' + :param bool delete: + Indicates whether all delete requests should be logged. + :param bool read: + Indicates whether all read requests should be logged. + :param bool write: + Indicates whether all write requests should be logged. + :param RetentionPolicy retention_policy: + The retention policy for the metrics. + ''' + _validate_not_none("read", read) + _validate_not_none("write", write) + _validate_not_none("delete", delete) + + self.version = u'1.0' + self.delete = delete + self.read = read + self.write = write + self.retention_policy = retention_policy if retention_policy else RetentionPolicy() + + +class Metrics(object): + ''' + Metrics include aggregated transaction statistics and capacity data about requests + to a storage service. Transactions are reported at both the API operation level + as well as at the storage service level, and capacity is reported at the storage + service level. Metrics data can be used to analyze storage service usage, diagnose + issues with requests made against the storage service, and to improve the + performance of applications that use a service. + + For more information, see https://msdn.microsoft.com/en-us/library/azure/hh343258.aspx + ''' + + def __init__(self, enabled=False, include_apis=None, + retention_policy=None): + ''' + :param bool enabled: + Indicates whether metrics are enabled for + the service. + :param bool include_apis: + Required if enabled is True. Indicates whether metrics + should generate summary statistics for called API operations. + :param RetentionPolicy retention_policy: + The retention policy for the metrics. + ''' + _validate_not_none("enabled", enabled) + if enabled: + _validate_not_none("include_apis", include_apis) + + self.version = u'1.0' + self.enabled = enabled + self.include_apis = include_apis + self.retention_policy = retention_policy if retention_policy else RetentionPolicy() + + +class CorsRule(object): + ''' + CORS is an HTTP feature that enables a web application running under one domain + to access resources in another domain. Web browsers implement a security + restriction known as same-origin policy that prevents a web page from calling + APIs in a different domain; CORS provides a secure way to allow one domain + (the origin domain) to call APIs in another domain. + + For more information, see https://msdn.microsoft.com/en-us/library/azure/dn535601.aspx + ''' + + def __init__(self, allowed_origins, allowed_methods, max_age_in_seconds=0, + exposed_headers=None, allowed_headers=None): + ''' + :param allowed_origins: + A list of origin domains that will be allowed via CORS, or "*" to allow + all domains. The list of must contain at least one entry. Limited to 64 + origin domains. Each allowed origin can have up to 256 characters. + :type allowed_origins: list(str) + :param allowed_methods: + A list of HTTP methods that are allowed to be executed by the origin. + The list of must contain at least one entry. For Azure Storage, + permitted methods are DELETE, GET, HEAD, MERGE, POST, OPTIONS or PUT. + :type allowed_methods: list(str) + :param int max_age_in_seconds: + The number of seconds that the client/browser should cache a + preflight response. + :param exposed_headers: + Defaults to an empty list. A list of response headers to expose to CORS + clients. Limited to 64 defined headers and two prefixed headers. Each + header can be up to 256 characters. + :type exposed_headers: list(str) + :param allowed_headers: + Defaults to an empty list. A list of headers allowed to be part of + the cross-origin request. Limited to 64 defined headers and 2 prefixed + headers. Each header can be up to 256 characters. + :type allowed_headers: list(str) + ''' + _validate_not_none("allowed_origins", allowed_origins) + _validate_not_none("allowed_methods", allowed_methods) + _validate_not_none("max_age_in_seconds", max_age_in_seconds) + + self.allowed_origins = allowed_origins if allowed_origins else list() + self.allowed_methods = allowed_methods if allowed_methods else list() + self.max_age_in_seconds = max_age_in_seconds + self.exposed_headers = exposed_headers if exposed_headers else list() + self.allowed_headers = allowed_headers if allowed_headers else list() + + +class DeleteRetentionPolicy(object): + ''' + To set DeleteRetentionPolicy, you must call Set Blob Service Properties using version 2017-07-29 or later. + This class groups the settings related to delete retention policy. + ''' + + def __init__(self, enabled=False, days=None): + ''' + :param bool enabled: + Required. Indicates whether a deleted blob or snapshot is retained or immediately removed by delete operation. + :param int days: + Required only if Enabled is true. Indicates the number of days that deleted blob be retained. + All data older than this value will be permanently deleted. + The minimum value you can specify is 1; the largest value is 365. + ''' + _validate_not_none("enabled", enabled) + if enabled: + _validate_not_none("days", days) + + self.enabled = enabled + self.days = days + + +class ServiceProperties(object): + ''' + Returned by get_*_service_properties functions. Contains the properties of a + storage service, including Analytics and CORS rules. + + Azure Storage Analytics performs logging and provides metrics data for a storage + account. You can use this data to trace requests, analyze usage trends, and + diagnose issues with your storage account. To use Storage Analytics, you must + enable it individually for each service you want to monitor. + + The aggregated data is stored in a well-known blob (for logging) and in well-known + tables (for metrics), which may be accessed using the Blob service and Table + service APIs. + + For an in-depth guide on using Storage Analytics and other tools to identify, + diagnose, and troubleshoot Azure Storage-related issues, see + http://azure.microsoft.com/documentation/articles/storage-monitoring-diagnosing-troubleshooting/ + + For more information on CORS, see https://msdn.microsoft.com/en-us/library/azure/dn535601.aspx + ''' + + pass + + +class ServiceStats(object): + ''' + Returned by get_*_service_stats functions. Contains statistics related to + replication for the given service. It is only available when read-access + geo-redundant replication is enabled for the storage account. + + :ivar GeoReplication geo_replication: + An object containing statistics related to replication for the given service. + ''' + pass + + +class GeoReplication(object): + ''' + Contains statistics related to replication for the given service. + + :ivar str status: + The status of the secondary location. Possible values are: + live: Indicates that the secondary location is active and operational. + bootstrap: Indicates initial synchronization from the primary location + to the secondary location is in progress. This typically occurs + when replication is first enabled. + unavailable: Indicates that the secondary location is temporarily + unavailable. + :ivar date last_sync_time: + A GMT date value, to the second. All primary writes preceding this value + are guaranteed to be available for read operations at the secondary. + Primary writes after this point in time may or may not be available for + reads. The value may be empty if LastSyncTime is not available. This can + happen if the replication status is bootstrap or unavailable. Although + geo-replication is continuously enabled, the LastSyncTime result may + reflect a cached value from the service that is refreshed every few minutes. + ''' + pass + + +class AccessPolicy(object): + ''' + Access Policy class used by the set and get acl methods in each service. + + A stored access policy can specify the start time, expiry time, and + permissions for the Shared Access Signatures with which it's associated. + Depending on how you want to control access to your resource, you can + specify all of these parameters within the stored access policy, and omit + them from the URL for the Shared Access Signature. Doing so permits you to + modify the associated signature's behavior at any time, as well as to revoke + it. Or you can specify one or more of the access policy parameters within + the stored access policy, and the others on the URL. Finally, you can + specify all of the parameters on the URL. In this case, you can use the + stored access policy to revoke the signature, but not to modify its behavior. + + Together the Shared Access Signature and the stored access policy must + include all fields required to authenticate the signature. If any required + fields are missing, the request will fail. Likewise, if a field is specified + both in the Shared Access Signature URL and in the stored access policy, the + request will fail with status code 400 (Bad Request). + ''' + + def __init__(self, permission=None, expiry=None, start=None): + ''' + :param str permission: + The permissions associated with the shared access signature. The + user is restricted to operations allowed by the permissions. + Required unless an id is given referencing a stored access policy + which contains this field. This field must be omitted if it has been + specified in an associated stored access policy. + :param expiry: + The time at which the shared access signature becomes invalid. + Required unless an id is given referencing a stored access policy + which contains this field. This field must be omitted if it has + been specified in an associated stored access policy. Azure will always + convert values to UTC. If a date is passed in without timezone info, it + is assumed to be UTC. + :type expiry: datetime or str + :param start: + The time at which the shared access signature becomes valid. If + omitted, start time for this call is assumed to be the time when the + storage service receives the request. Azure will always convert values + to UTC. If a date is passed in without timezone info, it is assumed to + be UTC. + :type start: datetime or str + ''' + self.start = start + self.expiry = expiry + self.permission = permission + + +class Protocol(object): + ''' + Specifies the protocol permitted for a SAS token. Note that HTTP only is + not allowed. + ''' + + HTTPS = 'https' + ''' Allow HTTPS requests only. ''' + + HTTPS_HTTP = 'https,http' + ''' Allow HTTP and HTTPS requests. ''' + + +class ResourceTypes(object): + ''' + Specifies the resource types that are accessible with the account SAS. + + :ivar ResourceTypes ResourceTypes.CONTAINER: + Access to container-level APIs (e.g., Create/Delete Container, + Create/Delete Queue, Create/Delete Share, + List Blobs/Files and Directories) + :ivar ResourceTypes ResourceTypes.OBJECT: + Access to object-level APIs for blobs, queue messages, and + files(e.g. Put Blob, Query Entity, Get Messages, Create File, etc.) + :ivar ResourceTypes ResourceTypes.SERVICE: + Access to service-level APIs (e.g., Get/Set Service Properties, + Get Service Stats, List Containers/Queues/Shares) + ''' + + def __init__(self, service=False, container=False, object=False, _str=None): + ''' + :param bool service: + Access to service-level APIs (e.g., Get/Set Service Properties, + Get Service Stats, List Containers/Queues/Shares) + :param bool container: + Access to container-level APIs (e.g., Create/Delete Container, + Create/Delete Queue, Create/Delete Share, + List Blobs/Files and Directories) + :param bool object: + Access to object-level APIs for blobs, queue messages, and + files(e.g. Put Blob, Query Entity, Get Messages, Create File, etc.) + :param str _str: + A string representing the resource types. + ''' + if not _str: + _str = '' + self.service = service or ('s' in _str) + self.container = container or ('c' in _str) + self.object = object or ('o' in _str) + + def __or__(self, other): + return ResourceTypes(_str=str(self) + str(other)) + + def __add__(self, other): + return ResourceTypes(_str=str(self) + str(other)) + + def __str__(self): + return (('s' if self.service else '') + + ('c' if self.container else '') + + ('o' if self.object else '')) + + +ResourceTypes.SERVICE = ResourceTypes(service=True) +ResourceTypes.CONTAINER = ResourceTypes(container=True) +ResourceTypes.OBJECT = ResourceTypes(object=True) + + +class Services(object): + ''' + Specifies the services accessible with the account SAS. + + :ivar Services Services.BLOB: The blob service. + :ivar Services Services.FILE: The file service + :ivar Services Services.QUEUE: The queue service. + :ivar Services Services.TABLE: The table service. + ''' + + def __init__(self, blob=False, queue=False, file=False, table=False, _str=None): + ''' + :param bool blob: + Access to any blob service, for example, the `.BlockBlobService` + :param bool queue: + Access to the `.QueueService` + :param bool file: + Access to the `.FileService` + :param bool table: + Access to the TableService + :param str _str: + A string representing the services. + ''' + if not _str: + _str = '' + self.blob = blob or ('b' in _str) + self.queue = queue or ('q' in _str) + self.file = file or ('f' in _str) + self.table = table or ('t' in _str) + + def __or__(self, other): + return Services(_str=str(self) + str(other)) + + def __add__(self, other): + return Services(_str=str(self) + str(other)) + + def __str__(self): + return (('b' if self.blob else '') + + ('q' if self.queue else '') + + ('t' if self.table else '') + + ('f' if self.file else '')) + + +Services.BLOB = Services(blob=True) +Services.QUEUE = Services(queue=True) +Services.TABLE = Services(table=True) +Services.FILE = Services(file=True) + + +class AccountPermissions(object): + ''' + :class:`~ResourceTypes` class to be used with generate_shared_access_signature + method and for the AccessPolicies used with set_*_acl. There are two types of + SAS which may be used to grant resource access. One is to grant access to a + specific resource (resource-specific). Another is to grant access to the + entire service for a specific account and allow certain operations based on + perms found here. + + :ivar AccountPermissions AccountPermissions.ADD: + Valid for the following Object resource types only: queue messages and append blobs. + :ivar AccountPermissions AccountPermissions.CREATE: + Valid for the following Object resource types only: blobs and files. Users + can create new blobs or files, but may not overwrite existing blobs or files. + :ivar AccountPermissions AccountPermissions.DELETE: + Valid for Container and Object resource types, except for queue messages. + :ivar AccountPermissions AccountPermissions.LIST: + Valid for Service and Container resource types only. + :ivar AccountPermissions AccountPermissions.PROCESS: + Valid for the following Object resource type only: queue messages. + :ivar AccountPermissions AccountPermissions.READ: + Valid for all signed resources types (Service, Container, and Object). + Permits read permissions to the specified resource type. + :ivar AccountPermissions AccountPermissions.UPDATE: + Valid for the following Object resource types only: queue messages. + :ivar AccountPermissions AccountPermissions.WRITE: + Valid for all signed resources types (Service, Container, and Object). + Permits write permissions to the specified resource type. + ''' + + def __init__(self, read=False, write=False, delete=False, list=False, + add=False, create=False, update=False, process=False, _str=None): + ''' + :param bool read: + Valid for all signed resources types (Service, Container, and Object). + Permits read permissions to the specified resource type. + :param bool write: + Valid for all signed resources types (Service, Container, and Object). + Permits write permissions to the specified resource type. + :param bool delete: + Valid for Container and Object resource types, except for queue messages. + :param bool list: + Valid for Service and Container resource types only. + :param bool add: + Valid for the following Object resource types only: queue messages, and append blobs. + :param bool create: + Valid for the following Object resource types only: blobs and files. + Users can create new blobs or files, but may not overwrite existing + blobs or files. + :param bool update: + Valid for the following Object resource types only: queue messages. + :param bool process: + Valid for the following Object resource type only: queue messages. + :param str _str: + A string representing the permissions. + ''' + if not _str: + _str = '' + self.read = read or ('r' in _str) + self.write = write or ('w' in _str) + self.delete = delete or ('d' in _str) + self.list = list or ('l' in _str) + self.add = add or ('a' in _str) + self.create = create or ('c' in _str) + self.update = update or ('u' in _str) + self.process = process or ('p' in _str) + + def __or__(self, other): + return AccountPermissions(_str=str(self) + str(other)) + + def __add__(self, other): + return AccountPermissions(_str=str(self) + str(other)) + + def __str__(self): + return (('r' if self.read else '') + + ('w' if self.write else '') + + ('d' if self.delete else '') + + ('l' if self.list else '') + + ('a' if self.add else '') + + ('c' if self.create else '') + + ('u' if self.update else '') + + ('p' if self.process else '')) + + +AccountPermissions.READ = AccountPermissions(read=True) +AccountPermissions.WRITE = AccountPermissions(write=True) +AccountPermissions.DELETE = AccountPermissions(delete=True) +AccountPermissions.LIST = AccountPermissions(list=True) +AccountPermissions.ADD = AccountPermissions(add=True) +AccountPermissions.CREATE = AccountPermissions(create=True) +AccountPermissions.UPDATE = AccountPermissions(update=True) +AccountPermissions.PROCESS = AccountPermissions(process=True) diff --git a/src/storage-preview/azext_storage_preview/azure_storage/common/retry.py b/src/storage-preview/azext_storage_preview/azure_storage/common/retry.py new file mode 100644 index 00000000000..69dafef9cfe --- /dev/null +++ b/src/storage-preview/azext_storage_preview/azure_storage/common/retry.py @@ -0,0 +1,292 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- +from abc import ABCMeta +from math import pow +import random + +from .models import LocationMode +from ._constants import ( + DEV_ACCOUNT_NAME, + DEV_ACCOUNT_SECONDARY_NAME +) + + +class _Retry(object): + ''' + The base class for Exponential and Linear retries containing shared code. + ''' + __metaclass__ = ABCMeta + + def __init__(self, max_attempts, retry_to_secondary): + ''' + Constructs a base retry object. + + :param int max_attempts: + The maximum number of retry attempts. + :param bool retry_to_secondary: + Whether the request should be retried to secondary, if able. This should + only be enabled of RA-GRS accounts are used and potentially stale data + can be handled. + ''' + self.max_attempts = max_attempts + self.retry_to_secondary = retry_to_secondary + + def _should_retry(self, context): + ''' + A function which determines whether or not to retry. + + :param ~azure.storage.models.RetryContext context: + The retry context. This contains the request, response, and other data + which can be used to determine whether or not to retry. + :return: + A boolean indicating whether or not to retry the request. + :rtype: bool + ''' + # If max attempts are reached, do not retry. + if context.count >= self.max_attempts: + return False + + status = None + if context.response and context.response.status: + status = context.response.status + + if status is None: + ''' + If status is None, retry as this request triggered an exception. For + example, network issues would trigger this. + ''' + return True + elif 200 <= status < 300: + ''' + This method is called after a successful response, meaning we failed + during the response body download or parsing. So, success codes should + be retried. + ''' + return True + elif 300 <= status < 500: + ''' + An exception occured, but in most cases it was expected. Examples could + include a 309 Conflict or 412 Precondition Failed. + ''' + if status == 404 and context.location_mode == LocationMode.SECONDARY: + # Response code 404 should be retried if secondary was used. + return True + if status == 408: + # Response code 408 is a timeout and should be retried. + return True + return False + elif status >= 500: + ''' + Response codes above 500 with the exception of 501 Not Implemented and + 505 Version Not Supported indicate a server issue and should be retried. + ''' + if status == 501 or status == 505: + return False + return True + else: + # If something else happened, it's unexpected. Retry. + return True + + def _set_next_host_location(self, context): + ''' + A function which sets the next host location on the request, if applicable. + + :param ~azure.storage.models.RetryContext context: + The retry context containing the previous host location and the request + to evaluate and possibly modify. + ''' + if len(context.request.host_locations) > 1: + # If there's more than one possible location, retry to the alternative + if context.location_mode == LocationMode.PRIMARY: + context.location_mode = LocationMode.SECONDARY + + # if targeting the emulator (with path style), change path instead of host + if context.is_emulated: + # replace the first instance of primary account name with the secondary account name + context.request.path = context.request.path.replace(DEV_ACCOUNT_NAME, DEV_ACCOUNT_SECONDARY_NAME, 1) + else: + context.request.host = context.request.host_locations.get(context.location_mode) + else: + context.location_mode = LocationMode.PRIMARY + + # if targeting the emulator (with path style), change path instead of host + if context.is_emulated: + # replace the first instance of secondary account name with the primary account name + context.request.path = context.request.path.replace(DEV_ACCOUNT_SECONDARY_NAME, DEV_ACCOUNT_NAME, 1) + else: + context.request.host = context.request.host_locations.get(context.location_mode) + + def _retry(self, context, backoff): + ''' + A function which determines whether and how to retry. + + :param ~azure.storage.models.RetryContext context: + The retry context. This contains the request, response, and other data + which can be used to determine whether or not to retry. + :param function() backoff: + A function which returns the backoff time if a retry is to be performed. + :return: + An integer indicating how long to wait before retrying the request, + or None to indicate no retry should be performed. + :rtype: int or None + ''' + # If the context does not contain a count parameter, this request has not + # been retried yet. Add the count parameter to track the number of retries. + if not hasattr(context, 'count'): + context.count = 0 + + # Determine whether to retry, and if so increment the count, modify the + # request as desired, and return the backoff. + if self._should_retry(context): + backoff_interval = backoff(context) + context.count += 1 + + # If retry to secondary is enabled, attempt to change the host if the + # request allows it + if self.retry_to_secondary: + self._set_next_host_location(context) + + return backoff_interval + + return None + + +class ExponentialRetry(_Retry): + ''' + Exponential retry. + ''' + + def __init__(self, initial_backoff=15, increment_base=3, max_attempts=3, + retry_to_secondary=False, random_jitter_range=3): + ''' + Constructs an Exponential retry object. The initial_backoff is used for + the first retry. Subsequent retries are retried after initial_backoff + + increment_power^retry_count seconds. For example, by default the first retry + occurs after 15 seconds, the second after (15+3^1) = 18 seconds, and the + third after (15+3^2) = 24 seconds. + + :param int initial_backoff: + The initial backoff interval, in seconds, for the first retry. + :param int increment_base: + The base, in seconds, to increment the initial_backoff by after the + first retry. + :param int max_attempts: + The maximum number of retry attempts. + :param bool retry_to_secondary: + Whether the request should be retried to secondary, if able. This should + only be enabled of RA-GRS accounts are used and potentially stale data + can be handled. + :param int random_jitter_range: + A number in seconds which indicates a range to jitter/randomize for the back-off interval. + For example, a random_jitter_range of 3 results in the back-off interval x to vary between x+3 and x-3. + ''' + self.initial_backoff = initial_backoff + self.increment_base = increment_base + self.random_jitter_range = random_jitter_range + super(ExponentialRetry, self).__init__(max_attempts, retry_to_secondary) + + ''' + A function which determines whether and how to retry. + + :param ~azure.storage.models.RetryContext context: + The retry context. This contains the request, response, and other data + which can be used to determine whether or not to retry. + :return: + An integer indicating how long to wait before retrying the request, + or None to indicate no retry should be performed. + :rtype: int or None + ''' + + def retry(self, context): + return self._retry(context, self._backoff) + + ''' + Calculates how long to sleep before retrying. + + :return: + An integer indicating how long to wait before retrying the request, + or None to indicate no retry should be performed. + :rtype: int or None + ''' + + def _backoff(self, context): + random_generator = random.Random() + backoff = self.initial_backoff + (0 if context.count == 0 else pow(self.increment_base, context.count)) + random_range_start = backoff - self.random_jitter_range if backoff > self.random_jitter_range else 0 + random_range_end = backoff + self.random_jitter_range + return random_generator.uniform(random_range_start, random_range_end) + + +class LinearRetry(_Retry): + ''' + Linear retry. + ''' + + def __init__(self, backoff=15, max_attempts=3, retry_to_secondary=False, random_jitter_range=3): + ''' + Constructs a Linear retry object. + + :param int backoff: + The backoff interval, in seconds, between retries. + :param int max_attempts: + The maximum number of retry attempts. + :param bool retry_to_secondary: + Whether the request should be retried to secondary, if able. This should + only be enabled of RA-GRS accounts are used and potentially stale data + can be handled. + :param int random_jitter_range: + A number in seconds which indicates a range to jitter/randomize for the back-off interval. + For example, a random_jitter_range of 3 results in the back-off interval x to vary between x+3 and x-3. + ''' + self.backoff = backoff + self.max_attempts = max_attempts + self.random_jitter_range = random_jitter_range + super(LinearRetry, self).__init__(max_attempts, retry_to_secondary) + + ''' + A function which determines whether and how to retry. + + :param ~azure.storage.models.RetryContext context: + The retry context. This contains the request, response, and other data + which can be used to determine whether or not to retry. + :return: + An integer indicating how long to wait before retrying the request, + or None to indicate no retry should be performed. + :rtype: int or None + ''' + + def retry(self, context): + return self._retry(context, self._backoff) + + ''' + Calculates how long to sleep before retrying. + + :return: + An integer indicating how long to wait before retrying the request, + or None to indicate no retry should be performed. + :rtype: int or None + ''' + + def _backoff(self, context): + random_generator = random.Random() + # the backoff interval normally does not change, however there is the possibility + # that it was modified by accessing the property directly after initializing the object + self.random_range_start = self.backoff - self.random_jitter_range if self.backoff > self.random_jitter_range else 0 + self.random_range_end = self.backoff + self.random_jitter_range + return random_generator.uniform(self.random_range_start, self.random_range_end) + + +def no_retry(context): + ''' + Specifies never to retry. + + :param ~azure.storage.models.RetryContext context: + The retry context. + :return: + Always returns None to indicate never to retry. + :rtype: None + ''' + return None diff --git a/src/storage-preview/azext_storage_preview/azure_storage/common/sharedaccesssignature.py b/src/storage-preview/azext_storage_preview/azure_storage/common/sharedaccesssignature.py new file mode 100644 index 00000000000..c23201a85bc --- /dev/null +++ b/src/storage-preview/azext_storage_preview/azure_storage/common/sharedaccesssignature.py @@ -0,0 +1,217 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- +from datetime import date + +from ._common_conversion import ( + _sign_string, + _to_str, +) +from ._constants import DEFAULT_X_MS_VERSION +from ._serialization import ( + url_quote, + _to_utc_datetime, +) + + +class SharedAccessSignature(object): + ''' + Provides a factory for creating account access + signature tokens with an account name and account key. Users can either + use the factory or can construct the appropriate service and use the + generate_*_shared_access_signature method directly. + ''' + + def __init__(self, account_name, account_key, x_ms_version=DEFAULT_X_MS_VERSION): + ''' + :param str account_name: + The storage account name used to generate the shared access signatures. + :param str account_key: + The access key to generate the shares access signatures. + :param str x_ms_version: + The service version used to generate the shared access signatures. + ''' + self.account_name = account_name + self.account_key = account_key + self.x_ms_version = x_ms_version + + def generate_account(self, services, resource_types, permission, expiry, start=None, + ip=None, protocol=None): + ''' + Generates a shared access signature for the account. + Use the returned signature with the sas_token parameter of the service + or to create a new account object. + + :param Services services: + Specifies the services accessible with the account SAS. You can + combine values to provide access to more than one service. + :param ResourceTypes resource_types: + Specifies the resource types that are accessible with the account + SAS. You can combine values to provide access to more than one + resource type. + :param AccountPermissions permission: + The permissions associated with the shared access signature. The + user is restricted to operations allowed by the permissions. + Required unless an id is given referencing a stored access policy + which contains this field. This field must be omitted if it has been + specified in an associated stored access policy. You can combine + values to provide more than one permission. + :param expiry: + The time at which the shared access signature becomes invalid. + Required unless an id is given referencing a stored access policy + which contains this field. This field must be omitted if it has + been specified in an associated stored access policy. Azure will always + convert values to UTC. If a date is passed in without timezone info, it + is assumed to be UTC. + :type expiry: datetime or str + :param start: + The time at which the shared access signature becomes valid. If + omitted, start time for this call is assumed to be the time when the + storage service receives the request. Azure will always convert values + to UTC. If a date is passed in without timezone info, it is assumed to + be UTC. + :type start: datetime or str + :param str ip: + Specifies an IP address or a range of IP addresses from which to accept requests. + If the IP address from which the request originates does not match the IP address + or address range specified on the SAS token, the request is not authenticated. + For example, specifying sip=168.1.5.65 or sip=168.1.5.60-168.1.5.70 on the SAS + restricts the request to those IP addresses. + :param str protocol: + Specifies the protocol permitted for a request made. The default value + is https,http. See :class:`~azure.storage.common.models.Protocol` for possible values. + ''' + sas = _SharedAccessHelper() + sas.add_base(permission, expiry, start, ip, protocol, self.x_ms_version) + sas.add_account(services, resource_types) + sas.add_account_signature(self.account_name, self.account_key) + + return sas.get_token() + + +class _QueryStringConstants(object): + SIGNED_SIGNATURE = 'sig' + SIGNED_PERMISSION = 'sp' + SIGNED_START = 'st' + SIGNED_EXPIRY = 'se' + SIGNED_RESOURCE = 'sr' + SIGNED_IDENTIFIER = 'si' + SIGNED_IP = 'sip' + SIGNED_PROTOCOL = 'spr' + SIGNED_VERSION = 'sv' + SIGNED_CACHE_CONTROL = 'rscc' + SIGNED_CONTENT_DISPOSITION = 'rscd' + SIGNED_CONTENT_ENCODING = 'rsce' + SIGNED_CONTENT_LANGUAGE = 'rscl' + SIGNED_CONTENT_TYPE = 'rsct' + START_PK = 'spk' + START_RK = 'srk' + END_PK = 'epk' + END_RK = 'erk' + SIGNED_RESOURCE_TYPES = 'srt' + SIGNED_SERVICES = 'ss' + + +class _SharedAccessHelper(object): + def __init__(self): + self.query_dict = {} + + def _add_query(self, name, val): + if val: + self.query_dict[name] = _to_str(val) + + def add_base(self, permission, expiry, start, ip, protocol, x_ms_version): + if isinstance(start, date): + start = _to_utc_datetime(start) + + if isinstance(expiry, date): + expiry = _to_utc_datetime(expiry) + + self._add_query(_QueryStringConstants.SIGNED_START, start) + self._add_query(_QueryStringConstants.SIGNED_EXPIRY, expiry) + self._add_query(_QueryStringConstants.SIGNED_PERMISSION, permission) + self._add_query(_QueryStringConstants.SIGNED_IP, ip) + self._add_query(_QueryStringConstants.SIGNED_PROTOCOL, protocol) + self._add_query(_QueryStringConstants.SIGNED_VERSION, x_ms_version) + + def add_resource(self, resource): + self._add_query(_QueryStringConstants.SIGNED_RESOURCE, resource) + + def add_id(self, id): + self._add_query(_QueryStringConstants.SIGNED_IDENTIFIER, id) + + def add_account(self, services, resource_types): + self._add_query(_QueryStringConstants.SIGNED_SERVICES, services) + self._add_query(_QueryStringConstants.SIGNED_RESOURCE_TYPES, resource_types) + + def add_override_response_headers(self, cache_control, + content_disposition, + content_encoding, + content_language, + content_type): + self._add_query(_QueryStringConstants.SIGNED_CACHE_CONTROL, cache_control) + self._add_query(_QueryStringConstants.SIGNED_CONTENT_DISPOSITION, content_disposition) + self._add_query(_QueryStringConstants.SIGNED_CONTENT_ENCODING, content_encoding) + self._add_query(_QueryStringConstants.SIGNED_CONTENT_LANGUAGE, content_language) + self._add_query(_QueryStringConstants.SIGNED_CONTENT_TYPE, content_type) + + def add_resource_signature(self, account_name, account_key, service, path): + def get_value_to_append(query): + return_value = self.query_dict.get(query) or '' + return return_value + '\n' + + if path[0] != '/': + path = '/' + path + + canonicalized_resource = '/' + service + '/' + account_name + path + '\n' + + # Form the string to sign from shared_access_policy and canonicalized + # resource. The order of values is important. + string_to_sign = \ + (get_value_to_append(_QueryStringConstants.SIGNED_PERMISSION) + + get_value_to_append(_QueryStringConstants.SIGNED_START) + + get_value_to_append(_QueryStringConstants.SIGNED_EXPIRY) + + canonicalized_resource + + get_value_to_append(_QueryStringConstants.SIGNED_IDENTIFIER) + + get_value_to_append(_QueryStringConstants.SIGNED_IP) + + get_value_to_append(_QueryStringConstants.SIGNED_PROTOCOL) + + get_value_to_append(_QueryStringConstants.SIGNED_VERSION)) + + if service == 'blob' or service == 'file': + string_to_sign += \ + (get_value_to_append(_QueryStringConstants.SIGNED_CACHE_CONTROL) + + get_value_to_append(_QueryStringConstants.SIGNED_CONTENT_DISPOSITION) + + get_value_to_append(_QueryStringConstants.SIGNED_CONTENT_ENCODING) + + get_value_to_append(_QueryStringConstants.SIGNED_CONTENT_LANGUAGE) + + get_value_to_append(_QueryStringConstants.SIGNED_CONTENT_TYPE)) + + # remove the trailing newline + if string_to_sign[-1] == '\n': + string_to_sign = string_to_sign[:-1] + + self._add_query(_QueryStringConstants.SIGNED_SIGNATURE, + _sign_string(account_key, string_to_sign)) + + def add_account_signature(self, account_name, account_key): + def get_value_to_append(query): + return_value = self.query_dict.get(query) or '' + return return_value + '\n' + + string_to_sign = \ + (account_name + '\n' + + get_value_to_append(_QueryStringConstants.SIGNED_PERMISSION) + + get_value_to_append(_QueryStringConstants.SIGNED_SERVICES) + + get_value_to_append(_QueryStringConstants.SIGNED_RESOURCE_TYPES) + + get_value_to_append(_QueryStringConstants.SIGNED_START) + + get_value_to_append(_QueryStringConstants.SIGNED_EXPIRY) + + get_value_to_append(_QueryStringConstants.SIGNED_IP) + + get_value_to_append(_QueryStringConstants.SIGNED_PROTOCOL) + + get_value_to_append(_QueryStringConstants.SIGNED_VERSION)) + + self._add_query(_QueryStringConstants.SIGNED_SIGNATURE, + _sign_string(account_key, string_to_sign)) + + def get_token(self): + return '&'.join(['{0}={1}'.format(n, url_quote(v)) for n, v in self.query_dict.items() if v is not None]) diff --git a/src/storage-preview/azext_storage_preview/azure_storage/common/storageclient.py b/src/storage-preview/azext_storage_preview/azure_storage/common/storageclient.py new file mode 100644 index 00000000000..da007dc1911 --- /dev/null +++ b/src/storage-preview/azext_storage_preview/azure_storage/common/storageclient.py @@ -0,0 +1,364 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- + +import sys +from abc import ABCMeta +import logging + +logger = logging.getLogger(__name__) +from time import sleep + +import requests +from azure.common import ( + AzureException, +) + +from ._constants import ( + DEFAULT_SOCKET_TIMEOUT, + DEFAULT_X_MS_VERSION, + DEFAULT_USER_AGENT_STRING, + USER_AGENT_STRING_PREFIX, + USER_AGENT_STRING_SUFFIX, +) +from ._error import ( + _ERROR_DECRYPTION_FAILURE, + _http_error_handler, +) +from ._http import HTTPError +from ._http.httpclient import _HTTPClient +from ._serialization import ( + _update_request, + _add_date_header, +) +from .models import ( + RetryContext, + LocationMode, + _OperationContext, +) +from .retry import ExponentialRetry + + +class StorageClient(object): + ''' + This is the base class for service objects. Service objects are used to do + all requests to Storage. This class cannot be instantiated directly. + + :ivar str account_name: + The storage account name. This is used to authenticate requests + signed with an account key and to construct the storage endpoint. It + is required unless a connection string is given, or if a custom + domain is used with anonymous authentication. + :ivar str account_key: + The storage account key. This is used for shared key authentication. + If neither account key or sas token is specified, anonymous access + will be used. + :ivar str sas_token: + A shared access signature token to use to authenticate requests + instead of the account key. If account key and sas token are both + specified, account key will be used to sign. If neither are + specified, anonymous access will be used. + :ivar str primary_endpoint: + The endpoint to send storage requests to. + :ivar str secondary_endpoint: + The secondary endpoint to read storage data from. This will only be a + valid endpoint if the storage account used is RA-GRS and thus allows + reading from secondary. + :ivar function(context) retry: + A function which determines whether to retry. Takes as a parameter a + :class:`~azure.storage.common.models.RetryContext` object. Returns the number + of seconds to wait before retrying the request, or None to indicate not + to retry. + :ivar ~azure.storage.common.models.LocationMode location_mode: + The host location to use to make requests. Defaults to LocationMode.PRIMARY. + Note that this setting only applies to RA-GRS accounts as other account + types do not allow reading from secondary. If the location_mode is set to + LocationMode.SECONDARY, read requests will be sent to the secondary endpoint. + Write requests will continue to be sent to primary. + :ivar str protocol: + The protocol to use for requests. Defaults to https. + :ivar requests.Session request_session: + The session object to use for http requests. + :ivar function(request) request_callback: + A function called immediately before each request is sent. This function + takes as a parameter the request object and returns nothing. It may be + used to added custom headers or log request data. + :ivar function() response_callback: + A function called immediately after each response is received. This + function takes as a parameter the response object and returns nothing. + It may be used to log response data. + :ivar function() retry_callback: + A function called immediately after retry evaluation is performed. This + function takes as a parameter the retry context object and returns nothing. + It may be used to detect retries and log context information. + ''' + + __metaclass__ = ABCMeta + + def __init__(self, connection_params): + ''' + :param obj connection_params: The parameters to use to construct the client. + ''' + self.account_name = connection_params.account_name + self.account_key = connection_params.account_key + self.sas_token = connection_params.sas_token + self.token_credential = connection_params.token_credential + self.is_emulated = connection_params.is_emulated + + self.primary_endpoint = connection_params.primary_endpoint + self.secondary_endpoint = connection_params.secondary_endpoint + + protocol = connection_params.protocol + request_session = connection_params.request_session or requests.Session() + socket_timeout = connection_params.socket_timeout or DEFAULT_SOCKET_TIMEOUT + self._httpclient = _HTTPClient( + protocol=protocol, + session=request_session, + timeout=socket_timeout, + ) + + self.retry = ExponentialRetry().retry + self.location_mode = LocationMode.PRIMARY + + self.request_callback = None + self.response_callback = None + self.retry_callback = None + self._X_MS_VERSION = DEFAULT_X_MS_VERSION + self._USER_AGENT_STRING = DEFAULT_USER_AGENT_STRING + + def _update_user_agent_string(self, service_package_version): + self._USER_AGENT_STRING = '{}{} {}'.format(USER_AGENT_STRING_PREFIX, + service_package_version, + USER_AGENT_STRING_SUFFIX) + + @property + def socket_timeout(self): + return self._httpclient.timeout + + @socket_timeout.setter + def socket_timeout(self, value): + self._httpclient.timeout = value + + @property + def protocol(self): + return self._httpclient.protocol + + @protocol.setter + def protocol(self, value): + self._httpclient.protocol = value + + @property + def request_session(self): + return self._httpclient.session + + @request_session.setter + def request_session(self, value): + self._httpclient.session = value + + def set_proxy(self, host, port, user=None, password=None): + ''' + Sets the proxy server host and port for the HTTP CONNECT Tunnelling. + + :param str host: Address of the proxy. Ex: '192.168.0.100' + :param int port: Port of the proxy. Ex: 6000 + :param str user: User for proxy authorization. + :param str password: Password for proxy authorization. + ''' + self._httpclient.set_proxy(host, port, user, password) + + def _get_host_locations(self, primary=True, secondary=False): + locations = {} + if primary: + locations[LocationMode.PRIMARY] = self.primary_endpoint + if secondary: + locations[LocationMode.SECONDARY] = self.secondary_endpoint + return locations + + def _apply_host(self, request, operation_context, retry_context): + if operation_context.location_lock and operation_context.host_location: + # If this is a location locked operation and the location is set, + # override the request location and host_location. + request.host_locations = operation_context.host_location + request.host = list(operation_context.host_location.values())[0] + retry_context.location_mode = list(operation_context.host_location.keys())[0] + elif len(request.host_locations) == 1: + # If only one location is allowed, use that location. + request.host = list(request.host_locations.values())[0] + retry_context.location_mode = list(request.host_locations.keys())[0] + else: + # If multiple locations are possible, choose based on the location mode. + request.host = request.host_locations.get(self.location_mode) + retry_context.location_mode = self.location_mode + + @staticmethod + def extract_date_and_request_id(retry_context): + if getattr(retry_context, 'response', None) is None: + return "" + resp = retry_context.response + + if 'date' in resp.headers and 'x-ms-request-id' in resp.headers: + return str.format("Server-Timestamp={0}, Server-Request-ID={1}", + resp.headers['date'], resp.headers['x-ms-request-id']) + elif 'date' in resp.headers: + return str.format("Server-Timestamp={0}", resp.headers['date']) + elif 'x-ms-request-id' in resp.headers: + return str.format("Server-Request-ID={0}", resp.headers['x-ms-request-id']) + else: + return "" + + def _perform_request(self, request, parser=None, parser_args=None, operation_context=None): + ''' + Sends the request and return response. Catches HTTPError and hands it + to error handler + ''' + operation_context = operation_context or _OperationContext() + retry_context = RetryContext() + retry_context.is_emulated = self.is_emulated + + # Apply the appropriate host based on the location mode + self._apply_host(request, operation_context, retry_context) + + # Apply common settings to the request + _update_request(request, self._X_MS_VERSION, self._USER_AGENT_STRING) + client_request_id_prefix = str.format("Client-Request-ID={0}", request.headers['x-ms-client-request-id']) + + while True: + try: + try: + # Execute the request callback + if self.request_callback: + self.request_callback(request) + + # Add date and auth after the callback so date doesn't get too old and + # authentication is still correct if signed headers are added in the request + # callback. This also ensures retry policies with long back offs + # will work as it resets the time sensitive headers. + _add_date_header(request) + self.authentication.sign_request(request) + + # Set the request context + retry_context.request = request + + # Log the request before it goes out + logger.info("%s Outgoing request: Method=%s, Path=%s, Query=%s, Headers=%s.", + client_request_id_prefix, + request.method, + request.path, + request.query, + str(request.headers).replace('\n', '')) + + # Perform the request + response = self._httpclient.perform_request(request) + + # Execute the response callback + if self.response_callback: + self.response_callback(response) + + # Set the response context + retry_context.response = response + + # Log the response when it comes back + logger.info("%s Receiving Response: " + "%s, HTTP Status Code=%s, Message=%s, Headers=%s.", + client_request_id_prefix, + self.extract_date_and_request_id(retry_context), + response.status, + response.message, + str(request.headers).replace('\n', '')) + + # Parse and wrap HTTP errors in AzureHttpError which inherits from AzureException + if response.status >= 300: + # This exception will be caught by the general error handler + # and raised as an azure http exception + _http_error_handler( + HTTPError(response.status, response.message, response.headers, response.body)) + + # Parse the response + if parser: + if parser_args: + args = [response] + args.extend(parser_args) + return parser(*args) + else: + return parser(response) + else: + return + except AzureException as ex: + retry_context.exception = ex + raise ex + except Exception as ex: + retry_context.exception = ex + if sys.version_info >= (3,): + # Automatic chaining in Python 3 means we keep the trace + raise AzureException(ex.args[0]) + else: + # There isn't a good solution in 2 for keeping the stack trace + # in general, or that will not result in an error in 3 + # However, we can keep the previous error type and message + # TODO: In the future we will log the trace + msg = "" + if len(ex.args) > 0: + msg = ex.args[0] + raise AzureException('{}: {}'.format(ex.__class__.__name__, msg)) + + except AzureException as ex: + # only parse the strings used for logging if logging is at least enabled for CRITICAL + if logger.isEnabledFor(logging.CRITICAL): + exception_str_in_one_line = str(ex).replace('\n', '') + status_code = retry_context.response.status if retry_context.response is not None else 'Unknown' + timestamp_and_request_id = self.extract_date_and_request_id(retry_context) + + logger.info("%s Operation failed: checking if the operation should be retried. " + "Current retry count=%s, %s, HTTP status code=%s, Exception=%s.", + client_request_id_prefix, + retry_context.count if hasattr(retry_context, 'count') else 0, + timestamp_and_request_id, + status_code, + exception_str_in_one_line) + + # Decryption failures (invalid objects, invalid algorithms, data unencrypted in strict mode, etc) + # will not be resolved with retries. + if str(ex) == _ERROR_DECRYPTION_FAILURE: + logger.error("%s Encountered decryption failure: this cannot be retried. " + "%s, HTTP status code=%s, Exception=%s.", + client_request_id_prefix, + timestamp_and_request_id, + status_code, + exception_str_in_one_line) + raise ex + + # Determine whether a retry should be performed and if so, how + # long to wait before performing retry. + retry_interval = self.retry(retry_context) + if retry_interval is not None: + # Execute the callback + if self.retry_callback: + self.retry_callback(retry_context) + + logger.info( + "%s Retry policy is allowing a retry: Retry count=%s, Interval=%s.", + client_request_id_prefix, + retry_context.count, + retry_interval) + + # Sleep for the desired retry interval + sleep(retry_interval) + else: + logger.error("%s Retry policy did not allow for a retry: " + "%s, HTTP status code=%s, Exception=%s.", + client_request_id_prefix, + timestamp_and_request_id, + status_code, + exception_str_in_one_line) + raise ex + finally: + # If this is a location locked operation and the location is not set, + # this is the first request of that operation. Set the location to + # be used for subsequent requests in the operation. + if operation_context.location_lock and not operation_context.host_location: + # note: to cover the emulator scenario, the host_location is grabbed + # from request.host_locations(which includes the dev account name) + # instead of request.host(which at this point no longer includes the dev account name) + operation_context.host_location = {retry_context.location_mode: request.host_locations[retry_context.location_mode]} diff --git a/src/storage-preview/azext_storage_preview/azure_storage/common/tokencredential.py b/src/storage-preview/azext_storage_preview/azure_storage/common/tokencredential.py new file mode 100644 index 00000000000..725badcb33b --- /dev/null +++ b/src/storage-preview/azext_storage_preview/azure_storage/common/tokencredential.py @@ -0,0 +1,33 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- + + +class TokenCredential(object): + """ + Represents a token that is used to authorize HTTPS requests. + The token can be updated by the user. + + :ivar str token: + The authorization token. It can be set by the user at any point in a thread-safe way. + """ + + def __init__(self, initial_value): + """ + :param initial_value: initial value for the token. + """ + self.token = initial_value + + def update_token(self, new_value): + """ + :param new_value: new value to be set as the token. + """ + self.token = new_value + + def get_token(self): + """ + :return: current token value. + """ + return self.token diff --git a/src/storage-preview/azext_storage_preview/azure_storage/file/__init__.py b/src/storage-preview/azext_storage_preview/azure_storage/file/__init__.py new file mode 100644 index 00000000000..464a949d4e4 --- /dev/null +++ b/src/storage-preview/azext_storage_preview/azure_storage/file/__init__.py @@ -0,0 +1,20 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- +from .fileservice import FileService +from .models import ( + Share, + ShareProperties, + File, + FileProperties, + Directory, + DirectoryProperties, + FileRange, + ContentSettings, + CopyProperties, + SharePermissions, + FilePermissions, + DeleteSnapshot, +) diff --git a/src/storage-preview/azext_storage_preview/azure_storage/file/_constants.py b/src/storage-preview/azext_storage_preview/azure_storage/file/_constants.py new file mode 100644 index 00000000000..51dfcab8dcf --- /dev/null +++ b/src/storage-preview/azext_storage_preview/azure_storage/file/_constants.py @@ -0,0 +1,11 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- + +__author__ = 'Microsoft Corp. ' +__version__ = '1.1.0' + +# x-ms-version for storage service. +X_MS_VERSION = '2017-07-29' diff --git a/src/storage-preview/azext_storage_preview/azure_storage/file/_deserialization.py b/src/storage-preview/azext_storage_preview/azure_storage/file/_deserialization.py new file mode 100644 index 00000000000..cc75d38c3b4 --- /dev/null +++ b/src/storage-preview/azext_storage_preview/azure_storage/file/_deserialization.py @@ -0,0 +1,241 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- +from dateutil import parser + +try: + from xml.etree import cElementTree as ETree +except ImportError: + from xml.etree import ElementTree as ETree +from .models import ( + Share, + Directory, + File, + FileProperties, + FileRange, + ShareProperties, + DirectoryProperties, +) +from azure.storage.common.models import ( + _list, +) +from azure.storage.common._deserialization import ( + _parse_properties, + _parse_metadata, +) +from azure.storage.common._error import _validate_content_match +from azure.storage.common._common_conversion import ( + _get_content_md5, + _to_str, +) + +def _parse_snapshot_share(response, name): + ''' + Extracts snapshot return header. + ''' + snapshot = response.headers.get('x-ms-snapshot') + + return _parse_share(response, name, snapshot) + +def _parse_share(response, name, snapshot=None): + if response is None: + return None + + metadata = _parse_metadata(response) + props = _parse_properties(response, ShareProperties) + return Share(name, props, metadata, snapshot) + + +def _parse_directory(response, name): + if response is None: + return None + + metadata = _parse_metadata(response) + props = _parse_properties(response, DirectoryProperties) + return Directory(name, props, metadata) + + +def _parse_file(response, name, validate_content=False): + if response is None: + return None + + metadata = _parse_metadata(response) + props = _parse_properties(response, FileProperties) + + # For range gets, only look at 'x-ms-content-md5' for overall MD5 + content_settings = getattr(props, 'content_settings') + if 'content-range' in response.headers: + if 'x-ms-content-md5' in response.headers: + setattr(content_settings, 'content_md5', _to_str(response.headers['x-ms-content-md5'])) + else: + delattr(content_settings, 'content_md5') + + if validate_content: + computed_md5 = _get_content_md5(response.body) + _validate_content_match(response.headers['content-md5'], computed_md5) + + return File(name, response.body, props, metadata) + + +def _convert_xml_to_shares(response): + ''' + + + string-value + string-value + int-value + + + share-name + date-time-value + + date/time-value + etag + max-share-size + + + value + + + + marker-value + + ''' + if response is None or response.body is None: + return None + + shares = _list() + list_element = ETree.fromstring(response.body) + + # Set next marker + next_marker = list_element.findtext('NextMarker') or None + setattr(shares, 'next_marker', next_marker) + + shares_element = list_element.find('Shares') + + for share_element in shares_element.findall('Share'): + # Name element + share = Share() + share.name = share_element.findtext('Name') + + # Snapshot + share.snapshot = share_element.findtext('Snapshot') + + # Metadata + metadata_root_element = share_element.find('Metadata') + if metadata_root_element is not None: + share.metadata = dict() + for metadata_element in metadata_root_element: + share.metadata[metadata_element.tag] = metadata_element.text + + # Properties + properties_element = share_element.find('Properties') + share.properties.last_modified = parser.parse(properties_element.findtext('Last-Modified')) + share.properties.etag = properties_element.findtext('Etag') + share.properties.quota = int(properties_element.findtext('Quota')) + + # Add share to list + shares.append(share) + + return shares + + +def _convert_xml_to_directories_and_files(response): + ''' + + + string-value + int-value + + + file-name + + size-in-bytes + + + + directory-name + + + + + ''' + if response is None or response.body is None: + return None + + entries = _list() + list_element = ETree.fromstring(response.body) + + # Set next marker + next_marker = list_element.findtext('NextMarker') or None + setattr(entries, 'next_marker', next_marker) + + entries_element = list_element.find('Entries') + + for file_element in entries_element.findall('File'): + # Name element + file = File() + file.name = file_element.findtext('Name') + + # Properties + properties_element = file_element.find('Properties') + file.properties.content_length = int(properties_element.findtext('Content-Length')) + + # Add file to list + entries.append(file) + + for directory_element in entries_element.findall('Directory'): + # Name element + directory = Directory() + directory.name = directory_element.findtext('Name') + + # Add directory to list + entries.append(directory) + + return entries + + +def _convert_xml_to_ranges(response): + ''' + + + + Start Byte + End Byte + + + Start Byte + End Byte + + + ''' + if response is None or response.body is None: + return None + + ranges = list() + ranges_element = ETree.fromstring(response.body) + + for range_element in ranges_element.findall('Range'): + # Parse range + range = FileRange(int(range_element.findtext('Start')), int(range_element.findtext('End'))) + + # Add range to list + ranges.append(range) + + return ranges + + +def _convert_xml_to_share_stats(response): + ''' + + + 15 + + ''' + if response is None or response.body is None: + return None + + share_stats_element = ETree.fromstring(response.body) + return int(share_stats_element.findtext('ShareUsage')) diff --git a/src/storage-preview/azext_storage_preview/azure_storage/file/_download_chunking.py b/src/storage-preview/azext_storage_preview/azure_storage/file/_download_chunking.py new file mode 100644 index 00000000000..f9d859e2414 --- /dev/null +++ b/src/storage-preview/azext_storage_preview/azure_storage/file/_download_chunking.py @@ -0,0 +1,107 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- +import threading + +from azure.storage.common._error import _ERROR_NO_SINGLE_THREAD_CHUNKING + + +def _download_file_chunks(file_service, share_name, directory_name, file_name, + download_size, block_size, progress, start_range, end_range, + stream, max_connections, progress_callback, validate_content, + timeout, operation_context, snapshot): + if max_connections <= 1: + raise ValueError(_ERROR_NO_SINGLE_THREAD_CHUNKING.format('file')) + + downloader = _FileChunkDownloader( + file_service, + share_name, + directory_name, + file_name, + download_size, + block_size, + progress, + start_range, + end_range, + stream, + progress_callback, + validate_content, + timeout, + operation_context, + snapshot, + ) + + import concurrent.futures + executor = concurrent.futures.ThreadPoolExecutor(max_connections) + result = list(executor.map(downloader.process_chunk, downloader.get_chunk_offsets())) + + +class _FileChunkDownloader(object): + def __init__(self, file_service, share_name, directory_name, file_name, + download_size, chunk_size, progress, start_range, end_range, + stream, progress_callback, validate_content, timeout, operation_context, snapshot): + self.file_service = file_service + self.share_name = share_name + self.directory_name = directory_name + self.file_name = file_name + self.chunk_size = chunk_size + + self.download_size = download_size + self.start_index = start_range + self.file_end = end_range + + self.stream = stream + self.stream_start = stream.tell() + self.stream_lock = threading.Lock() + self.progress_callback = progress_callback + self.progress_total = progress + self.progress_lock = threading.Lock() + self.validate_content = validate_content + self.timeout = timeout + self.operation_context = operation_context + self.snapshot = snapshot + + def get_chunk_offsets(self): + index = self.start_index + while index < self.file_end: + yield index + index += self.chunk_size + + def process_chunk(self, chunk_start): + if chunk_start + self.chunk_size > self.file_end: + chunk_end = self.file_end + else: + chunk_end = chunk_start + self.chunk_size + + chunk_data = self._download_chunk(chunk_start, chunk_end).content + length = chunk_end - chunk_start + if length > 0: + self._write_to_stream(chunk_data, chunk_start) + self._update_progress(length) + + def _update_progress(self, length): + if self.progress_callback is not None: + with self.progress_lock: + self.progress_total += length + total = self.progress_total + self.progress_callback(total, self.download_size) + + def _write_to_stream(self, chunk_data, chunk_start): + with self.stream_lock: + self.stream.seek(self.stream_start + (chunk_start - self.start_index)) + self.stream.write(chunk_data) + + def _download_chunk(self, chunk_start, chunk_end): + return self.file_service._get_file( + self.share_name, + self.directory_name, + self.file_name, + start_range=chunk_start, + end_range=chunk_end - 1, + validate_content=self.validate_content, + timeout=self.timeout, + _context=self.operation_context, + snapshot=self.snapshot + ) diff --git a/src/storage-preview/azext_storage_preview/azure_storage/file/_serialization.py b/src/storage-preview/azext_storage_preview/azure_storage/file/_serialization.py new file mode 100644 index 00000000000..50b7979cbcd --- /dev/null +++ b/src/storage-preview/azext_storage_preview/azure_storage/file/_serialization.py @@ -0,0 +1,66 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- +from azure.storage.common._common_conversion import _str +from azure.storage.common._error import ( + _validate_not_none, + _ERROR_START_END_NEEDED_FOR_MD5, + _ERROR_RANGE_TOO_LARGE_FOR_MD5, +) + + +def _get_path(share_name=None, directory_name=None, file_name=None): + ''' + Creates the path to access a file resource. + + share_name: + Name of share. + directory_name: + The path to the directory. + file_name: + Name of file. + ''' + if share_name and directory_name and file_name: + return '/{0}/{1}/{2}'.format( + _str(share_name), + _str(directory_name), + _str(file_name)) + elif share_name and directory_name: + return '/{0}/{1}'.format( + _str(share_name), + _str(directory_name)) + elif share_name and file_name: + return '/{0}/{1}'.format( + _str(share_name), + _str(file_name)) + elif share_name: + return '/{0}'.format(_str(share_name)) + else: + return '/' + + +def _validate_and_format_range_headers(request, start_range, end_range, start_range_required=True, + end_range_required=True, check_content_md5=False): + # If end range is provided, start range must be provided + if start_range_required or end_range is not None: + _validate_not_none('start_range', start_range) + if end_range_required: + _validate_not_none('end_range', end_range) + + # Format based on whether end_range is present + request.headers = request.headers or {} + if end_range is not None: + request.headers['x-ms-range'] = 'bytes={0}-{1}'.format(start_range, end_range) + elif start_range is not None: + request.headers['x-ms-range'] = 'bytes={0}-'.format(start_range) + + # Content MD5 can only be provided for a complete range less than 4MB in size + if check_content_md5: + if start_range is None or end_range is None: + raise ValueError(_ERROR_START_END_NEEDED_FOR_MD5) + if end_range - start_range > 4 * 1024 * 1024: + raise ValueError(_ERROR_RANGE_TOO_LARGE_FOR_MD5) + + request.headers['x-ms-range-get-content-md5'] = 'true' diff --git a/src/storage-preview/azext_storage_preview/azure_storage/file/_upload_chunking.py b/src/storage-preview/azext_storage_preview/azure_storage/file/_upload_chunking.py new file mode 100644 index 00000000000..c6fb34f77bf --- /dev/null +++ b/src/storage-preview/azext_storage_preview/azure_storage/file/_upload_chunking.py @@ -0,0 +1,133 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- +import threading + + +def _upload_file_chunks(file_service, share_name, directory_name, file_name, + file_size, block_size, stream, max_connections, + progress_callback, validate_content, timeout): + uploader = _FileChunkUploader( + file_service, + share_name, + directory_name, + file_name, + file_size, + block_size, + stream, + max_connections > 1, + progress_callback, + validate_content, + timeout + ) + + if progress_callback is not None: + progress_callback(0, file_size) + + if max_connections > 1: + import concurrent.futures + executor = concurrent.futures.ThreadPoolExecutor(max_connections) + range_ids = list(executor.map(uploader.process_chunk, uploader.get_chunk_offsets())) + else: + if file_size is not None: + range_ids = [uploader.process_chunk(start) for start in uploader.get_chunk_offsets()] + else: + range_ids = uploader.process_all_unknown_size() + + return range_ids + + +class _FileChunkUploader(object): + def __init__(self, file_service, share_name, directory_name, file_name, + file_size, chunk_size, stream, parallel, progress_callback, + validate_content, timeout): + self.file_service = file_service + self.share_name = share_name + self.directory_name = directory_name + self.file_name = file_name + self.file_size = file_size + self.chunk_size = chunk_size + self.stream = stream + self.stream_start = stream.tell() if parallel else None + self.stream_lock = threading.Lock() if parallel else None + self.progress_callback = progress_callback + self.progress_total = 0 + self.progress_lock = threading.Lock() if parallel else None + self.validate_content = validate_content + self.timeout = timeout + + def get_chunk_offsets(self): + index = 0 + if self.file_size is None: + # we don't know the size of the stream, so we have no + # choice but to seek + while True: + data = self._read_from_stream(index, 1) + if not data: + break + yield index + index += self.chunk_size + else: + while index < self.file_size: + yield index + index += self.chunk_size + + def process_chunk(self, chunk_offset): + size = self.chunk_size + if self.file_size is not None: + size = min(size, self.file_size - chunk_offset) + chunk_data = self._read_from_stream(chunk_offset, size) + return self._upload_chunk_with_progress(chunk_offset, chunk_data) + + def process_all_unknown_size(self): + assert self.stream_lock is None + range_ids = [] + index = 0 + while True: + data = self._read_from_stream(None, self.chunk_size) + if data: + index += len(data) + range_id = self._upload_chunk_with_progress(index, data) + range_ids.append(range_id) + else: + break + + return range_ids + + def _read_from_stream(self, offset, count): + if self.stream_lock is not None: + with self.stream_lock: + self.stream.seek(self.stream_start + offset) + data = self.stream.read(count) + else: + data = self.stream.read(count) + return data + + def _update_progress(self, length): + if self.progress_callback is not None: + if self.progress_lock is not None: + with self.progress_lock: + self.progress_total += length + total = self.progress_total + else: + self.progress_total += length + total = self.progress_total + self.progress_callback(total, self.file_size) + + def _upload_chunk_with_progress(self, chunk_start, chunk_data): + chunk_end = chunk_start + len(chunk_data) - 1 + self.file_service.update_range( + self.share_name, + self.directory_name, + self.file_name, + chunk_data, + chunk_start, + chunk_end, + self.validate_content, + timeout=self.timeout + ) + range_id = 'bytes={0}-{1}'.format(chunk_start, chunk_end) + self._update_progress(len(chunk_data)) + return range_id diff --git a/src/storage-preview/azext_storage_preview/azure_storage/file/fileservice.py b/src/storage-preview/azext_storage_preview/azure_storage/file/fileservice.py new file mode 100644 index 00000000000..2f8cc0a584e --- /dev/null +++ b/src/storage-preview/azext_storage_preview/azure_storage/file/fileservice.py @@ -0,0 +1,2468 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- +import sys +from os import path + +from azure.common import AzureHttpError + +from azure.storage.common._auth import ( + _StorageSharedKeyAuthentication, + _StorageSASAuthentication, +) +from azure.storage.common._common_conversion import ( + _int_to_str, + _to_str, + _get_content_md5, +) +from azure.storage.common._connection import _ServiceParameters +from azure.storage.common._constants import ( + SERVICE_HOST_BASE, + DEFAULT_PROTOCOL, + DEV_ACCOUNT_NAME, +) +from azure.storage.common._deserialization import ( + _convert_xml_to_service_properties, + _convert_xml_to_signed_identifiers, + _parse_metadata, + _parse_properties, + _parse_length_from_content_range, +) +from azure.storage.common._error import ( + _dont_fail_not_exist, + _dont_fail_on_exist, + _validate_not_none, + _validate_type_bytes, + _ERROR_VALUE_NEGATIVE, + _ERROR_STORAGE_MISSING_INFO, + _ERROR_EMULATOR_DOES_NOT_SUPPORT_FILES, + _ERROR_PARALLEL_NOT_SEEKABLE, + _validate_access_policies, +) +from azure.storage.common._http import HTTPRequest +from azure.storage.common._serialization import ( + _get_request_body, + _get_data_bytes_only, + _convert_signed_identifiers_to_xml, + _convert_service_properties_to_xml, + _add_metadata_headers, +) +from azure.storage.common.models import ( + Services, + ListGenerator, + _OperationContext, +) +from .sharedaccesssignature import ( + FileSharedAccessSignature, +) +from azure.storage.common.storageclient import StorageClient +from ._deserialization import ( + _convert_xml_to_shares, + _convert_xml_to_directories_and_files, + _convert_xml_to_ranges, + _convert_xml_to_share_stats, + _parse_file, + _parse_share, + _parse_snapshot_share, + _parse_directory, +) +from ._download_chunking import _download_file_chunks +from ._serialization import ( + _get_path, + _validate_and_format_range_headers, +) +from ._upload_chunking import _upload_file_chunks +from .models import ( + FileProperties, +) + +from ._constants import ( + X_MS_VERSION, + __version__ as package_version, +) + +if sys.version_info >= (3,): + from io import BytesIO +else: + from cStringIO import StringIO as BytesIO + + +class FileService(StorageClient): + ''' + The Server Message Block (SMB) protocol is the preferred file share protocol + used on premise today. The Microsoft Azure File service enables customers to + leverage the availability and scalability of Azure's Cloud Infrastructure as + a Service (IaaS) SMB without having to rewrite SMB client applications. + + The Azure File service also offers a compelling alternative to traditional + Direct Attached Storage (DAS) and Storage Area Network (SAN) solutions, which + are often complex and expensive to install, configure, and operate. + + :ivar int MAX_SINGLE_GET_SIZE: + The size of the first range get performed by get_file_to_* methods if + max_connections is greater than 1. Less data will be returned if the + file is smaller than this. + :ivar int MAX_CHUNK_GET_SIZE: + The size of subsequent range gets performed by get_file_to_* methods if + max_connections is greater than 1 and the file is larger than MAX_SINGLE_GET_SIZE. + Less data will be returned if the remainder of the file is smaller than + this. If this is set to larger than 4MB, content_validation will throw an + error if enabled. However, if content_validation is not desired a size + greater than 4MB may be optimal. Setting this below 4MB is not recommended. + :ivar int MAX_RANGE_SIZE: + The size of the ranges put by create_file_from_* methods. Smaller ranges + may be put if there is less data provided. The maximum range size the service + supports is 4MB. + ''' + MAX_SINGLE_GET_SIZE = 32 * 1024 * 1024 + MAX_CHUNK_GET_SIZE = 8 * 1024 * 1024 + MAX_RANGE_SIZE = 4 * 1024 * 1024 + + def __init__(self, account_name=None, account_key=None, sas_token=None, + protocol=DEFAULT_PROTOCOL, endpoint_suffix=SERVICE_HOST_BASE, + request_session=None, connection_string=None, socket_timeout=None): + ''' + :param str account_name: + The storage account name. This is used to authenticate requests + signed with an account key and to construct the storage endpoint. It + is required unless a connection string is given. + :param str account_key: + The storage account key. This is used for shared key authentication. + :param str sas_token: + A shared access signature token to use to authenticate requests + instead of the account key. If account key and sas token are both + specified, account key will be used to sign. + :param str protocol: + The protocol to use for requests. Defaults to https. + :param str endpoint_suffix: + The host base component of the url, minus the account name. Defaults + to Azure (core.windows.net). Override this to use the China cloud + (core.chinacloudapi.cn). + :param requests.Session request_session: + The session object to use for http requests. + :param str connection_string: + If specified, this will override all other parameters besides + request session. See + http://azure.microsoft.com/en-us/documentation/articles/storage-configure-connection-string/ + for the connection string format. + :param int socket_timeout: + If specified, this will override the default socket timeout. The timeout specified is in seconds. + See DEFAULT_SOCKET_TIMEOUT in _constants.py for the default value. + ''' + service_params = _ServiceParameters.get_service_parameters( + 'file', + account_name=account_name, + account_key=account_key, + sas_token=sas_token, + protocol=protocol, + endpoint_suffix=endpoint_suffix, + request_session=request_session, + connection_string=connection_string, + socket_timeout=socket_timeout) + + super(FileService, self).__init__(service_params) + + if self.account_name == DEV_ACCOUNT_NAME: + raise ValueError(_ERROR_EMULATOR_DOES_NOT_SUPPORT_FILES) + + if self.account_key: + self.authentication = _StorageSharedKeyAuthentication( + self.account_name, + self.account_key, + ) + elif self.sas_token: + self.authentication = _StorageSASAuthentication(self.sas_token) + else: + raise ValueError(_ERROR_STORAGE_MISSING_INFO) + self._X_MS_VERSION = X_MS_VERSION + self._update_user_agent_string(package_version) + + def make_file_url(self, share_name, directory_name, file_name, + protocol=None, sas_token=None): + ''' + Creates the url to access a file. + + :param str share_name: + Name of share. + :param str directory_name: + The path to the directory. + :param str file_name: + Name of file. + :param str protocol: + Protocol to use: 'http' or 'https'. If not specified, uses the + protocol specified when FileService was initialized. + :param str sas_token: + Shared access signature token created with + generate_shared_access_signature. + :return: file access URL. + :rtype: str + ''' + + if directory_name is None: + url = '{}://{}/{}/{}'.format( + protocol or self.protocol, + self.primary_endpoint, + share_name, + file_name, + ) + else: + url = '{}://{}/{}/{}/{}'.format( + protocol or self.protocol, + self.primary_endpoint, + share_name, + directory_name, + file_name, + ) + + if sas_token: + url += '?' + sas_token + + return url + + def generate_account_shared_access_signature(self, resource_types, permission, + expiry, start=None, ip=None, protocol=None): + ''' + Generates a shared access signature for the file service. + Use the returned signature with the sas_token parameter of the FileService. + + :param ResourceTypes resource_types: + Specifies the resource types that are accessible with the account SAS. + :param AccountPermissions permission: + The permissions associated with the shared access signature. The + user is restricted to operations allowed by the permissions. + Required unless an id is given referencing a stored access policy + which contains this field. This field must be omitted if it has been + specified in an associated stored access policy. + :param expiry: + The time at which the shared access signature becomes invalid. + Required unless an id is given referencing a stored access policy + which contains this field. This field must be omitted if it has + been specified in an associated stored access policy. Azure will always + convert values to UTC. If a date is passed in without timezone info, it + is assumed to be UTC. + :type expiry: datetime or str + :param start: + The time at which the shared access signature becomes valid. If + omitted, start time for this call is assumed to be the time when the + storage service receives the request. Azure will always convert values + to UTC. If a date is passed in without timezone info, it is assumed to + be UTC. + :type start: datetime or str + :param str ip: + Specifies an IP address or a range of IP addresses from which to accept requests. + If the IP address from which the request originates does not match the IP address + or address range specified on the SAS token, the request is not authenticated. + For example, specifying sip=168.1.5.65 or sip=168.1.5.60-168.1.5.70 on the SAS + restricts the request to those IP addresses. + :param str protocol: + Specifies the protocol permitted for a request made. Possible values are + both HTTPS and HTTP (https,http) or HTTPS only (https). The default value + is https,http. Note that HTTP only is not a permitted value. + :return: A Shared Access Signature (sas) token. + :rtype: str + ''' + _validate_not_none('self.account_name', self.account_name) + _validate_not_none('self.account_key', self.account_key) + + sas = FileSharedAccessSignature(self.account_name, self.account_key) + return sas.generate_account(Services.FILE, resource_types, permission, + expiry, start=start, ip=ip, protocol=protocol) + + def generate_share_shared_access_signature(self, share_name, + permission=None, + expiry=None, + start=None, + id=None, + ip=None, + protocol=None, + cache_control=None, + content_disposition=None, + content_encoding=None, + content_language=None, + content_type=None): + ''' + Generates a shared access signature for the share. + Use the returned signature with the sas_token parameter of FileService. + + :param str share_name: + Name of share. + :param SharePermissions permission: + The permissions associated with the shared access signature. The + user is restricted to operations allowed by the permissions. + Permissions must be ordered read, create, write, delete, list. + Required unless an id is given referencing a stored access policy + which contains this field. This field must be omitted if it has been + specified in an associated stored access policy. + :param expiry: + The time at which the shared access signature becomes invalid. + Required unless an id is given referencing a stored access policy + which contains this field. This field must be omitted if it has + been specified in an associated stored access policy. Azure will always + convert values to UTC. If a date is passed in without timezone info, it + is assumed to be UTC. + :type expiry: datetime or str + :param start: + The time at which the shared access signature becomes valid. If + omitted, start time for this call is assumed to be the time when the + storage service receives the request. Azure will always convert values + to UTC. If a date is passed in without timezone info, it is assumed to + be UTC. + :type start: datetime or str + :param str id: + A unique value up to 64 characters in length that correlates to a + stored access policy. To create a stored access policy, use :func:`~set_share_acl`. + :param str ip: + Specifies an IP address or a range of IP addresses from which to accept requests. + If the IP address from which the request originates does not match the IP address + or address range specified on the SAS token, the request is not authenticated. + For example, specifying sip=168.1.5.65 or sip=168.1.5.60-168.1.5.70 on the SAS + restricts the request to those IP addresses. + :param str protocol: + Specifies the protocol permitted for a request made. Possible values are + both HTTPS and HTTP (https,http) or HTTPS only (https). The default value + is https,http. Note that HTTP only is not a permitted value. + :param str cache_control: + Response header value for Cache-Control when resource is accessed + using this shared access signature. + :param str content_disposition: + Response header value for Content-Disposition when resource is accessed + using this shared access signature. + :param str content_encoding: + Response header value for Content-Encoding when resource is accessed + using this shared access signature. + :param str content_language: + Response header value for Content-Language when resource is accessed + using this shared access signature. + :param str content_type: + Response header value for Content-Type when resource is accessed + using this shared access signature. + :return: A Shared Access Signature (sas) token. + :rtype: str + ''' + _validate_not_none('share_name', share_name) + _validate_not_none('self.account_name', self.account_name) + _validate_not_none('self.account_key', self.account_key) + + sas = FileSharedAccessSignature(self.account_name, self.account_key) + return sas.generate_share( + share_name, + permission, + expiry, + start=start, + id=id, + ip=ip, + protocol=protocol, + cache_control=cache_control, + content_disposition=content_disposition, + content_encoding=content_encoding, + content_language=content_language, + content_type=content_type, + ) + + def generate_file_shared_access_signature(self, share_name, + directory_name=None, + file_name=None, + permission=None, + expiry=None, + start=None, + id=None, + ip=None, + protocol=None, + cache_control=None, + content_disposition=None, + content_encoding=None, + content_language=None, + content_type=None): + ''' + Generates a shared access signature for the file. + Use the returned signature with the sas_token parameter of FileService. + + :param str share_name: + Name of share. + :param str directory_name: + Name of directory. SAS tokens cannot be created for directories, so + this parameter should only be present if file_name is provided. + :param str file_name: + Name of file. + :param FilePermissions permission: + The permissions associated with the shared access signature. The + user is restricted to operations allowed by the permissions. + Permissions must be ordered read, create, write, delete, list. + Required unless an id is given referencing a stored access policy + which contains this field. This field must be omitted if it has been + specified in an associated stored access policy. + :param expiry: + The time at which the shared access signature becomes invalid. + Required unless an id is given referencing a stored access policy + which contains this field. This field must be omitted if it has + been specified in an associated stored access policy. Azure will always + convert values to UTC. If a date is passed in without timezone info, it + is assumed to be UTC. + :type expiry: datetime or str + :param start: + The time at which the shared access signature becomes valid. If + omitted, start time for this call is assumed to be the time when the + storage service receives the request. Azure will always convert values + to UTC. If a date is passed in without timezone info, it is assumed to + be UTC. + :type start: datetime or str + :param str id: + A unique value up to 64 characters in length that correlates to a + stored access policy. To create a stored access policy, use + set_file_service_properties. + :param str ip: + Specifies an IP address or a range of IP addresses from which to accept requests. + If the IP address from which the request originates does not match the IP address + or address range specified on the SAS token, the request is not authenticated. + For example, specifying sip=168.1.5.65 or sip=168.1.5.60-168.1.5.70 on the SAS + restricts the request to those IP addresses. + :param str protocol: + Specifies the protocol permitted for a request made. Possible values are + both HTTPS and HTTP (https,http) or HTTPS only (https). The default value + is https,http. Note that HTTP only is not a permitted value. + :param str cache_control: + Response header value for Cache-Control when resource is accessed + using this shared access signature. + :param str content_disposition: + Response header value for Content-Disposition when resource is accessed + using this shared access signature. + :param str content_encoding: + Response header value for Content-Encoding when resource is accessed + using this shared access signature. + :param str content_language: + Response header value for Content-Language when resource is accessed + using this shared access signature. + :param str content_type: + Response header value for Content-Type when resource is accessed + using this shared access signature. + :return: A Shared Access Signature (sas) token. + :rtype: str + ''' + _validate_not_none('share_name', share_name) + _validate_not_none('file_name', file_name) + _validate_not_none('self.account_name', self.account_name) + _validate_not_none('self.account_key', self.account_key) + + sas = FileSharedAccessSignature(self.account_name, self.account_key) + return sas.generate_file( + share_name, + directory_name, + file_name, + permission, + expiry, + start=start, + id=id, + ip=ip, + protocol=protocol, + cache_control=cache_control, + content_disposition=content_disposition, + content_encoding=content_encoding, + content_language=content_language, + content_type=content_type, + ) + + def set_file_service_properties(self, hour_metrics=None, minute_metrics=None, + cors=None, timeout=None): + ''' + Sets the properties of a storage account's File service, including + Azure Storage Analytics. If an element (ex HourMetrics) is left as None, the + existing settings on the service for that functionality are preserved. + + :param Metrics hour_metrics: + The hour metrics settings provide a summary of request + statistics grouped by API in hourly aggregates for files. + :param Metrics minute_metrics: + The minute metrics settings provide request statistics + for each minute for files. + :param cors: + You can include up to five CorsRule elements in the + list. If an empty list is specified, all CORS rules will be deleted, + and CORS will be disabled for the service. + :type cors: list(:class:`~azure.storage.common.models.CorsRule`) + :param int timeout: + The timeout parameter is expressed in seconds. + ''' + request = HTTPRequest() + request.method = 'PUT' + request.host_locations = self._get_host_locations() + request.path = _get_path() + request.query = { + 'restype': 'service', + 'comp': 'properties', + 'timeout': _int_to_str(timeout), + } + request.body = _get_request_body( + _convert_service_properties_to_xml(None, hour_metrics, minute_metrics, cors)) + + self._perform_request(request) + + def get_file_service_properties(self, timeout=None): + ''' + Gets the properties of a storage account's File service, including + Azure Storage Analytics. + + :param int timeout: + The timeout parameter is expressed in seconds. + :return: The file service properties. + :rtype: + :class:`~azure.storage.common.models.ServiceProperties` + ''' + request = HTTPRequest() + request.method = 'GET' + request.host_locations = self._get_host_locations() + request.path = _get_path() + request.query = { + 'restype': 'service', + 'comp': 'properties', + 'timeout': _int_to_str(timeout), + } + + return self._perform_request(request, _convert_xml_to_service_properties) + + def list_shares(self, prefix=None, marker=None, num_results=None, + include_metadata=False, timeout=None, include_snapshots=False): + ''' + Returns a generator to list the shares under the specified account. + The generator will lazily follow the continuation tokens returned by + the service and stop when all shares have been returned or num_results + is reached. + + If num_results is specified and the account has more than that number of + shares, the generator will have a populated next_marker field once it + finishes. This marker can be used to create a new generator if more + results are desired. + + :param str prefix: + Filters the results to return only shares whose names + begin with the specified prefix. + :param int num_results: + Specifies the maximum number of shares to return. + :param bool include_metadata: + Specifies that share metadata be returned in the response. + :param str marker: + An opaque continuation token. This value can be retrieved from the + next_marker field of a previous generator object if num_results was + specified and that generator has finished enumerating results. If + specified, this generator will begin returning results from the point + where the previous generator stopped. + :param int timeout: + The timeout parameter is expressed in seconds. + :param bool include_snapshots: + Specifies that share snapshots be returned in the response. + ''' + include = 'snapshots' if include_snapshots else None + if include_metadata: + if include is not None: + include = include + ',metadata' + else: + include = 'metadata' + operation_context = _OperationContext(location_lock=True) + kwargs = {'prefix': prefix, 'marker': marker, 'max_results': num_results, + 'include': include, 'timeout': timeout, '_context': operation_context} + resp = self._list_shares(**kwargs) + + return ListGenerator(resp, self._list_shares, (), kwargs) + + def _list_shares(self, prefix=None, marker=None, max_results=None, + include=None, timeout=None, _context=None): + ''' + Returns a list of the shares under the specified account. + + :param str prefix: + Filters the results to return only shares whose names + begin with the specified prefix. + :param str marker: + A string value that identifies the portion of the list + to be returned with the next list operation. The operation returns + a next_marker value within the response body if the list returned was + not complete. The marker value may then be used in a subsequent + call to request the next set of list items. The marker value is + opaque to the client. + :param int max_results: + Specifies the maximum number of shares to return. A single list + request may return up to 1000 shares and potentially a continuation + token which should be followed to get additional resutls. + :param string include: + Include this parameter to specify that either the share's + metadata, snapshots or both be returned as part of the response body. set this + parameter to string 'metadata' to get share's metadata. set this parameter to 'snapshots' + to get all the share snapshots. for both use 'snapshots,metadata'. + :param int timeout: + The timeout parameter is expressed in seconds. + ''' + request = HTTPRequest() + request.method = 'GET' + request.host_locations = self._get_host_locations() + request.path = _get_path() + request.query = { + 'comp': 'list', + 'prefix': _to_str(prefix), + 'marker': _to_str(marker), + 'maxresults': _int_to_str(max_results), + 'include': _to_str(include), + 'timeout': _int_to_str(timeout), + } + + return self._perform_request(request, _convert_xml_to_shares, operation_context=_context) + + def create_share(self, share_name, metadata=None, quota=None, + fail_on_exist=False, timeout=None): + ''' + Creates a new share under the specified account. If the share + with the same name already exists, the operation fails on the + service. By default, the exception is swallowed by the client. + To expose the exception, specify True for fail_on_exists. + + :param str share_name: + Name of share to create. + :param metadata: + A dict with name_value pairs to associate with the + share as metadata. Example:{'Category':'test'} + :type metadata: dict(str, str) + :param int quota: + Specifies the maximum size of the share, in gigabytes. Must be + greater than 0, and less than or equal to 5TB (5120). + :param bool fail_on_exist: + Specify whether to throw an exception when the share exists. + False by default. + :param int timeout: + The timeout parameter is expressed in seconds. + :return: True if share is created, False if share already exists. + :rtype: bool + ''' + _validate_not_none('share_name', share_name) + request = HTTPRequest() + request.method = 'PUT' + request.host_locations = self._get_host_locations() + request.path = _get_path(share_name) + request.query = { + 'restype': 'share', + 'timeout': _int_to_str(timeout), + } + request.headers = { + 'x-ms-share-quota': _int_to_str(quota) + } + _add_metadata_headers(metadata, request) + + if not fail_on_exist: + try: + self._perform_request(request) + return True + except AzureHttpError as ex: + _dont_fail_on_exist(ex) + return False + else: + self._perform_request(request) + return True + + def snapshot_share(self, share_name, metadata=None, quota=None, timeout=None): + ''' + Creates a snapshot of an existing share under the specified account. + + :param str share_name: + The name of the share to create a snapshot of. + :param metadata: + A dict with name_value pairs to associate with the + share as metadata. Example:{'Category':'test'} + :type metadata: a dict of str to str: + :param int quota: + Specifies the maximum size of the share, in gigabytes. Must be + greater than 0, and less than or equal to 5TB (5120). + :param int timeout: + The timeout parameter is expressed in seconds. + :return: snapshot properties + :rtype: azure.storage.file.models.Share + ''' + _validate_not_none('share_name', share_name) + request = HTTPRequest() + request.method = 'PUT' + request.host_locations = self._get_host_locations() + request.path = _get_path(share_name) + request.query = { + 'restype': 'share', + 'comp': 'snapshot', + 'timeout': _int_to_str(timeout), + } + request.headers = { + 'x-ms-share-quota': _int_to_str(quota) + } + _add_metadata_headers(metadata, request) + + return self._perform_request(request, _parse_snapshot_share, [share_name]) + + def get_share_properties(self, share_name, timeout=None, snapshot=None): + ''' + Returns all user-defined metadata and system properties for the + specified share. The data returned does not include the shares's + list of files or directories. + + :param str share_name: + Name of existing share. + :param int timeout: + The timeout parameter is expressed in seconds. + :param str snapshot: + A string that represents the snapshot version, if applicable. + :return: A Share that exposes properties and metadata. + :rtype: :class:`~azure.storage.file.models.Share` + ''' + _validate_not_none('share_name', share_name) + request = HTTPRequest() + request.method = 'GET' + request.host_locations = self._get_host_locations() + request.path = _get_path(share_name) + request.query = { + 'restype': 'share', + 'timeout': _int_to_str(timeout), + 'sharesnapshot': _to_str(snapshot) + } + + return self._perform_request(request, _parse_share, [share_name]) + + def set_share_properties(self, share_name, quota, timeout=None): + ''' + Sets service-defined properties for the specified share. + + :param str share_name: + Name of existing share. + :param int quota: + Specifies the maximum size of the share, in gigabytes. Must be + greater than 0, and less than or equal to 5 TB (5120 GB). + :param int timeout: + The timeout parameter is expressed in seconds. + ''' + _validate_not_none('share_name', share_name) + _validate_not_none('quota', quota) + request = HTTPRequest() + request.method = 'PUT' + request.host_locations = self._get_host_locations() + request.path = _get_path(share_name) + request.query = { + 'restype': 'share', + 'comp': 'properties', + 'timeout': _int_to_str(timeout), + } + request.headers = { + 'x-ms-share-quota': _int_to_str(quota) + } + + self._perform_request(request) + + def get_share_metadata(self, share_name, timeout=None, snapshot=None): + ''' + Returns all user-defined metadata for the specified share. + + :param str share_name: + Name of existing share. + :param int timeout: + The timeout parameter is expressed in seconds. + :param str snapshot: + A string that represents the snapshot version, if applicable. + :return: + A dictionary representing the share metadata name, value pairs. + :rtype: dict(str, str) + ''' + _validate_not_none('share_name', share_name) + request = HTTPRequest() + request.method = 'GET' + request.host_locations = self._get_host_locations() + request.path = _get_path(share_name) + request.query = { + 'restype': 'share', + 'comp': 'metadata', + 'timeout': _int_to_str(timeout), + 'sharesnapshot': _to_str(snapshot), + } + + return self._perform_request(request, _parse_metadata) + + def set_share_metadata(self, share_name, metadata=None, timeout=None): + ''' + Sets one or more user-defined name-value pairs for the specified + share. Each call to this operation replaces all existing metadata + attached to the share. To remove all metadata from the share, + call this operation with no metadata dict. + + :param str share_name: + Name of existing share. + :param metadata: + A dict containing name-value pairs to associate with the share as + metadata. Example: {'category':'test'} + :type metadata: dict(str, str) + :param int timeout: + The timeout parameter is expressed in seconds. + ''' + _validate_not_none('share_name', share_name) + request = HTTPRequest() + request.method = 'PUT' + request.host_locations = self._get_host_locations() + request.path = _get_path(share_name) + request.query = { + 'restype': 'share', + 'comp': 'metadata', + 'timeout': _int_to_str(timeout), + } + _add_metadata_headers(metadata, request) + + self._perform_request(request) + + def get_share_acl(self, share_name, timeout=None): + ''' + Gets the permissions for the specified share. + + :param str share_name: + Name of existing share. + :param int timeout: + The timeout parameter is expressed in seconds. + :return: A dictionary of access policies associated with the share. + :rtype: dict(str, :class:`~azure.storage.common.models.AccessPolicy`) + ''' + _validate_not_none('share_name', share_name) + request = HTTPRequest() + request.method = 'GET' + request.host_locations = self._get_host_locations() + request.path = _get_path(share_name) + request.query = { + 'restype': 'share', + 'comp': 'acl', + 'timeout': _int_to_str(timeout), + } + + return self._perform_request(request, _convert_xml_to_signed_identifiers) + + def set_share_acl(self, share_name, signed_identifiers=None, timeout=None): + ''' + Sets the permissions for the specified share or stored access + policies that may be used with Shared Access Signatures. + + :param str share_name: + Name of existing share. + :param signed_identifiers: + A dictionary of access policies to associate with the share. The + dictionary may contain up to 5 elements. An empty dictionary + will clear the access policies set on the service. + :type signed_identifiers: dict(str, :class:`~azure.storage.common.models.AccessPolicy`) + :param int timeout: + The timeout parameter is expressed in seconds. + ''' + _validate_not_none('share_name', share_name) + _validate_access_policies(signed_identifiers) + request = HTTPRequest() + request.method = 'PUT' + request.host_locations = self._get_host_locations() + request.path = _get_path(share_name) + request.query = { + 'restype': 'share', + 'comp': 'acl', + 'timeout': _int_to_str(timeout), + } + request.body = _get_request_body( + _convert_signed_identifiers_to_xml(signed_identifiers)) + + self._perform_request(request) + + def get_share_stats(self, share_name, timeout=None): + ''' + Gets the approximate size of the data stored on the share, + rounded up to the nearest gigabyte. + + Note that this value may not include all recently created + or recently resized files. + + :param str share_name: + Name of existing share. + :param int timeout: + The timeout parameter is expressed in seconds. + :return: the approximate size of the data stored on the share. + :rtype: int + ''' + _validate_not_none('share_name', share_name) + request = HTTPRequest() + request.method = 'GET' + request.host_locations = self._get_host_locations() + request.path = _get_path(share_name) + request.query = { + 'restype': 'share', + 'comp': 'stats', + 'timeout': _int_to_str(timeout), + } + + return self._perform_request(request, _convert_xml_to_share_stats) + + def delete_share(self, share_name, fail_not_exist=False, timeout=None, snapshot=None, delete_snapshots=None): + ''' + Marks the specified share for deletion. If the share + does not exist, the operation fails on the service. By + default, the exception is swallowed by the client. + To expose the exception, specify True for fail_not_exist. + + :param str share_name: + Name of share to delete. + :param bool fail_not_exist: + Specify whether to throw an exception when the share doesn't + exist. False by default. + :param int timeout: + The timeout parameter is expressed in seconds. + :param str snapshot: + A string that represents the snapshot version, if applicable. + Specify this argument to delete a specific snapshot only. + delete_snapshots must be None if this is specified. + :param ~azure.storage.file.models.DeleteSnapshot delete_snapshots: + To delete a share that has snapshots, this must be specified as DeleteSnapshot.Include. + :return: True if share is deleted, False share doesn't exist. + :rtype: bool + ''' + _validate_not_none('share_name', share_name) + request = HTTPRequest() + request.method = 'DELETE' + request.host_locations = self._get_host_locations() + request.path = _get_path(share_name) + request.headers = { + 'x-ms-delete-snapshots': _to_str(delete_snapshots) + } + request.query = { + 'restype': 'share', + 'timeout': _int_to_str(timeout), + 'sharesnapshot': _to_str(snapshot), + } + + if not fail_not_exist: + try: + self._perform_request(request) + return True + except AzureHttpError as ex: + _dont_fail_not_exist(ex) + return False + else: + self._perform_request(request) + return True + + def create_directory(self, share_name, directory_name, metadata=None, + fail_on_exist=False, timeout=None): + ''' + Creates a new directory under the specified share or parent directory. + If the directory with the same name already exists, the operation fails + on the service. By default, the exception is swallowed by the client. + To expose the exception, specify True for fail_on_exists. + + :param str share_name: + Name of existing share. + :param str directory_name: + Name of directory to create, including the path to the parent + directory. + :param metadata: + A dict with name_value pairs to associate with the + share as metadata. Example:{'Category':'test'} + :type metadata: dict(str, str): + :param bool fail_on_exist: + specify whether to throw an exception when the directory exists. + False by default. + :param int timeout: + The timeout parameter is expressed in seconds. + :return: True if directory is created, False if directory already exists. + :rtype: bool + ''' + _validate_not_none('share_name', share_name) + _validate_not_none('directory_name', directory_name) + request = HTTPRequest() + request.method = 'PUT' + request.host_locations = self._get_host_locations() + request.path = _get_path(share_name, directory_name) + request.query = { + 'restype': 'directory', + 'timeout': _int_to_str(timeout), + } + _add_metadata_headers(metadata, request) + + if not fail_on_exist: + try: + self._perform_request(request) + return True + except AzureHttpError as ex: + _dont_fail_on_exist(ex) + return False + else: + self._perform_request(request) + return True + + def delete_directory(self, share_name, directory_name, + fail_not_exist=False, timeout=None): + ''' + Deletes the specified empty directory. Note that the directory must + be empty before it can be deleted. Attempting to delete directories + that are not empty will fail. + + If the directory does not exist, the operation fails on the + service. By default, the exception is swallowed by the client. + To expose the exception, specify True for fail_not_exist. + + :param str share_name: + Name of existing share. + :param str directory_name: + Name of directory to delete, including the path to the parent + directory. + :param bool fail_not_exist: + Specify whether to throw an exception when the directory doesn't + exist. + :param int timeout: + The timeout parameter is expressed in seconds. + :return: True if directory is deleted, False otherwise. + :rtype: bool + ''' + _validate_not_none('share_name', share_name) + _validate_not_none('directory_name', directory_name) + request = HTTPRequest() + request.method = 'DELETE' + request.host_locations = self._get_host_locations() + request.path = _get_path(share_name, directory_name) + request.query = { + 'restype': 'directory', + 'timeout': _int_to_str(timeout), + } + + if not fail_not_exist: + try: + self._perform_request(request) + return True + except AzureHttpError as ex: + _dont_fail_not_exist(ex) + return False + else: + self._perform_request(request) + return True + + def get_directory_properties(self, share_name, directory_name, timeout=None, snapshot=None): + ''' + Returns all user-defined metadata and system properties for the + specified directory. The data returned does not include the directory's + list of files. + + :param str share_name: + Name of existing share. + :param str directory_name: + The path to an existing directory. + :param int timeout: + The timeout parameter is expressed in seconds. + :return: properties for the specified directory within a directory object. + :param str snapshot: + A string that represents the snapshot version, if applicable. + :rtype: :class:`~azure.storage.file.models.Directory` + ''' + _validate_not_none('share_name', share_name) + _validate_not_none('directory_name', directory_name) + request = HTTPRequest() + request.method = 'GET' + request.host_locations = self._get_host_locations() + request.path = _get_path(share_name, directory_name) + request.query = { + 'restype': 'directory', + 'timeout': _int_to_str(timeout), + 'sharesnapshot': _to_str(snapshot) + } + + return self._perform_request(request, _parse_directory, [directory_name]) + + def get_directory_metadata(self, share_name, directory_name, timeout=None, snapshot=None): + ''' + Returns all user-defined metadata for the specified directory. + + :param str share_name: + Name of existing share. + :param str directory_name: + The path to the directory. + :param int timeout: + The timeout parameter is expressed in seconds. + :param str snapshot: + A string that represents the snapshot version, if applicable. + :return: + A dictionary representing the directory metadata name, value pairs. + :rtype: dict(str, str) + ''' + _validate_not_none('share_name', share_name) + _validate_not_none('directory_name', directory_name) + request = HTTPRequest() + request.method = 'GET' + request.host_locations = self._get_host_locations() + request.path = _get_path(share_name, directory_name) + request.query = { + 'restype': 'directory', + 'comp': 'metadata', + 'timeout': _int_to_str(timeout), + 'sharesnapshot': _to_str(snapshot) + } + + return self._perform_request(request, _parse_metadata) + + def set_directory_metadata(self, share_name, directory_name, metadata=None, timeout=None): + ''' + Sets one or more user-defined name-value pairs for the specified + directory. Each call to this operation replaces all existing metadata + attached to the directory. To remove all metadata from the directory, + call this operation with no metadata dict. + + :param str share_name: + Name of existing share. + :param str directory_name: + The path to the directory. + :param metadata: + A dict containing name-value pairs to associate with the directory + as metadata. Example: {'category':'test'} + :type metadata: dict(str, str). + :param int timeout: + The timeout parameter is expressed in seconds. + ''' + _validate_not_none('share_name', share_name) + _validate_not_none('directory_name', directory_name) + request = HTTPRequest() + request.method = 'PUT' + request.host_locations = self._get_host_locations() + request.path = _get_path(share_name, directory_name) + request.query = { + 'restype': 'directory', + 'comp': 'metadata', + 'timeout': _int_to_str(timeout), + } + _add_metadata_headers(metadata, request) + + self._perform_request(request) + + def list_directories_and_files(self, share_name, directory_name=None, + num_results=None, marker=None, timeout=None, + prefix=None, snapshot=None): + + ''' + Returns a generator to list the directories and files under the specified share. + The generator will lazily follow the continuation tokens returned by + the service and stop when all directories and files have been returned or + num_results is reached. + + If num_results is specified and the share has more than that number of + files and directories, the generator will have a populated next_marker + field once it finishes. This marker can be used to create a new generator + if more results are desired. + + :param str share_name: + Name of existing share. + :param str directory_name: + The path to the directory. + :param int num_results: + Specifies the maximum number of files to return, + including all directory elements. If the request does not specify + num_results or specifies a value greater than 5,000, the server will + return up to 5,000 items. Setting num_results to a value less than + or equal to zero results in error response code 400 (Bad Request). + :param str marker: + An opaque continuation token. This value can be retrieved from the + next_marker field of a previous generator object if num_results was + specified and that generator has finished enumerating results. If + specified, this generator will begin returning results from the point + where the previous generator stopped. + :param int timeout: + The timeout parameter is expressed in seconds. + :param str prefix: + List only the files and/or directories with the given prefix. + :param str snapshot: + A string that represents the snapshot version, if applicable. + ''' + operation_context = _OperationContext(location_lock=True) + args = (share_name, directory_name) + kwargs = {'marker': marker, 'max_results': num_results, 'timeout': timeout, + '_context': operation_context, 'prefix': prefix, 'snapshot': snapshot} + + resp = self._list_directories_and_files(*args, **kwargs) + + return ListGenerator(resp, self._list_directories_and_files, args, kwargs) + + def _list_directories_and_files(self, share_name, directory_name=None, + marker=None, max_results=None, timeout=None, + prefix=None, _context=None, snapshot=None): + ''' + Returns a list of the directories and files under the specified share. + + :param str share_name: + Name of existing share. + :param str directory_name: + The path to the directory. + :param str marker: + A string value that identifies the portion of the list + to be returned with the next list operation. The operation returns + a next_marker value within the response body if the list returned was + not complete. The marker value may then be used in a subsequent + call to request the next set of list items. The marker value is + opaque to the client. + :param int max_results: + Specifies the maximum number of files to return, + including all directory elements. If the request does not specify + max_results or specifies a value greater than 5,000, the server will + return up to 5,000 items. Setting max_results to a value less than + or equal to zero results in error response code 400 (Bad Request). + :param int timeout: + The timeout parameter is expressed in seconds. + :param str prefix: + List only the files and/or directories with the given prefix. + :param str snapshot: + A string that represents the snapshot version, if applicable. + ''' + _validate_not_none('share_name', share_name) + request = HTTPRequest() + request.method = 'GET' + request.host_locations = self._get_host_locations() + request.path = _get_path(share_name, directory_name) + request.query = { + 'restype': 'directory', + 'comp': 'list', + 'prefix': _to_str(prefix), + 'marker': _to_str(marker), + 'maxresults': _int_to_str(max_results), + 'timeout': _int_to_str(timeout), + 'sharesnapshot': _to_str(snapshot) + } + + return self._perform_request(request, _convert_xml_to_directories_and_files, + operation_context=_context) + + def get_file_properties(self, share_name, directory_name, file_name, timeout=None, snapshot=None): + ''' + Returns all user-defined metadata, standard HTTP properties, and + system properties for the file. Returns an instance of :class:`~azure.storage.file.models.File` with + :class:`~azure.storage.file.models.FileProperties` and a metadata dict. + + :param str share_name: + Name of existing share. + :param str directory_name: + The path to the directory. + :param str file_name: + Name of existing file. + :param int timeout: + The timeout parameter is expressed in seconds. + :param str snapshot: + A string that represents the snapshot version, if applicable. + :return: a file object including properties and metadata. + :rtype: :class:`~azure.storage.file.models.File` + ''' + _validate_not_none('share_name', share_name) + _validate_not_none('file_name', file_name) + request = HTTPRequest() + request.method = 'HEAD' + request.host_locations = self._get_host_locations() + request.path = _get_path(share_name, directory_name, file_name) + request.query = { 'timeout': _int_to_str(timeout), 'sharesnapshot': _to_str(snapshot)} + + return self._perform_request(request, _parse_file, [file_name]) + + def exists(self, share_name, directory_name=None, file_name=None, timeout=None, snapshot=None): + ''' + Returns a boolean indicating whether the share exists if only share name is + given. If directory_name is specificed a boolean will be returned indicating + if the directory exists. If file_name is specified as well, a boolean will be + returned indicating if the file exists. + + :param str share_name: + Name of a share. + :param str directory_name: + The path to a directory. + :param str file_name: + Name of a file. + :param int timeout: + The timeout parameter is expressed in seconds. + :param str snapshot: + A string that represents the snapshot version, if applicable. + :return: A boolean indicating whether the resource exists. + :rtype: bool + ''' + _validate_not_none('share_name', share_name) + try: + if file_name is not None: + self.get_file_properties(share_name, directory_name, file_name, timeout=timeout, snapshot=snapshot) + elif directory_name is not None: + self.get_directory_properties(share_name, directory_name, timeout=timeout, snapshot=snapshot) + else: + self.get_share_properties(share_name, timeout=timeout, snapshot=snapshot) + return True + except AzureHttpError as ex: + _dont_fail_not_exist(ex) + return False + + def resize_file(self, share_name, directory_name, + file_name, content_length, timeout=None): + ''' + Resizes a file to the specified size. If the specified byte + value is less than the current size of the file, then all + ranges above the specified byte value are cleared. + + :param str share_name: + Name of existing share. + :param str directory_name: + The path to the directory. + :param str file_name: + Name of existing file. + :param int content_length: + The length to resize the file to. + :param int timeout: + The timeout parameter is expressed in seconds. + ''' + _validate_not_none('share_name', share_name) + _validate_not_none('file_name', file_name) + _validate_not_none('content_length', content_length) + request = HTTPRequest() + request.method = 'PUT' + request.host_locations = self._get_host_locations() + request.path = _get_path(share_name, directory_name, file_name) + request.query = { + 'comp': 'properties', + 'timeout': _int_to_str(timeout), + } + request.headers = { + 'x-ms-content-length': _to_str(content_length) + } + + self._perform_request(request) + + def set_file_properties(self, share_name, directory_name, file_name, + content_settings, timeout=None): + ''' + Sets system properties on the file. If one property is set for the + content_settings, all properties will be overriden. + + :param str share_name: + Name of existing share. + :param str directory_name: + The path to the directory. + :param str file_name: + Name of existing file. + :param ~azure.storage.file.models.ContentSettings content_settings: + ContentSettings object used to set the file properties. + :param int timeout: + The timeout parameter is expressed in seconds. + ''' + _validate_not_none('share_name', share_name) + _validate_not_none('file_name', file_name) + _validate_not_none('content_settings', content_settings) + request = HTTPRequest() + request.method = 'PUT' + request.host_locations = self._get_host_locations() + request.path = _get_path(share_name, directory_name, file_name) + request.query = { + 'comp': 'properties', + 'timeout': _int_to_str(timeout), + } + request.headers = content_settings._to_headers() + + self._perform_request(request) + + def get_file_metadata(self, share_name, directory_name, file_name, timeout=None, snapshot=None): + ''' + Returns all user-defined metadata for the specified file. + + :param str share_name: + Name of existing share. + :param str directory_name: + The path to the directory. + :param str file_name: + Name of existing file. + :param int timeout: + The timeout parameter is expressed in seconds. + :param str snapshot: + A string that represents the snapshot version, if applicable. + :return: + A dictionary representing the file metadata name, value pairs. + :rtype: dict(str, str) + ''' + _validate_not_none('share_name', share_name) + _validate_not_none('file_name', file_name) + request = HTTPRequest() + request.method = 'GET' + request.host_locations = self._get_host_locations() + request.path = _get_path(share_name, directory_name, file_name) + request.query = { + 'comp': 'metadata', + 'timeout': _int_to_str(timeout), + 'sharesnapshot': _to_str(snapshot), + } + + return self._perform_request(request, _parse_metadata) + + def set_file_metadata(self, share_name, directory_name, + file_name, metadata=None, timeout=None): + ''' + Sets user-defined metadata for the specified file as one or more + name-value pairs. + + :param str share_name: + Name of existing share. + :param str directory_name: + The path to the directory. + :param str file_name: + Name of existing file. + :param metadata: + Dict containing name and value pairs. Each call to this operation + replaces all existing metadata attached to the file. To remove all + metadata from the file, call this operation with no metadata headers. + :type metadata: dict(str, str) + :param int timeout: + The timeout parameter is expressed in seconds. + ''' + _validate_not_none('share_name', share_name) + _validate_not_none('file_name', file_name) + request = HTTPRequest() + request.method = 'PUT' + request.host_locations = self._get_host_locations() + request.path = _get_path(share_name, directory_name, file_name) + request.query = { + 'comp': 'metadata', + 'timeout': _int_to_str(timeout), + } + _add_metadata_headers(metadata, request) + + self._perform_request(request) + + def copy_file(self, share_name, directory_name, file_name, copy_source, + metadata=None, timeout=None): + ''' + Copies a file asynchronously. This operation returns a copy operation + properties object, including a copy ID you can use to check or abort the + copy operation. The File service copies files on a best-effort basis. + + If the destination file exists, it will be overwritten. The destination + file cannot be modified while the copy operation is in progress. + + :param str share_name: + Name of the destination share. The share must exist. + :param str directory_name: + Name of the destination directory. The directory must exist. + :param str file_name: + Name of the destination file. If the destination file exists, it will + be overwritten. Otherwise, it will be created. + :param str copy_source: + A URL of up to 2 KB in length that specifies an Azure file or blob. + The value should be URL-encoded as it would appear in a request URI. + If the source is in another account, the source must either be public + or must be authenticated via a shared access signature. If the source + is public, no authentication is required. + Examples: + https://myaccount.file.core.windows.net/myshare/mydir/myfile + https://otheraccount.file.core.windows.net/myshare/mydir/myfile?sastoken + :param metadata: + Name-value pairs associated with the file as metadata. If no name-value + pairs are specified, the operation will copy the metadata from the + source blob or file to the destination file. If one or more name-value + pairs are specified, the destination file is created with the specified + metadata, and the metadata is not copied from the source blob or file. + :type metadata: dict(str, str). + :param int timeout: + The timeout parameter is expressed in seconds. + :return: Copy operation properties such as status, source, and ID. + :rtype: :class:`~azure.storage.file.models.CopyProperties` + ''' + _validate_not_none('share_name', share_name) + _validate_not_none('file_name', file_name) + _validate_not_none('copy_source', copy_source) + + request = HTTPRequest() + request.method = 'PUT' + request.host_locations = self._get_host_locations() + request.path = _get_path(share_name, directory_name, file_name) + request.query = {'timeout': _int_to_str(timeout)} + request.headers = { + 'x-ms-copy-source': _to_str(copy_source), + } + _add_metadata_headers(metadata, request) + + return self._perform_request(request, _parse_properties, [FileProperties]).copy + + def abort_copy_file(self, share_name, directory_name, file_name, copy_id, timeout=None): + ''' + Aborts a pending copy_file operation, and leaves a destination file + with zero length and full metadata. + + :param str share_name: + Name of destination share. + :param str directory_name: + The path to the directory. + :param str file_name: + Name of destination file. + :param str copy_id: + Copy identifier provided in the copy.id of the original + copy_file operation. + :param int timeout: + The timeout parameter is expressed in seconds. + ''' + _validate_not_none('share_name', share_name) + _validate_not_none('file_name', file_name) + _validate_not_none('copy_id', copy_id) + request = HTTPRequest() + request.method = 'PUT' + request.host_locations = self._get_host_locations() + request.path = _get_path(share_name, directory_name, file_name) + request.query = { + 'comp': 'copy', + 'copyid': _to_str(copy_id), + 'timeout': _int_to_str(timeout), + } + request.headers = { + 'x-ms-copy-action': 'abort', + } + + self._perform_request(request) + + def delete_file(self, share_name, directory_name, file_name, timeout=None): + ''' + Marks the specified file for deletion. The file is later + deleted during garbage collection. + + :param str share_name: + Name of existing share. + :param str directory_name: + The path to the directory. + :param str file_name: + Name of existing file. + :param int timeout: + The timeout parameter is expressed in seconds. + ''' + _validate_not_none('share_name', share_name) + _validate_not_none('file_name', file_name) + request = HTTPRequest() + request.method = 'DELETE' + request.host_locations = self._get_host_locations() + request.path = _get_path(share_name, directory_name, file_name) + request.query = {'timeout': _int_to_str(timeout)} + + self._perform_request(request) + + def create_file(self, share_name, directory_name, file_name, + content_length, content_settings=None, metadata=None, + timeout=None): + ''' + Creates a new file. + + See create_file_from_* for high level functions that handle the + creation and upload of large files with automatic chunking and + progress notifications. + + :param str share_name: + Name of existing share. + :param str directory_name: + The path to the directory. + :param str file_name: + Name of file to create or update. + :param int content_length: + Length of the file in bytes. + :param ~azure.storage.file.models.ContentSettings content_settings: + ContentSettings object used to set file properties. + :param metadata: + Name-value pairs associated with the file as metadata. + :type metadata: dict(str, str) + :param int timeout: + The timeout parameter is expressed in seconds. + ''' + _validate_not_none('share_name', share_name) + _validate_not_none('file_name', file_name) + _validate_not_none('content_length', content_length) + request = HTTPRequest() + request.method = 'PUT' + request.host_locations = self._get_host_locations() + request.path = _get_path(share_name, directory_name, file_name) + request.query = {'timeout': _int_to_str(timeout)} + request.headers = { + 'x-ms-content-length': _to_str(content_length), + 'x-ms-type': 'file' + } + _add_metadata_headers(metadata, request) + if content_settings is not None: + request.headers.update(content_settings._to_headers()) + + self._perform_request(request) + + def create_file_from_path(self, share_name, directory_name, file_name, + local_file_path, content_settings=None, + metadata=None, validate_content=False, progress_callback=None, + max_connections=2, timeout=None): + ''' + Creates a new azure file from a local file path, or updates the content of an + existing file, with automatic chunking and progress notifications. + + :param str share_name: + Name of existing share. + :param str directory_name: + The path to the directory. + :param str file_name: + Name of file to create or update. + :param str local_file_path: + Path of the local file to upload as the file content. + :param ~azure.storage.file.models.ContentSettings content_settings: + ContentSettings object used for setting file properties. + :param metadata: + Name-value pairs associated with the file as metadata. + :type metadata: dict(str, str) + :param bool validate_content: + If true, calculates an MD5 hash for each range of the file. The storage + service checks the hash of the content that has arrived with the hash + that was sent. This is primarily valuable for detecting bitflips on + the wire if using http instead of https as https (the default) will + already validate. Note that this MD5 hash is not stored with the + file. + :param progress_callback: + Callback for progress with signature function(current, total) where + current is the number of bytes transfered so far and total is the + size of the file, or None if the total size is unknown. + :type progress_callback: func(current, total) + :param int max_connections: + Maximum number of parallel connections to use. + :param int timeout: + The timeout parameter is expressed in seconds. This method may make + multiple calls to the Azure service and the timeout will apply to + each call individually. + ''' + _validate_not_none('share_name', share_name) + _validate_not_none('file_name', file_name) + _validate_not_none('local_file_path', local_file_path) + + count = path.getsize(local_file_path) + with open(local_file_path, 'rb') as stream: + self.create_file_from_stream( + share_name, directory_name, file_name, stream, + count, content_settings, metadata, validate_content, progress_callback, + max_connections, timeout) + + def create_file_from_text(self, share_name, directory_name, file_name, + text, encoding='utf-8', content_settings=None, + metadata=None, validate_content=False, timeout=None): + ''' + Creates a new file from str/unicode, or updates the content of an + existing file, with automatic chunking and progress notifications. + + :param str share_name: + Name of existing share. + :param str directory_name: + The path to the directory. + :param str file_name: + Name of file to create or update. + :param str text: + Text to upload to the file. + :param str encoding: + Python encoding to use to convert the text to bytes. + :param ~azure.storage.file.models.ContentSettings content_settings: + ContentSettings object used to set file properties. + :param metadata: + Name-value pairs associated with the file as metadata. + :type metadata: dict(str, str) + :param bool validate_content: + If true, calculates an MD5 hash for each range of the file. The storage + service checks the hash of the content that has arrived with the hash + that was sent. This is primarily valuable for detecting bitflips on + the wire if using http instead of https as https (the default) will + already validate. Note that this MD5 hash is not stored with the + file. + :param int timeout: + The timeout parameter is expressed in seconds. This method may make + multiple calls to the Azure service and the timeout will apply to + each call individually. + ''' + _validate_not_none('share_name', share_name) + _validate_not_none('file_name', file_name) + _validate_not_none('text', text) + + if not isinstance(text, bytes): + _validate_not_none('encoding', encoding) + text = text.encode(encoding) + + self.create_file_from_bytes( + share_name, directory_name, file_name, text, count=len(text), + content_settings=content_settings, metadata=metadata, + validate_content=validate_content, timeout=timeout) + + def create_file_from_bytes( + self, share_name, directory_name, file_name, file, + index=0, count=None, content_settings=None, metadata=None, + validate_content=False, progress_callback=None, max_connections=2, + timeout=None): + ''' + Creates a new file from an array of bytes, or updates the content + of an existing file, with automatic chunking and progress + notifications. + + :param str share_name: + Name of existing share. + :param str directory_name: + The path to the directory. + :param str file_name: + Name of file to create or update. + :param str file: + Content of file as an array of bytes. + :param int index: + Start index in the array of bytes. + :param int count: + Number of bytes to upload. Set to None or negative value to upload + all bytes starting from index. + :param ~azure.storage.file.models.ContentSettings content_settings: + ContentSettings object used to set file properties. + :param metadata: + Name-value pairs associated with the file as metadata. + :type metadata: dict(str, str) + :param bool validate_content: + If true, calculates an MD5 hash for each range of the file. The storage + service checks the hash of the content that has arrived with the hash + that was sent. This is primarily valuable for detecting bitflips on + the wire if using http instead of https as https (the default) will + already validate. Note that this MD5 hash is not stored with the + file. + :param progress_callback: + Callback for progress with signature function(current, total) where + current is the number of bytes transfered so far and total is the + size of the file, or None if the total size is unknown. + :type progress_callback: func(current, total) + :param int max_connections: + Maximum number of parallel connections to use. + :param int timeout: + The timeout parameter is expressed in seconds. This method may make + multiple calls to the Azure service and the timeout will apply to + each call individually. + ''' + _validate_not_none('share_name', share_name) + _validate_not_none('file_name', file_name) + _validate_not_none('file', file) + _validate_type_bytes('file', file) + + if index < 0: + raise TypeError(_ERROR_VALUE_NEGATIVE.format('index')) + + if count is None or count < 0: + count = len(file) - index + + stream = BytesIO(file) + stream.seek(index) + + self.create_file_from_stream( + share_name, directory_name, file_name, stream, count, + content_settings, metadata, validate_content, progress_callback, + max_connections, timeout) + + def create_file_from_stream( + self, share_name, directory_name, file_name, stream, count, + content_settings=None, metadata=None, validate_content=False, + progress_callback=None, max_connections=2, timeout=None): + ''' + Creates a new file from a file/stream, or updates the content of an + existing file, with automatic chunking and progress notifications. + + :param str share_name: + Name of existing share. + :param str directory_name: + The path to the directory. + :param str file_name: + Name of file to create or update. + :param io.IOBase stream: + Opened file/stream to upload as the file content. + :param int count: + Number of bytes to read from the stream. This is required, a + file cannot be created if the count is unknown. + :param ~azure.storage.file.models.ContentSettings content_settings: + ContentSettings object used to set file properties. + :param metadata: + Name-value pairs associated with the file as metadata. + :type metadata: dict(str, str) + :param bool validate_content: + If true, calculates an MD5 hash for each range of the file. The storage + service checks the hash of the content that has arrived with the hash + that was sent. This is primarily valuable for detecting bitflips on + the wire if using http instead of https as https (the default) will + already validate. Note that this MD5 hash is not stored with the + file. + :param progress_callback: + Callback for progress with signature function(current, total) where + current is the number of bytes transfered so far and total is the + size of the file, or None if the total size is unknown. + :type progress_callback: func(current, total) + :param int max_connections: + Maximum number of parallel connections to use. Note that parallel upload + requires the stream to be seekable. + :param int timeout: + The timeout parameter is expressed in seconds. This method may make + multiple calls to the Azure service and the timeout will apply to + each call individually. + ''' + _validate_not_none('share_name', share_name) + _validate_not_none('file_name', file_name) + _validate_not_none('stream', stream) + _validate_not_none('count', count) + + if count < 0: + raise TypeError(_ERROR_VALUE_NEGATIVE.format('count')) + + self.create_file( + share_name, + directory_name, + file_name, + count, + content_settings, + metadata, + timeout + ) + + _upload_file_chunks( + self, + share_name, + directory_name, + file_name, + count, + self.MAX_RANGE_SIZE, + stream, + max_connections, + progress_callback, + validate_content, + timeout + ) + + def _get_file(self, share_name, directory_name, file_name, + start_range=None, end_range=None, validate_content=False, + timeout=None, _context=None, snapshot=None): + ''' + Downloads a file's content, metadata, and properties. You can specify a + range if you don't need to download the file in its entirety. If no range + is specified, the full file will be downloaded. + + See get_file_to_* for high level functions that handle the download + of large files with automatic chunking and progress notifications. + + :param str share_name: + Name of existing share. + :param str directory_name: + The path to the directory. + :param str file_name: + Name of existing file. + :param int start_range: + Start of byte range to use for downloading a section of the file. + If no end_range is given, all bytes after the start_range will be downloaded. + The start_range and end_range params are inclusive. + Ex: start_range=0, end_range=511 will download first 512 bytes of file. + :param int end_range: + End of byte range to use for downloading a section of the file. + If end_range is given, start_range must be provided. + The start_range and end_range params are inclusive. + Ex: start_range=0, end_range=511 will download first 512 bytes of file. + :param bool validate_content: + When this is set to True and specified together with the Range header, + the service returns the MD5 hash for the range, as long as the range + is less than or equal to 4 MB in size. + :param int timeout: + The timeout parameter is expressed in seconds. + :param str snapshot: + A string that represents the snapshot version, if applicable. + :return: A File with content, properties, and metadata. + :rtype: :class:`~azure.storage.file.models.File` + ''' + _validate_not_none('share_name', share_name) + _validate_not_none('file_name', file_name) + request = HTTPRequest() + request.method = 'GET' + request.host_locations = self._get_host_locations() + request.path = _get_path(share_name, directory_name, file_name) + request.query = { 'timeout': _int_to_str(timeout), 'sharesnapshot': _to_str(snapshot)} + _validate_and_format_range_headers( + request, + start_range, + end_range, + start_range_required=False, + end_range_required=False, + check_content_md5=validate_content) + + return self._perform_request(request, _parse_file, + [file_name, validate_content], + operation_context=_context) + + def get_file_to_path(self, share_name, directory_name, file_name, file_path, + open_mode='wb', start_range=None, end_range=None, + validate_content=False, progress_callback=None, + max_connections=2, timeout=None, snapshot=None): + ''' + Downloads a file to a file path, with automatic chunking and progress + notifications. Returns an instance of File with properties and metadata. + + :param str share_name: + Name of existing share. + :param str directory_name: + The path to the directory. + :param str file_name: + Name of existing file. + :param str file_path: + Path of file to write to. + :param str open_mode: + Mode to use when opening the file. Note that specifying append only + open_mode prevents parallel download. So, max_connections must be set + to 1 if this open_mode is used. + :param int start_range: + Start of byte range to use for downloading a section of the file. + If no end_range is given, all bytes after the start_range will be downloaded. + The start_range and end_range params are inclusive. + Ex: start_range=0, end_range=511 will download first 512 bytes of file. + :param int end_range: + End of byte range to use for downloading a section of the file. + If end_range is given, start_range must be provided. + The start_range and end_range params are inclusive. + Ex: start_range=0, end_range=511 will download first 512 bytes of file. + :param bool validate_content: + If set to true, validates an MD5 hash for each retrieved portion of + the file. This is primarily valuable for detecting bitflips on the wire + if using http instead of https as https (the default) will already + validate. Note that the service will only return transactional MD5s + for chunks 4MB or less so the first get request will be of size + self.MAX_CHUNK_GET_SIZE instead of self.MAX_SINGLE_GET_SIZE. If + self.MAX_CHUNK_GET_SIZE was set to greater than 4MB an error will be + thrown. As computing the MD5 takes processing time and more requests + will need to be done due to the reduced chunk size there may be some + increase in latency. + :param progress_callback: + Callback for progress with signature function(current, total) + where current is the number of bytes transfered so far, and total is + the size of the file if known. + :type progress_callback: func(current, total) + :param int max_connections: + If set to 2 or greater, an initial get will be done for the first + self.MAX_SINGLE_GET_SIZE bytes of the file. If this is the entire file, + the method returns at this point. If it is not, it will download the + remaining data parallel using the number of threads equal to + max_connections. Each chunk will be of size self.MAX_CHUNK_GET_SIZE. + If set to 1, a single large get request will be done. This is not + generally recommended but available if very few threads should be + used, network requests are very expensive, or a non-seekable stream + prevents parallel download. This may also be valuable if the file is + being concurrently modified to enforce atomicity or if many files are + expected to be empty as an extra request is required for empty files + if max_connections is greater than 1. + :param int timeout: + The timeout parameter is expressed in seconds. This method may make + multiple calls to the Azure service and the timeout will apply to + each call individually. + :param str snapshot: + A string that represents the snapshot version, if applicable. + :return: A File with properties and metadata. + :rtype: :class:`~azure.storage.file.models.File` + ''' + _validate_not_none('share_name', share_name) + _validate_not_none('file_name', file_name) + _validate_not_none('file_path', file_path) + _validate_not_none('open_mode', open_mode) + + if max_connections > 1 and 'a' in open_mode: + raise ValueError(_ERROR_PARALLEL_NOT_SEEKABLE) + + with open(file_path, open_mode) as stream: + file = self.get_file_to_stream( + share_name, directory_name, file_name, stream, + start_range, end_range, validate_content, + progress_callback, max_connections, timeout, snapshot) + + return file + + def get_file_to_stream( + self, share_name, directory_name, file_name, stream, + start_range=None, end_range=None, validate_content=False, + progress_callback=None, max_connections=2, timeout=None, snapshot=None): + ''' + Downloads a file to a stream, with automatic chunking and progress + notifications. Returns an instance of :class:`~azure.storage.file.models.File` with properties + and metadata. + + :param str share_name: + Name of existing share. + :param str directory_name: + The path to the directory. + :param str file_name: + Name of existing file. + :param io.IOBase stream: + Opened file/stream to write to. + :param int start_range: + Start of byte range to use for downloading a section of the file. + If no end_range is given, all bytes after the start_range will be downloaded. + The start_range and end_range params are inclusive. + Ex: start_range=0, end_range=511 will download first 512 bytes of file. + :param int end_range: + End of byte range to use for downloading a section of the file. + If end_range is given, start_range must be provided. + The start_range and end_range params are inclusive. + Ex: start_range=0, end_range=511 will download first 512 bytes of file. + :param bool validate_content: + If set to true, validates an MD5 hash for each retrieved portion of + the file. This is primarily valuable for detecting bitflips on the wire + if using http instead of https as https (the default) will already + validate. Note that the service will only return transactional MD5s + for chunks 4MB or less so the first get request will be of size + self.MAX_CHUNK_GET_SIZE instead of self.MAX_SINGLE_GET_SIZE. If + self.MAX_CHUNK_GET_SIZE was set to greater than 4MB an error will be + thrown. As computing the MD5 takes processing time and more requests + will need to be done due to the reduced chunk size there may be some + increase in latency. + :param progress_callback: + Callback for progress with signature function(current, total) + where current is the number of bytes transfered so far, and total is + the size of the file if known. + :type progress_callback: func(current, total) + :param int max_connections: + If set to 2 or greater, an initial get will be done for the first + self.MAX_SINGLE_GET_SIZE bytes of the file. If this is the entire file, + the method returns at this point. If it is not, it will download the + remaining data parallel using the number of threads equal to + max_connections. Each chunk will be of size self.MAX_CHUNK_GET_SIZE. + If set to 1, a single large get request will be done. This is not + generally recommended but available if very few threads should be + used, network requests are very expensive, or a non-seekable stream + prevents parallel download. This may also be valuable if the file is + being concurrently modified to enforce atomicity or if many files are + expected to be empty as an extra request is required for empty files + if max_connections is greater than 1. + :param int timeout: + The timeout parameter is expressed in seconds. This method may make + multiple calls to the Azure service and the timeout will apply to + each call individually. + :param str snapshot: + A string that represents the snapshot version, if applicable. + :return: A File with properties and metadata. + :rtype: :class:`~azure.storage.file.models.File` + ''' + _validate_not_none('share_name', share_name) + _validate_not_none('file_name', file_name) + _validate_not_none('stream', stream) + + # If the user explicitly sets max_connections to 1, do a single shot download + if max_connections == 1: + file = self._get_file(share_name, + directory_name, + file_name, + start_range=start_range, + end_range=end_range, + validate_content=validate_content, + timeout=timeout, + snapshot=snapshot) + + # Set the download size + download_size = file.properties.content_length + + # If max_connections is greater than 1, do the first get to establish the + # size of the file and get the first segment of data + else: + if sys.version_info >= (3,) and not stream.seekable(): + raise ValueError(_ERROR_PARALLEL_NOT_SEEKABLE) + + # The service only provides transactional MD5s for chunks under 4MB. + # If validate_content is on, get only self.MAX_CHUNK_GET_SIZE for the first + # chunk so a transactional MD5 can be retrieved. + first_get_size = self.MAX_SINGLE_GET_SIZE if not validate_content else self.MAX_CHUNK_GET_SIZE + + initial_request_start = start_range if start_range is not None else 0 + + if end_range is not None and end_range - start_range < first_get_size: + initial_request_end = end_range + else: + initial_request_end = initial_request_start + first_get_size - 1 + + # Send a context object to make sure we always retry to the initial location + operation_context = _OperationContext(location_lock=True) + try: + file = self._get_file(share_name, + directory_name, + file_name, + start_range=initial_request_start, + end_range=initial_request_end, + validate_content=validate_content, + timeout=timeout, + _context=operation_context, + snapshot=snapshot) + + # Parse the total file size and adjust the download size if ranges + # were specified + file_size = _parse_length_from_content_range(file.properties.content_range) + if end_range is not None: + # Use the end_range unless it is over the end of the file + download_size = min(file_size, end_range - start_range + 1) + elif start_range is not None: + download_size = file_size - start_range + else: + download_size = file_size + except AzureHttpError as ex: + if start_range is None and ex.status_code == 416: + # Get range will fail on an empty file. If the user did not + # request a range, do a regular get request in order to get + # any properties. + file = self._get_file(share_name, + directory_name, + file_name, + validate_content=validate_content, + timeout=timeout, + _context=operation_context, + snapshot=snapshot) + + # Set the download size to empty + download_size = 0 + else: + raise ex + + # Mark the first progress chunk. If the file is small or this is a single + # shot download, this is the only call + if progress_callback: + progress_callback(file.properties.content_length, download_size) + + # Write the content to the user stream + # Clear file content since output has been written to user stream + if file.content is not None: + stream.write(file.content) + file.content = None + + # If the file is small or single shot download was used, the download is + # complete at this point. If file size is large, use parallel download. + if file.properties.content_length != download_size: + # At this point would like to lock on something like the etag so that + # if the file is modified, we dont get a corrupted download. However, + # this feature is not yet available on the file service. + + end_file = file_size + if end_range is not None: + # Use the end_range unless it is over the end of the file + end_file = min(file_size, end_range + 1) + + _download_file_chunks( + self, + share_name, + directory_name, + file_name, + download_size, + self.MAX_CHUNK_GET_SIZE, + first_get_size, + initial_request_end + 1, # start where the first download ended + end_file, + stream, + max_connections, + progress_callback, + validate_content, + timeout, + operation_context, + snapshot + ) + + # Set the content length to the download size instead of the size of + # the last range + file.properties.content_length = download_size + + # Overwrite the content range to the user requested range + file.properties.content_range = 'bytes {0}-{1}/{2}'.format(start_range, end_range, file_size) + + # Overwrite the content MD5 as it is the MD5 for the last range instead + # of the stored MD5 + # TODO: Set to the stored MD5 when the service returns this + file.properties.content_md5 = None + + return file + + def get_file_to_bytes(self, share_name, directory_name, file_name, + start_range=None, end_range=None, validate_content=False, + progress_callback=None, max_connections=2, timeout=None, snapshot=None): + ''' + Downloads a file as an array of bytes, with automatic chunking and + progress notifications. Returns an instance of :class:`~azure.storage.file.models.File` with + properties, metadata, and content. + + :param str share_name: + Name of existing share. + :param str directory_name: + The path to the directory. + :param str file_name: + Name of existing file. + :param int start_range: + Start of byte range to use for downloading a section of the file. + If no end_range is given, all bytes after the start_range will be downloaded. + The start_range and end_range params are inclusive. + Ex: start_range=0, end_range=511 will download first 512 bytes of file. + :param int end_range: + End of byte range to use for downloading a section of the file. + If end_range is given, start_range must be provided. + The start_range and end_range params are inclusive. + Ex: start_range=0, end_range=511 will download first 512 bytes of file. + :param bool validate_content: + If set to true, validates an MD5 hash for each retrieved portion of + the file. This is primarily valuable for detecting bitflips on the wire + if using http instead of https as https (the default) will already + validate. Note that the service will only return transactional MD5s + for chunks 4MB or less so the first get request will be of size + self.MAX_CHUNK_GET_SIZE instead of self.MAX_SINGLE_GET_SIZE. If + self.MAX_CHUNK_GET_SIZE was set to greater than 4MB an error will be + thrown. As computing the MD5 takes processing time and more requests + will need to be done due to the reduced chunk size there may be some + increase in latency. + :param progress_callback: + Callback for progress with signature function(current, total) + where current is the number of bytes transfered so far, and total is + the size of the file if known. + :type progress_callback: func(current, total) + :param int max_connections: + If set to 2 or greater, an initial get will be done for the first + self.MAX_SINGLE_GET_SIZE bytes of the file. If this is the entire file, + the method returns at this point. If it is not, it will download the + remaining data parallel using the number of threads equal to + max_connections. Each chunk will be of size self.MAX_CHUNK_GET_SIZE. + If set to 1, a single large get request will be done. This is not + generally recommended but available if very few threads should be + used, network requests are very expensive, or a non-seekable stream + prevents parallel download. This may also be valuable if the file is + being concurrently modified to enforce atomicity or if many files are + expected to be empty as an extra request is required for empty files + if max_connections is greater than 1. + :param int timeout: + The timeout parameter is expressed in seconds. This method may make + multiple calls to the Azure service and the timeout will apply to + each call individually. + :param str snapshot: + A string that represents the snapshot version, if applicable. + :return: A File with properties, content, and metadata. + :rtype: :class:`~azure.storage.file.models.File` + ''' + _validate_not_none('share_name', share_name) + _validate_not_none('file_name', file_name) + + stream = BytesIO() + file = self.get_file_to_stream( + share_name, + directory_name, + file_name, + stream, + start_range, + end_range, + validate_content, + progress_callback, + max_connections, + timeout, + snapshot) + + file.content = stream.getvalue() + return file + + def get_file_to_text( + self, share_name, directory_name, file_name, encoding='utf-8', + start_range=None, end_range=None, validate_content=False, + progress_callback=None, max_connections=2, timeout=None, snapshot=None): + ''' + Downloads a file as unicode text, with automatic chunking and progress + notifications. Returns an instance of :class:`~azure.storage.file.models.File` with properties, + metadata, and content. + + :param str share_name: + Name of existing share. + :param str directory_name: + The path to the directory. + :param str file_name: + Name of existing file. + :param str encoding: + Python encoding to use when decoding the file data. + :param int start_range: + Start of byte range to use for downloading a section of the file. + If no end_range is given, all bytes after the start_range will be downloaded. + The start_range and end_range params are inclusive. + Ex: start_range=0, end_range=511 will download first 512 bytes of file. + :param int end_range: + End of byte range to use for downloading a section of the file. + If end_range is given, start_range must be provided. + The start_range and end_range params are inclusive. + Ex: start_range=0, end_range=511 will download first 512 bytes of file. + :param bool validate_content: + If set to true, validates an MD5 hash for each retrieved portion of + the file. This is primarily valuable for detecting bitflips on the wire + if using http instead of https as https (the default) will already + validate. Note that the service will only return transactional MD5s + for chunks 4MB or less so the first get request will be of size + self.MAX_CHUNK_GET_SIZE instead of self.MAX_SINGLE_GET_SIZE. If + self.MAX_CHUNK_GET_SIZE was set to greater than 4MB an error will be + thrown. As computing the MD5 takes processing time and more requests + will need to be done due to the reduced chunk size there may be some + increase in latency. + :param progress_callback: + Callback for progress with signature function(current, total) + where current is the number of bytes transfered so far, and total is + the size of the file if known. + :type progress_callback: func(current, total) + :param int max_connections: + If set to 2 or greater, an initial get will be done for the first + self.MAX_SINGLE_GET_SIZE bytes of the file. If this is the entire file, + the method returns at this point. If it is not, it will download the + remaining data parallel using the number of threads equal to + max_connections. Each chunk will be of size self.MAX_CHUNK_GET_SIZE. + If set to 1, a single large get request will be done. This is not + generally recommended but available if very few threads should be + used, network requests are very expensive, or a non-seekable stream + prevents parallel download. This may also be valuable if the file is + being concurrently modified to enforce atomicity or if many files are + expected to be empty as an extra request is required for empty files + if max_connections is greater than 1. + :param int timeout: + The timeout parameter is expressed in seconds. This method may make + multiple calls to the Azure service and the timeout will apply to + each call individually. + :param str snapshot: + A string that represents the snapshot version, if applicable. + :return: A File with properties, content, and metadata. + :rtype: :class:`~azure.storage.file.models.File` + ''' + _validate_not_none('share_name', share_name) + _validate_not_none('file_name', file_name) + _validate_not_none('encoding', encoding) + + file = self.get_file_to_bytes( + share_name, + directory_name, + file_name, + start_range, + end_range, + validate_content, + progress_callback, + max_connections, + timeout, + snapshot) + + file.content = file.content.decode(encoding) + return file + + def update_range(self, share_name, directory_name, file_name, data, + start_range, end_range, validate_content=False, timeout=None): + ''' + Writes the bytes specified by the request body into the specified range. + + :param str share_name: + Name of existing share. + :param str directory_name: + The path to the directory. + :param str file_name: + Name of existing file. + :param bytes data: + Content of the range. + :param int start_range: + Start of byte range to use for updating a section of the file. + The range can be up to 4 MB in size. + The start_range and end_range params are inclusive. + Ex: start_range=0, end_range=511 will download first 512 bytes of file. + :param int end_range: + End of byte range to use for updating a section of the file. + The range can be up to 4 MB in size. + The start_range and end_range params are inclusive. + Ex: start_range=0, end_range=511 will download first 512 bytes of file. + :param bool validate_content: + If true, calculates an MD5 hash of the page content. The storage + service checks the hash of the content that has arrived + with the hash that was sent. This is primarily valuable for detecting + bitflips on the wire if using http instead of https as https (the default) + will already validate. Note that this MD5 hash is not stored with the + file. + :param int timeout: + The timeout parameter is expressed in seconds. + ''' + _validate_not_none('share_name', share_name) + _validate_not_none('file_name', file_name) + _validate_not_none('data', data) + request = HTTPRequest() + request.method = 'PUT' + request.host_locations = self._get_host_locations() + request.path = _get_path(share_name, directory_name, file_name) + request.query = { + 'comp': 'range', + 'timeout': _int_to_str(timeout), + } + request.headers = { + 'x-ms-write': 'update', + } + _validate_and_format_range_headers( + request, start_range, end_range) + request.body = _get_data_bytes_only('data', data) + + if validate_content: + computed_md5 = _get_content_md5(request.body) + request.headers['Content-MD5'] = _to_str(computed_md5) + + self._perform_request(request) + + def clear_range(self, share_name, directory_name, file_name, start_range, + end_range, timeout=None): + ''' + Clears the specified range and releases the space used in storage for + that range. + + :param str share_name: + Name of existing share. + :param str directory_name: + The path to the directory. + :param str file_name: + Name of existing file. + :param int start_range: + Start of byte range to use for clearing a section of the file. + The range can be up to 4 MB in size. + The start_range and end_range params are inclusive. + Ex: start_range=0, end_range=511 will download first 512 bytes of file. + :param int end_range: + End of byte range to use for clearing a section of the file. + The range can be up to 4 MB in size. + The start_range and end_range params are inclusive. + Ex: start_range=0, end_range=511 will download first 512 bytes of file. + :param int timeout: + The timeout parameter is expressed in seconds. + ''' + _validate_not_none('share_name', share_name) + _validate_not_none('file_name', file_name) + request = HTTPRequest() + request.method = 'PUT' + request.host_locations = self._get_host_locations() + request.path = _get_path(share_name, directory_name, file_name) + request.query = { + 'comp': 'range', + 'timeout': _int_to_str(timeout), + } + request.headers = { + 'Content-Length': '0', + 'x-ms-write': 'clear', + } + _validate_and_format_range_headers( + request, start_range, end_range) + + self._perform_request(request) + + def list_ranges(self, share_name, directory_name, file_name, + start_range=None, end_range=None, timeout=None, snapshot=None): + ''' + Retrieves the valid ranges for a file. + + :param str share_name: + Name of existing share. + :param str directory_name: + The path to the directory. + :param str file_name: + Name of existing file. + :param int start_range: + Specifies the start offset of bytes over which to list ranges. + The start_range and end_range params are inclusive. + Ex: start_range=0, end_range=511 will download first 512 bytes of file. + :param int end_range: + Specifies the end offset of bytes over which to list ranges. + The start_range and end_range params are inclusive. + Ex: start_range=0, end_range=511 will download first 512 bytes of file. + :param int timeout: + The timeout parameter is expressed in seconds. + :param str snapshot: + A string that represents the snapshot version, if applicable. + :returns: a list of valid ranges + :rtype: a list of :class:`~azure.storage.file.models.FileRange` + ''' + _validate_not_none('share_name', share_name) + _validate_not_none('file_name', file_name) + request = HTTPRequest() + request.method = 'GET' + request.host_locations = self._get_host_locations() + request.path = _get_path(share_name, directory_name, file_name) + request.query = { + 'comp': 'rangelist', + 'timeout': _int_to_str(timeout), + 'sharesnapshot': _to_str(snapshot), + } + if start_range is not None: + _validate_and_format_range_headers( + request, + start_range, + end_range, + start_range_required=False, + end_range_required=False) + + return self._perform_request(request, _convert_xml_to_ranges) diff --git a/src/storage-preview/azext_storage_preview/azure_storage/file/models.py b/src/storage-preview/azext_storage_preview/azure_storage/file/models.py new file mode 100644 index 00000000000..2c41ccaab82 --- /dev/null +++ b/src/storage-preview/azext_storage_preview/azure_storage/file/models.py @@ -0,0 +1,407 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- +from azure.storage.common._common_conversion import _to_str + + +class Share(object): + ''' + File share class. + + :ivar str name: + The name of the share. + :ivar ShareProperties properties: + System properties for the share. + :ivar metadata: + A dict containing name-value pairs associated with the share as metadata. + This var is set to None unless the include=metadata param was included + for the list shares operation. If this parameter was specified but the + share has no metadata, metadata will be set to an empty dictionary. + :vartype metadata: dict(str, str) + :ivar str snapshot: + A DateTime value that uniquely identifies the snapshot. The value of + this header indicates the snapshot version, and may be used in + subsequent requests to access the snapshot. + ''' + + def __init__(self, name=None, props=None, metadata=None, snapshot=None): + self.name = name + self.properties = props or ShareProperties() + self.metadata = metadata + self.snapshot = snapshot + + +class ShareProperties(object): + ''' + File share's properties class. + + :ivar datetime last_modified: + A datetime object representing the last time the share was modified. + :ivar str etag: + The ETag contains a value that you can use to perform operations + conditionally. + :ivar int quote: + Returns the current share quota in GB. + ''' + + def __init__(self): + self.last_modified = None + self.etag = None + self.quota = None + + +class Directory(object): + ''' + Directory class. + + :ivar str name: + The name of the directory. + :ivar DirectoryProperties properties: + System properties for the directory. + :ivar metadata: + A dict containing name-value pairs associated with the directory as metadata. + This var is set to None unless the include=metadata param was included + for the list directory operation. If this parameter was specified but the + directory has no metadata, metadata will be set to an empty dictionary. + :vartype metadata: dict(str, str) + ''' + + def __init__(self, name=None, props=None, metadata=None): + self.name = name + self.properties = props or DirectoryProperties() + self.metadata = metadata + + +class DirectoryProperties(object): + ''' + File directory's properties class. + + :ivar datetime last_modified: + A datetime object representing the last time the directory was modified. + :ivar str etag: + The ETag contains a value that you can use to perform operations + conditionally. + :ivar bool server_encrypted: + Set to true if the directory metadata is encrypted on the server. + ''' + + def __init__(self): + self.last_modified = None + self.etag = None + self.server_encrypted = None + + +class File(object): + ''' + File class. + + :ivar str name: + The name of the file. + :ivar content: + File content. + :vartype content: str or bytes + :ivar FileProperties properties: + System properties for the file. + :ivar metadata: + A dict containing name-value pairs associated with the file as metadata. + This var is set to None unless the include=metadata param was included + for the list file operation. If this parameter was specified but the + file has no metadata, metadata will be set to an empty dictionary. + :vartype metadata: dict(str, str) + ''' + + def __init__(self, name=None, content=None, props=None, metadata=None): + self.name = name + self.content = content + self.properties = props or FileProperties() + self.metadata = metadata + + +class FileProperties(object): + ''' + File Properties. + + :ivar datetime last_modified: + A datetime object representing the last time the file was modified. + :ivar str etag: + The ETag contains a value that you can use to perform operations + conditionally. + :ivar int content_length: + The length of the content returned. If the entire blob was requested, + the length of blob in bytes. If a subset of the blob was requested, the + length of the returned subset. + :ivar str content_range: + Indicates the range of bytes returned in the event that the client + requested a subset of the blob. + :ivar ~azure.storage.file.models.ContentSettings content_settings: + Stores all the content settings for the file. + :ivar ~azure.storage.file.models.CopyProperties copy: + Stores all the copy properties for the file. + ivar bool server_encrypted: + Set to true if the file data and application metadata are completely encrypted. + ''' + + def __init__(self): + self.last_modified = None + self.etag = None + self.content_length = None + self.content_range = None + self.content_settings = ContentSettings() + self.copy = CopyProperties() + self.server_encrypted = None + + +class ContentSettings(object): + ''' + Used to store the content settings of a file. + + :ivar str content_type: + The content type specified for the file. If no content type was + specified, the default content type is application/octet-stream. + :ivar str content_encoding: + If content_encoding has previously been set + for the file, that value is stored. + :ivar str content_language: + If content_language has previously been set + for the file, that value is stored. + :ivar str content_disposition: + content_disposition conveys additional information about how to + process the response payload, and also can be used to attach + additional metadata. If content_disposition has previously been set + for the file, that value is stored. + :ivar str cache_control: + If cache_control has previously been set for + the file, that value is stored. + :ivar str content_md5: + If the content_md5 has been set for the file, this response + header is stored so that the client can check for message content + integrity. + ''' + + def __init__( + self, content_type=None, content_encoding=None, + content_language=None, content_disposition=None, + cache_control=None, content_md5=None): + self.content_type = content_type + self.content_encoding = content_encoding + self.content_language = content_language + self.content_disposition = content_disposition + self.cache_control = cache_control + self.content_md5 = content_md5 + + def _to_headers(self): + return { + 'x-ms-cache-control': _to_str(self.cache_control), + 'x-ms-content-type': _to_str(self.content_type), + 'x-ms-content-disposition': _to_str(self.content_disposition), + 'x-ms-content-md5': _to_str(self.content_md5), + 'x-ms-content-encoding': _to_str(self.content_encoding), + 'x-ms-content-language': _to_str(self.content_language), + } + + +class CopyProperties(object): + ''' + File Copy Properties. + + :ivar str id: + String identifier for the last attempted Copy File operation where this file + was the destination file. This header does not appear if this file has never + been the destination in a Copy File operation, or if this file has been + modified after a concluded Copy File operation using Set File Properties or + Put File. + :ivar str source: + URL up to 2 KB in length that specifies the source file used in the last attempted + Copy File operation where this file was the destination file. This header does not + appear if this file has never been the destination in a Copy File operation, or if + this file has been modified after a concluded Copy File operation using + Set File Properties or Put File. + :ivar str status: + State of the copy operation identified by Copy ID, with these values: + success: + Copy completed successfully. + pending: + Copy is in progress. Check copy_status_description if intermittent, + non-fatal errors impede copy progress but don't cause failure. + aborted: + Copy was ended by Abort Copy File. + failed: + Copy failed. See copy_status_description for failure details. + :ivar str progress: + Contains the number of bytes copied and the total bytes in the source in the last + attempted Copy File operation where this file was the destination file. Can show + between 0 and Content-Length bytes copied. + :ivar datetime completion_time: + Conclusion time of the last attempted Copy File operation where this file was the + destination file. This value can specify the time of a completed, aborted, or + failed copy attempt. + :ivar str status_description: + Only appears when x-ms-copy-status is failed or pending. Describes cause of fatal + or non-fatal copy operation failure. + ''' + + def __init__(self): + self.id = None + self.source = None + self.status = None + self.progress = None + self.completion_time = None + self.status_description = None + + +class FileRange(object): + ''' + File Range. + + :ivar int start: + Byte index for start of file range. + :ivar int end: + Byte index for end of file range. + ''' + + def __init__(self, start=None, end=None): + self.start = start + self.end = end + + +class DeleteSnapshot(object): + ''' + Required if the Share has associated snapshots. Specifies how to handle the snapshots. + ''' + + Include = 'include' + ''' + Delete the share and all of its snapshots. + ''' + + +class FilePermissions(object): + ''' + FilePermissions class to be used with + :func:`~azure.storage.file.fileservice.FileService.generate_file_shared_access_signature` API. + + :ivar FilePermissions FilePermissions.CREATE: + Create a new file or copy a file to a new file. + :ivar FilePermissions FilePermissions.DELETE: + Delete the file. + :ivar FilePermissions FilePermissions.READ: + Read the content, properties, metadata. Use the file as the source of a copy + operation. + :ivar FilePermissions FilePermissions.WRITE: + Create or write content, properties, metadata. Resize the file. Use the file + as the destination of a copy operation within the same account. + ''' + + def __init__(self, read=False, create=False, write=False, delete=False, + _str=None): + ''' + :param bool read: + Read the content, properties, metadata. Use the file as the source of a copy + operation. + :param bool create: + Create a new file or copy a file to a new file. + :param bool write: + Create or write content, properties, metadata. Resize the file. Use the file + as the destination of a copy operation within the same account. + :param bool delete: + Delete the file. + :param str _str: + A string representing the permissions. + ''' + + if not _str: + _str = '' + self.read = read or ('r' in _str) + self.create = create or ('c' in _str) + self.write = write or ('w' in _str) + self.delete = delete or ('d' in _str) + + def __or__(self, other): + return FilePermissions(_str=str(self) + str(other)) + + def __add__(self, other): + return FilePermissions(_str=str(self) + str(other)) + + def __str__(self): + return (('r' if self.read else '') + + ('c' if self.create else '') + + ('w' if self.write else '') + + ('d' if self.delete else '')) + + +FilePermissions.CREATE = FilePermissions(create=True) +FilePermissions.DELETE = FilePermissions(delete=True) +FilePermissions.READ = FilePermissions(read=True) +FilePermissions.WRITE = FilePermissions(write=True) + + +class SharePermissions(object): + ''' + SharePermissions class to be used with `azure.storage.file.FileService.generate_share_shared_access_signature` + method and for the AccessPolicies used with `azure.storage.file.FileService.set_share_acl`. + + :ivar SharePermissions FilePermissions.DELETE: + Delete any file in the share. + Note: You cannot grant permissions to delete a share with a service SAS. Use + an account SAS instead. + :ivar SharePermissions FilePermissions.LIST: + List files and directories in the share. + :ivar SharePermissions FilePermissions.READ: + Read the content, properties or metadata of any file in the share. Use any + file in the share as the source of a copy operation. + :ivar SharePermissions FilePermissions.WRITE: + For any file in the share, create or write content, properties or metadata. + Resize the file. Use the file as the destination of a copy operation within + the same account. + Note: You cannot grant permissions to read or write share properties or + metadata with a service SAS. Use an account SAS instead. + ''' + + def __init__(self, read=False, write=False, delete=False, list=False, + _str=None): + ''' + :param bool read: + Read the content, properties or metadata of any file in the share. Use any + file in the share as the source of a copy operation. + :param bool write: + For any file in the share, create or write content, properties or metadata. + Resize the file. Use the file as the destination of a copy operation within + the same account. + Note: You cannot grant permissions to read or write share properties or + metadata with a service SAS. Use an account SAS instead. + :param bool delete: + Delete any file in the share. + Note: You cannot grant permissions to delete a share with a service SAS. Use + an account SAS instead. + :param bool list: + List files and directories in the share. + :param str _str: + A string representing the permissions + ''' + + if not _str: + _str = '' + self.read = read or ('r' in _str) + self.write = write or ('w' in _str) + self.delete = delete or ('d' in _str) + self.list = list or ('l' in _str) + + def __or__(self, other): + return SharePermissions(_str=str(self) + str(other)) + + def __add__(self, other): + return SharePermissions(_str=str(self) + str(other)) + + def __str__(self): + return (('r' if self.read else '') + + ('w' if self.write else '') + + ('d' if self.delete else '') + + ('l' if self.list else '')) + + +SharePermissions.DELETE = SharePermissions(delete=True) +SharePermissions.LIST = SharePermissions(list=True) +SharePermissions.READ = SharePermissions(read=True) +SharePermissions.WRITE = SharePermissions(write=True) diff --git a/src/storage-preview/azext_storage_preview/azure_storage/file/sharedaccesssignature.py b/src/storage-preview/azext_storage_preview/azure_storage/file/sharedaccesssignature.py new file mode 100644 index 00000000000..afa53199f3d --- /dev/null +++ b/src/storage-preview/azext_storage_preview/azure_storage/file/sharedaccesssignature.py @@ -0,0 +1,188 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- + +from azure.storage.common.sharedaccesssignature import ( + SharedAccessSignature, + _SharedAccessHelper, +) +from azure.storage.common._common_conversion import ( + _to_str, +) +from ._constants import X_MS_VERSION + + +class FileSharedAccessSignature(SharedAccessSignature): + ''' + Provides a factory for creating file and share access + signature tokens with a common account name and account key. Users can either + use the factory or can construct the appropriate service and use the + generate_*_shared_access_signature method directly. + ''' + + def __init__(self, account_name, account_key): + ''' + :param str account_name: + The storage account name used to generate the shared access signatures. + :param str account_key: + The access key to generate the shares access signatures. + ''' + super(FileSharedAccessSignature, self).__init__(account_name, account_key, x_ms_version=X_MS_VERSION) + + def generate_file(self, share_name, directory_name=None, file_name=None, + permission=None, expiry=None, start=None, id=None, + ip=None, protocol=None, cache_control=None, + content_disposition=None, content_encoding=None, + content_language=None, content_type=None): + ''' + Generates a shared access signature for the file. + Use the returned signature with the sas_token parameter of FileService. + + :param str share_name: + Name of share. + :param str directory_name: + Name of directory. SAS tokens cannot be created for directories, so + this parameter should only be present if file_name is provided. + :param str file_name: + Name of file. + :param FilePermissions permission: + The permissions associated with the shared access signature. The + user is restricted to operations allowed by the permissions. + Permissions must be ordered read, create, write, delete, list. + Required unless an id is given referencing a stored access policy + which contains this field. This field must be omitted if it has been + specified in an associated stored access policy. + :param expiry: + The time at which the shared access signature becomes invalid. + Required unless an id is given referencing a stored access policy + which contains this field. This field must be omitted if it has + been specified in an associated stored access policy. Azure will always + convert values to UTC. If a date is passed in without timezone info, it + is assumed to be UTC. + :type expiry: datetime or str + :param start: + The time at which the shared access signature becomes valid. If + omitted, start time for this call is assumed to be the time when the + storage service receives the request. Azure will always convert values + to UTC. If a date is passed in without timezone info, it is assumed to + be UTC. + :type start: datetime or str + :param str id: + A unique value up to 64 characters in length that correlates to a + stored access policy. To create a stored access policy, use + set_file_service_properties. + :param str ip: + Specifies an IP address or a range of IP addresses from which to accept requests. + If the IP address from which the request originates does not match the IP address + or address range specified on the SAS token, the request is not authenticated. + For example, specifying sip=168.1.5.65 or sip=168.1.5.60-168.1.5.70 on the SAS + restricts the request to those IP addresses. + :param str protocol: + Specifies the protocol permitted for a request made. The default value + is https,http. See :class:`~azure.storage.common.models.Protocol` for possible values. + :param str cache_control: + Response header value for Cache-Control when resource is accessed + using this shared access signature. + :param str content_disposition: + Response header value for Content-Disposition when resource is accessed + using this shared access signature. + :param str content_encoding: + Response header value for Content-Encoding when resource is accessed + using this shared access signature. + :param str content_language: + Response header value for Content-Language when resource is accessed + using this shared access signature. + :param str content_type: + Response header value for Content-Type when resource is accessed + using this shared access signature. + ''' + resource_path = share_name + if directory_name is not None: + resource_path += '/' + _to_str(directory_name) + resource_path += '/' + _to_str(file_name) + + sas = _SharedAccessHelper() + sas.add_base(permission, expiry, start, ip, protocol, self.x_ms_version) + sas.add_id(id) + sas.add_resource('f') + sas.add_override_response_headers(cache_control, content_disposition, + content_encoding, content_language, + content_type) + sas.add_resource_signature(self.account_name, self.account_key, 'file', resource_path) + + return sas.get_token() + + def generate_share(self, share_name, permission=None, expiry=None, + start=None, id=None, ip=None, protocol=None, + cache_control=None, content_disposition=None, + content_encoding=None, content_language=None, + content_type=None): + ''' + Generates a shared access signature for the share. + Use the returned signature with the sas_token parameter of FileService. + + :param str share_name: + Name of share. + :param SharePermissions permission: + The permissions associated with the shared access signature. The + user is restricted to operations allowed by the permissions. + Permissions must be ordered read, create, write, delete, list. + Required unless an id is given referencing a stored access policy + which contains this field. This field must be omitted if it has been + specified in an associated stored access policy. + :param expiry: + The time at which the shared access signature becomes invalid. + Required unless an id is given referencing a stored access policy + which contains this field. This field must be omitted if it has + been specified in an associated stored access policy. Azure will always + convert values to UTC. If a date is passed in without timezone info, it + is assumed to be UTC. + :type expiry: datetime or str + :param start: + The time at which the shared access signature becomes valid. If + omitted, start time for this call is assumed to be the time when the + storage service receives the request. Azure will always convert values + to UTC. If a date is passed in without timezone info, it is assumed to + be UTC. + :type start: datetime or str + :param str id: + A unique value up to 64 characters in length that correlates to a + stored access policy. To create a stored access policy, use + set_file_service_properties. + :param str ip: + Specifies an IP address or a range of IP addresses from which to accept requests. + If the IP address from which the request originates does not match the IP address + or address range specified on the SAS token, the request is not authenticated. + For example, specifying sip=168.1.5.65 or sip=168.1.5.60-168.1.5.70 on the SAS + restricts the request to those IP addresses. + :param str protocol: + Specifies the protocol permitted for a request made. The default value + is https,http. See :class:`~azure.storage.common.models.Protocol` for possible values. + :param str cache_control: + Response header value for Cache-Control when resource is accessed + using this shared access signature. + :param str content_disposition: + Response header value for Content-Disposition when resource is accessed + using this shared access signature. + :param str content_encoding: + Response header value for Content-Encoding when resource is accessed + using this shared access signature. + :param str content_language: + Response header value for Content-Language when resource is accessed + using this shared access signature. + :param str content_type: + Response header value for Content-Type when resource is accessed + using this shared access signature. + ''' + sas = _SharedAccessHelper() + sas.add_base(permission, expiry, start, ip, protocol, self.x_ms_version) + sas.add_id(id) + sas.add_resource('s') + sas.add_override_response_headers(cache_control, content_disposition, + content_encoding, content_language, + content_type) + sas.add_resource_signature(self.account_name, self.account_key, 'file', share_name) + + return sas.get_token() diff --git a/src/storage-preview/azext_storage_preview/azure_storage/queue/__init__.py b/src/storage-preview/azext_storage_preview/azure_storage/queue/__init__.py new file mode 100644 index 00000000000..0c64f78907f --- /dev/null +++ b/src/storage-preview/azext_storage_preview/azure_storage/queue/__init__.py @@ -0,0 +1,13 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- +from .models import ( + Queue, + QueueMessage, + QueuePermissions, + QueueMessageFormat, +) + +from .queueservice import QueueService diff --git a/src/storage-preview/azext_storage_preview/azure_storage/queue/_constants.py b/src/storage-preview/azext_storage_preview/azure_storage/queue/_constants.py new file mode 100644 index 00000000000..9ec0ece8853 --- /dev/null +++ b/src/storage-preview/azext_storage_preview/azure_storage/queue/_constants.py @@ -0,0 +1,11 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- + +__author__ = 'Microsoft Corp. ' +__version__ = '1.2.0rc0' + +# x-ms-version for storage service. +X_MS_VERSION = '2017-11-09' diff --git a/src/storage-preview/azext_storage_preview/azure_storage/queue/_deserialization.py b/src/storage-preview/azext_storage_preview/azure_storage/queue/_deserialization.py new file mode 100644 index 00000000000..dc8bf04b8c5 --- /dev/null +++ b/src/storage-preview/azext_storage_preview/azure_storage/queue/_deserialization.py @@ -0,0 +1,150 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- +from dateutil import parser + +try: + from xml.etree import cElementTree as ETree +except ImportError: + from xml.etree import ElementTree as ETree + +from .models import ( + Queue, + QueueMessage, +) +from azure.storage.common.models import ( + _list, +) +from azure.storage.common._deserialization import ( + _to_int, + _parse_metadata, +) +from ._encryption import ( + _decrypt_queue_message, +) + + +def _parse_metadata_and_message_count(response): + ''' + Extracts approximate messages count header. + ''' + metadata = _parse_metadata(response) + metadata.approximate_message_count = _to_int(response.headers.get('x-ms-approximate-messages-count')) + + return metadata + + +def _parse_queue_message_from_headers(response): + ''' + Extracts pop receipt and time next visible from headers. + ''' + message = QueueMessage() + message.pop_receipt = response.headers.get('x-ms-popreceipt') + message.time_next_visible = parser.parse(response.headers.get('x-ms-time-next-visible')) + + return message + + +def _convert_xml_to_queues(response): + ''' + + + string-value + string-value + int-value + + + string-value + + value + + + + + ''' + if response is None or response.body is None: + return None + + queues = _list() + list_element = ETree.fromstring(response.body) + + # Set next marker + next_marker = list_element.findtext('NextMarker') or None + setattr(queues, 'next_marker', next_marker) + + queues_element = list_element.find('Queues') + + for queue_element in queues_element.findall('Queue'): + # Name element + queue = Queue() + queue.name = queue_element.findtext('Name') + + # Metadata + metadata_root_element = queue_element.find('Metadata') + if metadata_root_element is not None: + queue.metadata = dict() + for metadata_element in metadata_root_element: + queue.metadata[metadata_element.tag] = metadata_element.text + + # Add queue to list + queues.append(queue) + + return queues + + +def _convert_xml_to_queue_messages(response, decode_function, require_encryption, key_encryption_key, resolver, + content=None): + ''' + + + + string-message-id + insertion-time + expiration-time + opaque-string-receipt-data + time-next-visible + integer + message-body + + + ''' + if response is None or response.body is None: + return None + + messages = list() + list_element = ETree.fromstring(response.body) + + for message_element in list_element.findall('QueueMessage'): + message = QueueMessage() + + message.id = message_element.findtext('MessageId') + + dequeue_count = message_element.findtext('DequeueCount') + if dequeue_count is not None: + message.dequeue_count = _to_int(dequeue_count) + + # content is not returned for put_message + if content is not None: + message.content = content + else: + message.content = message_element.findtext('MessageText') + if (key_encryption_key is not None) or (resolver is not None): + message.content = _decrypt_queue_message(message.content, require_encryption, + key_encryption_key, resolver) + message.content = decode_function(message.content) + + message.insertion_time = parser.parse(message_element.findtext('InsertionTime')) + message.expiration_time = parser.parse(message_element.findtext('ExpirationTime')) + + message.pop_receipt = message_element.findtext('PopReceipt') + + time_next_visible = message_element.find('TimeNextVisible') + if time_next_visible is not None: + message.time_next_visible = parser.parse(time_next_visible.text) + + # Add message to list + messages.append(message) + + return messages diff --git a/src/storage-preview/azext_storage_preview/azure_storage/queue/_encryption.py b/src/storage-preview/azext_storage_preview/azure_storage/queue/_encryption.py new file mode 100644 index 00000000000..8655e253b33 --- /dev/null +++ b/src/storage-preview/azext_storage_preview/azure_storage/queue/_encryption.py @@ -0,0 +1,159 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- + +import os +from json import ( + dumps, + loads, +) + +from azure.common import ( + AzureException, +) +from cryptography.hazmat.primitives.padding import PKCS7 + +from azure.storage.common._common_conversion import ( + _encode_base64, + _decode_base64_to_bytes +) +from azure.storage.common._encryption import ( + _generate_encryption_data_dict, + _dict_to_encryption_data, + _generate_AES_CBC_cipher, + _validate_and_unwrap_cek, + _EncryptionAlgorithm, +) +from azure.storage.common._error import ( + _ERROR_DECRYPTION_FAILURE, + _ERROR_UNSUPPORTED_ENCRYPTION_ALGORITHM, + _validate_not_none, + _validate_key_encryption_key_wrap, +) +from ._error import ( + _ERROR_MESSAGE_NOT_ENCRYPTED +) + + +def _encrypt_queue_message(message, key_encryption_key): + ''' + Encrypts the given plain text message using AES256 in CBC mode with 128 bit padding. + Wraps the generated content-encryption-key using the user-provided key-encryption-key (kek). + Returns a json-formatted string containing the encrypted message and the encryption metadata. + + :param object message: + The plain text messge to be encrypted. + :param object key_encryption_key: + The user-provided key-encryption-key. Must implement the following methods: + wrap_key(key)--wraps the specified key using an algorithm of the user's choice. + get_key_wrap_algorithm()--returns the algorithm used to wrap the specified symmetric key. + get_kid()--returns a string key id for this key-encryption-key. + :return: A json-formatted string containing the encrypted message and the encryption metadata. + :rtype: str + ''' + + _validate_not_none('message', message) + _validate_not_none('key_encryption_key', key_encryption_key) + _validate_key_encryption_key_wrap(key_encryption_key) + + # AES256 uses 256 bit (32 byte) keys and always with 16 byte blocks + content_encryption_key = os.urandom(32) + initialization_vector = os.urandom(16) + + # Queue encoding functions all return unicode strings, and encryption should + # operate on binary strings. + message = message.encode('utf-8') + + cipher = _generate_AES_CBC_cipher(content_encryption_key, initialization_vector) + + # PKCS7 with 16 byte blocks ensures compatibility with AES. + padder = PKCS7(128).padder() + padded_data = padder.update(message) + padder.finalize() + + # Encrypt the data. + encryptor = cipher.encryptor() + encrypted_data = encryptor.update(padded_data) + encryptor.finalize() + + # Build the dictionary structure. + queue_message = {'EncryptedMessageContents': _encode_base64(encrypted_data), + 'EncryptionData': _generate_encryption_data_dict(key_encryption_key, + content_encryption_key, + initialization_vector)} + + return dumps(queue_message) + + +def _decrypt_queue_message(message, require_encryption, key_encryption_key, resolver): + ''' + Returns the decrypted message contents from an EncryptedQueueMessage. + If no encryption metadata is present, will return the unaltered message. + :param str message: + The JSON formatted QueueEncryptedMessage contents with all associated metadata. + :param bool require_encryption: + If set, will enforce that the retrieved messages are encrypted and decrypt them. + :param object key_encryption_key: + The user-provided key-encryption-key. Must implement the following methods: + unwrap_key(key, algorithm)--returns the unwrapped form of the specified symmetric key using the string-specified algorithm. + get_kid()--returns a string key id for this key-encryption-key. + :param function resolver(kid): + The user-provided key resolver. Uses the kid string to return a key-encryption-key implementing the interface defined above. + :return: The plain text message from the queue message. + :rtype: str + ''' + + try: + message = loads(message) + + encryption_data = _dict_to_encryption_data(message['EncryptionData']) + decoded_data = _decode_base64_to_bytes(message['EncryptedMessageContents']) + except (KeyError, ValueError): + # Message was not json formatted and so was not encrypted + # or the user provided a json formatted message. + if require_encryption: + raise ValueError(_ERROR_MESSAGE_NOT_ENCRYPTED) + else: + return message + try: + return _decrypt(decoded_data, encryption_data, key_encryption_key, resolver).decode('utf-8') + except Exception: + raise AzureException(_ERROR_DECRYPTION_FAILURE) + + +def _decrypt(message, encryption_data, key_encryption_key=None, resolver=None): + ''' + Decrypts the given ciphertext using AES256 in CBC mode with 128 bit padding. + Unwraps the content-encryption-key using the user-provided or resolved key-encryption-key (kek). Returns the original plaintex. + + :param str message: + The ciphertext to be decrypted. + :param _EncryptionData encryption_data: + The metadata associated with this ciphertext. + :param object key_encryption_key: + The user-provided key-encryption-key. Must implement the following methods: + unwrap_key(key, algorithm)--returns the unwrapped form of the specified symmetric key using the string-specified algorithm. + get_kid()--returns a string key id for this key-encryption-key. + :param function resolver(kid): + The user-provided key resolver. Uses the kid string to return a key-encryption-key implementing the interface defined above. + :return: The decrypted plaintext. + :rtype: str + ''' + _validate_not_none('message', message) + content_encryption_key = _validate_and_unwrap_cek(encryption_data, key_encryption_key, resolver) + + if not (_EncryptionAlgorithm.AES_CBC_256 == encryption_data.encryption_agent.encryption_algorithm): + raise ValueError(_ERROR_UNSUPPORTED_ENCRYPTION_ALGORITHM) + + cipher = _generate_AES_CBC_cipher(content_encryption_key, encryption_data.content_encryption_IV) + + # decrypt data + decrypted_data = message + decryptor = cipher.decryptor() + decrypted_data = (decryptor.update(decrypted_data) + decryptor.finalize()) + + # unpad data + unpadder = PKCS7(128).unpadder() + decrypted_data = (unpadder.update(decrypted_data) + unpadder.finalize()) + + return decrypted_data diff --git a/src/storage-preview/azext_storage_preview/azure_storage/queue/_error.py b/src/storage-preview/azext_storage_preview/azure_storage/queue/_error.py new file mode 100644 index 00000000000..aa64fe145c3 --- /dev/null +++ b/src/storage-preview/azext_storage_preview/azure_storage/queue/_error.py @@ -0,0 +1,27 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- +import sys + +from azure.storage.common._error import ( + _validate_type_bytes, +) + +_ERROR_MESSAGE_SHOULD_BE_UNICODE = 'message should be of type unicode.' +_ERROR_MESSAGE_SHOULD_BE_STR = 'message should be of type str.' +_ERROR_MESSAGE_NOT_BASE64 = 'message is not a valid base64 value.' +_ERROR_MESSAGE_NOT_ENCRYPTED = 'Message was not encrypted.' + +def _validate_message_type_text(param): + if sys.version_info < (3,): + if not isinstance(param, unicode): + raise TypeError(_ERROR_MESSAGE_SHOULD_BE_UNICODE) + else: + if not isinstance(param, str): + raise TypeError(_ERROR_MESSAGE_SHOULD_BE_STR) + + +def _validate_message_type_bytes(param): + _validate_type_bytes('message', param) diff --git a/src/storage-preview/azext_storage_preview/azure_storage/queue/_serialization.py b/src/storage-preview/azext_storage_preview/azure_storage/queue/_serialization.py new file mode 100644 index 00000000000..9dde20595e0 --- /dev/null +++ b/src/storage-preview/azext_storage_preview/azure_storage/queue/_serialization.py @@ -0,0 +1,73 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- +import sys + +if sys.version_info >= (3,): + from io import BytesIO +else: + try: + from cStringIO import StringIO as BytesIO + except: + from StringIO import StringIO as BytesIO + +try: + from xml.etree import cElementTree as ETree +except ImportError: + from xml.etree import ElementTree as ETree + +from azure.storage.common._common_conversion import ( + _str, +) +from ._encryption import ( + _encrypt_queue_message, +) + + +def _get_path(queue_name=None, include_messages=None, message_id=None): + ''' + Creates the path to access a queue resource. + + queue_name: + Name of queue. + include_messages: + Whether or not to include messages. + message_id: + Message id. + ''' + if queue_name and include_messages and message_id: + return '/{0}/messages/{1}'.format(_str(queue_name), message_id) + if queue_name and include_messages: + return '/{0}/messages'.format(_str(queue_name)) + elif queue_name: + return '/{0}'.format(_str(queue_name)) + else: + return '/' + + +def _convert_queue_message_xml(message_text, encode_function, key_encryption_key): + ''' + + + + + ''' + queue_message_element = ETree.Element('QueueMessage') + + # Enabled + message_text = encode_function(message_text) + if key_encryption_key is not None: + message_text = _encrypt_queue_message(message_text, key_encryption_key) + ETree.SubElement(queue_message_element, 'MessageText').text = message_text + + # Add xml declaration and serialize + try: + stream = BytesIO() + ETree.ElementTree(queue_message_element).write(stream, xml_declaration=True, encoding='utf-8', method='xml') + output = stream.getvalue() + finally: + stream.close() + + return output diff --git a/src/storage-preview/azext_storage_preview/azure_storage/queue/models.py b/src/storage-preview/azext_storage_preview/azure_storage/queue/models.py new file mode 100644 index 00000000000..fb3932a608d --- /dev/null +++ b/src/storage-preview/azext_storage_preview/azure_storage/queue/models.py @@ -0,0 +1,239 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- +from base64 import ( + b64encode, + b64decode, +) +from xml.sax.saxutils import escape as xml_escape +from xml.sax.saxutils import unescape as xml_unescape + +from ._error import ( + _validate_message_type_bytes, + _validate_message_type_text, + _ERROR_MESSAGE_NOT_BASE64, +) + + +class Queue(object): + ''' + Queue class. + + :ivar str name: + The name of the queue. + :ivar metadata: + A dict containing name-value pairs associated with the queue as metadata. + This var is set to None unless the include=metadata param was included + for the list queues operation. If this parameter was specified but the + queue has no metadata, metadata will be set to an empty dictionary. + :vartype metadata: dict(str, str) + ''' + + def __init__(self): + self.name = None + self.metadata = None + + +class QueueMessage(object): + ''' + Queue message class. + + :ivar str id: + A GUID value assigned to the message by the Queue service that + identifies the message in the queue. This value may be used together + with the value of pop_receipt to delete a message from the queue after + it has been retrieved with the get messages operation. + :ivar date insertion_time: + A UTC date value representing the time the messages was inserted. + :ivar date expiration_time: + A UTC date value representing the time the message expires. + :ivar int dequeue_count: + Begins with a value of 1 the first time the message is dequeued. This + value is incremented each time the message is subsequently dequeued. + :ivar obj content: + The message content. Type is determined by the decode_function set on + the service. Default is str. + :ivar str pop_receipt: + A receipt str which can be used together with the message_id element to + delete a message from the queue after it has been retrieved with the get + messages operation. Only returned by get messages operations. Set to + None for peek messages. + :ivar date time_next_visible: + A UTC date value representing the time the message will next be visible. + Only returned by get messages operations. Set to None for peek messages. + ''' + + def __init__(self): + self.id = None + self.insertion_time = None + self.expiration_time = None + self.dequeue_count = None + self.content = None + self.pop_receipt = None + self.time_next_visible = None + + +class QueueMessageFormat: + ''' + Encoding and decoding methods which can be used to modify how the queue service + encodes and decodes queue messages. Set these to queueservice.encode_function + and queueservice.decode_function to modify the behavior. The defaults are + text_xmlencode and text_xmldecode, respectively. + ''' + + @staticmethod + def text_base64encode(data): + ''' + Base64 encode unicode text. + + :param str data: String to encode. + :return: Base64 encoded string. + :rtype: str + ''' + _validate_message_type_text(data) + return b64encode(data.encode('utf-8')).decode('utf-8') + + @staticmethod + def text_base64decode(data): + ''' + Base64 decode to unicode text. + + :param str data: String data to decode to unicode. + :return: Base64 decoded string. + :rtype: str + ''' + try: + return b64decode(data.encode('utf-8')).decode('utf-8') + except (ValueError, TypeError): + # ValueError for Python 3, TypeError for Python 2 + raise ValueError(_ERROR_MESSAGE_NOT_BASE64) + + @staticmethod + def binary_base64encode(data): + ''' + Base64 encode byte strings. + + :param str data: Binary string to encode. + :return: Base64 encoded data. + :rtype: str + ''' + _validate_message_type_bytes(data) + return b64encode(data).decode('utf-8') + + @staticmethod + def binary_base64decode(data): + ''' + Base64 decode to byte string. + + :param str data: Data to decode to a byte string. + :return: Base64 decoded data. + :rtype: str + ''' + try: + return b64decode(data.encode('utf-8')) + except (ValueError, TypeError): + # ValueError for Python 3, TypeError for Python 2 + raise ValueError(_ERROR_MESSAGE_NOT_BASE64) + + @staticmethod + def text_xmlencode(data): + ''' + XML encode unicode text. + + :param str data: Unicode string to encode + :return: XML encoded data. + :rtype: str + ''' + _validate_message_type_text(data) + return xml_escape(data) + + @staticmethod + def text_xmldecode(data): + ''' + XML decode to unicode text. + + :param str data: Data to decode to unicode. + :return: XML decoded data. + :rtype: str + ''' + return xml_unescape(data) + + @staticmethod + def noencode(data): + ''' + Do no encoding. + + :param str data: Data. + :return: The data passed in is returned unmodified. + :rtype: str + ''' + return data + + @staticmethod + def nodecode(data): + ''' + Do no decoding. + + :param str data: Data. + :return: The data passed in is returned unmodified. + :rtype: str + ''' + return data + + +class QueuePermissions(object): + ''' + QueuePermissions class to be used with :func:`~azure.storage.queue.queueservice.QueueService.generate_queue_shared_access_signature` + method and for the AccessPolicies used with :func:`~azure.storage.queue.queueservice.QueueService.set_queue_acl`. + + :ivar QueuePermissions QueuePermissions.READ: + Read metadata and properties, including message count. Peek at messages. + :ivar QueuePermissions QueuePermissions.ADD: + Add messages to the queue. + :ivar QueuePermissions QueuePermissions.UPDATE: + Update messages in the queue. Note: Use the Process permission with + Update so you can first get the message you want to update. + :ivar QueuePermissions QueuePermissions.PROCESS: Delete entities. + Get and delete messages from the queue. + ''' + + def __init__(self, read=False, add=False, update=False, process=False, _str=None): + ''' + :param bool read: + Read metadata and properties, including message count. Peek at messages. + :param bool add: + Add messages to the queue. + :param bool update: + Update messages in the queue. Note: Use the Process permission with + Update so you can first get the message you want to update. + :param bool process: + Get and delete messages from the queue. + :param str _str: + A string representing the permissions. + ''' + if not _str: + _str = '' + self.read = read or ('r' in _str) + self.add = add or ('a' in _str) + self.update = update or ('u' in _str) + self.process = process or ('p' in _str) + + def __or__(self, other): + return QueuePermissions(_str=str(self) + str(other)) + + def __add__(self, other): + return QueuePermissions(_str=str(self) + str(other)) + + def __str__(self): + return (('r' if self.read else '') + + ('a' if self.add else '') + + ('u' if self.update else '') + + ('p' if self.process else '')) + + +QueuePermissions.READ = QueuePermissions(read=True) +QueuePermissions.ADD = QueuePermissions(add=True) +QueuePermissions.UPDATE = QueuePermissions(update=True) +QueuePermissions.PROCESS = QueuePermissions(process=True) diff --git a/src/storage-preview/azext_storage_preview/azure_storage/queue/queueservice.py b/src/storage-preview/azext_storage_preview/azure_storage/queue/queueservice.py new file mode 100644 index 00000000000..6ba5be7e66b --- /dev/null +++ b/src/storage-preview/azext_storage_preview/azure_storage/queue/queueservice.py @@ -0,0 +1,996 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- +from azure.common import ( + AzureConflictHttpError, + AzureHttpError, +) + +from azure.storage.common._auth import ( + _StorageSASAuthentication, + _StorageSharedKeyAuthentication, + _StorageTokenAuthentication, +) +from azure.storage.common._common_conversion import ( + _int_to_str, + _to_str, +) +from azure.storage.common._connection import _ServiceParameters +from azure.storage.common._constants import ( + SERVICE_HOST_BASE, + DEFAULT_PROTOCOL, +) +from azure.storage.common._deserialization import ( + _convert_xml_to_service_properties, + _convert_xml_to_signed_identifiers, + _convert_xml_to_service_stats, +) +from azure.storage.common._error import ( + _dont_fail_not_exist, + _dont_fail_on_exist, + _validate_not_none, + _ERROR_CONFLICT, + _ERROR_STORAGE_MISSING_INFO, + _validate_access_policies, + _validate_encryption_required, + _validate_decryption_required, +) +from azure.storage.common._http import ( + HTTPRequest, +) +from azure.storage.common._serialization import ( + _convert_signed_identifiers_to_xml, + _convert_service_properties_to_xml, +) +from azure.storage.common._serialization import ( + _get_request_body, + _add_metadata_headers, +) +from azure.storage.common.models import ( + Services, + ListGenerator, + _OperationContext, +) +from .sharedaccesssignature import ( + QueueSharedAccessSignature, +) +from azure.storage.common.storageclient import StorageClient +from ._deserialization import ( + _convert_xml_to_queues, + _convert_xml_to_queue_messages, + _parse_queue_message_from_headers, + _parse_metadata_and_message_count, +) +from ._serialization import ( + _convert_queue_message_xml, + _get_path, +) +from .models import ( + QueueMessageFormat, +) +from ._constants import ( + X_MS_VERSION, + __version__ as package_version, +) + +_HTTP_RESPONSE_NO_CONTENT = 204 + + +class QueueService(StorageClient): + ''' + This is the main class managing queue resources. + + The Queue service stores messages. A queue can contain an unlimited number of + messages, each of which can be up to 64KB in size. Messages are generally added + to the end of the queue and retrieved from the front of the queue, although + first in, first out (FIFO) behavior is not guaranteed. + + :ivar function(data) encode_function: + A function used to encode queue messages. Takes as + a parameter the data passed to the put_message API and returns the encoded + message. Defaults to take text and xml encode, but bytes and other + encodings can be used. For example, base64 may be preferable for developing + across multiple Azure Storage libraries in different languages. See the + :class:`~azure.storage.queue.models.QueueMessageFormat` for xml, base64 and + no encoding methods as well as binary equivalents. + :ivar function(data) decode_function: + A function used to encode decode messages. Takes as + a parameter the data returned by the get_messages and peek_messages APIs and + returns the decoded message. Defaults to return text and xml decode, but + bytes and other decodings can be used. For example, base64 may be preferable + for developing across multiple Azure Storage libraries in different languages. + See the :class:`~azure.storage.queue.models.QueueMessageFormat` for xml, base64 + and no decoding methods as well as binary equivalents. + :ivar object key_encryption_key: + The key-encryption-key optionally provided by the user. If provided, will be used to + encrypt/decrypt in supported methods. + For methods requiring decryption, either the key_encryption_key OR the resolver must be provided. + If both are provided, the resolver will take precedence. + Must implement the following methods for APIs requiring encryption: + wrap_key(key)--wraps the specified key (bytes) using an algorithm of the user's choice. Returns the encrypted key as bytes. + get_key_wrap_algorithm()--returns the algorithm used to wrap the specified symmetric key. + get_kid()--returns a string key id for this key-encryption-key. + Must implement the following methods for APIs requiring decryption: + unwrap_key(key, algorithm)--returns the unwrapped form of the specified symmetric key using the string-specified algorithm. + get_kid()--returns a string key id for this key-encryption-key. + :ivar function key_resolver_function(kid): + A function to resolve keys optionally provided by the user. If provided, will be used to decrypt in supported methods. + For methods requiring decryption, either the key_encryption_key OR + the resolver must be provided. If both are provided, the resolver will take precedence. + It uses the kid string to return a key-encryption-key implementing the interface defined above. + :ivar bool require_encryption: + A flag that may be set to ensure that all messages successfully uploaded to the queue and all those downloaded and + successfully read from the queue are/were encrypted while on the server. If this flag is set, all required + parameters for encryption/decryption must be provided. See the above comments on the key_encryption_key and resolver. + ''' + + def __init__(self, account_name=None, account_key=None, sas_token=None, is_emulated=False, + protocol=DEFAULT_PROTOCOL, endpoint_suffix=SERVICE_HOST_BASE, request_session=None, + connection_string=None, socket_timeout=None, token_credential=None): + ''' + :param str account_name: + The storage account name. This is used to authenticate requests + signed with an account key and to construct the storage endpoint. It + is required unless a connection string is given. + :param str account_key: + The storage account key. This is used for shared key authentication. + :param str sas_token: + A shared access signature token to use to authenticate requests + instead of the account key. If account key and sas token are both + specified, account key will be used to sign. + :param bool is_emulated: + Whether to use the emulator. Defaults to False. If specified, will + override all other parameters besides connection string and request + session. + :param str protocol: + The protocol to use for requests. Defaults to https. + :param str endpoint_suffix: + The host base component of the url, minus the account name. Defaults + to Azure (core.windows.net). Override this to use the China cloud + (core.chinacloudapi.cn). + :param requests.Session request_session: + The session object to use for http requests. + :param str connection_string: + If specified, this will override all other parameters besides + request session. See + http://azure.microsoft.com/en-us/documentation/articles/storage-configure-connection-string/ + for the connection string format. + :param int socket_timeout: + If specified, this will override the default socket timeout. The timeout specified is in seconds. + See DEFAULT_SOCKET_TIMEOUT in _constants.py for the default value. + :param token_credential: + A token credential used to authenticate HTTPS requests. The token value + should be updated before its expiration. + :type `~azure.storage.common.TokenCredential` + ''' + service_params = _ServiceParameters.get_service_parameters( + 'queue', + account_name=account_name, + account_key=account_key, + sas_token=sas_token, + token_credential=token_credential, + is_emulated=is_emulated, + protocol=protocol, + endpoint_suffix=endpoint_suffix, + request_session=request_session, + connection_string=connection_string, + socket_timeout=socket_timeout) + + super(QueueService, self).__init__(service_params) + + if self.account_key: + self.authentication = _StorageSharedKeyAuthentication( + self.account_name, + self.account_key, + self.is_emulated + ) + elif self.sas_token: + self.authentication = _StorageSASAuthentication(self.sas_token) + elif self.token_credential: + self.authentication = _StorageTokenAuthentication(self.token_credential) + else: + raise ValueError(_ERROR_STORAGE_MISSING_INFO) + + self.encode_function = QueueMessageFormat.text_xmlencode + self.decode_function = QueueMessageFormat.text_xmldecode + self.key_encryption_key = None + self.key_resolver_function = None + self.require_encryption = False + self._X_MS_VERSION = X_MS_VERSION + self._update_user_agent_string(package_version) + + def generate_account_shared_access_signature(self, resource_types, permission, + expiry, start=None, ip=None, protocol=None): + ''' + Generates a shared access signature for the queue service. + Use the returned signature with the sas_token parameter of QueueService. + + :param ResourceTypes resource_types: + Specifies the resource types that are accessible with the account SAS. + :param AccountPermissions permission: + The permissions associated with the shared access signature. The + user is restricted to operations allowed by the permissions. + Required unless an id is given referencing a stored access policy + which contains this field. This field must be omitted if it has been + specified in an associated stored access policy. + :param expiry: + The time at which the shared access signature becomes invalid. + Required unless an id is given referencing a stored access policy + which contains this field. This field must be omitted if it has + been specified in an associated stored access policy. Azure will always + convert values to UTC. If a date is passed in without timezone info, it + is assumed to be UTC. + :type expiry: datetime or str + :param start: + The time at which the shared access signature becomes valid. If + omitted, start time for this call is assumed to be the time when the + storage service receives the request. Azure will always convert values + to UTC. If a date is passed in without timezone info, it is assumed to + be UTC. + :type start: datetime or str + :param str ip: + Specifies an IP address or a range of IP addresses from which to accept requests. + If the IP address from which the request originates does not match the IP address + or address range specified on the SAS token, the request is not authenticated. + For example, specifying sip=168.1.5.65 or sip=168.1.5.60-168.1.5.70 on the SAS + restricts the request to those IP addresses. + :param str protocol: + Specifies the protocol permitted for a request made. The default value + is https,http. See :class:`~azure.storage.common.models.Protocol` for possible values. + :return: A Shared Access Signature (sas) token. + :rtype: str + ''' + _validate_not_none('self.account_name', self.account_name) + _validate_not_none('self.account_key', self.account_key) + + sas = QueueSharedAccessSignature(self.account_name, self.account_key) + return sas.generate_account(Services.QUEUE, resource_types, permission, + expiry, start=start, ip=ip, protocol=protocol) + + def generate_queue_shared_access_signature(self, queue_name, + permission=None, + expiry=None, + start=None, + id=None, + ip=None, protocol=None, ): + ''' + Generates a shared access signature for the queue. + Use the returned signature with the sas_token parameter of QueueService. + + :param str queue_name: + The name of the queue to create a SAS token for. + :param QueuePermissions permission: + The permissions associated with the shared access signature. The + user is restricted to operations allowed by the permissions. + Required unless an id is given referencing a stored access policy + which contains this field. This field must be omitted if it has been + specified in an associated stored access policy. + :param expiry: + The time at which the shared access signature becomes invalid. + Required unless an id is given referencing a stored access policy + which contains this field. This field must be omitted if it has + been specified in an associated stored access policy. Azure will always + convert values to UTC. If a date is passed in without timezone info, it + is assumed to be UTC. + :type expiry: datetime or str + :param start: + The time at which the shared access signature becomes valid. If + omitted, start time for this call is assumed to be the time when the + storage service receives the request. Azure will always convert values + to UTC. If a date is passed in without timezone info, it is assumed to + be UTC. + :type start: datetime or str + :param str id: + A unique value up to 64 characters in length that correlates to a + stored access policy. To create a stored access policy, use :func:`~set_queue_acl`. + :param str ip: + Specifies an IP address or a range of IP addresses from which to accept requests. + If the IP address from which the request originates does not match the IP address + or address range specified on the SAS token, the request is not authenticated. + For example, specifying sip='168.1.5.65' or sip='168.1.5.60-168.1.5.70' on the SAS + restricts the request to those IP addresses. + :param str protocol: + Specifies the protocol permitted for a request made. The default value + is https,http. See :class:`~azure.storage.common.models.Protocol` for possible values. + :return: A Shared Access Signature (sas) token. + :rtype: str + ''' + _validate_not_none('queue_name', queue_name) + _validate_not_none('self.account_name', self.account_name) + _validate_not_none('self.account_key', self.account_key) + + sas = QueueSharedAccessSignature(self.account_name, self.account_key) + return sas.generate_queue( + queue_name, + permission=permission, + expiry=expiry, + start=start, + id=id, + ip=ip, + protocol=protocol, + ) + + def get_queue_service_stats(self, timeout=None): + ''' + Retrieves statistics related to replication for the Queue service. It is + only available when read-access geo-redundant replication is enabled for + the storage account. + + With geo-redundant replication, Azure Storage maintains your data durable + in two locations. In both locations, Azure Storage constantly maintains + multiple healthy replicas of your data. The location where you read, + create, update, or delete data is the primary storage account location. + The primary location exists in the region you choose at the time you + create an account via the Azure Management Azure classic portal, for + example, North Central US. The location to which your data is replicated + is the secondary location. The secondary location is automatically + determined based on the location of the primary; it is in a second data + center that resides in the same region as the primary location. Read-only + access is available from the secondary location, if read-access geo-redundant + replication is enabled for your storage account. + + :param int timeout: + The timeout parameter is expressed in seconds. + :return: The queue service stats. + :rtype: :class:`~azure.storage.common.models.ServiceStats` + ''' + request = HTTPRequest() + request.method = 'GET' + request.host_locations = self._get_host_locations(primary=False, secondary=True) + request.path = _get_path() + request.query = { + 'restype': 'service', + 'comp': 'stats', + 'timeout': _int_to_str(timeout), + } + + return self._perform_request(request, _convert_xml_to_service_stats) + + def get_queue_service_properties(self, timeout=None): + ''' + Gets the properties of a storage account's Queue service, including + logging, analytics and CORS rules. + + :param int timeout: + The server timeout, expressed in seconds. + :return: The queue service properties. + :rtype: :class:`~azure.storage.common.models.ServiceProperties` + ''' + request = HTTPRequest() + request.method = 'GET' + request.host_locations = self._get_host_locations(secondary=True) + request.path = _get_path() + request.query = { + 'restype': 'service', + 'comp': 'properties', + 'timeout': _int_to_str(timeout), + } + + return self._perform_request(request, _convert_xml_to_service_properties) + + def set_queue_service_properties(self, logging=None, hour_metrics=None, + minute_metrics=None, cors=None, timeout=None): + ''' + Sets the properties of a storage account's Queue service, including + Azure Storage Analytics. If an element (ex Logging) is left as None, the + existing settings on the service for that functionality are preserved. + For more information on Azure Storage Analytics, see + https://msdn.microsoft.com/en-us/library/azure/hh343270.aspx. + + :param Logging logging: + The logging settings provide request logs. + :param Metrics hour_metrics: + The hour metrics settings provide a summary of request + statistics grouped by API in hourly aggregates for queuess. + :param Metrics minute_metrics: + The minute metrics settings provide request statistics + for each minute for queues. + :param cors: + You can include up to five CorsRule elements in the + list. If an empty list is specified, all CORS rules will be deleted, + and CORS will be disabled for the service. For detailed information + about CORS rules and evaluation logic, see + https://msdn.microsoft.com/en-us/library/azure/dn535601.aspx. + :type cors: list(:class:`~azure.storage.common.models.CorsRule`) + :param int timeout: + The server timeout, expressed in seconds. + ''' + request = HTTPRequest() + request.method = 'PUT' + request.host_locations = self._get_host_locations() + request.path = _get_path() + request.query = { + 'restype': 'service', + 'comp': 'properties', + 'timeout': _int_to_str(timeout), + } + request.body = _get_request_body( + _convert_service_properties_to_xml(logging, hour_metrics, minute_metrics, cors)) + self._perform_request(request) + + def list_queues(self, prefix=None, num_results=None, include_metadata=False, + marker=None, timeout=None): + ''' + Returns a generator to list the queues. The generator will lazily follow + the continuation tokens returned by the service and stop when all queues + have been returned or num_results is reached. + + If num_results is specified and the account has more than that number of + queues, the generator will have a populated next_marker field once it + finishes. This marker can be used to create a new generator if more + results are desired. + + :param str prefix: + Filters the results to return only queues with names that begin + with the specified prefix. + :param int num_results: + The maximum number of queues to return. + :param bool include_metadata: + Specifies that container metadata be returned in the response. + :param str marker: + An opaque continuation token. This value can be retrieved from the + next_marker field of a previous generator object if num_results was + specified and that generator has finished enumerating results. If + specified, this generator will begin returning results from the point + where the previous generator stopped. + :param int timeout: + The server timeout, expressed in seconds. This function may make multiple + calls to the service in which case the timeout value specified will be + applied to each individual call. + ''' + include = 'metadata' if include_metadata else None + operation_context = _OperationContext(location_lock=True) + kwargs = {'prefix': prefix, 'max_results': num_results, 'include': include, + 'marker': marker, 'timeout': timeout, '_context': operation_context} + resp = self._list_queues(**kwargs) + + return ListGenerator(resp, self._list_queues, (), kwargs) + + def _list_queues(self, prefix=None, marker=None, max_results=None, + include=None, timeout=None, _context=None): + ''' + Returns a list of queues under the specified account. Makes a single list + request to the service. Used internally by the list_queues method. + + :param str prefix: + Filters the results to return only queues with names that begin + with the specified prefix. + :param str marker: + A token which identifies the portion of the query to be + returned with the next query operation. The operation returns a + next_marker element within the response body if the list returned + was not complete. This value may then be used as a query parameter + in a subsequent call to request the next portion of the list of + queues. The marker value is opaque to the client. + :param int max_results: + The maximum number of queues to return. A single list request may + return up to 1000 queues and potentially a continuation token which + should be followed to get additional resutls. + :param str include: + Include this parameter to specify that the container's + metadata be returned as part of the response body. + :param int timeout: + The server timeout, expressed in seconds. + ''' + request = HTTPRequest() + request.method = 'GET' + request.host_locations = self._get_host_locations(secondary=True) + request.path = _get_path() + request.query = { + 'comp': 'list', + 'prefix': _to_str(prefix), + 'marker': _to_str(marker), + 'maxresults': _int_to_str(max_results), + 'include': _to_str(include), + 'timeout': _int_to_str(timeout) + } + + return self._perform_request(request, _convert_xml_to_queues, operation_context=_context) + + def create_queue(self, queue_name, metadata=None, fail_on_exist=False, timeout=None): + ''' + Creates a queue under the given account. + + :param str queue_name: + The name of the queue to create. A queue name must be from 3 through + 63 characters long and may only contain lowercase letters, numbers, + and the dash (-) character. The first and last letters in the queue + must be alphanumeric. The dash (-) character cannot be the first or + last character. Consecutive dash characters are not permitted in the + queue name. + :param metadata: + A dict containing name-value pairs to associate with the queue as + metadata. Note that metadata names preserve the case with which they + were created, but are case-insensitive when set or read. + :type metadata: dict(str, str) + :param bool fail_on_exist: + Specifies whether to throw an exception if the queue already exists. + :param int timeout: + The server timeout, expressed in seconds. + :return: + A boolean indicating whether the queue was created. If fail_on_exist + was set to True, this will throw instead of returning false. + :rtype: bool + ''' + _validate_not_none('queue_name', queue_name) + request = HTTPRequest() + request.method = 'PUT' + request.host_locations = self._get_host_locations() + request.path = _get_path(queue_name) + request.query = {'timeout': _int_to_str(timeout)} + _add_metadata_headers(metadata, request) + + def _return_request(request): + return request + + if not fail_on_exist: + try: + response = self._perform_request(request, parser=_return_request) + if response.status == _HTTP_RESPONSE_NO_CONTENT: + return False + return True + except AzureHttpError as ex: + _dont_fail_on_exist(ex) + return False + else: + response = self._perform_request(request, parser=_return_request) + if response.status == _HTTP_RESPONSE_NO_CONTENT: + raise AzureConflictHttpError( + _ERROR_CONFLICT.format(response.message), response.status) + return True + + def delete_queue(self, queue_name, fail_not_exist=False, timeout=None): + ''' + Deletes the specified queue and any messages it contains. + + When a queue is successfully deleted, it is immediately marked for deletion + and is no longer accessible to clients. The queue is later removed from + the Queue service during garbage collection. + + Note that deleting a queue is likely to take at least 40 seconds to complete. + If an operation is attempted against the queue while it was being deleted, + an :class:`AzureConflictHttpError` will be thrown. + + :param str queue_name: + The name of the queue to delete. + :param bool fail_not_exist: + Specifies whether to throw an exception if the queue doesn't exist. + :param int timeout: + The server timeout, expressed in seconds. + :return: + A boolean indicating whether the queue was deleted. If fail_not_exist + was set to True, this will throw instead of returning false. + :rtype: bool + ''' + _validate_not_none('queue_name', queue_name) + request = HTTPRequest() + request.method = 'DELETE' + request.host_locations = self._get_host_locations() + request.path = _get_path(queue_name) + request.query = {'timeout': _int_to_str(timeout)} + if not fail_not_exist: + try: + self._perform_request(request) + return True + except AzureHttpError as ex: + _dont_fail_not_exist(ex) + return False + else: + self._perform_request(request) + return True + + def get_queue_metadata(self, queue_name, timeout=None): + ''' + Retrieves user-defined metadata and queue properties on the specified + queue. Metadata is associated with the queue as name-value pairs. + + :param str queue_name: + The name of an existing queue. + :param int timeout: + The server timeout, expressed in seconds. + :return: + A dictionary representing the queue metadata with an + approximate_message_count int property on the dict estimating the + number of messages in the queue. + :rtype: dict(str, str) + ''' + _validate_not_none('queue_name', queue_name) + request = HTTPRequest() + request.method = 'GET' + request.host_locations = self._get_host_locations(secondary=True) + request.path = _get_path(queue_name) + request.query = { + 'comp': 'metadata', + 'timeout': _int_to_str(timeout), + } + + return self._perform_request(request, _parse_metadata_and_message_count) + + def set_queue_metadata(self, queue_name, metadata=None, timeout=None): + ''' + Sets user-defined metadata on the specified queue. Metadata is + associated with the queue as name-value pairs. + + :param str queue_name: + The name of an existing queue. + :param dict metadata: + A dict containing name-value pairs to associate with the + queue as metadata. + :param int timeout: + The server timeout, expressed in seconds. + ''' + _validate_not_none('queue_name', queue_name) + request = HTTPRequest() + request.method = 'PUT' + request.host_locations = self._get_host_locations() + request.path = _get_path(queue_name) + request.query = { + 'comp': 'metadata', + 'timeout': _int_to_str(timeout), + } + _add_metadata_headers(metadata, request) + + self._perform_request(request) + + def exists(self, queue_name, timeout=None): + ''' + Returns a boolean indicating whether the queue exists. + + :param str queue_name: + The name of queue to check for existence. + :param int timeout: + The server timeout, expressed in seconds. + :return: A boolean indicating whether the queue exists. + :rtype: bool + ''' + try: + self.get_queue_metadata(queue_name, timeout=timeout) + return True + except AzureHttpError as ex: + _dont_fail_not_exist(ex) + return False + + def get_queue_acl(self, queue_name, timeout=None): + ''' + Returns details about any stored access policies specified on the + queue that may be used with Shared Access Signatures. + + :param str queue_name: + The name of an existing queue. + :param int timeout: + The server timeout, expressed in seconds. + :return: A dictionary of access policies associated with the queue. + :rtype: dict(str, :class:`~azure.storage.common.models.AccessPolicy`) + ''' + _validate_not_none('queue_name', queue_name) + request = HTTPRequest() + request.method = 'GET' + request.host_locations = self._get_host_locations(secondary=True) + request.path = _get_path(queue_name) + request.query = { + 'comp': 'acl', + 'timeout': _int_to_str(timeout), + } + + return self._perform_request(request, _convert_xml_to_signed_identifiers) + + def set_queue_acl(self, queue_name, signed_identifiers=None, timeout=None): + ''' + Sets stored access policies for the queue that may be used with Shared + Access Signatures. + + When you set permissions for a queue, the existing permissions are replaced. + To update the queue's permissions, call :func:`~get_queue_acl` to fetch + all access policies associated with the queue, modify the access policy + that you wish to change, and then call this function with the complete + set of data to perform the update. + + When you establish a stored access policy on a queue, it may take up to + 30 seconds to take effect. During this interval, a shared access signature + that is associated with the stored access policy will throw an + :class:`AzureHttpError` until the access policy becomes active. + + :param str queue_name: + The name of an existing queue. + :param signed_identifiers: + A dictionary of access policies to associate with the queue. The + dictionary may contain up to 5 elements. An empty dictionary + will clear the access policies set on the service. + :type signed_identifiers: dict(str, :class:`~azure.storage.common.models.AccessPolicy`) + :param int timeout: + The server timeout, expressed in seconds. + ''' + _validate_not_none('queue_name', queue_name) + _validate_access_policies(signed_identifiers) + request = HTTPRequest() + request.method = 'PUT' + request.host_locations = self._get_host_locations() + request.path = _get_path(queue_name) + request.query = { + 'comp': 'acl', + 'timeout': _int_to_str(timeout), + } + request.body = _get_request_body( + _convert_signed_identifiers_to_xml(signed_identifiers)) + self._perform_request(request) + + def put_message(self, queue_name, content, visibility_timeout=None, + time_to_live=None, timeout=None): + ''' + Adds a new message to the back of the message queue. + + The visibility timeout specifies the time that the message will be + invisible. After the timeout expires, the message will become visible. + If a visibility timeout is not specified, the default value of 0 is used. + + The message time-to-live specifies how long a message will remain in the + queue. The message will be deleted from the queue when the time-to-live + period expires. + + If the key-encryption-key field is set on the local service object, this method will + encrypt the content before uploading. + + :param str queue_name: + The name of the queue to put the message into. + :param obj content: + Message content. Allowed type is determined by the encode_function + set on the service. Default is str. The encoded message can be up to + 64KB in size. + :param int visibility_timeout: + If not specified, the default value is 0. Specifies the + new visibility timeout value, in seconds, relative to server time. + The value must be larger than or equal to 0, and cannot be + larger than 7 days. The visibility timeout of a message cannot be + set to a value later than the expiry time. visibility_timeout + should be set to a value smaller than the time-to-live value. + :param int time_to_live: + Specifies the time-to-live interval for the message, in + seconds. The time-to-live may be any positive number or -1 for infinity. If this + parameter is omitted, the default time-to-live is 7 days. + :param int timeout: + The server timeout, expressed in seconds. + :return: + A :class:`~azure.storage.queue.models.QueueMessage` object. + This object is also populated with the content although it is not + returned from the service. + :rtype: :class:`~azure.storage.queue.models.QueueMessage` + ''' + + _validate_encryption_required(self.require_encryption, self.key_encryption_key) + + _validate_not_none('queue_name', queue_name) + _validate_not_none('content', content) + request = HTTPRequest() + request.method = 'POST' + request.host_locations = self._get_host_locations() + request.path = _get_path(queue_name, True) + request.query = { + 'visibilitytimeout': _to_str(visibility_timeout), + 'messagettl': _to_str(time_to_live), + 'timeout': _int_to_str(timeout) + } + + request.body = _get_request_body(_convert_queue_message_xml(content, self.encode_function, + self.key_encryption_key)) + + message_list = self._perform_request(request, _convert_xml_to_queue_messages, + [self.decode_function, False, + None, None, content]) + return message_list[0] + + def get_messages(self, queue_name, num_messages=None, + visibility_timeout=None, timeout=None): + ''' + Retrieves one or more messages from the front of the queue. + + When a message is retrieved from the queue, the response includes the message + content and a pop_receipt value, which is required to delete the message. + The message is not automatically deleted from the queue, but after it has + been retrieved, it is not visible to other clients for the time interval + specified by the visibility_timeout parameter. + + If the key-encryption-key or resolver field is set on the local service object, the messages will be + decrypted before being returned. + + :param str queue_name: + The name of the queue to get messages from. + :param int num_messages: + A nonzero integer value that specifies the number of + messages to retrieve from the queue, up to a maximum of 32. If + fewer are visible, the visible messages are returned. By default, + a single message is retrieved from the queue with this operation. + :param int visibility_timeout: + Specifies the new visibility timeout value, in seconds, relative + to server time. The new value must be larger than or equal to 1 + second, and cannot be larger than 7 days. The visibility timeout of + a message can be set to a value later than the expiry time. + :param int timeout: + The server timeout, expressed in seconds. + :return: A :class:`~azure.storage.queue.models.QueueMessage` object representing the information passed. + :rtype: list(:class:`~azure.storage.queue.models.QueueMessage`) + ''' + _validate_decryption_required(self.require_encryption, self.key_encryption_key, + self.key_resolver_function) + + _validate_not_none('queue_name', queue_name) + request = HTTPRequest() + request.method = 'GET' + request.host_locations = self._get_host_locations() + request.path = _get_path(queue_name, True) + request.query = { + 'numofmessages': _to_str(num_messages), + 'visibilitytimeout': _to_str(visibility_timeout), + 'timeout': _int_to_str(timeout) + } + + return self._perform_request(request, _convert_xml_to_queue_messages, + [self.decode_function, self.require_encryption, + self.key_encryption_key, self.key_resolver_function]) + + def peek_messages(self, queue_name, num_messages=None, timeout=None): + ''' + Retrieves one or more messages from the front of the queue, but does + not alter the visibility of the message. + + Only messages that are visible may be retrieved. When a message is retrieved + for the first time with a call to get_messages, its dequeue_count property + is set to 1. If it is not deleted and is subsequently retrieved again, the + dequeue_count property is incremented. The client may use this value to + determine how many times a message has been retrieved. Note that a call + to peek_messages does not increment the value of DequeueCount, but returns + this value for the client to read. + + If the key-encryption-key or resolver field is set on the local service object, the messages will be + decrypted before being returned. + + :param str queue_name: + The name of the queue to peek messages from. + :param int num_messages: + A nonzero integer value that specifies the number of + messages to peek from the queue, up to a maximum of 32. By default, + a single message is peeked from the queue with this operation. + :param int timeout: + The server timeout, expressed in seconds. + :return: + A list of :class:`~azure.storage.queue.models.QueueMessage` objects. Note that + time_next_visible and pop_receipt will not be populated as peek does + not pop the message and can only retrieve already visible messages. + :rtype: list(:class:`~azure.storage.queue.models.QueueMessage`) + ''' + + _validate_decryption_required(self.require_encryption, self.key_encryption_key, + self.key_resolver_function) + + _validate_not_none('queue_name', queue_name) + request = HTTPRequest() + request.method = 'GET' + request.host_locations = self._get_host_locations(secondary=True) + request.path = _get_path(queue_name, True) + request.query = { + 'peekonly': 'true', + 'numofmessages': _to_str(num_messages), + 'timeout': _int_to_str(timeout) + } + + return self._perform_request(request, _convert_xml_to_queue_messages, + [self.decode_function, self.require_encryption, + self.key_encryption_key, self.key_resolver_function]) + + def delete_message(self, queue_name, message_id, pop_receipt, timeout=None): + ''' + Deletes the specified message. + + Normally after a client retrieves a message with the get_messages operation, + the client is expected to process and delete the message. To delete the + message, you must have two items of data: id and pop_receipt. The + id is returned from the previous get_messages operation. The + pop_receipt is returned from the most recent :func:`~get_messages` or + :func:`~update_message` operation. In order for the delete_message operation + to succeed, the pop_receipt specified on the request must match the + pop_receipt returned from the :func:`~get_messages` or :func:`~update_message` + operation. + + :param str queue_name: + The name of the queue from which to delete the message. + :param str message_id: + The message id identifying the message to delete. + :param str pop_receipt: + A valid pop receipt value returned from an earlier call + to the :func:`~get_messages` or :func:`~update_message`. + :param int timeout: + The server timeout, expressed in seconds. + ''' + _validate_not_none('queue_name', queue_name) + _validate_not_none('message_id', message_id) + _validate_not_none('pop_receipt', pop_receipt) + request = HTTPRequest() + request.method = 'DELETE' + request.host_locations = self._get_host_locations() + request.path = _get_path(queue_name, True, message_id) + request.query = { + 'popreceipt': _to_str(pop_receipt), + 'timeout': _int_to_str(timeout) + } + self._perform_request(request) + + def clear_messages(self, queue_name, timeout=None): + ''' + Deletes all messages from the specified queue. + + :param str queue_name: + The name of the queue whose messages to clear. + :param int timeout: + The server timeout, expressed in seconds. + ''' + _validate_not_none('queue_name', queue_name) + request = HTTPRequest() + request.method = 'DELETE' + request.host_locations = self._get_host_locations() + request.path = _get_path(queue_name, True) + request.query = {'timeout': _int_to_str(timeout)} + self._perform_request(request) + + def update_message(self, queue_name, message_id, pop_receipt, visibility_timeout, + content=None, timeout=None): + ''' + Updates the visibility timeout of a message. You can also use this + operation to update the contents of a message. + + This operation can be used to continually extend the invisibility of a + queue message. This functionality can be useful if you want a worker role + to "lease" a queue message. For example, if a worker role calls get_messages + and recognizes that it needs more time to process a message, it can + continually extend the message's invisibility until it is processed. If + the worker role were to fail during processing, eventually the message + would become visible again and another worker role could process it. + + If the key-encryption-key field is set on the local service object, this method will + encrypt the content before uploading. + + :param str queue_name: + The name of the queue containing the message to update. + :param str message_id: + The message id identifying the message to update. + :param str pop_receipt: + A valid pop receipt value returned from an earlier call + to the :func:`~get_messages` or :func:`~update_message` operation. + :param int visibility_timeout: + Specifies the new visibility timeout value, in seconds, + relative to server time. The new value must be larger than or equal + to 0, and cannot be larger than 7 days. The visibility timeout of a + message cannot be set to a value later than the expiry time. A + message can be updated until it has been deleted or has expired. + :param obj content: + Message content. Allowed type is determined by the encode_function + set on the service. Default is str. + :param int timeout: + The server timeout, expressed in seconds. + :return: + A list of :class:`~azure.storage.queue.models.QueueMessage` objects. For convenience, + this object is also populated with the content, although it is not returned by the service. + :rtype: list(:class:`~azure.storage.queue.models.QueueMessage`) + ''' + + _validate_encryption_required(self.require_encryption, self.key_encryption_key) + + _validate_not_none('queue_name', queue_name) + _validate_not_none('message_id', message_id) + _validate_not_none('pop_receipt', pop_receipt) + _validate_not_none('visibility_timeout', visibility_timeout) + request = HTTPRequest() + request.method = 'PUT' + request.host_locations = self._get_host_locations() + request.path = _get_path(queue_name, True, message_id) + request.query = { + 'popreceipt': _to_str(pop_receipt), + 'visibilitytimeout': _int_to_str(visibility_timeout), + 'timeout': _int_to_str(timeout) + } + + if content is not None: + request.body = _get_request_body(_convert_queue_message_xml(content, self.encode_function, + self.key_encryption_key)) + + return self._perform_request(request, _parse_queue_message_from_headers) diff --git a/src/storage-preview/azext_storage_preview/azure_storage/queue/sharedaccesssignature.py b/src/storage-preview/azext_storage_preview/azure_storage/queue/sharedaccesssignature.py new file mode 100644 index 00000000000..ea225aec52a --- /dev/null +++ b/src/storage-preview/azext_storage_preview/azure_storage/queue/sharedaccesssignature.py @@ -0,0 +1,81 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- + +from azure.storage.common.sharedaccesssignature import ( + SharedAccessSignature, + _SharedAccessHelper, +) +from ._constants import X_MS_VERSION + + +class QueueSharedAccessSignature(SharedAccessSignature): + ''' + Provides a factory for creating queue shares access + signature tokens with a common account name and account key. Users can either + use the factory or can construct the appropriate service and use the + generate_*_shared_access_signature method directly. + ''' + + def __init__(self, account_name, account_key): + ''' + :param str account_name: + The storage account name used to generate the shared access signatures. + :param str account_key: + The access key to generate the shares access signatures. + ''' + super(QueueSharedAccessSignature, self).__init__(account_name, account_key, x_ms_version=X_MS_VERSION) + + def generate_queue(self, queue_name, permission=None, + expiry=None, start=None, id=None, + ip=None, protocol=None): + ''' + Generates a shared access signature for the queue. + Use the returned signature with the sas_token parameter of QueueService. + + :param str queue_name: + Name of queue. + :param QueuePermissions permission: + The permissions associated with the shared access signature. The + user is restricted to operations allowed by the permissions. + Permissions must be ordered read, add, update, process. + Required unless an id is given referencing a stored access policy + which contains this field. This field must be omitted if it has been + specified in an associated stored access policy. + :param expiry: + The time at which the shared access signature becomes invalid. + Required unless an id is given referencing a stored access policy + which contains this field. This field must be omitted if it has + been specified in an associated stored access policy. Azure will always + convert values to UTC. If a date is passed in without timezone info, it + is assumed to be UTC. + :type expiry: datetime or str + :param start: + The time at which the shared access signature becomes valid. If + omitted, start time for this call is assumed to be the time when the + storage service receives the request. Azure will always convert values + to UTC. If a date is passed in without timezone info, it is assumed to + be UTC. + :type start: datetime or str + :param str id: + A unique value up to 64 characters in length that correlates to a + stored access policy. To create a stored access policy, use + set_blob_service_properties. + :param str ip: + Specifies an IP address or a range of IP addresses from which to accept requests. + If the IP address from which the request originates does not match the IP address + or address range specified on the SAS token, the request is not authenticated. + For example, specifying sip=168.1.5.65 or sip=168.1.5.60-168.1.5.70 on the SAS + restricts the request to those IP addresses. + :param str protocol: + Specifies the protocol permitted for a request made. The default value + is https,http. See :class:`~azure.storage.common.models.Protocol` for possible values. + ''' + sas = _SharedAccessHelper() + sas.add_base(permission, expiry, start, ip, protocol, self.x_ms_version) + sas.add_id(id) + sas.add_resource_signature(self.account_name, self.account_key, 'queue', queue_name) + + return sas.get_token() diff --git a/src/storage-preview/azext_storage_preview/commands.py b/src/storage-preview/azext_storage_preview/commands.py index 49442aba2e4..22dae90d9eb 100644 --- a/src/storage-preview/azext_storage_preview/commands.py +++ b/src/storage-preview/azext_storage_preview/commands.py @@ -41,6 +41,7 @@ def get_custom_sdk(custom_module, client_factory, resource_type=ResourceType.DAT with self.command_group('storage account', storage_account_sdk, resource_type=ResourceType.MGMT_STORAGE, custom_command_type=storage_account_custom_type) as g: + g.custom_command('test', 'test') g.command('check-name', 'check_name_availability') g.custom_command('create', 'create_storage_account', min_api='2016-01-01') g.command('delete', 'delete', confirmation=True) diff --git a/src/storage-preview/azext_storage_preview/operations/account.py b/src/storage-preview/azext_storage_preview/operations/account.py index 5179065c176..d6a10f8bd9d 100644 --- a/src/storage-preview/azext_storage_preview/operations/account.py +++ b/src/storage-preview/azext_storage_preview/operations/account.py @@ -7,6 +7,12 @@ from .._client_factory import storage_client_factory +def test(willie, stuff): + from azext_storage_preview.azure_storage import blob + print(blob) + print("willie: ", willie) + print("stuff: ", stuff) + def create_storage_account(cmd, resource_group_name, account_name, sku=None, location=None, kind=None, tags=None, custom_domain=None, encryption_services=None, access_tier=None, https_only=None, From 636e1c259282cac85de4f5e1e7c29873b836ec8a Mon Sep 17 00:00:00 2001 From: williexu Date: Fri, 27 Apr 2018 16:31:46 -0700 Subject: [PATCH 03/19] vendored new data plane storage sdk with customresourcetype custom profile and sdk --- .../azext_storage_preview/__init__.py | 10 ++-- .../azext_storage_preview/_client_factory.py | 47 ++++++++++++++++--- .../azext_storage_preview/_format.py | 3 +- .../azure_storage/__init__.py | 1 + .../azure_storage/v2017_11_09/__init__.py | 1 + .../{ => v2017_11_09}/blob/__init__.py | 0 .../{ => v2017_11_09}/blob/_constants.py | 0 .../blob/_deserialization.py | 8 ++-- .../blob/_download_chunking.py | 2 +- .../{ => v2017_11_09}/blob/_encryption.py | 4 +- .../{ => v2017_11_09}/blob/_error.py | 0 .../{ => v2017_11_09}/blob/_serialization.py | 4 +- .../blob/_upload_chunking.py | 6 +-- .../blob/appendblobservice.py | 12 ++--- .../{ => v2017_11_09}/blob/baseblobservice.py | 46 +++++++++--------- .../blob/blockblobservice.py | 14 +++--- .../{ => v2017_11_09}/blob/models.py | 2 +- .../{ => v2017_11_09}/blob/pageblobservice.py | 12 ++--- .../blob/sharedaccesssignature.py | 6 +-- .../{ => v2017_11_09}/common/__init__.py | 0 .../{ => v2017_11_09}/common/_auth.py | 0 .../common/_common_conversion.py | 0 .../{ => v2017_11_09}/common/_connection.py | 0 .../{ => v2017_11_09}/common/_constants.py | 0 .../common/_deserialization.py | 0 .../{ => v2017_11_09}/common/_encryption.py | 0 .../{ => v2017_11_09}/common/_error.py | 0 .../common/_http/__init__.py | 0 .../common/_http/httpclient.py | 0 .../common/_serialization.py | 0 .../common/cloudstorageaccount.py | 6 +-- .../{ => v2017_11_09}/common/models.py | 0 .../{ => v2017_11_09}/common/retry.py | 0 .../common/sharedaccesssignature.py | 0 .../{ => v2017_11_09}/common/storageclient.py | 0 .../common/tokencredential.py | 0 .../{ => v2017_11_09}/file/__init__.py | 0 .../{ => v2017_11_09}/file/_constants.py | 0 .../file/_deserialization.py | 8 ++-- .../file/_download_chunking.py | 2 +- .../{ => v2017_11_09}/file/_serialization.py | 4 +- .../file/_upload_chunking.py | 0 .../{ => v2017_11_09}/file/fileservice.py | 28 +++++------ .../{ => v2017_11_09}/file/models.py | 2 +- .../file/sharedaccesssignature.py | 8 ++-- .../{ => v2017_11_09}/queue/__init__.py | 0 .../{ => v2017_11_09}/queue/_constants.py | 0 .../queue/_deserialization.py | 4 +- .../{ => v2017_11_09}/queue/_encryption.py | 6 +-- .../{ => v2017_11_09}/queue/_error.py | 2 +- .../{ => v2017_11_09}/queue/_serialization.py | 2 +- .../{ => v2017_11_09}/queue/models.py | 0 .../{ => v2017_11_09}/queue/queueservice.py | 38 +++++++-------- .../queue/sharedaccesssignature.py | 4 +- .../azext_storage_preview/commands.py | 16 +++---- .../operations/account.py | 6 --- .../azext_storage_preview/profiles.py | 10 ++++ .../azext_storage_preview/sdkutil.py | 21 +++++---- .../azext_storage_preview/services_wrapper.py | 7 +-- .../tests/latest/test_storage_validators.py | 11 +++-- 60 files changed, 206 insertions(+), 157 deletions(-) create mode 100644 src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/__init__.py rename src/storage-preview/azext_storage_preview/azure_storage/{ => v2017_11_09}/blob/__init__.py (100%) rename src/storage-preview/azext_storage_preview/azure_storage/{ => v2017_11_09}/blob/_constants.py (100%) rename src/storage-preview/azext_storage_preview/azure_storage/{ => v2017_11_09}/blob/_deserialization.py (98%) rename src/storage-preview/azext_storage_preview/azure_storage/{ => v2017_11_09}/blob/_download_chunking.py (98%) rename src/storage-preview/azext_storage_preview/azure_storage/{ => v2017_11_09}/blob/_encryption.py (98%) rename src/storage-preview/azext_storage_preview/azure_storage/{ => v2017_11_09}/blob/_error.py (100%) rename src/storage-preview/azext_storage_preview/azure_storage/{ => v2017_11_09}/blob/_serialization.py (97%) rename src/storage-preview/azext_storage_preview/azure_storage/{ => v2017_11_09}/blob/_upload_chunking.py (98%) rename src/storage-preview/azext_storage_preview/azure_storage/{ => v2017_11_09}/blob/appendblobservice.py (98%) rename src/storage-preview/azext_storage_preview/azure_storage/{ => v2017_11_09}/blob/baseblobservice.py (99%) rename src/storage-preview/azext_storage_preview/azure_storage/{ => v2017_11_09}/blob/blockblobservice.py (99%) rename src/storage-preview/azext_storage_preview/azure_storage/{ => v2017_11_09}/blob/models.py (99%) rename src/storage-preview/azext_storage_preview/azure_storage/{ => v2017_11_09}/blob/pageblobservice.py (99%) rename src/storage-preview/azext_storage_preview/azure_storage/{ => v2017_11_09}/blob/sharedaccesssignature.py (97%) rename src/storage-preview/azext_storage_preview/azure_storage/{ => v2017_11_09}/common/__init__.py (100%) rename src/storage-preview/azext_storage_preview/azure_storage/{ => v2017_11_09}/common/_auth.py (100%) rename src/storage-preview/azext_storage_preview/azure_storage/{ => v2017_11_09}/common/_common_conversion.py (100%) rename src/storage-preview/azext_storage_preview/azure_storage/{ => v2017_11_09}/common/_connection.py (100%) rename src/storage-preview/azext_storage_preview/azure_storage/{ => v2017_11_09}/common/_constants.py (100%) rename src/storage-preview/azext_storage_preview/azure_storage/{ => v2017_11_09}/common/_deserialization.py (100%) rename src/storage-preview/azext_storage_preview/azure_storage/{ => v2017_11_09}/common/_encryption.py (100%) rename src/storage-preview/azext_storage_preview/azure_storage/{ => v2017_11_09}/common/_error.py (100%) rename src/storage-preview/azext_storage_preview/azure_storage/{ => v2017_11_09}/common/_http/__init__.py (100%) rename src/storage-preview/azext_storage_preview/azure_storage/{ => v2017_11_09}/common/_http/httpclient.py (100%) rename src/storage-preview/azext_storage_preview/azure_storage/{ => v2017_11_09}/common/_serialization.py (100%) rename src/storage-preview/azext_storage_preview/azure_storage/{ => v2017_11_09}/common/cloudstorageaccount.py (98%) rename src/storage-preview/azext_storage_preview/azure_storage/{ => v2017_11_09}/common/models.py (100%) rename src/storage-preview/azext_storage_preview/azure_storage/{ => v2017_11_09}/common/retry.py (100%) rename src/storage-preview/azext_storage_preview/azure_storage/{ => v2017_11_09}/common/sharedaccesssignature.py (100%) rename src/storage-preview/azext_storage_preview/azure_storage/{ => v2017_11_09}/common/storageclient.py (100%) rename src/storage-preview/azext_storage_preview/azure_storage/{ => v2017_11_09}/common/tokencredential.py (100%) rename src/storage-preview/azext_storage_preview/azure_storage/{ => v2017_11_09}/file/__init__.py (100%) rename src/storage-preview/azext_storage_preview/azure_storage/{ => v2017_11_09}/file/_constants.py (100%) rename src/storage-preview/azext_storage_preview/azure_storage/{ => v2017_11_09}/file/_deserialization.py (97%) rename src/storage-preview/azext_storage_preview/azure_storage/{ => v2017_11_09}/file/_download_chunking.py (98%) rename src/storage-preview/azext_storage_preview/azure_storage/{ => v2017_11_09}/file/_serialization.py (96%) rename src/storage-preview/azext_storage_preview/azure_storage/{ => v2017_11_09}/file/_upload_chunking.py (100%) rename src/storage-preview/azext_storage_preview/azure_storage/{ => v2017_11_09}/file/fileservice.py (99%) rename src/storage-preview/azext_storage_preview/azure_storage/{ => v2017_11_09}/file/models.py (99%) rename src/storage-preview/azext_storage_preview/azure_storage/{ => v2017_11_09}/file/sharedaccesssignature.py (96%) rename src/storage-preview/azext_storage_preview/azure_storage/{ => v2017_11_09}/queue/__init__.py (100%) rename src/storage-preview/azext_storage_preview/azure_storage/{ => v2017_11_09}/queue/_constants.py (100%) rename src/storage-preview/azext_storage_preview/azure_storage/{ => v2017_11_09}/queue/_deserialization.py (98%) rename src/storage-preview/azext_storage_preview/azure_storage/{ => v2017_11_09}/queue/_encryption.py (97%) rename src/storage-preview/azext_storage_preview/azure_storage/{ => v2017_11_09}/queue/_error.py (95%) rename src/storage-preview/azext_storage_preview/azure_storage/{ => v2017_11_09}/queue/_serialization.py (97%) rename src/storage-preview/azext_storage_preview/azure_storage/{ => v2017_11_09}/queue/models.py (100%) rename src/storage-preview/azext_storage_preview/azure_storage/{ => v2017_11_09}/queue/queueservice.py (97%) rename src/storage-preview/azext_storage_preview/azure_storage/{ => v2017_11_09}/queue/sharedaccesssignature.py (96%) create mode 100644 src/storage-preview/azext_storage_preview/profiles.py diff --git a/src/storage-preview/azext_storage_preview/__init__.py b/src/storage-preview/azext_storage_preview/__init__.py index 910777766b8..c039d74e326 100644 --- a/src/storage-preview/azext_storage_preview/__init__.py +++ b/src/storage-preview/azext_storage_preview/__init__.py @@ -4,19 +4,22 @@ # -------------------------------------------------------------------------------------------- from azure.cli.core import AzCommandsLoader -from azure.cli.core.profiles import ResourceType +from azure.cli.core.profiles import ResourceType, register_resource_type from azure.cli.core.commands import AzCommandGroup, AzArgumentContext import azext_storage_preview._help # pylint: disable=unused-import +from .profiles import CUSTOM_DATA_STORAGE class StorageCommandsLoader(AzCommandsLoader): def __init__(self, cli_ctx=None): from azure.cli.core.commands import CliCommandType + register_resource_type('latest', CUSTOM_DATA_STORAGE, '2017-11-09') storage_custom = CliCommandType(operations_tmpl='azext_storage_preview.custom#{}') + super(StorageCommandsLoader, self).__init__(cli_ctx=cli_ctx, - resource_type=ResourceType.DATA_STORAGE, + resource_type=CUSTOM_DATA_STORAGE, custom_command_type=storage_custom, command_group_cls=StorageCommandGroup, argument_context_cls=StorageArgumentContext) @@ -147,8 +150,9 @@ def handler(ex): from azure.cli.core.profiles import get_sdk t_error = get_sdk(self.command_loader.cli_ctx, - ResourceType.DATA_STORAGE, + CUSTOM_DATA_STORAGE, 'common._error#AzureMissingResourceHttpError') + print(t_error) if isinstance(ex, t_error): return None raise ex diff --git a/src/storage-preview/azext_storage_preview/_client_factory.py b/src/storage-preview/azext_storage_preview/_client_factory.py index 87a4f1f274a..38bb4579d57 100644 --- a/src/storage-preview/azext_storage_preview/_client_factory.py +++ b/src/storage-preview/azext_storage_preview/_client_factory.py @@ -3,10 +3,13 @@ # Licensed under the MIT License. See License.txt in the project root for license information. # -------------------------------------------------------------------------------------------- -from azure.cli.core.commands.client_factory import get_mgmt_service_client, get_data_service_client +from azure.cli.core.commands.client_factory import get_mgmt_service_client, _get_add_headers_callback from azure.cli.core.profiles import ResourceType, get_sdk +from knack.util import CLIError +from knack.log import get_logger from .sdkutil import get_table_data_type +from .profiles import CUSTOM_DATA_STORAGE NO_CREDENTIALS_ERROR_MESSAGE = """ No credentials specified to access storage service. Please provide any of the following: @@ -18,6 +21,34 @@ option or AZURE_STORAGE_ACCOUNT environment variable) """ +logger = get_logger(__name__) + + +# edited from azure.cli.core.commands.client_factory +def get_data_service_client(cli_ctx, service_type, account_name, account_key, connection_string=None, + sas_token=None, socket_timeout=None, endpoint_suffix=None): + logger.debug('Getting data service client service_type=%s', service_type.__name__) + try: + client_kwargs = {'account_name': account_name, + 'account_key': account_key, + 'connection_string': connection_string, + 'sas_token': sas_token} + if socket_timeout: + client_kwargs['socket_timeout'] = socket_timeout + if endpoint_suffix: + client_kwargs['endpoint_suffix'] = endpoint_suffix + client = service_type(**client_kwargs) + except ValueError as exc: + _ERROR_STORAGE_MISSING_INFO = get_sdk(cli_ctx, CUSTOM_DATA_STORAGE, + 'common._error#_ERROR_STORAGE_MISSING_INFO') + if _ERROR_STORAGE_MISSING_INFO in str(exc): + raise ValueError(exc) + else: + raise CLIError('Unable to obtain data client. Check your connection parameters.') + # TODO: enable Fiddler + client.request_callback = _get_add_headers_callback(cli_ctx) + return client + def get_storage_data_service_client(cli_ctx, service, name=None, key=None, connection_string=None, sas_token=None, socket_timeout=None): @@ -32,7 +63,7 @@ def generic_data_service_factory(cli_ctx, service, name=None, key=None, connecti return get_storage_data_service_client(cli_ctx, service, name, key, connection_string, sas_token, socket_timeout) except ValueError as val_exception: - _ERROR_STORAGE_MISSING_INFO = get_sdk(cli_ctx, ResourceType.DATA_STORAGE, + _ERROR_STORAGE_MISSING_INFO = get_sdk(cli_ctx, CUSTOM_DATA_STORAGE, 'common._error#_ERROR_STORAGE_MISSING_INFO') message = str(val_exception) if message == _ERROR_STORAGE_MISSING_INFO: @@ -46,7 +77,7 @@ def storage_client_factory(cli_ctx, **_): def file_data_service_factory(cli_ctx, kwargs): - t_file_svc = get_sdk(cli_ctx, ResourceType.DATA_STORAGE, 'file#FileService') + t_file_svc = get_sdk(cli_ctx, CUSTOM_DATA_STORAGE, 'file#FileService') return generic_data_service_factory(cli_ctx, t_file_svc, kwargs.pop('account_name', None), kwargs.pop('account_key', None), connection_string=kwargs.pop('connection_string', None), @@ -54,7 +85,7 @@ def file_data_service_factory(cli_ctx, kwargs): def page_blob_service_factory(cli_ctx, kwargs): - t_page_blob_service = get_sdk(cli_ctx, ResourceType.DATA_STORAGE, 'blob.pageblobservice#PageBlobService') + t_page_blob_service = get_sdk(cli_ctx, CUSTOM_DATA_STORAGE, 'blob.pageblobservice#PageBlobService') return generic_data_service_factory(cli_ctx, t_page_blob_service, kwargs.pop('account_name', None), kwargs.pop('account_key', None), connection_string=kwargs.pop('connection_string', None), @@ -66,6 +97,8 @@ def blob_data_service_factory(cli_ctx, kwargs): blob_type = kwargs.get('blob_type') blob_service = get_blob_service_by_type(cli_ctx, blob_type) or get_blob_service_by_type(cli_ctx, 'block') + print("service", blob_service, blob_type) + return generic_data_service_factory(cli_ctx, blob_service, kwargs.pop('account_name', None), kwargs.pop('account_key', None), connection_string=kwargs.pop('connection_string', None), @@ -83,7 +116,7 @@ def table_data_service_factory(cli_ctx, kwargs): def queue_data_service_factory(cli_ctx, kwargs): - t_queue_service = get_sdk(cli_ctx, ResourceType.DATA_STORAGE, 'queue#QueueService') + t_queue_service = get_sdk(cli_ctx, CUSTOM_DATA_STORAGE, 'queue#QueueService') return generic_data_service_factory( cli_ctx, t_queue_service, kwargs.pop('account_name', None), @@ -93,7 +126,7 @@ def queue_data_service_factory(cli_ctx, kwargs): def cloud_storage_account_service_factory(cli_ctx, kwargs): - t_cloud_storage_account = get_sdk(cli_ctx, ResourceType.DATA_STORAGE, 'common#CloudStorageAccount') + t_cloud_storage_account = get_sdk(cli_ctx, CUSTOM_DATA_STORAGE, 'common#CloudStorageAccount') account_name = kwargs.pop('account_name', None) account_key = kwargs.pop('account_key', None) sas_token = kwargs.pop('sas_token', None) @@ -105,7 +138,7 @@ def multi_service_properties_factory(cli_ctx, kwargs): """Create multiple data services properties instance based on the services option""" from .services_wrapper import ServiceProperties - t_base_blob_service, t_file_service, t_queue_service, = get_sdk(cli_ctx, ResourceType.DATA_STORAGE, + t_base_blob_service, t_file_service, t_queue_service, = get_sdk(cli_ctx, CUSTOM_DATA_STORAGE, 'blob.baseblobservice#BaseBlobService', 'file#FileService', 'queue#QueueService') diff --git a/src/storage-preview/azext_storage_preview/_format.py b/src/storage-preview/azext_storage_preview/_format.py index 0a4cd8f40a9..199bbc6fefb 100644 --- a/src/storage-preview/azext_storage_preview/_format.py +++ b/src/storage-preview/azext_storage_preview/_format.py @@ -4,6 +4,7 @@ # -------------------------------------------------------------------------------------------- from azure.cli.core.profiles import get_sdk, ResourceType +from .profiles import CUSTOM_DATA_STORAGE def build_table_output(result, projection): @@ -134,7 +135,7 @@ def transform_file_directory_result(cli_ctx): list. """ def transformer(result): - t_file, t_dir = get_sdk(cli_ctx, ResourceType.DATA_STORAGE, 'File', 'Directory', mod='file.models') + t_file, t_dir = get_sdk(cli_ctx, CUSTOM_DATA_STORAGE, 'File', 'Directory', mod='file.models') return_list = [] for each in result: if isinstance(each, t_file): diff --git a/src/storage-preview/azext_storage_preview/azure_storage/__init__.py b/src/storage-preview/azext_storage_preview/azure_storage/__init__.py index e69de29bb2d..de40ea7ca05 100644 --- a/src/storage-preview/azext_storage_preview/azure_storage/__init__.py +++ b/src/storage-preview/azext_storage_preview/azure_storage/__init__.py @@ -0,0 +1 @@ +__import__('pkg_resources').declare_namespace(__name__) diff --git a/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/__init__.py b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/__init__.py new file mode 100644 index 00000000000..de40ea7ca05 --- /dev/null +++ b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/__init__.py @@ -0,0 +1 @@ +__import__('pkg_resources').declare_namespace(__name__) diff --git a/src/storage-preview/azext_storage_preview/azure_storage/blob/__init__.py b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/__init__.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/blob/__init__.py rename to src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/__init__.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/blob/_constants.py b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/_constants.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/blob/_constants.py rename to src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/_constants.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/blob/_deserialization.py b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/_deserialization.py similarity index 98% rename from src/storage-preview/azext_storage_preview/azure_storage/blob/_deserialization.py rename to src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/_deserialization.py index 93aae9590e1..a2f7b08e3a6 100644 --- a/src/storage-preview/azext_storage_preview/azure_storage/blob/_deserialization.py +++ b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/_deserialization.py @@ -10,12 +10,12 @@ from xml.etree import cElementTree as ETree except ImportError: from xml.etree import ElementTree as ETree -from azure.storage.common._common_conversion import ( +from ..common._common_conversion import ( _decode_base64_to_text, _to_str, _get_content_md5 ) -from azure.storage.common._deserialization import ( +from ..common._deserialization import ( _parse_properties, _to_int, _parse_metadata, @@ -37,8 +37,8 @@ BlobPrefix, ) from ._encryption import _decrypt_blob -from azure.storage.common.models import _list -from azure.storage.common._error import ( +from ..common.models import _list +from ..common._error import ( _validate_content_match, _ERROR_DECRYPTION_FAILURE, ) diff --git a/src/storage-preview/azext_storage_preview/azure_storage/blob/_download_chunking.py b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/_download_chunking.py similarity index 98% rename from src/storage-preview/azext_storage_preview/azure_storage/blob/_download_chunking.py rename to src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/_download_chunking.py index bd0c5a74374..067b16d0265 100644 --- a/src/storage-preview/azext_storage_preview/azure_storage/blob/_download_chunking.py +++ b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/_download_chunking.py @@ -5,7 +5,7 @@ # -------------------------------------------------------------------------- import threading -from azure.storage.common._error import _ERROR_NO_SINGLE_THREAD_CHUNKING +from ..common._error import _ERROR_NO_SINGLE_THREAD_CHUNKING def _download_blob_chunks(blob_service, container_name, blob_name, snapshot, diff --git a/src/storage-preview/azext_storage_preview/azure_storage/blob/_encryption.py b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/_encryption.py similarity index 98% rename from src/storage-preview/azext_storage_preview/azure_storage/blob/_encryption.py rename to src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/_encryption.py index b7705a167ae..f1e9b540b0b 100644 --- a/src/storage-preview/azext_storage_preview/azure_storage/blob/_encryption.py +++ b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/_encryption.py @@ -12,14 +12,14 @@ from cryptography.hazmat.primitives.padding import PKCS7 -from azure.storage.common._encryption import ( +from ..common._encryption import ( _generate_encryption_data_dict, _generate_AES_CBC_cipher, _dict_to_encryption_data, _validate_and_unwrap_cek, _EncryptionAlgorithm, ) -from azure.storage.common._error import ( +from ..common._error import ( _validate_not_none, _validate_key_encryption_key_wrap, _ERROR_DATA_NOT_ENCRYPTED, diff --git a/src/storage-preview/azext_storage_preview/azure_storage/blob/_error.py b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/_error.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/blob/_error.py rename to src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/_error.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/blob/_serialization.py b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/_serialization.py similarity index 97% rename from src/storage-preview/azext_storage_preview/azure_storage/blob/_serialization.py rename to src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/_serialization.py index 4540a7e9310..100b4089856 100644 --- a/src/storage-preview/azext_storage_preview/azure_storage/blob/_serialization.py +++ b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/_serialization.py @@ -9,11 +9,11 @@ from xml.etree import cElementTree as ETree except ImportError: from xml.etree import ElementTree as ETree -from azure.storage.common._common_conversion import ( +from ..common._common_conversion import ( _encode_base64, _str, ) -from azure.storage.common._error import ( +from ..common._error import ( _validate_not_none, _ERROR_START_END_NEEDED_FOR_MD5, _ERROR_RANGE_TOO_LARGE_FOR_MD5, diff --git a/src/storage-preview/azext_storage_preview/azure_storage/blob/_upload_chunking.py b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/_upload_chunking.py similarity index 98% rename from src/storage-preview/azext_storage_preview/azure_storage/blob/_upload_chunking.py rename to src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/_upload_chunking.py index 10bee848713..e73388b11d9 100644 --- a/src/storage-preview/azext_storage_preview/azure_storage/blob/_upload_chunking.py +++ b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/_upload_chunking.py @@ -7,9 +7,9 @@ from math import ceil from threading import Lock -from azure.storage.common._common_conversion import _encode_base64 -from azure.storage.common._error import _ERROR_VALUE_SHOULD_BE_SEEKABLE_STREAM -from azure.storage.common._serialization import ( +from ..common._common_conversion import _encode_base64 +from ..common._error import _ERROR_VALUE_SHOULD_BE_SEEKABLE_STREAM +from ..common._serialization import ( url_quote, _get_data_bytes_only, _len_plus diff --git a/src/storage-preview/azext_storage_preview/azure_storage/blob/appendblobservice.py b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/appendblobservice.py similarity index 98% rename from src/storage-preview/azext_storage_preview/azure_storage/blob/appendblobservice.py rename to src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/appendblobservice.py index 81e5f837025..7a83190bb7f 100644 --- a/src/storage-preview/azext_storage_preview/azure_storage/blob/appendblobservice.py +++ b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/appendblobservice.py @@ -6,24 +6,24 @@ import sys from os import path -from azure.storage.common._common_conversion import ( +from ..common._common_conversion import ( _to_str, _int_to_str, _datetime_to_utc_string, _get_content_md5, ) -from azure.storage.common._constants import ( +from ..common._constants import ( SERVICE_HOST_BASE, DEFAULT_PROTOCOL, ) -from azure.storage.common._error import ( +from ..common._error import ( _validate_not_none, _validate_type_bytes, _validate_encryption_unsupported, _ERROR_VALUE_NEGATIVE, ) -from azure.storage.common._http import HTTPRequest -from azure.storage.common._serialization import ( +from ..common._http import HTTPRequest +from ..common._serialization import ( _get_data_bytes_only, _add_metadata_headers, ) @@ -112,7 +112,7 @@ def __init__(self, account_name=None, account_key=None, sas_token=None, is_emula :param token_credential: A token credential used to authenticate HTTPS requests. The token value should be updated before its expiration. - :type `~azure.storage.common.TokenCredential` + :type `~..common.TokenCredential` ''' self.blob_type = _BlobTypes.AppendBlob super(AppendBlobService, self).__init__( diff --git a/src/storage-preview/azext_storage_preview/azure_storage/blob/baseblobservice.py b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/baseblobservice.py similarity index 99% rename from src/storage-preview/azext_storage_preview/azure_storage/blob/baseblobservice.py rename to src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/baseblobservice.py index 1ce79e6c6f1..804e7cb4155 100644 --- a/src/storage-preview/azext_storage_preview/azure_storage/blob/baseblobservice.py +++ b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/baseblobservice.py @@ -8,30 +8,30 @@ from azure.common import AzureHttpError -from azure.storage.common._auth import ( +from ..common._auth import ( _StorageSASAuthentication, _StorageSharedKeyAuthentication, _StorageNoAuthentication, _StorageTokenAuthentication, ) -from azure.storage.common._common_conversion import ( +from ..common._common_conversion import ( _int_to_str, _to_str, _datetime_to_utc_string, ) -from azure.storage.common._connection import _ServiceParameters -from azure.storage.common._constants import ( +from ..common._connection import _ServiceParameters +from ..common._constants import ( SERVICE_HOST_BASE, DEFAULT_PROTOCOL, ) -from azure.storage.common._deserialization import ( +from ..common._deserialization import ( _convert_xml_to_service_properties, _parse_metadata, _parse_properties, _convert_xml_to_service_stats, _parse_length_from_content_range, ) -from azure.storage.common._error import ( +from ..common._error import ( _dont_fail_not_exist, _dont_fail_on_exist, _validate_not_none, @@ -39,14 +39,14 @@ _validate_access_policies, _ERROR_PARALLEL_NOT_SEEKABLE, ) -from azure.storage.common._http import HTTPRequest -from azure.storage.common._serialization import ( +from ..common._http import HTTPRequest +from ..common._serialization import ( _get_request_body, _convert_signed_identifiers_to_xml, _convert_service_properties_to_xml, _add_metadata_headers, ) -from azure.storage.common.models import ( +from ..common.models import ( Services, ListGenerator, _OperationContext, @@ -54,7 +54,7 @@ from .sharedaccesssignature import ( BlobSharedAccessSignature, ) -from azure.storage.common.storageclient import StorageClient +from ..common.storageclient import StorageClient from ._deserialization import ( _convert_xml_to_containers, _parse_blob, @@ -184,7 +184,7 @@ def __init__(self, account_name=None, account_key=None, sas_token=None, is_emula :param token_credential: A token credential used to authenticate HTTPS requests. The token value should be updated before its expiration. - :type `~azure.storage.common.TokenCredential` + :type `~..common.TokenCredential` ''' service_params = _ServiceParameters.get_service_parameters( 'blob', @@ -322,7 +322,7 @@ def generate_account_shared_access_signature(self, resource_types, permission, restricts the request to those IP addresses. :param str protocol: Specifies the protocol permitted for a request made. The default value - is https,http. See :class:`~azure.storage.common.models.Protocol` for possible values. + is https,http. See :class:`~..common.models.Protocol` for possible values. :return: A Shared Access Signature (sas) token. :rtype: str ''' @@ -379,7 +379,7 @@ def generate_container_shared_access_signature(self, container_name, restricts the request to those IP addresses. :param str protocol: Specifies the protocol permitted for a request made. The default value - is https,http. See :class:`~azure.storage.common.models.Protocol` for possible values. + is https,http. See :class:`~..common.models.Protocol` for possible values. :param str cache_control: Response header value for Cache-Control when resource is accessed using this shared access signature. @@ -465,7 +465,7 @@ def generate_blob_shared_access_signature( restricts the request to those IP addresses. :param str protocol: Specifies the protocol permitted for a request made. The default value - is https,http. See :class:`~azure.storage.common.models.Protocol` for possible values. + is https,http. See :class:`~..common.models.Protocol` for possible values. :param str cache_control: Response header value for Cache-Control when resource is accessed using this shared access signature. @@ -748,7 +748,7 @@ def get_container_acl(self, container_name, lease_id=None, timeout=None): :param int timeout: The timeout parameter is expressed in seconds. :return: A dictionary of access policies associated with the container. dict of str to - :class:`azure.storage.common.models.AccessPolicy` and a public_access property + :class:`..common.models.AccessPolicy` and a public_access property if public access is turned on ''' _validate_not_none('container_name', container_name) @@ -779,7 +779,7 @@ def set_container_acl(self, container_name, signed_identifiers=None, A dictionary of access policies to associate with the container. The dictionary may contain up to 5 elements. An empty dictionary will clear the access policies set on the service. - :type signed_identifiers: dict(str, :class:`~azure.storage.common.models.AccessPolicy`) + :type signed_identifiers: dict(str, :class:`~..common.models.AccessPolicy`) :param ~azure.storage.blob.models.PublicAccess public_access: Possible values include: container, blob. :param str lease_id: @@ -1339,7 +1339,7 @@ def get_blob_service_stats(self, timeout=None): :param int timeout: The timeout parameter is expressed in seconds. :return: The blob service stats. - :rtype: :class:`~azure.storage.common.models.ServiceStats` + :rtype: :class:`~..common.models.ServiceStats` ''' request = HTTPRequest() request.method = 'GET' @@ -1364,22 +1364,22 @@ def set_blob_service_properties( :param logging: Groups the Azure Analytics Logging settings. :type logging: - :class:`~azure.storage.common.models.Logging` + :class:`~..common.models.Logging` :param hour_metrics: The hour metrics settings provide a summary of request statistics grouped by API in hourly aggregates for blobs. :type hour_metrics: - :class:`~azure.storage.common.models.Metrics` + :class:`~..common.models.Metrics` :param minute_metrics: The minute metrics settings provide request statistics for each minute for blobs. :type minute_metrics: - :class:`~azure.storage.common.models.Metrics` + :class:`~..common.models.Metrics` :param cors: You can include up to five CorsRule elements in the list. If an empty list is specified, all CORS rules will be deleted, and CORS will be disabled for the service. - :type cors: list(:class:`~azure.storage.common.models.CorsRule`) + :type cors: list(:class:`~..common.models.CorsRule`) :param str target_version: Indicates the default version to use for requests if an incoming request's version is not specified. @@ -1389,7 +1389,7 @@ def set_blob_service_properties( The delete retention policy specifies whether to retain deleted blobs. It also specifies the number of days and versions of blob to keep. :type delete_retention_policy: - :class:`~azure.storage.common.models.DeleteRetentionPolicy` + :class:`~..common.models.DeleteRetentionPolicy` ''' request = HTTPRequest() request.method = 'PUT' @@ -1413,7 +1413,7 @@ def get_blob_service_properties(self, timeout=None): :param int timeout: The timeout parameter is expressed in seconds. - :return: The blob :class:`~azure.storage.common.models.ServiceProperties` with an attached + :return: The blob :class:`~..common.models.ServiceProperties` with an attached target_version property. ''' request = HTTPRequest() diff --git a/src/storage-preview/azext_storage_preview/azure_storage/blob/blockblobservice.py b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/blockblobservice.py similarity index 99% rename from src/storage-preview/azext_storage_preview/azure_storage/blob/blockblobservice.py rename to src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/blockblobservice.py index f289de8a88b..aafed26b94a 100644 --- a/src/storage-preview/azext_storage_preview/azure_storage/blob/blockblobservice.py +++ b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/blockblobservice.py @@ -10,18 +10,18 @@ path, ) -from azure.storage.common._common_conversion import ( +from ..common._common_conversion import ( _encode_base64, _to_str, _int_to_str, _datetime_to_utc_string, _get_content_md5, ) -from azure.storage.common._constants import ( +from ..common._constants import ( SERVICE_HOST_BASE, DEFAULT_PROTOCOL, ) -from azure.storage.common._error import ( +from ..common._error import ( _validate_not_none, _validate_type_bytes, _validate_encryption_required, @@ -29,14 +29,14 @@ _ERROR_VALUE_NEGATIVE, _ERROR_VALUE_SHOULD_BE_STREAM ) -from azure.storage.common._http import HTTPRequest -from azure.storage.common._serialization import ( +from ..common._http import HTTPRequest +from ..common._serialization import ( _get_request_body, _get_data_bytes_only, _get_data_bytes_or_stream_only, _add_metadata_headers, ) -from azure.storage.common._serialization import ( +from ..common._serialization import ( _len_plus ) from ._deserialization import ( @@ -137,7 +137,7 @@ def __init__(self, account_name=None, account_key=None, sas_token=None, is_emula :param token_credential: A token credential used to authenticate HTTPS requests. The token value should be updated before its expiration. - :type `~azure.storage.common.TokenCredential` + :type `~..common.TokenCredential` ''' self.blob_type = _BlobTypes.BlockBlob super(BlockBlobService, self).__init__( diff --git a/src/storage-preview/azext_storage_preview/azure_storage/blob/models.py b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/models.py similarity index 99% rename from src/storage-preview/azext_storage_preview/azure_storage/blob/models.py rename to src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/models.py index 7611e823468..1f9cd20cb28 100644 --- a/src/storage-preview/azext_storage_preview/azure_storage/blob/models.py +++ b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/models.py @@ -3,7 +3,7 @@ # Licensed under the MIT License. See License.txt in the project root for # license information. # -------------------------------------------------------------------------- -from azure.storage.common._common_conversion import _to_str +from ..common._common_conversion import _to_str class Container(object): diff --git a/src/storage-preview/azext_storage_preview/azure_storage/blob/pageblobservice.py b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/pageblobservice.py similarity index 99% rename from src/storage-preview/azext_storage_preview/azure_storage/blob/pageblobservice.py rename to src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/pageblobservice.py index 4fe198b49ab..cfeea646fa6 100644 --- a/src/storage-preview/azext_storage_preview/azure_storage/blob/pageblobservice.py +++ b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/pageblobservice.py @@ -6,25 +6,25 @@ import sys from os import path -from azure.storage.common._common_conversion import ( +from ..common._common_conversion import ( _int_to_str, _to_str, _datetime_to_utc_string, _get_content_md5, ) -from azure.storage.common._constants import ( +from ..common._constants import ( SERVICE_HOST_BASE, DEFAULT_PROTOCOL, ) -from azure.storage.common._error import ( +from ..common._error import ( _validate_not_none, _validate_type_bytes, _validate_encryption_required, _validate_encryption_unsupported, _ERROR_VALUE_NEGATIVE, ) -from azure.storage.common._http import HTTPRequest -from azure.storage.common._serialization import ( +from ..common._http import HTTPRequest +from ..common._serialization import ( _get_data_bytes_only, _add_metadata_headers, ) @@ -122,7 +122,7 @@ def __init__(self, account_name=None, account_key=None, sas_token=None, is_emula :param token_credential: A token credential used to authenticate HTTPS requests. The token value should be updated before its expiration. - :type `~azure.storage.common.TokenCredential` + :type `~..common.TokenCredential` ''' self.blob_type = _BlobTypes.PageBlob super(PageBlobService, self).__init__( diff --git a/src/storage-preview/azext_storage_preview/azure_storage/blob/sharedaccesssignature.py b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/sharedaccesssignature.py similarity index 97% rename from src/storage-preview/azext_storage_preview/azure_storage/blob/sharedaccesssignature.py rename to src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/sharedaccesssignature.py index 67dcfb1d4de..472ce7875ce 100644 --- a/src/storage-preview/azext_storage_preview/azure_storage/blob/sharedaccesssignature.py +++ b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/sharedaccesssignature.py @@ -4,7 +4,7 @@ # license information. # -------------------------------------------------------------------------- -from azure.storage.common.sharedaccesssignature import ( +from ..common.sharedaccesssignature import ( SharedAccessSignature, _SharedAccessHelper, ) @@ -75,7 +75,7 @@ def generate_blob(self, container_name, blob_name, permission=None, restricts the request to those IP addresses. :param str protocol: Specifies the protocol permitted for a request made. The default value - is https,http. See :class:`~azure.storage.common.models.Protocol` for possible values. + is https,http. See :class:`~..common.models.Protocol` for possible values. :param str cache_control: Response header value for Cache-Control when resource is accessed using this shared access signature. @@ -150,7 +150,7 @@ def generate_container(self, container_name, permission=None, expiry=None, restricts the request to those IP addresses. :param str protocol: Specifies the protocol permitted for a request made. The default value - is https,http. See :class:`~azure.storage.common.models.Protocol` for possible values. + is https,http. See :class:`~..common.models.Protocol` for possible values. :param str cache_control: Response header value for Cache-Control when resource is accessed using this shared access signature. diff --git a/src/storage-preview/azext_storage_preview/azure_storage/common/__init__.py b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/__init__.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/common/__init__.py rename to src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/__init__.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/common/_auth.py b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/_auth.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/common/_auth.py rename to src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/_auth.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/common/_common_conversion.py b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/_common_conversion.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/common/_common_conversion.py rename to src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/_common_conversion.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/common/_connection.py b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/_connection.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/common/_connection.py rename to src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/_connection.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/common/_constants.py b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/_constants.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/common/_constants.py rename to src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/_constants.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/common/_deserialization.py b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/_deserialization.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/common/_deserialization.py rename to src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/_deserialization.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/common/_encryption.py b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/_encryption.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/common/_encryption.py rename to src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/_encryption.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/common/_error.py b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/_error.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/common/_error.py rename to src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/_error.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/common/_http/__init__.py b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/_http/__init__.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/common/_http/__init__.py rename to src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/_http/__init__.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/common/_http/httpclient.py b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/_http/httpclient.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/common/_http/httpclient.py rename to src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/_http/httpclient.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/common/_serialization.py b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/_serialization.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/common/_serialization.py rename to src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/_serialization.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/common/cloudstorageaccount.py b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/cloudstorageaccount.py similarity index 98% rename from src/storage-preview/azext_storage_preview/azure_storage/common/cloudstorageaccount.py rename to src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/cloudstorageaccount.py index 5ea30e0843b..92b9134a82a 100644 --- a/src/storage-preview/azext_storage_preview/azure_storage/common/cloudstorageaccount.py +++ b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/cloudstorageaccount.py @@ -9,13 +9,13 @@ # ie. we don't want 'import azure.storage' to trigger an automatic import # of blob/queue/file packages. -from azure.storage.common._error import _validate_not_none -from azure.storage.common.models import ( +from ._error import _validate_not_none +from .models import ( ResourceTypes, Services, AccountPermissions, ) -from azure.storage.common.sharedaccesssignature import ( +from .sharedaccesssignature import ( SharedAccessSignature, ) diff --git a/src/storage-preview/azext_storage_preview/azure_storage/common/models.py b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/models.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/common/models.py rename to src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/models.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/common/retry.py b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/retry.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/common/retry.py rename to src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/retry.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/common/sharedaccesssignature.py b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/sharedaccesssignature.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/common/sharedaccesssignature.py rename to src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/sharedaccesssignature.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/common/storageclient.py b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/storageclient.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/common/storageclient.py rename to src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/storageclient.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/common/tokencredential.py b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/tokencredential.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/common/tokencredential.py rename to src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/tokencredential.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/file/__init__.py b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/file/__init__.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/file/__init__.py rename to src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/file/__init__.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/file/_constants.py b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/file/_constants.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/file/_constants.py rename to src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/file/_constants.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/file/_deserialization.py b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/file/_deserialization.py similarity index 97% rename from src/storage-preview/azext_storage_preview/azure_storage/file/_deserialization.py rename to src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/file/_deserialization.py index cc75d38c3b4..e1e4ec40ff0 100644 --- a/src/storage-preview/azext_storage_preview/azure_storage/file/_deserialization.py +++ b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/file/_deserialization.py @@ -18,15 +18,15 @@ ShareProperties, DirectoryProperties, ) -from azure.storage.common.models import ( +from ..common.models import ( _list, ) -from azure.storage.common._deserialization import ( +from ..common._deserialization import ( _parse_properties, _parse_metadata, ) -from azure.storage.common._error import _validate_content_match -from azure.storage.common._common_conversion import ( +from ..common._error import _validate_content_match +from ..common._common_conversion import ( _get_content_md5, _to_str, ) diff --git a/src/storage-preview/azext_storage_preview/azure_storage/file/_download_chunking.py b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/file/_download_chunking.py similarity index 98% rename from src/storage-preview/azext_storage_preview/azure_storage/file/_download_chunking.py rename to src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/file/_download_chunking.py index f9d859e2414..5eb2bdb461b 100644 --- a/src/storage-preview/azext_storage_preview/azure_storage/file/_download_chunking.py +++ b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/file/_download_chunking.py @@ -5,7 +5,7 @@ # -------------------------------------------------------------------------- import threading -from azure.storage.common._error import _ERROR_NO_SINGLE_THREAD_CHUNKING +from ..common._error import _ERROR_NO_SINGLE_THREAD_CHUNKING def _download_file_chunks(file_service, share_name, directory_name, file_name, diff --git a/src/storage-preview/azext_storage_preview/azure_storage/file/_serialization.py b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/file/_serialization.py similarity index 96% rename from src/storage-preview/azext_storage_preview/azure_storage/file/_serialization.py rename to src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/file/_serialization.py index 50b7979cbcd..03aecd12ee5 100644 --- a/src/storage-preview/azext_storage_preview/azure_storage/file/_serialization.py +++ b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/file/_serialization.py @@ -3,8 +3,8 @@ # Licensed under the MIT License. See License.txt in the project root for # license information. # -------------------------------------------------------------------------- -from azure.storage.common._common_conversion import _str -from azure.storage.common._error import ( +from ..common._common_conversion import _str +from ..common._error import ( _validate_not_none, _ERROR_START_END_NEEDED_FOR_MD5, _ERROR_RANGE_TOO_LARGE_FOR_MD5, diff --git a/src/storage-preview/azext_storage_preview/azure_storage/file/_upload_chunking.py b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/file/_upload_chunking.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/file/_upload_chunking.py rename to src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/file/_upload_chunking.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/file/fileservice.py b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/file/fileservice.py similarity index 99% rename from src/storage-preview/azext_storage_preview/azure_storage/file/fileservice.py rename to src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/file/fileservice.py index 2f8cc0a584e..4872e107804 100644 --- a/src/storage-preview/azext_storage_preview/azure_storage/file/fileservice.py +++ b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/file/fileservice.py @@ -8,29 +8,29 @@ from azure.common import AzureHttpError -from azure.storage.common._auth import ( +from ..common._auth import ( _StorageSharedKeyAuthentication, _StorageSASAuthentication, ) -from azure.storage.common._common_conversion import ( +from ..common._common_conversion import ( _int_to_str, _to_str, _get_content_md5, ) -from azure.storage.common._connection import _ServiceParameters -from azure.storage.common._constants import ( +from ..common._connection import _ServiceParameters +from ..common._constants import ( SERVICE_HOST_BASE, DEFAULT_PROTOCOL, DEV_ACCOUNT_NAME, ) -from azure.storage.common._deserialization import ( +from ..common._deserialization import ( _convert_xml_to_service_properties, _convert_xml_to_signed_identifiers, _parse_metadata, _parse_properties, _parse_length_from_content_range, ) -from azure.storage.common._error import ( +from ..common._error import ( _dont_fail_not_exist, _dont_fail_on_exist, _validate_not_none, @@ -41,15 +41,15 @@ _ERROR_PARALLEL_NOT_SEEKABLE, _validate_access_policies, ) -from azure.storage.common._http import HTTPRequest -from azure.storage.common._serialization import ( +from ..common._http import HTTPRequest +from ..common._serialization import ( _get_request_body, _get_data_bytes_only, _convert_signed_identifiers_to_xml, _convert_service_properties_to_xml, _add_metadata_headers, ) -from azure.storage.common.models import ( +from ..common.models import ( Services, ListGenerator, _OperationContext, @@ -57,7 +57,7 @@ from .sharedaccesssignature import ( FileSharedAccessSignature, ) -from azure.storage.common.storageclient import StorageClient +from ..common.storageclient import StorageClient from ._deserialization import ( _convert_xml_to_shares, _convert_xml_to_directories_and_files, @@ -480,7 +480,7 @@ def set_file_service_properties(self, hour_metrics=None, minute_metrics=None, You can include up to five CorsRule elements in the list. If an empty list is specified, all CORS rules will be deleted, and CORS will be disabled for the service. - :type cors: list(:class:`~azure.storage.common.models.CorsRule`) + :type cors: list(:class:`~..common.models.CorsRule`) :param int timeout: The timeout parameter is expressed in seconds. ''' @@ -507,7 +507,7 @@ def get_file_service_properties(self, timeout=None): The timeout parameter is expressed in seconds. :return: The file service properties. :rtype: - :class:`~azure.storage.common.models.ServiceProperties` + :class:`~..common.models.ServiceProperties` ''' request = HTTPRequest() request.method = 'GET' @@ -816,7 +816,7 @@ def get_share_acl(self, share_name, timeout=None): :param int timeout: The timeout parameter is expressed in seconds. :return: A dictionary of access policies associated with the share. - :rtype: dict(str, :class:`~azure.storage.common.models.AccessPolicy`) + :rtype: dict(str, :class:`~..common.models.AccessPolicy`) ''' _validate_not_none('share_name', share_name) request = HTTPRequest() @@ -842,7 +842,7 @@ def set_share_acl(self, share_name, signed_identifiers=None, timeout=None): A dictionary of access policies to associate with the share. The dictionary may contain up to 5 elements. An empty dictionary will clear the access policies set on the service. - :type signed_identifiers: dict(str, :class:`~azure.storage.common.models.AccessPolicy`) + :type signed_identifiers: dict(str, :class:`~..common.models.AccessPolicy`) :param int timeout: The timeout parameter is expressed in seconds. ''' diff --git a/src/storage-preview/azext_storage_preview/azure_storage/file/models.py b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/file/models.py similarity index 99% rename from src/storage-preview/azext_storage_preview/azure_storage/file/models.py rename to src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/file/models.py index 2c41ccaab82..08113710226 100644 --- a/src/storage-preview/azext_storage_preview/azure_storage/file/models.py +++ b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/file/models.py @@ -3,7 +3,7 @@ # Licensed under the MIT License. See License.txt in the project root for # license information. # -------------------------------------------------------------------------- -from azure.storage.common._common_conversion import _to_str +from ..common._common_conversion import _to_str class Share(object): diff --git a/src/storage-preview/azext_storage_preview/azure_storage/file/sharedaccesssignature.py b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/file/sharedaccesssignature.py similarity index 96% rename from src/storage-preview/azext_storage_preview/azure_storage/file/sharedaccesssignature.py rename to src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/file/sharedaccesssignature.py index afa53199f3d..de52de1ee4c 100644 --- a/src/storage-preview/azext_storage_preview/azure_storage/file/sharedaccesssignature.py +++ b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/file/sharedaccesssignature.py @@ -4,11 +4,11 @@ # license information. # -------------------------------------------------------------------------- -from azure.storage.common.sharedaccesssignature import ( +from ..common.sharedaccesssignature import ( SharedAccessSignature, _SharedAccessHelper, ) -from azure.storage.common._common_conversion import ( +from ..common._common_conversion import ( _to_str, ) from ._constants import X_MS_VERSION @@ -81,7 +81,7 @@ def generate_file(self, share_name, directory_name=None, file_name=None, restricts the request to those IP addresses. :param str protocol: Specifies the protocol permitted for a request made. The default value - is https,http. See :class:`~azure.storage.common.models.Protocol` for possible values. + is https,http. See :class:`~..common.models.Protocol` for possible values. :param str cache_control: Response header value for Cache-Control when resource is accessed using this shared access signature. @@ -159,7 +159,7 @@ def generate_share(self, share_name, permission=None, expiry=None, restricts the request to those IP addresses. :param str protocol: Specifies the protocol permitted for a request made. The default value - is https,http. See :class:`~azure.storage.common.models.Protocol` for possible values. + is https,http. See :class:`~..common.models.Protocol` for possible values. :param str cache_control: Response header value for Cache-Control when resource is accessed using this shared access signature. diff --git a/src/storage-preview/azext_storage_preview/azure_storage/queue/__init__.py b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/queue/__init__.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/queue/__init__.py rename to src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/queue/__init__.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/queue/_constants.py b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/queue/_constants.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/queue/_constants.py rename to src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/queue/_constants.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/queue/_deserialization.py b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/queue/_deserialization.py similarity index 98% rename from src/storage-preview/azext_storage_preview/azure_storage/queue/_deserialization.py rename to src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/queue/_deserialization.py index dc8bf04b8c5..d0ef2973c9e 100644 --- a/src/storage-preview/azext_storage_preview/azure_storage/queue/_deserialization.py +++ b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/queue/_deserialization.py @@ -14,10 +14,10 @@ Queue, QueueMessage, ) -from azure.storage.common.models import ( +from ..common.models import ( _list, ) -from azure.storage.common._deserialization import ( +from ..common._deserialization import ( _to_int, _parse_metadata, ) diff --git a/src/storage-preview/azext_storage_preview/azure_storage/queue/_encryption.py b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/queue/_encryption.py similarity index 97% rename from src/storage-preview/azext_storage_preview/azure_storage/queue/_encryption.py rename to src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/queue/_encryption.py index 8655e253b33..75979f36411 100644 --- a/src/storage-preview/azext_storage_preview/azure_storage/queue/_encryption.py +++ b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/queue/_encryption.py @@ -15,18 +15,18 @@ ) from cryptography.hazmat.primitives.padding import PKCS7 -from azure.storage.common._common_conversion import ( +from ..common._common_conversion import ( _encode_base64, _decode_base64_to_bytes ) -from azure.storage.common._encryption import ( +from ..common._encryption import ( _generate_encryption_data_dict, _dict_to_encryption_data, _generate_AES_CBC_cipher, _validate_and_unwrap_cek, _EncryptionAlgorithm, ) -from azure.storage.common._error import ( +from ..common._error import ( _ERROR_DECRYPTION_FAILURE, _ERROR_UNSUPPORTED_ENCRYPTION_ALGORITHM, _validate_not_none, diff --git a/src/storage-preview/azext_storage_preview/azure_storage/queue/_error.py b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/queue/_error.py similarity index 95% rename from src/storage-preview/azext_storage_preview/azure_storage/queue/_error.py rename to src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/queue/_error.py index aa64fe145c3..cb15935dd8b 100644 --- a/src/storage-preview/azext_storage_preview/azure_storage/queue/_error.py +++ b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/queue/_error.py @@ -5,7 +5,7 @@ # -------------------------------------------------------------------------- import sys -from azure.storage.common._error import ( +from ..common._error import ( _validate_type_bytes, ) diff --git a/src/storage-preview/azext_storage_preview/azure_storage/queue/_serialization.py b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/queue/_serialization.py similarity index 97% rename from src/storage-preview/azext_storage_preview/azure_storage/queue/_serialization.py rename to src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/queue/_serialization.py index 9dde20595e0..21569e5f508 100644 --- a/src/storage-preview/azext_storage_preview/azure_storage/queue/_serialization.py +++ b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/queue/_serialization.py @@ -18,7 +18,7 @@ except ImportError: from xml.etree import ElementTree as ETree -from azure.storage.common._common_conversion import ( +from ..common._common_conversion import ( _str, ) from ._encryption import ( diff --git a/src/storage-preview/azext_storage_preview/azure_storage/queue/models.py b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/queue/models.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/queue/models.py rename to src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/queue/models.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/queue/queueservice.py b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/queue/queueservice.py similarity index 97% rename from src/storage-preview/azext_storage_preview/azure_storage/queue/queueservice.py rename to src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/queue/queueservice.py index 6ba5be7e66b..6bd1903013c 100644 --- a/src/storage-preview/azext_storage_preview/azure_storage/queue/queueservice.py +++ b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/queue/queueservice.py @@ -8,26 +8,26 @@ AzureHttpError, ) -from azure.storage.common._auth import ( +from ..common._auth import ( _StorageSASAuthentication, _StorageSharedKeyAuthentication, _StorageTokenAuthentication, ) -from azure.storage.common._common_conversion import ( +from ..common._common_conversion import ( _int_to_str, _to_str, ) -from azure.storage.common._connection import _ServiceParameters -from azure.storage.common._constants import ( +from ..common._connection import _ServiceParameters +from ..common._constants import ( SERVICE_HOST_BASE, DEFAULT_PROTOCOL, ) -from azure.storage.common._deserialization import ( +from ..common._deserialization import ( _convert_xml_to_service_properties, _convert_xml_to_signed_identifiers, _convert_xml_to_service_stats, ) -from azure.storage.common._error import ( +from ..common._error import ( _dont_fail_not_exist, _dont_fail_on_exist, _validate_not_none, @@ -37,18 +37,18 @@ _validate_encryption_required, _validate_decryption_required, ) -from azure.storage.common._http import ( +from ..common._http import ( HTTPRequest, ) -from azure.storage.common._serialization import ( +from ..common._serialization import ( _convert_signed_identifiers_to_xml, _convert_service_properties_to_xml, ) -from azure.storage.common._serialization import ( +from ..common._serialization import ( _get_request_body, _add_metadata_headers, ) -from azure.storage.common.models import ( +from ..common.models import ( Services, ListGenerator, _OperationContext, @@ -56,7 +56,7 @@ from .sharedaccesssignature import ( QueueSharedAccessSignature, ) -from azure.storage.common.storageclient import StorageClient +from ..common.storageclient import StorageClient from ._deserialization import ( _convert_xml_to_queues, _convert_xml_to_queue_messages, @@ -163,7 +163,7 @@ def __init__(self, account_name=None, account_key=None, sas_token=None, is_emula :param token_credential: A token credential used to authenticate HTTPS requests. The token value should be updated before its expiration. - :type `~azure.storage.common.TokenCredential` + :type `~..common.TokenCredential` ''' service_params = _ServiceParameters.get_service_parameters( 'queue', @@ -238,7 +238,7 @@ def generate_account_shared_access_signature(self, resource_types, permission, restricts the request to those IP addresses. :param str protocol: Specifies the protocol permitted for a request made. The default value - is https,http. See :class:`~azure.storage.common.models.Protocol` for possible values. + is https,http. See :class:`~..common.models.Protocol` for possible values. :return: A Shared Access Signature (sas) token. :rtype: str ''' @@ -293,7 +293,7 @@ def generate_queue_shared_access_signature(self, queue_name, restricts the request to those IP addresses. :param str protocol: Specifies the protocol permitted for a request made. The default value - is https,http. See :class:`~azure.storage.common.models.Protocol` for possible values. + is https,http. See :class:`~..common.models.Protocol` for possible values. :return: A Shared Access Signature (sas) token. :rtype: str ''' @@ -334,7 +334,7 @@ def get_queue_service_stats(self, timeout=None): :param int timeout: The timeout parameter is expressed in seconds. :return: The queue service stats. - :rtype: :class:`~azure.storage.common.models.ServiceStats` + :rtype: :class:`~..common.models.ServiceStats` ''' request = HTTPRequest() request.method = 'GET' @@ -356,7 +356,7 @@ def get_queue_service_properties(self, timeout=None): :param int timeout: The server timeout, expressed in seconds. :return: The queue service properties. - :rtype: :class:`~azure.storage.common.models.ServiceProperties` + :rtype: :class:`~..common.models.ServiceProperties` ''' request = HTTPRequest() request.method = 'GET' @@ -393,7 +393,7 @@ def set_queue_service_properties(self, logging=None, hour_metrics=None, and CORS will be disabled for the service. For detailed information about CORS rules and evaluation logic, see https://msdn.microsoft.com/en-us/library/azure/dn535601.aspx. - :type cors: list(:class:`~azure.storage.common.models.CorsRule`) + :type cors: list(:class:`~..common.models.CorsRule`) :param int timeout: The server timeout, expressed in seconds. ''' @@ -662,7 +662,7 @@ def get_queue_acl(self, queue_name, timeout=None): :param int timeout: The server timeout, expressed in seconds. :return: A dictionary of access policies associated with the queue. - :rtype: dict(str, :class:`~azure.storage.common.models.AccessPolicy`) + :rtype: dict(str, :class:`~..common.models.AccessPolicy`) ''' _validate_not_none('queue_name', queue_name) request = HTTPRequest() @@ -698,7 +698,7 @@ def set_queue_acl(self, queue_name, signed_identifiers=None, timeout=None): A dictionary of access policies to associate with the queue. The dictionary may contain up to 5 elements. An empty dictionary will clear the access policies set on the service. - :type signed_identifiers: dict(str, :class:`~azure.storage.common.models.AccessPolicy`) + :type signed_identifiers: dict(str, :class:`~..common.models.AccessPolicy`) :param int timeout: The server timeout, expressed in seconds. ''' diff --git a/src/storage-preview/azext_storage_preview/azure_storage/queue/sharedaccesssignature.py b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/queue/sharedaccesssignature.py similarity index 96% rename from src/storage-preview/azext_storage_preview/azure_storage/queue/sharedaccesssignature.py rename to src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/queue/sharedaccesssignature.py index ea225aec52a..1cf585a48b6 100644 --- a/src/storage-preview/azext_storage_preview/azure_storage/queue/sharedaccesssignature.py +++ b/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/queue/sharedaccesssignature.py @@ -4,7 +4,7 @@ # license information. # -------------------------------------------------------------------------- -from azure.storage.common.sharedaccesssignature import ( +from ..common.sharedaccesssignature import ( SharedAccessSignature, _SharedAccessHelper, ) @@ -71,7 +71,7 @@ def generate_queue(self, queue_name, permission=None, restricts the request to those IP addresses. :param str protocol: Specifies the protocol permitted for a request made. The default value - is https,http. See :class:`~azure.storage.common.models.Protocol` for possible values. + is https,http. See :class:`~..common.models.Protocol` for possible values. ''' sas = _SharedAccessHelper() sas.add_base(permission, expiry, start, ip, protocol, self.x_ms_version) diff --git a/src/storage-preview/azext_storage_preview/commands.py b/src/storage-preview/azext_storage_preview/commands.py index 22dae90d9eb..adf27e3219c 100644 --- a/src/storage-preview/azext_storage_preview/commands.py +++ b/src/storage-preview/azext_storage_preview/commands.py @@ -11,6 +11,7 @@ cloud_storage_account_service_factory, multi_service_properties_factory) from .sdkutil import cosmosdb_table_exists +from .profiles import CUSTOM_DATA_STORAGE def load_command_table(self, _): # pylint: disable=too-many-locals, too-many-statements @@ -29,7 +30,7 @@ def load_command_table(self, _): # pylint: disable=too-many-locals, too-many-st client_factory=cloud_storage_account_service_factory ) - def get_custom_sdk(custom_module, client_factory, resource_type=ResourceType.DATA_STORAGE): + def get_custom_sdk(custom_module, client_factory, resource_type=CUSTOM_DATA_STORAGE): """Returns a CliCommandType instance with specified operation template based on the given custom module name. This is useful when the command is not defined in the default 'custom' module but instead in a module under 'operations' package.""" @@ -41,7 +42,6 @@ def get_custom_sdk(custom_module, client_factory, resource_type=ResourceType.DAT with self.command_group('storage account', storage_account_sdk, resource_type=ResourceType.MGMT_STORAGE, custom_command_type=storage_account_custom_type) as g: - g.custom_command('test', 'test') g.command('check-name', 'check_name_availability') g.custom_command('create', 'create_storage_account', min_api='2016-01-01') g.command('delete', 'delete', confirmation=True) @@ -79,12 +79,12 @@ def get_custom_sdk(custom_module, client_factory, resource_type=ResourceType.DAT block_blob_sdk = CliCommandType( operations_tmpl='azure.multiapi.storage.blob.blockblobservice#BlockBlobService.{}', client_factory=blob_data_service_factory, - resource_type=ResourceType.DATA_STORAGE) + resource_type=CUSTOM_DATA_STORAGE) base_blob_sdk = CliCommandType( operations_tmpl='azure.multiapi.storage.blob.baseblobservice#BaseBlobService.{}', client_factory=blob_data_service_factory, - resource_type=ResourceType.DATA_STORAGE) + resource_type=CUSTOM_DATA_STORAGE) with self.command_group('storage blob', command_type=block_blob_sdk, custom_command_type=get_custom_sdk('blob', blob_data_service_factory)) as g: @@ -130,14 +130,14 @@ def get_custom_sdk(custom_module, client_factory, resource_type=ResourceType.DAT with self.command_group('storage blob incremental-copy', operations_tmpl='azure.multiapi.storage.blob.pageblobservice#PageBlobService.{}', client_factory=page_blob_service_factory, - resource_type=ResourceType.DATA_STORAGE, + resource_type=CUSTOM_DATA_STORAGE, min_api='2016-05-31') as g: g.storage_command('start', 'incremental_copy_blob') with self.command_group('storage blob incremental-copy', operations_tmpl='azure.multiapi.storage.blob.blockblobservice#BlockBlobService.{}', client_factory=page_blob_service_factory, - resource_type=ResourceType.DATA_STORAGE, + resource_type=CUSTOM_DATA_STORAGE, min_api='2016-05-31') as g: g.storage_command('cancel', 'abort_copy_blob') @@ -189,7 +189,7 @@ def get_custom_sdk(custom_module, client_factory, resource_type=ResourceType.DAT file_sdk = CliCommandType( operations_tmpl='azure.multiapi.storage.file.fileservice#FileService.{}', client_factory=file_data_service_factory, - resource_type=ResourceType.DATA_STORAGE) + resource_type=CUSTOM_DATA_STORAGE) with self.command_group('storage share', command_type=file_sdk, custom_command_type=get_custom_sdk('acl', file_data_service_factory)) as g: @@ -270,7 +270,7 @@ def get_custom_sdk(custom_module, client_factory, resource_type=ResourceType.DAT queue_sdk = CliCommandType(operations_tmpl='azure.multiapi.storage.queue.queueservice#QueueService.{}', client_factory=queue_data_service_factory, - resource_type=ResourceType.DATA_STORAGE) + resource_type=CUSTOM_DATA_STORAGE) with self.command_group('storage queue', queue_sdk, custom_command_type=get_custom_sdk('acl', queue_data_service_factory)) as g: diff --git a/src/storage-preview/azext_storage_preview/operations/account.py b/src/storage-preview/azext_storage_preview/operations/account.py index d6a10f8bd9d..5179065c176 100644 --- a/src/storage-preview/azext_storage_preview/operations/account.py +++ b/src/storage-preview/azext_storage_preview/operations/account.py @@ -7,12 +7,6 @@ from .._client_factory import storage_client_factory -def test(willie, stuff): - from azext_storage_preview.azure_storage import blob - print(blob) - print("willie: ", willie) - print("stuff: ", stuff) - def create_storage_account(cmd, resource_group_name, account_name, sku=None, location=None, kind=None, tags=None, custom_domain=None, encryption_services=None, access_tier=None, https_only=None, diff --git a/src/storage-preview/azext_storage_preview/profiles.py b/src/storage-preview/azext_storage_preview/profiles.py new file mode 100644 index 00000000000..08e06337853 --- /dev/null +++ b/src/storage-preview/azext_storage_preview/profiles.py @@ -0,0 +1,10 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# -------------------------------------------------------------------------------------------- + +from azure.cli.core.profiles import CustomResourceType, ResourceType + + +CUSTOM_DATA_STORAGE = CustomResourceType('azext_storage_preview.azure_storage', None) +# CUSTOM_DATA_STORAGE = ResourceType.DATA_STORAGE diff --git a/src/storage-preview/azext_storage_preview/sdkutil.py b/src/storage-preview/azext_storage_preview/sdkutil.py index 32db691a955..e1b7b7cf5e0 100644 --- a/src/storage-preview/azext_storage_preview/sdkutil.py +++ b/src/storage-preview/azext_storage_preview/sdkutil.py @@ -7,6 +7,7 @@ from azure.cli.core.profiles import get_sdk, supported_api_version, ResourceType from azure.cli.core.profiles._shared import APIVersionException +from .profiles import CUSTOM_DATA_STORAGE def cosmosdb_table_exists(cli_ctx): @@ -20,14 +21,16 @@ def get_table_data_type(cli_ctx, module_name, *type_names): if cosmosdb_table_exists(cli_ctx): return get_sdk(cli_ctx, ResourceType.DATA_COSMOS_TABLE, *type_names, mod=module_name) - return get_sdk(cli_ctx, ResourceType.DATA_STORAGE, *type_names, mod=module_name) + return get_sdk(cli_ctx, CUSTOM_DATA_STORAGE, *type_names, mod=module_name) def get_blob_service_by_type(cli_ctx, blob_type): + print("here") + print(get_sdk(cli_ctx, CUSTOM_DATA_STORAGE, 'BlockBlobService', mod='blob')) type_to_service = { - 'block': lambda ctx: get_sdk(ctx, ResourceType.DATA_STORAGE, 'BlockBlobService', mod='blob'), - 'page': lambda ctx: get_sdk(ctx, ResourceType.DATA_STORAGE, 'PageBlobService', mod='blob'), - 'append': lambda ctx: get_sdk(ctx, ResourceType.DATA_STORAGE, 'AppendBlobService', mod='blob') + 'block': lambda ctx: get_sdk(ctx, CUSTOM_DATA_STORAGE, 'BlockBlobService', mod='blob'), + 'page': lambda ctx: get_sdk(ctx, CUSTOM_DATA_STORAGE, 'PageBlobService', mod='blob'), + 'append': lambda ctx: get_sdk(ctx, CUSTOM_DATA_STORAGE, 'AppendBlobService', mod='blob') } try: @@ -41,7 +44,7 @@ def get_blob_types(): def get_blob_tier_names(cli_ctx, model): - t_blob_tier_model = get_sdk(cli_ctx, ResourceType.DATA_STORAGE, 'blob.models#' + model) + t_blob_tier_model = get_sdk(cli_ctx, CUSTOM_DATA_STORAGE, 'blob.models#' + model) return [v for v in dir(t_blob_tier_model) if not v.startswith('_')] @@ -50,7 +53,7 @@ def get_delete_blob_snapshot_type_names(): def get_delete_blob_snapshot_type(cli_ctx, name): - t_delete_snapshot = get_sdk(cli_ctx, ResourceType.DATA_STORAGE, 'DeleteSnapshot', mod='blob') + t_delete_snapshot = get_sdk(cli_ctx, CUSTOM_DATA_STORAGE, 'DeleteSnapshot', mod='blob') return {'include': t_delete_snapshot.Include, 'only': t_delete_snapshot.Only}[name] @@ -59,7 +62,7 @@ def get_delete_file_snapshot_type_names(): def get_delete_file_snapshot_type(cli_ctx, name): - t_delete_snapshot = get_sdk(cli_ctx, ResourceType.DATA_STORAGE, 'DeleteSnapshot', mod='file.models') + t_delete_snapshot = get_sdk(cli_ctx, CUSTOM_DATA_STORAGE, 'DeleteSnapshot', mod='file.models') return {'include': t_delete_snapshot.Include}[name] @@ -71,8 +74,8 @@ def get_container_access_type(cli_ctx, name): if name == 'off': return None elif name == 'blob': - return get_sdk(cli_ctx, ResourceType.DATA_STORAGE, 'PublicAccess', mod='blob.models').Blob + return get_sdk(cli_ctx, CUSTOM_DATA_STORAGE, 'PublicAccess', mod='blob.models').Blob elif name == 'container': - return get_sdk(cli_ctx, ResourceType.DATA_STORAGE, 'PublicAccess', mod='blob.models').Container + return get_sdk(cli_ctx, CUSTOM_DATA_STORAGE, 'PublicAccess', mod='blob.models').Container else: raise KeyError diff --git a/src/storage-preview/azext_storage_preview/services_wrapper.py b/src/storage-preview/azext_storage_preview/services_wrapper.py index dffd0d43ddc..7b1b66108ed 100644 --- a/src/storage-preview/azext_storage_preview/services_wrapper.py +++ b/src/storage-preview/azext_storage_preview/services_wrapper.py @@ -6,6 +6,7 @@ from azure.cli.core.profiles import get_sdk, ResourceType from ._client_factory import generic_data_service_factory +from .profiles import CUSTOM_DATA_STORAGE class ServiceProperties(object): @@ -29,7 +30,7 @@ def get_logging(self, timeout=None): return self.get_service_properties()(timeout=timeout).__dict__['logging'] def set_logging(self, read, write, delete, retention, timeout=None): - t_logging, t_retention_policy = get_sdk(self.cli_ctx, ResourceType.DATA_STORAGE, 'Logging', 'RetentionPolicy', + t_logging, t_retention_policy = get_sdk(self.cli_ctx, CUSTOM_DATA_STORAGE, 'Logging', 'RetentionPolicy', mod='common.models') retention_policy = t_retention_policy(enabled=retention != 0, days=retention) @@ -42,7 +43,7 @@ def get_cors(self, timeout=None): def add_cors(self, origins, methods, max_age, exposed_headers=None, allowed_headers=None, timeout=None): from azure.common import AzureHttpError - t_cors_rule = get_sdk(self.cli_ctx, ResourceType.DATA_STORAGE, 'CorsRule', mod='common.models') + t_cors_rule = get_sdk(self.cli_ctx, CUSTOM_DATA_STORAGE, 'CorsRule', mod='common.models') cors = self.get_cors(timeout) new_rule = t_cors_rule(origins, methods, max_age, exposed_headers, allowed_headers) cors.append(new_rule) @@ -71,7 +72,7 @@ def get_metrics(self, interval, timeout=None): return metrics def set_metrics(self, retention, hour, minute, api=None, timeout=None): - t_metrics, t_retention_policy = get_sdk(self.cli_ctx, ResourceType.DATA_STORAGE, 'Metrics', 'RetentionPolicy', + t_metrics, t_retention_policy = get_sdk(self.cli_ctx, CUSTOM_DATA_STORAGE, 'Metrics', 'RetentionPolicy', mod='common.models') retention_policy = t_retention_policy(enabled=retention != 0, days=retention) diff --git a/src/storage-preview/azext_storage_preview/tests/latest/test_storage_validators.py b/src/storage-preview/azext_storage_preview/tests/latest/test_storage_validators.py index 1a3ebc3076d..d2917f45640 100644 --- a/src/storage-preview/azext_storage_preview/tests/latest/test_storage_validators.py +++ b/src/storage-preview/azext_storage_preview/tests/latest/test_storage_validators.py @@ -19,6 +19,7 @@ from azure.cli.testsdk import api_version_constraint from ..._validators import (get_source_file_or_blob_service_client, validate_encryption_source, validate_encryption_services) +from ...profiles import CUSTOM_DATA_STORAGE class MockCLI(CLI): @@ -34,7 +35,7 @@ def __init__(self, ctx): def get_models(self, *attr_args, **_): from azure.cli.core.profiles import get_sdk - return get_sdk(self.ctx, ResourceType.DATA_STORAGE, *attr_args, mod='models') + return get_sdk(self.ctx, CUSTOM_DATA_STORAGE, *attr_args, mod='models') class MockCmd(object): @@ -43,7 +44,7 @@ def __init__(self, ctx): self.loader = MockLoader(self.cli_ctx) def get_models(self, *attr_args, **kwargs): - return get_sdk(self.cli_ctx, ResourceType.DATA_STORAGE, *attr_args, **kwargs) + return get_sdk(self.cli_ctx, CUSTOM_DATA_STORAGE, *attr_args, **kwargs) class TestStorageValidators(unittest.TestCase): @@ -56,7 +57,7 @@ def tearDown(self): self.io.close() def test_permission_validator(self): - t_container_permissions = get_sdk(self.cli, ResourceType.DATA_STORAGE, 'blob.models#ContainerPermissions') + t_container_permissions = get_sdk(self.cli, CUSTOM_DATA_STORAGE, 'blob.models#ContainerPermissions') ns1 = Namespace(permission='rwdl') ns2 = Namespace(permission='abc') @@ -118,8 +119,8 @@ def test_resource_types_type(self): def test_services_type(self): input = "ttfqbqtf" actual = str(services_type(self.loader)(input)) - if supported_api_version(self.cli, ResourceType.DATA_STORAGE, max_api='2016-05-31') or \ - supported_api_version(self.cli, ResourceType.DATA_STORAGE, min_api='2017-07-29'): + if supported_api_version(self.cli, CUSTOM_DATA_STORAGE, max_api='2016-05-31') or \ + supported_api_version(self.cli, CUSTOM_DATA_STORAGE, min_api='2017-07-29'): expected = "bqtf" else: expected = "bqf" From 96c549f2e397820bc0ac2503f5ca766bc98e3e00 Mon Sep 17 00:00:00 2001 From: williexu Date: Mon, 30 Apr 2018 18:40:04 -0700 Subject: [PATCH 04/19] added oauth feature for blob and queue commands --- .../azext_storage_preview/__init__.py | 22 ++- .../azext_storage_preview/_client_factory.py | 19 +- .../azext_storage_preview/_validators.py | 29 ++- .../azext_storage_preview/commands.py | 185 +++++++++--------- .../azext_storage_preview/oauth_token_util.py | 44 +++++ .../azext_storage_preview/sdkutil.py | 2 - 6 files changed, 189 insertions(+), 112 deletions(-) create mode 100644 src/storage-preview/azext_storage_preview/oauth_token_util.py diff --git a/src/storage-preview/azext_storage_preview/__init__.py b/src/storage-preview/azext_storage_preview/__init__.py index c039d74e326..7d4dadd7f82 100644 --- a/src/storage-preview/azext_storage_preview/__init__.py +++ b/src/storage-preview/azext_storage_preview/__init__.py @@ -130,21 +130,26 @@ def register_common_storage_account_options(self): class StorageCommandGroup(AzCommandGroup): - def storage_command(self, name, method_name=None, command_type=None, **kwargs): + def storage_command(self, name, method_name=None, command_type=None, oauth=False, **kwargs): """ Registers an Azure CLI Storage Data Plane command. These commands always include the four parameters which can be used to obtain a storage client: account-name, account-key, connection-string, and sas-token. """ if command_type: command_name = self.command(name, method_name, command_type=command_type, **kwargs) else: command_name = self.command(name, method_name, **kwargs) - self._register_data_plane_account_arguments(command_name) + self._register_data_plane_account_arguments(command_name, oauth) - def storage_custom_command(self, name, method_name, **kwargs): + def storage_command_oauth(self, *args, **kwargs): + self.storage_command(*args, oauth=True, **kwargs) + + def storage_custom_command(self, name, method_name, oauth=False, **kwargs): command_name = self.custom_command(name, method_name, **kwargs) - self._register_data_plane_account_arguments(command_name) + self._register_data_plane_account_arguments(command_name, oauth) - def get_handler_suppress_404(self): + def storage_custom_command_oauth(self, *args, **kwargs): + self.storage_custom_command(*args, oauth=True, **kwargs) + def get_handler_suppress_404(self): # pylint: disable=inconsistent-return-statements def handler(ex): from azure.cli.core.profiles import get_sdk @@ -152,16 +157,15 @@ def handler(ex): t_error = get_sdk(self.command_loader.cli_ctx, CUSTOM_DATA_STORAGE, 'common._error#AzureMissingResourceHttpError') - print(t_error) if isinstance(ex, t_error): return None raise ex return handler - def _register_data_plane_account_arguments(self, command_name): + def _register_data_plane_account_arguments(self, command_name, oauth): """ Add parameters required to create a storage client """ - from ._validators import validate_client_parameters + from ._validators import select_correct_validator command = self.command_loader.command_table.get(command_name, None) if not command: return @@ -179,7 +183,7 @@ def _register_data_plane_account_arguments(self, command_name): help='Storage account key. Must be used in conjunction with storage account name. ' 'Environment variable: AZURE_STORAGE_KEY') command.add_argument('connection_string', '--connection-string', required=False, default=None, - validator=validate_client_parameters, arg_group=group_name, + validator=select_correct_validator(oauth), arg_group=group_name, help='Storage account connection string. Environment variable: ' 'AZURE_STORAGE_CONNECTION_STRING') command.add_argument('sas_token', '--sas-token', required=False, default=None, diff --git a/src/storage-preview/azext_storage_preview/_client_factory.py b/src/storage-preview/azext_storage_preview/_client_factory.py index 38bb4579d57..be72006cd7a 100644 --- a/src/storage-preview/azext_storage_preview/_client_factory.py +++ b/src/storage-preview/azext_storage_preview/_client_factory.py @@ -26,7 +26,7 @@ # edited from azure.cli.core.commands.client_factory def get_data_service_client(cli_ctx, service_type, account_name, account_key, connection_string=None, - sas_token=None, socket_timeout=None, endpoint_suffix=None): + sas_token=None, socket_timeout=None, token_credential=None, endpoint_suffix=None): logger.debug('Getting data service client service_type=%s', service_type.__name__) try: client_kwargs = {'account_name': account_name, @@ -35,6 +35,8 @@ def get_data_service_client(cli_ctx, service_type, account_name, account_key, co 'sas_token': sas_token} if socket_timeout: client_kwargs['socket_timeout'] = socket_timeout + if token_credential: + client_kwargs['token_credential'] = token_credential if endpoint_suffix: client_kwargs['endpoint_suffix'] = endpoint_suffix client = service_type(**client_kwargs) @@ -51,17 +53,18 @@ def get_data_service_client(cli_ctx, service_type, account_name, account_key, co def get_storage_data_service_client(cli_ctx, service, name=None, key=None, connection_string=None, sas_token=None, - socket_timeout=None): + socket_timeout=None, token_credential=None): return get_data_service_client(cli_ctx, service, name, key, connection_string, sas_token, socket_timeout=socket_timeout, + token_credential=token_credential, endpoint_suffix=cli_ctx.cloud.suffixes.storage_endpoint) def generic_data_service_factory(cli_ctx, service, name=None, key=None, connection_string=None, sas_token=None, - socket_timeout=None): + socket_timeout=None, token_credential=None): try: return get_storage_data_service_client(cli_ctx, service, name, key, connection_string, sas_token, - socket_timeout) + socket_timeout, token_credential) except ValueError as val_exception: _ERROR_STORAGE_MISSING_INFO = get_sdk(cli_ctx, CUSTOM_DATA_STORAGE, 'common._error#_ERROR_STORAGE_MISSING_INFO') @@ -97,13 +100,12 @@ def blob_data_service_factory(cli_ctx, kwargs): blob_type = kwargs.get('blob_type') blob_service = get_blob_service_by_type(cli_ctx, blob_type) or get_blob_service_by_type(cli_ctx, 'block') - print("service", blob_service, blob_type) - return generic_data_service_factory(cli_ctx, blob_service, kwargs.pop('account_name', None), kwargs.pop('account_key', None), connection_string=kwargs.pop('connection_string', None), sas_token=kwargs.pop('sas_token', None), - socket_timeout=kwargs.pop('socket_timeout', None)) + socket_timeout=kwargs.pop('socket_timeout', None), + token_credential=kwargs.pop('token_credential', None)) def table_data_service_factory(cli_ctx, kwargs): @@ -122,7 +124,8 @@ def queue_data_service_factory(cli_ctx, kwargs): kwargs.pop('account_name', None), kwargs.pop('account_key', None), connection_string=kwargs.pop('connection_string', None), - sas_token=kwargs.pop('sas_token', None)) + sas_token=kwargs.pop('sas_token', None), + token_credential=kwargs.pop('token_credential', None)) def cloud_storage_account_service_factory(cli_ctx, kwargs): diff --git a/src/storage-preview/azext_storage_preview/_validators.py b/src/storage-preview/azext_storage_preview/_validators.py index 650e8e050df..b2075abaa5f 100644 --- a/src/storage-preview/azext_storage_preview/_validators.py +++ b/src/storage-preview/azext_storage_preview/_validators.py @@ -4,7 +4,6 @@ # -------------------------------------------------------------------------------------------- # pylint: disable=protected-access - from azure.cli.core.commands.client_factory import get_mgmt_service_client from azure.cli.core.commands.validators import validate_key_value_pairs from azure.cli.core.profiles import ResourceType, get_sdk @@ -13,6 +12,7 @@ from .util import glob_files_locally, guess_content_type from .sdkutil import get_table_data_type from .url_quote_util import encode_for_url +from .oauth_token_util import TokenUpdater storage_account_key_options = {'primary': 'key1', 'secondary': 'key2'} @@ -43,6 +43,20 @@ def _query_account_key(cli_ctx, account_name): raise ValueError("Storage account '{}' not found.".format(account_name)) +def _create_token_credential(cli_ctx): + from knack.cli import EVENT_CLI_POST_EXECUTE + from .profiles import CUSTOM_DATA_STORAGE + + TokenCredential = get_sdk(cli_ctx, CUSTOM_DATA_STORAGE, 'common#TokenCredential') + + token_credential = TokenCredential(None) + updater = TokenUpdater(token_credential, cli_ctx) + def _cancel_timer_event_handler(_, **__): + updater.cancel() + cli_ctx.register_event(EVENT_CLI_POST_EXECUTE, _cancel_timer_event_handler) + return token_credential + + # region PARAMETER VALIDATORS def validate_table_payload_format(cmd, namespace): @@ -61,7 +75,13 @@ def validate_bypass(namespace): namespace.bypass = ', '.join(namespace.bypass) if isinstance(namespace.bypass, list) else namespace.bypass -def validate_client_parameters(cmd, namespace): +def select_correct_validator(oauth): + def func(cmd, namespace): + validate_client_parameters(cmd, namespace, oauth=oauth) + return func + + +def validate_client_parameters(cmd, namespace, oauth=False): """ Retrieves storage connection parameters from environment variables and parses out connection string into account name and key """ n = namespace @@ -97,7 +117,10 @@ def get_config_value(section, key, default): # if account name is specified but no key, attempt to query if n.account_name and not n.account_key and not n.sas_token: - n.account_key = _query_account_key(cmd.cli_ctx, n.account_name) + if oauth: + n.token_credential = _create_token_credential(cmd.cli_ctx) + else: + n.account_key = _query_account_key(cmd.cli_ctx, n.account_name) def process_blob_source_uri(cmd, namespace): diff --git a/src/storage-preview/azext_storage_preview/commands.py b/src/storage-preview/azext_storage_preview/commands.py index adf27e3219c..9dc997bd307 100644 --- a/src/storage-preview/azext_storage_preview/commands.py +++ b/src/storage-preview/azext_storage_preview/commands.py @@ -92,65 +92,66 @@ def get_custom_sdk(custom_module, client_factory, resource_type=CUSTOM_DATA_STOR from ._transformers import (transform_storage_list_output, transform_url, create_boolean_result_output_transformer) - g.storage_command('list', 'list_blobs', transform=transform_storage_list_output, - table_transformer=transform_blob_output) - g.storage_command('download', 'get_blob_to_path') - g.storage_command('generate-sas', 'generate_blob_shared_access_signature') - g.storage_command('url', 'make_blob_url', transform=transform_url) - g.storage_command('snapshot', 'snapshot_blob') - g.storage_command('show', 'get_blob_properties', table_transformer=transform_blob_output, - exception_handler=g.get_handler_suppress_404()) - g.storage_command('update', 'set_blob_properties') - g.storage_command('exists', 'exists', transform=create_boolean_result_output_transformer('exists')) - g.storage_command('delete', 'delete_blob', transform=create_boolean_result_output_transformer('deleted'), - table_transformer=transform_boolean_for_table) - g.storage_command('undelete', 'undelete_blob', transform=create_boolean_result_output_transformer('undeleted'), - table_transformer=transform_boolean_for_table, min_api='2017-07-29') - - g.storage_custom_command('set-tier', 'set_blob_tier') - g.storage_custom_command('upload', 'upload_blob', - doc_string_source='blob#BlockBlobService.create_blob_from_path') - g.storage_custom_command('upload-batch', 'storage_blob_upload_batch') - g.storage_custom_command('download-batch', 'storage_blob_download_batch') - g.storage_custom_command('delete-batch', 'storage_blob_delete_batch') - - g.storage_command('metadata show', 'get_blob_metadata', exception_handler=g.get_handler_suppress_404()) - g.storage_command('metadata update', 'set_blob_metadata') - - g.storage_command('lease acquire', 'acquire_blob_lease') - g.storage_command('lease renew', 'renew_blob_lease') - g.storage_command('lease release', 'release_blob_lease') - g.storage_command('lease change', 'change_blob_lease') - g.storage_command('lease break', 'break_blob_lease') - - g.storage_command('copy start', 'copy_blob') - g.storage_command('copy cancel', 'abort_copy_blob') - g.storage_custom_command('copy start-batch', 'storage_blob_copy_batch') + g.storage_command_oauth('list', 'list_blobs', transform=transform_storage_list_output, + table_transformer=transform_blob_output) + g.storage_command_oauth('download', 'get_blob_to_path') + g.storage_command_oauth('generate-sas', 'generate_blob_shared_access_signature') + g.storage_command_oauth('url', 'make_blob_url', transform=transform_url) + g.storage_command_oauth('snapshot', 'snapshot_blob') + g.storage_command_oauth('show', 'get_blob_properties', table_transformer=transform_blob_output, + exception_handler=g.get_handler_suppress_404()) + g.storage_command_oauth('update', 'set_blob_properties') + g.storage_command_oauth('exists', 'exists', transform=create_boolean_result_output_transformer('exists')) + g.storage_command_oauth('delete', 'delete_blob', transform=create_boolean_result_output_transformer('deleted'), + table_transformer=transform_boolean_for_table) + g.storage_command_oauth('undelete', 'undelete_blob', + transform=create_boolean_result_output_transformer('undeleted'), + table_transformer=transform_boolean_for_table, min_api='2017-07-29') + + g.storage_custom_command_oauth('set-tier', 'set_blob_tier') + g.storage_custom_command_oauth('upload', 'upload_blob', + doc_string_source='blob#BlockBlobService.create_blob_from_path') + g.storage_custom_command_oauth('upload-batch', 'storage_blob_upload_batch') + g.storage_custom_command_oauth('download-batch', 'storage_blob_download_batch') + g.storage_custom_command_oauth('delete-batch', 'storage_blob_delete_batch') + + g.storage_command_oauth('metadata show', 'get_blob_metadata', exception_handler=g.get_handler_suppress_404()) + g.storage_command_oauth('metadata update', 'set_blob_metadata') + + g.storage_command_oauth('lease acquire', 'acquire_blob_lease') + g.storage_command_oauth('lease renew', 'renew_blob_lease') + g.storage_command_oauth('lease release', 'release_blob_lease') + g.storage_command_oauth('lease change', 'change_blob_lease') + g.storage_command_oauth('lease break', 'break_blob_lease') + + g.storage_command_oauth('copy start', 'copy_blob') + g.storage_command_oauth('copy cancel', 'abort_copy_blob') + g.storage_custom_command_oauth('copy start-batch', 'storage_blob_copy_batch') with self.command_group('storage blob incremental-copy', operations_tmpl='azure.multiapi.storage.blob.pageblobservice#PageBlobService.{}', client_factory=page_blob_service_factory, resource_type=CUSTOM_DATA_STORAGE, min_api='2016-05-31') as g: - g.storage_command('start', 'incremental_copy_blob') + g.storage_command_oauth('start', 'incremental_copy_blob') with self.command_group('storage blob incremental-copy', operations_tmpl='azure.multiapi.storage.blob.blockblobservice#BlockBlobService.{}', client_factory=page_blob_service_factory, resource_type=CUSTOM_DATA_STORAGE, min_api='2016-05-31') as g: - g.storage_command('cancel', 'abort_copy_blob') + g.storage_command_oauth('cancel', 'abort_copy_blob') with self.command_group('storage blob service-properties delete-policy', command_type=base_blob_sdk, min_api='2017-07-29', custom_command_type=get_custom_sdk('blob', blob_data_service_factory)) as g: - g.storage_command('show', 'get_blob_service_properties', - transform=lambda x: getattr(x, 'delete_retention_policy', x), - exception_handler=g.get_handler_suppress_404()) - g.storage_custom_command('update', 'set_delete_policy') + g.storage_command_oauth('show', 'get_blob_service_properties', + transform=lambda x: getattr(x, 'delete_retention_policy', x), + exception_handler=g.get_handler_suppress_404()) + g.storage_custom_command_oauth('update', 'set_delete_policy') with self.command_group('storage blob service-properties', command_type=base_blob_sdk) as g: - g.storage_command('show', 'get_blob_service_properties', exception_handler=g.get_handler_suppress_404()) + g.storage_command_oauth('show', 'get_blob_service_properties', exception_handler=g.get_handler_suppress_404()) with self.command_group('storage container', command_type=block_blob_sdk, custom_command_type=get_custom_sdk('acl', blob_data_service_factory)) as g: @@ -158,33 +159,36 @@ def get_custom_sdk(custom_module, client_factory, resource_type=CUSTOM_DATA_STOR transform_acl_list_output) from ._format import (transform_container_list, transform_boolean_for_table, transform_container_show) - g.storage_command('list', 'list_containers', transform=transform_storage_list_output, - table_transformer=transform_container_list) - g.storage_command('delete', 'delete_container', transform=create_boolean_result_output_transformer('deleted'), - table_transformer=transform_boolean_for_table) - g.storage_command('show', 'get_container_properties', table_transformer=transform_container_show, - exception_handler=g.get_handler_suppress_404()) - g.storage_command('create', 'create_container', transform=create_boolean_result_output_transformer('created'), - table_transformer=transform_boolean_for_table) - g.storage_command('generate-sas', 'generate_container_shared_access_signature') - g.storage_command('exists', 'exists', transform=create_boolean_result_output_transformer('exists'), - table_transformer=transform_boolean_for_table) - g.storage_command('set-permission', 'set_container_acl') - g.storage_command('show-permission', 'get_container_acl', transform=transform_container_permission_output) - g.storage_command('metadata update', 'set_container_metadata') - g.storage_command('metadata show', 'get_container_metadata', exception_handler=g.get_handler_suppress_404()) - - g.storage_command('lease acquire', 'acquire_container_lease') - g.storage_command('lease renew', 'renew_container_lease') - g.storage_command('lease release', 'release_container_lease') - g.storage_command('lease change', 'change_container_lease') - g.storage_command('lease break', 'break_container_lease') - - g.storage_custom_command('policy create', 'create_acl_policy') - g.storage_custom_command('policy delete', 'delete_acl_policy') - g.storage_custom_command('policy update', 'set_acl_policy', min_api='2017-04-17') - g.storage_custom_command('policy show', 'get_acl_policy', exception_handler=g.get_handler_suppress_404()) - g.storage_custom_command('policy list', 'list_acl_policies', table_transformer=transform_acl_list_output) + g.storage_command_oauth('list', 'list_containers', transform=transform_storage_list_output, + table_transformer=transform_container_list) + g.storage_command_oauth('delete', 'delete_container', + transform=create_boolean_result_output_transformer('deleted'), + table_transformer=transform_boolean_for_table) + g.storage_command_oauth('show', 'get_container_properties', table_transformer=transform_container_show, + exception_handler=g.get_handler_suppress_404()) + g.storage_command_oauth('create', 'create_container', + transform=create_boolean_result_output_transformer('created'), + table_transformer=transform_boolean_for_table) + g.storage_command_oauth('generate-sas', 'generate_container_shared_access_signature') + g.storage_command_oauth('exists', 'exists', transform=create_boolean_result_output_transformer('exists'), + table_transformer=transform_boolean_for_table) + g.storage_command_oauth('set-permission', 'set_container_acl') + g.storage_command_oauth('show-permission', 'get_container_acl', transform=transform_container_permission_output) + g.storage_command_oauth('metadata update', 'set_container_metadata') + g.storage_command_oauth('metadata show', 'get_container_metadata', + exception_handler=g.get_handler_suppress_404()) + + g.storage_command_oauth('lease acquire', 'acquire_container_lease') + g.storage_command_oauth('lease renew', 'renew_container_lease') + g.storage_command_oauth('lease release', 'release_container_lease') + g.storage_command_oauth('lease change', 'change_container_lease') + g.storage_command_oauth('lease break', 'break_container_lease') + + g.storage_custom_command_oauth('policy create', 'create_acl_policy') + g.storage_custom_command_oauth('policy delete', 'delete_acl_policy') + g.storage_custom_command_oauth('policy update', 'set_acl_policy', min_api='2017-04-17') + g.storage_custom_command_oauth('policy show', 'get_acl_policy', exception_handler=g.get_handler_suppress_404()) + g.storage_custom_command_oauth('policy list', 'list_acl_policies', table_transformer=transform_acl_list_output) file_sdk = CliCommandType( operations_tmpl='azure.multiapi.storage.file.fileservice#FileService.{}', @@ -277,35 +281,36 @@ def get_custom_sdk(custom_module, client_factory, resource_type=CUSTOM_DATA_STOR from ._format import transform_boolean_for_table from ._transformers import create_boolean_result_output_transformer - g.storage_command('list', 'list_queues', transform=transform_storage_list_output) - g.storage_command('create', 'create_queue', transform=create_boolean_result_output_transformer('created'), - table_transformer=transform_boolean_for_table) - g.storage_command('delete', 'delete_queue', transform=create_boolean_result_output_transformer('deleted'), - table_transformer=transform_boolean_for_table) - g.storage_command('generate-sas', 'generate_queue_shared_access_signature') - g.storage_command('stats', 'get_queue_service_stats', min_api='2016-05-31') - g.storage_command('exists', 'exists', transform=create_boolean_result_output_transformer('exists')) + g.storage_command_oauth('list', 'list_queues', transform=transform_storage_list_output) + g.storage_command_oauth('create', 'create_queue', transform=create_boolean_result_output_transformer('created'), + table_transformer=transform_boolean_for_table) + g.storage_command_oauth('delete', 'delete_queue', transform=create_boolean_result_output_transformer('deleted'), + table_transformer=transform_boolean_for_table) + g.storage_command_oauth('generate-sas', 'generate_queue_shared_access_signature') + g.storage_command_oauth('stats', 'get_queue_service_stats', min_api='2016-05-31') + g.storage_command_oauth('exists', 'exists', transform=create_boolean_result_output_transformer('exists')) - g.storage_command('metadata show', 'get_queue_metadata', exception_handler=g.get_handler_suppress_404()) - g.storage_command('metadata update', 'set_queue_metadata') + g.storage_command_oauth('metadata show', 'get_queue_metadata', exception_handler=g.get_handler_suppress_404()) + g.storage_command_oauth('metadata update', 'set_queue_metadata') - g.storage_custom_command('policy create', 'create_acl_policy') - g.storage_custom_command('policy delete', 'delete_acl_policy') - g.storage_custom_command('policy show', 'get_acl_policy', exception_handler=g.get_handler_suppress_404()) - g.storage_custom_command('policy list', 'list_acl_policies', table_transformer=transform_acl_list_output) - g.storage_custom_command('policy update', 'set_acl_policy') + g.storage_custom_command_oauth('policy create', 'create_acl_policy') + g.storage_custom_command_oauth('policy delete', 'delete_acl_policy') + g.storage_custom_command_oauth('policy show', 'get_acl_policy', exception_handler=g.get_handler_suppress_404()) + g.storage_custom_command_oauth('policy list', 'list_acl_policies', table_transformer=transform_acl_list_output) + g.storage_custom_command_oauth('policy update', 'set_acl_policy') with self.command_group('storage message', queue_sdk) as g: from ._transformers import create_boolean_result_output_transformer from ._format import transform_message_show - g.storage_command('put', 'put_message') - g.storage_command('get', 'get_messages', table_transformer=transform_message_show) - g.storage_command('peek', 'peek_messages', table_transformer=transform_message_show) - g.storage_command('delete', 'delete_message', transform=create_boolean_result_output_transformer('deleted'), - table_transformer=transform_boolean_for_table) - g.storage_command('clear', 'clear_messages') - g.storage_command('update', 'update_message') + g.storage_command_oauth('put', 'put_message') + g.storage_command_oauth('get', 'get_messages', table_transformer=transform_message_show) + g.storage_command_oauth('peek', 'peek_messages', table_transformer=transform_message_show) + g.storage_command_oauth('delete', 'delete_message', + transform=create_boolean_result_output_transformer('deleted'), + table_transformer=transform_boolean_for_table) + g.storage_command_oauth('clear', 'clear_messages') + g.storage_command_oauth('update', 'update_message') if cosmosdb_table_exists(self.cli_ctx): table_sdk = CliCommandType(operations_tmpl='azure.multiapi.cosmosdb.table.tableservice#TableService.{}', diff --git a/src/storage-preview/azext_storage_preview/oauth_token_util.py b/src/storage-preview/azext_storage_preview/oauth_token_util.py new file mode 100644 index 00000000000..3cbd5f0c166 --- /dev/null +++ b/src/storage-preview/azext_storage_preview/oauth_token_util.py @@ -0,0 +1,44 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# -------------------------------------------------------------------------------------------- + +import threading + + +class TokenUpdater: + """ + This class updates a given token_credential periodically using the provided callback function. + It shows one way of making sure the credential does not become expired. + """ + def __init__(self, token_credential, cli_ctx): + self.token_credential = token_credential + self.cli_ctx = cli_ctx + + # the timer needs to be protected, as later on it is possible that one thread is setting a new timer and + # another thread is trying to cancel the timer + self.lock = threading.Lock() + self.timer_callback() + + def timer_callback(self): + # call the get a new token and set a timer + from azure.cli.core._profile import Profile + from datetime import datetime + # should give back token that is valid for at least 5 mins + token = Profile(cli_ctx=self.cli_ctx).get_raw_token(resource="https://storage.azure.com")[0][2] + self.token_credential.update_token(token['accessToken']) + seconds_left = (datetime.strptime(token['expiresOn'], "%Y-%m-%d %H:%M:%S.%f") - datetime.now()).seconds + if seconds_left < 240: + # acquired token expires in less than 4 mins + raise Exception("Acquired a token expiring in less than 4 minutes") + + with self.lock: + self.timer = threading.Timer(seconds_left - 240, self.timer_callback) + self.timer.daemon = True + self.timer.start() + + def cancel(self): + # the timer needs to be canceled if the application is terminating + # if not the timer will keep going + with self.lock: + self.timer.cancel() diff --git a/src/storage-preview/azext_storage_preview/sdkutil.py b/src/storage-preview/azext_storage_preview/sdkutil.py index e1b7b7cf5e0..d52c4886666 100644 --- a/src/storage-preview/azext_storage_preview/sdkutil.py +++ b/src/storage-preview/azext_storage_preview/sdkutil.py @@ -25,8 +25,6 @@ def get_table_data_type(cli_ctx, module_name, *type_names): def get_blob_service_by_type(cli_ctx, blob_type): - print("here") - print(get_sdk(cli_ctx, CUSTOM_DATA_STORAGE, 'BlockBlobService', mod='blob')) type_to_service = { 'block': lambda ctx: get_sdk(ctx, CUSTOM_DATA_STORAGE, 'BlockBlobService', mod='blob'), 'page': lambda ctx: get_sdk(ctx, CUSTOM_DATA_STORAGE, 'PageBlobService', mod='blob'), From ec7dde2fb113d67b71f9fb237651e686cca963c2 Mon Sep 17 00:00:00 2001 From: williexu Date: Tue, 1 May 2018 17:16:26 -0700 Subject: [PATCH 05/19] re-recorded all tests except general queue operations --- .../recordings/test_create_account_sas.yaml | 75 +- .../test_create_storage_account.yaml | 181 +++-- .../test_create_storage_account_v2.yaml | 62 +- ...torage_account_with_assigned_identity.yaml | 58 +- .../recordings/test_customer_managed_key.yaml | 426 ++++++----- .../recordings/test_list_locations.yaml | 13 +- .../test_list_storage_accounts.yaml | 125 ++-- .../recordings/test_logging_operations.yaml | 219 +++--- .../recordings/test_metrics_operations.yaml | 166 ++--- .../recordings/test_renew_account_key.yaml | 83 ++- .../latest/recordings/test_show_usage.yaml | 7 +- ...est_storage_account_service_endpoints.yaml | 300 ++++---- .../recordings/test_storage_blob_append.yaml | 186 +++-- ...est_storage_blob_container_operations.yaml | 448 ++++++------ .../test_storage_blob_incremental_copy.yaml | 680 ++++-------------- .../test_storage_blob_lease_operations.yaml | 261 ++++--- ...test_storage_blob_metadata_operations.yaml | 275 +++---- ...test_storage_blob_snapshot_operations.yaml | 130 ++-- .../test_storage_blob_socket_timeout.yaml | 137 ++-- .../test_storage_blob_soft_delete.yaml | 251 ++++--- ...test_storage_blob_upload_midsize_file.yaml | 269 ++++--- .../test_storage_blob_upload_small_file.yaml | 244 ++++--- .../test_storage_container_acl_scenarios.yaml | 380 +++++----- .../test_storage_cors_scenario.yaml | 523 +++++++------- .../test_storage_create_default_sku.yaml | 58 +- .../test_storage_file_copy_scenario.yaml | 248 ++++--- .../test_storage_file_main_scenario.yaml | 600 ++++++++-------- .../test_storage_share_acl_scenarios.yaml | 296 ++++---- .../test_storage_table_main_scenario.yaml | 332 ++++----- ...torage_account_with_assigned_identity.yaml | 74 +- 30 files changed, 3397 insertions(+), 3710 deletions(-) diff --git a/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_create_account_sas.yaml b/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_create_account_sas.yaml index 0d08da30c30..48ee9409608 100644 --- a/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_create_account_sas.yaml +++ b/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_create_account_sas.yaml @@ -1,30 +1,32 @@ interactions: - request: - body: '{"location": "westus", "tags": {"use": "az-test"}}' + body: '{"location": "westus", "tags": {"product": "azurecli", "cause": "automation", + "date": "2018-05-01T21:45:22Z"}}' headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] CommandName: [group create] Connection: [keep-alive] - Content-Length: ['50'] + Content-Length: ['110'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.27] + msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2017-05-10 response: - body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"westus","tags":{"use":"az-test"},"properties":{"provisioningState":"Succeeded"}}'} + body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"westus","tags":{"product":"azurecli","cause":"automation","date":"2018-05-01T21:45:22Z"},"properties":{"provisioningState":"Succeeded"}}'} headers: cache-control: [no-cache] - content-length: ['328'] + content-length: ['384'] content-type: [application/json; charset=utf-8] - date: ['Thu, 08 Feb 2018 21:34:20 GMT'] + date: ['Tue, 01 May 2018 21:45:24 GMT'] expires: ['-1'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1190'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1198'] status: {code: 201, message: Created} - request: body: '{"sku": {"name": "Standard_LRS"}, "kind": "Storage", "location": "westus", @@ -37,7 +39,7 @@ interactions: Content-Length: ['125'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002?api-version=2017-10-01 @@ -47,13 +49,14 @@ interactions: cache-control: [no-cache] content-length: ['0'] content-type: [text/plain; charset=utf-8] - date: ['Thu, 08 Feb 2018 21:34:22 GMT'] + date: ['Tue, 01 May 2018 21:45:25 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/8a086227-3618-4a74-a755-38b3688eb994?monitor=true&api-version=2017-10-01'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/24581443-fca0-428e-a1d4-90be654a41cc?monitor=true&api-version=2017-10-01'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 Microsoft-HTTPAPI/2.0'] strict-transport-security: [max-age=31536000; includeSubDomains] + x-content-type-options: [nosniff] x-ms-ratelimit-remaining-subscription-writes: ['1199'] status: {code: 202, message: Accepted} - request: @@ -65,17 +68,17 @@ interactions: Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/8a086227-3618-4a74-a755-38b3688eb994?monitor=true&api-version=2017-10-01 + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/24581443-fca0-428e-a1d4-90be654a41cc?monitor=true&api-version=2017-10-01 response: - body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T21:34:22.0842668Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T21:34:22.0842668Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T21:34:22.0374010Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} + body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:45:25.8713651Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:45:25.8713651Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:45:25.6526131Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} headers: cache-control: [no-cache] content-length: ['1231'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 21:34:39 GMT'] + date: ['Tue, 01 May 2018 21:45:43 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -83,6 +86,7 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] + x-content-type-options: [nosniff] status: {code: 200, message: OK} - request: body: null @@ -94,17 +98,17 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: POST uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002/listKeys?api-version=2017-10-01 response: - body: {string: '{"keys":[{"keyName":"key1","value":"J5jUEDgfRpsBRD+1YMqix8HkQTeQYw3cNMCovEFGuVu5wjlKg18YgmyE7tgz+6xWbi7CHfu8xeaukkBWNKLEDg==","permissions":"FULL"},{"keyName":"key2","value":"KmnoycxJZ2GyAcmyDuqCtNX4L6fvt/ZibesD3WBz+rOmAXkPJ4HqQJ+d8K485TFTHSKCoJ/vAWRO3xJTzcuoFQ==","permissions":"FULL"}]}'} + body: {string: '{"keys":[{"keyName":"key1","value":"94uEIpJdQoFGvUpLq172W0WoJBW3KeymBQWjNIBcr123RxLVfRRVSCUUonj7bzAKTUI/gxPz4pB63bh6nuFp2w==","permissions":"FULL"},{"keyName":"key2","value":"K2uoQjVDL7nTil9ce1C8lxWta/FPE/5gqD/CL40AkFzidAFKmgam6IwToKaMYrXfEVywTfRKAwUflstPQEjwyQ==","permissions":"FULL"}]}'} headers: cache-control: [no-cache] content-length: ['288'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 21:34:41 GMT'] + date: ['Tue, 01 May 2018 21:45:44 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -112,6 +116,7 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] + x-content-type-options: [nosniff] x-ms-ratelimit-remaining-subscription-writes: ['1199'] status: {code: 200, message: OK} - request: @@ -123,24 +128,26 @@ interactions: Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/storageAccounts?api-version=2017-10-01 response: - body: {string: '{"value":[{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/vmbdtest6075/providers/Microsoft.Storage/storageAccounts/stgbnc8939","name":"stgbnc8939","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-07T13:07:05.6471355Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-07T13:07:05.6471355Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-07T13:07:05.6158803Z","primaryEndpoints":{"blob":"https://stgbnc8939.blob.core.windows.net/","queue":"https://stgbnc8939.queue.core.windows.net/","table":"https://stgbnc8939.table.core.windows.net/","file":"https://stgbnc8939.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/vmbdtest1501/providers/Microsoft.Storage/storageAccounts/stgjavavme823820652e","name":"stgjavavme823820652e","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T15:41:10.5736026Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T15:41:10.5736026Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T15:41:10.5579773Z","primaryEndpoints":{"blob":"https://stgjavavme823820652e.blob.core.windows.net/","queue":"https://stgjavavme823820652e.queue.core.windows.net/","table":"https://stgjavavme823820652e.table.core.windows.net/","file":"https://stgjavavme823820652e.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/vmbdtest9977/providers/Microsoft.Storage/storageAccounts/stgjavavm333507506ea","name":"stgjavavm333507506ea","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T15:32:47.9591527Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T15:32:47.9591527Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T15:32:47.8341521Z","primaryEndpoints":{"blob":"https://stgjavavm333507506ea.blob.core.windows.net/","queue":"https://stgjavavm333507506ea.queue.core.windows.net/","table":"https://stgjavavm333507506ea.table.core.windows.net/","file":"https://stgjavavm333507506ea.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/javacsmrg3602/providers/Microsoft.Storage/storageAccounts/stg8927","name":"stg8927","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T07:37:55.0112849Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T07:37:55.0112849Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T07:37:54.9800708Z","primaryEndpoints":{"blob":"https://stg8927.blob.core.windows.net/","queue":"https://stg8927.queue.core.windows.net/","table":"https://stg8927.table.core.windows.net/","file":"https://stg8927.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/vmbdtest6075/providers/Microsoft.Storage/storageAccounts/stgjavavm52d424261a2","name":"stgjavavm52d424261a2","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-07T13:07:42.0875788Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-07T13:07:42.0875788Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-07T13:07:42.0563640Z","primaryEndpoints":{"blob":"https://stgjavavm52d424261a2.blob.core.windows.net/","queue":"https://stgjavavm52d424261a2.queue.core.windows.net/","table":"https://stgjavavm52d424261a2.table.core.windows.net/","file":"https://stgjavavm52d424261a2.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/wilx-group/providers/Microsoft.Storage/storageAccounts/awilxdevlab9274","name":"awilxdevlab9274","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{"hidden-DevTestLabs-LabUId":"3f487f2b-f13a-422f-a05c-761b17b0200d"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:35.9463952Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:35.9463952Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-12-07T22:43:14.9920432Z","primaryEndpoints":{"blob":"https://awilxdevlab9274.blob.core.windows.net/","queue":"https://awilxdevlab9274.queue.core.windows.net/","table":"https://awilxdevlab9274.table.core.windows.net/","file":"https://awilxdevlab9274.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/vmbdtest2038/providers/Microsoft.Storage/storageAccounts/stgjavavmac8610156cf","name":"stgjavavmac8610156cf","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-07T13:00:07.6351597Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-07T13:00:07.6351597Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-07T13:00:07.6039345Z","primaryEndpoints":{"blob":"https://stgjavavmac8610156cf.blob.core.windows.net/","queue":"https://stgjavavmac8610156cf.queue.core.windows.net/","table":"https://stgjavavmac8610156cf.table.core.windows.net/","file":"https://stgjavavmac8610156cf.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/vmbdtest5772/providers/Microsoft.Storage/storageAccounts/stgjavavm42113837dbb","name":"stgjavavm42113837dbb","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-07T12:48:36.1026547Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-07T12:48:36.1026547Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-07T12:48:36.0714523Z","primaryEndpoints":{"blob":"https://stgjavavm42113837dbb.blob.core.windows.net/","queue":"https://stgjavavm42113837dbb.queue.core.windows.net/","table":"https://stgjavavm42113837dbb.table.core.windows.net/","file":"https://stgjavavm42113837dbb.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/javacsmrg8678/providers/Microsoft.Storage/storageAccounts/stg7343","name":"stg7343","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.0401485Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.0401485Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-10-22T20:47:23.8366703Z","primaryEndpoints":{"blob":"https://stg7343.blob.core.windows.net/","queue":"https://stg7343.queue.core.windows.net/","table":"https://stg7343.table.core.windows.net/","file":"https://stg7343.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/javacsmrg7434/providers/Microsoft.Storage/storageAccounts/stg8548","name":"stg8548","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-07T22:39:56.6875433Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-07T22:39:56.6875433Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-07T22:39:56.6562752Z","primaryEndpoints":{"blob":"https://stg8548.blob.core.windows.net/","queue":"https://stg8548.queue.core.windows.net/","table":"https://stg8548.table.core.windows.net/","file":"https://stg8548.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/vmbdtest7312/providers/Microsoft.Storage/storageAccounts/stgjavavm43d95373650","name":"stgjavavm43d95373650","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T15:26:15.2306952Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T15:26:15.2306952Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T15:26:15.2150846Z","primaryEndpoints":{"blob":"https://stgjavavm43d95373650.blob.core.windows.net/","queue":"https://stgjavavm43d95373650.queue.core.windows.net/","table":"https://stgjavavm43d95373650.table.core.windows.net/","file":"https://stgjavavm43d95373650.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/javacsmrg3093/providers/Microsoft.Storage/storageAccounts/stg4985","name":"stg4985","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T07:28:11.7207048Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T07:28:11.7207048Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T07:28:11.6894612Z","primaryEndpoints":{"blob":"https://stg4985.blob.core.windows.net/","queue":"https://stg4985.queue.core.windows.net/","table":"https://stg4985.table.core.windows.net/","file":"https://stg4985.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/vmbdtest9977/providers/Microsoft.Storage/storageAccounts/stgbnc9165","name":"stgbnc9165","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T15:31:59.0738016Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T15:31:59.0738016Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T15:31:59.0581787Z","primaryEndpoints":{"blob":"https://stgbnc9165.blob.core.windows.net/","queue":"https://stgbnc9165.queue.core.windows.net/","table":"https://stgbnc9165.table.core.windows.net/","file":"https://stgbnc9165.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/vmbdtest5772/providers/Microsoft.Storage/storageAccounts/stgjavavmcb00830196f","name":"stgjavavmcb00830196f","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-07T12:54:38.4891429Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-07T12:54:38.4891429Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-07T12:54:38.4422705Z","primaryEndpoints":{"blob":"https://stgjavavmcb00830196f.blob.core.windows.net/","queue":"https://stgjavavmcb00830196f.queue.core.windows.net/","table":"https://stgjavavmcb00830196f.table.core.windows.net/","file":"https://stgjavavmcb00830196f.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/javacsmrg1377/providers/Microsoft.Storage/storageAccounts/stg35556","name":"stg35556","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-07T22:29:10.3577399Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-07T22:29:10.3577399Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-07T22:29:10.3421120Z","primaryEndpoints":{"blob":"https://stg35556.blob.core.windows.net/","queue":"https://stg35556.queue.core.windows.net/","table":"https://stg35556.table.core.windows.net/","file":"https://stg35556.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg9de67119f7/providers/Microsoft.Storage/storageAccounts/st3ea29977a4","name":"st3ea29977a4","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:35.9620243Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:35.9620243Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-12-01T04:00:22.2331421Z","primaryEndpoints":{"blob":"https://st3ea29977a4.blob.core.windows.net/","queue":"https://st3ea29977a4.queue.core.windows.net/","table":"https://st3ea29977a4.table.core.windows.net/","file":"https://st3ea29977a4.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/javacsmrg8678/providers/Microsoft.Storage/storageAccounts/stg24699","name":"stg24699","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:35.9932855Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:35.9932855Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-10-22T20:47:23.3426259Z","primaryEndpoints":{"blob":"https://stg24699.blob.core.windows.net/","queue":"https://stg24699.queue.core.windows.net/","table":"https://stg24699.table.core.windows.net/","file":"https://stg24699.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/javacsmrg3819/providers/Microsoft.Storage/storageAccounts/stg2666","name":"stg2666","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-07T23:15:53.4245534Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-07T23:15:53.4245534Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-07T23:15:53.3932595Z","primaryEndpoints":{"blob":"https://stg2666.blob.core.windows.net/","queue":"https://stg2666.queue.core.windows.net/","table":"https://stg2666.table.core.windows.net/","file":"https://stg2666.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/vmbdtest2038/providers/Microsoft.Storage/storageAccounts/stgbnc6669","name":"stgbnc6669","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-07T12:59:33.1175728Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-07T12:59:33.1175728Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-07T12:59:33.0863032Z","primaryEndpoints":{"blob":"https://stgbnc6669.blob.core.windows.net/","queue":"https://stgbnc6669.queue.core.windows.net/","table":"https://stgbnc6669.table.core.windows.net/","file":"https://stgbnc6669.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/javacsmrg1377/providers/Microsoft.Storage/storageAccounts/stg1798","name":"stg1798","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-07T22:29:09.9827302Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-07T22:29:09.9827302Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-07T22:29:09.9671375Z","primaryEndpoints":{"blob":"https://stg1798.blob.core.windows.net/","queue":"https://stg1798.queue.core.windows.net/","table":"https://stg1798.table.core.windows.net/","file":"https://stg1798.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rgacs012581245/providers/Microsoft.Storage/storageAccounts/006lrpasdhh5mvyswarm1","name":"006lrpasdhh5mvyswarm1","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T21:26:50.0940448Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T21:26:50.0940448Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T21:26:50.0472235Z","primaryEndpoints":{"blob":"https://006lrpasdhh5mvyswarm1.blob.core.windows.net/","queue":"https://006lrpasdhh5mvyswarm1.queue.core.windows.net/","table":"https://006lrpasdhh5mvyswarm1.table.core.windows.net/","file":"https://006lrpasdhh5mvyswarm1.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/vmbdtest1501/providers/Microsoft.Storage/storageAccounts/stgbnc4090","name":"stgbnc4090","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T15:40:34.7555760Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T15:40:34.7555760Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T15:40:34.7086970Z","primaryEndpoints":{"blob":"https://stgbnc4090.blob.core.windows.net/","queue":"https://stgbnc4090.queue.core.windows.net/","table":"https://stgbnc4090.table.core.windows.net/","file":"https://stgbnc4090.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/vmbdtest7312/providers/Microsoft.Storage/storageAccounts/stgjavavm57b02213d98","name":"stgjavavm57b02213d98","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T15:18:03.2964360Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T15:18:03.2964360Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T15:18:03.1714019Z","primaryEndpoints":{"blob":"https://stgjavavm57b02213d98.blob.core.windows.net/","queue":"https://stgjavavm57b02213d98.queue.core.windows.net/","table":"https://stgjavavm57b02213d98.table.core.windows.net/","file":"https://stgjavavm57b02213d98.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rgacs012581245/providers/Microsoft.Storage/storageAccounts/6lrpasdhh5mvyswarm0","name":"6lrpasdhh5mvyswarm0","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T21:26:50.3284452Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T21:26:50.3284452Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T21:26:50.3127881Z","primaryEndpoints":{"blob":"https://6lrpasdhh5mvyswarm0.blob.core.windows.net/","queue":"https://6lrpasdhh5mvyswarm0.queue.core.windows.net/","table":"https://6lrpasdhh5mvyswarm0.table.core.windows.net/","file":"https://6lrpasdhh5mvyswarm0.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/javacsmrg9511/providers/Microsoft.Storage/storageAccounts/stg4096","name":"stg4096","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T07:51:31.4329960Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T07:51:31.4329960Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T07:51:31.4174074Z","primaryEndpoints":{"blob":"https://stg4096.blob.core.windows.net/","queue":"https://stg4096.queue.core.windows.net/","table":"https://stg4096.table.core.windows.net/","file":"https://stg4096.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/javacsmrg3602/providers/Microsoft.Storage/storageAccounts/stg4719","name":"stg4719","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T07:38:44.2043180Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T07:38:44.2043180Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T07:38:44.1730915Z","primaryEndpoints":{"blob":"https://stg4719.blob.core.windows.net/","queue":"https://stg4719.queue.core.windows.net/","table":"https://stg4719.table.core.windows.net/","file":"https://stg4719.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/javacsmrg771/providers/Microsoft.Storage/storageAccounts/stg1266","name":"stg1266","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-07T22:51:55.4657267Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-07T22:51:55.4657267Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-07T22:51:55.4344476Z","primaryEndpoints":{"blob":"https://stg1266.blob.core.windows.net/","queue":"https://stg1266.queue.core.windows.net/","table":"https://stg1266.table.core.windows.net/","file":"https://stg1266.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rgacs012581245/providers/Microsoft.Storage/storageAccounts/o06lrpasdhh5mvyswarm5","name":"o06lrpasdhh5mvyswarm5","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T21:26:50.1097186Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T21:26:50.1097186Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T21:26:50.0472235Z","primaryEndpoints":{"blob":"https://o06lrpasdhh5mvyswarm5.blob.core.windows.net/","queue":"https://o06lrpasdhh5mvyswarm5.queue.core.windows.net/","table":"https://o06lrpasdhh5mvyswarm5.table.core.windows.net/","file":"https://o06lrpasdhh5mvyswarm5.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/abc6562group/providers/Microsoft.Storage/storageAccounts/stgvm1096b7d777504ab","name":"stgvm1096b7d777504ab","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T18:59:46.9015035Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T18:59:46.9015035Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T18:59:46.8702570Z","primaryEndpoints":{"blob":"https://stgvm1096b7d777504ab.blob.core.windows.net/","queue":"https://stgvm1096b7d777504ab.queue.core.windows.net/","table":"https://stgvm1096b7d777504ab.table.core.windows.net/","file":"https://stgvm1096b7d777504ab.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/vmbdtest8491/providers/Microsoft.Storage/storageAccounts/stgjavavm0539488888b","name":"stgjavavm0539488888b","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T15:36:35.0405070Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T15:36:35.0405070Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T15:36:35.0092280Z","primaryEndpoints":{"blob":"https://stgjavavm0539488888b.blob.core.windows.net/","queue":"https://stgjavavm0539488888b.queue.core.windows.net/","table":"https://stgjavavm0539488888b.table.core.windows.net/","file":"https://stgjavavm0539488888b.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rgacs012581245/providers/Microsoft.Storage/storageAccounts/c06lrpasdhh5mvyswarm3","name":"c06lrpasdhh5mvyswarm3","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T21:26:50.0472235Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T21:26:50.0472235Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T21:26:50.0159158Z","primaryEndpoints":{"blob":"https://c06lrpasdhh5mvyswarm3.blob.core.windows.net/","queue":"https://c06lrpasdhh5mvyswarm3.queue.core.windows.net/","table":"https://c06lrpasdhh5mvyswarm3.table.core.windows.net/","file":"https://c06lrpasdhh5mvyswarm3.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/vmbdtest6621/providers/Microsoft.Storage/storageAccounts/stgjavavmd2b85295b29","name":"stgjavavmd2b85295b29","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T15:44:27.7895164Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T15:44:27.7895164Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T15:44:27.7738787Z","primaryEndpoints":{"blob":"https://stgjavavmd2b85295b29.blob.core.windows.net/","queue":"https://stgjavavmd2b85295b29.queue.core.windows.net/","table":"https://stgjavavmd2b85295b29.table.core.windows.net/","file":"https://stgjavavmd2b85295b29.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/javacsmrg3502/providers/Microsoft.Storage/storageAccounts/stg2889","name":"stg2889","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T08:17:44.3543509Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T08:17:44.3543509Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T08:17:44.3230988Z","primaryEndpoints":{"blob":"https://stg2889.blob.core.windows.net/","queue":"https://stg2889.queue.core.windows.net/","table":"https://stg2889.table.core.windows.net/","file":"https://stg2889.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rgacs012581245/providers/Microsoft.Storage/storageAccounts/6lrpasdhh5mvyswarmdiag0","name":"6lrpasdhh5mvyswarmdiag0","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T21:26:50.3127881Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T21:26:50.3127881Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T21:26:50.2971980Z","primaryEndpoints":{"blob":"https://6lrpasdhh5mvyswarmdiag0.blob.core.windows.net/","queue":"https://6lrpasdhh5mvyswarmdiag0.queue.core.windows.net/","table":"https://6lrpasdhh5mvyswarmdiag0.table.core.windows.net/","file":"https://6lrpasdhh5mvyswarmdiag0.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/vmbdtest8711/providers/Microsoft.Storage/storageAccounts/stgbnc2032","name":"stgbnc2032","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-07T13:14:27.1828795Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-07T13:14:27.1828795Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-07T13:14:27.1672525Z","primaryEndpoints":{"blob":"https://stgbnc2032.blob.core.windows.net/","queue":"https://stgbnc2032.queue.core.windows.net/","table":"https://stgbnc2032.table.core.windows.net/","file":"https://stgbnc2032.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/javacsmrg9511/providers/Microsoft.Storage/storageAccounts/stg3196","name":"stg3196","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T07:52:22.3698825Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T07:52:22.3698825Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T07:52:22.3386431Z","primaryEndpoints":{"blob":"https://stg3196.blob.core.windows.net/","queue":"https://stg3196.queue.core.windows.net/","table":"https://stg3196.table.core.windows.net/","file":"https://stg3196.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/vmbdtest4180/providers/Microsoft.Storage/storageAccounts/stgbnc5175","name":"stgbnc5175","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T15:50:47.5307698Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T15:50:47.5307698Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T15:50:47.4995195Z","primaryEndpoints":{"blob":"https://stgbnc5175.blob.core.windows.net/","queue":"https://stgbnc5175.queue.core.windows.net/","table":"https://stgbnc5175.table.core.windows.net/","file":"https://stgbnc5175.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/vmbdtest2727/providers/Microsoft.Storage/storageAccounts/stgbnc5888","name":"stgbnc5888","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T15:47:26.5456311Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T15:47:26.5456311Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T15:47:26.5143633Z","primaryEndpoints":{"blob":"https://stgbnc5888.blob.core.windows.net/","queue":"https://stgbnc5888.queue.core.windows.net/","table":"https://stgbnc5888.table.core.windows.net/","file":"https://stgbnc5888.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/vmbdtest5560/providers/Microsoft.Storage/storageAccounts/stgjavavm3ce9008563d","name":"stgjavavm3ce9008563d","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-07T13:10:52.6901809Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-07T13:10:52.6901809Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-07T13:10:52.6745969Z","primaryEndpoints":{"blob":"https://stgjavavm3ce9008563d.blob.core.windows.net/","queue":"https://stgjavavm3ce9008563d.queue.core.windows.net/","table":"https://stgjavavm3ce9008563d.table.core.windows.net/","file":"https://stgjavavm3ce9008563d.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rgcomvad814855116a9864/providers/Microsoft.Storage/storageAccounts/stgvm32735dbab87839ad","name":"stgvm32735dbab87839ad","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.2745251Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.2745251Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-11-05T02:16:45.9826459Z","primaryEndpoints":{"blob":"https://stgvm32735dbab87839ad.blob.core.windows.net/","queue":"https://stgvm32735dbab87839ad.queue.core.windows.net/","table":"https://stgvm32735dbab87839ad.table.core.windows.net/","file":"https://stgvm32735dbab87839ad.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rgacs012581245/providers/Microsoft.Storage/storageAccounts/i06lrpasdhh5mvyswarm4","name":"i06lrpasdhh5mvyswarm4","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T21:26:50.0784417Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T21:26:50.0784417Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T21:26:50.0159158Z","primaryEndpoints":{"blob":"https://i06lrpasdhh5mvyswarm4.blob.core.windows.net/","queue":"https://i06lrpasdhh5mvyswarm4.queue.core.windows.net/","table":"https://i06lrpasdhh5mvyswarm4.table.core.windows.net/","file":"https://i06lrpasdhh5mvyswarm4.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/vmbdtest8132/providers/Microsoft.Storage/storageAccounts/stgbnc1363","name":"stgbnc1363","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-07T13:17:50.0973565Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-07T13:17:50.0973565Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-07T13:17:50.0660905Z","primaryEndpoints":{"blob":"https://stgbnc1363.blob.core.windows.net/","queue":"https://stgbnc1363.queue.core.windows.net/","table":"https://stgbnc1363.table.core.windows.net/","file":"https://stgbnc1363.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/javacsmrg3502/providers/Microsoft.Storage/storageAccounts/stg1316","name":"stg1316","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T08:17:43.8700047Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T08:17:43.8700047Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T08:17:43.8387584Z","primaryEndpoints":{"blob":"https://stg1316.blob.core.windows.net/","queue":"https://stg1316.queue.core.windows.net/","table":"https://stg1316.table.core.windows.net/","file":"https://stg1316.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/javacsmrg3819/providers/Microsoft.Storage/storageAccounts/stg6080","name":"stg6080","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-07T23:15:53.3307714Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-07T23:15:53.3307714Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-07T23:15:53.2995412Z","primaryEndpoints":{"blob":"https://stg6080.blob.core.windows.net/","queue":"https://stg6080.queue.core.windows.net/","table":"https://stg6080.table.core.windows.net/","file":"https://stg6080.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/javacsmrg7434/providers/Microsoft.Storage/storageAccounts/stg379","name":"stg379","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-07T22:40:27.5308774Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-07T22:40:27.5308774Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-07T22:40:27.4683812Z","primaryEndpoints":{"blob":"https://stg379.blob.core.windows.net/","queue":"https://stg379.queue.core.windows.net/","table":"https://stg379.table.core.windows.net/","file":"https://stg379.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/vmbdtest3168/providers/Microsoft.Storage/storageAccounts/stgjavavm3dd27109215","name":"stgjavavm3dd27109215","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-07T13:03:43.1243832Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-07T13:03:43.1243832Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-07T13:03:43.0775007Z","primaryEndpoints":{"blob":"https://stgjavavm3dd27109215.blob.core.windows.net/","queue":"https://stgjavavm3dd27109215.queue.core.windows.net/","table":"https://stgjavavm3dd27109215.table.core.windows.net/","file":"https://stgjavavm3dd27109215.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/javacsmrg771/providers/Microsoft.Storage/storageAccounts/stg8019","name":"stg8019","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-07T22:52:44.3417181Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-07T22:52:44.3417181Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-07T22:52:44.3260939Z","primaryEndpoints":{"blob":"https://stg8019.blob.core.windows.net/","queue":"https://stg8019.queue.core.windows.net/","table":"https://stg8019.table.core.windows.net/","file":"https://stg8019.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rged92722916/providers/Microsoft.Storage/storageAccounts/st39055055d8","name":"st39055055d8","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:35.9620243Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:35.9620243Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-11-14T08:29:14.1632499Z","primaryEndpoints":{"blob":"https://st39055055d8.blob.core.windows.net/","queue":"https://st39055055d8.queue.core.windows.net/","table":"https://st39055055d8.table.core.windows.net/","file":"https://st39055055d8.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/javacsmrg3093/providers/Microsoft.Storage/storageAccounts/stg31634","name":"stg31634","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T07:28:13.1805425Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T07:28:13.1805425Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T07:28:13.1493074Z","primaryEndpoints":{"blob":"https://stg31634.blob.core.windows.net/","queue":"https://stg31634.queue.core.windows.net/","table":"https://stg31634.table.core.windows.net/","file":"https://stg31634.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/vmbdtest5960/providers/Microsoft.Storage/storageAccounts/stgjavavmbf44552277c","name":"stgjavavmbf44552277c","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-07T12:56:14.6365579Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-07T12:56:14.6365579Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-07T12:56:14.6053295Z","primaryEndpoints":{"blob":"https://stgjavavmbf44552277c.blob.core.windows.net/","queue":"https://stgjavavmbf44552277c.queue.core.windows.net/","table":"https://stgjavavmbf44552277c.table.core.windows.net/","file":"https://stgjavavmbf44552277c.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/vmbdtest6805/providers/Microsoft.Storage/storageAccounts/stgjavavm76e93900fb5","name":"stgjavavm76e93900fb5","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T15:28:13.0923956Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T15:28:13.0923956Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T15:28:13.0611455Z","primaryEndpoints":{"blob":"https://stgjavavm76e93900fb5.blob.core.windows.net/","queue":"https://stgjavavm76e93900fb5.queue.core.windows.net/","table":"https://stgjavavm76e93900fb5.table.core.windows.net/","file":"https://stgjavavm76e93900fb5.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rgacs012581245/providers/Microsoft.Storage/storageAccounts/606lrpasdhh5mvyswarm2","name":"606lrpasdhh5mvyswarm2","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T21:26:50.0005917Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T21:26:50.0005917Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T21:26:49.9690407Z","primaryEndpoints":{"blob":"https://606lrpasdhh5mvyswarm2.blob.core.windows.net/","queue":"https://606lrpasdhh5mvyswarm2.queue.core.windows.net/","table":"https://606lrpasdhh5mvyswarm2.table.core.windows.net/","file":"https://606lrpasdhh5mvyswarm2.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/javacsmrg1819/providers/Microsoft.Storage/storageAccounts/stg6604","name":"stg6604","type":"Microsoft.Storage/storageAccounts","location":"eastus2","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-07T14:47:30.4664398Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-07T14:47:30.4664398Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-07T14:47:30.4195672Z","primaryEndpoints":{"blob":"https://stg6604.blob.core.windows.net/","queue":"https://stg6604.queue.core.windows.net/","table":"https://stg6604.table.core.windows.net/","file":"https://stg6604.file.core.windows.net/"},"primaryLocation":"eastus2","statusOfPrimary":"available","secondaryLocation":"centralus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/javacsmrg2755/providers/Microsoft.Storage/storageAccounts/stg4523","name":"stg4523","type":"Microsoft.Storage/storageAccounts","location":"eastus2","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T20:03:25.0602489Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T20:03:25.0602489Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T20:03:25.0133960Z","primaryEndpoints":{"blob":"https://stg4523.blob.core.windows.net/","queue":"https://stg4523.queue.core.windows.net/","table":"https://stg4523.table.core.windows.net/","file":"https://stg4523.file.core.windows.net/"},"primaryLocation":"eastus2","statusOfPrimary":"available","secondaryLocation":"centralus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cliautomationpyaffz2jgatrx3wmu5i3ms7e6vq6ffr6c7vpfafzb27ypbrksahwiedyawvx4g/providers/Microsoft.Storage/storageAccounts/acliautomationlab2482","name":"acliautomationlab2482","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"hidden-DevTestLabs-LabUId":"fad847a0-13b6-4061-9649-ad71226702f7"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-06T18:03:05.8117216Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-06T18:03:05.8117216Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-06T18:03:05.7648048Z","primaryEndpoints":{"blob":"https://acliautomationlab2482.blob.core.windows.net/","queue":"https://acliautomationlab2482.queue.core.windows.net/","table":"https://acliautomationlab2482.table.core.windows.net/","file":"https://acliautomationlab2482.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cliautomationtoxqsril3nh52zq7j2qv45ep7rtig4xnyg77hmcyl2uuausjromygxx7poq77x/providers/Microsoft.Storage/storageAccounts/acliautomationlab920","name":"acliautomationlab920","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"hidden-DevTestLabs-LabUId":"0958ba1e-279c-465c-a6a8-2b58d04b60b1"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7914959Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7914959Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-01-08T22:52:48.9788934Z","primaryEndpoints":{"blob":"https://acliautomationlab920.blob.core.windows.net/","queue":"https://acliautomationlab920.queue.core.windows.net/","table":"https://acliautomationlab920.table.core.windows.net/","file":"https://acliautomationlab920.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cliautomation01/providers/Microsoft.Storage/storageAccounts/acliautomationlab2281","name":"acliautomationlab2281","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"hidden-DevTestLabs-LabUId":"72f1b266-2a21-4f0a-af01-934c93c72e6e"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7289702Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7289702Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-07-07T16:46:33.749166Z","primaryEndpoints":{"blob":"https://acliautomationlab2281.blob.core.windows.net/","queue":"https://acliautomationlab2281.queue.core.windows.net/","table":"https://acliautomationlab2281.table.core.windows.net/","file":"https://acliautomationlab2281.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cliautomation01q2ksq7ibjhnl6y3qahzaq67qjcuv3p3xuhqhg6nufdyu6sttjlioho5vlbmp/providers/Microsoft.Storage/storageAccounts/acliautomationlab9808","name":"acliautomationlab9808","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"hidden-DevTestLabs-LabUId":"568e6db7-10b6-40e1-af55-4e5c0c9460b3"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7914959Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7914959Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-01-03T04:09:43.1153175Z","primaryEndpoints":{"blob":"https://acliautomationlab9808.blob.core.windows.net/","queue":"https://acliautomationlab9808.queue.core.windows.net/","table":"https://acliautomationlab9808.table.core.windows.net/","file":"https://acliautomationlab9808.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cliautomation01p5mb65te4noiwqbh7ni3sggmdrhbawq2atk5mc6elgdat5qkg6fuguonzmvj/providers/Microsoft.Storage/storageAccounts/acliautomationlab9396","name":"acliautomationlab9396","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"hidden-DevTestLabs-LabUId":"ba56a262-8f28-4665-86d9-18a308784945"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7914959Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7914959Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-12-08T20:14:17.6792122Z","primaryEndpoints":{"blob":"https://acliautomationlab9396.blob.core.windows.net/","queue":"https://acliautomationlab9396.queue.core.windows.net/","table":"https://acliautomationlab9396.table.core.windows.net/","file":"https://acliautomationlab9396.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cliautomation01ei2lu47wac7ixneeciagpf7ocqwvjvrq6rvkjl5hr2t3tyqkrzjdrsyd5lom/providers/Microsoft.Storage/storageAccounts/acliautomationlab4923","name":"acliautomationlab4923","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"hidden-DevTestLabs-LabUId":"db05f622-e24b-4bad-8265-0042a9feacff"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-26T20:28:36.5037123Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-26T20:28:36.5037123Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-01-26T20:28:36.3943699Z","primaryEndpoints":{"blob":"https://acliautomationlab4923.blob.core.windows.net/","queue":"https://acliautomationlab4923.queue.core.windows.net/","table":"https://acliautomationlab4923.table.core.windows.net/","file":"https://acliautomationlab4923.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cliautomation014o3znldng4uswc6mo6fhrx7gjnqitwa7b4ygnel5rhm624kjc53acrmyl3rk/providers/Microsoft.Storage/storageAccounts/acliautomationlab1633","name":"acliautomationlab1633","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"hidden-DevTestLabs-LabUId":"e33eb9e2-9aa6-4024-90b0-44509f6beded"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-06T18:03:01.1799270Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-06T18:03:01.1799270Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-06T18:03:01.1486631Z","primaryEndpoints":{"blob":"https://acliautomationlab1633.blob.core.windows.net/","queue":"https://acliautomationlab1633.queue.core.windows.net/","table":"https://acliautomationlab1633.table.core.windows.net/","file":"https://acliautomationlab1633.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T21:34:22.0842668Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T21:34:22.0842668Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T21:34:22.0374010Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cliautomationr7zmwrv545myosbhrhgmvyxvh473lloj24vcvwx5xuabi7hadxngt4sg7cbfxm/providers/Microsoft.Storage/storageAccounts/acliautomationlab4621","name":"acliautomationlab4621","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"hidden-DevTestLabs-LabUId":"3acb626c-e8a0-431d-bd15-47d2472c013f"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7602255Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7602255Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-12-07T18:36:05.7790991Z","primaryEndpoints":{"blob":"https://acliautomationlab4621.blob.core.windows.net/","queue":"https://acliautomationlab4621.queue.core.windows.net/","table":"https://acliautomationlab4621.table.core.windows.net/","file":"https://acliautomationlab4621.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cliautomation/providers/Microsoft.Storage/storageAccounts/acliautomationlab2987","name":"acliautomationlab2987","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"hidden-DevTestLabs-LabUId":"9f45d4bf-7e01-4684-9438-37c712728db1"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7446210Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7446210Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-07-07T16:48:01.7641299Z","primaryEndpoints":{"blob":"https://acliautomationlab2987.blob.core.windows.net/","queue":"https://acliautomationlab2987.queue.core.windows.net/","table":"https://acliautomationlab2987.table.core.windows.net/","file":"https://acliautomationlab2987.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cliautomation01l6uben7lla33aijx72dhaf3wb7dlqb2u7ixr7vhmojrwbr6e5gv2rvdneg5r/providers/Microsoft.Storage/storageAccounts/acliautomationlab1471","name":"acliautomationlab1471","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"hidden-DevTestLabs-LabUId":"48fc5481-154a-40d8-a96c-90f85a3186b5"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7289702Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7289702Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-12-26T15:33:35.4529781Z","primaryEndpoints":{"blob":"https://acliautomationlab1471.blob.core.windows.net/","queue":"https://acliautomationlab1471.queue.core.windows.net/","table":"https://acliautomationlab1471.table.core.windows.net/","file":"https://acliautomationlab1471.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rgcv22bl3p5jculym7mxzp4qrzni5wnq3cmtnvsu52yhtwvwicm3fe3k6m24yqdilgh/providers/Microsoft.Storage/storageAccounts/clireg23zq5h4f67b5091810","name":"clireg23zq5h4f67b5091810","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"containerregistry":"clireg23zq5h4f67b5wu"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T09:18:14.1652856Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T09:18:14.1652856Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T09:18:14.1184391Z","primaryEndpoints":{"blob":"https://clireg23zq5h4f67b5091810.blob.core.windows.net/","queue":"https://clireg23zq5h4f67b5091810.queue.core.windows.net/","table":"https://clireg23zq5h4f67b5091810.table.core.windows.net/","file":"https://clireg23zq5h4f67b5091810.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cliautomation014m5le4sxlxnlbtvhekxljqndmwiuvvczqg2qumloh3nw3a6dg6qfqz65dczz/providers/Microsoft.Storage/storageAccounts/acliautomationlab2832","name":"acliautomationlab2832","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"hidden-DevTestLabs-LabUId":"ec24f56f-0a82-42f5-ae26-f391815aaf39"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-02T07:38:16.9674949Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-02T07:38:16.9674949Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-02T07:38:16.9356739Z","primaryEndpoints":{"blob":"https://acliautomationlab2832.blob.core.windows.net/","queue":"https://acliautomationlab2832.queue.core.windows.net/","table":"https://acliautomationlab2832.table.core.windows.net/","file":"https://acliautomationlab2832.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cliautomationbvd5rqbmr4xfzxbbls4vvm4zl66fz5ykv73nqx3rtougzgxhksyjpn3l43txu3/providers/Microsoft.Storage/storageAccounts/acliautomationlab386","name":"acliautomationlab386","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"hidden-DevTestLabs-LabUId":"40c3e5e9-6d70-41a5-9ba0-dedd33f96963"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-02T07:38:24.9254634Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-02T07:38:24.9254634Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-02T07:38:24.9098324Z","primaryEndpoints":{"blob":"https://acliautomationlab386.blob.core.windows.net/","queue":"https://acliautomationlab386.queue.core.windows.net/","table":"https://acliautomationlab386.table.core.windows.net/","file":"https://acliautomationlab386.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rgcv22bl3p5jculym7mxzp4qrzni5wnq3cmtnvsu52yhtwvwicm3fe3k6m24yqdilgh/providers/Microsoft.Storage/storageAccounts/clitestaycxoezila4zvz3oc","name":"clitestaycxoezila4zvz3oc","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T09:17:31.1771220Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T09:17:31.1771220Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T09:17:31.1146217Z","primaryEndpoints":{"blob":"https://clitestaycxoezila4zvz3oc.blob.core.windows.net/","queue":"https://clitestaycxoezila4zvz3oc.queue.core.windows.net/","table":"https://clitestaycxoezila4zvz3oc.table.core.windows.net/","file":"https://clitestaycxoezila4zvz3oc.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cliautomationzlgmnmobxi6bkdkatnybuntm5ic5csahw33ox6rmthro3hjfgfqujqkdlrxfje/providers/Microsoft.Storage/storageAccounts/acliautomationlab3782","name":"acliautomationlab3782","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"hidden-DevTestLabs-LabUId":"b9dc7e5c-5ff3-4687-bf01-83833a4ccd53"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-04T06:41:36.4612382Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-04T06:41:36.4612382Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-04T06:41:36.4143632Z","primaryEndpoints":{"blob":"https://acliautomationlab3782.blob.core.windows.net/","queue":"https://acliautomationlab3782.queue.core.windows.net/","table":"https://acliautomationlab3782.table.core.windows.net/","file":"https://acliautomationlab3782.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cliautomation01bn7wa4ubnulp6m4khobeloz6mvbxxg6ygalgryhylt2zpjgqcumow6ih26ud/providers/Microsoft.Storage/storageAccounts/acliautomationlab8383","name":"acliautomationlab8383","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"hidden-DevTestLabs-LabUId":"417cc8eb-3e86-4a90-9ce0-e215c7a4b9be"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-31T19:38:42.9687239Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-31T19:38:42.9687239Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-01-31T19:38:42.9375080Z","primaryEndpoints":{"blob":"https://acliautomationlab8383.blob.core.windows.net/","queue":"https://acliautomationlab8383.queue.core.windows.net/","table":"https://acliautomationlab8383.table.core.windows.net/","file":"https://acliautomationlab8383.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rgz7d3e2yb2inofrrnaj3lvvbvwqqigncdhefwljdibplopfilty5ix4dxhdnegz7s4/providers/Microsoft.Storage/storageAccounts/clitestobxdwzqyayj32oxzm","name":"clitestobxdwzqyayj32oxzm","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T19:31:04.8312684Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T19:31:04.8312684Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T19:31:04.7844176Z","primaryEndpoints":{"blob":"https://clitestobxdwzqyayj32oxzm.blob.core.windows.net/","queue":"https://clitestobxdwzqyayj32oxzm.queue.core.windows.net/","table":"https://clitestobxdwzqyayj32oxzm.table.core.windows.net/","file":"https://clitestobxdwzqyayj32oxzm.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg2claqiiin2xfwkiskmfrvz2arekdocwsl7ff63gkroosvxv2whwbgdanw4tgesatc/providers/Microsoft.Storage/storageAccounts/clitest6uk5hhihzzby4ytcq","name":"clitest6uk5hhihzzby4ytcq","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T08:12:51.8379955Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T08:12:51.8379955Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T08:12:51.7754853Z","primaryEndpoints":{"blob":"https://clitest6uk5hhihzzby4ytcq.blob.core.windows.net/","queue":"https://clitest6uk5hhihzzby4ytcq.queue.core.windows.net/","table":"https://clitest6uk5hhihzzby4ytcq.table.core.windows.net/","file":"https://clitest6uk5hhihzzby4ytcq.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cliautomation01ldu2m7bvtvotoelxgw2icl5sivnvoixudxyql6l42hseiv5stbbuulg7g3h4/providers/Microsoft.Storage/storageAccounts/acliautomationlab9248","name":"acliautomationlab9248","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"hidden-DevTestLabs-LabUId":"3ff20302-c399-4d32-88ed-2c84952da1c3"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7914959Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7914959Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-01-04T00:40:16.2044479Z","primaryEndpoints":{"blob":"https://acliautomationlab9248.blob.core.windows.net/","queue":"https://acliautomationlab9248.queue.core.windows.net/","table":"https://acliautomationlab9248.table.core.windows.net/","file":"https://acliautomationlab9248.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cliautomation016zx7ulhvrc7ng6fcdst72y2t2fgbvbyueykqnw4d76aq4gyxd267voh5nixs/providers/Microsoft.Storage/storageAccounts/acliautomationlab8049","name":"acliautomationlab8049","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"hidden-DevTestLabs-LabUId":"909a5513-261d-4cd4-a8dd-19a18a866f77"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7758767Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7758767Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-12-08T02:56:53.0185142Z","primaryEndpoints":{"blob":"https://acliautomationlab8049.blob.core.windows.net/","queue":"https://acliautomationlab8049.queue.core.windows.net/","table":"https://acliautomationlab8049.table.core.windows.net/","file":"https://acliautomationlab8049.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cliautomation013mvyy356dnjmb5iwivgwu3gp2bgpjaik6sx3zxuqg36vhnchoc5vwvzzvxu4/providers/Microsoft.Storage/storageAccounts/acliautomationlab8828","name":"acliautomationlab8828","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"hidden-DevTestLabs-LabUId":"33f5487f-2303-4193-9ec1-9f4820d78d00"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7758767Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7758767Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-01-05T07:38:28.7575542Z","primaryEndpoints":{"blob":"https://acliautomationlab8828.blob.core.windows.net/","queue":"https://acliautomationlab8828.queue.core.windows.net/","table":"https://acliautomationlab8828.table.core.windows.net/","file":"https://acliautomationlab8828.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cliautomation01iy5u4xyaed2wgxpr3oshkjvesx7eypiagoyydutuuwbrotz44zddkgr7qfay/providers/Microsoft.Storage/storageAccounts/acliautomationlab1940","name":"acliautomationlab1940","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"hidden-DevTestLabs-LabUId":"867204a5-7d7c-41c3-866f-845829532736"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-04T06:41:24.3204875Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-04T06:41:24.3204875Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-04T06:41:24.2579926Z","primaryEndpoints":{"blob":"https://acliautomationlab1940.blob.core.windows.net/","queue":"https://acliautomationlab1940.queue.core.windows.net/","table":"https://acliautomationlab1940.table.core.windows.net/","file":"https://acliautomationlab1940.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cliautomationrmo5dcfkn2tcdobw3qhwsafqbqgge3o7emagrlfoxgsioc2jr7e5cjztqewzla/providers/Microsoft.Storage/storageAccounts/acliautomationlab6710","name":"acliautomationlab6710","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"hidden-DevTestLabs-LabUId":"90a7effd-a5b2-48ce-ac70-88b48096881c"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7602255Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7602255Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-01-03T04:10:00.39885Z","primaryEndpoints":{"blob":"https://acliautomationlab6710.blob.core.windows.net/","queue":"https://acliautomationlab6710.queue.core.windows.net/","table":"https://acliautomationlab6710.table.core.windows.net/","file":"https://acliautomationlab6710.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cliautomationpytfzqow2fyxfbik7w4k34yguitwrmhunpwy4ozpgsy243novl4fjnlev2zfly/providers/Microsoft.Storage/storageAccounts/acliautomationlab1008","name":"acliautomationlab1008","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"hidden-DevTestLabs-LabUId":"7dfd84e6-8815-45cd-a927-4ea20034ff9e"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-31T19:38:56.9344030Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-31T19:38:56.9344030Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-01-31T19:38:56.8562798Z","primaryEndpoints":{"blob":"https://acliautomationlab1008.blob.core.windows.net/","queue":"https://acliautomationlab1008.queue.core.windows.net/","table":"https://acliautomationlab1008.table.core.windows.net/","file":"https://acliautomationlab1008.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cliautomationgbb6evd4zx72bc5wpfijxlcbpo5n24rkj2kg3y57jpl2mkxc6w5x5exnsantug/providers/Microsoft.Storage/storageAccounts/acliautomationlab5191","name":"acliautomationlab5191","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"hidden-DevTestLabs-LabUId":"bfb18d73-f216-4bdc-aba6-252bba91adb2"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-26T20:28:36.4256121Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-26T20:28:36.4256121Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-01-26T20:28:36.3631077Z","primaryEndpoints":{"blob":"https://acliautomationlab5191.blob.core.windows.net/","queue":"https://acliautomationlab5191.queue.core.windows.net/","table":"https://acliautomationlab5191.table.core.windows.net/","file":"https://acliautomationlab5191.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cliautomationrcjorwrtg3oudx2a6akfwe5e6n7ocvpleklcwwqclzazlly76iaddtkjqtdwbe/providers/Microsoft.Storage/storageAccounts/acliautomationlab5146","name":"acliautomationlab5146","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"hidden-DevTestLabs-LabUId":"6734c4ab-6f8d-46e5-afec-0ed8275cccc7"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T16:45:00.1329602Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T16:45:00.1329602Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T16:45:00.0861198Z","primaryEndpoints":{"blob":"https://acliautomationlab5146.blob.core.windows.net/","queue":"https://acliautomationlab5146.queue.core.windows.net/","table":"https://acliautomationlab5146.table.core.windows.net/","file":"https://acliautomationlab5146.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cliautomation01undmfcuvtas2vq76b7cdf2bcb522g55yjxgq26oqjumof4h3bkhfa5f5galo/providers/Microsoft.Storage/storageAccounts/acliautomationlab3187","name":"acliautomationlab3187","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"hidden-DevTestLabs-LabUId":"3cd350aa-2568-49ea-a4a2-41dd07e9e8ac"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7446210Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7446210Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-01-02T05:13:09.9630161Z","primaryEndpoints":{"blob":"https://acliautomationlab3187.blob.core.windows.net/","queue":"https://acliautomationlab3187.queue.core.windows.net/","table":"https://acliautomationlab3187.table.core.windows.net/","file":"https://acliautomationlab3187.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cliautomationsxtwbd7crie33fjnfjz2zp7ibcmfz4gyjh5mvqoqkz3y7txx7g34rl7mmoucew/providers/Microsoft.Storage/storageAccounts/acliautomationlab3276","name":"acliautomationlab3276","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"hidden-DevTestLabs-LabUId":"9f96ba9d-7858-43e0-a93a-9424a36a0975"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7602255Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7602255Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-01-05T07:38:39.4934331Z","primaryEndpoints":{"blob":"https://acliautomationlab3276.blob.core.windows.net/","queue":"https://acliautomationlab3276.queue.core.windows.net/","table":"https://acliautomationlab3276.table.core.windows.net/","file":"https://acliautomationlab3276.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Premium_LRS","tier":"Premium"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/sdk-test/providers/Microsoft.Storage/storageAccounts/sdkteststor","name":"sdkteststor","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"supportsHttpsTrafficOnly":false,"encryption":{"services":{"blob":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.8539723Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-05-21T04:29:51.1804697Z","primaryEndpoints":{"blob":"https://sdkteststor.blob.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cliautomationyl5duneg4gkn25csd2rd4lbm2yjjq5n33z24jxikgchafi3xnfgokwxtsor56r/providers/Microsoft.Storage/storageAccounts/acliautomationlab1231","name":"acliautomationlab1231","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"hidden-DevTestLabs-LabUId":"f500a48c-e003-403a-b50a-903a96f6d226"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7133409Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7133409Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-12-08T02:59:00.3810995Z","primaryEndpoints":{"blob":"https://acliautomationlab1231.blob.core.windows.net/","queue":"https://acliautomationlab1231.queue.core.windows.net/","table":"https://acliautomationlab1231.table.core.windows.net/","file":"https://acliautomationlab1231.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rgh677nueggg6d7igrusbfk2xh6gja7um3ccgomqlsm3nxazm2ixsvo4uppithrwls5/providers/Microsoft.Storage/storageAccounts/clitestyfn6lmyp56kgtrigf","name":"clitestyfn6lmyp56kgtrigf","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T18:42:23.4666652Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T18:42:23.4666652Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T18:42:23.3885547Z","primaryEndpoints":{"blob":"https://clitestyfn6lmyp56kgtrigf.blob.core.windows.net/","queue":"https://clitestyfn6lmyp56kgtrigf.queue.core.windows.net/","table":"https://clitestyfn6lmyp56kgtrigf.table.core.windows.net/","file":"https://clitestyfn6lmyp56kgtrigf.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/javacsmrg6246/providers/Microsoft.Storage/storageAccounts/javawebapp735267887","name":"javawebapp735267887","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T12:44:08.0866484Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T12:44:08.0866484Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T12:44:08.0397682Z","primaryEndpoints":{"blob":"https://javawebapp735267887.blob.core.windows.net/","queue":"https://javawebapp735267887.queue.core.windows.net/","table":"https://javawebapp735267887.table.core.windows.net/","file":"https://javawebapp735267887.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available","secondaryLocation":"eastus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cliautomation01ptu376gffvlvblokeyvsvqoefixzvz2uosy7gvqozzktnhvpufmcc5ut4ytd/providers/Microsoft.Storage/storageAccounts/acliautomationlab2257","name":"acliautomationlab2257","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"hidden-DevTestLabs-LabUId":"e6cd699b-4ac2-4022-a435-960bc7d3ee9f"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7289702Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7289702Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-01-08T22:52:45.5675859Z","primaryEndpoints":{"blob":"https://acliautomationlab2257.blob.core.windows.net/","queue":"https://acliautomationlab2257.queue.core.windows.net/","table":"https://acliautomationlab2257.table.core.windows.net/","file":"https://acliautomationlab2257.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cliautomation01kr3ll4q2x5vuwozn4xz6zoybb4odfjebsjtwcxrehup7jnzykb47tmcsohyz/providers/Microsoft.Storage/storageAccounts/acliautomationlab6989","name":"acliautomationlab6989","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"hidden-DevTestLabs-LabUId":"3e585a6c-7c78-494c-99f8-a56e8734fb6d"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T16:44:45.7241602Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T16:44:45.7241602Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T16:44:45.6772890Z","primaryEndpoints":{"blob":"https://acliautomationlab6989.blob.core.windows.net/","queue":"https://acliautomationlab6989.queue.core.windows.net/","table":"https://acliautomationlab6989.table.core.windows.net/","file":"https://acliautomationlab6989.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cliautomationt3zeu76ormrubewlqrnf4ykozdfs3pr2ahftj4d33tuybrpobavi5sbtcdcfc4/providers/Microsoft.Storage/storageAccounts/acliautomationlab9106","name":"acliautomationlab9106","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"hidden-DevTestLabs-LabUId":"498bf2d2-520c-42fd-b974-269015697a98"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7758767Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7758767Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-01-04T00:40:33.0829429Z","primaryEndpoints":{"blob":"https://acliautomationlab9106.blob.core.windows.net/","queue":"https://acliautomationlab9106.queue.core.windows.net/","table":"https://acliautomationlab9106.table.core.windows.net/","file":"https://acliautomationlab9106.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/javacsmrg9129/providers/Microsoft.Storage/storageAccounts/javawebapp575092367","name":"javawebapp575092367","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T02:46:42.1621654Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T02:46:42.1621654Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T02:46:42.1153349Z","primaryEndpoints":{"blob":"https://javawebapp575092367.blob.core.windows.net/","queue":"https://javawebapp575092367.queue.core.windows.net/","table":"https://javawebapp575092367.table.core.windows.net/","file":"https://javawebapp575092367.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available","secondaryLocation":"eastus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cliautomation2nscoydrikfz67cluekp6xqv4zkltay5x7ubl3qh2yb73qfdjq3j24fzcrd766/providers/Microsoft.Storage/storageAccounts/acliautomationlab2578","name":"acliautomationlab2578","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"hidden-DevTestLabs-LabUId":"8cf9f8f3-ff0c-43a5-809d-b4be39f17fa8"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7446210Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7446210Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-01-02T05:13:20.2601933Z","primaryEndpoints":{"blob":"https://acliautomationlab2578.blob.core.windows.net/","queue":"https://acliautomationlab2578.queue.core.windows.net/","table":"https://acliautomationlab2578.table.core.windows.net/","file":"https://acliautomationlab2578.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_RAGRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/wilxgroup/providers/Microsoft.Storage/storageAccounts/wilxstorage","name":"wilxstorage","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-05T21:40:13.3804210Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-05T21:40:13.3804210Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-05T21:40:13.3335235Z","primaryEndpoints":{"blob":"https://wilxstorage.blob.core.windows.net/","queue":"https://wilxstorage.queue.core.windows.net/","table":"https://wilxstorage.table.core.windows.net/","file":"https://wilxstorage.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available","secondaryLocation":"eastus","statusOfSecondary":"available","secondaryEndpoints":{"blob":"https://wilxstorage-secondary.blob.core.windows.net/","queue":"https://wilxstorage-secondary.queue.core.windows.net/","table":"https://wilxstorage-secondary.table.core.windows.net/"}}},{"sku":{"name":"Premium_LRS","tier":"Premium"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rgfluentchash-2695/providers/Microsoft.Storage/storageAccounts/stg7841","name":"stg7841","type":"Microsoft.Storage/storageAccounts","location":"southcentralus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T19:42:38.5746805Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T19:42:38.5746805Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T19:42:38.5121931Z","primaryEndpoints":{"blob":"https://stg7841.blob.core.windows.net/"},"primaryLocation":"southcentralus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rgfluentchash-2695/providers/Microsoft.Storage/storageAccounts/stgchashvmb0493512bd3","name":"stgchashvmb0493512bd3","type":"Microsoft.Storage/storageAccounts","location":"southcentralus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T19:48:24.0431630Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T19:48:24.0431630Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T19:48:23.9806708Z","primaryEndpoints":{"blob":"https://stgchashvmb0493512bd3.blob.core.windows.net/","queue":"https://stgchashvmb0493512bd3.queue.core.windows.net/","table":"https://stgchashvmb0493512bd3.table.core.windows.net/","file":"https://stgchashvmb0493512bd3.file.core.windows.net/"},"primaryLocation":"southcentralus","statusOfPrimary":"available","secondaryLocation":"northcentralus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rgfluentchash-2695/providers/Microsoft.Storage/storageAccounts/stgchashvmf966267182c","name":"stgchashvmf966267182c","type":"Microsoft.Storage/storageAccounts","location":"southcentralus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T19:43:09.8431316Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T19:43:09.8431316Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T19:43:09.7962537Z","primaryEndpoints":{"blob":"https://stgchashvmf966267182c.blob.core.windows.net/","queue":"https://stgchashvmf966267182c.queue.core.windows.net/","table":"https://stgchashvmf966267182c.table.core.windows.net/","file":"https://stgchashvmf966267182c.file.core.windows.net/"},"primaryLocation":"southcentralus","statusOfPrimary":"available","secondaryLocation":"northcentralus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_RAGRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/debekoe1test2/providers/Microsoft.Storage/storageAccounts/debekoe1test2","name":"debekoe1test2","type":"Microsoft.Storage/storageAccounts","location":"westus2","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T19:26:27.0937394Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T19:26:27.0937394Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T19:26:27.0624521Z","primaryEndpoints":{"blob":"https://debekoe1test2.blob.core.windows.net/","queue":"https://debekoe1test2.queue.core.windows.net/","table":"https://debekoe1test2.table.core.windows.net/","file":"https://debekoe1test2.file.core.windows.net/"},"primaryLocation":"westus2","statusOfPrimary":"available","secondaryLocation":"westcentralus","statusOfSecondary":"available","secondaryEndpoints":{"blob":"https://debekoe1test2-secondary.blob.core.windows.net/","queue":"https://debekoe1test2-secondary.queue.core.windows.net/","table":"https://debekoe1test2-secondary.table.core.windows.net/"}}}]}'} + body: {string: '{"value":[{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitesti4aotnzdo4/providers/Microsoft.Storage/storageAccounts/o0zeaawp7t7n4skagntpri4","name":"o0zeaawp7t7n4skagntpri4","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-18T18:34:00.2637195Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-18T18:34:00.2637195Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-01-18T18:34:00.2168154Z","primaryEndpoints":{"blob":"https://o0zeaawp7t7n4skagntpri4.blob.core.windows.net/","queue":"https://o0zeaawp7t7n4skagntpri4.queue.core.windows.net/","table":"https://o0zeaawp7t7n4skagntpri4.table.core.windows.net/","file":"https://o0zeaawp7t7n4skagntpri4.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitesti4aotnzdo4/providers/Microsoft.Storage/storageAccounts/zeaawp7t7n4skagntpub","name":"zeaawp7t7n4skagntpub","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-18T18:34:00.5762847Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-18T18:34:00.5762847Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-01-18T18:34:00.5294154Z","primaryEndpoints":{"blob":"https://zeaawp7t7n4skagntpub.blob.core.windows.net/","queue":"https://zeaawp7t7n4skagntpub.queue.core.windows.net/","table":"https://zeaawp7t7n4skagntpub.table.core.windows.net/","file":"https://zeaawp7t7n4skagntpub.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/storGRP1/providers/Microsoft.Storage/storageAccounts/storacc2","name":"storacc2","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-09T18:24:41.3214880Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-09T18:24:41.3214880Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-01-09T18:24:41.2902466Z","primaryEndpoints":{"blob":"https://storacc2.blob.core.windows.net/","queue":"https://storacc2.queue.core.windows.net/","table":"https://storacc2.table.core.windows.net/","file":"https://storacc2.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitesti4aotnzdo4/providers/Microsoft.Storage/storageAccounts/zeaawp7t7n4skdiag0","name":"zeaawp7t7n4skdiag0","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-18T18:34:00.7951275Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-18T18:34:00.7951275Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-01-18T18:34:00.7482499Z","primaryEndpoints":{"blob":"https://zeaawp7t7n4skdiag0.blob.core.windows.net/","queue":"https://zeaawp7t7n4skdiag0.queue.core.windows.net/","table":"https://zeaawp7t7n4skdiag0.table.core.windows.net/","file":"https://zeaawp7t7n4skdiag0.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyReallyCoolVM202/providers/Microsoft.Storage/storageAccounts/mynewaccount1234","name":"mynewaccount1234","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-04-27T21:34:15.2961058Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-04-27T21:34:15.2961058Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-04-27T21:34:15.2335978Z","primaryEndpoints":{"blob":"https://mynewaccount1234.blob.core.windows.net/","queue":"https://mynewaccount1234.queue.core.windows.net/","table":"https://mynewaccount1234.table.core.windows.net/","file":"https://mynewaccount1234.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitesti4aotnzdo4/providers/Microsoft.Storage/storageAccounts/60zeaawp7t7n4skagntpri1","name":"60zeaawp7t7n4skagntpri1","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-18T18:33:59.4978129Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-18T18:33:59.4978129Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-01-18T18:33:59.3727743Z","primaryEndpoints":{"blob":"https://60zeaawp7t7n4skagntpri1.blob.core.windows.net/","queue":"https://60zeaawp7t7n4skagntpri1.queue.core.windows.net/","table":"https://60zeaawp7t7n4skagntpri1.table.core.windows.net/","file":"https://60zeaawp7t7n4skagntpri1.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitesti4aotnzdo4/providers/Microsoft.Storage/storageAccounts/00zeaawp7t7n4skagntpri0","name":"00zeaawp7t7n4skagntpri0","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-18T18:33:57.1533290Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-18T18:33:57.1533290Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-01-18T18:33:57.1064646Z","primaryEndpoints":{"blob":"https://00zeaawp7t7n4skagntpri0.blob.core.windows.net/","queue":"https://00zeaawp7t7n4skagntpri0.queue.core.windows.net/","table":"https://00zeaawp7t7n4skagntpri0.table.core.windows.net/","file":"https://00zeaawp7t7n4skagntpri0.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available"}},{"sku":{"name":"Premium_LRS","tier":"Premium"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/wilxgroup/providers/Microsoft.Storage/storageAccounts/wilxgroupdisks925","name":"wilxgroupdisks925","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-03-13T17:14:42.2678046Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-03-13T17:14:42.2678046Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-03-13T17:14:42.2522063Z","primaryEndpoints":{"blob":"https://wilxgroupdisks925.blob.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitesti4aotnzdo4/providers/Microsoft.Storage/storageAccounts/i0zeaawp7t7n4skagntpri3","name":"i0zeaawp7t7n4skagntpri3","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-18T18:33:59.2790240Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-18T18:33:59.2790240Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-01-18T18:33:59.2321471Z","primaryEndpoints":{"blob":"https://i0zeaawp7t7n4skagntpri3.blob.core.windows.net/","queue":"https://i0zeaawp7t7n4skagntpri3.queue.core.windows.net/","table":"https://i0zeaawp7t7n4skagntpri3.table.core.windows.net/","file":"https://i0zeaawp7t7n4skagntpri3.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitesti4aotnzdo4/providers/Microsoft.Storage/storageAccounts/zeaawp7t7n4skexhb0","name":"zeaawp7t7n4skexhb0","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-18T18:34:00.8576146Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-18T18:34:00.8576146Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-01-18T18:34:00.7951275Z","primaryEndpoints":{"blob":"https://zeaawp7t7n4skexhb0.blob.core.windows.net/","queue":"https://zeaawp7t7n4skexhb0.queue.core.windows.net/","table":"https://zeaawp7t7n4skexhb0.table.core.windows.net/","file":"https://zeaawp7t7n4skexhb0.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitesti4aotnzdo4/providers/Microsoft.Storage/storageAccounts/zeaawp7t7n4skmstr0","name":"zeaawp7t7n4skmstr0","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-18T18:34:00.5294154Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-18T18:34:00.5294154Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-01-18T18:34:00.4825090Z","primaryEndpoints":{"blob":"https://zeaawp7t7n4skmstr0.blob.core.windows.net/","queue":"https://zeaawp7t7n4skmstr0.queue.core.windows.net/","table":"https://zeaawp7t7n4skmstr0.table.core.windows.net/","file":"https://zeaawp7t7n4skmstr0.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitesti4aotnzdo4/providers/Microsoft.Storage/storageAccounts/c0zeaawp7t7n4skagntpri2","name":"c0zeaawp7t7n4skagntpri2","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-18T18:34:00.8889157Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-18T18:34:00.8889157Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-01-18T18:34:00.8263879Z","primaryEndpoints":{"blob":"https://c0zeaawp7t7n4skagntpri2.blob.core.windows.net/","queue":"https://c0zeaawp7t7n4skagntpri2.queue.core.windows.net/","table":"https://c0zeaawp7t7n4skagntpri2.table.core.windows.net/","file":"https://c0zeaawp7t7n4skagntpri2.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available"}},{"identity":{"principalId":"4b358eca-1f6e-4da5-a90c-5cfda2b6ca83","tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","type":"SystemAssigned"},"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"StorageV2","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/amar/providers/Microsoft.Storage/storageAccounts/eastustorage1","name":"eastustorage1","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-03-21T02:38:33.4035294Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-03-21T02:38:33.4035294Z"}},"keySource":"Microsoft.Storage"},"accessTier":"Hot","provisioningState":"Succeeded","creationTime":"2018-03-21T02:38:33.3253713Z","primaryEndpoints":{"blob":"https://eastustorage1.blob.core.windows.net/","queue":"https://eastustorage1.queue.core.windows.net/","table":"https://eastustorage1.table.core.windows.net/","file":"https://eastustorage1.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_RAGRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/wilxgroupeastus2/providers/Microsoft.Storage/storageAccounts/wilxstorageeastus2","name":"wilxstorageeastus2","type":"Microsoft.Storage/storageAccounts","location":"eastus2","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-04-30T18:32:07.3429304Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-04-30T18:32:07.3429304Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-04-30T18:32:07.2804546Z","primaryEndpoints":{"blob":"https://wilxstorageeastus2.blob.core.windows.net/","queue":"https://wilxstorageeastus2.queue.core.windows.net/","table":"https://wilxstorageeastus2.table.core.windows.net/","file":"https://wilxstorageeastus2.file.core.windows.net/"},"primaryLocation":"eastus2","statusOfPrimary":"available","secondaryLocation":"centralus","statusOfSecondary":"available","secondaryEndpoints":{"blob":"https://wilxstorageeastus2-secondary.blob.core.windows.net/","queue":"https://wilxstorageeastus2-secondary.queue.core.windows.net/","table":"https://wilxstorageeastus2-secondary.table.core.windows.net/"}}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rgojaoj267klrvs47gnp57mu55f6yoziamdogqqs72by7ljczabahxkfmzi5mh2glk5/providers/Microsoft.Storage/storageAccounts/clitest7tkosn7vrxnjiifrm","name":"clitest7tkosn7vrxnjiifrm","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:45:30.8088827Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:45:30.8088827Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"ResolvingDns","creationTime":"2018-05-01T21:45:30.4963753Z","primaryEndpoints":{"blob":"https://clitest7tkosn7vrxnjiifrm.blob.core.windows.net/","queue":"https://clitest7tkosn7vrxnjiifrm.queue.core.windows.net/","table":"https://clitest7tkosn7vrxnjiifrm.table.core.windows.net/","file":"https://clitest7tkosn7vrxnjiifrm.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rgp3j2bt5nvsedgoxpqt6xtucbamnbo7jkgrcckdigt3aclxopqxio6lxjlqrj3czo7/providers/Microsoft.Storage/storageAccounts/clitestt7lrbv35ny3lgnfak","name":"clitestt7lrbv35ny3lgnfak","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.1522571Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.1522571Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-11-26T06:17:59.2725025Z","primaryEndpoints":{"blob":"https://clitestt7lrbv35ny3lgnfak.blob.core.windows.net/","queue":"https://clitestt7lrbv35ny3lgnfak.queue.core.windows.net/","table":"https://clitestt7lrbv35ny3lgnfak.table.core.windows.net/","file":"https://clitestt7lrbv35ny3lgnfak.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/vscode-spot/providers/Microsoft.Storage/storageAccounts/spot1936b9594f55526a14","name":"spot1936b9594f55526a14","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-04-30T04:32:25.2179795Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-04-30T04:32:25.2179795Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-04-30T04:32:25.0930004Z","primaryEndpoints":{"blob":"https://spot1936b9594f55526a14.blob.core.windows.net/","queue":"https://spot1936b9594f55526a14.queue.core.windows.net/","table":"https://spot1936b9594f55526a14.table.core.windows.net/","file":"https://spot1936b9594f55526a14.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/wilxgroup/providers/Microsoft.Storage/storageAccounts/awilxlab6038","name":"awilxlab6038","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"hidden-DevTestLabs-LabUId":"8887c3df-fb11-4c4a-b5ea-fb85003cd93d"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-04-11T22:14:43.7809117Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-04-11T22:14:43.7809117Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-04-11T22:14:43.6871681Z","primaryEndpoints":{"blob":"https://awilxlab6038.blob.core.windows.net/","queue":"https://awilxlab6038.queue.core.windows.net/","table":"https://awilxlab6038.table.core.windows.net/","file":"https://awilxlab6038.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/foozap002/providers/Microsoft.Storage/storageAccounts/foozy985","name":"foozy985","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"key1":"value1","key2":"value2"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.2460333Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.2460333Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-07-11T22:39:05.4716715Z","primaryEndpoints":{"blob":"https://foozy985.blob.core.windows.net/","queue":"https://foozy985.queue.core.windows.net/","table":"https://foozy985.table.core.windows.net/","file":"https://foozy985.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available","secondaryLocation":"eastus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"StorageV2","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/amar/providers/Microsoft.Storage/storageAccounts/testacc7561","name":"testacc7561","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-03-13T01:22:28.4626746Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-03-13T01:22:28.4626746Z"}},"keySource":"Microsoft.Storage"},"accessTier":"Hot","provisioningState":"Succeeded","creationTime":"2018-03-13T01:22:28.4157923Z","primaryEndpoints":{"blob":"https://testacc7561.blob.core.windows.net/","queue":"https://testacc7561.queue.core.windows.net/","table":"https://testacc7561.table.core.windows.net/","file":"https://testacc7561.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available","secondaryLocation":"eastus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_RAGRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/wilxgroup/providers/Microsoft.Storage/storageAccounts/wilxstorage2","name":"wilxstorage2","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-03-16T19:43:30.0571507Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-03-16T19:43:30.0571507Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-03-16T19:43:29.9946790Z","primaryEndpoints":{"blob":"https://wilxstorage2.blob.core.windows.net/","queue":"https://wilxstorage2.queue.core.windows.net/","table":"https://wilxstorage2.table.core.windows.net/","file":"https://wilxstorage2.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available","secondaryLocation":"eastus","statusOfSecondary":"available","secondaryEndpoints":{"blob":"https://wilxstorage2-secondary.blob.core.windows.net/","queue":"https://wilxstorage2-secondary.queue.core.windows.net/","table":"https://wilxstorage2-secondary.table.core.windows.net/"}}},{"sku":{"name":"Standard_ZRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zitest/providers/Microsoft.Storage/storageAccounts/foostore103","name":"foostore103","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.1991330Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.1991330Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2016-05-25T23:52:18.1234838Z","primaryEndpoints":{"blob":"https://foostore103.blob.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_ZRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zitest/providers/Microsoft.Storage/storageAccounts/foostore102","name":"foostore102","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.1835342Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.1835342Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2016-05-25T19:32:49.5192125Z","primaryEndpoints":{"blob":"https://foostore102.blob.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zitest/providers/Microsoft.Storage/storageAccounts/zitest345","name":"zitest345","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"key1":"value1","key2":"value2"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-03-27T09:10:59.8313291Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-03-27T09:10:59.8313291Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-07-07T21:55:13.9394493Z","primaryEndpoints":{"blob":"https://zitest345.blob.core.windows.net/","queue":"https://zitest345.queue.core.windows.net/","table":"https://zitest345.table.core.windows.net/","file":"https://zitest345.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available","secondaryLocation":"eastus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zitest/providers/Microsoft.Storage/storageAccounts/zitest","name":"zitest","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-03-27T09:10:59.7688032Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-03-27T09:10:59.7688032Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2016-05-03T20:07:05.353746Z","primaryEndpoints":{"blob":"https://zitest.blob.core.windows.net/","queue":"https://zitest.queue.core.windows.net/","table":"https://zitest.table.core.windows.net/","file":"https://zitest.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"StorageV2","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zitest/providers/Microsoft.Storage/storageAccounts/zitest1012","name":"zitest1012","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-03-27T09:10:59.8001033Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-03-27T09:10:59.8001033Z"}},"keySource":"Microsoft.Storage"},"accessTier":"Hot","provisioningState":"Succeeded","creationTime":"2017-07-07T02:12:27.684591Z","primaryEndpoints":{"blob":"https://zitest1012.blob.core.windows.net/","queue":"https://zitest1012.queue.core.windows.net/","table":"https://zitest1012.table.core.windows.net/","file":"https://zitest1012.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rgvnc44s5iiyknx6iehpbmjsf7y6xsqhrqvyb5opb2yr5wagkqftcqlbbpfkralo2id/providers/Microsoft.Storage/storageAccounts/clitesttc4beb6y7zcdc7zly","name":"clitesttc4beb6y7zcdc7zly","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.1522571Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.1522571Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-11-26T06:16:26.3626209Z","primaryEndpoints":{"blob":"https://clitesttc4beb6y7zcdc7zly.blob.core.windows.net/","queue":"https://clitesttc4beb6y7zcdc7zly.queue.core.windows.net/","table":"https://clitesttc4beb6y7zcdc7zly.table.core.windows.net/","file":"https://clitesttc4beb6y7zcdc7zly.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg3yzhuqlkkv4l7gq2shu6suxl6afxmnlqhzh2u225pyluz6ukscohbbgylq7s5zifg/providers/Microsoft.Storage/storageAccounts/clitestl45vwc3spozojtlf7","name":"clitestl45vwc3spozojtlf7","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:45:28.7932429Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:45:28.7932429Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:45:28.7151381Z","primaryEndpoints":{"blob":"https://clitestl45vwc3spozojtlf7.blob.core.windows.net/","queue":"https://clitestl45vwc3spozojtlf7.queue.core.windows.net/","table":"https://clitestl45vwc3spozojtlf7.table.core.windows.net/","file":"https://clitestl45vwc3spozojtlf7.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/lmazuel-docker-machine/providers/Microsoft.Storage/storageAccounts/vhdsn51j1sdv8scmv98fmq8q","name":"vhdsn51j1sdv8scmv98fmq8q","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.3085287Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.3085287Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-11-03T21:43:45.5227216Z","primaryEndpoints":{"blob":"https://vhdsn51j1sdv8scmv98fmq8q.blob.core.windows.net/","queue":"https://vhdsn51j1sdv8scmv98fmq8q.queue.core.windows.net/","table":"https://vhdsn51j1sdv8scmv98fmq8q.table.core.windows.net/","file":"https://vhdsn51j1sdv8scmv98fmq8q.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/foozap002/providers/Microsoft.Storage/storageAccounts/foozy984","name":"foozy984","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"key1":"value1","key2":"value2"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.2460333Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.2460333Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-07-11T18:22:12.9346214Z","primaryEndpoints":{"blob":"https://foozy984.blob.core.windows.net/","queue":"https://foozy984.queue.core.windows.net/","table":"https://foozy984.table.core.windows.net/","file":"https://foozy984.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available","secondaryLocation":"eastus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rgzlponhuihq2f3r2ncatzpvyupukdm6ixm63jq2whzuvbuchjhov4vejrj4uspf7ju/providers/Microsoft.Storage/storageAccounts/clitestracm62rkgrryoiiig","name":"clitestracm62rkgrryoiiig","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-04-19T16:57:00.9900481Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-04-19T16:57:00.9900481Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-04-19T16:57:00.9119456Z","primaryEndpoints":{"blob":"https://clitestracm62rkgrryoiiig.blob.core.windows.net/","queue":"https://clitestracm62rkgrryoiiig.queue.core.windows.net/","table":"https://clitestracm62rkgrryoiiig.table.core.windows.net/","file":"https://clitestracm62rkgrryoiiig.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rgaz3x2qjeu5xahclts7r7bqdgy4cuuxwsjuskjp2yklftsa2vvhsfnv32dzawwhxj4/providers/Microsoft.Storage/storageAccounts/clitestzsvhxykinf3qwcf25","name":"clitestzsvhxykinf3qwcf25","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:45:27.3088492Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:45:27.3088492Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:45:27.1057047Z","primaryEndpoints":{"blob":"https://clitestzsvhxykinf3qwcf25.blob.core.windows.net/","queue":"https://clitestzsvhxykinf3qwcf25.queue.core.windows.net/","table":"https://clitestzsvhxykinf3qwcf25.table.core.windows.net/","file":"https://clitestzsvhxykinf3qwcf25.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zitest/providers/Microsoft.Storage/storageAccounts/testacc209","name":"testacc209","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-03-27T09:10:45.3156846Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-03-27T09:10:45.3156846Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2016-01-26T19:04:16.5466637Z","primaryEndpoints":{"blob":"https://testacc209.blob.core.windows.net/","queue":"https://testacc209.queue.core.windows.net/","table":"https://testacc209.table.core.windows.net/","file":"https://testacc209.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rgi5u2fwbpqi6kc6yo2odysgg2zhkd7hteysctgc2uhogvocg4hdpi4dx6o7zo7j4z5/providers/Microsoft.Storage/storageAccounts/clitestmym7gychmllliz4j3","name":"clitestmym7gychmllliz4j3","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:45:26.3557297Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:45:26.3557297Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:45:26.0744949Z","primaryEndpoints":{"blob":"https://clitestmym7gychmllliz4j3.blob.core.windows.net/","queue":"https://clitestmym7gychmllliz4j3.queue.core.windows.net/","table":"https://clitestmym7gychmllliz4j3.table.core.windows.net/","file":"https://clitestmym7gychmllliz4j3.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cloud-shell-storage-westus/providers/Microsoft.Storage/storageAccounts/cs400977cdb163fx435fx9c3","name":"cs400977cdb163fx435fx9c3","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"ms-resource-usage":"azure-cloud-shell"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.1678828Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.1678828Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-10-31T20:15:56.3292318Z","primaryEndpoints":{"blob":"https://cs400977cdb163fx435fx9c3.blob.core.windows.net/","queue":"https://cs400977cdb163fx435fx9c3.queue.core.windows.net/","table":"https://cs400977cdb163fx435fx9c3.table.core.windows.net/","file":"https://cs400977cdb163fx435fx9c3.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rgwgjgodisz2vcsd55l3bixhutc5fbnyeyjuyatvgcv5k7sfzmxd6q2w4krnuq53zb7/providers/Microsoft.Storage/storageAccounts/clitestwwftaylvfj7kendae","name":"clitestwwftaylvfj7kendae","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.1678828Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.1678828Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-11-26T06:22:09.5983536Z","primaryEndpoints":{"blob":"https://clitestwwftaylvfj7kendae.blob.core.windows.net/","queue":"https://clitestwwftaylvfj7kendae.queue.core.windows.net/","table":"https://clitestwwftaylvfj7kendae.table.core.windows.net/","file":"https://clitestwwftaylvfj7kendae.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/ziptxtdepl51/providers/Microsoft.Storage/storageAccounts/36y3ij42opovcstandardsa","name":"36y3ij42opovcstandardsa","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.1054140Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.1054140Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-12-15T01:53:43.4548265Z","primaryEndpoints":{"blob":"https://36y3ij42opovcstandardsa.blob.core.windows.net/","queue":"https://36y3ij42opovcstandardsa.queue.core.windows.net/","table":"https://36y3ij42opovcstandardsa.table.core.windows.net/","file":"https://36y3ij42opovcstandardsa.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_RAGRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rgaungorwypaguq2ueh77vyexw7bdmu72z7vjoql6tnofssibb7u7bf2oex6iqg6jzz/providers/Microsoft.Storage/storageAccounts/clitestydki2n33vwyrmdoub","name":"clitestydki2n33vwyrmdoub","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:45:31.1057749Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:45:31.1057749Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"ResolvingDns","creationTime":"2018-05-01T21:45:30.8713726Z","primaryEndpoints":{"blob":"https://clitestydki2n33vwyrmdoub.blob.core.windows.net/","queue":"https://clitestydki2n33vwyrmdoub.queue.core.windows.net/","table":"https://clitestydki2n33vwyrmdoub.table.core.windows.net/","file":"https://clitestydki2n33vwyrmdoub.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available","secondaryLocation":"eastus","statusOfSecondary":"available","secondaryEndpoints":{"blob":"https://clitestydki2n33vwyrmdoub-secondary.blob.core.windows.net/","queue":"https://clitestydki2n33vwyrmdoub-secondary.queue.core.windows.net/","table":"https://clitestydki2n33vwyrmdoub-secondary.table.core.windows.net/"}}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zitest/providers/Microsoft.Storage/storageAccounts/zitestb21","name":"zitestb21","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-03-27T09:11:00.0656866Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-03-27T09:11:00.0656866Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2016-08-23T20:10:50.2990885Z","primaryEndpoints":{"blob":"https://zitestb21.blob.core.windows.net/","queue":"https://zitestb21.queue.core.windows.net/","table":"https://zitestb21.table.core.windows.net/","file":"https://zitestb21.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/foozap002/providers/Microsoft.Storage/storageAccounts/foozy891","name":"foozy891","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"key1":"value1","key2":"value2"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.2147571Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.2147571Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-07-08T00:35:23.7925542Z","primaryEndpoints":{"blob":"https://foozy891.blob.core.windows.net/","queue":"https://foozy891.queue.core.windows.net/","table":"https://foozy891.table.core.windows.net/","file":"https://foozy891.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available","secondaryLocation":"eastus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rgh73m2h6rniak5bbqyrad43luxpotdofmlndof5secsxxee53kwocysqnklf4bn7yd/providers/Microsoft.Storage/storageAccounts/clitesttohpa6d65i7atctbm","name":"clitesttohpa6d65i7atctbm","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.1678828Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.1678828Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-11-26T06:05:15.5574981Z","primaryEndpoints":{"blob":"https://clitesttohpa6d65i7atctbm.blob.core.windows.net/","queue":"https://clitesttohpa6d65i7atctbm.queue.core.windows.net/","table":"https://clitesttohpa6d65i7atctbm.table.core.windows.net/","file":"https://clitesttohpa6d65i7atctbm.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rgzgkjvgqueh6ylbuj5ktuxx6m6njxoabzpow65vpyumzmtjctna2jgz5lg2ggslj7v/providers/Microsoft.Storage/storageAccounts/clitestncgrg5ytsvot5spgf","name":"clitestncgrg5ytsvot5spgf","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:45:27.7307380Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:45:27.7307380Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:45:27.5276141Z","primaryEndpoints":{"blob":"https://clitestncgrg5ytsvot5spgf.blob.core.windows.net/","queue":"https://clitestncgrg5ytsvot5spgf.queue.core.windows.net/","table":"https://clitestncgrg5ytsvot5spgf.table.core.windows.net/","file":"https://clitestncgrg5ytsvot5spgf.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"StorageV2","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/ZiTest/providers/Microsoft.Storage/storageAccounts/ztesty3456","name":"ztesty3456","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-13T01:01:13.5308331Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-13T01:01:13.5308331Z"}},"keySource":"Microsoft.Storage"},"accessTier":"Hot","provisioningState":"Succeeded","creationTime":"2018-01-13T01:01:13.4995571Z","primaryEndpoints":{"blob":"https://ztesty3456.blob.core.windows.net/","queue":"https://ztesty3456.queue.core.windows.net/","table":"https://ztesty3456.table.core.windows.net/","file":"https://ztesty3456.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rgpf2denbj6axv7zzgne46nwonr7nj5agy2o2boyvdwim2tk3ha36wt53og4bdbazyl/providers/Microsoft.Storage/storageAccounts/clitestkmwx76vctofb4mjsq","name":"clitestkmwx76vctofb4mjsq","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:45:26.6057257Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:45:26.6057257Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:45:26.4651043Z","primaryEndpoints":{"blob":"https://clitestkmwx76vctofb4mjsq.blob.core.windows.net/","queue":"https://clitestkmwx76vctofb4mjsq.queue.core.windows.net/","table":"https://clitestkmwx76vctofb4mjsq.table.core.windows.net/","file":"https://clitestkmwx76vctofb4mjsq.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:45:25.8713651Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:45:25.8713651Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:45:25.6526131Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/some-unique-rg-name-second/providers/Microsoft.Storage/storageAccounts/tianosatest79","name":"tianosatest79","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-03-27T09:10:46.6281789Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-03-27T09:10:46.6281789Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-05-24T23:16:33.9028352Z","primaryEndpoints":{"blob":"https://tianosatest79.blob.core.windows.net/","queue":"https://tianosatest79.queue.core.windows.net/","table":"https://tianosatest79.table.core.windows.net/","file":"https://tianosatest79.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/foozap002/providers/Microsoft.Storage/storageAccounts/foozy894","name":"foozy894","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"key1":"value1","key2":"value2"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.2303818Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.2303818Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-07-08T00:39:03.09634Z","primaryEndpoints":{"blob":"https://foozy894.blob.core.windows.net/","queue":"https://foozy894.queue.core.windows.net/","table":"https://foozy894.table.core.windows.net/","file":"https://foozy894.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available","secondaryLocation":"eastus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testrg7175/providers/Microsoft.Storage/storageAccounts/testacc7447","name":"testacc7447","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-03-27T09:10:45.4719947Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-03-27T09:10:45.4719947Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-09-21T19:13:51.907911Z","primaryEndpoints":{"blob":"https://testacc7447.blob.core.windows.net/","queue":"https://testacc7447.queue.core.windows.net/","table":"https://testacc7447.table.core.windows.net/","file":"https://testacc7447.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zitest/providers/Microsoft.Storage/storageAccounts/zitesta21","name":"zitesta21","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-03-27T09:11:00.0344305Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-03-27T09:11:00.0344305Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2016-08-23T20:01:18.8418933Z","primaryEndpoints":{"blob":"https://zitesta21.blob.core.windows.net/","queue":"https://zitesta21.queue.core.windows.net/","table":"https://zitesta21.table.core.windows.net/","file":"https://zitesta21.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rgcmxzjqe2ev2tarnzledhk4m7mk5dsnxznyqtyvx7dixjnjgqs4h5dh37jqoyzj5l5/providers/Microsoft.Storage/storageAccounts/cliteste7bmlfupz34m23jnc","name":"cliteste7bmlfupz34m23jnc","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.1366608Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.1366608Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-12-11T00:17:56.913505Z","primaryEndpoints":{"blob":"https://cliteste7bmlfupz34m23jnc.blob.core.windows.net/","queue":"https://cliteste7bmlfupz34m23jnc.queue.core.windows.net/","table":"https://cliteste7bmlfupz34m23jnc.table.core.windows.net/","file":"https://cliteste7bmlfupz34m23jnc.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testrg9639/providers/Microsoft.Storage/storageAccounts/testacc3070","name":"testacc3070","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-03-27T09:10:45.3469905Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-03-27T09:10:45.3469905Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-09-21T18:42:53.9505428Z","primaryEndpoints":{"blob":"https://testacc3070.blob.core.windows.net/","queue":"https://testacc3070.queue.core.windows.net/","table":"https://testacc3070.table.core.windows.net/","file":"https://testacc3070.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_RAGRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg52ctd4ojyg3ymklacmvjr36nyepy2y5j2nq62diomibfwqid5v3esztgp2jcx74kv/providers/Microsoft.Storage/storageAccounts/clitestfu622ozd5q5z6e7zv","name":"clitestfu622ozd5q5z6e7zv","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:45:30.0901281Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:45:30.0901281Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"ResolvingDns","creationTime":"2018-05-01T21:45:29.8557657Z","primaryEndpoints":{"blob":"https://clitestfu622ozd5q5z6e7zv.blob.core.windows.net/","queue":"https://clitestfu622ozd5q5z6e7zv.queue.core.windows.net/","table":"https://clitestfu622ozd5q5z6e7zv.table.core.windows.net/","file":"https://clitestfu622ozd5q5z6e7zv.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available","secondaryLocation":"eastus","statusOfSecondary":"available","secondaryEndpoints":{"blob":"https://clitestfu622ozd5q5z6e7zv-secondary.blob.core.windows.net/","queue":"https://clitestfu622ozd5q5z6e7zv-secondary.queue.core.windows.net/","table":"https://clitestfu622ozd5q5z6e7zv-secondary.table.core.windows.net/"}}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rgvxzuui3qnyb3zab5viv7a6bxgimxz4k4iz4mgbw7l4js7n6aihljep4uihumvu5vg/providers/Microsoft.Storage/storageAccounts/clitestmkl7mkwejyngxmxpm","name":"clitestmkl7mkwejyngxmxpm","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:45:29.0276324Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:45:29.0276324Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:45:28.8244943Z","primaryEndpoints":{"blob":"https://clitestmkl7mkwejyngxmxpm.blob.core.windows.net/","queue":"https://clitestmkl7mkwejyngxmxpm.queue.core.windows.net/","table":"https://clitestmkl7mkwejyngxmxpm.table.core.windows.net/","file":"https://clitestmkl7mkwejyngxmxpm.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zitest/providers/Microsoft.Storage/storageAccounts/zitesty21","name":"zitesty21","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-03-27T09:11:00.0969536Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-03-27T09:11:00.0969536Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2016-08-23T19:55:37.1159138Z","primaryEndpoints":{"blob":"https://zitesty21.blob.core.windows.net/","queue":"https://zitesty21.queue.core.windows.net/","table":"https://zitesty21.table.core.windows.net/","file":"https://zitesty21.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testrg3787/providers/Microsoft.Storage/storageAccounts/testacc5739","name":"testacc5739","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-03-27T09:10:45.4406899Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-03-27T09:10:45.4406899Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-09-21T02:06:37.3496304Z","primaryEndpoints":{"blob":"https://testacc5739.blob.core.windows.net/","queue":"https://testacc5739.queue.core.windows.net/","table":"https://testacc5739.table.core.windows.net/","file":"https://testacc5739.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testrg8761/providers/Microsoft.Storage/storageAccounts/testacc3915","name":"testacc3915","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-03-27T09:10:45.4094279Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-03-27T09:10:45.4094279Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-09-21T01:35:41.2354283Z","primaryEndpoints":{"blob":"https://testacc3915.blob.core.windows.net/","queue":"https://testacc3915.queue.core.windows.net/","table":"https://testacc3915.table.core.windows.net/","file":"https://testacc3915.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/foozap002/providers/Microsoft.Storage/storageAccounts/foozy89","name":"foozy89","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"key1":"value1","key2":"value2"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.1991330Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.1991330Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-07-07T22:15:52.1441975Z","primaryEndpoints":{"blob":"https://foozy89.blob.core.windows.net/","queue":"https://foozy89.queue.core.windows.net/","table":"https://foozy89.table.core.windows.net/","file":"https://foozy89.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available","secondaryLocation":"eastus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/wilxgroup/providers/Microsoft.Storage/storageAccounts/wilxgroupdiag169","name":"wilxgroupdiag169","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-03-29T22:34:01.9561177Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-03-29T22:34:01.9561177Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-03-29T22:34:01.8935895Z","primaryEndpoints":{"blob":"https://wilxgroupdiag169.blob.core.windows.net/","queue":"https://wilxgroupdiag169.queue.core.windows.net/","table":"https://wilxgroupdiag169.table.core.windows.net/","file":"https://wilxgroupdiag169.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rgg4iadnthjykpxrgud5gxju5rfqzthb6uvqfcm3t7cztqm5v2yyjbfuusommo4mtpv/providers/Microsoft.Storage/storageAccounts/clitestr7jsatxwbv2sefsvr","name":"clitestr7jsatxwbv2sefsvr","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:45:28.2151132Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:45:28.2151132Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:45:28.1369842Z","primaryEndpoints":{"blob":"https://clitestr7jsatxwbv2sefsvr.blob.core.windows.net/","queue":"https://clitestr7jsatxwbv2sefsvr.queue.core.windows.net/","table":"https://clitestr7jsatxwbv2sefsvr.table.core.windows.net/","file":"https://clitestr7jsatxwbv2sefsvr.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Premium_LRS","tier":"Premium"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/wilxgroup/providers/Microsoft.Storage/storageAccounts/wilxgroupdisks899","name":"wilxgroupdisks899","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-04-11T23:26:25.3653337Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-04-11T23:26:25.3653337Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-04-11T23:26:25.2872072Z","primaryEndpoints":{"blob":"https://wilxgroupdisks899.blob.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg6sqzt5phdo5viklk7dquteui74rn3vn2tioolq5dsdnz2znxn6fdwaa47uyu2i4eg/providers/Microsoft.Storage/storageAccounts/clitestgjx5vdkyf74377ieg","name":"clitestgjx5vdkyf74377ieg","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.1366608Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.1366608Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-11-26T06:09:48.4001597Z","primaryEndpoints":{"blob":"https://clitestgjx5vdkyf74377ieg.blob.core.windows.net/","queue":"https://clitestgjx5vdkyf74377ieg.queue.core.windows.net/","table":"https://clitestgjx5vdkyf74377ieg.table.core.windows.net/","file":"https://clitestgjx5vdkyf74377ieg.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_RAGRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/wilxgroup/providers/Microsoft.Storage/storageAccounts/wilxstorage","name":"wilxstorage","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-03-15T17:47:45.4399402Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-03-15T17:47:45.4399402Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-03-15T17:47:45.3930700Z","primaryEndpoints":{"blob":"https://wilxstorage.blob.core.windows.net/","queue":"https://wilxstorage.queue.core.windows.net/","table":"https://wilxstorage.table.core.windows.net/","file":"https://wilxstorage.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available","secondaryLocation":"eastus","statusOfSecondary":"available","secondaryEndpoints":{"blob":"https://wilxstorage-secondary.blob.core.windows.net/","queue":"https://wilxstorage-secondary.queue.core.windows.net/","table":"https://wilxstorage-secondary.table.core.windows.net/"}}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zitest/providers/Microsoft.Storage/storageAccounts/foostore12978","name":"foostore12978","type":"Microsoft.Storage/storageAccounts","location":"westeurope","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-03-22T22:18:07.1937355Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-03-22T22:18:07.1937355Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2016-04-29T06:55:06.4412159Z","primaryEndpoints":{"blob":"https://foostore12978.blob.core.windows.net/","queue":"https://foostore12978.queue.core.windows.net/","table":"https://foostore12978.table.core.windows.net/","file":"https://foostore12978.file.core.windows.net/"},"primaryLocation":"westeurope","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"BlobStorage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/t-chwong/providers/Microsoft.Storage/storageAccounts/tchwong","name":"tchwong","type":"Microsoft.Storage/storageAccounts","location":"southcentralus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-03-01T18:07:07.4006066Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-03-01T18:07:07.4006066Z"}},"keySource":"Microsoft.Storage"},"accessTier":"Hot","provisioningState":"Succeeded","creationTime":"2018-03-01T18:07:07.3381076Z","primaryEndpoints":{"blob":"https://tchwong.blob.core.windows.net/","table":"https://tchwong.table.core.windows.net/"},"primaryLocation":"southcentralus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitestlab1/providers/Microsoft.Storage/storageAccounts/acliautomationlab8902","name":"acliautomationlab8902","type":"Microsoft.Storage/storageAccounts","location":"southcentralus","tags":{"hidden-DevTestLabs-LabUId":"ca9ec547-32c5-422d-b3d2-25906ed71959"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-04-19T16:51:47.2662871Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-04-19T16:51:47.2662871Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-04-19T16:51:47.2194106Z","primaryEndpoints":{"blob":"https://acliautomationlab8902.blob.core.windows.net/","queue":"https://acliautomationlab8902.queue.core.windows.net/","table":"https://acliautomationlab8902.table.core.windows.net/","file":"https://acliautomationlab8902.file.core.windows.net/"},"primaryLocation":"southcentralus","statusOfPrimary":"available"}},{"identity":{"principalId":"ebc8557b-5159-4db6-8b04-699759875130","tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","type":"SystemAssigned"},"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rgls6pde2luhubksnkjxebnrqthsdi6dcfpxcrhlmgnvdkkimk6b2usub6ehq3ocrsm/providers/Microsoft.Storage/storageAccounts/clitesttrevle6ezqkjtfdl3","name":"clitesttrevle6ezqkjtfdl3","type":"Microsoft.Storage/storageAccounts","location":"southcentralus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-03-14T22:32:56.5552622Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-03-14T22:32:56.5552622Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-03-14T22:32:56.5084099Z","primaryEndpoints":{"blob":"https://clitesttrevle6ezqkjtfdl3.blob.core.windows.net/","queue":"https://clitesttrevle6ezqkjtfdl3.queue.core.windows.net/","table":"https://clitesttrevle6ezqkjtfdl3.table.core.windows.net/","file":"https://clitesttrevle6ezqkjtfdl3.file.core.windows.net/"},"primaryLocation":"southcentralus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/lmazuel-testfunction-msi/providers/Microsoft.Storage/storageAccounts/lmazueltestfuncbbd8","name":"lmazueltestfuncbbd8","type":"Microsoft.Storage/storageAccounts","location":"southcentralus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:58.1691771Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:58.1691771Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-10-11T19:03:26.3781645Z","primaryEndpoints":{"blob":"https://lmazueltestfuncbbd8.blob.core.windows.net/","queue":"https://lmazueltestfuncbbd8.queue.core.windows.net/","table":"https://lmazueltestfuncbbd8.table.core.windows.net/","file":"https://lmazueltestfuncbbd8.file.core.windows.net/"},"primaryLocation":"southcentralus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cloud-shell-storage-southcentralus/providers/Microsoft.Storage/storageAccounts/cs700977cdb163fx435fx9c3","name":"cs700977cdb163fx435fx9c3","type":"Microsoft.Storage/storageAccounts","location":"southcentralus","tags":{"ms-resource-usage":"azure-cloud-shell"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:58.1691771Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:58.1691771Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-08-09T21:59:02.7061936Z","primaryEndpoints":{"blob":"https://cs700977cdb163fx435fx9c3.blob.core.windows.net/","queue":"https://cs700977cdb163fx435fx9c3.queue.core.windows.net/","table":"https://cs700977cdb163fx435fx9c3.table.core.windows.net/","file":"https://cs700977cdb163fx435fx9c3.file.core.windows.net/"},"primaryLocation":"southcentralus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/t-chwong/providers/Microsoft.Storage/storageAccounts/tchwongdiag300","name":"tchwongdiag300","type":"Microsoft.Storage/storageAccounts","location":"southcentralus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-04-20T18:15:54.9483325Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-04-20T18:15:54.9483325Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-04-20T18:15:54.8858351Z","primaryEndpoints":{"blob":"https://tchwongdiag300.blob.core.windows.net/","queue":"https://tchwongdiag300.queue.core.windows.net/","table":"https://tchwongdiag300.table.core.windows.net/","file":"https://tchwongdiag300.file.core.windows.net/"},"primaryLocation":"southcentralus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/azurefunctions-southcentralus/providers/Microsoft.Storage/storageAccounts/azurefunctions2e2e624d","name":"azurefunctions2e2e624d","type":"Microsoft.Storage/storageAccounts","location":"southcentralus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:58.1535349Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:58.1535349Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-09-22T21:04:32.5702152Z","primaryEndpoints":{"blob":"https://azurefunctions2e2e624d.blob.core.windows.net/","queue":"https://azurefunctions2e2e624d.queue.core.windows.net/","table":"https://azurefunctions2e2e624d.table.core.windows.net/","file":"https://azurefunctions2e2e624d.file.core.windows.net/"},"primaryLocation":"southcentralus","statusOfPrimary":"available","secondaryLocation":"northcentralus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"StorageV2","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/wilxgroup2/providers/Microsoft.Storage/storageAccounts/wilxstorage0","name":"wilxstorage0","type":"Microsoft.Storage/storageAccounts","location":"westus2","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-04-13T01:05:28.4648959Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-04-13T01:05:28.4648959Z"}},"keySource":"Microsoft.Storage"},"accessTier":"Hot","provisioningState":"Succeeded","creationTime":"2018-04-13T01:05:28.4023820Z","primaryEndpoints":{"blob":"https://wilxstorage0.blob.core.windows.net/","queue":"https://wilxstorage0.queue.core.windows.net/","table":"https://wilxstorage0.table.core.windows.net/","file":"https://wilxstorage0.file.core.windows.net/"},"primaryLocation":"westus2","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rgmr6jo34yofyafj3n6gjbhrgmrd6pwgguthc2u235qfle6y6ztyzrlkuqn544s7cop/providers/Microsoft.Storage/storageAccounts/clitestnlmd52jlcmr4ce7b4","name":"clitestnlmd52jlcmr4ce7b4","type":"Microsoft.Storage/storageAccounts","location":"eastus2euap","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-04-19T20:14:07.3500611Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-04-19T20:14:07.3500611Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-04-19T20:14:07.3188286Z","primaryEndpoints":{"blob":"https://clitestnlmd52jlcmr4ce7b4.blob.core.windows.net/","queue":"https://clitestnlmd52jlcmr4ce7b4.queue.core.windows.net/","table":"https://clitestnlmd52jlcmr4ce7b4.table.core.windows.net/","file":"https://clitestnlmd52jlcmr4ce7b4.file.core.windows.net/"},"primaryLocation":"eastus2euap","statusOfPrimary":"available"}},{"sku":{"name":"Standard_RAGRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/wilxgroup3/providers/Microsoft.Storage/storageAccounts/wilxstorageworm","name":"wilxstorageworm","type":"Microsoft.Storage/storageAccounts","location":"eastus2euap","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-04-13T22:36:53.1534839Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-04-13T22:36:53.1534839Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-04-13T22:36:53.0909769Z","primaryEndpoints":{"blob":"https://wilxstorageworm.blob.core.windows.net/","queue":"https://wilxstorageworm.queue.core.windows.net/","table":"https://wilxstorageworm.table.core.windows.net/","file":"https://wilxstorageworm.file.core.windows.net/"},"primaryLocation":"eastus2euap","statusOfPrimary":"available","secondaryLocation":"centraluseuap","statusOfSecondary":"available","secondaryEndpoints":{"blob":"https://wilxstorageworm-secondary.blob.core.windows.net/","queue":"https://wilxstorageworm-secondary.queue.core.windows.net/","table":"https://wilxstorageworm-secondary.table.core.windows.net/"}}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg326oxnqqn33y3n42vz6x5xol5rvvw3z4o6tladwwtkmcntnsxhhxxtddtrxwm2edj/providers/Microsoft.Storage/storageAccounts/clitestjwzkdsfuou3niutbd","name":"clitestjwzkdsfuou3niutbd","type":"Microsoft.Storage/storageAccounts","location":"eastus2euap","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-04-19T20:07:33.1021018Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-04-19T20:07:33.1021018Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-04-19T20:07:33.0552270Z","primaryEndpoints":{"blob":"https://clitestjwzkdsfuou3niutbd.blob.core.windows.net/","queue":"https://clitestjwzkdsfuou3niutbd.queue.core.windows.net/","table":"https://clitestjwzkdsfuou3niutbd.table.core.windows.net/","file":"https://clitestjwzkdsfuou3niutbd.file.core.windows.net/"},"primaryLocation":"eastus2euap","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rgldagdmcl4pklmwzmr3wftx2kidhw7johz6d7tl6m7raetzzfhpqhrfffu5vwqtfxo/providers/Microsoft.Storage/storageAccounts/clitestt6pqb7xneswrh2sp6","name":"clitestt6pqb7xneswrh2sp6","type":"Microsoft.Storage/storageAccounts","location":"eastus2euap","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-04-19T17:51:14.8730435Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-04-19T17:51:14.8730435Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-04-19T17:51:14.8105336Z","primaryEndpoints":{"blob":"https://clitestt6pqb7xneswrh2sp6.blob.core.windows.net/","queue":"https://clitestt6pqb7xneswrh2sp6.queue.core.windows.net/","table":"https://clitestt6pqb7xneswrh2sp6.table.core.windows.net/","file":"https://clitestt6pqb7xneswrh2sp6.file.core.windows.net/"},"primaryLocation":"eastus2euap","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rgf3er5m4irbxsxhyil42jxq3t5ehzphmdzn2gortdlrzyw4i6tlgswx2xrcgldp6oh/providers/Microsoft.Storage/storageAccounts/clitestpabilv4yd6qxvguml","name":"clitestpabilv4yd6qxvguml","type":"Microsoft.Storage/storageAccounts","location":"eastus2euap","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-04-19T19:20:22.2758006Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-04-19T19:20:22.2758006Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-04-19T19:20:22.2445526Z","primaryEndpoints":{"blob":"https://clitestpabilv4yd6qxvguml.blob.core.windows.net/","queue":"https://clitestpabilv4yd6qxvguml.queue.core.windows.net/","table":"https://clitestpabilv4yd6qxvguml.table.core.windows.net/","file":"https://clitestpabilv4yd6qxvguml.file.core.windows.net/"},"primaryLocation":"eastus2euap","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rgwxiadyatfxsixayqfinia7ybjwo5cfoyw65qpuna3alx3x2diwukx4tkcpwir2mbq/providers/Microsoft.Storage/storageAccounts/clitesta2lvllqz23rgasyf7","name":"clitesta2lvllqz23rgasyf7","type":"Microsoft.Storage/storageAccounts","location":"eastus2euap","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-04-19T17:57:25.6818153Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-04-19T17:57:25.6818153Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-04-19T17:57:25.6193002Z","primaryEndpoints":{"blob":"https://clitesta2lvllqz23rgasyf7.blob.core.windows.net/","queue":"https://clitesta2lvllqz23rgasyf7.queue.core.windows.net/","table":"https://clitesta2lvllqz23rgasyf7.table.core.windows.net/","file":"https://clitesta2lvllqz23rgasyf7.file.core.windows.net/"},"primaryLocation":"eastus2euap","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rgoo2qxqtbb56w7uujqzhodrozdh7fxg5wxscql4ndybxkardgqzqvheltadic2zoxf/providers/Microsoft.Storage/storageAccounts/clitestfyixx74gs3loj3isf","name":"clitestfyixx74gs3loj3isf","type":"Microsoft.Storage/storageAccounts","location":"eastus2euap","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-04-19T20:34:26.6293927Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-04-19T20:34:26.6293927Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-04-19T20:34:26.5668681Z","primaryEndpoints":{"blob":"https://clitestfyixx74gs3loj3isf.blob.core.windows.net/","queue":"https://clitestfyixx74gs3loj3isf.queue.core.windows.net/","table":"https://clitestfyixx74gs3loj3isf.table.core.windows.net/","file":"https://clitestfyixx74gs3loj3isf.file.core.windows.net/"},"primaryLocation":"eastus2euap","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rgd5ygu6mbq43qw57ncgznekmhwaqlrowjc6dggyk2h6cfwioigvtt3bg7ayqckcwvk/providers/Microsoft.Storage/storageAccounts/clitestixsogcl5p5af5w2p3","name":"clitestixsogcl5p5af5w2p3","type":"Microsoft.Storage/storageAccounts","location":"eastus2euap","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-04-19T18:00:02.2397791Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-04-19T18:00:02.2397791Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-04-19T18:00:02.2087326Z","primaryEndpoints":{"blob":"https://clitestixsogcl5p5af5w2p3.blob.core.windows.net/","queue":"https://clitestixsogcl5p5af5w2p3.queue.core.windows.net/","table":"https://clitestixsogcl5p5af5w2p3.table.core.windows.net/","file":"https://clitestixsogcl5p5af5w2p3.file.core.windows.net/"},"primaryLocation":"eastus2euap","statusOfPrimary":"available"}},{"sku":{"name":"Standard_RAGRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/wilxgroup3/providers/Microsoft.Storage/storageAccounts/wilxstorageblah","name":"wilxstorageblah","type":"Microsoft.Storage/storageAccounts","location":"eastus2euap","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-04-17T20:06:51.4259719Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-04-17T20:06:51.4259719Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-04-17T20:06:51.3790974Z","primaryEndpoints":{"blob":"https://wilxstorageblah.blob.core.windows.net/","queue":"https://wilxstorageblah.queue.core.windows.net/","table":"https://wilxstorageblah.table.core.windows.net/","file":"https://wilxstorageblah.file.core.windows.net/"},"primaryLocation":"eastus2euap","statusOfPrimary":"available","secondaryLocation":"centraluseuap","statusOfSecondary":"available","secondaryEndpoints":{"blob":"https://wilxstorageblah-secondary.blob.core.windows.net/","queue":"https://wilxstorageblah-secondary.queue.core.windows.net/","table":"https://wilxstorageblah-secondary.table.core.windows.net/"}}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rgeyg7p46zydk24opv23uowejjybhvp2nqcyqpnmknbs7o3w5c3tocuuygkogbvxz5f/providers/Microsoft.Storage/storageAccounts/clitestcrdofae6jvibomf2w","name":"clitestcrdofae6jvibomf2w","type":"Microsoft.Storage/storageAccounts","location":"eastus2euap","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-04-20T01:19:55.8214506Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-04-20T01:19:55.8214506Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-04-20T01:19:55.7120798Z","primaryEndpoints":{"blob":"https://clitestcrdofae6jvibomf2w.blob.core.windows.net/","queue":"https://clitestcrdofae6jvibomf2w.queue.core.windows.net/","table":"https://clitestcrdofae6jvibomf2w.table.core.windows.net/","file":"https://clitestcrdofae6jvibomf2w.file.core.windows.net/"},"primaryLocation":"eastus2euap","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rgeblmtd6pv6car44ga6qwvicwjyuxydhhkaharam4nad6uekgqgm2uiisw7v4a3czx/providers/Microsoft.Storage/storageAccounts/clitestcdx4bwlcvgviotc2p","name":"clitestcdx4bwlcvgviotc2p","type":"Microsoft.Storage/storageAccounts","location":"eastus2euap","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-04-19T22:26:49.0369320Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-04-19T22:26:49.0369320Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-04-19T22:26:48.9744081Z","primaryEndpoints":{"blob":"https://clitestcdx4bwlcvgviotc2p.blob.core.windows.net/","queue":"https://clitestcdx4bwlcvgviotc2p.queue.core.windows.net/","table":"https://clitestcdx4bwlcvgviotc2p.table.core.windows.net/","file":"https://clitestcdx4bwlcvgviotc2p.file.core.windows.net/"},"primaryLocation":"eastus2euap","statusOfPrimary":"available"}}]}'} headers: cache-control: [no-cache] - content-length: ['112844'] + content-length: ['97462'] content-type: [application/json; charset=utf-8] - date: ['Thu, 08 Feb 2018 21:34:42 GMT'] + date: ['Tue, 01 May 2018 21:45:46 GMT'] expires: ['-1'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] vary: [Accept-Encoding] - x-ms-original-request-ids: [c85fabf5-0de5-42a8-a247-53b4577cbdf8, 677dd49b-5673-419e-bd9f-f9561d778358, - 0653d2e6-0f7d-4288-be2e-61326548386d, 110703bf-8681-4bd3-a54d-56ade7539107, - 37aca02e-507c-4085-89e9-faba778c1ce6] + x-content-type-options: [nosniff] + x-ms-original-request-ids: [400f9403-e5f6-4d40-b54d-a8aae7192afa, 8bac4d5c-7584-4404-84a4-778348381883, + 4d3468d9-85e4-4ffd-a61e-19dfb6034ce0, d2a889bb-f2b1-41bc-ad2f-4387bfb944e3, + 30157c0f-ad4b-4c0d-b00f-fe99e47d72dc, bfc07f5d-948d-4185-9b87-08514087ae0e, + c8991b8b-d539-4c43-a527-dba2be4efb47] status: {code: 200, message: OK} - request: body: null @@ -152,17 +159,17 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: POST uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002/listKeys?api-version=2017-10-01 response: - body: {string: '{"keys":[{"keyName":"key1","value":"J5jUEDgfRpsBRD+1YMqix8HkQTeQYw3cNMCovEFGuVu5wjlKg18YgmyE7tgz+6xWbi7CHfu8xeaukkBWNKLEDg==","permissions":"FULL"},{"keyName":"key2","value":"KmnoycxJZ2GyAcmyDuqCtNX4L6fvt/ZibesD3WBz+rOmAXkPJ4HqQJ+d8K485TFTHSKCoJ/vAWRO3xJTzcuoFQ==","permissions":"FULL"}]}'} + body: {string: '{"keys":[{"keyName":"key1","value":"94uEIpJdQoFGvUpLq172W0WoJBW3KeymBQWjNIBcr123RxLVfRRVSCUUonj7bzAKTUI/gxPz4pB63bh6nuFp2w==","permissions":"FULL"},{"keyName":"key2","value":"K2uoQjVDL7nTil9ce1C8lxWta/FPE/5gqD/CL40AkFzidAFKmgam6IwToKaMYrXfEVywTfRKAwUflstPQEjwyQ==","permissions":"FULL"}]}'} headers: cache-control: [no-cache] content-length: ['288'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 21:34:42 GMT'] + date: ['Tue, 01 May 2018 21:45:46 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -170,7 +177,8 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] - x-ms-ratelimit-remaining-subscription-writes: ['1190'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1199'] status: {code: 200, message: OK} - request: body: null @@ -182,8 +190,8 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.27] + msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: DELETE uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2017-05-10 @@ -192,11 +200,12 @@ interactions: headers: cache-control: [no-cache] content-length: ['0'] - date: ['Thu, 08 Feb 2018 21:34:42 GMT'] + date: ['Tue, 01 May 2018 21:45:46 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTElURVNUOjJFUkdUMlNON0szWkpTVzdIWVFHMldSSTVHNUxKQ1RBQVBZVU5RWHw2RUI5RUM5OEM0RkM3RjUwLVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTElURVNUOjJFUkdWSFZLWkpZUUVDU1JGQ0pLMjRRQUJOR0RTNkwyUzdBR0lQUnxGQzNCREU0RDQyQ0MzMzg4LVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] + x-content-type-options: [nosniff] x-ms-ratelimit-remaining-subscription-writes: ['1199'] status: {code: 202, message: Accepted} version: 1 diff --git a/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_create_storage_account.yaml b/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_create_storage_account.yaml index d0dcffcf427..fc64e9493e6 100644 --- a/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_create_storage_account.yaml +++ b/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_create_storage_account.yaml @@ -1,30 +1,32 @@ interactions: - request: - body: '{"location": "westus", "tags": {"use": "az-test"}}' + body: '{"location": "westus", "tags": {"product": "azurecli", "cause": "automation", + "date": "2018-05-01T21:45:47Z"}}' headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] CommandName: [group create] Connection: [keep-alive] - Content-Length: ['50'] + Content-Length: ['110'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.27] + msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2017-05-10 response: - body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"westus","tags":{"use":"az-test"},"properties":{"provisioningState":"Succeeded"}}'} + body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"westus","tags":{"product":"azurecli","cause":"automation","date":"2018-05-01T21:45:47Z"},"properties":{"provisioningState":"Succeeded"}}'} headers: cache-control: [no-cache] - content-length: ['328'] + content-length: ['384'] content-type: [application/json; charset=utf-8] - date: ['Thu, 08 Feb 2018 18:09:59 GMT'] + date: ['Tue, 01 May 2018 21:45:48 GMT'] expires: ['-1'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1183'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1199'] status: {code: 201, message: Created} - request: body: '{"sku": {"name": "Standard_LRS"}, "kind": "Storage", "location": "westus", @@ -37,7 +39,7 @@ interactions: Content-Length: ['125'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/cli000002?api-version=2017-10-01 @@ -47,14 +49,15 @@ interactions: cache-control: [no-cache] content-length: ['0'] content-type: [text/plain; charset=utf-8] - date: ['Thu, 08 Feb 2018 18:10:00 GMT'] + date: ['Tue, 01 May 2018 21:45:49 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/0e3526e2-17c0-4402-9dd6-30eab4048d67?monitor=true&api-version=2017-10-01'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/581bfbcc-2d7d-4095-89c4-5d546894db13?monitor=true&api-version=2017-10-01'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 Microsoft-HTTPAPI/2.0'] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1188'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1199'] status: {code: 202, message: Accepted} - request: body: null @@ -65,44 +68,17 @@ interactions: Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/0e3526e2-17c0-4402-9dd6-30eab4048d67?monitor=true&api-version=2017-10-01 + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/581bfbcc-2d7d-4095-89c4-5d546894db13?monitor=true&api-version=2017-10-01 response: - body: {string: ''} - headers: - cache-control: [no-cache] - content-length: ['0'] - content-type: [text/plain; charset=utf-8] - date: ['Thu, 08 Feb 2018 18:10:17 GMT'] - expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/0e3526e2-17c0-4402-9dd6-30eab4048d67?monitor=true&api-version=2017-10-01'] - pragma: [no-cache] - server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 - Microsoft-HTTPAPI/2.0'] - strict-transport-security: [max-age=31536000; includeSubDomains] - status: {code: 202, message: Accepted} -- request: - body: null - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [storage account create] - Connection: [keep-alive] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] - accept-language: [en-US] - method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/0e3526e2-17c0-4402-9dd6-30eab4048d67?monitor=true&api-version=2017-10-01 - response: - body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/cli000002","name":"cli000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T18:10:00.9372089Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T18:10:00.9372089Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T18:10:00.8903104Z","primaryEndpoints":{"blob":"https://cli000002.blob.core.windows.net/","queue":"https://cli000002.queue.core.windows.net/","table":"https://cli000002.table.core.windows.net/","file":"https://cli000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} + body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/cli000002","name":"cli000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:45:50.0435368Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:45:50.0435368Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:45:49.5279899Z","primaryEndpoints":{"blob":"https://cli000002.blob.core.windows.net/","queue":"https://cli000002.queue.core.windows.net/","table":"https://cli000002.table.core.windows.net/","file":"https://cli000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} headers: cache-control: [no-cache] content-length: ['1231'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 18:10:35 GMT'] + date: ['Tue, 01 May 2018 21:46:06 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -110,6 +86,7 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] + x-content-type-options: [nosniff] status: {code: 200, message: OK} - request: body: 'b''{"name": "cli000002", "type": "Microsoft.Storage/storageAccounts"}''' @@ -121,25 +98,26 @@ interactions: Content-Length: ['81'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: POST uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/checkNameAvailability?api-version=2017-10-01 response: - body: {string: '{"message":"The storage account named cli000002 is already taken.","nameAvailable":false,"reason":"AlreadyExists"} - - '} + body: {string: '{"nameAvailable":false,"reason":"AlreadyExists","message":"The + storage account named cli000002 is already taken."}'} headers: cache-control: [no-cache] - content-length: ['130'] + content-length: ['129'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 18:10:37 GMT'] + date: ['Tue, 01 May 2018 21:46:08 GMT'] expires: ['-1'] pragma: [no-cache] - server: [Microsoft-Azure-Storage-Resource-Provider/1.0, Microsoft-HTTPAPI/2.0] + server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 + Microsoft-HTTPAPI/2.0'] strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] + x-content-type-options: [nosniff] status: {code: 200, message: OK} - request: body: null @@ -150,17 +128,17 @@ interactions: Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts?api-version=2017-10-01 response: - body: {string: '{"value":[{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/cli000002","name":"cli000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T18:10:00.9372089Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T18:10:00.9372089Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T18:10:00.8903104Z","primaryEndpoints":{"blob":"https://cli000002.blob.core.windows.net/","queue":"https://cli000002.queue.core.windows.net/","table":"https://cli000002.table.core.windows.net/","file":"https://cli000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}]}'} + body: {string: '{"value":[{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/cli000002","name":"cli000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:45:50.0435368Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:45:50.0435368Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:45:49.5279899Z","primaryEndpoints":{"blob":"https://cli000002.blob.core.windows.net/","queue":"https://cli000002.queue.core.windows.net/","table":"https://cli000002.table.core.windows.net/","file":"https://cli000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}]}'} headers: cache-control: [no-cache] content-length: ['1243'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 18:10:37 GMT'] + date: ['Tue, 01 May 2018 21:46:08 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -168,6 +146,7 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] + x-content-type-options: [nosniff] status: {code: 200, message: OK} - request: body: null @@ -178,17 +157,17 @@ interactions: Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/cli000002?api-version=2017-10-01 response: - body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/cli000002","name":"cli000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T18:10:00.9372089Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T18:10:00.9372089Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T18:10:00.8903104Z","primaryEndpoints":{"blob":"https://cli000002.blob.core.windows.net/","queue":"https://cli000002.queue.core.windows.net/","table":"https://cli000002.table.core.windows.net/","file":"https://cli000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} + body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/cli000002","name":"cli000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:45:50.0435368Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:45:50.0435368Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:45:49.5279899Z","primaryEndpoints":{"blob":"https://cli000002.blob.core.windows.net/","queue":"https://cli000002.queue.core.windows.net/","table":"https://cli000002.table.core.windows.net/","file":"https://cli000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} headers: cache-control: [no-cache] content-length: ['1231'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 18:10:38 GMT'] + date: ['Tue, 01 May 2018 21:46:09 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -196,6 +175,7 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] + x-content-type-options: [nosniff] status: {code: 200, message: OK} - request: body: null @@ -207,17 +187,17 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: POST uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/cli000002/listKeys?api-version=2017-10-01 response: - body: {string: '{"keys":[{"keyName":"key1","value":"ruaUMgyUOuxqdbOBlD7DS5qLiONImENw2MsjpGt3c3Rs0EEBxJl8J6xZfiORH40iUV9NVv7xtpOZNgVE9Geggg==","permissions":"FULL"},{"keyName":"key2","value":"8AhVR0hl97YRYDDs1V38HVAIbCb1PVdyT6cZAR0k1ZCzFq26qeUe4Cp9eZNJMyTxzrPUqafhizIjXWKyvC+UCQ==","permissions":"FULL"}]}'} + body: {string: '{"keys":[{"keyName":"key1","value":"T71EfEyU6KGnY/hliBId6+qsi6a1ZDQCQh8bvoog/YurI/hmyXYNtzq594OdPK8WnobRNFfzWJCnLIdslt2/8A==","permissions":"FULL"},{"keyName":"key2","value":"Ko/+WC1OwMLOXzNX/zpSdM7UyRSkCoo2Id+sv66o4kDvUZutDMu313YlclEGg+dRdaEF7IXLDwB4V6HG7FrA8g==","permissions":"FULL"}]}'} headers: cache-control: [no-cache] content-length: ['288'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 18:10:38 GMT'] + date: ['Tue, 01 May 2018 21:46:10 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -225,7 +205,8 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] - x-ms-ratelimit-remaining-subscription-writes: ['1189'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1198'] status: {code: 200, message: OK} - request: body: null @@ -236,17 +217,17 @@ interactions: Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/cli000002?api-version=2017-10-01 response: - body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/cli000002","name":"cli000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T18:10:00.9372089Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T18:10:00.9372089Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T18:10:00.8903104Z","primaryEndpoints":{"blob":"https://cli000002.blob.core.windows.net/","queue":"https://cli000002.queue.core.windows.net/","table":"https://cli000002.table.core.windows.net/","file":"https://cli000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} + body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/cli000002","name":"cli000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:45:50.0435368Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:45:50.0435368Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:45:49.5279899Z","primaryEndpoints":{"blob":"https://cli000002.blob.core.windows.net/","queue":"https://cli000002.queue.core.windows.net/","table":"https://cli000002.table.core.windows.net/","file":"https://cli000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} headers: cache-control: [no-cache] content-length: ['1231'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 18:10:39 GMT'] + date: ['Tue, 01 May 2018 21:46:09 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -254,6 +235,7 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] + x-content-type-options: [nosniff] status: {code: 200, message: OK} - request: body: '{"sku": {"name": "Standard_LRS"}, "tags": {"foo": "bar", "cat": ""}, "properties": @@ -269,17 +251,17 @@ interactions: Content-Length: ['349'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: PATCH uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/cli000002?api-version=2017-10-01 response: - body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/cli000002","name":"cli000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"foo":"bar","cat":""},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T18:10:00.9372089Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T18:10:00.9372089Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T18:10:00.8903104Z","primaryEndpoints":{"blob":"https://cli000002.blob.core.windows.net/","queue":"https://cli000002.queue.core.windows.net/","table":"https://cli000002.table.core.windows.net/","file":"https://cli000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} + body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/cli000002","name":"cli000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"foo":"bar","cat":""},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:45:50.0435368Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:45:50.0435368Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:45:49.5279899Z","primaryEndpoints":{"blob":"https://cli000002.blob.core.windows.net/","queue":"https://cli000002.queue.core.windows.net/","table":"https://cli000002.table.core.windows.net/","file":"https://cli000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} headers: cache-control: [no-cache] content-length: ['1251'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 18:10:39 GMT'] + date: ['Tue, 01 May 2018 21:46:10 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -287,7 +269,8 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] - x-ms-ratelimit-remaining-subscription-writes: ['1181'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1199'] status: {code: 200, message: OK} - request: body: null @@ -298,17 +281,17 @@ interactions: Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/cli000002?api-version=2017-10-01 response: - body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/cli000002","name":"cli000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"foo":"bar","cat":""},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T18:10:00.9372089Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T18:10:00.9372089Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T18:10:00.8903104Z","primaryEndpoints":{"blob":"https://cli000002.blob.core.windows.net/","queue":"https://cli000002.queue.core.windows.net/","table":"https://cli000002.table.core.windows.net/","file":"https://cli000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} + body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/cli000002","name":"cli000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"foo":"bar","cat":""},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:45:50.0435368Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:45:50.0435368Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:45:49.5279899Z","primaryEndpoints":{"blob":"https://cli000002.blob.core.windows.net/","queue":"https://cli000002.queue.core.windows.net/","table":"https://cli000002.table.core.windows.net/","file":"https://cli000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} headers: cache-control: [no-cache] content-length: ['1251'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 18:10:40 GMT'] + date: ['Tue, 01 May 2018 21:46:10 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -316,6 +299,7 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] + x-content-type-options: [nosniff] status: {code: 200, message: OK} - request: body: '{"sku": {"name": "Standard_GRS"}, "tags": {}, "properties": {"encryption": @@ -331,17 +315,17 @@ interactions: Content-Length: ['326'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: PATCH uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/cli000002?api-version=2017-10-01 response: - body: {string: '{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/cli000002","name":"cli000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T18:10:00.9372089Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T18:10:00.9372089Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T18:10:00.8903104Z","primaryEndpoints":{"blob":"https://cli000002.blob.core.windows.net/","queue":"https://cli000002.queue.core.windows.net/","table":"https://cli000002.table.core.windows.net/","file":"https://cli000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} + body: {string: '{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/cli000002","name":"cli000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:45:50.0435368Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:45:50.0435368Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:45:49.5279899Z","primaryEndpoints":{"blob":"https://cli000002.blob.core.windows.net/","queue":"https://cli000002.queue.core.windows.net/","table":"https://cli000002.table.core.windows.net/","file":"https://cli000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} headers: cache-control: [no-cache] content-length: ['1231'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 18:10:41 GMT'] + date: ['Tue, 01 May 2018 21:46:11 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -349,7 +333,8 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] - x-ms-ratelimit-remaining-subscription-writes: ['1195'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1197'] status: {code: 200, message: OK} - request: body: null @@ -360,17 +345,17 @@ interactions: Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/cli000002?api-version=2017-10-01 response: - body: {string: '{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/cli000002","name":"cli000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T18:10:00.9372089Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T18:10:00.9372089Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T18:10:00.8903104Z","primaryEndpoints":{"blob":"https://cli000002.blob.core.windows.net/","queue":"https://cli000002.queue.core.windows.net/","table":"https://cli000002.table.core.windows.net/","file":"https://cli000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} + body: {string: '{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/cli000002","name":"cli000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:45:50.0435368Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:45:50.0435368Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:45:49.5279899Z","primaryEndpoints":{"blob":"https://cli000002.blob.core.windows.net/","queue":"https://cli000002.queue.core.windows.net/","table":"https://cli000002.table.core.windows.net/","file":"https://cli000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} headers: cache-control: [no-cache] content-length: ['1231'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 18:10:41 GMT'] + date: ['Tue, 01 May 2018 21:46:12 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -378,6 +363,7 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] + x-content-type-options: [nosniff] status: {code: 200, message: OK} - request: body: '{"sku": {"name": "Standard_GRS"}, "tags": {"test": "success"}, "properties": @@ -393,17 +379,17 @@ interactions: Content-Length: ['343'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: PATCH uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/cli000002?api-version=2017-10-01 response: - body: {string: '{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/cli000002","name":"cli000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"test":"success"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T18:10:00.9372089Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T18:10:00.9372089Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T18:10:00.8903104Z","primaryEndpoints":{"blob":"https://cli000002.blob.core.windows.net/","queue":"https://cli000002.queue.core.windows.net/","table":"https://cli000002.table.core.windows.net/","file":"https://cli000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} + body: {string: '{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/cli000002","name":"cli000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"test":"success"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:45:50.0435368Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:45:50.0435368Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:45:49.5279899Z","primaryEndpoints":{"blob":"https://cli000002.blob.core.windows.net/","queue":"https://cli000002.queue.core.windows.net/","table":"https://cli000002.table.core.windows.net/","file":"https://cli000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} headers: cache-control: [no-cache] content-length: ['1247'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 18:10:42 GMT'] + date: ['Tue, 01 May 2018 21:46:13 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -411,7 +397,8 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] - x-ms-ratelimit-remaining-subscription-writes: ['1187'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1198'] status: {code: 200, message: OK} - request: body: null @@ -423,7 +410,7 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: DELETE uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/cli000002?api-version=2017-10-01 @@ -433,13 +420,14 @@ interactions: cache-control: [no-cache] content-length: ['0'] content-type: [text/plain; charset=utf-8] - date: ['Thu, 08 Feb 2018 18:10:44 GMT'] + date: ['Tue, 01 May 2018 21:46:14 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 Microsoft-HTTPAPI/2.0'] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1188'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1198'] status: {code: 200, message: OK} - request: body: 'b''{"name": "cli000002", "type": "Microsoft.Storage/storageAccounts"}''' @@ -451,25 +439,25 @@ interactions: Content-Length: ['81'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: POST uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/checkNameAvailability?api-version=2017-10-01 response: - body: {string: '{"nameAvailable":true} - - '} + body: {string: '{"nameAvailable":true}'} headers: cache-control: [no-cache] - content-length: ['23'] + content-length: ['22'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 18:10:44 GMT'] + date: ['Tue, 01 May 2018 21:46:15 GMT'] expires: ['-1'] pragma: [no-cache] - server: [Microsoft-Azure-Storage-Resource-Provider/1.0, Microsoft-HTTPAPI/2.0] + server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 + Microsoft-HTTPAPI/2.0'] strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] + x-content-type-options: [nosniff] status: {code: 200, message: OK} - request: body: null @@ -481,8 +469,8 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.27] + msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: DELETE uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2017-05-10 @@ -491,11 +479,12 @@ interactions: headers: cache-control: [no-cache] content-length: ['0'] - date: ['Thu, 08 Feb 2018 18:10:46 GMT'] + date: ['Tue, 01 May 2018 21:46:16 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTElURVNUOjJFUkdZWVhUR05GMk9XRVA1VEg3RVdCQURLUDNKUEZTSUhKQVdGRnxDQTZCMDVEMjdCQ0Y2RDcwLVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTElURVNUOjJFUkdaVktMTFlUN05JVElCQTNQWFRXVlBIR1BUUkU0WVRXUzdTRnwxOTZCRjcxNTg0RTVDRjcyLVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1181'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1198'] status: {code: 202, message: Accepted} version: 1 diff --git a/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_create_storage_account_v2.yaml b/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_create_storage_account_v2.yaml index 5858821bd59..dd5fabbf40a 100644 --- a/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_create_storage_account_v2.yaml +++ b/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_create_storage_account_v2.yaml @@ -1,30 +1,32 @@ interactions: - request: - body: '{"location": "southcentralus", "tags": {"use": "az-test"}}' + body: '{"location": "southcentralus", "tags": {"product": "azurecli", "cause": + "automation", "date": "2018-05-01T21:46:16Z"}}' headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] CommandName: [group create] Connection: [keep-alive] - Content-Length: ['58'] + Content-Length: ['118'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.27] + msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2017-05-10 response: - body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"southcentralus","tags":{"use":"az-test"},"properties":{"provisioningState":"Succeeded"}}'} + body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"southcentralus","tags":{"product":"azurecli","cause":"automation","date":"2018-05-01T21:46:16Z"},"properties":{"provisioningState":"Succeeded"}}'} headers: cache-control: [no-cache] - content-length: ['336'] + content-length: ['392'] content-type: [application/json; charset=utf-8] - date: ['Thu, 08 Feb 2018 18:10:47 GMT'] + date: ['Tue, 01 May 2018 21:46:17 GMT'] expires: ['-1'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1189'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1198'] status: {code: 201, message: Created} - request: body: '{"sku": {"name": "Standard_RAGRS"}, "kind": "StorageV2", "location": "southcentralus", @@ -37,7 +39,7 @@ interactions: Content-Length: ['137'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/cli000002?api-version=2017-10-01 @@ -47,14 +49,15 @@ interactions: cache-control: [no-cache] content-length: ['0'] content-type: [text/plain; charset=utf-8] - date: ['Thu, 08 Feb 2018 18:10:48 GMT'] + date: ['Tue, 01 May 2018 21:46:18 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/southcentralus/asyncoperations/0967b4da-f47a-46a1-be3a-51abbd85432d?monitor=true&api-version=2017-10-01'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/southcentralus/asyncoperations/9008c892-6042-487c-9297-aa126dbdd3a3?monitor=true&api-version=2017-10-01'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 Microsoft-HTTPAPI/2.0'] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1191'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1194'] status: {code: 202, message: Accepted} - request: body: null @@ -65,17 +68,17 @@ interactions: Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/southcentralus/asyncoperations/0967b4da-f47a-46a1-be3a-51abbd85432d?monitor=true&api-version=2017-10-01 + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/southcentralus/asyncoperations/9008c892-6042-487c-9297-aa126dbdd3a3?monitor=true&api-version=2017-10-01 response: - body: {string: '{"sku":{"name":"Standard_RAGRS","tier":"Standard"},"kind":"StorageV2","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/cli000002","name":"cli000002","type":"Microsoft.Storage/storageAccounts","location":"southcentralus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T18:10:48.6603755Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T18:10:48.6603755Z"}},"keySource":"Microsoft.Storage"},"accessTier":"Hot","provisioningState":"Succeeded","creationTime":"2018-02-08T18:10:48.6134706Z","primaryEndpoints":{"blob":"https://cli000002.blob.core.windows.net/","queue":"https://cli000002.queue.core.windows.net/","table":"https://cli000002.table.core.windows.net/","file":"https://cli000002.file.core.windows.net/"},"primaryLocation":"southcentralus","statusOfPrimary":"available","secondaryLocation":"northcentralus","statusOfSecondary":"available","secondaryEndpoints":{"blob":"https://cli000002-secondary.blob.core.windows.net/","queue":"https://cli000002-secondary.queue.core.windows.net/","table":"https://cli000002-secondary.table.core.windows.net/"}}}'} + body: {string: '{"sku":{"name":"Standard_RAGRS","tier":"Standard"},"kind":"StorageV2","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/cli000002","name":"cli000002","type":"Microsoft.Storage/storageAccounts","location":"southcentralus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:46:18.9026126Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:46:18.9026126Z"}},"keySource":"Microsoft.Storage"},"accessTier":"Hot","provisioningState":"Succeeded","creationTime":"2018-05-01T21:46:18.8245022Z","primaryEndpoints":{"blob":"https://cli000002.blob.core.windows.net/","queue":"https://cli000002.queue.core.windows.net/","table":"https://cli000002.table.core.windows.net/","file":"https://cli000002.file.core.windows.net/"},"primaryLocation":"southcentralus","statusOfPrimary":"available","secondaryLocation":"northcentralus","statusOfSecondary":"available","secondaryEndpoints":{"blob":"https://cli000002-secondary.blob.core.windows.net/","queue":"https://cli000002-secondary.queue.core.windows.net/","table":"https://cli000002-secondary.table.core.windows.net/"}}}'} headers: cache-control: [no-cache] content-length: ['1591'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 18:11:06 GMT'] + date: ['Tue, 01 May 2018 21:46:36 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -83,6 +86,7 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] + x-content-type-options: [nosniff] status: {code: 200, message: OK} - request: body: 'b''{"name": "cli000002", "type": "Microsoft.Storage/storageAccounts"}''' @@ -94,25 +98,26 @@ interactions: Content-Length: ['81'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: POST uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/checkNameAvailability?api-version=2017-10-01 response: - body: {string: '{"message":"The storage account named cli000002 is already taken.","nameAvailable":false,"reason":"AlreadyExists"} - - '} + body: {string: '{"nameAvailable":false,"reason":"AlreadyExists","message":"The + storage account named cli000002 is already taken."}'} headers: cache-control: [no-cache] - content-length: ['130'] + content-length: ['129'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 18:11:07 GMT'] + date: ['Tue, 01 May 2018 21:46:37 GMT'] expires: ['-1'] pragma: [no-cache] - server: [Microsoft-Azure-Storage-Resource-Provider/1.0, Microsoft-HTTPAPI/2.0] + server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 + Microsoft-HTTPAPI/2.0'] strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] + x-content-type-options: [nosniff] status: {code: 200, message: OK} - request: body: null @@ -124,8 +129,8 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.27] + msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: DELETE uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2017-05-10 @@ -134,11 +139,12 @@ interactions: headers: cache-control: [no-cache] content-length: ['0'] - date: ['Thu, 08 Feb 2018 18:11:09 GMT'] + date: ['Tue, 01 May 2018 21:46:38 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTElURVNUOjJFUkdINE8zSkdDQ0dWTk1JRjI2TFdHT1VaSUdMNVpKSDQ3WkxJWHwwMDEyNkJCRjUzNkE2OUI4LVNPVVRIQ0VOVFJBTFVTIiwiam9iTG9jYXRpb24iOiJzb3V0aGNlbnRyYWx1cyJ9?api-version=2017-05-10'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTElURVNUOjJFUkc3Q0xRTzZXQkJQQTIyT1NYTktTNERETEtJR1M2R1YzSU9WRnw3OEUxRTNGRDYyNjhDNkUwLVNPVVRIQ0VOVFJBTFVTIiwiam9iTG9jYXRpb24iOiJzb3V0aGNlbnRyYWx1cyJ9?api-version=2017-05-10'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1188'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1199'] status: {code: 202, message: Accepted} version: 1 diff --git a/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_create_storage_account_with_assigned_identity.yaml b/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_create_storage_account_with_assigned_identity.yaml index 2cd734fa2f4..eb91655aaba 100644 --- a/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_create_storage_account_with_assigned_identity.yaml +++ b/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_create_storage_account_with_assigned_identity.yaml @@ -1,30 +1,32 @@ interactions: - request: - body: '{"location": "southcentralus", "tags": {"use": "az-test"}}' + body: '{"location": "southcentralus", "tags": {"product": "azurecli", "cause": + "automation", "date": "2018-05-01T21:46:38Z"}}' headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] CommandName: [group create] Connection: [keep-alive] - Content-Length: ['58'] + Content-Length: ['118'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.27] + msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2017-05-10 response: - body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"southcentralus","tags":{"use":"az-test"},"properties":{"provisioningState":"Succeeded"}}'} + body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"southcentralus","tags":{"product":"azurecli","cause":"automation","date":"2018-05-01T21:46:38Z"},"properties":{"provisioningState":"Succeeded"}}'} headers: cache-control: [no-cache] - content-length: ['336'] + content-length: ['392'] content-type: [application/json; charset=utf-8] - date: ['Thu, 08 Feb 2018 18:11:10 GMT'] + date: ['Tue, 01 May 2018 21:46:39 GMT'] expires: ['-1'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1188'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1199'] status: {code: 201, message: Created} - request: body: null @@ -35,22 +37,23 @@ interactions: Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.27] + msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2017-05-10 response: - body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"southcentralus","tags":{"use":"az-test"},"properties":{"provisioningState":"Succeeded"}}'} + body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"southcentralus","tags":{"product":"azurecli","cause":"automation","date":"2018-05-01T21:46:38Z"},"properties":{"provisioningState":"Succeeded"}}'} headers: cache-control: [no-cache] - content-length: ['336'] + content-length: ['392'] content-type: [application/json; charset=utf-8] - date: ['Thu, 08 Feb 2018 18:11:11 GMT'] + date: ['Tue, 01 May 2018 21:46:40 GMT'] expires: ['-1'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] vary: [Accept-Encoding] + x-content-type-options: [nosniff] status: {code: 200, message: OK} - request: body: '{"sku": {"name": "Standard_LRS"}, "kind": "Storage", "location": "southcentralus", @@ -64,7 +67,7 @@ interactions: Content-Length: ['173'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/cli000002?api-version=2017-10-01 @@ -74,14 +77,15 @@ interactions: cache-control: [no-cache] content-length: ['0'] content-type: [text/plain; charset=utf-8] - date: ['Thu, 08 Feb 2018 18:11:14 GMT'] + date: ['Tue, 01 May 2018 21:46:43 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/southcentralus/asyncoperations/0dd5ff8d-fcd9-4d81-aed4-64578003c0a3?monitor=true&api-version=2017-10-01'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/southcentralus/asyncoperations/db07f4d6-1aa9-4a35-9e9f-ec92d48bf5c6?monitor=true&api-version=2017-10-01'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 Microsoft-HTTPAPI/2.0'] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1186'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1197'] status: {code: 202, message: Accepted} - request: body: null @@ -92,17 +96,17 @@ interactions: Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/southcentralus/asyncoperations/0dd5ff8d-fcd9-4d81-aed4-64578003c0a3?monitor=true&api-version=2017-10-01 + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/southcentralus/asyncoperations/db07f4d6-1aa9-4a35-9e9f-ec92d48bf5c6?monitor=true&api-version=2017-10-01 response: - body: {string: '{"identity":{"principalId":"fc7b1ff3-153f-422c-be6e-10fd0dbb2b53","tenantId":"54826b22-38d6-4fb2-bad9-b7b93a3e9c5a","type":"SystemAssigned"},"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/cli000002","name":"cli000002","type":"Microsoft.Storage/storageAccounts","location":"southcentralus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T18:11:14.3377009Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T18:11:14.3377009Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T18:11:14.2908347Z","primaryEndpoints":{"blob":"https://cli000002.blob.core.windows.net/","queue":"https://cli000002.queue.core.windows.net/","table":"https://cli000002.table.core.windows.net/","file":"https://cli000002.file.core.windows.net/"},"primaryLocation":"southcentralus","statusOfPrimary":"available"}}'} + body: {string: '{"identity":{"principalId":"953ecdf7-a1a2-4571-a45e-276b341fd399","tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","type":"SystemAssigned"},"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/cli000002","name":"cli000002","type":"Microsoft.Storage/storageAccounts","location":"southcentralus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:46:43.4103371Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:46:43.4103371Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:46:43.3477952Z","primaryEndpoints":{"blob":"https://cli000002.blob.core.windows.net/","queue":"https://cli000002.queue.core.windows.net/","table":"https://cli000002.table.core.windows.net/","file":"https://cli000002.file.core.windows.net/"},"primaryLocation":"southcentralus","statusOfPrimary":"available"}}'} headers: cache-control: [no-cache] content-length: ['1387'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 18:11:32 GMT'] + date: ['Tue, 01 May 2018 21:47:01 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -110,6 +114,7 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] + x-content-type-options: [nosniff] status: {code: 200, message: OK} - request: body: null @@ -121,8 +126,8 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.27] + msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: DELETE uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2017-05-10 @@ -131,11 +136,12 @@ interactions: headers: cache-control: [no-cache] content-length: ['0'] - date: ['Thu, 08 Feb 2018 18:11:34 GMT'] + date: ['Tue, 01 May 2018 21:47:02 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTElURVNUOjJFUkdMRjRaWUlCSjY3NkNaN1VCRUZYTjZWSkpVSlRGN0VNUVpSM3w2RTkxNTE0MUQzMjFGRjU3LVNPVVRIQ0VOVFJBTFVTIiwiam9iTG9jYXRpb24iOiJzb3V0aGNlbnRyYWx1cyJ9?api-version=2017-05-10'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTElURVNUOjJFUkdaSlRLRDNBNEhZQkU3VlVCSlU3R0JVNVQzNkQzVFNVRTZDUnwxRjIxOURCNEZEODVDRUIyLVNPVVRIQ0VOVFJBTFVTIiwiam9iTG9jYXRpb24iOiJzb3V0aGNlbnRyYWx1cyJ9?api-version=2017-05-10'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1191'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1198'] status: {code: 202, message: Accepted} version: 1 diff --git a/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_customer_managed_key.yaml b/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_customer_managed_key.yaml index eb6113e1236..020aeea2207 100644 --- a/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_customer_managed_key.yaml +++ b/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_customer_managed_key.yaml @@ -1,31 +1,32 @@ interactions: - request: - body: '{"location": "southcentralus", "tags": {"use": "az-test"}}' + body: '{"location": "southcentralus", "tags": {"product": "azurecli", "cause": + "automation", "date": "2018-05-01T21:47:03Z"}}' headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] CommandName: [group create] Connection: [keep-alive] - Content-Length: ['58'] + Content-Length: ['118'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.4 (Darwin-17.4.0-x86_64-i386-64bit) requests/2.18.4 - msrest/0.4.25 msrest_azure/0.4.20 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.30] + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2017-05-10 response: - body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"southcentralus","tags":{"use":"az-test"},"properties":{"provisioningState":"Succeeded"}}'} + body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"southcentralus","tags":{"product":"azurecli","cause":"automation","date":"2018-05-01T21:47:03Z"},"properties":{"provisioningState":"Succeeded"}}'} headers: cache-control: [no-cache] - content-length: ['336'] + content-length: ['392'] content-type: [application/json; charset=utf-8] - date: ['Wed, 14 Mar 2018 22:45:14 GMT'] + date: ['Tue, 01 May 2018 21:47:04 GMT'] expires: ['-1'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-writes: ['1199'] + x-ms-ratelimit-remaining-subscription-writes: ['1198'] status: {code: 201, message: Created} - request: body: '{"sku": {"name": "Standard_LRS"}, "kind": "Storage", "location": "southcentralus", @@ -37,9 +38,8 @@ interactions: Connection: [keep-alive] Content-Length: ['133'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.4 (Darwin-17.4.0-x86_64-i386-64bit) requests/2.18.4 - msrest/0.4.25 msrest_azure/0.4.20 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python - AZURECLI/2.0.30] + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002?api-version=2017-10-01 @@ -49,9 +49,9 @@ interactions: cache-control: [no-cache] content-length: ['0'] content-type: [text/plain; charset=utf-8] - date: ['Wed, 14 Mar 2018 22:45:16 GMT'] + date: ['Tue, 01 May 2018 21:47:05 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/southcentralus/asyncoperations/475457db-2a94-478d-9557-cbf335778430?monitor=true&api-version=2017-10-01'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/southcentralus/asyncoperations/a9d3ebd1-4539-47e6-ae2c-ebd9ac8b7ed6?monitor=true&api-version=2017-10-01'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 Microsoft-HTTPAPI/2.0'] @@ -67,48 +67,18 @@ interactions: CommandName: [storage account create] Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.4 (Darwin-17.4.0-x86_64-i386-64bit) requests/2.18.4 - msrest/0.4.25 msrest_azure/0.4.20 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python - AZURECLI/2.0.30] + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/southcentralus/asyncoperations/475457db-2a94-478d-9557-cbf335778430?monitor=true&api-version=2017-10-01 + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/southcentralus/asyncoperations/a9d3ebd1-4539-47e6-ae2c-ebd9ac8b7ed6?monitor=true&api-version=2017-10-01 response: - body: {string: ''} - headers: - cache-control: [no-cache] - content-length: ['0'] - content-type: [text/plain; charset=utf-8] - date: ['Wed, 14 Mar 2018 22:45:34 GMT'] - expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/southcentralus/asyncoperations/475457db-2a94-478d-9557-cbf335778430?monitor=true&api-version=2017-10-01'] - pragma: [no-cache] - server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 - Microsoft-HTTPAPI/2.0'] - strict-transport-security: [max-age=31536000; includeSubDomains] - x-content-type-options: [nosniff] - status: {code: 202, message: Accepted} -- request: - body: null - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [storage account create] - Connection: [keep-alive] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.4 (Darwin-17.4.0-x86_64-i386-64bit) requests/2.18.4 - msrest/0.4.25 msrest_azure/0.4.20 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python - AZURECLI/2.0.30] - accept-language: [en-US] - method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/southcentralus/asyncoperations/475457db-2a94-478d-9557-cbf335778430?monitor=true&api-version=2017-10-01 - response: - body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"southcentralus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-03-14T22:45:16.8414059Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-03-14T22:45:16.8414059Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-03-14T22:45:16.8101562Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"southcentralus","statusOfPrimary":"available"}}'} + body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"southcentralus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:47:05.9534027Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:47:05.9534027Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:47:05.9065524Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"southcentralus","statusOfPrimary":"available"}}'} headers: cache-control: [no-cache] content-length: ['1247'] content-type: [application/json] - date: ['Wed, 14 Mar 2018 22:45:51 GMT'] + date: ['Tue, 01 May 2018 21:47:22 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -127,19 +97,18 @@ interactions: Connection: [keep-alive] Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.4 (Darwin-17.4.0-x86_64-i386-64bit) requests/2.18.4 - msrest/0.4.25 msrest_azure/0.4.20 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python - AZURECLI/2.0.30] + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: POST uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002/listKeys?api-version=2017-10-01 response: - body: {string: '{"keys":[{"keyName":"key1","value":"29iXmtApzwAgRU8RFPFc896ZSHW4hYGutTWNZn7RbmOnUZqC6mJDx5PbdrnPn/3Ta4DNTapCNNwo1GEWRe8rBw==","permissions":"FULL"},{"keyName":"key2","value":"idf7KpJ5ifYJoB9H83S6RZuA4HvGtt8QMFD5hJS9keCnWMx4OUfkLct1r5xzRRVB3yHyc/Ke+D/Hxa1v2Fi85w==","permissions":"FULL"}]}'} + body: {string: '{"keys":[{"keyName":"key1","value":"rjXT1kvmeWybJWyFiYBHHDcL5lSdSWDPXj/jKH1+L/FnrP6CQrnFRWNhw4wE8fSQ6koOguSwVwAJOvZLhDliPg==","permissions":"FULL"},{"keyName":"key2","value":"GlYufNjT5f7xOlMIzKSJrB4IwD3vxFV8FE0C/4JyDM7Z1Gw6+jfnA+lFTiUDaFXmwnIE0GBLDbQUvjH1OsPJ9g==","permissions":"FULL"}]}'} headers: cache-control: [no-cache] content-length: ['288'] content-type: [application/json] - date: ['Wed, 14 Mar 2018 22:45:52 GMT'] + date: ['Tue, 01 May 2018 21:47:23 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -148,7 +117,7 @@ interactions: transfer-encoding: [chunked] vary: [Accept-Encoding] x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-writes: ['1198'] + x-ms-ratelimit-remaining-subscription-writes: ['1196'] status: {code: 200, message: OK} - request: body: null @@ -158,19 +127,19 @@ interactions: CommandName: [keyvault create] Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.4 (Darwin-17.4.0-x86_64-i386-64bit) requests/2.18.4 - msrest/0.4.25 msrest_azure/0.4.20 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.30] + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2017-05-10 response: - body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"southcentralus","tags":{"use":"az-test"},"properties":{"provisioningState":"Succeeded"}}'} + body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"southcentralus","tags":{"product":"azurecli","cause":"automation","date":"2018-05-01T21:47:03Z"},"properties":{"provisioningState":"Succeeded"}}'} headers: cache-control: [no-cache] - content-length: ['336'] + content-length: ['392'] content-type: [application/json; charset=utf-8] - date: ['Wed, 14 Mar 2018 22:45:52 GMT'] + date: ['Tue, 01 May 2018 21:47:25 GMT'] expires: ['-1'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] @@ -184,43 +153,36 @@ interactions: Accept-Encoding: ['gzip, deflate'] Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.4 (Darwin-17.4.0-x86_64-i386-64bit) requests/2.18.4 - msrest/0.4.25 msrest_azure/0.4.20 graphrbacmanagementclient/0.31.0 Azure-SDK-For-Python] + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + msrest_azure/0.4.25 azure-graphrbac/0.40.0 Azure-SDK-For-Python] accept-language: [en-US] method: GET uri: https://graph.windows.net/00000000-0000-0000-0000-000000000000/me?api-version=1.6 response: - body: {string: '{"odata.metadata":"https://graph.windows.net/00000000-0000-0000-0000-000000000000/$metadata#directoryObjects/Microsoft.DirectoryServices.User/@Element","odata.type":"Microsoft.DirectoryServices.User","objectType":"User","objectId":"cdf4ba39-6a56-45be-a72a-13ec9cdfee91","deletionTimestamp":null,"accountEnabled":true,"ageGroup":null,"assignedLicenses":[{"disabledPlans":[],"skuId":"b05e124f-c7cc-45a0-a6aa-8cf78c946968"},{"disabledPlans":["0b03f40b-c404-40c3-8651-2aceb74365fa","b650d915-9886-424b-a08d-633cede56f57","e95bec33-7c88-4a70-8e19-b10bd9d0c014","5dbe027f-2339-4123-9542-606e4d348a72","fe71d6c3-a2ea-4499-9778-da042bf08063","fafd7243-e5c1-4a3a-9e40-495efcb1d3c3"],"skuId":"ea126fc5-a19e-42e2-a731-da9d437bffcf"},{"disabledPlans":[],"skuId":"c7df2760-2c81-4ef7-b578-5b5392b571df"},{"disabledPlans":[],"skuId":"c5928f49-12ba-48f7-ada3-0d743a3601d5"},{"disabledPlans":["e95bec33-7c88-4a70-8e19-b10bd9d0c014","5dbe027f-2339-4123-9542-606e4d348a72"],"skuId":"f82a60b8-1ee3-4cfb-a4fe-1c6a53c2656c"},{"disabledPlans":[],"skuId":"d3b4fe1f-9992-4930-8acb-ca6ec609365e"},{"disabledPlans":[],"skuId":"c52ea49f-fe5d-4e95-93ba-1de91d380f89"}],"assignedPlans":[{"assignedTimestamp":"2018-01-09T10:23:23Z","capabilityStatus":"Enabled","service":"ProjectWorkManagement","servicePlanId":"b737dad2-2f6c-4c65-90e3-ca563267e8b9"},{"assignedTimestamp":"2018-01-01T00:45:04Z","capabilityStatus":"Enabled","service":"SharePoint","servicePlanId":"fe71d6c3-a2ea-4499-9778-da042bf08063"},{"assignedTimestamp":"2018-01-01T00:45:04Z","capabilityStatus":"Enabled","service":"AADPremiumService","servicePlanId":"41781fb2-bc02-4b7c-bd55-b576c07bb09d"},{"assignedTimestamp":"2018-01-01T00:45:04Z","capabilityStatus":"Enabled","service":"MultiFactorService","servicePlanId":"8a256a2b-b617-496d-b51b-e76466e88db0"},{"assignedTimestamp":"2018-01-01T00:45:04Z","capabilityStatus":"Enabled","service":"SharePoint","servicePlanId":"e95bec33-7c88-4a70-8e19-b10bd9d0c014"},{"assignedTimestamp":"2018-01-01T00:45:04Z","capabilityStatus":"Enabled","service":"SharePoint","servicePlanId":"5dbe027f-2339-4123-9542-606e4d348a72"},{"assignedTimestamp":"2018-01-01T00:45:04Z","capabilityStatus":"Enabled","service":"MicrosoftOffice","servicePlanId":"fafd7243-e5c1-4a3a-9e40-495efcb1d3c3"},{"assignedTimestamp":"2017-12-31T09:05:59Z","capabilityStatus":"Deleted","service":"Adallom","servicePlanId":"932ad362-64a8-4783-9106-97849a1a30b9"},{"assignedTimestamp":"2017-12-16T12:54:56Z","capabilityStatus":"Enabled","service":"SharePoint","servicePlanId":"2bdbaf8f-738f-4ac7-9234-3c3ee2ce7d0f"},{"assignedTimestamp":"2017-12-16T12:54:56Z","capabilityStatus":"Enabled","service":"SharePoint","servicePlanId":"da792a53-cbc0-4184-a10d-e544dd34b3c1"},{"assignedTimestamp":"2017-12-16T12:54:56Z","capabilityStatus":"Enabled","service":"To-Do","servicePlanId":"3fb82609-8c27-4f7b-bd51-30634711ee67"},{"assignedTimestamp":"2017-12-16T12:54:56Z","capabilityStatus":"Enabled","service":"RMSOnline","servicePlanId":"5689bec4-755d-4753-8b61-40975025187c"},{"assignedTimestamp":"2017-12-16T12:54:56Z","capabilityStatus":"Enabled","service":"Adallom","servicePlanId":"2e2ddb96-6af9-4b1d-a3f0-d6ecfd22edb2"},{"assignedTimestamp":"2017-01-26T01:41:01Z","capabilityStatus":"Enabled","service":"Adallom","servicePlanId":"8c098270-9dd4-4350-9b30-ba4703f3b36b"},{"assignedTimestamp":"2017-10-07T03:10:17Z","capabilityStatus":"Enabled","service":"Netbreeze","servicePlanId":"03acaee3-9492-4f40-aed4-bcb6b32981b6"},{"assignedTimestamp":"2017-10-07T03:10:17Z","capabilityStatus":"Enabled","service":"RMSOnline","servicePlanId":"bea4c11e-220a-4e6d-8eb8-8ea15d019f90"},{"assignedTimestamp":"2017-10-07T03:10:17Z","capabilityStatus":"Enabled","service":"RMSOnline","servicePlanId":"6c57d4b6-3b23-47a5-9bc9-69f17b4947b3"},{"assignedTimestamp":"2017-10-07T03:10:17Z","capabilityStatus":"Enabled","service":"CRM","servicePlanId":"d56f3deb-50d8-465a-bedb-f079817ccac1"},{"assignedTimestamp":"2017-07-06T17:55:21Z","capabilityStatus":"Enabled","service":"MicrosoftCommunicationsOnline","servicePlanId":"4828c8ec-dc2e-4779-b502-87ac9ce28ab7"},{"assignedTimestamp":"2017-07-06T17:55:21Z","capabilityStatus":"Enabled","service":"MicrosoftCommunicationsOnline","servicePlanId":"3e26ee1f-8a5f-4d52-aee2-b81ce45c8f40"},{"assignedTimestamp":"2017-07-06T17:55:20Z","capabilityStatus":"Enabled","service":"TeamspaceAPI","servicePlanId":"57ff2da0-773e-42df-b2af-ffb7a2317929"},{"assignedTimestamp":"2017-07-06T17:55:20Z","capabilityStatus":"Deleted","service":"ProcessSimple","servicePlanId":"76846ad7-7776-4c40-a281-a386362dd1b9"},{"assignedTimestamp":"2017-07-06T17:55:20Z","capabilityStatus":"Deleted","service":"PowerAppsService","servicePlanId":"c68f8d98-5534-41c8-bf36-22fa496fa792"},{"assignedTimestamp":"2017-07-06T17:55:20Z","capabilityStatus":"Enabled","service":"YammerEnterprise","servicePlanId":"7547a3fe-08ee-4ccb-b430-5077c5041653"},{"assignedTimestamp":"2017-07-06T17:55:20Z","capabilityStatus":"Enabled","service":"Sway","servicePlanId":"a23b959c-7ce8-4e57-9140-b90eb88a9e97"},{"assignedTimestamp":"2017-07-06T17:55:20Z","capabilityStatus":"Enabled","service":"MicrosoftCommunicationsOnline","servicePlanId":"0feaeb32-d00e-4d66-bd5a-43b5b83db82c"},{"assignedTimestamp":"2017-07-06T17:55:20Z","capabilityStatus":"Enabled","service":"Deskless","servicePlanId":"8c7d2df8-86f0-4902-b2ed-a0458298f3b3"},{"assignedTimestamp":"2017-07-06T17:55:20Z","capabilityStatus":"Deleted","service":"MicrosoftStream","servicePlanId":"9e700747-8b1d-45e5-ab8d-ef187ceec156"},{"assignedTimestamp":"2017-07-06T17:55:20Z","capabilityStatus":"Enabled","service":"exchange","servicePlanId":"efb87545-963c-4e0d-99df-69c6916d9eb0"},{"assignedTimestamp":"2017-07-06T17:55:20Z","capabilityStatus":"Enabled","service":"MicrosoftOffice","servicePlanId":"43de0ff5-c92c-492b-9116-175376d08c38"},{"assignedTimestamp":"2017-07-06T17:55:20Z","capabilityStatus":"Deleted","service":"OfficeForms","servicePlanId":"2789c901-c14e-48ab-a76a-be334d9d793a"},{"assignedTimestamp":"2017-07-06T17:55:19Z","capabilityStatus":"Enabled","service":"OfficeForms","servicePlanId":"e212cbc7-0961-4c40-9825-01117710dcb1"},{"assignedTimestamp":"2017-07-06T17:55:19Z","capabilityStatus":"Enabled","service":"OfficeForms","servicePlanId":"159f4cd6-e380-449f-a816-af1a9ef76344"},{"assignedTimestamp":"2017-06-11T11:19:06Z","capabilityStatus":"Enabled","service":"MicrosoftStream","servicePlanId":"6c6042f5-6f01-4d67-b8c1-eb99d36eed3e"},{"assignedTimestamp":"2017-06-11T11:19:06Z","capabilityStatus":"Enabled","service":"AADPremiumService","servicePlanId":"eec0eb4f-6444-4f95-aba0-50c24d67f998"},{"assignedTimestamp":"2017-06-11T11:19:06Z","capabilityStatus":"Enabled","service":"SCO","servicePlanId":"c1ec4a95-1f05-45b3-a911-aa3fa01094f5"},{"assignedTimestamp":"2017-05-13T02:29:46Z","capabilityStatus":"Enabled","service":"exchange","servicePlanId":"8e0c0a52-6a6c-4d40-8370-dd62790dcd70"},{"assignedTimestamp":"2017-01-26T01:41:01Z","capabilityStatus":"Enabled","service":"exchange","servicePlanId":"9f431833-0334-42de-a7dc-70aa40db46db"},{"assignedTimestamp":"2017-01-26T01:41:01Z","capabilityStatus":"Enabled","service":"PowerBI","servicePlanId":"70d33638-9c74-4d01-bfd3-562de28bd4ba"},{"assignedTimestamp":"2017-01-26T01:41:01Z","capabilityStatus":"Enabled","service":"exchange","servicePlanId":"4de31727-a228-4ec3-a5bf-8e45b5ca48cc"},{"assignedTimestamp":"2017-01-26T01:41:01Z","capabilityStatus":"Deleted","service":"SharePoint","servicePlanId":"c4048e79-4474-4c74-ba9b-c31ff225e511"},{"assignedTimestamp":"2017-01-26T01:41:01Z","capabilityStatus":"Deleted","service":"AzureAnalysis","servicePlanId":"2049e525-b859-401b-b2a0-e0a31c4b1fe4"},{"assignedTimestamp":"2017-01-26T01:41:01Z","capabilityStatus":"Enabled","service":"exchange","servicePlanId":"34c0d7a0-a70f-4668-9238-47f9fc208882"},{"assignedTimestamp":"2016-12-19T04:25:33Z","capabilityStatus":"Deleted","service":"PowerBI","servicePlanId":"fc0a60aa-feee-4746-a0e3-aecfe81a38dd"},{"assignedTimestamp":"2016-12-19T04:25:33Z","capabilityStatus":"Deleted","service":"SharePoint","servicePlanId":"2125cfd7-2110-4567-83c4-c1cd5275163d"},{"assignedTimestamp":"2016-11-19T14:33:33Z","capabilityStatus":"Enabled","service":"PowerAppsService","servicePlanId":"9c0dab89-a30c-4117-86e7-97bda240acd2"},{"assignedTimestamp":"2016-11-19T14:33:33Z","capabilityStatus":"Enabled","service":"ProcessSimple","servicePlanId":"07699545-9485-468e-95b6-2fca3738be01"},{"assignedTimestamp":"2012-10-17T12:12:58Z","capabilityStatus":"Enabled","service":"MicrosoftOffice","servicePlanId":"663a804f-1c30-4ff0-9915-9db84f0d1cea"},{"assignedTimestamp":"2015-07-30T05:29:29Z","capabilityStatus":"Enabled","service":"MicrosoftCommunicationsOnline","servicePlanId":"5a10155d-f5c1-411a-a8ec-e99aae125390"},{"assignedTimestamp":"2015-07-30T05:29:29Z","capabilityStatus":"Deleted","service":"MicrosoftCommunicationsOnline","servicePlanId":"27216c54-caf8-4d0d-97e2-517afb5c08f6"}],"city":"REDMOND","companyName":"MICROSOFT","consentProvidedForMinor":null,"country":null,"creationType":null,"department":"Azure - and Web","dirSyncEnabled":true,"displayName":"Troy Dai","employeeId":null,"facsimileTelephoneNumber":null,"givenName":"Troy","immutableId":"461912","isCompromised":null,"jobTitle":"SENIOR - SOFTWARE ENGINEER","lastDirSyncTime":"2018-02-23T23:05:29Z","legalAgeGroupClassification":null,"mail":"trdai@microsoft.com","mailNickname":"trdai","mobile":null,"onPremisesDistinguishedName":null,"onPremisesSecurityIdentifier":"S-1-5-21-2127521184-1604012920-1887927527-7314606","otherMails":[],"passwordPolicies":"DisablePasswordExpiration","passwordProfile":null,"physicalDeliveryOfficeName":"18/2300FL","postalCode":null,"preferredLanguage":null,"provisionedPlans":[{"capabilityStatus":"Enabled","provisioningStatus":"Success","service":"SharePoint"},{"capabilityStatus":"Enabled","provisioningStatus":"Success","service":"SharePoint"},{"capabilityStatus":"Enabled","provisioningStatus":"Success","service":"SharePoint"},{"capabilityStatus":"Enabled","provisioningStatus":"Success","service":"SharePoint"},{"capabilityStatus":"Enabled","provisioningStatus":"Success","service":"SharePoint"},{"capabilityStatus":"Enabled","provisioningStatus":"Success","service":"Netbreeze"},{"capabilityStatus":"Enabled","provisioningStatus":"Success","service":"CRM"},{"capabilityStatus":"Enabled","provisioningStatus":"Success","service":"MicrosoftCommunicationsOnline"},{"capabilityStatus":"Enabled","provisioningStatus":"Success","service":"MicrosoftCommunicationsOnline"},{"capabilityStatus":"Enabled","provisioningStatus":"Success","service":"MicrosoftCommunicationsOnline"},{"capabilityStatus":"Enabled","provisioningStatus":"Success","service":"exchange"},{"capabilityStatus":"Enabled","provisioningStatus":"Success","service":"exchange"},{"capabilityStatus":"Deleted","provisioningStatus":"Success","service":"SharePoint"},{"capabilityStatus":"Enabled","provisioningStatus":"Success","service":"exchange"},{"capabilityStatus":"Enabled","provisioningStatus":"Success","service":"exchange"},{"capabilityStatus":"Enabled","provisioningStatus":"Success","service":"exchange"},{"capabilityStatus":"Deleted","provisioningStatus":"Success","service":"SharePoint"},{"capabilityStatus":"Enabled","provisioningStatus":"Success","service":"MicrosoftOffice"},{"capabilityStatus":"Enabled","provisioningStatus":"Success","service":"MicrosoftOffice"},{"capabilityStatus":"Enabled","provisioningStatus":"Success","service":"MicrosoftCommunicationsOnline"},{"capabilityStatus":"Deleted","provisioningStatus":"Success","service":"MicrosoftCommunicationsOnline"},{"capabilityStatus":"Enabled","provisioningStatus":"Success","service":"MicrosoftOffice"}],"provisioningErrors":[],"proxyAddresses":["X500:/O=Nokia/OU=HUB/cn=Recipients/cn=trdai","X500:/o=SDF/ou=Exchange - Administrative Group (FYDIBOHF23SPDLT)/cn=Recipients/cn=sdflabs.com-51490-Troy - Dai","X500:/o=microsoft/ou=First Administrative Group/cn=Recipients/cn=trdai","X500:/o=microsoft/ou=External - (FYDIBOHF25SPDLT)/cn=Recipients/cn=a84f62fabe9b4550aaeda1239b1a98a0","X500:/o=microsoft/ou=Exchange - Administrative Group (FYDIBOHF23SPDLT)/cn=Recipients/cn=trdai","X500:/o=SDF/ou=Exchange - Administrative Group (FYDIBOHF23SPDLT)/cn=Recipients/cn=trdaif6bab3c01c","X500:/o=SDF/ou=Exchange - Administrative Group (FYDIBOHF23SPDLT)/cn=Recipients/cn=51490-trdai_7c9c85843c","X500:/o=SDF/ou=Exchange - Administrative Group (FYDIBOHF23SPDLT)/cn=Recipients/cn=51490-trdai_1ff209dd2f","X500:/o=MSNBC/ou=Servers/cn=Recipients/cn=trdai","X500:/o=ExchangeLabs/ou=Exchange - Administrative Group (FYDIBOHF23SPDLT)/cn=Recipients/cn=trdai8d49b0283b","X500:/o=ExchangeLabs/ou=Exchange - Administrative Group (FYDIBOHF23SPDLT)/cn=Recipients/cn=microsoft.onmicrosoft.com-55760-Troy - Dai","smtp:trdai@064d.mgd.microsoft.com","X500:/o=MMS/ou=Exchange Administrative - Group (FYDIBOHF23SPDLT)/cn=Recipients/cn=Troy Dai0deb72db-4e3f-41b7-b53f-0e30c68d0958","SMTP:trdai@microsoft.com","x500:/o=microsoft/ou=Exchange - Administrative Group (FYDIBOHF23SPDLT)/cn=Recipients/cn=Troy Dai","smtp:trdai@service.microsoft.com"],"refreshTokensValidFromDateTime":"2018-02-23T22:01:13Z","showInAddressList":true,"signInNames":[],"sipProxyAddress":"trdai@microsoft.com","state":null,"streetAddress":null,"surname":"Dai","telephoneNumber":"+1 - (425) 7062263","thumbnailPhoto@odata.mediaContentType":"image/Jpeg","usageLocation":"US","userIdentities":[],"userPrincipalName":"trdai@microsoft.com","userType":null,"extension_18e31482d3fb4a8ea958aa96b662f508_SupervisorInd":"N","extension_18e31482d3fb4a8ea958aa96b662f508_BuildingName":"18","extension_18e31482d3fb4a8ea958aa96b662f508_BuildingID":"17","extension_18e31482d3fb4a8ea958aa96b662f508_ReportsToPersonnelNbr":"186027","extension_18e31482d3fb4a8ea958aa96b662f508_ReportsToFullName":"Diwan, - Mayuri","extension_18e31482d3fb4a8ea958aa96b662f508_ReportsToEmailName":"MAYURID","extension_18e31482d3fb4a8ea958aa96b662f508_AddressLine1":"1 - Microsoft Way","extension_18e31482d3fb4a8ea958aa96b662f508_CityName":"REDMOND","extension_18e31482d3fb4a8ea958aa96b662f508_CompanyCode":"1010","extension_18e31482d3fb4a8ea958aa96b662f508_CostCenterCode":"10040929","extension_18e31482d3fb4a8ea958aa96b662f508_CountryShortCode":"US","extension_18e31482d3fb4a8ea958aa96b662f508_LocationAreaCode":"US","extension_18e31482d3fb4a8ea958aa96b662f508_PersonnelNumber":"461912","extension_18e31482d3fb4a8ea958aa96b662f508_PositionNumber":"19376","extension_18e31482d3fb4a8ea958aa96b662f508_ProfitCenterCode":"P10040929","extension_18e31482d3fb4a8ea958aa96b662f508_StateProvinceCode":"WA","extension_18e31482d3fb4a8ea958aa96b662f508_ZipCode":"98052"}'} + body: {string: '{"odata.metadata":"https://graph.windows.net/00000000-0000-0000-0000-000000000000/$metadata#directoryObjects/Microsoft.DirectoryServices.User/@Element","odata.type":"Microsoft.DirectoryServices.User","objectType":"User","objectId":"4b1f6d49-d203-442f-bb23-06d98ab68f05","deletionTimestamp":null,"accountEnabled":true,"ageGroup":null,"assignedLicenses":[{"disabledPlans":[],"skuId":"488ba24a-39a9-4473-8ee5-19291e71b002"},{"disabledPlans":[],"skuId":"b05e124f-c7cc-45a0-a6aa-8cf78c946968"},{"disabledPlans":["0b03f40b-c404-40c3-8651-2aceb74365fa","b650d915-9886-424b-a08d-633cede56f57","e95bec33-7c88-4a70-8e19-b10bd9d0c014","5dbe027f-2339-4123-9542-606e4d348a72","fe71d6c3-a2ea-4499-9778-da042bf08063","fafd7243-e5c1-4a3a-9e40-495efcb1d3c3"],"skuId":"ea126fc5-a19e-42e2-a731-da9d437bffcf"},{"disabledPlans":[],"skuId":"c7df2760-2c81-4ef7-b578-5b5392b571df"},{"disabledPlans":["e95bec33-7c88-4a70-8e19-b10bd9d0c014","5dbe027f-2339-4123-9542-606e4d348a72"],"skuId":"f82a60b8-1ee3-4cfb-a4fe-1c6a53c2656c"},{"disabledPlans":[],"skuId":"c5928f49-12ba-48f7-ada3-0d743a3601d5"},{"disabledPlans":[],"skuId":"c52ea49f-fe5d-4e95-93ba-1de91d380f89"}],"assignedPlans":[{"assignedTimestamp":"2018-04-24T12:19:11Z","capabilityStatus":"Enabled","service":"SharePoint","servicePlanId":"fe71d6c3-a2ea-4499-9778-da042bf08063"},{"assignedTimestamp":"2018-04-24T12:19:11Z","capabilityStatus":"Enabled","service":"SharePoint","servicePlanId":"2bdbaf8f-738f-4ac7-9234-3c3ee2ce7d0f"},{"assignedTimestamp":"2018-04-24T12:19:11Z","capabilityStatus":"Enabled","service":"SharePoint","servicePlanId":"da792a53-cbc0-4184-a10d-e544dd34b3c1"},{"assignedTimestamp":"2018-04-24T12:19:11Z","capabilityStatus":"Enabled","service":"SharePoint","servicePlanId":"e95bec33-7c88-4a70-8e19-b10bd9d0c014"},{"assignedTimestamp":"2018-04-24T12:19:11Z","capabilityStatus":"Enabled","service":"SharePoint","servicePlanId":"5dbe027f-2339-4123-9542-606e4d348a72"},{"assignedTimestamp":"2018-03-23T21:16:30Z","capabilityStatus":"Enabled","service":"SharePoint","servicePlanId":"fe71d6c3-a2ea-4499-9778-da042bf08063"},{"assignedTimestamp":"2018-03-23T21:16:30Z","capabilityStatus":"Enabled","service":"SharePoint","servicePlanId":"e95bec33-7c88-4a70-8e19-b10bd9d0c014"},{"assignedTimestamp":"2018-03-23T21:16:30Z","capabilityStatus":"Enabled","service":"SharePoint","servicePlanId":"5dbe027f-2339-4123-9542-606e4d348a72"},{"assignedTimestamp":"2018-03-23T21:16:30Z","capabilityStatus":"Deleted","service":"MicrosoftStream","servicePlanId":"acffdce6-c30f-4dc2-81c0-372e33c515ec"},{"assignedTimestamp":"2018-03-23T21:16:30Z","capabilityStatus":"Enabled","service":"MicrosoftOffice","servicePlanId":"fafd7243-e5c1-4a3a-9e40-495efcb1d3c3"},{"assignedTimestamp":"2018-03-17T19:15:37Z","capabilityStatus":"Enabled","service":"WindowsDefenderATP","servicePlanId":"871d91ec-ec1a-452b-a83f-bd76c7d770ef"},{"assignedTimestamp":"2018-03-17T19:15:37Z","capabilityStatus":"Enabled","service":"AzureAdvancedThreatAnalytics","servicePlanId":"14ab5db5-e6c4-4b20-b4bc-13e36fd2227f"},{"assignedTimestamp":"2018-03-17T19:15:37Z","capabilityStatus":"Enabled","service":"Windows","servicePlanId":"e7c91390-7625-45be-94e0-e16907e03118"},{"assignedTimestamp":"2018-01-09T12:24:45Z","capabilityStatus":"Enabled","service":"ProjectWorkManagement","servicePlanId":"b737dad2-2f6c-4c65-90e3-ca563267e8b9"},{"assignedTimestamp":"2018-01-01T06:15:34Z","capabilityStatus":"Enabled","service":"AADPremiumService","servicePlanId":"41781fb2-bc02-4b7c-bd55-b576c07bb09d"},{"assignedTimestamp":"2018-01-01T06:15:34Z","capabilityStatus":"Enabled","service":"MultiFactorService","servicePlanId":"8a256a2b-b617-496d-b51b-e76466e88db0"},{"assignedTimestamp":"2017-12-31T18:38:48Z","capabilityStatus":"Deleted","service":"Adallom","servicePlanId":"932ad362-64a8-4783-9106-97849a1a30b9"},{"assignedTimestamp":"2017-12-14T05:01:45Z","capabilityStatus":"Enabled","service":"SharePoint","servicePlanId":"2bdbaf8f-738f-4ac7-9234-3c3ee2ce7d0f"},{"assignedTimestamp":"2017-12-14T05:01:45Z","capabilityStatus":"Enabled","service":"SharePoint","servicePlanId":"da792a53-cbc0-4184-a10d-e544dd34b3c1"},{"assignedTimestamp":"2017-12-14T05:01:45Z","capabilityStatus":"Enabled","service":"To-Do","servicePlanId":"3fb82609-8c27-4f7b-bd51-30634711ee67"},{"assignedTimestamp":"2017-12-14T05:01:45Z","capabilityStatus":"Enabled","service":"RMSOnline","servicePlanId":"5689bec4-755d-4753-8b61-40975025187c"},{"assignedTimestamp":"2017-12-14T05:01:45Z","capabilityStatus":"Enabled","service":"Adallom","servicePlanId":"2e2ddb96-6af9-4b1d-a3f0-d6ecfd22edb2"},{"assignedTimestamp":"2017-08-04T02:23:56Z","capabilityStatus":"Enabled","service":"Adallom","servicePlanId":"8c098270-9dd4-4350-9b30-ba4703f3b36b"},{"assignedTimestamp":"2017-10-07T05:29:38Z","capabilityStatus":"Enabled","service":"Netbreeze","servicePlanId":"03acaee3-9492-4f40-aed4-bcb6b32981b6"},{"assignedTimestamp":"2017-10-07T05:29:38Z","capabilityStatus":"Enabled","service":"RMSOnline","servicePlanId":"bea4c11e-220a-4e6d-8eb8-8ea15d019f90"},{"assignedTimestamp":"2017-10-07T05:29:38Z","capabilityStatus":"Enabled","service":"RMSOnline","servicePlanId":"6c57d4b6-3b23-47a5-9bc9-69f17b4947b3"},{"assignedTimestamp":"2017-10-07T05:29:38Z","capabilityStatus":"Enabled","service":"CRM","servicePlanId":"d56f3deb-50d8-465a-bedb-f079817ccac1"},{"assignedTimestamp":"2017-08-18T15:14:38Z","capabilityStatus":"Enabled","service":"exchange","servicePlanId":"efb87545-963c-4e0d-99df-69c6916d9eb0"},{"assignedTimestamp":"2017-08-18T15:14:38Z","capabilityStatus":"Enabled","service":"MicrosoftCommunicationsOnline","servicePlanId":"3e26ee1f-8a5f-4d52-aee2-b81ce45c8f40"},{"assignedTimestamp":"2017-08-18T15:14:38Z","capabilityStatus":"Enabled","service":"MicrosoftCommunicationsOnline","servicePlanId":"4828c8ec-dc2e-4779-b502-87ac9ce28ab7"},{"assignedTimestamp":"2017-08-18T15:14:38Z","capabilityStatus":"Enabled","service":"exchange","servicePlanId":"34c0d7a0-a70f-4668-9238-47f9fc208882"},{"assignedTimestamp":"2017-08-18T15:14:38Z","capabilityStatus":"Enabled","service":"exchange","servicePlanId":"9f431833-0334-42de-a7dc-70aa40db46db"},{"assignedTimestamp":"2017-08-18T15:14:38Z","capabilityStatus":"Enabled","service":"Deskless","servicePlanId":"8c7d2df8-86f0-4902-b2ed-a0458298f3b3"},{"assignedTimestamp":"2017-08-18T15:14:38Z","capabilityStatus":"Enabled","service":"exchange","servicePlanId":"8e0c0a52-6a6c-4d40-8370-dd62790dcd70"},{"assignedTimestamp":"2017-08-18T15:14:38Z","capabilityStatus":"Enabled","service":"MicrosoftStream","servicePlanId":"6c6042f5-6f01-4d67-b8c1-eb99d36eed3e"},{"assignedTimestamp":"2017-08-18T15:14:38Z","capabilityStatus":"Enabled","service":"OfficeForms","servicePlanId":"e212cbc7-0961-4c40-9825-01117710dcb1"},{"assignedTimestamp":"2017-08-04T07:20:51Z","capabilityStatus":"Enabled","service":"AADPremiumService","servicePlanId":"eec0eb4f-6444-4f95-aba0-50c24d67f998"},{"assignedTimestamp":"2017-08-04T07:20:51Z","capabilityStatus":"Enabled","service":"SCO","servicePlanId":"c1ec4a95-1f05-45b3-a911-aa3fa01094f5"},{"assignedTimestamp":"2017-08-04T02:23:56Z","capabilityStatus":"Enabled","service":"MicrosoftCommunicationsOnline","servicePlanId":"0feaeb32-d00e-4d66-bd5a-43b5b83db82c"},{"assignedTimestamp":"2017-08-04T02:23:56Z","capabilityStatus":"Enabled","service":"ProcessSimple","servicePlanId":"07699545-9485-468e-95b6-2fca3738be01"},{"assignedTimestamp":"2017-08-04T02:23:56Z","capabilityStatus":"Enabled","service":"Sway","servicePlanId":"a23b959c-7ce8-4e57-9140-b90eb88a9e97"},{"assignedTimestamp":"2017-08-04T02:23:56Z","capabilityStatus":"Enabled","service":"PowerBI","servicePlanId":"70d33638-9c74-4d01-bfd3-562de28bd4ba"},{"assignedTimestamp":"2017-08-04T02:23:56Z","capabilityStatus":"Enabled","service":"exchange","servicePlanId":"4de31727-a228-4ec3-a5bf-8e45b5ca48cc"},{"assignedTimestamp":"2017-08-04T02:23:56Z","capabilityStatus":"Enabled","service":"MicrosoftOffice","servicePlanId":"663a804f-1c30-4ff0-9915-9db84f0d1cea"},{"assignedTimestamp":"2017-08-04T02:23:56Z","capabilityStatus":"Enabled","service":"TeamspaceAPI","servicePlanId":"57ff2da0-773e-42df-b2af-ffb7a2317929"},{"assignedTimestamp":"2017-08-04T02:23:56Z","capabilityStatus":"Enabled","service":"PowerAppsService","servicePlanId":"9c0dab89-a30c-4117-86e7-97bda240acd2"},{"assignedTimestamp":"2017-08-04T02:23:56Z","capabilityStatus":"Enabled","service":"OfficeForms","servicePlanId":"159f4cd6-e380-449f-a816-af1a9ef76344"},{"assignedTimestamp":"2017-08-04T02:23:56Z","capabilityStatus":"Enabled","service":"YammerEnterprise","servicePlanId":"7547a3fe-08ee-4ccb-b430-5077c5041653"},{"assignedTimestamp":"2017-08-04T02:23:56Z","capabilityStatus":"Enabled","service":"MicrosoftOffice","servicePlanId":"43de0ff5-c92c-492b-9116-175376d08c38"}],"city":"REDMOND","companyName":"MICROSOFT","consentProvidedForMinor":null,"country":null,"creationType":null,"department":"Azure + and Web","dirSyncEnabled":true,"displayName":"Willie Xu","employeeId":null,"facsimileTelephoneNumber":null,"givenName":"Willie","immutableId":"1241166","isCompromised":null,"jobTitle":"SOFTWARE + ENGINEER","lastDirSyncTime":"2018-04-14T15:06:56Z","legalAgeGroupClassification":null,"mail":"Willie.Xu@microsoft.com","mailNickname":"wilx","mobile":null,"onPremisesDistinguishedName":"CN=Willie + Xu,OU=UserAccounts,DC=redmond,DC=corp,DC=microsoft,DC=com","onPremisesSecurityIdentifier":"S-1-5-21-2127521184-1604012920-1887927527-28031824","otherMails":[],"passwordPolicies":"DisablePasswordExpiration","passwordProfile":null,"physicalDeliveryOfficeName":"18/2250FL","postalCode":null,"preferredLanguage":null,"provisionedPlans":[{"capabilityStatus":"Enabled","provisioningStatus":"Success","service":"SharePoint"},{"capabilityStatus":"Enabled","provisioningStatus":"Success","service":"SharePoint"},{"capabilityStatus":"Enabled","provisioningStatus":"Success","service":"SharePoint"},{"capabilityStatus":"Enabled","provisioningStatus":"Success","service":"SharePoint"},{"capabilityStatus":"Enabled","provisioningStatus":"Success","service":"SharePoint"},{"capabilityStatus":"Enabled","provisioningStatus":"Success","service":"SharePoint"},{"capabilityStatus":"Enabled","provisioningStatus":"Success","service":"SharePoint"},{"capabilityStatus":"Enabled","provisioningStatus":"Success","service":"SharePoint"},{"capabilityStatus":"Enabled","provisioningStatus":"Success","service":"SharePoint"},{"capabilityStatus":"Enabled","provisioningStatus":"Success","service":"SharePoint"},{"capabilityStatus":"Enabled","provisioningStatus":"Success","service":"Netbreeze"},{"capabilityStatus":"Enabled","provisioningStatus":"Success","service":"CRM"},{"capabilityStatus":"Enabled","provisioningStatus":"Success","service":"MicrosoftCommunicationsOnline"},{"capabilityStatus":"Enabled","provisioningStatus":"Success","service":"MicrosoftCommunicationsOnline"},{"capabilityStatus":"Enabled","provisioningStatus":"Success","service":"exchange"},{"capabilityStatus":"Enabled","provisioningStatus":"Success","service":"exchange"},{"capabilityStatus":"Enabled","provisioningStatus":"Success","service":"exchange"},{"capabilityStatus":"Enabled","provisioningStatus":"Success","service":"exchange"},{"capabilityStatus":"Enabled","provisioningStatus":"Success","service":"MicrosoftCommunicationsOnline"},{"capabilityStatus":"Enabled","provisioningStatus":"Success","service":"exchange"}],"provisioningErrors":[],"proxyAddresses":["x500:/o=ExchangeLabs/ou=Exchange + Administrative Group (FYDIBOHF23SPDLT)/cn=Recipients/cn=73e4dc5a8858433681fcb300f98cd2db-Willie + Xu","X500:/o=microsoft/ou=Exchange Administrative Group (FYDIBOHF23SPDLT)/cn=Recipients/cn=53ed7de51a1940ae94f43ae4b57643a4-Willie + Xu","X500:/o=MMS/ou=Exchange Administrative Group (FYDIBOHF23SPDLT)/cn=Recipients/cn=55b110a31823461c9ce34dd1a3f445dc-Willie + Xu96c9fa53-17","X500:/o=microsoft/ou=Exchange Administrative Group (FYDIBOHF23SPDLT)/cn=Recipients/cn=e2257f0925774064878e0ae17f94fdef-Willie + Xu","smtp:wilx@microsoft.onmicrosoft.com","smtp:wilx@service.microsoft.com","smtp:wilx@microsoft.com","SMTP:Willie.Xu@microsoft.com"],"refreshTokensValidFromDateTime":"2018-02-27T19:29:17Z","showInAddressList":null,"signInNames":[],"sipProxyAddress":"wilx@microsoft.com","state":null,"streetAddress":null,"surname":"Xu","telephoneNumber":null,"usageLocation":"US","userIdentities":[],"userPrincipalName":"wilx@microsoft.com","userType":"Member","extension_18e31482d3fb4a8ea958aa96b662f508_ZipCode":"98052","extension_18e31482d3fb4a8ea958aa96b662f508_SupervisorInd":"N","extension_18e31482d3fb4a8ea958aa96b662f508_StateProvinceCode":"WA","extension_18e31482d3fb4a8ea958aa96b662f508_ReportsToPersonnelNbr":"186027","extension_18e31482d3fb4a8ea958aa96b662f508_ReportsToFullName":"Diwan, + Mayuri","extension_18e31482d3fb4a8ea958aa96b662f508_ReportsToEmailName":"MAYURID","extension_18e31482d3fb4a8ea958aa96b662f508_ProfitCenterCode":"P10040929","extension_18e31482d3fb4a8ea958aa96b662f508_PositionNumber":"90656247","extension_18e31482d3fb4a8ea958aa96b662f508_LocationAreaCode":"US","extension_18e31482d3fb4a8ea958aa96b662f508_CountryShortCode":"US","extension_18e31482d3fb4a8ea958aa96b662f508_CostCenterCode":"10040929","extension_18e31482d3fb4a8ea958aa96b662f508_CompanyCode":"1010","extension_18e31482d3fb4a8ea958aa96b662f508_CityName":"REDMOND","extension_18e31482d3fb4a8ea958aa96b662f508_BuildingName":"18","extension_18e31482d3fb4a8ea958aa96b662f508_BuildingID":"17","extension_18e31482d3fb4a8ea958aa96b662f508_AddressLine1":"1 + Microsoft Way","extension_18e31482d3fb4a8ea958aa96b662f508_PersonnelNumber":"1241166"}'} headers: access-control-allow-origin: ['*'] cache-control: [no-cache] - content-length: ['14563'] + content-length: ['13487'] content-type: [application/json; odata=minimalmetadata; streaming=true; charset=utf-8] dataserviceversion: [3.0;] - date: ['Wed, 14 Mar 2018 22:45:53 GMT'] - duration: ['878137'] + date: ['Tue, 01 May 2018 21:47:26 GMT'] + duration: ['1254797'] expires: ['-1'] - ocp-aad-diagnostics-server-name: [ueBU+Ctw2NpjhaqIeDGmz36cCklGr4Ik3hSndonrJ8s=] - ocp-aad-session-key: [h-ou6CfY7RrfRo7vToOwUH_32odrFbJ9IYojtvtUR1Prlynw2xVjm0uMAUBGNY48W6jz5iwro_FuFfsnwiZGrdLwK7L7l5AAUXMlWgTP6EUEHfty4PiFjDjX3daZGAUd.4p7HXH8ub4gv1HKt41E47tD7csPk5CBTcXhjRz4oDOY] + ocp-aad-diagnostics-server-name: [itPlsAoHbG6osDHbVzYs2a+9kGEe205TaLepJuLRQYY=] + ocp-aad-session-key: [OgpqxwMSJJJizHeXqDwJ-bzGwpuqkBgQrFWBGCwdMMP-Z4AUSEIPeNeE3YiQTwaS4SxjS--Qk6Yj8Eoxu3pdpMw06vULma9DvW-BK4dIajLJtVq5Bg-GOTXzZsMOREsA.Vq3iqNRGq2xtGuJsX-zTrphAojKyhUjXgQNHAcYiTl4] pragma: [no-cache] - request-id: [52764719-c8a2-431d-9b57-378d3ec35f97] + request-id: [6b9e1fcd-901a-45f5-891a-a0547b042652] server: [Microsoft-IIS/10.0] strict-transport-security: [max-age=31536000; includeSubDomains] x-aspnet-version: [4.0.30319] @@ -231,7 +193,7 @@ interactions: - request: body: '{"location": "southcentralus", "properties": {"tenantId": "72f988bf-86f1-41af-91ab-2d7cd011db47", "sku": {"family": "A", "name": "standard"}, "accessPolicies": [{"tenantId": - "72f988bf-86f1-41af-91ab-2d7cd011db47", "objectId": "cdf4ba39-6a56-45be-a72a-13ec9cdfee91", + "72f988bf-86f1-41af-91ab-2d7cd011db47", "objectId": "4b1f6d49-d203-442f-bb23-06d98ab68f05", "permissions": {"keys": ["get", "create", "delete", "list", "update", "import", "backup", "restore", "recover"], "secrets": ["get", "list", "set", "delete", "backup", "restore", "recover"], "certificates": ["get", "list", "delete", "create", @@ -245,29 +207,29 @@ interactions: Connection: [keep-alive] Content-Length: ['754'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.4 (Darwin-17.4.0-x86_64-i386-64bit) requests/2.18.4 - msrest/0.4.25 msrest_azure/0.4.20 keyvaultmanagementclient/0.40.0 Azure-SDK-For-Python - AZURECLI/2.0.30] + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + msrest_azure/0.4.25 keyvaultmanagementclient/0.40.0 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.KeyVault/vaults/clitest000003?api-version=2016-10-01 response: - body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.KeyVault/vaults/clitest000003","name":"clitest000003","type":"Microsoft.KeyVault/vaults","location":"southcentralus","tags":{},"properties":{"sku":{"family":"A","name":"standard"},"tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","accessPolicies":[{"tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","objectId":"cdf4ba39-6a56-45be-a72a-13ec9cdfee91","permissions":{"keys":["get","create","delete","list","update","import","backup","restore","recover"],"secrets":["get","list","set","delete","backup","restore","recover"],"certificates":["get","list","delete","create","import","update","managecontacts","getissuers","listissuers","setissuers","deleteissuers","manageissuers","recover"],"storage":["get","list","delete","set","update","regeneratekey","setsas","listsas","getsas","deletesas"]}}],"enabledForDeployment":false,"vaultUri":"https://clitest000003.vault.azure.net","provisioningState":"RegisteringDns"}}'} + body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.KeyVault/vaults/clitest000003","name":"clitest000003","type":"Microsoft.KeyVault/vaults","location":"southcentralus","tags":{},"properties":{"sku":{"family":"A","name":"standard"},"tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","accessPolicies":[{"tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","objectId":"4b1f6d49-d203-442f-bb23-06d98ab68f05","permissions":{"keys":["get","create","delete","list","update","import","backup","restore","recover"],"secrets":["get","list","set","delete","backup","restore","recover"],"certificates":["get","list","delete","create","import","update","managecontacts","getissuers","listissuers","setissuers","deleteissuers","manageissuers","recover"],"storage":["get","list","delete","set","update","regeneratekey","setsas","listsas","getsas","deletesas"]}}],"enabledForDeployment":false,"vaultUri":"https://clitest000003.vault.azure.net","provisioningState":"RegisteringDns"}}'} headers: cache-control: [no-cache] content-length: ['1114'] content-type: [application/json; charset=utf-8] - date: ['Wed, 14 Mar 2018 22:45:55 GMT'] + date: ['Tue, 01 May 2018 21:47:28 GMT'] expires: ['-1'] pragma: [no-cache] - server: [Microsoft-IIS/8.5] + server: [Microsoft-IIS/10.0] strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] x-aspnet-version: [4.0.30319] x-content-type-options: [nosniff] - x-ms-keyvault-service-version: [1.0.0.210] - x-ms-ratelimit-remaining-subscription-writes: ['1199'] + x-ms-keyvault-service-version: [1.0.0.215] + x-ms-ratelimit-remaining-subscription-writes: ['1196'] x-powered-by: [ASP.NET] status: {code: 200, message: OK} - request: @@ -278,28 +240,28 @@ interactions: CommandName: [keyvault show] Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.4 (Darwin-17.4.0-x86_64-i386-64bit) requests/2.18.4 - msrest/0.4.25 msrest_azure/0.4.20 keyvaultmanagementclient/0.40.0 Azure-SDK-For-Python - AZURECLI/2.0.30] + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + msrest_azure/0.4.25 keyvaultmanagementclient/0.40.0 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.KeyVault/vaults/clitest000003?api-version=2016-10-01 response: - body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.KeyVault/vaults/clitest000003","name":"clitest000003","type":"Microsoft.KeyVault/vaults","location":"southcentralus","tags":{},"properties":{"sku":{"family":"A","name":"standard"},"tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","accessPolicies":[{"tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","objectId":"cdf4ba39-6a56-45be-a72a-13ec9cdfee91","permissions":{"keys":["get","create","delete","list","update","import","backup","restore","recover"],"secrets":["get","list","set","delete","backup","restore","recover"],"certificates":["get","list","delete","create","import","update","managecontacts","getissuers","listissuers","setissuers","deleteissuers","manageissuers","recover"],"storage":["get","list","delete","set","update","regeneratekey","setsas","listsas","getsas","deletesas"]}}],"enabledForDeployment":false,"vaultUri":"https://clitest000003.vault.azure.net/","provisioningState":"RegisteringDns"}}'} + body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.KeyVault/vaults/clitest000003","name":"clitest000003","type":"Microsoft.KeyVault/vaults","location":"southcentralus","tags":{},"properties":{"sku":{"family":"A","name":"standard"},"tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","accessPolicies":[{"tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","objectId":"4b1f6d49-d203-442f-bb23-06d98ab68f05","permissions":{"keys":["get","create","delete","list","update","import","backup","restore","recover"],"secrets":["get","list","set","delete","backup","restore","recover"],"certificates":["get","list","delete","create","import","update","managecontacts","getissuers","listissuers","setissuers","deleteissuers","manageissuers","recover"],"storage":["get","list","delete","set","update","regeneratekey","setsas","listsas","getsas","deletesas"]}}],"enabledForDeployment":false,"vaultUri":"https://clitest000003.vault.azure.net/","provisioningState":"RegisteringDns"}}'} headers: cache-control: [no-cache] content-length: ['1115'] content-type: [application/json; charset=utf-8] - date: ['Wed, 14 Mar 2018 22:45:57 GMT'] + date: ['Tue, 01 May 2018 21:47:29 GMT'] expires: ['-1'] pragma: [no-cache] - server: [Microsoft-IIS/8.5] + server: [Microsoft-IIS/10.0] strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] x-aspnet-version: [4.0.30319] x-content-type-options: [nosniff] - x-ms-keyvault-service-version: [1.0.0.210] + x-ms-keyvault-service-version: [1.0.0.215] x-powered-by: [ASP.NET] status: {code: 200, message: OK} - request: @@ -310,8 +272,8 @@ interactions: Connection: [keep-alive] Content-Length: ['47'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.4 (Darwin-17.4.0-x86_64-i386-64bit) requests/2.18.4 - msrest/0.4.25 msrest_azure/0.4.20 keyvaultclient/0.3.7 Azure-SDK-For-Python] + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + msrest_azure/0.4.25 keyvaultclient/0.3.7 Azure-SDK-For-Python] accept-language: [en-US] method: POST uri: https://clitest000003.vault.azure.net/keys/testkey/create?api-version=2016-10-01 @@ -320,17 +282,18 @@ interactions: headers: cache-control: [no-cache] content-length: ['0'] - date: ['Wed, 14 Mar 2018 22:45:57 GMT'] + date: ['Tue, 01 May 2018 21:47:30 GMT'] expires: ['-1'] pragma: [no-cache] - server: [Microsoft-IIS/8.5] + server: [Microsoft-IIS/10.0] strict-transport-security: [max-age=31536000;includeSubDomains] www-authenticate: ['Bearer authorization="https://login.windows.net/72f988bf-86f1-41af-91ab-2d7cd011db47", resource="https://vault.azure.net"'] x-aspnet-version: [4.0.30319] x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=167.220.1.116;act_addr_fam=InterNetwork;] x-ms-keyvault-region: [southcentralus] - x-ms-keyvault-service-version: [1.0.0.841] + x-ms-keyvault-service-version: [1.0.0.847] x-powered-by: [ASP.NET] status: {code: 401, message: Unauthorized} - request: @@ -341,26 +304,27 @@ interactions: Connection: [keep-alive] Content-Length: ['47'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.4 (Darwin-17.4.0-x86_64-i386-64bit) requests/2.18.4 - msrest/0.4.25 msrest_azure/0.4.20 keyvaultclient/0.3.7 Azure-SDK-For-Python] + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + msrest_azure/0.4.25 keyvaultclient/0.3.7 Azure-SDK-For-Python] accept-language: [en-US] method: POST uri: https://clitest000003.vault.azure.net/keys/testkey/create?api-version=2016-10-01 response: - body: {string: '{"key":{"kid":"https://clitest000003.vault.azure.net/keys/testkey/fff5a9c679664908a6675a10b9c8d952","kty":"RSA","key_ops":["encrypt","decrypt","sign","verify","wrapKey","unwrapKey"],"n":"qSSdSr77XJK9X6GDUX9wYDM_tWyBuYm4N5nliCs1UE5KgzDm-hs-ko-YndG1YFuf6AcXQBDftYaXN_AeCEtRkEyCMFtGeZ2FGOkLdattLm4paZAzUEN7_x4GFMVPI6-F052Vso-SswgvcqDo2PFLTv4_c6xDFHun0E12mwXfcI5nXeK5Awmvo4KiZUNvHBaldb1hEyqi-UR4L559Hf6ksMEnVCnPU7NO9o8Sq0dknnzFFAUVnWPGgLi6Ktka-ZYghPHdyl-2u1V1BOR0hzdg-ktFxRkmPWxqa048upiFxxdvpgwZWabEG1aw3TkckdwPMkn72TPgmNI5TTtLh896vw","e":"AQAB"},"attributes":{"enabled":true,"created":1521067558,"updated":1521067558,"recoveryLevel":"Purgeable"}}'} + body: {string: '{"key":{"kid":"https://clitest000003.vault.azure.net/keys/testkey/f99dcad9b19d4839be3296fd333700a9","kty":"RSA","key_ops":["encrypt","decrypt","sign","verify","wrapKey","unwrapKey"],"n":"r9OTl9V1DpLm1W8tKktiO6lSvXSDZaKGh8yamAJWaIk4yWvFm983fAsTys0Jr6xxauUVTg6tRXjhkDm45em4J8oRwdnDyYWkUWwl98EKZiSy0EvvcVK2e5wY3Q9aiIfRsBF2ctw9yu7g_ARtc7cMS2OPN-WVQutm8Sz5-NihxedjpktsXRjI224sAzlN2U_Qztow3d78i7T-3pbSNEX_4RL-iIbd4VFvzlT-qAA6vYhA5smXRCnK-piEVqpAW0vawx26UnRwxu-_T69LERBIBoRmnPFBznUyW7QRIWzm9c0ariEsSsDvom2FrCDvrl9T79AkJT3OFejpgY3T6xsuqw","e":"AQAB"},"attributes":{"enabled":true,"created":1525211251,"updated":1525211251,"recoveryLevel":"Purgeable"}}'} headers: cache-control: [no-cache] content-length: ['654'] content-type: [application/json; charset=utf-8] - date: ['Wed, 14 Mar 2018 22:45:57 GMT'] + date: ['Tue, 01 May 2018 21:47:31 GMT'] expires: ['-1'] pragma: [no-cache] - server: [Microsoft-IIS/8.5] + server: [Microsoft-IIS/10.0] strict-transport-security: [max-age=31536000;includeSubDomains] x-aspnet-version: [4.0.30319] x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=167.220.1.116;act_addr_fam=InterNetwork;] x-ms-keyvault-region: [southcentralus] - x-ms-keyvault-service-version: [1.0.0.841] + x-ms-keyvault-service-version: [1.0.0.847] x-powered-by: [ASP.NET] status: {code: 200, message: OK} - request: @@ -371,19 +335,18 @@ interactions: CommandName: [storage account update] Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.4 (Darwin-17.4.0-x86_64-i386-64bit) requests/2.18.4 - msrest/0.4.25 msrest_azure/0.4.20 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python - AZURECLI/2.0.30] + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002?api-version=2017-10-01 response: - body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"southcentralus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-03-14T22:45:16.8414059Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-03-14T22:45:16.8414059Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-03-14T22:45:16.8101562Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"southcentralus","statusOfPrimary":"available"}}'} + body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"southcentralus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:47:05.9534027Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:47:05.9534027Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:47:05.9065524Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"southcentralus","statusOfPrimary":"available"}}'} headers: cache-control: [no-cache] content-length: ['1247'] content-type: [application/json] - date: ['Wed, 14 Mar 2018 22:45:58 GMT'] + date: ['Tue, 01 May 2018 21:47:32 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -406,19 +369,18 @@ interactions: Connection: [keep-alive] Content-Length: ['366'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.4 (Darwin-17.4.0-x86_64-i386-64bit) requests/2.18.4 - msrest/0.4.25 msrest_azure/0.4.20 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python - AZURECLI/2.0.30] + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: PATCH uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002?api-version=2017-10-01 response: - body: {string: '{"identity":{"principalId":"739fc607-0f9e-40c8-a69b-84bb547e3751","tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","type":"SystemAssigned"},"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"southcentralus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-03-14T22:45:16.8414059Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-03-14T22:45:16.8414059Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-03-14T22:45:16.8101562Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"southcentralus","statusOfPrimary":"available"}}'} + body: {string: '{"identity":{"principalId":"f9dda2cf-e03f-4a7a-a8ea-7411041143de","tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","type":"SystemAssigned"},"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"southcentralus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:47:05.9534027Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:47:05.9534027Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:47:05.9065524Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"southcentralus","statusOfPrimary":"available"}}'} headers: cache-control: [no-cache] content-length: ['1387'] content-type: [application/json] - date: ['Wed, 14 Mar 2018 22:46:01 GMT'] + date: ['Tue, 01 May 2018 21:47:34 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -427,7 +389,7 @@ interactions: transfer-encoding: [chunked] vary: [Accept-Encoding] x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-writes: ['1198'] + x-ms-ratelimit-remaining-subscription-writes: ['1196'] status: {code: 200, message: OK} - request: body: null @@ -437,42 +399,42 @@ interactions: CommandName: [keyvault set-policy] Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.4 (Darwin-17.4.0-x86_64-i386-64bit) requests/2.18.4 - msrest/0.4.25 msrest_azure/0.4.20 keyvaultmanagementclient/0.40.0 Azure-SDK-For-Python - AZURECLI/2.0.30] + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + msrest_azure/0.4.25 keyvaultmanagementclient/0.40.0 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.KeyVault/vaults/clitest000003?api-version=2016-10-01 response: - body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.KeyVault/vaults/clitest000003","name":"clitest000003","type":"Microsoft.KeyVault/vaults","location":"southcentralus","tags":{},"properties":{"sku":{"family":"A","name":"standard"},"tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","accessPolicies":[{"tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","objectId":"cdf4ba39-6a56-45be-a72a-13ec9cdfee91","permissions":{"keys":["get","create","delete","list","update","import","backup","restore","recover"],"secrets":["get","list","set","delete","backup","restore","recover"],"certificates":["get","list","delete","create","import","update","managecontacts","getissuers","listissuers","setissuers","deleteissuers","manageissuers","recover"],"storage":["get","list","delete","set","update","regeneratekey","setsas","listsas","getsas","deletesas"]}}],"enabledForDeployment":false,"vaultUri":"https://clitest000003.vault.azure.net/","provisioningState":"RegisteringDns"}}'} + body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.KeyVault/vaults/clitest000003","name":"clitest000003","type":"Microsoft.KeyVault/vaults","location":"southcentralus","tags":{},"properties":{"sku":{"family":"A","name":"standard"},"tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","accessPolicies":[{"tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","objectId":"4b1f6d49-d203-442f-bb23-06d98ab68f05","permissions":{"keys":["get","create","delete","list","update","import","backup","restore","recover"],"secrets":["get","list","set","delete","backup","restore","recover"],"certificates":["get","list","delete","create","import","update","managecontacts","getissuers","listissuers","setissuers","deleteissuers","manageissuers","recover"],"storage":["get","list","delete","set","update","regeneratekey","setsas","listsas","getsas","deletesas"]}}],"enabledForDeployment":false,"vaultUri":"https://clitest000003.vault.azure.net/","provisioningState":"RegisteringDns"}}'} headers: cache-control: [no-cache] content-length: ['1115'] content-type: [application/json; charset=utf-8] - date: ['Wed, 14 Mar 2018 22:46:02 GMT'] + date: ['Tue, 01 May 2018 21:47:35 GMT'] expires: ['-1'] pragma: [no-cache] - server: [Microsoft-IIS/8.5] + server: [Microsoft-IIS/10.0] strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] x-aspnet-version: [4.0.30319] x-content-type-options: [nosniff] - x-ms-keyvault-service-version: [1.0.0.210] + x-ms-keyvault-service-version: [1.0.0.215] x-powered-by: [ASP.NET] status: {code: 200, message: OK} - request: body: 'b''{"location": "southcentralus", "tags": {}, "properties": {"tenantId": "72f988bf-86f1-41af-91ab-2d7cd011db47", "sku": {"family": "A", "name": "standard"}, "accessPolicies": [{"tenantId": "72f988bf-86f1-41af-91ab-2d7cd011db47", "objectId": - "cdf4ba39-6a56-45be-a72a-13ec9cdfee91", "permissions": {"keys": ["get", "create", + "4b1f6d49-d203-442f-bb23-06d98ab68f05", "permissions": {"keys": ["get", "create", "delete", "list", "update", "import", "backup", "restore", "recover"], "secrets": ["get", "list", "set", "delete", "backup", "restore", "recover"], "certificates": ["get", "list", "delete", "create", "import", "update", "managecontacts", "getissuers", "listissuers", "setissuers", "deleteissuers", "manageissuers", "recover"], "storage": ["get", "list", "delete", "set", "update", "regeneratekey", "setsas", "listsas", "getsas", "deletesas"]}}, {"tenantId": "72f988bf-86f1-41af-91ab-2d7cd011db47", - "objectId": "739fc607-0f9e-40c8-a69b-84bb547e3751", "permissions": {"keys": + "objectId": "f9dda2cf-e03f-4a7a-a8ea-7411041143de", "permissions": {"keys": ["get", "wrapKey", "unwrapKey", "recover"]}}], "vaultUri": "https://clitest000003.vault.azure.net/", "enabledForDeployment": false}}''' headers: @@ -482,28 +444,28 @@ interactions: Connection: [keep-alive] Content-Length: ['1037'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.4 (Darwin-17.4.0-x86_64-i386-64bit) requests/2.18.4 - msrest/0.4.25 msrest_azure/0.4.20 keyvaultmanagementclient/0.40.0 Azure-SDK-For-Python - AZURECLI/2.0.30] + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + msrest_azure/0.4.25 keyvaultmanagementclient/0.40.0 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.KeyVault/vaults/clitest000003?api-version=2016-10-01 response: - body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.KeyVault/vaults/clitest000003","name":"clitest000003","type":"Microsoft.KeyVault/vaults","location":"southcentralus","tags":{},"properties":{"sku":{"family":"A","name":"standard"},"tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","accessPolicies":[{"tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","objectId":"cdf4ba39-6a56-45be-a72a-13ec9cdfee91","permissions":{"keys":["get","create","delete","list","update","import","backup","restore","recover"],"secrets":["get","list","set","delete","backup","restore","recover"],"certificates":["get","list","delete","create","import","update","managecontacts","getissuers","listissuers","setissuers","deleteissuers","manageissuers","recover"],"storage":["get","list","delete","set","update","regeneratekey","setsas","listsas","getsas","deletesas"]}},{"tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","objectId":"739fc607-0f9e-40c8-a69b-84bb547e3751","permissions":{"keys":["get","wrapKey","unwrapKey","recover"]}}],"enabledForDeployment":false,"vaultUri":"https://clitest000003.vault.azure.net/","provisioningState":"RegisteringDns"}}'} + body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.KeyVault/vaults/clitest000003","name":"clitest000003","type":"Microsoft.KeyVault/vaults","location":"southcentralus","tags":{},"properties":{"sku":{"family":"A","name":"standard"},"tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","accessPolicies":[{"tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","objectId":"4b1f6d49-d203-442f-bb23-06d98ab68f05","permissions":{"keys":["get","create","delete","list","update","import","backup","restore","recover"],"secrets":["get","list","set","delete","backup","restore","recover"],"certificates":["get","list","delete","create","import","update","managecontacts","getissuers","listissuers","setissuers","deleteissuers","manageissuers","recover"],"storage":["get","list","delete","set","update","regeneratekey","setsas","listsas","getsas","deletesas"]}},{"tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","objectId":"f9dda2cf-e03f-4a7a-a8ea-7411041143de","permissions":{"keys":["get","wrapKey","unwrapKey","recover"]}}],"enabledForDeployment":false,"vaultUri":"https://clitest000003.vault.azure.net/","provisioningState":"RegisteringDns"}}'} headers: cache-control: [no-cache] content-length: ['1280'] content-type: [application/json; charset=utf-8] - date: ['Wed, 14 Mar 2018 22:46:03 GMT'] + date: ['Tue, 01 May 2018 21:47:35 GMT'] expires: ['-1'] pragma: [no-cache] - server: [Microsoft-IIS/8.5] + server: [Microsoft-IIS/10.0] strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] x-aspnet-version: [4.0.30319] x-content-type-options: [nosniff] - x-ms-keyvault-service-version: [1.0.0.210] + x-ms-keyvault-service-version: [1.0.0.215] x-ms-ratelimit-remaining-subscription-writes: ['1198'] x-powered-by: [ASP.NET] status: {code: 200, message: OK} @@ -515,41 +477,41 @@ interactions: CommandName: [keyvault update] Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.4 (Darwin-17.4.0-x86_64-i386-64bit) requests/2.18.4 - msrest/0.4.25 msrest_azure/0.4.20 keyvaultmanagementclient/0.40.0 Azure-SDK-For-Python - AZURECLI/2.0.30] + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + msrest_azure/0.4.25 keyvaultmanagementclient/0.40.0 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.KeyVault/vaults/clitest000003?api-version=2016-10-01 response: - body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.KeyVault/vaults/clitest000003","name":"clitest000003","type":"Microsoft.KeyVault/vaults","location":"southcentralus","tags":{},"properties":{"sku":{"family":"A","name":"standard"},"tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","accessPolicies":[{"tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","objectId":"cdf4ba39-6a56-45be-a72a-13ec9cdfee91","permissions":{"keys":["get","create","delete","list","update","import","backup","restore","recover"],"secrets":["get","list","set","delete","backup","restore","recover"],"certificates":["get","list","delete","create","import","update","managecontacts","getissuers","listissuers","setissuers","deleteissuers","manageissuers","recover"],"storage":["get","list","delete","set","update","regeneratekey","setsas","listsas","getsas","deletesas"]}},{"tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","objectId":"739fc607-0f9e-40c8-a69b-84bb547e3751","permissions":{"keys":["get","wrapKey","unwrapKey","recover"]}}],"enabledForDeployment":false,"vaultUri":"https://clitest000003.vault.azure.net/","provisioningState":"RegisteringDns"}}'} + body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.KeyVault/vaults/clitest000003","name":"clitest000003","type":"Microsoft.KeyVault/vaults","location":"southcentralus","tags":{},"properties":{"sku":{"family":"A","name":"standard"},"tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","accessPolicies":[{"tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","objectId":"4b1f6d49-d203-442f-bb23-06d98ab68f05","permissions":{"keys":["get","create","delete","list","update","import","backup","restore","recover"],"secrets":["get","list","set","delete","backup","restore","recover"],"certificates":["get","list","delete","create","import","update","managecontacts","getissuers","listissuers","setissuers","deleteissuers","manageissuers","recover"],"storage":["get","list","delete","set","update","regeneratekey","setsas","listsas","getsas","deletesas"]}},{"tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","objectId":"f9dda2cf-e03f-4a7a-a8ea-7411041143de","permissions":{"keys":["get","wrapKey","unwrapKey","recover"]}}],"enabledForDeployment":false,"vaultUri":"https://clitest000003.vault.azure.net/","provisioningState":"RegisteringDns"}}'} headers: cache-control: [no-cache] content-length: ['1280'] content-type: [application/json; charset=utf-8] - date: ['Wed, 14 Mar 2018 22:46:03 GMT'] + date: ['Tue, 01 May 2018 21:47:36 GMT'] expires: ['-1'] pragma: [no-cache] - server: [Microsoft-IIS/8.5] + server: [Microsoft-IIS/10.0] strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] x-aspnet-version: [4.0.30319] x-content-type-options: [nosniff] - x-ms-keyvault-service-version: [1.0.0.210] + x-ms-keyvault-service-version: [1.0.0.215] x-powered-by: [ASP.NET] status: {code: 200, message: OK} - request: body: 'b''{"location": "southcentralus", "properties": {"tenantId": "72f988bf-86f1-41af-91ab-2d7cd011db47", "sku": {"family": "A", "name": "standard"}, "accessPolicies": [{"tenantId": - "72f988bf-86f1-41af-91ab-2d7cd011db47", "objectId": "cdf4ba39-6a56-45be-a72a-13ec9cdfee91", + "72f988bf-86f1-41af-91ab-2d7cd011db47", "objectId": "4b1f6d49-d203-442f-bb23-06d98ab68f05", "permissions": {"keys": ["get", "create", "delete", "list", "update", "import", "backup", "restore", "recover"], "secrets": ["get", "list", "set", "delete", "backup", "restore", "recover"], "certificates": ["get", "list", "delete", "create", "import", "update", "managecontacts", "getissuers", "listissuers", "setissuers", "deleteissuers", "manageissuers", "recover"], "storage": ["get", "list", "delete", "set", "update", "regeneratekey", "setsas", "listsas", "getsas", "deletesas"]}}, - {"tenantId": "72f988bf-86f1-41af-91ab-2d7cd011db47", "objectId": "739fc607-0f9e-40c8-a69b-84bb547e3751", + {"tenantId": "72f988bf-86f1-41af-91ab-2d7cd011db47", "objectId": "f9dda2cf-e03f-4a7a-a8ea-7411041143de", "permissions": {"keys": ["get", "wrapKey", "unwrapKey", "recover"]}}], "vaultUri": "https://clitest000003.vault.azure.net/", "enabledForDeployment": false, "enableSoftDelete": true}}''' @@ -560,29 +522,29 @@ interactions: Connection: [keep-alive] Content-Length: ['1051'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.4 (Darwin-17.4.0-x86_64-i386-64bit) requests/2.18.4 - msrest/0.4.25 msrest_azure/0.4.20 keyvaultmanagementclient/0.40.0 Azure-SDK-For-Python - AZURECLI/2.0.30] + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + msrest_azure/0.4.25 keyvaultmanagementclient/0.40.0 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.KeyVault/vaults/clitest000003?api-version=2016-10-01 response: - body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.KeyVault/vaults/clitest000003","name":"clitest000003","type":"Microsoft.KeyVault/vaults","location":"southcentralus","tags":{},"properties":{"sku":{"family":"A","name":"standard"},"tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","accessPolicies":[{"tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","objectId":"cdf4ba39-6a56-45be-a72a-13ec9cdfee91","permissions":{"keys":["get","create","delete","list","update","import","backup","restore","recover"],"secrets":["get","list","set","delete","backup","restore","recover"],"certificates":["get","list","delete","create","import","update","managecontacts","getissuers","listissuers","setissuers","deleteissuers","manageissuers","recover"],"storage":["get","list","delete","set","update","regeneratekey","setsas","listsas","getsas","deletesas"]}},{"tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","objectId":"739fc607-0f9e-40c8-a69b-84bb547e3751","permissions":{"keys":["get","wrapKey","unwrapKey","recover"]}}],"enabledForDeployment":false,"enableSoftDelete":true,"vaultUri":"https://clitest000003.vault.azure.net/","provisioningState":"RegisteringDns"}}'} + body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.KeyVault/vaults/clitest000003","name":"clitest000003","type":"Microsoft.KeyVault/vaults","location":"southcentralus","tags":{},"properties":{"sku":{"family":"A","name":"standard"},"tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","accessPolicies":[{"tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","objectId":"4b1f6d49-d203-442f-bb23-06d98ab68f05","permissions":{"keys":["get","create","delete","list","update","import","backup","restore","recover"],"secrets":["get","list","set","delete","backup","restore","recover"],"certificates":["get","list","delete","create","import","update","managecontacts","getissuers","listissuers","setissuers","deleteissuers","manageissuers","recover"],"storage":["get","list","delete","set","update","regeneratekey","setsas","listsas","getsas","deletesas"]}},{"tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","objectId":"f9dda2cf-e03f-4a7a-a8ea-7411041143de","permissions":{"keys":["get","wrapKey","unwrapKey","recover"]}}],"enabledForDeployment":false,"enableSoftDelete":true,"vaultUri":"https://clitest000003.vault.azure.net/","provisioningState":"RegisteringDns"}}'} headers: cache-control: [no-cache] content-length: ['1304'] content-type: [application/json; charset=utf-8] - date: ['Wed, 14 Mar 2018 22:46:04 GMT'] + date: ['Tue, 01 May 2018 21:47:36 GMT'] expires: ['-1'] pragma: [no-cache] - server: [Microsoft-IIS/8.5] + server: [Microsoft-IIS/10.0] strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] x-aspnet-version: [4.0.30319] x-content-type-options: [nosniff] - x-ms-keyvault-service-version: [1.0.0.210] - x-ms-ratelimit-remaining-subscription-writes: ['1197'] + x-ms-keyvault-service-version: [1.0.0.215] + x-ms-ratelimit-remaining-subscription-writes: ['1199'] x-powered-by: [ASP.NET] status: {code: 200, message: OK} - request: @@ -593,9 +555,9 @@ interactions: CommandName: [resource update] Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.4 (Darwin-17.4.0-x86_64-i386-64bit) requests/2.18.4 - msrest/0.4.25 msrest_azure/0.4.20 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.30] + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.KeyVault?api-version=2017-05-10 @@ -605,38 +567,50 @@ interactions: Asia","East US 2","Central US","South Central US","West US","Japan East","Japan West","Australia East","Australia Southeast","Brazil South","Central India","South India","West India","Canada Central","Canada East","UK South","UK West","West - Central US","West US 2","Korea Central","Korea South","France Central"],"apiVersions":["2018-02-14-preview","2016-10-01","2015-06-01"],"capabilities":"CrossResourceGroupResourceMove, + Central US","West US 2","Korea Central","Korea South","France Central","East + US 2 EUAP","Central US EUAP"],"apiVersions":["2018-02-14-preview","2016-10-01","2015-06-01"],"apiProfiles":[{"profileVersion":"2018-03-01-hybrid","apiVersion":"2016-10-01"}],"capabilities":"CrossResourceGroupResourceMove, CrossSubscriptionResourceMove"},{"resourceType":"vaults/secrets","locations":["North Central US","East US","North Europe","West Europe","East Asia","Southeast Asia","East US 2","Central US","South Central US","West US","Japan East","Japan West","Australia East","Australia Southeast","Brazil South","Central India","South India","West India","Canada Central","Canada East","UK South","UK West","West - Central US","West US 2","Korea Central","Korea South","France Central"],"apiVersions":["2018-02-14-preview","2016-10-01","2015-06-01"]},{"resourceType":"vaults/accessPolicies","locations":["North + Central US","West US 2","Korea Central","Korea South","France Central","East + US 2 EUAP","Central US EUAP"],"apiVersions":["2018-02-14-preview","2016-10-01","2015-06-01"],"apiProfiles":[{"profileVersion":"2018-03-01-hybrid","apiVersion":"2016-10-01"}]},{"resourceType":"vaults/accessPolicies","locations":["North Central US","East US","North Europe","West Europe","East Asia","Southeast Asia","East US 2","Central US","South Central US","West US","Japan East","Japan West","Australia East","Australia Southeast","Brazil South","Central India","South India","West India","Canada Central","Canada East","UK South","UK West","West - Central US","West US 2","Korea Central","Korea South","France Central"],"apiVersions":["2018-02-14-preview","2016-10-01","2015-06-01"]},{"resourceType":"operations","locations":[],"apiVersions":["2018-02-14-preview","2016-10-01","2015-06-01","2014-12-19-preview"]},{"resourceType":"checkNameAvailability","locations":[],"apiVersions":["2018-02-14-preview","2016-10-01","2015-06-01"]},{"resourceType":"deletedVaults","locations":["North + Central US","West US 2","Korea Central","Korea South","France Central","East + US 2 EUAP","Central US EUAP"],"apiVersions":["2018-02-14-preview","2016-10-01","2015-06-01"],"apiProfiles":[{"profileVersion":"2018-03-01-hybrid","apiVersion":"2016-10-01"}]},{"resourceType":"operations","locations":[],"apiVersions":["2018-02-14-preview","2016-10-01","2015-06-01","2014-12-19-preview"],"apiProfiles":[{"profileVersion":"2018-03-01-hybrid","apiVersion":"2016-10-01"}]},{"resourceType":"checkNameAvailability","locations":[],"apiVersions":["2018-02-14-preview","2016-10-01","2015-06-01"]},{"resourceType":"deletedVaults","locations":["North Central US","East US","North Europe","West Europe","East Asia","Southeast Asia","East US 2","Central US","South Central US","West US","Japan East","Japan West","Australia East","Australia Southeast","Brazil South","Central India","South India","West India","Canada Central","Canada East","UK South","UK West","West - Central US","West US 2","Korea Central","Korea South","France Central"],"apiVersions":["2018-02-14-preview","2016-10-01"]},{"resourceType":"locations","locations":[],"apiVersions":["2018-02-14-preview","2016-10-01"]},{"resourceType":"locations/deletedVaults","locations":["North + Central US","West US 2","Korea Central","Korea South","France Central","East + US 2 EUAP","Central US EUAP"],"apiVersions":["2018-02-14-preview","2016-10-01"]},{"resourceType":"locations","locations":[],"apiVersions":["2018-02-14-preview","2016-10-01"]},{"resourceType":"locations/deletedVaults","locations":["North Central US","East US","North Europe","West Europe","East Asia","Southeast Asia","East US 2","Central US","South Central US","West US","Japan East","Japan West","Australia East","Australia Southeast","Brazil South","Central India","South India","West India","Canada Central","Canada East","UK South","UK West","West - Central US","West US 2","Korea Central","Korea South","France Central"],"apiVersions":["2018-02-14-preview","2016-10-01"]},{"resourceType":"locations/operationResults","locations":["North + Central US","West US 2","Korea Central","Korea South","France Central","East + US 2 EUAP","Central US EUAP"],"apiVersions":["2018-02-14-preview","2016-10-01"]},{"resourceType":"locations/deleteVirtualNetworkOrSubnets","locations":["East + US","North Central US","West Europe","North Europe","East Asia","Southeast + Asia","East US 2","Central US","South Central US","West Central US","West + US 2","West US","Japan East","Japan West","Australia East","Australia Southeast","Brazil + South","Central India","South India","West India","Canada Central","Canada + East","UK South","UK West","Korea Central","Korea South","France Central","Central + US EUAP","East US 2 EUAP"],"apiVersions":["2018-02-14-preview","2016-10-01"]},{"resourceType":"locations/operationResults","locations":["North Central US","East US","North Europe","West Europe","East Asia","Southeast Asia","East US 2","Central US","South Central US","West US","Japan East","Japan West","Australia East","Australia Southeast","Brazil South","Central India","South India","West India","Canada Central","Canada East","UK South","UK West","West - Central US","West US 2","Korea Central","Korea South","France Central"],"apiVersions":["2018-02-14-preview","2016-10-01"]}],"registrationState":"Registered"}'} + Central US","West US 2","Korea Central","Korea South","France Central","East + US 2 EUAP","Central US EUAP"],"apiVersions":["2018-02-14-preview","2016-10-01"]}],"registrationState":"Registered"}'} headers: cache-control: [no-cache] - content-length: ['3732'] + content-length: ['4817'] content-type: [application/json; charset=utf-8] - date: ['Wed, 14 Mar 2018 22:46:04 GMT'] + date: ['Tue, 01 May 2018 21:47:37 GMT'] expires: ['-1'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] @@ -651,28 +625,28 @@ interactions: CommandName: [resource update] Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.4 (Darwin-17.4.0-x86_64-i386-64bit) requests/2.18.4 - msrest/0.4.25 msrest_azure/0.4.20 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.30] + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001/providers/Microsoft.KeyVault/vaults/clitest000003?api-version=2016-10-01 response: - body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.KeyVault/vaults/clitest000003","name":"clitest000003","type":"Microsoft.KeyVault/vaults","location":"southcentralus","tags":{},"properties":{"sku":{"family":"A","name":"standard"},"tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","accessPolicies":[{"tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","objectId":"cdf4ba39-6a56-45be-a72a-13ec9cdfee91","permissions":{"keys":["get","create","delete","list","update","import","backup","restore","recover"],"secrets":["get","list","set","delete","backup","restore","recover"],"certificates":["get","list","delete","create","import","update","managecontacts","getissuers","listissuers","setissuers","deleteissuers","manageissuers","recover"],"storage":["get","list","delete","set","update","regeneratekey","setsas","listsas","getsas","deletesas"]}},{"tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","objectId":"739fc607-0f9e-40c8-a69b-84bb547e3751","permissions":{"keys":["get","wrapKey","unwrapKey","recover"]}}],"enabledForDeployment":false,"enableSoftDelete":true,"vaultUri":"https://clitest000003.vault.azure.net/","provisioningState":"RegisteringDns"}}'} + body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.KeyVault/vaults/clitest000003","name":"clitest000003","type":"Microsoft.KeyVault/vaults","location":"southcentralus","tags":{},"properties":{"sku":{"family":"A","name":"standard"},"tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","accessPolicies":[{"tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","objectId":"4b1f6d49-d203-442f-bb23-06d98ab68f05","permissions":{"keys":["get","create","delete","list","update","import","backup","restore","recover"],"secrets":["get","list","set","delete","backup","restore","recover"],"certificates":["get","list","delete","create","import","update","managecontacts","getissuers","listissuers","setissuers","deleteissuers","manageissuers","recover"],"storage":["get","list","delete","set","update","regeneratekey","setsas","listsas","getsas","deletesas"]}},{"tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","objectId":"f9dda2cf-e03f-4a7a-a8ea-7411041143de","permissions":{"keys":["get","wrapKey","unwrapKey","recover"]}}],"enabledForDeployment":false,"enableSoftDelete":true,"vaultUri":"https://clitest000003.vault.azure.net/","provisioningState":"RegisteringDns"}}'} headers: cache-control: [no-cache] content-length: ['1304'] content-type: [application/json; charset=utf-8] - date: ['Wed, 14 Mar 2018 22:46:05 GMT'] + date: ['Tue, 01 May 2018 21:47:38 GMT'] expires: ['-1'] pragma: [no-cache] - server: [Microsoft-IIS/8.5] + server: [Microsoft-IIS/10.0] strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] x-aspnet-version: [4.0.30319] x-content-type-options: [nosniff] - x-ms-keyvault-service-version: [1.0.0.210] + x-ms-keyvault-service-version: [1.0.0.215] x-powered-by: [ASP.NET] status: {code: 200, message: OK} - request: @@ -683,9 +657,9 @@ interactions: CommandName: [resource update] Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.4 (Darwin-17.4.0-x86_64-i386-64bit) requests/2.18.4 - msrest/0.4.25 msrest_azure/0.4.20 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.30] + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.KeyVault?api-version=2017-05-10 @@ -695,38 +669,50 @@ interactions: Asia","East US 2","Central US","South Central US","West US","Japan East","Japan West","Australia East","Australia Southeast","Brazil South","Central India","South India","West India","Canada Central","Canada East","UK South","UK West","West - Central US","West US 2","Korea Central","Korea South","France Central"],"apiVersions":["2018-02-14-preview","2016-10-01","2015-06-01"],"capabilities":"CrossResourceGroupResourceMove, + Central US","West US 2","Korea Central","Korea South","France Central","East + US 2 EUAP","Central US EUAP"],"apiVersions":["2018-02-14-preview","2016-10-01","2015-06-01"],"apiProfiles":[{"profileVersion":"2018-03-01-hybrid","apiVersion":"2016-10-01"}],"capabilities":"CrossResourceGroupResourceMove, CrossSubscriptionResourceMove"},{"resourceType":"vaults/secrets","locations":["North Central US","East US","North Europe","West Europe","East Asia","Southeast Asia","East US 2","Central US","South Central US","West US","Japan East","Japan West","Australia East","Australia Southeast","Brazil South","Central India","South India","West India","Canada Central","Canada East","UK South","UK West","West - Central US","West US 2","Korea Central","Korea South","France Central"],"apiVersions":["2018-02-14-preview","2016-10-01","2015-06-01"]},{"resourceType":"vaults/accessPolicies","locations":["North + Central US","West US 2","Korea Central","Korea South","France Central","East + US 2 EUAP","Central US EUAP"],"apiVersions":["2018-02-14-preview","2016-10-01","2015-06-01"],"apiProfiles":[{"profileVersion":"2018-03-01-hybrid","apiVersion":"2016-10-01"}]},{"resourceType":"vaults/accessPolicies","locations":["North Central US","East US","North Europe","West Europe","East Asia","Southeast Asia","East US 2","Central US","South Central US","West US","Japan East","Japan West","Australia East","Australia Southeast","Brazil South","Central India","South India","West India","Canada Central","Canada East","UK South","UK West","West - Central US","West US 2","Korea Central","Korea South","France Central"],"apiVersions":["2018-02-14-preview","2016-10-01","2015-06-01"]},{"resourceType":"operations","locations":[],"apiVersions":["2018-02-14-preview","2016-10-01","2015-06-01","2014-12-19-preview"]},{"resourceType":"checkNameAvailability","locations":[],"apiVersions":["2018-02-14-preview","2016-10-01","2015-06-01"]},{"resourceType":"deletedVaults","locations":["North + Central US","West US 2","Korea Central","Korea South","France Central","East + US 2 EUAP","Central US EUAP"],"apiVersions":["2018-02-14-preview","2016-10-01","2015-06-01"],"apiProfiles":[{"profileVersion":"2018-03-01-hybrid","apiVersion":"2016-10-01"}]},{"resourceType":"operations","locations":[],"apiVersions":["2018-02-14-preview","2016-10-01","2015-06-01","2014-12-19-preview"],"apiProfiles":[{"profileVersion":"2018-03-01-hybrid","apiVersion":"2016-10-01"}]},{"resourceType":"checkNameAvailability","locations":[],"apiVersions":["2018-02-14-preview","2016-10-01","2015-06-01"]},{"resourceType":"deletedVaults","locations":["North Central US","East US","North Europe","West Europe","East Asia","Southeast Asia","East US 2","Central US","South Central US","West US","Japan East","Japan West","Australia East","Australia Southeast","Brazil South","Central India","South India","West India","Canada Central","Canada East","UK South","UK West","West - Central US","West US 2","Korea Central","Korea South","France Central"],"apiVersions":["2018-02-14-preview","2016-10-01"]},{"resourceType":"locations","locations":[],"apiVersions":["2018-02-14-preview","2016-10-01"]},{"resourceType":"locations/deletedVaults","locations":["North + Central US","West US 2","Korea Central","Korea South","France Central","East + US 2 EUAP","Central US EUAP"],"apiVersions":["2018-02-14-preview","2016-10-01"]},{"resourceType":"locations","locations":[],"apiVersions":["2018-02-14-preview","2016-10-01"]},{"resourceType":"locations/deletedVaults","locations":["North Central US","East US","North Europe","West Europe","East Asia","Southeast Asia","East US 2","Central US","South Central US","West US","Japan East","Japan West","Australia East","Australia Southeast","Brazil South","Central India","South India","West India","Canada Central","Canada East","UK South","UK West","West - Central US","West US 2","Korea Central","Korea South","France Central"],"apiVersions":["2018-02-14-preview","2016-10-01"]},{"resourceType":"locations/operationResults","locations":["North + Central US","West US 2","Korea Central","Korea South","France Central","East + US 2 EUAP","Central US EUAP"],"apiVersions":["2018-02-14-preview","2016-10-01"]},{"resourceType":"locations/deleteVirtualNetworkOrSubnets","locations":["East + US","North Central US","West Europe","North Europe","East Asia","Southeast + Asia","East US 2","Central US","South Central US","West Central US","West + US 2","West US","Japan East","Japan West","Australia East","Australia Southeast","Brazil + South","Central India","South India","West India","Canada Central","Canada + East","UK South","UK West","Korea Central","Korea South","France Central","Central + US EUAP","East US 2 EUAP"],"apiVersions":["2018-02-14-preview","2016-10-01"]},{"resourceType":"locations/operationResults","locations":["North Central US","East US","North Europe","West Europe","East Asia","Southeast Asia","East US 2","Central US","South Central US","West US","Japan East","Japan West","Australia East","Australia Southeast","Brazil South","Central India","South India","West India","Canada Central","Canada East","UK South","UK West","West - Central US","West US 2","Korea Central","Korea South","France Central"],"apiVersions":["2018-02-14-preview","2016-10-01"]}],"registrationState":"Registered"}'} + Central US","West US 2","Korea Central","Korea South","France Central","East + US 2 EUAP","Central US EUAP"],"apiVersions":["2018-02-14-preview","2016-10-01"]}],"registrationState":"Registered"}'} headers: cache-control: [no-cache] - content-length: ['3732'] + content-length: ['4817'] content-type: [application/json; charset=utf-8] - date: ['Wed, 14 Mar 2018 22:46:05 GMT'] + date: ['Tue, 01 May 2018 21:47:38 GMT'] expires: ['-1'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] @@ -737,14 +723,14 @@ interactions: body: 'b''{"location": "southcentralus", "tags": {}, "properties": {"sku": {"family": "A", "name": "standard"}, "tenantId": "72f988bf-86f1-41af-91ab-2d7cd011db47", "accessPolicies": [{"tenantId": "72f988bf-86f1-41af-91ab-2d7cd011db47", "objectId": - "cdf4ba39-6a56-45be-a72a-13ec9cdfee91", "permissions": {"keys": ["get", "create", + "4b1f6d49-d203-442f-bb23-06d98ab68f05", "permissions": {"keys": ["get", "create", "delete", "list", "update", "import", "backup", "restore", "recover"], "secrets": ["get", "list", "set", "delete", "backup", "restore", "recover"], "certificates": ["get", "list", "delete", "create", "import", "update", "managecontacts", "getissuers", "listissuers", "setissuers", "deleteissuers", "manageissuers", "recover"], "storage": ["get", "list", "delete", "set", "update", "regeneratekey", "setsas", "listsas", "getsas", "deletesas"]}}, {"tenantId": "72f988bf-86f1-41af-91ab-2d7cd011db47", - "objectId": "739fc607-0f9e-40c8-a69b-84bb547e3751", "permissions": {"keys": + "objectId": "f9dda2cf-e03f-4a7a-a8ea-7411041143de", "permissions": {"keys": ["get", "wrapKey", "unwrapKey", "recover"]}}], "enabledForDeployment": false, "enableSoftDelete": true, "vaultUri": "https://clitest000003.vault.azure.net/", "provisioningState": "RegisteringDns", "enablePurgeProtection": true}}''' @@ -755,28 +741,28 @@ interactions: Connection: [keep-alive] Content-Length: ['1133'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.4 (Darwin-17.4.0-x86_64-i386-64bit) requests/2.18.4 - msrest/0.4.25 msrest_azure/0.4.20 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.30] + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001/providers/Microsoft.KeyVault/vaults/clitest000003?api-version=2016-10-01 response: - body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.KeyVault/vaults/clitest000003","name":"clitest000003","type":"Microsoft.KeyVault/vaults","location":"southcentralus","tags":{},"properties":{"sku":{"family":"A","name":"standard"},"tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","accessPolicies":[{"tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","objectId":"cdf4ba39-6a56-45be-a72a-13ec9cdfee91","permissions":{"keys":["get","create","delete","list","update","import","backup","restore","recover"],"secrets":["get","list","set","delete","backup","restore","recover"],"certificates":["get","list","delete","create","import","update","managecontacts","getissuers","listissuers","setissuers","deleteissuers","manageissuers","recover"],"storage":["get","list","delete","set","update","regeneratekey","setsas","listsas","getsas","deletesas"]}},{"tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","objectId":"739fc607-0f9e-40c8-a69b-84bb547e3751","permissions":{"keys":["get","wrapKey","unwrapKey","recover"]}}],"enabledForDeployment":false,"enableSoftDelete":true,"enablePurgeProtection":true,"vaultUri":"https://clitest000003.vault.azure.net/","provisioningState":"RegisteringDns"}}'} + body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.KeyVault/vaults/clitest000003","name":"clitest000003","type":"Microsoft.KeyVault/vaults","location":"southcentralus","tags":{},"properties":{"sku":{"family":"A","name":"standard"},"tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","accessPolicies":[{"tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","objectId":"4b1f6d49-d203-442f-bb23-06d98ab68f05","permissions":{"keys":["get","create","delete","list","update","import","backup","restore","recover"],"secrets":["get","list","set","delete","backup","restore","recover"],"certificates":["get","list","delete","create","import","update","managecontacts","getissuers","listissuers","setissuers","deleteissuers","manageissuers","recover"],"storage":["get","list","delete","set","update","regeneratekey","setsas","listsas","getsas","deletesas"]}},{"tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","objectId":"f9dda2cf-e03f-4a7a-a8ea-7411041143de","permissions":{"keys":["get","wrapKey","unwrapKey","recover"]}}],"enabledForDeployment":false,"enableSoftDelete":true,"enablePurgeProtection":true,"vaultUri":"https://clitest000003.vault.azure.net/","provisioningState":"RegisteringDns"}}'} headers: cache-control: [no-cache] content-length: ['1333'] content-type: [application/json; charset=utf-8] - date: ['Wed, 14 Mar 2018 22:46:05 GMT'] + date: ['Tue, 01 May 2018 21:47:38 GMT'] expires: ['-1'] pragma: [no-cache] - server: [Microsoft-IIS/8.5] + server: [Microsoft-IIS/10.0] strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] x-aspnet-version: [4.0.30319] x-content-type-options: [nosniff] - x-ms-keyvault-service-version: [1.0.0.210] + x-ms-keyvault-service-version: [1.0.0.215] x-ms-ratelimit-remaining-subscription-writes: ['1198'] x-powered-by: [ASP.NET] status: {code: 200, message: OK} @@ -788,28 +774,28 @@ interactions: CommandName: [resource update] Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.4 (Darwin-17.4.0-x86_64-i386-64bit) requests/2.18.4 - msrest/0.4.25 msrest_azure/0.4.20 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.30] + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001/providers/Microsoft.KeyVault/vaults/clitest000003?api-version=2016-10-01 response: - body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.KeyVault/vaults/clitest000003","name":"clitest000003","type":"Microsoft.KeyVault/vaults","location":"southcentralus","tags":{},"properties":{"sku":{"family":"A","name":"standard"},"tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","accessPolicies":[{"tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","objectId":"cdf4ba39-6a56-45be-a72a-13ec9cdfee91","permissions":{"keys":["get","create","delete","list","update","import","backup","restore","recover"],"secrets":["get","list","set","delete","backup","restore","recover"],"certificates":["get","list","delete","create","import","update","managecontacts","getissuers","listissuers","setissuers","deleteissuers","manageissuers","recover"],"storage":["get","list","delete","set","update","regeneratekey","setsas","listsas","getsas","deletesas"]}},{"tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","objectId":"739fc607-0f9e-40c8-a69b-84bb547e3751","permissions":{"keys":["get","wrapKey","unwrapKey","recover"]}}],"enabledForDeployment":false,"enableSoftDelete":true,"enablePurgeProtection":true,"vaultUri":"https://clitest000003.vault.azure.net/","provisioningState":"Succeeded"}}'} + body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.KeyVault/vaults/clitest000003","name":"clitest000003","type":"Microsoft.KeyVault/vaults","location":"southcentralus","tags":{},"properties":{"sku":{"family":"A","name":"standard"},"tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","accessPolicies":[{"tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","objectId":"4b1f6d49-d203-442f-bb23-06d98ab68f05","permissions":{"keys":["get","create","delete","list","update","import","backup","restore","recover"],"secrets":["get","list","set","delete","backup","restore","recover"],"certificates":["get","list","delete","create","import","update","managecontacts","getissuers","listissuers","setissuers","deleteissuers","manageissuers","recover"],"storage":["get","list","delete","set","update","regeneratekey","setsas","listsas","getsas","deletesas"]}},{"tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","objectId":"f9dda2cf-e03f-4a7a-a8ea-7411041143de","permissions":{"keys":["get","wrapKey","unwrapKey","recover"]}}],"enabledForDeployment":false,"enableSoftDelete":true,"enablePurgeProtection":true,"vaultUri":"https://clitest000003.vault.azure.net/","provisioningState":"Succeeded"}}'} headers: cache-control: [no-cache] content-length: ['1328'] content-type: [application/json; charset=utf-8] - date: ['Wed, 14 Mar 2018 22:46:36 GMT'] + date: ['Tue, 01 May 2018 21:48:08 GMT'] expires: ['-1'] pragma: [no-cache] - server: [Microsoft-IIS/8.5] + server: [Microsoft-IIS/10.0] strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] x-aspnet-version: [4.0.30319] x-content-type-options: [nosniff] - x-ms-keyvault-service-version: [1.0.0.210] + x-ms-keyvault-service-version: [1.0.0.215] x-powered-by: [ASP.NET] status: {code: 200, message: OK} - request: @@ -820,19 +806,18 @@ interactions: CommandName: [storage account update] Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.4 (Darwin-17.4.0-x86_64-i386-64bit) requests/2.18.4 - msrest/0.4.25 msrest_azure/0.4.20 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python - AZURECLI/2.0.30] + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002?api-version=2017-10-01 response: - body: {string: '{"identity":{"principalId":"739fc607-0f9e-40c8-a69b-84bb547e3751","tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","type":"SystemAssigned"},"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"southcentralus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-03-14T22:45:16.8414059Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-03-14T22:45:16.8414059Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-03-14T22:45:16.8101562Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"southcentralus","statusOfPrimary":"available"}}'} + body: {string: '{"identity":{"principalId":"f9dda2cf-e03f-4a7a-a8ea-7411041143de","tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","type":"SystemAssigned"},"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"southcentralus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:47:05.9534027Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:47:05.9534027Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:47:05.9065524Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"southcentralus","statusOfPrimary":"available"}}'} headers: cache-control: [no-cache] content-length: ['1387'] content-type: [application/json] - date: ['Wed, 14 Mar 2018 22:46:37 GMT'] + date: ['Tue, 01 May 2018 21:48:10 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -846,7 +831,7 @@ interactions: body: 'b''{"sku": {"name": "Standard_LRS"}, "tags": {}, "properties": {"encryption": {"services": {"blob": {"enabled": true}, "file": {"enabled": true}}, "keySource": "Microsoft.Keyvault", "keyvaultproperties": {"keyname": "testkey", "keyversion": - "fff5a9c679664908a6675a10b9c8d952", "keyvaulturi": "https://clitest000003.vault.azure.net/"}}, + "f99dcad9b19d4839be3296fd333700a9", "keyvaulturi": "https://clitest000003.vault.azure.net/"}}, "supportsHttpsTrafficOnly": false, "networkAcls": {"bypass": "AzureServices", "virtualNetworkRules": [], "ipRules": [], "defaultAction": "Allow"}}}''' headers: @@ -856,19 +841,18 @@ interactions: Connection: [keep-alive] Content-Length: ['491'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.4 (Darwin-17.4.0-x86_64-i386-64bit) requests/2.18.4 - msrest/0.4.25 msrest_azure/0.4.20 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python - AZURECLI/2.0.30] + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: PATCH uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002?api-version=2017-10-01 response: - body: {string: '{"identity":{"principalId":"739fc607-0f9e-40c8-a69b-84bb547e3751","tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","type":"SystemAssigned"},"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"southcentralus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"keyvaultproperties":{"keyvaulturi":"https://clitest000003.vault.azure.net/","keyname":"testkey","keyversion":"fff5a9c679664908a6675a10b9c8d952"},"services":{"file":{"enabled":true,"lastEnabledTime":"2018-03-14T22:45:16.8414059Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-03-14T22:45:16.8414059Z"}},"keySource":"Microsoft.Keyvault"},"provisioningState":"Succeeded","creationTime":"2018-03-14T22:45:16.8101562Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"southcentralus","statusOfPrimary":"available"}}'} + body: {string: '{"identity":{"principalId":"f9dda2cf-e03f-4a7a-a8ea-7411041143de","tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","type":"SystemAssigned"},"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"southcentralus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"keyvaultproperties":{"keyvaulturi":"https://clitest000003.vault.azure.net/","keyname":"testkey","keyversion":"f99dcad9b19d4839be3296fd333700a9"},"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:47:05.9534027Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:47:05.9534027Z"}},"keySource":"Microsoft.Keyvault"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:47:05.9065524Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"southcentralus","statusOfPrimary":"available"}}'} headers: cache-control: [no-cache] content-length: ['1545'] content-type: [application/json] - date: ['Wed, 14 Mar 2018 22:46:39 GMT'] + date: ['Tue, 01 May 2018 21:48:12 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -877,7 +861,7 @@ interactions: transfer-encoding: [chunked] vary: [Accept-Encoding] x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-writes: ['1199'] + x-ms-ratelimit-remaining-subscription-writes: ['1196'] status: {code: 200, message: OK} - request: body: null @@ -888,9 +872,9 @@ interactions: Connection: [keep-alive] Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.4 (Darwin-17.4.0-x86_64-i386-64bit) requests/2.18.4 - msrest/0.4.25 msrest_azure/0.4.20 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.30] + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: DELETE uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2017-05-10 @@ -899,12 +883,12 @@ interactions: headers: cache-control: [no-cache] content-length: ['0'] - date: ['Wed, 14 Mar 2018 22:46:41 GMT'] + date: ['Tue, 01 May 2018 21:48:15 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTElURVNUOjJFUkdNREc1S0daV0U3RFBTQVlRQUxOVk9JNDRJRlNHQko0TlRJSHwxQzdFMjZFQzNBOTk2OUZGLVNPVVRIQ0VOVFJBTFVTIiwiam9iTG9jYXRpb24iOiJzb3V0aGNlbnRyYWx1cyJ9?api-version=2017-05-10'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTElURVNUOjJFUkdZQlVZMlVaMldaM0JVQlk0QVJSUjU0WktOVEZPQ0RPN0dNSnw1MEFGMTlBQjYxRTEzM0JCLVNPVVRIQ0VOVFJBTFVTIiwiam9iTG9jYXRpb24iOiJzb3V0aGNlbnRyYWx1cyJ9?api-version=2017-05-10'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-writes: ['1199'] + x-ms-ratelimit-remaining-subscription-writes: ['1198'] status: {code: 202, message: Accepted} version: 1 diff --git a/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_list_locations.yaml b/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_list_locations.yaml index 978a6e21df0..f5290c6f7e0 100644 --- a/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_list_locations.yaml +++ b/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_list_locations.yaml @@ -8,7 +8,7 @@ interactions: Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 subscriptionclient/1.2.1 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 subscriptionclient/1.2.1 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/locations?api-version=2016-06-01 @@ -39,15 +39,20 @@ interactions: Central US","longitude":"-110.234","latitude":"40.890"},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/locations/westus2","name":"westus2","displayName":"West US 2","longitude":"-119.852","latitude":"47.233"},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/locations/koreacentral","name":"koreacentral","displayName":"Korea Central","longitude":"126.9780","latitude":"37.5665"},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/locations/koreasouth","name":"koreasouth","displayName":"Korea - South","longitude":"129.0756","latitude":"35.1796"}]}'} + South","longitude":"129.0756","latitude":"35.1796"},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/locations/francecentral","name":"francecentral","displayName":"France + Central","longitude":"2.3730","latitude":"46.3772"},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/locations/francesouth","name":"francesouth","displayName":"France + South","longitude":"2.1972","latitude":"43.8345"},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/locations/australiacentral","name":"australiacentral","displayName":"Australia + Central","longitude":"149.1244","latitude":"-35.3075"},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/locations/australiacentral2","name":"australiacentral2","displayName":"Australia + Central 2","longitude":"149.1244","latitude":"-35.3075"}]}'} headers: cache-control: [no-cache] - content-length: ['4523'] + content-length: ['5269'] content-type: [application/json; charset=utf-8] - date: ['Thu, 08 Feb 2018 18:11:35 GMT'] + date: ['Tue, 01 May 2018 21:48:17 GMT'] expires: ['-1'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] vary: [Accept-Encoding] + x-content-type-options: [nosniff] status: {code: 200, message: OK} version: 1 diff --git a/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_list_storage_accounts.yaml b/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_list_storage_accounts.yaml index ca043f528a9..bbf2a0ff1af 100644 --- a/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_list_storage_accounts.yaml +++ b/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_list_storage_accounts.yaml @@ -1,30 +1,32 @@ interactions: - request: - body: '{"location": "westus", "tags": {"use": "az-test"}}' + body: '{"location": "westus", "tags": {"product": "azurecli", "cause": "automation", + "date": "2018-05-01T21:48:17Z"}}' headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] CommandName: [group create] Connection: [keep-alive] - Content-Length: ['50'] + Content-Length: ['110'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.27] + msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2017-05-10 response: - body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"westus","tags":{"use":"az-test"},"properties":{"provisioningState":"Succeeded"}}'} + body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"westus","tags":{"product":"azurecli","cause":"automation","date":"2018-05-01T21:48:17Z"},"properties":{"provisioningState":"Succeeded"}}'} headers: cache-control: [no-cache] - content-length: ['328'] + content-length: ['384'] content-type: [application/json; charset=utf-8] - date: ['Thu, 08 Feb 2018 18:11:36 GMT'] + date: ['Tue, 01 May 2018 21:48:17 GMT'] expires: ['-1'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1186'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1195'] status: {code: 201, message: Created} - request: body: '{"sku": {"name": "Standard_LRS"}, "kind": "Storage", "location": "westus", @@ -37,7 +39,7 @@ interactions: Content-Length: ['125'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002?api-version=2017-10-01 @@ -47,14 +49,15 @@ interactions: cache-control: [no-cache] content-length: ['0'] content-type: [text/plain; charset=utf-8] - date: ['Thu, 08 Feb 2018 18:11:37 GMT'] + date: ['Tue, 01 May 2018 21:48:17 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/63946121-517a-424d-9635-896b4cc8a043?monitor=true&api-version=2017-10-01'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/935cdf39-c0de-4897-b12d-11c1f43e1569?monitor=true&api-version=2017-10-01'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 Microsoft-HTTPAPI/2.0'] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1190'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1195'] status: {code: 202, message: Accepted} - request: body: null @@ -65,44 +68,17 @@ interactions: Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/63946121-517a-424d-9635-896b4cc8a043?monitor=true&api-version=2017-10-01 + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/935cdf39-c0de-4897-b12d-11c1f43e1569?monitor=true&api-version=2017-10-01 response: - body: {string: ''} - headers: - cache-control: [no-cache] - content-length: ['0'] - content-type: [text/plain; charset=utf-8] - date: ['Thu, 08 Feb 2018 18:11:54 GMT'] - expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/63946121-517a-424d-9635-896b4cc8a043?monitor=true&api-version=2017-10-01'] - pragma: [no-cache] - server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 - Microsoft-HTTPAPI/2.0'] - strict-transport-security: [max-age=31536000; includeSubDomains] - status: {code: 202, message: Accepted} -- request: - body: null - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [storage account create] - Connection: [keep-alive] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] - accept-language: [en-US] - method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/63946121-517a-424d-9635-896b4cc8a043?monitor=true&api-version=2017-10-01 - response: - body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T18:11:37.6366830Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T18:11:37.6366830Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T18:11:37.5741907Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} + body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:48:18.3231444Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:48:18.3231444Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:48:18.2450195Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} headers: cache-control: [no-cache] content-length: ['1231'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 18:12:12 GMT'] + date: ['Tue, 01 May 2018 21:48:34 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -110,6 +86,7 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] + x-content-type-options: [nosniff] status: {code: 200, message: OK} - request: body: null @@ -121,17 +98,17 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: POST uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002/listKeys?api-version=2017-10-01 response: - body: {string: '{"keys":[{"keyName":"key1","value":"OETfFP6IVszHBA3uwVEp9EFPFT46xDAoHkJ0BG1byG41EWZ62f8d+uXdMPKY7HVlYOgrWXcX8fxs1yNAqsjl9Q==","permissions":"FULL"},{"keyName":"key2","value":"XIKn0TTCYZGWcJ4H0V4T5a4Bdul/jq+xqhSvsU5jRmmp/lfItVVyP4BzpxjBpxJETnTJnLJxlVMUky7nbBMH3A==","permissions":"FULL"}]}'} + body: {string: '{"keys":[{"keyName":"key1","value":"JpyZFS2rU/ITmy9GBt9dJfleHXQKyPbsm1h1IUmgr1qxETrsAeJ3exRr+g1qBwW6srp2+G4DJqNQADG1jid3ag==","permissions":"FULL"},{"keyName":"key2","value":"5qnrHpm9V5AdQGEFqM2q9KdH9kJSL+yzIh6R+9yFpOhg2P5GjXhcAwKX8/OEfuahhNcnZSjtGQN/gSgujew/+g==","permissions":"FULL"}]}'} headers: cache-control: [no-cache] content-length: ['288'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 18:12:12 GMT'] + date: ['Tue, 01 May 2018 21:48:36 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -139,7 +116,8 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] - x-ms-ratelimit-remaining-subscription-writes: ['1186'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1197'] status: {code: 200, message: OK} - request: body: '{"sku": {"name": "Standard_LRS"}, "kind": "Storage", "location": "westus", @@ -152,7 +130,7 @@ interactions: Content-Length: ['125'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000003?api-version=2017-10-01 @@ -162,14 +140,15 @@ interactions: cache-control: [no-cache] content-length: ['0'] content-type: [text/plain; charset=utf-8] - date: ['Thu, 08 Feb 2018 18:12:13 GMT'] + date: ['Tue, 01 May 2018 21:48:37 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/0151d0da-3bbe-4a98-aa00-55847842c6b2?monitor=true&api-version=2017-10-01'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/b9cf7077-db79-4990-b409-a7475f2dac0b?monitor=true&api-version=2017-10-01'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 Microsoft-HTTPAPI/2.0'] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1190'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1198'] status: {code: 202, message: Accepted} - request: body: null @@ -180,17 +159,17 @@ interactions: Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/0151d0da-3bbe-4a98-aa00-55847842c6b2?monitor=true&api-version=2017-10-01 + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/b9cf7077-db79-4990-b409-a7475f2dac0b?monitor=true&api-version=2017-10-01 response: - body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000003","name":"clitest000003","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T18:12:14.1064068Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T18:12:14.1064068Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T18:12:14.0439010Z","primaryEndpoints":{"blob":"https://clitest000003.blob.core.windows.net/","queue":"https://clitest000003.queue.core.windows.net/","table":"https://clitest000003.table.core.windows.net/","file":"https://clitest000003.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} + body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000003","name":"clitest000003","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:48:37.4795170Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:48:37.4795170Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:48:37.3857709Z","primaryEndpoints":{"blob":"https://clitest000003.blob.core.windows.net/","queue":"https://clitest000003.queue.core.windows.net/","table":"https://clitest000003.table.core.windows.net/","file":"https://clitest000003.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} headers: cache-control: [no-cache] content-length: ['1231'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 18:12:31 GMT'] + date: ['Tue, 01 May 2018 21:48:54 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -198,6 +177,7 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] + x-content-type-options: [nosniff] status: {code: 200, message: OK} - request: body: null @@ -209,17 +189,17 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: POST uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000003/listKeys?api-version=2017-10-01 response: - body: {string: '{"keys":[{"keyName":"key1","value":"aiDL1Rg64ABytwt4Wro1D999z7ClIufr3/1hOWc+GfdowBUOCLFc7r19FrhKOswoY8GkYgIIkdgxnh5h9rFakw==","permissions":"FULL"},{"keyName":"key2","value":"4ELIf1EMXKVEf60ti+nvpc84tKdfO8JMOi1IVKd1SrSBbxJ4n0SiAu7DnMYe91LBuCpD0BcwkBiQdF8KrE89oQ==","permissions":"FULL"}]}'} + body: {string: '{"keys":[{"keyName":"key1","value":"hKhdGhEQVL9EUpbHR/nmynJ5GOpRtciN9bY7LZUtSQkxoyryK6NudyK3KJl9lz8u1CHb1cWFEQFyRDb0LZlhfg==","permissions":"FULL"},{"keyName":"key2","value":"nU4o9UKVho35Jfw1fuOoKK+z1e41ejTzYtlOXDZ8sWTZHvHEFJyI1sUzF/SuZGWIeti3qFzNq6ZaigP8frZ9TA==","permissions":"FULL"}]}'} headers: cache-control: [no-cache] content-length: ['288'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 18:12:32 GMT'] + date: ['Tue, 01 May 2018 21:48:55 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -227,7 +207,8 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] - x-ms-ratelimit-remaining-subscription-writes: ['1189'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1197'] status: {code: 200, message: OK} - request: body: null @@ -238,23 +219,26 @@ interactions: Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/storageAccounts?api-version=2017-10-01 response: - body: {string: '{"value":[{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/vmbdtest6075/providers/Microsoft.Storage/storageAccounts/stgbnc8939","name":"stgbnc8939","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-07T13:07:05.6471355Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-07T13:07:05.6471355Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-07T13:07:05.6158803Z","primaryEndpoints":{"blob":"https://stgbnc8939.blob.core.windows.net/","queue":"https://stgbnc8939.queue.core.windows.net/","table":"https://stgbnc8939.table.core.windows.net/","file":"https://stgbnc8939.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/vmbdtest1501/providers/Microsoft.Storage/storageAccounts/stgjavavme823820652e","name":"stgjavavme823820652e","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T15:41:10.5736026Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T15:41:10.5736026Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T15:41:10.5579773Z","primaryEndpoints":{"blob":"https://stgjavavme823820652e.blob.core.windows.net/","queue":"https://stgjavavme823820652e.queue.core.windows.net/","table":"https://stgjavavme823820652e.table.core.windows.net/","file":"https://stgjavavme823820652e.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/vmbdtest9977/providers/Microsoft.Storage/storageAccounts/stgjavavm333507506ea","name":"stgjavavm333507506ea","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T15:32:47.9591527Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T15:32:47.9591527Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T15:32:47.8341521Z","primaryEndpoints":{"blob":"https://stgjavavm333507506ea.blob.core.windows.net/","queue":"https://stgjavavm333507506ea.queue.core.windows.net/","table":"https://stgjavavm333507506ea.table.core.windows.net/","file":"https://stgjavavm333507506ea.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/javacsmrg3602/providers/Microsoft.Storage/storageAccounts/stg8927","name":"stg8927","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T07:37:55.0112849Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T07:37:55.0112849Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T07:37:54.9800708Z","primaryEndpoints":{"blob":"https://stg8927.blob.core.windows.net/","queue":"https://stg8927.queue.core.windows.net/","table":"https://stg8927.table.core.windows.net/","file":"https://stg8927.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/vmbdtest6075/providers/Microsoft.Storage/storageAccounts/stgjavavm52d424261a2","name":"stgjavavm52d424261a2","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-07T13:07:42.0875788Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-07T13:07:42.0875788Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-07T13:07:42.0563640Z","primaryEndpoints":{"blob":"https://stgjavavm52d424261a2.blob.core.windows.net/","queue":"https://stgjavavm52d424261a2.queue.core.windows.net/","table":"https://stgjavavm52d424261a2.table.core.windows.net/","file":"https://stgjavavm52d424261a2.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/wilx-group/providers/Microsoft.Storage/storageAccounts/awilxdevlab9274","name":"awilxdevlab9274","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{"hidden-DevTestLabs-LabUId":"3f487f2b-f13a-422f-a05c-761b17b0200d"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:35.9463952Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:35.9463952Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-12-07T22:43:14.9920432Z","primaryEndpoints":{"blob":"https://awilxdevlab9274.blob.core.windows.net/","queue":"https://awilxdevlab9274.queue.core.windows.net/","table":"https://awilxdevlab9274.table.core.windows.net/","file":"https://awilxdevlab9274.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/vmbdtest2038/providers/Microsoft.Storage/storageAccounts/stgjavavmac8610156cf","name":"stgjavavmac8610156cf","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-07T13:00:07.6351597Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-07T13:00:07.6351597Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-07T13:00:07.6039345Z","primaryEndpoints":{"blob":"https://stgjavavmac8610156cf.blob.core.windows.net/","queue":"https://stgjavavmac8610156cf.queue.core.windows.net/","table":"https://stgjavavmac8610156cf.table.core.windows.net/","file":"https://stgjavavmac8610156cf.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/vmbdtest5772/providers/Microsoft.Storage/storageAccounts/stgjavavm42113837dbb","name":"stgjavavm42113837dbb","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-07T12:48:36.1026547Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-07T12:48:36.1026547Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-07T12:48:36.0714523Z","primaryEndpoints":{"blob":"https://stgjavavm42113837dbb.blob.core.windows.net/","queue":"https://stgjavavm42113837dbb.queue.core.windows.net/","table":"https://stgjavavm42113837dbb.table.core.windows.net/","file":"https://stgjavavm42113837dbb.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/javacsmrg8678/providers/Microsoft.Storage/storageAccounts/stg7343","name":"stg7343","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.0401485Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.0401485Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-10-22T20:47:23.8366703Z","primaryEndpoints":{"blob":"https://stg7343.blob.core.windows.net/","queue":"https://stg7343.queue.core.windows.net/","table":"https://stg7343.table.core.windows.net/","file":"https://stg7343.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/javacsmrg7434/providers/Microsoft.Storage/storageAccounts/stg8548","name":"stg8548","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-07T22:39:56.6875433Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-07T22:39:56.6875433Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-07T22:39:56.6562752Z","primaryEndpoints":{"blob":"https://stg8548.blob.core.windows.net/","queue":"https://stg8548.queue.core.windows.net/","table":"https://stg8548.table.core.windows.net/","file":"https://stg8548.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/vmbdtest7312/providers/Microsoft.Storage/storageAccounts/stgjavavm43d95373650","name":"stgjavavm43d95373650","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T15:26:15.2306952Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T15:26:15.2306952Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T15:26:15.2150846Z","primaryEndpoints":{"blob":"https://stgjavavm43d95373650.blob.core.windows.net/","queue":"https://stgjavavm43d95373650.queue.core.windows.net/","table":"https://stgjavavm43d95373650.table.core.windows.net/","file":"https://stgjavavm43d95373650.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/javacsmrg3093/providers/Microsoft.Storage/storageAccounts/stg4985","name":"stg4985","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T07:28:11.7207048Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T07:28:11.7207048Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T07:28:11.6894612Z","primaryEndpoints":{"blob":"https://stg4985.blob.core.windows.net/","queue":"https://stg4985.queue.core.windows.net/","table":"https://stg4985.table.core.windows.net/","file":"https://stg4985.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/vmbdtest9977/providers/Microsoft.Storage/storageAccounts/stgbnc9165","name":"stgbnc9165","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T15:31:59.0738016Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T15:31:59.0738016Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T15:31:59.0581787Z","primaryEndpoints":{"blob":"https://stgbnc9165.blob.core.windows.net/","queue":"https://stgbnc9165.queue.core.windows.net/","table":"https://stgbnc9165.table.core.windows.net/","file":"https://stgbnc9165.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/vmbdtest5772/providers/Microsoft.Storage/storageAccounts/stgjavavmcb00830196f","name":"stgjavavmcb00830196f","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-07T12:54:38.4891429Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-07T12:54:38.4891429Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-07T12:54:38.4422705Z","primaryEndpoints":{"blob":"https://stgjavavmcb00830196f.blob.core.windows.net/","queue":"https://stgjavavmcb00830196f.queue.core.windows.net/","table":"https://stgjavavmcb00830196f.table.core.windows.net/","file":"https://stgjavavmcb00830196f.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/javacsmrg1377/providers/Microsoft.Storage/storageAccounts/stg35556","name":"stg35556","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-07T22:29:10.3577399Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-07T22:29:10.3577399Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-07T22:29:10.3421120Z","primaryEndpoints":{"blob":"https://stg35556.blob.core.windows.net/","queue":"https://stg35556.queue.core.windows.net/","table":"https://stg35556.table.core.windows.net/","file":"https://stg35556.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg9de67119f7/providers/Microsoft.Storage/storageAccounts/st3ea29977a4","name":"st3ea29977a4","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:35.9620243Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:35.9620243Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-12-01T04:00:22.2331421Z","primaryEndpoints":{"blob":"https://st3ea29977a4.blob.core.windows.net/","queue":"https://st3ea29977a4.queue.core.windows.net/","table":"https://st3ea29977a4.table.core.windows.net/","file":"https://st3ea29977a4.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/javacsmrg8678/providers/Microsoft.Storage/storageAccounts/stg24699","name":"stg24699","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:35.9932855Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:35.9932855Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-10-22T20:47:23.3426259Z","primaryEndpoints":{"blob":"https://stg24699.blob.core.windows.net/","queue":"https://stg24699.queue.core.windows.net/","table":"https://stg24699.table.core.windows.net/","file":"https://stg24699.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/javacsmrg3819/providers/Microsoft.Storage/storageAccounts/stg2666","name":"stg2666","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-07T23:15:53.4245534Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-07T23:15:53.4245534Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-07T23:15:53.3932595Z","primaryEndpoints":{"blob":"https://stg2666.blob.core.windows.net/","queue":"https://stg2666.queue.core.windows.net/","table":"https://stg2666.table.core.windows.net/","file":"https://stg2666.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/vmbdtest2038/providers/Microsoft.Storage/storageAccounts/stgbnc6669","name":"stgbnc6669","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-07T12:59:33.1175728Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-07T12:59:33.1175728Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-07T12:59:33.0863032Z","primaryEndpoints":{"blob":"https://stgbnc6669.blob.core.windows.net/","queue":"https://stgbnc6669.queue.core.windows.net/","table":"https://stgbnc6669.table.core.windows.net/","file":"https://stgbnc6669.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/javacsmrg1377/providers/Microsoft.Storage/storageAccounts/stg1798","name":"stg1798","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-07T22:29:09.9827302Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-07T22:29:09.9827302Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-07T22:29:09.9671375Z","primaryEndpoints":{"blob":"https://stg1798.blob.core.windows.net/","queue":"https://stg1798.queue.core.windows.net/","table":"https://stg1798.table.core.windows.net/","file":"https://stg1798.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/vmbdtest1501/providers/Microsoft.Storage/storageAccounts/stgbnc4090","name":"stgbnc4090","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T15:40:34.7555760Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T15:40:34.7555760Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T15:40:34.7086970Z","primaryEndpoints":{"blob":"https://stgbnc4090.blob.core.windows.net/","queue":"https://stgbnc4090.queue.core.windows.net/","table":"https://stgbnc4090.table.core.windows.net/","file":"https://stgbnc4090.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/vmbdtest7312/providers/Microsoft.Storage/storageAccounts/stgjavavm57b02213d98","name":"stgjavavm57b02213d98","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T15:18:03.2964360Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T15:18:03.2964360Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T15:18:03.1714019Z","primaryEndpoints":{"blob":"https://stgjavavm57b02213d98.blob.core.windows.net/","queue":"https://stgjavavm57b02213d98.queue.core.windows.net/","table":"https://stgjavavm57b02213d98.table.core.windows.net/","file":"https://stgjavavm57b02213d98.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/javacsmrg9511/providers/Microsoft.Storage/storageAccounts/stg4096","name":"stg4096","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T07:51:31.4329960Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T07:51:31.4329960Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T07:51:31.4174074Z","primaryEndpoints":{"blob":"https://stg4096.blob.core.windows.net/","queue":"https://stg4096.queue.core.windows.net/","table":"https://stg4096.table.core.windows.net/","file":"https://stg4096.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/javacsmrg3602/providers/Microsoft.Storage/storageAccounts/stg4719","name":"stg4719","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T07:38:44.2043180Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T07:38:44.2043180Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T07:38:44.1730915Z","primaryEndpoints":{"blob":"https://stg4719.blob.core.windows.net/","queue":"https://stg4719.queue.core.windows.net/","table":"https://stg4719.table.core.windows.net/","file":"https://stg4719.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/javacsmrg771/providers/Microsoft.Storage/storageAccounts/stg1266","name":"stg1266","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-07T22:51:55.4657267Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-07T22:51:55.4657267Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-07T22:51:55.4344476Z","primaryEndpoints":{"blob":"https://stg1266.blob.core.windows.net/","queue":"https://stg1266.queue.core.windows.net/","table":"https://stg1266.table.core.windows.net/","file":"https://stg1266.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/vmbdtest8491/providers/Microsoft.Storage/storageAccounts/stgjavavm0539488888b","name":"stgjavavm0539488888b","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T15:36:35.0405070Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T15:36:35.0405070Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T15:36:35.0092280Z","primaryEndpoints":{"blob":"https://stgjavavm0539488888b.blob.core.windows.net/","queue":"https://stgjavavm0539488888b.queue.core.windows.net/","table":"https://stgjavavm0539488888b.table.core.windows.net/","file":"https://stgjavavm0539488888b.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/vmbdtest6621/providers/Microsoft.Storage/storageAccounts/stgjavavmd2b85295b29","name":"stgjavavmd2b85295b29","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T15:44:27.7895164Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T15:44:27.7895164Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T15:44:27.7738787Z","primaryEndpoints":{"blob":"https://stgjavavmd2b85295b29.blob.core.windows.net/","queue":"https://stgjavavmd2b85295b29.queue.core.windows.net/","table":"https://stgjavavmd2b85295b29.table.core.windows.net/","file":"https://stgjavavmd2b85295b29.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/javacsmrg3502/providers/Microsoft.Storage/storageAccounts/stg2889","name":"stg2889","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T08:17:44.3543509Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T08:17:44.3543509Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T08:17:44.3230988Z","primaryEndpoints":{"blob":"https://stg2889.blob.core.windows.net/","queue":"https://stg2889.queue.core.windows.net/","table":"https://stg2889.table.core.windows.net/","file":"https://stg2889.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/vmbdtest8711/providers/Microsoft.Storage/storageAccounts/stgbnc2032","name":"stgbnc2032","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-07T13:14:27.1828795Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-07T13:14:27.1828795Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-07T13:14:27.1672525Z","primaryEndpoints":{"blob":"https://stgbnc2032.blob.core.windows.net/","queue":"https://stgbnc2032.queue.core.windows.net/","table":"https://stgbnc2032.table.core.windows.net/","file":"https://stgbnc2032.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/javacsmrg9511/providers/Microsoft.Storage/storageAccounts/stg3196","name":"stg3196","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T07:52:22.3698825Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T07:52:22.3698825Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T07:52:22.3386431Z","primaryEndpoints":{"blob":"https://stg3196.blob.core.windows.net/","queue":"https://stg3196.queue.core.windows.net/","table":"https://stg3196.table.core.windows.net/","file":"https://stg3196.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/vmbdtest4180/providers/Microsoft.Storage/storageAccounts/stgbnc5175","name":"stgbnc5175","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T15:50:47.5307698Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T15:50:47.5307698Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T15:50:47.4995195Z","primaryEndpoints":{"blob":"https://stgbnc5175.blob.core.windows.net/","queue":"https://stgbnc5175.queue.core.windows.net/","table":"https://stgbnc5175.table.core.windows.net/","file":"https://stgbnc5175.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/vmbdtest2727/providers/Microsoft.Storage/storageAccounts/stgbnc5888","name":"stgbnc5888","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T15:47:26.5456311Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T15:47:26.5456311Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T15:47:26.5143633Z","primaryEndpoints":{"blob":"https://stgbnc5888.blob.core.windows.net/","queue":"https://stgbnc5888.queue.core.windows.net/","table":"https://stgbnc5888.table.core.windows.net/","file":"https://stgbnc5888.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/vmbdtest5560/providers/Microsoft.Storage/storageAccounts/stgjavavm3ce9008563d","name":"stgjavavm3ce9008563d","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-07T13:10:52.6901809Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-07T13:10:52.6901809Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-07T13:10:52.6745969Z","primaryEndpoints":{"blob":"https://stgjavavm3ce9008563d.blob.core.windows.net/","queue":"https://stgjavavm3ce9008563d.queue.core.windows.net/","table":"https://stgjavavm3ce9008563d.table.core.windows.net/","file":"https://stgjavavm3ce9008563d.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rgcomvad814855116a9864/providers/Microsoft.Storage/storageAccounts/stgvm32735dbab87839ad","name":"stgvm32735dbab87839ad","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.2745251Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.2745251Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-11-05T02:16:45.9826459Z","primaryEndpoints":{"blob":"https://stgvm32735dbab87839ad.blob.core.windows.net/","queue":"https://stgvm32735dbab87839ad.queue.core.windows.net/","table":"https://stgvm32735dbab87839ad.table.core.windows.net/","file":"https://stgvm32735dbab87839ad.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/vmbdtest8132/providers/Microsoft.Storage/storageAccounts/stgbnc1363","name":"stgbnc1363","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-07T13:17:50.0973565Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-07T13:17:50.0973565Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-07T13:17:50.0660905Z","primaryEndpoints":{"blob":"https://stgbnc1363.blob.core.windows.net/","queue":"https://stgbnc1363.queue.core.windows.net/","table":"https://stgbnc1363.table.core.windows.net/","file":"https://stgbnc1363.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/javacsmrg3502/providers/Microsoft.Storage/storageAccounts/stg1316","name":"stg1316","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T08:17:43.8700047Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T08:17:43.8700047Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T08:17:43.8387584Z","primaryEndpoints":{"blob":"https://stg1316.blob.core.windows.net/","queue":"https://stg1316.queue.core.windows.net/","table":"https://stg1316.table.core.windows.net/","file":"https://stg1316.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/javacsmrg3819/providers/Microsoft.Storage/storageAccounts/stg6080","name":"stg6080","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-07T23:15:53.3307714Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-07T23:15:53.3307714Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-07T23:15:53.2995412Z","primaryEndpoints":{"blob":"https://stg6080.blob.core.windows.net/","queue":"https://stg6080.queue.core.windows.net/","table":"https://stg6080.table.core.windows.net/","file":"https://stg6080.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/javacsmrg7434/providers/Microsoft.Storage/storageAccounts/stg379","name":"stg379","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-07T22:40:27.5308774Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-07T22:40:27.5308774Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-07T22:40:27.4683812Z","primaryEndpoints":{"blob":"https://stg379.blob.core.windows.net/","queue":"https://stg379.queue.core.windows.net/","table":"https://stg379.table.core.windows.net/","file":"https://stg379.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/vmbdtest3168/providers/Microsoft.Storage/storageAccounts/stgjavavm3dd27109215","name":"stgjavavm3dd27109215","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-07T13:03:43.1243832Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-07T13:03:43.1243832Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-07T13:03:43.0775007Z","primaryEndpoints":{"blob":"https://stgjavavm3dd27109215.blob.core.windows.net/","queue":"https://stgjavavm3dd27109215.queue.core.windows.net/","table":"https://stgjavavm3dd27109215.table.core.windows.net/","file":"https://stgjavavm3dd27109215.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/javacsmrg771/providers/Microsoft.Storage/storageAccounts/stg8019","name":"stg8019","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-07T22:52:44.3417181Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-07T22:52:44.3417181Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-07T22:52:44.3260939Z","primaryEndpoints":{"blob":"https://stg8019.blob.core.windows.net/","queue":"https://stg8019.queue.core.windows.net/","table":"https://stg8019.table.core.windows.net/","file":"https://stg8019.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rged92722916/providers/Microsoft.Storage/storageAccounts/st39055055d8","name":"st39055055d8","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:35.9620243Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:35.9620243Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-11-14T08:29:14.1632499Z","primaryEndpoints":{"blob":"https://st39055055d8.blob.core.windows.net/","queue":"https://st39055055d8.queue.core.windows.net/","table":"https://st39055055d8.table.core.windows.net/","file":"https://st39055055d8.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/javacsmrg3093/providers/Microsoft.Storage/storageAccounts/stg31634","name":"stg31634","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T07:28:13.1805425Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T07:28:13.1805425Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T07:28:13.1493074Z","primaryEndpoints":{"blob":"https://stg31634.blob.core.windows.net/","queue":"https://stg31634.queue.core.windows.net/","table":"https://stg31634.table.core.windows.net/","file":"https://stg31634.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/vmbdtest5960/providers/Microsoft.Storage/storageAccounts/stgjavavmbf44552277c","name":"stgjavavmbf44552277c","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-07T12:56:14.6365579Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-07T12:56:14.6365579Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-07T12:56:14.6053295Z","primaryEndpoints":{"blob":"https://stgjavavmbf44552277c.blob.core.windows.net/","queue":"https://stgjavavmbf44552277c.queue.core.windows.net/","table":"https://stgjavavmbf44552277c.table.core.windows.net/","file":"https://stgjavavmbf44552277c.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/vmbdtest6805/providers/Microsoft.Storage/storageAccounts/stgjavavm76e93900fb5","name":"stgjavavm76e93900fb5","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T15:28:13.0923956Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T15:28:13.0923956Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T15:28:13.0611455Z","primaryEndpoints":{"blob":"https://stgjavavm76e93900fb5.blob.core.windows.net/","queue":"https://stgjavavm76e93900fb5.queue.core.windows.net/","table":"https://stgjavavm76e93900fb5.table.core.windows.net/","file":"https://stgjavavm76e93900fb5.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/javacsmrg1819/providers/Microsoft.Storage/storageAccounts/stg6604","name":"stg6604","type":"Microsoft.Storage/storageAccounts","location":"eastus2","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-07T14:47:30.4664398Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-07T14:47:30.4664398Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-07T14:47:30.4195672Z","primaryEndpoints":{"blob":"https://stg6604.blob.core.windows.net/","queue":"https://stg6604.queue.core.windows.net/","table":"https://stg6604.table.core.windows.net/","file":"https://stg6604.file.core.windows.net/"},"primaryLocation":"eastus2","statusOfPrimary":"available","secondaryLocation":"centralus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cliautomationpyaffz2jgatrx3wmu5i3ms7e6vq6ffr6c7vpfafzb27ypbrksahwiedyawvx4g/providers/Microsoft.Storage/storageAccounts/acliautomationlab2482","name":"acliautomationlab2482","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"hidden-DevTestLabs-LabUId":"fad847a0-13b6-4061-9649-ad71226702f7"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-06T18:03:05.8117216Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-06T18:03:05.8117216Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-06T18:03:05.7648048Z","primaryEndpoints":{"blob":"https://acliautomationlab2482.blob.core.windows.net/","queue":"https://acliautomationlab2482.queue.core.windows.net/","table":"https://acliautomationlab2482.table.core.windows.net/","file":"https://acliautomationlab2482.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cliautomationtoxqsril3nh52zq7j2qv45ep7rtig4xnyg77hmcyl2uuausjromygxx7poq77x/providers/Microsoft.Storage/storageAccounts/acliautomationlab920","name":"acliautomationlab920","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"hidden-DevTestLabs-LabUId":"0958ba1e-279c-465c-a6a8-2b58d04b60b1"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7914959Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7914959Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-01-08T22:52:48.9788934Z","primaryEndpoints":{"blob":"https://acliautomationlab920.blob.core.windows.net/","queue":"https://acliautomationlab920.queue.core.windows.net/","table":"https://acliautomationlab920.table.core.windows.net/","file":"https://acliautomationlab920.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cliautomation01/providers/Microsoft.Storage/storageAccounts/acliautomationlab2281","name":"acliautomationlab2281","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"hidden-DevTestLabs-LabUId":"72f1b266-2a21-4f0a-af01-934c93c72e6e"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7289702Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7289702Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-07-07T16:46:33.749166Z","primaryEndpoints":{"blob":"https://acliautomationlab2281.blob.core.windows.net/","queue":"https://acliautomationlab2281.queue.core.windows.net/","table":"https://acliautomationlab2281.table.core.windows.net/","file":"https://acliautomationlab2281.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cliautomation01q2ksq7ibjhnl6y3qahzaq67qjcuv3p3xuhqhg6nufdyu6sttjlioho5vlbmp/providers/Microsoft.Storage/storageAccounts/acliautomationlab9808","name":"acliautomationlab9808","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"hidden-DevTestLabs-LabUId":"568e6db7-10b6-40e1-af55-4e5c0c9460b3"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7914959Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7914959Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-01-03T04:09:43.1153175Z","primaryEndpoints":{"blob":"https://acliautomationlab9808.blob.core.windows.net/","queue":"https://acliautomationlab9808.queue.core.windows.net/","table":"https://acliautomationlab9808.table.core.windows.net/","file":"https://acliautomationlab9808.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cliautomation01p5mb65te4noiwqbh7ni3sggmdrhbawq2atk5mc6elgdat5qkg6fuguonzmvj/providers/Microsoft.Storage/storageAccounts/acliautomationlab9396","name":"acliautomationlab9396","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"hidden-DevTestLabs-LabUId":"ba56a262-8f28-4665-86d9-18a308784945"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7914959Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7914959Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-12-08T20:14:17.6792122Z","primaryEndpoints":{"blob":"https://acliautomationlab9396.blob.core.windows.net/","queue":"https://acliautomationlab9396.queue.core.windows.net/","table":"https://acliautomationlab9396.table.core.windows.net/","file":"https://acliautomationlab9396.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cliautomation01ei2lu47wac7ixneeciagpf7ocqwvjvrq6rvkjl5hr2t3tyqkrzjdrsyd5lom/providers/Microsoft.Storage/storageAccounts/acliautomationlab4923","name":"acliautomationlab4923","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"hidden-DevTestLabs-LabUId":"db05f622-e24b-4bad-8265-0042a9feacff"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-26T20:28:36.5037123Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-26T20:28:36.5037123Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-01-26T20:28:36.3943699Z","primaryEndpoints":{"blob":"https://acliautomationlab4923.blob.core.windows.net/","queue":"https://acliautomationlab4923.queue.core.windows.net/","table":"https://acliautomationlab4923.table.core.windows.net/","file":"https://acliautomationlab4923.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cliautomation014o3znldng4uswc6mo6fhrx7gjnqitwa7b4ygnel5rhm624kjc53acrmyl3rk/providers/Microsoft.Storage/storageAccounts/acliautomationlab1633","name":"acliautomationlab1633","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"hidden-DevTestLabs-LabUId":"e33eb9e2-9aa6-4024-90b0-44509f6beded"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-06T18:03:01.1799270Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-06T18:03:01.1799270Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-06T18:03:01.1486631Z","primaryEndpoints":{"blob":"https://acliautomationlab1633.blob.core.windows.net/","queue":"https://acliautomationlab1633.queue.core.windows.net/","table":"https://acliautomationlab1633.table.core.windows.net/","file":"https://acliautomationlab1633.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cliautomationr7zmwrv545myosbhrhgmvyxvh473lloj24vcvwx5xuabi7hadxngt4sg7cbfxm/providers/Microsoft.Storage/storageAccounts/acliautomationlab4621","name":"acliautomationlab4621","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"hidden-DevTestLabs-LabUId":"3acb626c-e8a0-431d-bd15-47d2472c013f"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7602255Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7602255Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-12-07T18:36:05.7790991Z","primaryEndpoints":{"blob":"https://acliautomationlab4621.blob.core.windows.net/","queue":"https://acliautomationlab4621.queue.core.windows.net/","table":"https://acliautomationlab4621.table.core.windows.net/","file":"https://acliautomationlab4621.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cliautomation/providers/Microsoft.Storage/storageAccounts/acliautomationlab2987","name":"acliautomationlab2987","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"hidden-DevTestLabs-LabUId":"9f45d4bf-7e01-4684-9438-37c712728db1"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7446210Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7446210Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-07-07T16:48:01.7641299Z","primaryEndpoints":{"blob":"https://acliautomationlab2987.blob.core.windows.net/","queue":"https://acliautomationlab2987.queue.core.windows.net/","table":"https://acliautomationlab2987.table.core.windows.net/","file":"https://acliautomationlab2987.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cliautomation01l6uben7lla33aijx72dhaf3wb7dlqb2u7ixr7vhmojrwbr6e5gv2rvdneg5r/providers/Microsoft.Storage/storageAccounts/acliautomationlab1471","name":"acliautomationlab1471","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"hidden-DevTestLabs-LabUId":"48fc5481-154a-40d8-a96c-90f85a3186b5"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7289702Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7289702Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-12-26T15:33:35.4529781Z","primaryEndpoints":{"blob":"https://acliautomationlab1471.blob.core.windows.net/","queue":"https://acliautomationlab1471.queue.core.windows.net/","table":"https://acliautomationlab1471.table.core.windows.net/","file":"https://acliautomationlab1471.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rgl32osgy7cgkf2gfcwwpbcd5u76nxdn3k3r3kodgy6mqtntek4u6evygklnq5j4alp/providers/Microsoft.Storage/storageAccounts/clitest4bj7lpyqt63vmlicy","name":"clitest4bj7lpyqt63vmlicy","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T18:11:47.7602879Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T18:11:47.7602879Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T18:11:47.7134125Z","primaryEndpoints":{"blob":"https://clitest4bj7lpyqt63vmlicy.blob.core.windows.net/","queue":"https://clitest4bj7lpyqt63vmlicy.queue.core.windows.net/","table":"https://clitest4bj7lpyqt63vmlicy.table.core.windows.net/","file":"https://clitest4bj7lpyqt63vmlicy.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000003","name":"clitest000003","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T18:12:14.1064068Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T18:12:14.1064068Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T18:12:14.0439010Z","primaryEndpoints":{"blob":"https://clitest000003.blob.core.windows.net/","queue":"https://clitest000003.queue.core.windows.net/","table":"https://clitest000003.table.core.windows.net/","file":"https://clitest000003.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rgcv22bl3p5jculym7mxzp4qrzni5wnq3cmtnvsu52yhtwvwicm3fe3k6m24yqdilgh/providers/Microsoft.Storage/storageAccounts/clireg23zq5h4f67b5091810","name":"clireg23zq5h4f67b5091810","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"containerregistry":"clireg23zq5h4f67b5wu"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T09:18:14.1652856Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T09:18:14.1652856Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T09:18:14.1184391Z","primaryEndpoints":{"blob":"https://clireg23zq5h4f67b5091810.blob.core.windows.net/","queue":"https://clireg23zq5h4f67b5091810.queue.core.windows.net/","table":"https://clireg23zq5h4f67b5091810.table.core.windows.net/","file":"https://clireg23zq5h4f67b5091810.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cliautomation014m5le4sxlxnlbtvhekxljqndmwiuvvczqg2qumloh3nw3a6dg6qfqz65dczz/providers/Microsoft.Storage/storageAccounts/acliautomationlab2832","name":"acliautomationlab2832","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"hidden-DevTestLabs-LabUId":"ec24f56f-0a82-42f5-ae26-f391815aaf39"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-02T07:38:16.9674949Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-02T07:38:16.9674949Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-02T07:38:16.9356739Z","primaryEndpoints":{"blob":"https://acliautomationlab2832.blob.core.windows.net/","queue":"https://acliautomationlab2832.queue.core.windows.net/","table":"https://acliautomationlab2832.table.core.windows.net/","file":"https://acliautomationlab2832.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rgdck3uxgfru5tm5ikoovn76skc4ldgtdq2qwxnli35y5tprl44fji7ebjsrqoftih5/providers/Microsoft.Storage/storageAccounts/clitestmhylproyn6v45bhrk","name":"clitestmhylproyn6v45bhrk","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T18:11:19.2774391Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T18:11:19.2774391Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T18:11:19.2305445Z","primaryEndpoints":{"blob":"https://clitestmhylproyn6v45bhrk.blob.core.windows.net/","queue":"https://clitestmhylproyn6v45bhrk.queue.core.windows.net/","table":"https://clitestmhylproyn6v45bhrk.table.core.windows.net/","file":"https://clitestmhylproyn6v45bhrk.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cliautomationbvd5rqbmr4xfzxbbls4vvm4zl66fz5ykv73nqx3rtougzgxhksyjpn3l43txu3/providers/Microsoft.Storage/storageAccounts/acliautomationlab386","name":"acliautomationlab386","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"hidden-DevTestLabs-LabUId":"40c3e5e9-6d70-41a5-9ba0-dedd33f96963"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-02T07:38:24.9254634Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-02T07:38:24.9254634Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-02T07:38:24.9098324Z","primaryEndpoints":{"blob":"https://acliautomationlab386.blob.core.windows.net/","queue":"https://acliautomationlab386.queue.core.windows.net/","table":"https://acliautomationlab386.table.core.windows.net/","file":"https://acliautomationlab386.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rgcv22bl3p5jculym7mxzp4qrzni5wnq3cmtnvsu52yhtwvwicm3fe3k6m24yqdilgh/providers/Microsoft.Storage/storageAccounts/clitestaycxoezila4zvz3oc","name":"clitestaycxoezila4zvz3oc","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T09:17:31.1771220Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T09:17:31.1771220Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T09:17:31.1146217Z","primaryEndpoints":{"blob":"https://clitestaycxoezila4zvz3oc.blob.core.windows.net/","queue":"https://clitestaycxoezila4zvz3oc.queue.core.windows.net/","table":"https://clitestaycxoezila4zvz3oc.table.core.windows.net/","file":"https://clitestaycxoezila4zvz3oc.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cliautomationzlgmnmobxi6bkdkatnybuntm5ic5csahw33ox6rmthro3hjfgfqujqkdlrxfje/providers/Microsoft.Storage/storageAccounts/acliautomationlab3782","name":"acliautomationlab3782","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"hidden-DevTestLabs-LabUId":"b9dc7e5c-5ff3-4687-bf01-83833a4ccd53"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-04T06:41:36.4612382Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-04T06:41:36.4612382Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-04T06:41:36.4143632Z","primaryEndpoints":{"blob":"https://acliautomationlab3782.blob.core.windows.net/","queue":"https://acliautomationlab3782.queue.core.windows.net/","table":"https://acliautomationlab3782.table.core.windows.net/","file":"https://acliautomationlab3782.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cliautomation01bn7wa4ubnulp6m4khobeloz6mvbxxg6ygalgryhylt2zpjgqcumow6ih26ud/providers/Microsoft.Storage/storageAccounts/acliautomationlab8383","name":"acliautomationlab8383","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"hidden-DevTestLabs-LabUId":"417cc8eb-3e86-4a90-9ce0-e215c7a4b9be"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-31T19:38:42.9687239Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-31T19:38:42.9687239Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-01-31T19:38:42.9375080Z","primaryEndpoints":{"blob":"https://acliautomationlab8383.blob.core.windows.net/","queue":"https://acliautomationlab8383.queue.core.windows.net/","table":"https://acliautomationlab8383.table.core.windows.net/","file":"https://acliautomationlab8383.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg2claqiiin2xfwkiskmfrvz2arekdocwsl7ff63gkroosvxv2whwbgdanw4tgesatc/providers/Microsoft.Storage/storageAccounts/clitest6uk5hhihzzby4ytcq","name":"clitest6uk5hhihzzby4ytcq","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T08:12:51.8379955Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T08:12:51.8379955Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T08:12:51.7754853Z","primaryEndpoints":{"blob":"https://clitest6uk5hhihzzby4ytcq.blob.core.windows.net/","queue":"https://clitest6uk5hhihzzby4ytcq.queue.core.windows.net/","table":"https://clitest6uk5hhihzzby4ytcq.table.core.windows.net/","file":"https://clitest6uk5hhihzzby4ytcq.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cliautomation01ldu2m7bvtvotoelxgw2icl5sivnvoixudxyql6l42hseiv5stbbuulg7g3h4/providers/Microsoft.Storage/storageAccounts/acliautomationlab9248","name":"acliautomationlab9248","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"hidden-DevTestLabs-LabUId":"3ff20302-c399-4d32-88ed-2c84952da1c3"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7914959Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7914959Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-01-04T00:40:16.2044479Z","primaryEndpoints":{"blob":"https://acliautomationlab9248.blob.core.windows.net/","queue":"https://acliautomationlab9248.queue.core.windows.net/","table":"https://acliautomationlab9248.table.core.windows.net/","file":"https://acliautomationlab9248.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cliautomation016zx7ulhvrc7ng6fcdst72y2t2fgbvbyueykqnw4d76aq4gyxd267voh5nixs/providers/Microsoft.Storage/storageAccounts/acliautomationlab8049","name":"acliautomationlab8049","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"hidden-DevTestLabs-LabUId":"909a5513-261d-4cd4-a8dd-19a18a866f77"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7758767Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7758767Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-12-08T02:56:53.0185142Z","primaryEndpoints":{"blob":"https://acliautomationlab8049.blob.core.windows.net/","queue":"https://acliautomationlab8049.queue.core.windows.net/","table":"https://acliautomationlab8049.table.core.windows.net/","file":"https://acliautomationlab8049.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cliautomation013mvyy356dnjmb5iwivgwu3gp2bgpjaik6sx3zxuqg36vhnchoc5vwvzzvxu4/providers/Microsoft.Storage/storageAccounts/acliautomationlab8828","name":"acliautomationlab8828","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"hidden-DevTestLabs-LabUId":"33f5487f-2303-4193-9ec1-9f4820d78d00"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7758767Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7758767Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-01-05T07:38:28.7575542Z","primaryEndpoints":{"blob":"https://acliautomationlab8828.blob.core.windows.net/","queue":"https://acliautomationlab8828.queue.core.windows.net/","table":"https://acliautomationlab8828.table.core.windows.net/","file":"https://acliautomationlab8828.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg5ekbhxjo6bqmf6jq6v3hdloqo6c2aowo6vhlg3huqevasa6vpuncpyhmjjvz2tlae/providers/Microsoft.Storage/storageAccounts/clitestysso67rm2b3ckvaap","name":"clitestysso67rm2b3ckvaap","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T18:12:31.0284038Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T18:12:31.0284038Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"ResolvingDns","creationTime":"2018-02-08T18:12:30.9815153Z","primaryEndpoints":{"blob":"https://clitestysso67rm2b3ckvaap.blob.core.windows.net/","queue":"https://clitestysso67rm2b3ckvaap.queue.core.windows.net/","table":"https://clitestysso67rm2b3ckvaap.table.core.windows.net/","file":"https://clitestysso67rm2b3ckvaap.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cliautomation01iy5u4xyaed2wgxpr3oshkjvesx7eypiagoyydutuuwbrotz44zddkgr7qfay/providers/Microsoft.Storage/storageAccounts/acliautomationlab1940","name":"acliautomationlab1940","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"hidden-DevTestLabs-LabUId":"867204a5-7d7c-41c3-866f-845829532736"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-04T06:41:24.3204875Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-04T06:41:24.3204875Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-04T06:41:24.2579926Z","primaryEndpoints":{"blob":"https://acliautomationlab1940.blob.core.windows.net/","queue":"https://acliautomationlab1940.queue.core.windows.net/","table":"https://acliautomationlab1940.table.core.windows.net/","file":"https://acliautomationlab1940.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cliautomationrmo5dcfkn2tcdobw3qhwsafqbqgge3o7emagrlfoxgsioc2jr7e5cjztqewzla/providers/Microsoft.Storage/storageAccounts/acliautomationlab6710","name":"acliautomationlab6710","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"hidden-DevTestLabs-LabUId":"90a7effd-a5b2-48ce-ac70-88b48096881c"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7602255Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7602255Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-01-03T04:10:00.39885Z","primaryEndpoints":{"blob":"https://acliautomationlab6710.blob.core.windows.net/","queue":"https://acliautomationlab6710.queue.core.windows.net/","table":"https://acliautomationlab6710.table.core.windows.net/","file":"https://acliautomationlab6710.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cliautomationpytfzqow2fyxfbik7w4k34yguitwrmhunpwy4ozpgsy243novl4fjnlev2zfly/providers/Microsoft.Storage/storageAccounts/acliautomationlab1008","name":"acliautomationlab1008","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"hidden-DevTestLabs-LabUId":"7dfd84e6-8815-45cd-a927-4ea20034ff9e"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-31T19:38:56.9344030Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-31T19:38:56.9344030Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-01-31T19:38:56.8562798Z","primaryEndpoints":{"blob":"https://acliautomationlab1008.blob.core.windows.net/","queue":"https://acliautomationlab1008.queue.core.windows.net/","table":"https://acliautomationlab1008.table.core.windows.net/","file":"https://acliautomationlab1008.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rgto2ghq4h25fuawweucv6ste57zdppblaq4wjjkogzmaqyvsk7j62layubppuog7ey/providers/Microsoft.Storage/storageAccounts/clitestsfuvmkmzvamdsi47q","name":"clitestsfuvmkmzvamdsi47q","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T18:09:38.9141035Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T18:09:38.9141035Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T18:09:38.8672665Z","primaryEndpoints":{"blob":"https://clitestsfuvmkmzvamdsi47q.blob.core.windows.net/","queue":"https://clitestsfuvmkmzvamdsi47q.queue.core.windows.net/","table":"https://clitestsfuvmkmzvamdsi47q.table.core.windows.net/","file":"https://clitestsfuvmkmzvamdsi47q.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T18:11:37.6366830Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T18:11:37.6366830Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T18:11:37.5741907Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cliautomationgbb6evd4zx72bc5wpfijxlcbpo5n24rkj2kg3y57jpl2mkxc6w5x5exnsantug/providers/Microsoft.Storage/storageAccounts/acliautomationlab5191","name":"acliautomationlab5191","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"hidden-DevTestLabs-LabUId":"bfb18d73-f216-4bdc-aba6-252bba91adb2"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-26T20:28:36.4256121Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-26T20:28:36.4256121Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-01-26T20:28:36.3631077Z","primaryEndpoints":{"blob":"https://acliautomationlab5191.blob.core.windows.net/","queue":"https://acliautomationlab5191.queue.core.windows.net/","table":"https://acliautomationlab5191.table.core.windows.net/","file":"https://acliautomationlab5191.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cliautomationrcjorwrtg3oudx2a6akfwe5e6n7ocvpleklcwwqclzazlly76iaddtkjqtdwbe/providers/Microsoft.Storage/storageAccounts/acliautomationlab5146","name":"acliautomationlab5146","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"hidden-DevTestLabs-LabUId":"6734c4ab-6f8d-46e5-afec-0ed8275cccc7"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T16:45:00.1329602Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T16:45:00.1329602Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T16:45:00.0861198Z","primaryEndpoints":{"blob":"https://acliautomationlab5146.blob.core.windows.net/","queue":"https://acliautomationlab5146.queue.core.windows.net/","table":"https://acliautomationlab5146.table.core.windows.net/","file":"https://acliautomationlab5146.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cliautomation01undmfcuvtas2vq76b7cdf2bcb522g55yjxgq26oqjumof4h3bkhfa5f5galo/providers/Microsoft.Storage/storageAccounts/acliautomationlab3187","name":"acliautomationlab3187","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"hidden-DevTestLabs-LabUId":"3cd350aa-2568-49ea-a4a2-41dd07e9e8ac"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7446210Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7446210Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-01-02T05:13:09.9630161Z","primaryEndpoints":{"blob":"https://acliautomationlab3187.blob.core.windows.net/","queue":"https://acliautomationlab3187.queue.core.windows.net/","table":"https://acliautomationlab3187.table.core.windows.net/","file":"https://acliautomationlab3187.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cliautomationsxtwbd7crie33fjnfjz2zp7ibcmfz4gyjh5mvqoqkz3y7txx7g34rl7mmoucew/providers/Microsoft.Storage/storageAccounts/acliautomationlab3276","name":"acliautomationlab3276","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"hidden-DevTestLabs-LabUId":"9f96ba9d-7858-43e0-a93a-9424a36a0975"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7602255Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7602255Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-01-05T07:38:39.4934331Z","primaryEndpoints":{"blob":"https://acliautomationlab3276.blob.core.windows.net/","queue":"https://acliautomationlab3276.queue.core.windows.net/","table":"https://acliautomationlab3276.table.core.windows.net/","file":"https://acliautomationlab3276.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Premium_LRS","tier":"Premium"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/sdk-test/providers/Microsoft.Storage/storageAccounts/sdkteststor","name":"sdkteststor","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"supportsHttpsTrafficOnly":false,"encryption":{"services":{"blob":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.8539723Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-05-21T04:29:51.1804697Z","primaryEndpoints":{"blob":"https://sdkteststor.blob.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cliautomationyl5duneg4gkn25csd2rd4lbm2yjjq5n33z24jxikgchafi3xnfgokwxtsor56r/providers/Microsoft.Storage/storageAccounts/acliautomationlab1231","name":"acliautomationlab1231","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"hidden-DevTestLabs-LabUId":"f500a48c-e003-403a-b50a-903a96f6d226"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7133409Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7133409Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-12-08T02:59:00.3810995Z","primaryEndpoints":{"blob":"https://acliautomationlab1231.blob.core.windows.net/","queue":"https://acliautomationlab1231.queue.core.windows.net/","table":"https://acliautomationlab1231.table.core.windows.net/","file":"https://acliautomationlab1231.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/javacsmrg6246/providers/Microsoft.Storage/storageAccounts/javawebapp735267887","name":"javawebapp735267887","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T12:44:08.0866484Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T12:44:08.0866484Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T12:44:08.0397682Z","primaryEndpoints":{"blob":"https://javawebapp735267887.blob.core.windows.net/","queue":"https://javawebapp735267887.queue.core.windows.net/","table":"https://javawebapp735267887.table.core.windows.net/","file":"https://javawebapp735267887.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available","secondaryLocation":"eastus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cliautomation01ptu376gffvlvblokeyvsvqoefixzvz2uosy7gvqozzktnhvpufmcc5ut4ytd/providers/Microsoft.Storage/storageAccounts/acliautomationlab2257","name":"acliautomationlab2257","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"hidden-DevTestLabs-LabUId":"e6cd699b-4ac2-4022-a435-960bc7d3ee9f"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7289702Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7289702Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-01-08T22:52:45.5675859Z","primaryEndpoints":{"blob":"https://acliautomationlab2257.blob.core.windows.net/","queue":"https://acliautomationlab2257.queue.core.windows.net/","table":"https://acliautomationlab2257.table.core.windows.net/","file":"https://acliautomationlab2257.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cliautomation01kr3ll4q2x5vuwozn4xz6zoybb4odfjebsjtwcxrehup7jnzykb47tmcsohyz/providers/Microsoft.Storage/storageAccounts/acliautomationlab6989","name":"acliautomationlab6989","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"hidden-DevTestLabs-LabUId":"3e585a6c-7c78-494c-99f8-a56e8734fb6d"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T16:44:45.7241602Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T16:44:45.7241602Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T16:44:45.6772890Z","primaryEndpoints":{"blob":"https://acliautomationlab6989.blob.core.windows.net/","queue":"https://acliautomationlab6989.queue.core.windows.net/","table":"https://acliautomationlab6989.table.core.windows.net/","file":"https://acliautomationlab6989.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cliautomationt3zeu76ormrubewlqrnf4ykozdfs3pr2ahftj4d33tuybrpobavi5sbtcdcfc4/providers/Microsoft.Storage/storageAccounts/acliautomationlab9106","name":"acliautomationlab9106","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"hidden-DevTestLabs-LabUId":"498bf2d2-520c-42fd-b974-269015697a98"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7758767Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7758767Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-01-04T00:40:33.0829429Z","primaryEndpoints":{"blob":"https://acliautomationlab9106.blob.core.windows.net/","queue":"https://acliautomationlab9106.queue.core.windows.net/","table":"https://acliautomationlab9106.table.core.windows.net/","file":"https://acliautomationlab9106.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/javacsmrg9129/providers/Microsoft.Storage/storageAccounts/javawebapp575092367","name":"javawebapp575092367","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T02:46:42.1621654Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T02:46:42.1621654Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T02:46:42.1153349Z","primaryEndpoints":{"blob":"https://javawebapp575092367.blob.core.windows.net/","queue":"https://javawebapp575092367.queue.core.windows.net/","table":"https://javawebapp575092367.table.core.windows.net/","file":"https://javawebapp575092367.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available","secondaryLocation":"eastus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cliautomation2nscoydrikfz67cluekp6xqv4zkltay5x7ubl3qh2yb73qfdjq3j24fzcrd766/providers/Microsoft.Storage/storageAccounts/acliautomationlab2578","name":"acliautomationlab2578","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"hidden-DevTestLabs-LabUId":"8cf9f8f3-ff0c-43a5-809d-b4be39f17fa8"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7446210Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-09T01:40:36.7446210Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-01-02T05:13:20.2601933Z","primaryEndpoints":{"blob":"https://acliautomationlab2578.blob.core.windows.net/","queue":"https://acliautomationlab2578.queue.core.windows.net/","table":"https://acliautomationlab2578.table.core.windows.net/","file":"https://acliautomationlab2578.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rga3f3zxudbuy3iipjzrrdghm5c5gqapaqnp3bxhrqtyvmpvin2ees27mrrzg2j5t6e/providers/Microsoft.Storage/storageAccounts/clitest4ibjeed42cdh5vxdc","name":"clitest4ibjeed42cdh5vxdc","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T18:12:02.8966124Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T18:12:02.8966124Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T18:12:02.8497510Z","primaryEndpoints":{"blob":"https://clitest4ibjeed42cdh5vxdc.blob.core.windows.net/","queue":"https://clitest4ibjeed42cdh5vxdc.queue.core.windows.net/","table":"https://clitest4ibjeed42cdh5vxdc.table.core.windows.net/","file":"https://clitest4ibjeed42cdh5vxdc.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_RAGRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/wilxgroup/providers/Microsoft.Storage/storageAccounts/wilxstorage","name":"wilxstorage","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-05T21:40:13.3804210Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-05T21:40:13.3804210Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-05T21:40:13.3335235Z","primaryEndpoints":{"blob":"https://wilxstorage.blob.core.windows.net/","queue":"https://wilxstorage.queue.core.windows.net/","table":"https://wilxstorage.table.core.windows.net/","file":"https://wilxstorage.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available","secondaryLocation":"eastus","statusOfSecondary":"available","secondaryEndpoints":{"blob":"https://wilxstorage-secondary.blob.core.windows.net/","queue":"https://wilxstorage-secondary.queue.core.windows.net/","table":"https://wilxstorage-secondary.table.core.windows.net/"}}}]}'} + body: {string: '{"value":[{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitesti4aotnzdo4/providers/Microsoft.Storage/storageAccounts/o0zeaawp7t7n4skagntpri4","name":"o0zeaawp7t7n4skagntpri4","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-18T18:34:00.2637195Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-18T18:34:00.2637195Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-01-18T18:34:00.2168154Z","primaryEndpoints":{"blob":"https://o0zeaawp7t7n4skagntpri4.blob.core.windows.net/","queue":"https://o0zeaawp7t7n4skagntpri4.queue.core.windows.net/","table":"https://o0zeaawp7t7n4skagntpri4.table.core.windows.net/","file":"https://o0zeaawp7t7n4skagntpri4.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitesti4aotnzdo4/providers/Microsoft.Storage/storageAccounts/zeaawp7t7n4skagntpub","name":"zeaawp7t7n4skagntpub","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-18T18:34:00.5762847Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-18T18:34:00.5762847Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-01-18T18:34:00.5294154Z","primaryEndpoints":{"blob":"https://zeaawp7t7n4skagntpub.blob.core.windows.net/","queue":"https://zeaawp7t7n4skagntpub.queue.core.windows.net/","table":"https://zeaawp7t7n4skagntpub.table.core.windows.net/","file":"https://zeaawp7t7n4skagntpub.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/storGRP1/providers/Microsoft.Storage/storageAccounts/storacc2","name":"storacc2","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-09T18:24:41.3214880Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-09T18:24:41.3214880Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-01-09T18:24:41.2902466Z","primaryEndpoints":{"blob":"https://storacc2.blob.core.windows.net/","queue":"https://storacc2.queue.core.windows.net/","table":"https://storacc2.table.core.windows.net/","file":"https://storacc2.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitesti4aotnzdo4/providers/Microsoft.Storage/storageAccounts/zeaawp7t7n4skdiag0","name":"zeaawp7t7n4skdiag0","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-18T18:34:00.7951275Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-18T18:34:00.7951275Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-01-18T18:34:00.7482499Z","primaryEndpoints":{"blob":"https://zeaawp7t7n4skdiag0.blob.core.windows.net/","queue":"https://zeaawp7t7n4skdiag0.queue.core.windows.net/","table":"https://zeaawp7t7n4skdiag0.table.core.windows.net/","file":"https://zeaawp7t7n4skdiag0.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyReallyCoolVM202/providers/Microsoft.Storage/storageAccounts/mynewaccount1234","name":"mynewaccount1234","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-04-27T21:34:15.2961058Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-04-27T21:34:15.2961058Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-04-27T21:34:15.2335978Z","primaryEndpoints":{"blob":"https://mynewaccount1234.blob.core.windows.net/","queue":"https://mynewaccount1234.queue.core.windows.net/","table":"https://mynewaccount1234.table.core.windows.net/","file":"https://mynewaccount1234.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitesti4aotnzdo4/providers/Microsoft.Storage/storageAccounts/60zeaawp7t7n4skagntpri1","name":"60zeaawp7t7n4skagntpri1","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-18T18:33:59.4978129Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-18T18:33:59.4978129Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-01-18T18:33:59.3727743Z","primaryEndpoints":{"blob":"https://60zeaawp7t7n4skagntpri1.blob.core.windows.net/","queue":"https://60zeaawp7t7n4skagntpri1.queue.core.windows.net/","table":"https://60zeaawp7t7n4skagntpri1.table.core.windows.net/","file":"https://60zeaawp7t7n4skagntpri1.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitesti4aotnzdo4/providers/Microsoft.Storage/storageAccounts/00zeaawp7t7n4skagntpri0","name":"00zeaawp7t7n4skagntpri0","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-18T18:33:57.1533290Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-18T18:33:57.1533290Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-01-18T18:33:57.1064646Z","primaryEndpoints":{"blob":"https://00zeaawp7t7n4skagntpri0.blob.core.windows.net/","queue":"https://00zeaawp7t7n4skagntpri0.queue.core.windows.net/","table":"https://00zeaawp7t7n4skagntpri0.table.core.windows.net/","file":"https://00zeaawp7t7n4skagntpri0.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available"}},{"sku":{"name":"Premium_LRS","tier":"Premium"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/wilxgroup/providers/Microsoft.Storage/storageAccounts/wilxgroupdisks925","name":"wilxgroupdisks925","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-03-13T17:14:42.2678046Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-03-13T17:14:42.2678046Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-03-13T17:14:42.2522063Z","primaryEndpoints":{"blob":"https://wilxgroupdisks925.blob.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitesti4aotnzdo4/providers/Microsoft.Storage/storageAccounts/i0zeaawp7t7n4skagntpri3","name":"i0zeaawp7t7n4skagntpri3","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-18T18:33:59.2790240Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-18T18:33:59.2790240Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-01-18T18:33:59.2321471Z","primaryEndpoints":{"blob":"https://i0zeaawp7t7n4skagntpri3.blob.core.windows.net/","queue":"https://i0zeaawp7t7n4skagntpri3.queue.core.windows.net/","table":"https://i0zeaawp7t7n4skagntpri3.table.core.windows.net/","file":"https://i0zeaawp7t7n4skagntpri3.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitesti4aotnzdo4/providers/Microsoft.Storage/storageAccounts/zeaawp7t7n4skexhb0","name":"zeaawp7t7n4skexhb0","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-18T18:34:00.8576146Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-18T18:34:00.8576146Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-01-18T18:34:00.7951275Z","primaryEndpoints":{"blob":"https://zeaawp7t7n4skexhb0.blob.core.windows.net/","queue":"https://zeaawp7t7n4skexhb0.queue.core.windows.net/","table":"https://zeaawp7t7n4skexhb0.table.core.windows.net/","file":"https://zeaawp7t7n4skexhb0.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitesti4aotnzdo4/providers/Microsoft.Storage/storageAccounts/zeaawp7t7n4skmstr0","name":"zeaawp7t7n4skmstr0","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-18T18:34:00.5294154Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-18T18:34:00.5294154Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-01-18T18:34:00.4825090Z","primaryEndpoints":{"blob":"https://zeaawp7t7n4skmstr0.blob.core.windows.net/","queue":"https://zeaawp7t7n4skmstr0.queue.core.windows.net/","table":"https://zeaawp7t7n4skmstr0.table.core.windows.net/","file":"https://zeaawp7t7n4skmstr0.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitesti4aotnzdo4/providers/Microsoft.Storage/storageAccounts/c0zeaawp7t7n4skagntpri2","name":"c0zeaawp7t7n4skagntpri2","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-18T18:34:00.8889157Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-18T18:34:00.8889157Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-01-18T18:34:00.8263879Z","primaryEndpoints":{"blob":"https://c0zeaawp7t7n4skagntpri2.blob.core.windows.net/","queue":"https://c0zeaawp7t7n4skagntpri2.queue.core.windows.net/","table":"https://c0zeaawp7t7n4skagntpri2.table.core.windows.net/","file":"https://c0zeaawp7t7n4skagntpri2.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available"}},{"identity":{"principalId":"4b358eca-1f6e-4da5-a90c-5cfda2b6ca83","tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","type":"SystemAssigned"},"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"StorageV2","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/amar/providers/Microsoft.Storage/storageAccounts/eastustorage1","name":"eastustorage1","type":"Microsoft.Storage/storageAccounts","location":"eastus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-03-21T02:38:33.4035294Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-03-21T02:38:33.4035294Z"}},"keySource":"Microsoft.Storage"},"accessTier":"Hot","provisioningState":"Succeeded","creationTime":"2018-03-21T02:38:33.3253713Z","primaryEndpoints":{"blob":"https://eastustorage1.blob.core.windows.net/","queue":"https://eastustorage1.queue.core.windows.net/","table":"https://eastustorage1.table.core.windows.net/","file":"https://eastustorage1.file.core.windows.net/"},"primaryLocation":"eastus","statusOfPrimary":"available","secondaryLocation":"westus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_RAGRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/wilxgroupeastus2/providers/Microsoft.Storage/storageAccounts/wilxstorageeastus2","name":"wilxstorageeastus2","type":"Microsoft.Storage/storageAccounts","location":"eastus2","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-04-30T18:32:07.3429304Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-04-30T18:32:07.3429304Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-04-30T18:32:07.2804546Z","primaryEndpoints":{"blob":"https://wilxstorageeastus2.blob.core.windows.net/","queue":"https://wilxstorageeastus2.queue.core.windows.net/","table":"https://wilxstorageeastus2.table.core.windows.net/","file":"https://wilxstorageeastus2.file.core.windows.net/"},"primaryLocation":"eastus2","statusOfPrimary":"available","secondaryLocation":"centralus","statusOfSecondary":"available","secondaryEndpoints":{"blob":"https://wilxstorageeastus2-secondary.blob.core.windows.net/","queue":"https://wilxstorageeastus2-secondary.queue.core.windows.net/","table":"https://wilxstorageeastus2-secondary.table.core.windows.net/"}}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rgp3j2bt5nvsedgoxpqt6xtucbamnbo7jkgrcckdigt3aclxopqxio6lxjlqrj3czo7/providers/Microsoft.Storage/storageAccounts/clitestt7lrbv35ny3lgnfak","name":"clitestt7lrbv35ny3lgnfak","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.1522571Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.1522571Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-11-26T06:17:59.2725025Z","primaryEndpoints":{"blob":"https://clitestt7lrbv35ny3lgnfak.blob.core.windows.net/","queue":"https://clitestt7lrbv35ny3lgnfak.queue.core.windows.net/","table":"https://clitestt7lrbv35ny3lgnfak.table.core.windows.net/","file":"https://clitestt7lrbv35ny3lgnfak.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/vscode-spot/providers/Microsoft.Storage/storageAccounts/spot1936b9594f55526a14","name":"spot1936b9594f55526a14","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-04-30T04:32:25.2179795Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-04-30T04:32:25.2179795Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-04-30T04:32:25.0930004Z","primaryEndpoints":{"blob":"https://spot1936b9594f55526a14.blob.core.windows.net/","queue":"https://spot1936b9594f55526a14.queue.core.windows.net/","table":"https://spot1936b9594f55526a14.table.core.windows.net/","file":"https://spot1936b9594f55526a14.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/wilxgroup/providers/Microsoft.Storage/storageAccounts/awilxlab6038","name":"awilxlab6038","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"hidden-DevTestLabs-LabUId":"8887c3df-fb11-4c4a-b5ea-fb85003cd93d"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-04-11T22:14:43.7809117Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-04-11T22:14:43.7809117Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-04-11T22:14:43.6871681Z","primaryEndpoints":{"blob":"https://awilxlab6038.blob.core.windows.net/","queue":"https://awilxlab6038.queue.core.windows.net/","table":"https://awilxlab6038.table.core.windows.net/","file":"https://awilxlab6038.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/foozap002/providers/Microsoft.Storage/storageAccounts/foozy985","name":"foozy985","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"key1":"value1","key2":"value2"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.2460333Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.2460333Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-07-11T22:39:05.4716715Z","primaryEndpoints":{"blob":"https://foozy985.blob.core.windows.net/","queue":"https://foozy985.queue.core.windows.net/","table":"https://foozy985.table.core.windows.net/","file":"https://foozy985.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available","secondaryLocation":"eastus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"StorageV2","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/amar/providers/Microsoft.Storage/storageAccounts/testacc7561","name":"testacc7561","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-03-13T01:22:28.4626746Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-03-13T01:22:28.4626746Z"}},"keySource":"Microsoft.Storage"},"accessTier":"Hot","provisioningState":"Succeeded","creationTime":"2018-03-13T01:22:28.4157923Z","primaryEndpoints":{"blob":"https://testacc7561.blob.core.windows.net/","queue":"https://testacc7561.queue.core.windows.net/","table":"https://testacc7561.table.core.windows.net/","file":"https://testacc7561.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available","secondaryLocation":"eastus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rgcy7ox5qk3ftoqfvnj2gsphlw7o3kwgyxw7zuvep5lgezszs2ik2wsar4amtsck7mw/providers/Microsoft.Storage/storageAccounts/clitestjjf7hxdcmump2f5jj","name":"clitestjjf7hxdcmump2f5jj","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:48:25.4950895Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:48:25.4950895Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:48:25.4013159Z","primaryEndpoints":{"blob":"https://clitestjjf7hxdcmump2f5jj.blob.core.windows.net/","queue":"https://clitestjjf7hxdcmump2f5jj.queue.core.windows.net/","table":"https://clitestjjf7hxdcmump2f5jj.table.core.windows.net/","file":"https://clitestjjf7hxdcmump2f5jj.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_RAGRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/wilxgroup/providers/Microsoft.Storage/storageAccounts/wilxstorage2","name":"wilxstorage2","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-03-16T19:43:30.0571507Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-03-16T19:43:30.0571507Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-03-16T19:43:29.9946790Z","primaryEndpoints":{"blob":"https://wilxstorage2.blob.core.windows.net/","queue":"https://wilxstorage2.queue.core.windows.net/","table":"https://wilxstorage2.table.core.windows.net/","file":"https://wilxstorage2.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available","secondaryLocation":"eastus","statusOfSecondary":"available","secondaryEndpoints":{"blob":"https://wilxstorage2-secondary.blob.core.windows.net/","queue":"https://wilxstorage2-secondary.queue.core.windows.net/","table":"https://wilxstorage2-secondary.table.core.windows.net/"}}},{"sku":{"name":"Standard_ZRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zitest/providers/Microsoft.Storage/storageAccounts/foostore103","name":"foostore103","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.1991330Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.1991330Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2016-05-25T23:52:18.1234838Z","primaryEndpoints":{"blob":"https://foostore103.blob.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_ZRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zitest/providers/Microsoft.Storage/storageAccounts/foostore102","name":"foostore102","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.1835342Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.1835342Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2016-05-25T19:32:49.5192125Z","primaryEndpoints":{"blob":"https://foostore102.blob.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rgcy7ox5qk3ftoqfvnj2gsphlw7o3kwgyxw7zuvep5lgezszs2ik2wsar4amtsck7mw/providers/Microsoft.Storage/storageAccounts/clitestwtqzdriopzuaexpa2","name":"clitestwtqzdriopzuaexpa2","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:48:06.2918736Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:48:06.2918736Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:48:06.2137287Z","primaryEndpoints":{"blob":"https://clitestwtqzdriopzuaexpa2.blob.core.windows.net/","queue":"https://clitestwtqzdriopzuaexpa2.queue.core.windows.net/","table":"https://clitestwtqzdriopzuaexpa2.table.core.windows.net/","file":"https://clitestwtqzdriopzuaexpa2.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zitest/providers/Microsoft.Storage/storageAccounts/zitest345","name":"zitest345","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"key1":"value1","key2":"value2"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-03-27T09:10:59.8313291Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-03-27T09:10:59.8313291Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-07-07T21:55:13.9394493Z","primaryEndpoints":{"blob":"https://zitest345.blob.core.windows.net/","queue":"https://zitest345.queue.core.windows.net/","table":"https://zitest345.table.core.windows.net/","file":"https://zitest345.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available","secondaryLocation":"eastus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zitest/providers/Microsoft.Storage/storageAccounts/zitest","name":"zitest","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-03-27T09:10:59.7688032Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-03-27T09:10:59.7688032Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2016-05-03T20:07:05.353746Z","primaryEndpoints":{"blob":"https://zitest.blob.core.windows.net/","queue":"https://zitest.queue.core.windows.net/","table":"https://zitest.table.core.windows.net/","file":"https://zitest.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"StorageV2","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zitest/providers/Microsoft.Storage/storageAccounts/zitest1012","name":"zitest1012","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-03-27T09:10:59.8001033Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-03-27T09:10:59.8001033Z"}},"keySource":"Microsoft.Storage"},"accessTier":"Hot","provisioningState":"Succeeded","creationTime":"2017-07-07T02:12:27.684591Z","primaryEndpoints":{"blob":"https://zitest1012.blob.core.windows.net/","queue":"https://zitest1012.queue.core.windows.net/","table":"https://zitest1012.table.core.windows.net/","file":"https://zitest1012.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rgvnc44s5iiyknx6iehpbmjsf7y6xsqhrqvyb5opb2yr5wagkqftcqlbbpfkralo2id/providers/Microsoft.Storage/storageAccounts/clitesttc4beb6y7zcdc7zly","name":"clitesttc4beb6y7zcdc7zly","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.1522571Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.1522571Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-11-26T06:16:26.3626209Z","primaryEndpoints":{"blob":"https://clitesttc4beb6y7zcdc7zly.blob.core.windows.net/","queue":"https://clitesttc4beb6y7zcdc7zly.queue.core.windows.net/","table":"https://clitesttc4beb6y7zcdc7zly.table.core.windows.net/","file":"https://clitesttc4beb6y7zcdc7zly.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/lmazuel-docker-machine/providers/Microsoft.Storage/storageAccounts/vhdsn51j1sdv8scmv98fmq8q","name":"vhdsn51j1sdv8scmv98fmq8q","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.3085287Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.3085287Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-11-03T21:43:45.5227216Z","primaryEndpoints":{"blob":"https://vhdsn51j1sdv8scmv98fmq8q.blob.core.windows.net/","queue":"https://vhdsn51j1sdv8scmv98fmq8q.queue.core.windows.net/","table":"https://vhdsn51j1sdv8scmv98fmq8q.table.core.windows.net/","file":"https://vhdsn51j1sdv8scmv98fmq8q.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rgpr2r634eggrjey2jx7izbldaygmfpo4oz23evpt6gldownza2h3gwzfam5h7nffwd/providers/Microsoft.Storage/storageAccounts/clitestbo4aozjkl4cp5ceex","name":"clitestbo4aozjkl4cp5ceex","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:48:21.6512920Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:48:21.6512920Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:48:21.5575410Z","primaryEndpoints":{"blob":"https://clitestbo4aozjkl4cp5ceex.blob.core.windows.net/","queue":"https://clitestbo4aozjkl4cp5ceex.queue.core.windows.net/","table":"https://clitestbo4aozjkl4cp5ceex.table.core.windows.net/","file":"https://clitestbo4aozjkl4cp5ceex.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/foozap002/providers/Microsoft.Storage/storageAccounts/foozy984","name":"foozy984","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"key1":"value1","key2":"value2"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.2460333Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.2460333Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-07-11T18:22:12.9346214Z","primaryEndpoints":{"blob":"https://foozy984.blob.core.windows.net/","queue":"https://foozy984.queue.core.windows.net/","table":"https://foozy984.table.core.windows.net/","file":"https://foozy984.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available","secondaryLocation":"eastus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rgzlponhuihq2f3r2ncatzpvyupukdm6ixm63jq2whzuvbuchjhov4vejrj4uspf7ju/providers/Microsoft.Storage/storageAccounts/clitestracm62rkgrryoiiig","name":"clitestracm62rkgrryoiiig","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-04-19T16:57:00.9900481Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-04-19T16:57:00.9900481Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-04-19T16:57:00.9119456Z","primaryEndpoints":{"blob":"https://clitestracm62rkgrryoiiig.blob.core.windows.net/","queue":"https://clitestracm62rkgrryoiiig.queue.core.windows.net/","table":"https://clitestracm62rkgrryoiiig.table.core.windows.net/","file":"https://clitestracm62rkgrryoiiig.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zitest/providers/Microsoft.Storage/storageAccounts/testacc209","name":"testacc209","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-03-27T09:10:45.3156846Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-03-27T09:10:45.3156846Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2016-01-26T19:04:16.5466637Z","primaryEndpoints":{"blob":"https://testacc209.blob.core.windows.net/","queue":"https://testacc209.queue.core.windows.net/","table":"https://testacc209.table.core.windows.net/","file":"https://testacc209.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cloud-shell-storage-westus/providers/Microsoft.Storage/storageAccounts/cs400977cdb163fx435fx9c3","name":"cs400977cdb163fx435fx9c3","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"ms-resource-usage":"azure-cloud-shell"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.1678828Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.1678828Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-10-31T20:15:56.3292318Z","primaryEndpoints":{"blob":"https://cs400977cdb163fx435fx9c3.blob.core.windows.net/","queue":"https://cs400977cdb163fx435fx9c3.queue.core.windows.net/","table":"https://cs400977cdb163fx435fx9c3.table.core.windows.net/","file":"https://cs400977cdb163fx435fx9c3.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rgwgjgodisz2vcsd55l3bixhutc5fbnyeyjuyatvgcv5k7sfzmxd6q2w4krnuq53zb7/providers/Microsoft.Storage/storageAccounts/clitestwwftaylvfj7kendae","name":"clitestwwftaylvfj7kendae","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.1678828Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.1678828Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-11-26T06:22:09.5983536Z","primaryEndpoints":{"blob":"https://clitestwwftaylvfj7kendae.blob.core.windows.net/","queue":"https://clitestwwftaylvfj7kendae.queue.core.windows.net/","table":"https://clitestwwftaylvfj7kendae.table.core.windows.net/","file":"https://clitestwwftaylvfj7kendae.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/ziptxtdepl51/providers/Microsoft.Storage/storageAccounts/36y3ij42opovcstandardsa","name":"36y3ij42opovcstandardsa","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.1054140Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.1054140Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-12-15T01:53:43.4548265Z","primaryEndpoints":{"blob":"https://36y3ij42opovcstandardsa.blob.core.windows.net/","queue":"https://36y3ij42opovcstandardsa.queue.core.windows.net/","table":"https://36y3ij42opovcstandardsa.table.core.windows.net/","file":"https://36y3ij42opovcstandardsa.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zitest/providers/Microsoft.Storage/storageAccounts/zitestb21","name":"zitestb21","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-03-27T09:11:00.0656866Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-03-27T09:11:00.0656866Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2016-08-23T20:10:50.2990885Z","primaryEndpoints":{"blob":"https://zitestb21.blob.core.windows.net/","queue":"https://zitestb21.queue.core.windows.net/","table":"https://zitestb21.table.core.windows.net/","file":"https://zitestb21.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/foozap002/providers/Microsoft.Storage/storageAccounts/foozy891","name":"foozy891","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"key1":"value1","key2":"value2"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.2147571Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.2147571Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-07-08T00:35:23.7925542Z","primaryEndpoints":{"blob":"https://foozy891.blob.core.windows.net/","queue":"https://foozy891.queue.core.windows.net/","table":"https://foozy891.table.core.windows.net/","file":"https://foozy891.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available","secondaryLocation":"eastus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rgh73m2h6rniak5bbqyrad43luxpotdofmlndof5secsxxee53kwocysqnklf4bn7yd/providers/Microsoft.Storage/storageAccounts/clitesttohpa6d65i7atctbm","name":"clitesttohpa6d65i7atctbm","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.1678828Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.1678828Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-11-26T06:05:15.5574981Z","primaryEndpoints":{"blob":"https://clitesttohpa6d65i7atctbm.blob.core.windows.net/","queue":"https://clitesttohpa6d65i7atctbm.queue.core.windows.net/","table":"https://clitesttohpa6d65i7atctbm.table.core.windows.net/","file":"https://clitesttohpa6d65i7atctbm.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rgzgkjvgqueh6ylbuj5ktuxx6m6njxoabzpow65vpyumzmtjctna2jgz5lg2ggslj7v/providers/Microsoft.Storage/storageAccounts/clitestncgrg5ytsvot5spgf","name":"clitestncgrg5ytsvot5spgf","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:45:27.7307380Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:45:27.7307380Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:45:27.5276141Z","primaryEndpoints":{"blob":"https://clitestncgrg5ytsvot5spgf.blob.core.windows.net/","queue":"https://clitestncgrg5ytsvot5spgf.queue.core.windows.net/","table":"https://clitestncgrg5ytsvot5spgf.table.core.windows.net/","file":"https://clitestncgrg5ytsvot5spgf.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:48:18.3231444Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:48:18.3231444Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:48:18.2450195Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"StorageV2","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/ZiTest/providers/Microsoft.Storage/storageAccounts/ztesty3456","name":"ztesty3456","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-13T01:01:13.5308331Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-13T01:01:13.5308331Z"}},"keySource":"Microsoft.Storage"},"accessTier":"Hot","provisioningState":"Succeeded","creationTime":"2018-01-13T01:01:13.4995571Z","primaryEndpoints":{"blob":"https://ztesty3456.blob.core.windows.net/","queue":"https://ztesty3456.queue.core.windows.net/","table":"https://ztesty3456.table.core.windows.net/","file":"https://ztesty3456.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000003","name":"clitest000003","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:48:37.4795170Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:48:37.4795170Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:48:37.3857709Z","primaryEndpoints":{"blob":"https://clitest000003.blob.core.windows.net/","queue":"https://clitest000003.queue.core.windows.net/","table":"https://clitest000003.table.core.windows.net/","file":"https://clitest000003.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/some-unique-rg-name-second/providers/Microsoft.Storage/storageAccounts/tianosatest79","name":"tianosatest79","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-03-27T09:10:46.6281789Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-03-27T09:10:46.6281789Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-05-24T23:16:33.9028352Z","primaryEndpoints":{"blob":"https://tianosatest79.blob.core.windows.net/","queue":"https://tianosatest79.queue.core.windows.net/","table":"https://tianosatest79.table.core.windows.net/","file":"https://tianosatest79.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/foozap002/providers/Microsoft.Storage/storageAccounts/foozy894","name":"foozy894","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"key1":"value1","key2":"value2"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.2303818Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.2303818Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-07-08T00:39:03.09634Z","primaryEndpoints":{"blob":"https://foozy894.blob.core.windows.net/","queue":"https://foozy894.queue.core.windows.net/","table":"https://foozy894.table.core.windows.net/","file":"https://foozy894.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available","secondaryLocation":"eastus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testrg7175/providers/Microsoft.Storage/storageAccounts/testacc7447","name":"testacc7447","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-03-27T09:10:45.4719947Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-03-27T09:10:45.4719947Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-09-21T19:13:51.907911Z","primaryEndpoints":{"blob":"https://testacc7447.blob.core.windows.net/","queue":"https://testacc7447.queue.core.windows.net/","table":"https://testacc7447.table.core.windows.net/","file":"https://testacc7447.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zitest/providers/Microsoft.Storage/storageAccounts/zitesta21","name":"zitesta21","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-03-27T09:11:00.0344305Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-03-27T09:11:00.0344305Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2016-08-23T20:01:18.8418933Z","primaryEndpoints":{"blob":"https://zitesta21.blob.core.windows.net/","queue":"https://zitesta21.queue.core.windows.net/","table":"https://zitesta21.table.core.windows.net/","file":"https://zitesta21.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rgcmxzjqe2ev2tarnzledhk4m7mk5dsnxznyqtyvx7dixjnjgqs4h5dh37jqoyzj5l5/providers/Microsoft.Storage/storageAccounts/cliteste7bmlfupz34m23jnc","name":"cliteste7bmlfupz34m23jnc","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.1366608Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.1366608Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-12-11T00:17:56.913505Z","primaryEndpoints":{"blob":"https://cliteste7bmlfupz34m23jnc.blob.core.windows.net/","queue":"https://cliteste7bmlfupz34m23jnc.queue.core.windows.net/","table":"https://cliteste7bmlfupz34m23jnc.table.core.windows.net/","file":"https://cliteste7bmlfupz34m23jnc.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testrg9639/providers/Microsoft.Storage/storageAccounts/testacc3070","name":"testacc3070","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-03-27T09:10:45.3469905Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-03-27T09:10:45.3469905Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-09-21T18:42:53.9505428Z","primaryEndpoints":{"blob":"https://testacc3070.blob.core.windows.net/","queue":"https://testacc3070.queue.core.windows.net/","table":"https://testacc3070.table.core.windows.net/","file":"https://testacc3070.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zitest/providers/Microsoft.Storage/storageAccounts/zitesty21","name":"zitesty21","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-03-27T09:11:00.0969536Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-03-27T09:11:00.0969536Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2016-08-23T19:55:37.1159138Z","primaryEndpoints":{"blob":"https://zitesty21.blob.core.windows.net/","queue":"https://zitesty21.queue.core.windows.net/","table":"https://zitesty21.table.core.windows.net/","file":"https://zitesty21.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testrg3787/providers/Microsoft.Storage/storageAccounts/testacc5739","name":"testacc5739","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-03-27T09:10:45.4406899Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-03-27T09:10:45.4406899Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-09-21T02:06:37.3496304Z","primaryEndpoints":{"blob":"https://testacc5739.blob.core.windows.net/","queue":"https://testacc5739.queue.core.windows.net/","table":"https://testacc5739.table.core.windows.net/","file":"https://testacc5739.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testrg8761/providers/Microsoft.Storage/storageAccounts/testacc3915","name":"testacc3915","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-03-27T09:10:45.4094279Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-03-27T09:10:45.4094279Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-09-21T01:35:41.2354283Z","primaryEndpoints":{"blob":"https://testacc3915.blob.core.windows.net/","queue":"https://testacc3915.queue.core.windows.net/","table":"https://testacc3915.table.core.windows.net/","file":"https://testacc3915.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/foozap002/providers/Microsoft.Storage/storageAccounts/foozy89","name":"foozy89","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{"key1":"value1","key2":"value2"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.1991330Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.1991330Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-07-07T22:15:52.1441975Z","primaryEndpoints":{"blob":"https://foozy89.blob.core.windows.net/","queue":"https://foozy89.queue.core.windows.net/","table":"https://foozy89.table.core.windows.net/","file":"https://foozy89.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available","secondaryLocation":"eastus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/wilxgroup/providers/Microsoft.Storage/storageAccounts/wilxgroupdiag169","name":"wilxgroupdiag169","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-03-29T22:34:01.9561177Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-03-29T22:34:01.9561177Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-03-29T22:34:01.8935895Z","primaryEndpoints":{"blob":"https://wilxgroupdiag169.blob.core.windows.net/","queue":"https://wilxgroupdiag169.queue.core.windows.net/","table":"https://wilxgroupdiag169.table.core.windows.net/","file":"https://wilxgroupdiag169.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Premium_LRS","tier":"Premium"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/wilxgroup/providers/Microsoft.Storage/storageAccounts/wilxgroupdisks899","name":"wilxgroupdisks899","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-04-11T23:26:25.3653337Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-04-11T23:26:25.3653337Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-04-11T23:26:25.2872072Z","primaryEndpoints":{"blob":"https://wilxgroupdisks899.blob.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg6sqzt5phdo5viklk7dquteui74rn3vn2tioolq5dsdnz2znxn6fdwaa47uyu2i4eg/providers/Microsoft.Storage/storageAccounts/clitestgjx5vdkyf74377ieg","name":"clitestgjx5vdkyf74377ieg","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.1366608Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:59.1366608Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-11-26T06:09:48.4001597Z","primaryEndpoints":{"blob":"https://clitestgjx5vdkyf74377ieg.blob.core.windows.net/","queue":"https://clitestgjx5vdkyf74377ieg.queue.core.windows.net/","table":"https://clitestgjx5vdkyf74377ieg.table.core.windows.net/","file":"https://clitestgjx5vdkyf74377ieg.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_RAGRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/wilxgroup/providers/Microsoft.Storage/storageAccounts/wilxstorage","name":"wilxstorage","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-03-15T17:47:45.4399402Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-03-15T17:47:45.4399402Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-03-15T17:47:45.3930700Z","primaryEndpoints":{"blob":"https://wilxstorage.blob.core.windows.net/","queue":"https://wilxstorage.queue.core.windows.net/","table":"https://wilxstorage.table.core.windows.net/","file":"https://wilxstorage.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available","secondaryLocation":"eastus","statusOfSecondary":"available","secondaryEndpoints":{"blob":"https://wilxstorage-secondary.blob.core.windows.net/","queue":"https://wilxstorage-secondary.queue.core.windows.net/","table":"https://wilxstorage-secondary.table.core.windows.net/"}}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zitest/providers/Microsoft.Storage/storageAccounts/foostore12978","name":"foostore12978","type":"Microsoft.Storage/storageAccounts","location":"westeurope","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-03-22T22:18:07.1937355Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-03-22T22:18:07.1937355Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2016-04-29T06:55:06.4412159Z","primaryEndpoints":{"blob":"https://foostore12978.blob.core.windows.net/","queue":"https://foostore12978.queue.core.windows.net/","table":"https://foostore12978.table.core.windows.net/","file":"https://foostore12978.file.core.windows.net/"},"primaryLocation":"westeurope","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"BlobStorage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/t-chwong/providers/Microsoft.Storage/storageAccounts/tchwong","name":"tchwong","type":"Microsoft.Storage/storageAccounts","location":"southcentralus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-03-01T18:07:07.4006066Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-03-01T18:07:07.4006066Z"}},"keySource":"Microsoft.Storage"},"accessTier":"Hot","provisioningState":"Succeeded","creationTime":"2018-03-01T18:07:07.3381076Z","primaryEndpoints":{"blob":"https://tchwong.blob.core.windows.net/","table":"https://tchwong.table.core.windows.net/"},"primaryLocation":"southcentralus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitestlab1/providers/Microsoft.Storage/storageAccounts/acliautomationlab8902","name":"acliautomationlab8902","type":"Microsoft.Storage/storageAccounts","location":"southcentralus","tags":{"hidden-DevTestLabs-LabUId":"ca9ec547-32c5-422d-b3d2-25906ed71959"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-04-19T16:51:47.2662871Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-04-19T16:51:47.2662871Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-04-19T16:51:47.2194106Z","primaryEndpoints":{"blob":"https://acliautomationlab8902.blob.core.windows.net/","queue":"https://acliautomationlab8902.queue.core.windows.net/","table":"https://acliautomationlab8902.table.core.windows.net/","file":"https://acliautomationlab8902.file.core.windows.net/"},"primaryLocation":"southcentralus","statusOfPrimary":"available"}},{"identity":{"principalId":"ebc8557b-5159-4db6-8b04-699759875130","tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","type":"SystemAssigned"},"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rgls6pde2luhubksnkjxebnrqthsdi6dcfpxcrhlmgnvdkkimk6b2usub6ehq3ocrsm/providers/Microsoft.Storage/storageAccounts/clitesttrevle6ezqkjtfdl3","name":"clitesttrevle6ezqkjtfdl3","type":"Microsoft.Storage/storageAccounts","location":"southcentralus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-03-14T22:32:56.5552622Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-03-14T22:32:56.5552622Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-03-14T22:32:56.5084099Z","primaryEndpoints":{"blob":"https://clitesttrevle6ezqkjtfdl3.blob.core.windows.net/","queue":"https://clitesttrevle6ezqkjtfdl3.queue.core.windows.net/","table":"https://clitesttrevle6ezqkjtfdl3.table.core.windows.net/","file":"https://clitesttrevle6ezqkjtfdl3.file.core.windows.net/"},"primaryLocation":"southcentralus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/lmazuel-testfunction-msi/providers/Microsoft.Storage/storageAccounts/lmazueltestfuncbbd8","name":"lmazueltestfuncbbd8","type":"Microsoft.Storage/storageAccounts","location":"southcentralus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:58.1691771Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:58.1691771Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-10-11T19:03:26.3781645Z","primaryEndpoints":{"blob":"https://lmazueltestfuncbbd8.blob.core.windows.net/","queue":"https://lmazueltestfuncbbd8.queue.core.windows.net/","table":"https://lmazueltestfuncbbd8.table.core.windows.net/","file":"https://lmazueltestfuncbbd8.file.core.windows.net/"},"primaryLocation":"southcentralus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cloud-shell-storage-southcentralus/providers/Microsoft.Storage/storageAccounts/cs700977cdb163fx435fx9c3","name":"cs700977cdb163fx435fx9c3","type":"Microsoft.Storage/storageAccounts","location":"southcentralus","tags":{"ms-resource-usage":"azure-cloud-shell"},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:58.1691771Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:58.1691771Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-08-09T21:59:02.7061936Z","primaryEndpoints":{"blob":"https://cs700977cdb163fx435fx9c3.blob.core.windows.net/","queue":"https://cs700977cdb163fx435fx9c3.queue.core.windows.net/","table":"https://cs700977cdb163fx435fx9c3.table.core.windows.net/","file":"https://cs700977cdb163fx435fx9c3.file.core.windows.net/"},"primaryLocation":"southcentralus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/t-chwong/providers/Microsoft.Storage/storageAccounts/tchwongdiag300","name":"tchwongdiag300","type":"Microsoft.Storage/storageAccounts","location":"southcentralus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-04-20T18:15:54.9483325Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-04-20T18:15:54.9483325Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-04-20T18:15:54.8858351Z","primaryEndpoints":{"blob":"https://tchwongdiag300.blob.core.windows.net/","queue":"https://tchwongdiag300.queue.core.windows.net/","table":"https://tchwongdiag300.table.core.windows.net/","file":"https://tchwongdiag300.file.core.windows.net/"},"primaryLocation":"southcentralus","statusOfPrimary":"available"}},{"sku":{"name":"Standard_GRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/azurefunctions-southcentralus/providers/Microsoft.Storage/storageAccounts/azurefunctions2e2e624d","name":"azurefunctions2e2e624d","type":"Microsoft.Storage/storageAccounts","location":"southcentralus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:58.1535349Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-01-08T22:33:58.1535349Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2017-09-22T21:04:32.5702152Z","primaryEndpoints":{"blob":"https://azurefunctions2e2e624d.blob.core.windows.net/","queue":"https://azurefunctions2e2e624d.queue.core.windows.net/","table":"https://azurefunctions2e2e624d.table.core.windows.net/","file":"https://azurefunctions2e2e624d.file.core.windows.net/"},"primaryLocation":"southcentralus","statusOfPrimary":"available","secondaryLocation":"northcentralus","statusOfSecondary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"StorageV2","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/wilxgroup2/providers/Microsoft.Storage/storageAccounts/wilxstorage0","name":"wilxstorage0","type":"Microsoft.Storage/storageAccounts","location":"westus2","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-04-13T01:05:28.4648959Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-04-13T01:05:28.4648959Z"}},"keySource":"Microsoft.Storage"},"accessTier":"Hot","provisioningState":"Succeeded","creationTime":"2018-04-13T01:05:28.4023820Z","primaryEndpoints":{"blob":"https://wilxstorage0.blob.core.windows.net/","queue":"https://wilxstorage0.queue.core.windows.net/","table":"https://wilxstorage0.table.core.windows.net/","file":"https://wilxstorage0.file.core.windows.net/"},"primaryLocation":"westus2","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rgmr6jo34yofyafj3n6gjbhrgmrd6pwgguthc2u235qfle6y6ztyzrlkuqn544s7cop/providers/Microsoft.Storage/storageAccounts/clitestnlmd52jlcmr4ce7b4","name":"clitestnlmd52jlcmr4ce7b4","type":"Microsoft.Storage/storageAccounts","location":"eastus2euap","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-04-19T20:14:07.3500611Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-04-19T20:14:07.3500611Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-04-19T20:14:07.3188286Z","primaryEndpoints":{"blob":"https://clitestnlmd52jlcmr4ce7b4.blob.core.windows.net/","queue":"https://clitestnlmd52jlcmr4ce7b4.queue.core.windows.net/","table":"https://clitestnlmd52jlcmr4ce7b4.table.core.windows.net/","file":"https://clitestnlmd52jlcmr4ce7b4.file.core.windows.net/"},"primaryLocation":"eastus2euap","statusOfPrimary":"available"}},{"sku":{"name":"Standard_RAGRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/wilxgroup3/providers/Microsoft.Storage/storageAccounts/wilxstorageworm","name":"wilxstorageworm","type":"Microsoft.Storage/storageAccounts","location":"eastus2euap","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-04-13T22:36:53.1534839Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-04-13T22:36:53.1534839Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-04-13T22:36:53.0909769Z","primaryEndpoints":{"blob":"https://wilxstorageworm.blob.core.windows.net/","queue":"https://wilxstorageworm.queue.core.windows.net/","table":"https://wilxstorageworm.table.core.windows.net/","file":"https://wilxstorageworm.file.core.windows.net/"},"primaryLocation":"eastus2euap","statusOfPrimary":"available","secondaryLocation":"centraluseuap","statusOfSecondary":"available","secondaryEndpoints":{"blob":"https://wilxstorageworm-secondary.blob.core.windows.net/","queue":"https://wilxstorageworm-secondary.queue.core.windows.net/","table":"https://wilxstorageworm-secondary.table.core.windows.net/"}}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg326oxnqqn33y3n42vz6x5xol5rvvw3z4o6tladwwtkmcntnsxhhxxtddtrxwm2edj/providers/Microsoft.Storage/storageAccounts/clitestjwzkdsfuou3niutbd","name":"clitestjwzkdsfuou3niutbd","type":"Microsoft.Storage/storageAccounts","location":"eastus2euap","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-04-19T20:07:33.1021018Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-04-19T20:07:33.1021018Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-04-19T20:07:33.0552270Z","primaryEndpoints":{"blob":"https://clitestjwzkdsfuou3niutbd.blob.core.windows.net/","queue":"https://clitestjwzkdsfuou3niutbd.queue.core.windows.net/","table":"https://clitestjwzkdsfuou3niutbd.table.core.windows.net/","file":"https://clitestjwzkdsfuou3niutbd.file.core.windows.net/"},"primaryLocation":"eastus2euap","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rgldagdmcl4pklmwzmr3wftx2kidhw7johz6d7tl6m7raetzzfhpqhrfffu5vwqtfxo/providers/Microsoft.Storage/storageAccounts/clitestt6pqb7xneswrh2sp6","name":"clitestt6pqb7xneswrh2sp6","type":"Microsoft.Storage/storageAccounts","location":"eastus2euap","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-04-19T17:51:14.8730435Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-04-19T17:51:14.8730435Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-04-19T17:51:14.8105336Z","primaryEndpoints":{"blob":"https://clitestt6pqb7xneswrh2sp6.blob.core.windows.net/","queue":"https://clitestt6pqb7xneswrh2sp6.queue.core.windows.net/","table":"https://clitestt6pqb7xneswrh2sp6.table.core.windows.net/","file":"https://clitestt6pqb7xneswrh2sp6.file.core.windows.net/"},"primaryLocation":"eastus2euap","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rgf3er5m4irbxsxhyil42jxq3t5ehzphmdzn2gortdlrzyw4i6tlgswx2xrcgldp6oh/providers/Microsoft.Storage/storageAccounts/clitestpabilv4yd6qxvguml","name":"clitestpabilv4yd6qxvguml","type":"Microsoft.Storage/storageAccounts","location":"eastus2euap","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-04-19T19:20:22.2758006Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-04-19T19:20:22.2758006Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-04-19T19:20:22.2445526Z","primaryEndpoints":{"blob":"https://clitestpabilv4yd6qxvguml.blob.core.windows.net/","queue":"https://clitestpabilv4yd6qxvguml.queue.core.windows.net/","table":"https://clitestpabilv4yd6qxvguml.table.core.windows.net/","file":"https://clitestpabilv4yd6qxvguml.file.core.windows.net/"},"primaryLocation":"eastus2euap","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rgwxiadyatfxsixayqfinia7ybjwo5cfoyw65qpuna3alx3x2diwukx4tkcpwir2mbq/providers/Microsoft.Storage/storageAccounts/clitesta2lvllqz23rgasyf7","name":"clitesta2lvllqz23rgasyf7","type":"Microsoft.Storage/storageAccounts","location":"eastus2euap","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-04-19T17:57:25.6818153Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-04-19T17:57:25.6818153Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-04-19T17:57:25.6193002Z","primaryEndpoints":{"blob":"https://clitesta2lvllqz23rgasyf7.blob.core.windows.net/","queue":"https://clitesta2lvllqz23rgasyf7.queue.core.windows.net/","table":"https://clitesta2lvllqz23rgasyf7.table.core.windows.net/","file":"https://clitesta2lvllqz23rgasyf7.file.core.windows.net/"},"primaryLocation":"eastus2euap","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rgoo2qxqtbb56w7uujqzhodrozdh7fxg5wxscql4ndybxkardgqzqvheltadic2zoxf/providers/Microsoft.Storage/storageAccounts/clitestfyixx74gs3loj3isf","name":"clitestfyixx74gs3loj3isf","type":"Microsoft.Storage/storageAccounts","location":"eastus2euap","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-04-19T20:34:26.6293927Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-04-19T20:34:26.6293927Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-04-19T20:34:26.5668681Z","primaryEndpoints":{"blob":"https://clitestfyixx74gs3loj3isf.blob.core.windows.net/","queue":"https://clitestfyixx74gs3loj3isf.queue.core.windows.net/","table":"https://clitestfyixx74gs3loj3isf.table.core.windows.net/","file":"https://clitestfyixx74gs3loj3isf.file.core.windows.net/"},"primaryLocation":"eastus2euap","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rgd5ygu6mbq43qw57ncgznekmhwaqlrowjc6dggyk2h6cfwioigvtt3bg7ayqckcwvk/providers/Microsoft.Storage/storageAccounts/clitestixsogcl5p5af5w2p3","name":"clitestixsogcl5p5af5w2p3","type":"Microsoft.Storage/storageAccounts","location":"eastus2euap","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-04-19T18:00:02.2397791Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-04-19T18:00:02.2397791Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-04-19T18:00:02.2087326Z","primaryEndpoints":{"blob":"https://clitestixsogcl5p5af5w2p3.blob.core.windows.net/","queue":"https://clitestixsogcl5p5af5w2p3.queue.core.windows.net/","table":"https://clitestixsogcl5p5af5w2p3.table.core.windows.net/","file":"https://clitestixsogcl5p5af5w2p3.file.core.windows.net/"},"primaryLocation":"eastus2euap","statusOfPrimary":"available"}},{"sku":{"name":"Standard_RAGRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/wilxgroup3/providers/Microsoft.Storage/storageAccounts/wilxstorageblah","name":"wilxstorageblah","type":"Microsoft.Storage/storageAccounts","location":"eastus2euap","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-04-17T20:06:51.4259719Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-04-17T20:06:51.4259719Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-04-17T20:06:51.3790974Z","primaryEndpoints":{"blob":"https://wilxstorageblah.blob.core.windows.net/","queue":"https://wilxstorageblah.queue.core.windows.net/","table":"https://wilxstorageblah.table.core.windows.net/","file":"https://wilxstorageblah.file.core.windows.net/"},"primaryLocation":"eastus2euap","statusOfPrimary":"available","secondaryLocation":"centraluseuap","statusOfSecondary":"available","secondaryEndpoints":{"blob":"https://wilxstorageblah-secondary.blob.core.windows.net/","queue":"https://wilxstorageblah-secondary.queue.core.windows.net/","table":"https://wilxstorageblah-secondary.table.core.windows.net/"}}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rgeyg7p46zydk24opv23uowejjybhvp2nqcyqpnmknbs7o3w5c3tocuuygkogbvxz5f/providers/Microsoft.Storage/storageAccounts/clitestcrdofae6jvibomf2w","name":"clitestcrdofae6jvibomf2w","type":"Microsoft.Storage/storageAccounts","location":"eastus2euap","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-04-20T01:19:55.8214506Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-04-20T01:19:55.8214506Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-04-20T01:19:55.7120798Z","primaryEndpoints":{"blob":"https://clitestcrdofae6jvibomf2w.blob.core.windows.net/","queue":"https://clitestcrdofae6jvibomf2w.queue.core.windows.net/","table":"https://clitestcrdofae6jvibomf2w.table.core.windows.net/","file":"https://clitestcrdofae6jvibomf2w.file.core.windows.net/"},"primaryLocation":"eastus2euap","statusOfPrimary":"available"}},{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rgeblmtd6pv6car44ga6qwvicwjyuxydhhkaharam4nad6uekgqgm2uiisw7v4a3czx/providers/Microsoft.Storage/storageAccounts/clitestcdx4bwlcvgviotc2p","name":"clitestcdx4bwlcvgviotc2p","type":"Microsoft.Storage/storageAccounts","location":"eastus2euap","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-04-19T22:26:49.0369320Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-04-19T22:26:49.0369320Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-04-19T22:26:48.9744081Z","primaryEndpoints":{"blob":"https://clitestcdx4bwlcvgviotc2p.blob.core.windows.net/","queue":"https://clitestcdx4bwlcvgviotc2p.queue.core.windows.net/","table":"https://clitestcdx4bwlcvgviotc2p.table.core.windows.net/","file":"https://clitestcdx4bwlcvgviotc2p.file.core.windows.net/"},"primaryLocation":"eastus2euap","statusOfPrimary":"available"}}]}'} headers: cache-control: [no-cache] - content-length: ['102942'] + content-length: ['90663'] content-type: [application/json; charset=utf-8] - date: ['Thu, 08 Feb 2018 18:12:33 GMT'] + date: ['Tue, 01 May 2018 21:48:56 GMT'] expires: ['-1'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] vary: [Accept-Encoding] - x-ms-original-request-ids: [7bde2112-007f-4b81-8695-b12c1845475c, 9ac45548-9f9a-4086-87f1-edf0ce8c55f1, - a535daab-2df2-4364-a409-dfd6f97573ff] + x-content-type-options: [nosniff] + x-ms-original-request-ids: [84952941-ed5a-414e-b505-85a49764de4e, 775c6a87-b6b4-44fa-8471-51bd67c524e9, + 3aff7d4f-2004-49b9-bb1d-ad3757db59f3, 337cb911-05a4-4566-a36c-4dc902966df3, + 11991e36-7a48-4abb-86d5-8b5d87913636, f36c456a-beed-4002-a66b-f8d1dacadc0c, + b8b72007-5ec6-4d2b-92e6-bb9b9161bfca] status: {code: 200, message: OK} - request: body: null @@ -266,8 +250,8 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.27] + msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: DELETE uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2017-05-10 @@ -276,11 +260,12 @@ interactions: headers: cache-control: [no-cache] content-length: ['0'] - date: ['Thu, 08 Feb 2018 18:12:34 GMT'] + date: ['Tue, 01 May 2018 21:48:57 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTElURVNUOjJFUkdQTEFKTVJSRk5aV0tKM0ZDVjZLWTc0QVlHQlNONTI1V1pVWnw5Qzg5OUMyOUY2NjJGOUUzLVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTElURVNUOjJFUkdLSURPNTRVNTVEV0hQUU9ITUNFM0YyVUI0M0JFU1NWRVBIV3w4MzA4NzY5OEU3NjQ5MkMxLVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1188'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1197'] status: {code: 202, message: Accepted} version: 1 diff --git a/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_logging_operations.yaml b/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_logging_operations.yaml index 118979aee44..2876eda243f 100644 --- a/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_logging_operations.yaml +++ b/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_logging_operations.yaml @@ -1,43 +1,45 @@ interactions: - request: - body: '{"location": "westus", "tags": {"use": "az-test"}}' + body: '{"location": "eastus2", "tags": {"product": "azurecli", "cause": "automation", + "date": "2018-05-02T00:05:52Z"}}' headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] CommandName: [group create] Connection: [keep-alive] - Content-Length: ['50'] + Content-Length: ['111'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.27] + msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2017-05-10 response: - body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"westus","tags":{"use":"az-test"},"properties":{"provisioningState":"Succeeded"}}'} + body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"eastus2","tags":{"product":"azurecli","cause":"automation","date":"2018-05-02T00:05:52Z"},"properties":{"provisioningState":"Succeeded"}}'} headers: cache-control: [no-cache] - content-length: ['328'] + content-length: ['385'] content-type: [application/json; charset=utf-8] - date: ['Thu, 08 Feb 2018 18:12:35 GMT'] + date: ['Wed, 02 May 2018 00:05:54 GMT'] expires: ['-1'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1188'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1199'] status: {code: 201, message: Created} - request: - body: '{"sku": {"name": "Standard_LRS"}, "kind": "Storage", "location": "westus", + body: '{"sku": {"name": "Standard_LRS"}, "kind": "Storage", "location": "eastus2", "properties": {"supportsHttpsTrafficOnly": false}}' headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] CommandName: [storage account create] Connection: [keep-alive] - Content-Length: ['125'] + Content-Length: ['126'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002?api-version=2017-10-01 @@ -47,14 +49,15 @@ interactions: cache-control: [no-cache] content-length: ['0'] content-type: [text/plain; charset=utf-8] - date: ['Thu, 08 Feb 2018 18:12:36 GMT'] + date: ['Wed, 02 May 2018 00:05:57 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/bcaf28f7-9d0d-4d86-a13f-7bff77542cd9?monitor=true&api-version=2017-10-01'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/eastus2/asyncoperations/aa00d0bc-b1ea-49ae-894b-206785dde9a1?monitor=true&api-version=2017-10-01'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 Microsoft-HTTPAPI/2.0'] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1186'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1199'] status: {code: 202, message: Accepted} - request: body: null @@ -65,44 +68,17 @@ interactions: Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/bcaf28f7-9d0d-4d86-a13f-7bff77542cd9?monitor=true&api-version=2017-10-01 + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/eastus2/asyncoperations/aa00d0bc-b1ea-49ae-894b-206785dde9a1?monitor=true&api-version=2017-10-01 response: - body: {string: ''} + body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"eastus2","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-02T00:05:57.4340385Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-02T00:05:57.4340385Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-02T00:05:57.1840317Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"eastus2","statusOfPrimary":"available"}}'} headers: cache-control: [no-cache] - content-length: ['0'] - content-type: [text/plain; charset=utf-8] - date: ['Thu, 08 Feb 2018 18:12:54 GMT'] - expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/bcaf28f7-9d0d-4d86-a13f-7bff77542cd9?monitor=true&api-version=2017-10-01'] - pragma: [no-cache] - server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 - Microsoft-HTTPAPI/2.0'] - strict-transport-security: [max-age=31536000; includeSubDomains] - status: {code: 202, message: Accepted} -- request: - body: null - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [storage account create] - Connection: [keep-alive] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] - accept-language: [en-US] - method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/bcaf28f7-9d0d-4d86-a13f-7bff77542cd9?monitor=true&api-version=2017-10-01 - response: - body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T18:12:36.6221437Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T18:12:36.6221437Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T18:12:36.5596728Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} - headers: - cache-control: [no-cache] - content-length: ['1231'] + content-length: ['1233'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 18:13:11 GMT'] + date: ['Wed, 02 May 2018 00:06:15 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -110,6 +86,7 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] + x-content-type-options: [nosniff] status: {code: 200, message: OK} - request: body: null @@ -121,17 +98,17 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: POST uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002/listKeys?api-version=2017-10-01 response: - body: {string: '{"keys":[{"keyName":"key1","value":"6qR6dKj7g7RTJoDWdCk7rW0nYYiL9eDdBVhouJi6thVrYSX2EOx+10CulCihWLGD3eq8MIs9JZyyaarTcYg8tQ==","permissions":"FULL"},{"keyName":"key2","value":"nlU0j3NKXYpGzHYeqKVlkbEIBTj5TmjObc+Zxu7uiILrjATh6/oEdvhlPaIPFr7hZTGRYLh0jEIRlO6gMtJsDA==","permissions":"FULL"}]}'} + body: {string: '{"keys":[{"keyName":"key1","value":"q0gHRpLyuUQQzq7YTxniF8sTj5wYCVg2zd2wsw68/nQNmKsEy22aUpIXGwircNRzbczHGYxIEQQ50pp4Jj9EqA==","permissions":"FULL"},{"keyName":"key2","value":"xITc2KcgaEZnIO9H6VzVCTIYWWnOyz1KEVTP8SJMsGxyVfYLmsiSim6UFovFH6hdtIo8j9fiCSMxNLI1tRr6FQ==","permissions":"FULL"}]}'} headers: cache-control: [no-cache] content-length: ['288'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 18:13:12 GMT'] + date: ['Wed, 02 May 2018 00:06:15 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -139,7 +116,8 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] - x-ms-ratelimit-remaining-subscription-writes: ['1186'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1199'] status: {code: 200, message: OK} - request: body: null @@ -151,17 +129,17 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: POST uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002/listKeys?api-version=2017-10-01 response: - body: {string: '{"keys":[{"keyName":"key1","value":"6qR6dKj7g7RTJoDWdCk7rW0nYYiL9eDdBVhouJi6thVrYSX2EOx+10CulCihWLGD3eq8MIs9JZyyaarTcYg8tQ==","permissions":"FULL"},{"keyName":"key2","value":"nlU0j3NKXYpGzHYeqKVlkbEIBTj5TmjObc+Zxu7uiILrjATh6/oEdvhlPaIPFr7hZTGRYLh0jEIRlO6gMtJsDA==","permissions":"FULL"}]}'} + body: {string: '{"keys":[{"keyName":"key1","value":"q0gHRpLyuUQQzq7YTxniF8sTj5wYCVg2zd2wsw68/nQNmKsEy22aUpIXGwircNRzbczHGYxIEQQ50pp4Jj9EqA==","permissions":"FULL"},{"keyName":"key2","value":"xITc2KcgaEZnIO9H6VzVCTIYWWnOyz1KEVTP8SJMsGxyVfYLmsiSim6UFovFH6hdtIo8j9fiCSMxNLI1tRr6FQ==","permissions":"FULL"}]}'} headers: cache-control: [no-cache] content-length: ['288'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 18:13:12 GMT'] + date: ['Wed, 02 May 2018 00:06:17 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -169,26 +147,8 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] - x-ms-ratelimit-remaining-subscription-writes: ['1187'] - status: {code: 200, message: OK} -- request: - body: null - headers: - Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:13:13 GMT'] - x-ms-version: ['2017-07-29'] - method: GET - uri: https://clitest000002.blob.core.windows.net/?restype=service&comp=properties - response: - body: {string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue71.0falsefalsefalse"} - headers: - content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:13:13 GMT'] - server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] - transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1197'] status: {code: 200, message: OK} - request: body: null @@ -196,8 +156,8 @@ interactions: Connection: [keep-alive] DataServiceVersion: [3.0;NetFx] MaxDataServiceVersion: ['3.0'] - User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:13:13 GMT'] + User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.32] + x-ms-date: ['Wed, 02 May 2018 00:06:17 GMT'] x-ms-version: ['2017-04-17'] method: GET uri: https://clitest000002.table.core.windows.net/?restype=service&comp=properties @@ -206,7 +166,7 @@ interactions: \ />"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:13:12 GMT'] + date: ['Wed, 02 May 2018 00:06:17 GMT'] server: [Windows-Azure-Table/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-04-17'] @@ -215,9 +175,10 @@ interactions: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:13:13 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Wed, 02 May 2018 00:06:18 GMT'] + x-ms-version: ['2017-11-09'] method: GET uri: https://clitest000002.queue.core.windows.net/?restype=service&comp=properties response: @@ -226,58 +187,60 @@ interactions: headers: cache-control: [no-cache] content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:13:13 GMT'] + date: ['Wed, 02 May 2018 00:06:18 GMT'] server: [Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: - body: ' - - 1.0FalseTrueFalseTrue1' + body: null headers: Connection: [keep-alive] - Content-Length: ['264'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:13:13 GMT'] - x-ms-version: ['2017-07-29'] - method: PUT + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Wed, 02 May 2018 00:06:18 GMT'] + x-ms-version: ['2017-11-09'] + method: GET uri: https://clitest000002.blob.core.windows.net/?restype=service&comp=properties response: - body: {string: ''} + body: {string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue71.0falsefalsefalse"} headers: - date: ['Thu, 08 Feb 2018 18:13:13 GMT'] + content-type: [application/xml] + date: ['Wed, 02 May 2018 00:06:18 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] - status: {code: 202, message: Accepted} + x-ms-version: ['2017-11-09'] + status: {code: 200, message: OK} - request: - body: null + body: ' + + 1.0FalseTrueFalseTrue1' headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:13:14 GMT'] - x-ms-version: ['2017-07-29'] - method: GET + Content-Length: ['264'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Wed, 02 May 2018 00:06:19 GMT'] + x-ms-version: ['2017-11-09'] + method: PUT uri: https://clitest000002.blob.core.windows.net/?restype=service&comp=properties response: - body: {string: "\uFEFF1.0truefalsefalsetrue11.0truetruetrue71.0falsefalsefalse"} + body: {string: ''} headers: - content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:13:14 GMT'] + date: ['Wed, 02 May 2018 00:06:19 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] - status: {code: 200, message: OK} + x-ms-version: ['2017-11-09'] + status: {code: 202, message: Accepted} - request: body: null headers: Connection: [keep-alive] DataServiceVersion: [3.0;NetFx] MaxDataServiceVersion: ['3.0'] - User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:13:14 GMT'] + User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.32] + x-ms-date: ['Wed, 02 May 2018 00:06:19 GMT'] x-ms-version: ['2017-04-17'] method: GET uri: https://clitest000002.table.core.windows.net/?restype=service&comp=properties @@ -286,7 +249,7 @@ interactions: \ />"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:13:15 GMT'] + date: ['Wed, 02 May 2018 00:06:19 GMT'] server: [Windows-Azure-Table/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-04-17'] @@ -295,9 +258,10 @@ interactions: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:13:14 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Wed, 02 May 2018 00:06:20 GMT'] + x-ms-version: ['2017-11-09'] method: GET uri: https://clitest000002.queue.core.windows.net/?restype=service&comp=properties response: @@ -306,10 +270,30 @@ interactions: headers: cache-control: [no-cache] content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:13:15 GMT'] + date: ['Wed, 02 May 2018 00:06:20 GMT'] server: [Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] + status: {code: 200, message: OK} +- request: + body: null + headers: + Connection: [keep-alive] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Wed, 02 May 2018 00:06:20 GMT'] + x-ms-version: ['2017-11-09'] + method: GET + uri: https://clitest000002.blob.core.windows.net/?restype=service&comp=properties + response: + body: {string: "\uFEFF1.0truefalsefalsetrue11.0truetruetrue71.0falsefalsefalse"} + headers: + content-type: [application/xml] + date: ['Wed, 02 May 2018 00:06:20 GMT'] + server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] + transfer-encoding: [chunked] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null @@ -321,8 +305,8 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.27] + msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: DELETE uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2017-05-10 @@ -331,11 +315,12 @@ interactions: headers: cache-control: [no-cache] content-length: ['0'] - date: ['Thu, 08 Feb 2018 18:13:15 GMT'] + date: ['Wed, 02 May 2018 00:06:21 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTElURVNUOjJFUkc3QjVYUFhBSFhUWUpaWUNFM1ZaUk5OR0dGSlpHMzNLR0pCRHxCMEQ2MzJDMDMxRUY0NkQyLVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTElURVNUOjJFUkdPRFNKWDczU01TV0k0SUpKT1ZET0k1VlRTR1c0R0dBN1JHSHw2MThEM0Q0MTQxNDFGNDU1LUVBU1RVUzIiLCJqb2JMb2NhdGlvbiI6ImVhc3R1czIifQ?api-version=2017-05-10'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1184'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1199'] status: {code: 202, message: Accepted} version: 1 diff --git a/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_metrics_operations.yaml b/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_metrics_operations.yaml index 71b96b29311..bb88126d078 100644 --- a/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_metrics_operations.yaml +++ b/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_metrics_operations.yaml @@ -1,43 +1,45 @@ interactions: - request: - body: '{"location": "westus", "tags": {"use": "az-test"}}' + body: '{"location": "eastus2", "tags": {"product": "azurecli", "cause": "automation", + "date": "2018-05-02T00:09:48Z"}}' headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] CommandName: [group create] Connection: [keep-alive] - Content-Length: ['50'] + Content-Length: ['111'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.27] + msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2017-05-10 response: - body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"westus","tags":{"use":"az-test"},"properties":{"provisioningState":"Succeeded"}}'} + body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"eastus2","tags":{"product":"azurecli","cause":"automation","date":"2018-05-02T00:09:48Z"},"properties":{"provisioningState":"Succeeded"}}'} headers: cache-control: [no-cache] - content-length: ['328'] + content-length: ['385'] content-type: [application/json; charset=utf-8] - date: ['Thu, 08 Feb 2018 19:32:30 GMT'] + date: ['Wed, 02 May 2018 00:09:50 GMT'] expires: ['-1'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1193'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1199'] status: {code: 201, message: Created} - request: - body: '{"sku": {"name": "Standard_LRS"}, "kind": "Storage", "location": "westus", + body: '{"sku": {"name": "Standard_LRS"}, "kind": "Storage", "location": "eastus2", "properties": {"supportsHttpsTrafficOnly": false}}' headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] CommandName: [storage account create] Connection: [keep-alive] - Content-Length: ['125'] + Content-Length: ['126'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002?api-version=2017-10-01 @@ -47,14 +49,15 @@ interactions: cache-control: [no-cache] content-length: ['0'] content-type: [text/plain; charset=utf-8] - date: ['Thu, 08 Feb 2018 19:32:32 GMT'] + date: ['Wed, 02 May 2018 00:09:53 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/b6bb4bdd-6dff-4ff0-9efa-47843f4032ea?monitor=true&api-version=2017-10-01'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/eastus2/asyncoperations/61792499-c148-4e4b-ba7f-e624bd4b166c?monitor=true&api-version=2017-10-01'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 Microsoft-HTTPAPI/2.0'] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1176'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1198'] status: {code: 202, message: Accepted} - request: body: null @@ -65,44 +68,17 @@ interactions: Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/b6bb4bdd-6dff-4ff0-9efa-47843f4032ea?monitor=true&api-version=2017-10-01 + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/eastus2/asyncoperations/61792499-c148-4e4b-ba7f-e624bd4b166c?monitor=true&api-version=2017-10-01 response: - body: {string: ''} + body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"eastus2","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-02T00:09:53.4202268Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-02T00:09:53.4202268Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-02T00:09:53.3420553Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"eastus2","statusOfPrimary":"available"}}'} headers: cache-control: [no-cache] - content-length: ['0'] - content-type: [text/plain; charset=utf-8] - date: ['Thu, 08 Feb 2018 19:32:49 GMT'] - expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/b6bb4bdd-6dff-4ff0-9efa-47843f4032ea?monitor=true&api-version=2017-10-01'] - pragma: [no-cache] - server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 - Microsoft-HTTPAPI/2.0'] - strict-transport-security: [max-age=31536000; includeSubDomains] - status: {code: 202, message: Accepted} -- request: - body: null - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [storage account create] - Connection: [keep-alive] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] - accept-language: [en-US] - method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/b6bb4bdd-6dff-4ff0-9efa-47843f4032ea?monitor=true&api-version=2017-10-01 - response: - body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T19:32:31.8011350Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T19:32:31.8011350Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T19:32:31.7698664Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} - headers: - cache-control: [no-cache] - content-length: ['1231'] + content-length: ['1233'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 19:33:06 GMT'] + date: ['Wed, 02 May 2018 00:10:10 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -110,6 +86,7 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] + x-content-type-options: [nosniff] status: {code: 200, message: OK} - request: body: null @@ -121,17 +98,17 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: POST uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002/listKeys?api-version=2017-10-01 response: - body: {string: '{"keys":[{"keyName":"key1","value":"RObavWU3Txtf+Kmxx6TExOxD8NvcCpDbw28MhX5A66oABUnf9+bOpp1YfckeeB+oPo8dUQvOelCgjhWPG+A64w==","permissions":"FULL"},{"keyName":"key2","value":"8wEWZv+WfhDBuf3mEzsAGcDW3xphAz93YmgwnoHqf3q0CXHi+9OR01OELlNK+fPJrDtRwaqzteG2/oMP3JUbqw==","permissions":"FULL"}]}'} + body: {string: '{"keys":[{"keyName":"key1","value":"hQ8wjwvE8IPuEwJ01IPlXzxztd97kS3MtQMX++TD7XHWxiPVtjrdP65vrhjxndeFupFot5U1sZf7F4qPl6FZGw==","permissions":"FULL"},{"keyName":"key2","value":"7VoTC+AOT5FOtt5k9iF3NXkJxiC6FMGz259BkwXGWGXKjuaaK+QRbnHaRFW27040zpQ9c2p6wml64pwE28G0Mg==","permissions":"FULL"}]}'} headers: cache-control: [no-cache] content-length: ['288'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 19:33:20 GMT'] + date: ['Wed, 02 May 2018 00:10:11 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -139,7 +116,8 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] - x-ms-ratelimit-remaining-subscription-writes: ['1193'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1199'] status: {code: 200, message: OK} - request: body: null @@ -147,8 +125,8 @@ interactions: Connection: [keep-alive] DataServiceVersion: [3.0;NetFx] MaxDataServiceVersion: ['3.0'] - User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:33:20 GMT'] + User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.32] + x-ms-date: ['Wed, 02 May 2018 00:10:12 GMT'] x-ms-version: ['2017-04-17'] method: GET uri: https://clitest000002.table.core.windows.net/?restype=service&comp=properties @@ -157,7 +135,7 @@ interactions: \ />"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 19:33:20 GMT'] + date: ['Wed, 02 May 2018 00:10:12 GMT'] server: [Windows-Azure-Table/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-04-17'] @@ -166,9 +144,10 @@ interactions: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:33:20 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Wed, 02 May 2018 00:10:12 GMT'] + x-ms-version: ['2017-11-09'] method: GET uri: https://clitest000002.queue.core.windows.net/?restype=service&comp=properties response: @@ -177,17 +156,18 @@ interactions: headers: cache-control: [no-cache] content-type: [application/xml] - date: ['Thu, 08 Feb 2018 19:33:20 GMT'] + date: ['Wed, 02 May 2018 00:10:13 GMT'] server: [Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:33:21 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Wed, 02 May 2018 00:10:13 GMT'] x-ms-version: ['2017-07-29'] method: GET uri: https://clitest000002.file.core.windows.net/?restype=service&comp=properties @@ -196,7 +176,7 @@ interactions: \ />"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 19:33:21 GMT'] + date: ['Wed, 02 May 2018 00:10:13 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-07-29'] @@ -205,9 +185,10 @@ interactions: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:33:21 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Wed, 02 May 2018 00:10:13 GMT'] + x-ms-version: ['2017-11-09'] method: GET uri: https://clitest000002.blob.core.windows.net/?restype=service&comp=properties response: @@ -215,10 +196,10 @@ interactions: \ />false"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 19:33:21 GMT'] + date: ['Wed, 02 May 2018 00:10:14 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: ' @@ -227,15 +208,16 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['446'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:33:21 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Wed, 02 May 2018 00:10:14 GMT'] x-ms-version: ['2017-07-29'] method: PUT uri: https://clitest000002.file.core.windows.net/?restype=service&comp=properties response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 19:33:22 GMT'] + date: ['Wed, 02 May 2018 00:10:14 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-07-29'] @@ -246,8 +228,8 @@ interactions: Connection: [keep-alive] DataServiceVersion: [3.0;NetFx] MaxDataServiceVersion: ['3.0'] - User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:33:22 GMT'] + User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.32] + x-ms-date: ['Wed, 02 May 2018 00:10:15 GMT'] x-ms-version: ['2017-04-17'] method: GET uri: https://clitest000002.table.core.windows.net/?restype=service&comp=properties @@ -256,7 +238,7 @@ interactions: \ />"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 19:33:22 GMT'] + date: ['Wed, 02 May 2018 00:10:14 GMT'] server: [Windows-Azure-Table/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-04-17'] @@ -265,9 +247,10 @@ interactions: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:33:22 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Wed, 02 May 2018 00:10:15 GMT'] + x-ms-version: ['2017-11-09'] method: GET uri: https://clitest000002.queue.core.windows.net/?restype=service&comp=properties response: @@ -276,17 +259,18 @@ interactions: headers: cache-control: [no-cache] content-type: [application/xml] - date: ['Thu, 08 Feb 2018 19:33:22 GMT'] + date: ['Wed, 02 May 2018 00:10:15 GMT'] server: [Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:33:22 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Wed, 02 May 2018 00:10:16 GMT'] x-ms-version: ['2017-07-29'] method: GET uri: https://clitest000002.file.core.windows.net/?restype=service&comp=properties @@ -295,7 +279,7 @@ interactions: \ />"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 19:33:22 GMT'] + date: ['Wed, 02 May 2018 00:10:16 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-07-29'] @@ -304,9 +288,10 @@ interactions: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:33:22 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Wed, 02 May 2018 00:10:16 GMT'] + x-ms-version: ['2017-11-09'] method: GET uri: https://clitest000002.blob.core.windows.net/?restype=service&comp=properties response: @@ -314,10 +299,10 @@ interactions: \ />false"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 19:33:22 GMT'] + date: ['Wed, 02 May 2018 00:10:16 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null @@ -329,8 +314,8 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.27] + msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: DELETE uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2017-05-10 @@ -339,11 +324,12 @@ interactions: headers: cache-control: [no-cache] content-length: ['0'] - date: ['Thu, 08 Feb 2018 19:33:23 GMT'] + date: ['Wed, 02 May 2018 00:10:17 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTElURVNUOjJFUkdaTFNKV0tHNUY1TEIzWjMyN0lWM01BNE5QSTNWSlBXSU1MWXw2N0Q3RkUzNjI2MDQzRTE5LVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTElURVNUOjJFUkdJNFpCTkNaR1dPQkFURElPQ1FNQVlQTDdJR0NGQVlMVFdSWHw1REVGMjcwQkY2NzE4NTAzLUVBU1RVUzIiLCJqb2JMb2NhdGlvbiI6ImVhc3R1czIifQ?api-version=2017-05-10'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1185'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1198'] status: {code: 202, message: Accepted} version: 1 diff --git a/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_renew_account_key.yaml b/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_renew_account_key.yaml index 399477a56a1..33b3a2fd15d 100644 --- a/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_renew_account_key.yaml +++ b/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_renew_account_key.yaml @@ -1,30 +1,32 @@ interactions: - request: - body: '{"location": "westus", "tags": {"use": "az-test"}}' + body: '{"location": "westus", "tags": {"product": "azurecli", "cause": "automation", + "date": "2018-05-01T21:49:59Z"}}' headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] CommandName: [group create] Connection: [keep-alive] - Content-Length: ['50'] + Content-Length: ['110'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.27] + msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2017-05-10 response: - body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"westus","tags":{"use":"az-test"},"properties":{"provisioningState":"Succeeded"}}'} + body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"westus","tags":{"product":"azurecli","cause":"automation","date":"2018-05-01T21:49:59Z"},"properties":{"provisioningState":"Succeeded"}}'} headers: cache-control: [no-cache] - content-length: ['328'] + content-length: ['384'] content-type: [application/json; charset=utf-8] - date: ['Thu, 08 Feb 2018 18:13:56 GMT'] + date: ['Tue, 01 May 2018 21:50:00 GMT'] expires: ['-1'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1190'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1197'] status: {code: 201, message: Created} - request: body: '{"sku": {"name": "Standard_LRS"}, "kind": "Storage", "location": "westus", @@ -37,7 +39,7 @@ interactions: Content-Length: ['125'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002?api-version=2017-10-01 @@ -47,14 +49,15 @@ interactions: cache-control: [no-cache] content-length: ['0'] content-type: [text/plain; charset=utf-8] - date: ['Thu, 08 Feb 2018 18:13:58 GMT'] + date: ['Tue, 01 May 2018 21:50:01 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/281ec227-7120-49d0-9c81-2c56b619ddda?monitor=true&api-version=2017-10-01'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/2f1d275e-a16c-442b-988d-d3d6a4bdec29?monitor=true&api-version=2017-10-01'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 Microsoft-HTTPAPI/2.0'] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1183'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1196'] status: {code: 202, message: Accepted} - request: body: null @@ -65,17 +68,17 @@ interactions: Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/281ec227-7120-49d0-9c81-2c56b619ddda?monitor=true&api-version=2017-10-01 + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/2f1d275e-a16c-442b-988d-d3d6a4bdec29?monitor=true&api-version=2017-10-01 response: - body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T18:13:58.2789270Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T18:13:58.2789270Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T18:13:58.2320462Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} + body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:50:01.6687806Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:50:01.6687806Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:50:01.5750003Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} headers: cache-control: [no-cache] content-length: ['1231'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 18:14:15 GMT'] + date: ['Tue, 01 May 2018 21:50:18 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -83,6 +86,7 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] + x-content-type-options: [nosniff] status: {code: 200, message: OK} - request: body: null @@ -94,17 +98,17 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: POST uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002/listKeys?api-version=2017-10-01 response: - body: {string: '{"keys":[{"keyName":"key1","value":"3xm3m4nifDmOu5kPW4T5fs4JiFH88CHx64PJoT7BzbnA7UFM4Z3hp4FgpovR2JDQScNvz7Lj2pFD/OEGiOt29w==","permissions":"FULL"},{"keyName":"key2","value":"ToGf4g1TF0nk0H5fAkk1wfusicg6Ldu0RRMqdaBbt0bCcbqhtrmO7OvghZOk9fTHvTBJFq6xF9J8z54Ds7CFnQ==","permissions":"FULL"}]}'} + body: {string: '{"keys":[{"keyName":"key1","value":"MsV6XNzsFn8Dl96ueZ/lOXAqx/BU7BWUUBpA93zqEFornsiyr249WEi5zUxunfFpw7moIE2NRbpbXO5Mh29ubQ==","permissions":"FULL"},{"keyName":"key2","value":"VhbqdaROJJJw09wrtPp7g/RU3v0zXjWpk809y/Qw8jYmZF2mVEcS23RzeH8/aK6pAT4nGJ8VttgrdAmB6NOYFQ==","permissions":"FULL"}]}'} headers: cache-control: [no-cache] content-length: ['288'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 18:14:16 GMT'] + date: ['Tue, 01 May 2018 21:50:20 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -112,7 +116,8 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] - x-ms-ratelimit-remaining-subscription-writes: ['1186'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1197'] status: {code: 200, message: OK} - request: body: null @@ -124,17 +129,17 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: POST uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002/listKeys?api-version=2017-10-01 response: - body: {string: '{"keys":[{"keyName":"key1","value":"3xm3m4nifDmOu5kPW4T5fs4JiFH88CHx64PJoT7BzbnA7UFM4Z3hp4FgpovR2JDQScNvz7Lj2pFD/OEGiOt29w==","permissions":"FULL"},{"keyName":"key2","value":"ToGf4g1TF0nk0H5fAkk1wfusicg6Ldu0RRMqdaBbt0bCcbqhtrmO7OvghZOk9fTHvTBJFq6xF9J8z54Ds7CFnQ==","permissions":"FULL"}]}'} + body: {string: '{"keys":[{"keyName":"key1","value":"MsV6XNzsFn8Dl96ueZ/lOXAqx/BU7BWUUBpA93zqEFornsiyr249WEi5zUxunfFpw7moIE2NRbpbXO5Mh29ubQ==","permissions":"FULL"},{"keyName":"key2","value":"VhbqdaROJJJw09wrtPp7g/RU3v0zXjWpk809y/Qw8jYmZF2mVEcS23RzeH8/aK6pAT4nGJ8VttgrdAmB6NOYFQ==","permissions":"FULL"}]}'} headers: cache-control: [no-cache] content-length: ['288'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 18:14:17 GMT'] + date: ['Tue, 01 May 2018 21:50:20 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -142,7 +147,8 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] - x-ms-ratelimit-remaining-subscription-writes: ['1178'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1198'] status: {code: 200, message: OK} - request: body: '{"keyName": "key1"}' @@ -154,17 +160,17 @@ interactions: Content-Length: ['19'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: POST uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002/regenerateKey?api-version=2017-10-01 response: - body: {string: '{"keys":[{"keyName":"key1","value":"zsSjGR13zJSd5H/ltEdVg3yQ0Vls02RxTSo8FVeO/N6DALFNtY5BEwMeTPsOInMyVcW44a+0fDuhw69f2I+KJA==","permissions":"FULL"},{"keyName":"key2","value":"ToGf4g1TF0nk0H5fAkk1wfusicg6Ldu0RRMqdaBbt0bCcbqhtrmO7OvghZOk9fTHvTBJFq6xF9J8z54Ds7CFnQ==","permissions":"FULL"}]}'} + body: {string: '{"keys":[{"keyName":"key1","value":"z04E7jvrYBT1q/AX5nMFdlG50HB/EFdL1leVDPlMVGpIWeWVGY4RNpFNDedsj2jEAM7dRZDcMMKpIoK4S3RlpQ==","permissions":"FULL"},{"keyName":"key2","value":"VhbqdaROJJJw09wrtPp7g/RU3v0zXjWpk809y/Qw8jYmZF2mVEcS23RzeH8/aK6pAT4nGJ8VttgrdAmB6NOYFQ==","permissions":"FULL"}]}'} headers: cache-control: [no-cache] content-length: ['288'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 18:14:18 GMT'] + date: ['Tue, 01 May 2018 21:50:21 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -172,7 +178,8 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] - x-ms-ratelimit-remaining-subscription-writes: ['1185'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1196'] status: {code: 200, message: OK} - request: body: '{"keyName": "key2"}' @@ -184,17 +191,17 @@ interactions: Content-Length: ['19'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: POST uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002/regenerateKey?api-version=2017-10-01 response: - body: {string: '{"keys":[{"keyName":"key1","value":"zsSjGR13zJSd5H/ltEdVg3yQ0Vls02RxTSo8FVeO/N6DALFNtY5BEwMeTPsOInMyVcW44a+0fDuhw69f2I+KJA==","permissions":"FULL"},{"keyName":"key2","value":"m6NUobJdfogdBMTZ/QPBic/8kl3YRg2VHXCn1knr+vf3wug2En0roOFcX79V4r049TjeC9bgTyIfc25evysfmg==","permissions":"FULL"}]}'} + body: {string: '{"keys":[{"keyName":"key1","value":"z04E7jvrYBT1q/AX5nMFdlG50HB/EFdL1leVDPlMVGpIWeWVGY4RNpFNDedsj2jEAM7dRZDcMMKpIoK4S3RlpQ==","permissions":"FULL"},{"keyName":"key2","value":"Wx2HXjV5wMAlNoiXVBAxeFceQezAM2KPkkoIPtA8iBNWJuBVOgGbx2KgPKCJ0JFDeSzdCxRl5DoAtULhUmYYGQ==","permissions":"FULL"}]}'} headers: cache-control: [no-cache] content-length: ['288'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 18:14:18 GMT'] + date: ['Tue, 01 May 2018 21:50:21 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -202,7 +209,8 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] - x-ms-ratelimit-remaining-subscription-writes: ['1175'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1197'] status: {code: 200, message: OK} - request: body: null @@ -214,8 +222,8 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.27] + msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: DELETE uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2017-05-10 @@ -224,11 +232,12 @@ interactions: headers: cache-control: [no-cache] content-length: ['0'] - date: ['Thu, 08 Feb 2018 18:14:18 GMT'] + date: ['Tue, 01 May 2018 21:50:21 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTElURVNUOjJFUkcyRVFJV1lCMklZVEVCVDdCTUNWNktSSTY2QkxOTVhXNVlZRHw1MUIyRDA4MjVEMURBN0QwLVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTElURVNUOjJFUkcyU1E3R0Q2N1JNMjdDWjNMQ0pZRkFNUUo0MlBVVk1HUDYzSXxFODI1Q0Q5NkZGQkQyREQ5LVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1182'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1194'] status: {code: 202, message: Accepted} version: 1 diff --git a/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_show_usage.yaml b/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_show_usage.yaml index fad67c18501..c279d7f78a6 100644 --- a/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_show_usage.yaml +++ b/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_show_usage.yaml @@ -8,25 +8,26 @@ interactions: Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/usages?api-version=2017-10-01 response: body: {string: "{\r\n \"value\": [\r\n {\r\n \"unit\": \"Count\",\r\n\ - \ \"currentValue\": 24,\r\n \"limit\": 250,\r\n \"name\": {\r\ + \ \"currentValue\": 32,\r\n \"limit\": 250,\r\n \"name\": {\r\ \n \"value\": \"StorageAccounts\",\r\n \"localizedValue\": \"\ Storage Accounts\"\r\n }\r\n }\r\n ]\r\n}"} headers: cache-control: [no-cache] content-length: ['218'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 18:14:19 GMT'] + date: ['Tue, 01 May 2018 21:50:22 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-Azure-Storage-Resource-Provider/1.0, Microsoft-HTTPAPI/2.0] strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] + x-content-type-options: [nosniff] status: {code: 200, message: OK} version: 1 diff --git a/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_account_service_endpoints.yaml b/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_account_service_endpoints.yaml index 6fe04e5a254..66a8ac84564 100644 --- a/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_account_service_endpoints.yaml +++ b/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_account_service_endpoints.yaml @@ -1,7 +1,7 @@ interactions: - request: body: '{"location": "westus", "tags": {"product": "azurecli", "cause": "automation", - "date": "2018-04-04T18:19:44Z"}}' + "date": "2018-05-01T21:50:23Z"}}' headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] @@ -9,24 +9,24 @@ interactions: Connection: [keep-alive] Content-Length: ['110'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.1 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.27 + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.31] + AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_storage_service_endpoints000001?api-version=2017-05-10 response: - body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001","name":"cli_test_storage_service_endpoints000001","location":"westus","tags":{"product":"azurecli","cause":"automation","date":"2018-04-04T18:19:44Z"},"properties":{"provisioningState":"Succeeded"}}'} + body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001","name":"cli_test_storage_service_endpoints000001","location":"westus","tags":{"product":"azurecli","cause":"automation","date":"2018-05-01T21:50:23Z"},"properties":{"provisioningState":"Succeeded"}}'} headers: cache-control: [no-cache] content-length: ['384'] content-type: [application/json; charset=utf-8] - date: ['Wed, 04 Apr 2018 18:19:46 GMT'] + date: ['Tue, 01 May 2018 21:50:23 GMT'] expires: ['-1'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-writes: ['1197'] + x-ms-ratelimit-remaining-subscription-writes: ['1199'] status: {code: 201, message: Created} - request: body: '{"sku": {"name": "Standard_LRS"}, "kind": "Storage", "location": "westus", @@ -38,8 +38,8 @@ interactions: Connection: [keep-alive] Content-Length: ['125'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.1 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.27 - msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.31] + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Storage/storageAccounts/clitest000002?api-version=2017-10-01 @@ -49,15 +49,15 @@ interactions: cache-control: [no-cache] content-length: ['0'] content-type: [text/plain; charset=utf-8] - date: ['Wed, 04 Apr 2018 18:19:46 GMT'] + date: ['Tue, 01 May 2018 21:50:25 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/9a04cc40-3dd0-4e90-a686-c099c71787ca?monitor=true&api-version=2017-10-01'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/7fa7210c-232e-41fc-95a4-2c74404a9d16?monitor=true&api-version=2017-10-01'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 Microsoft-HTTPAPI/2.0'] strict-transport-security: [max-age=31536000; includeSubDomains] x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-writes: ['1197'] + x-ms-ratelimit-remaining-subscription-writes: ['1196'] status: {code: 202, message: Accepted} - request: body: null @@ -67,18 +67,18 @@ interactions: CommandName: [storage account create] Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.1 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.27 - msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.31] + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/9a04cc40-3dd0-4e90-a686-c099c71787ca?monitor=true&api-version=2017-10-01 + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/7fa7210c-232e-41fc-95a4-2c74404a9d16?monitor=true&api-version=2017-10-01 response: - body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-04-04T18:19:47.6247946Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-04-04T18:19:47.6247946Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-04-04T18:19:47.5622932Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} + body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:50:25.3720587Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:50:25.3720587Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:50:24.9657749Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} headers: cache-control: [no-cache] content-length: ['1231'] content-type: [application/json] - date: ['Wed, 04 Apr 2018 18:20:04 GMT'] + date: ['Tue, 01 May 2018 21:50:41 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -97,18 +97,18 @@ interactions: Connection: [keep-alive] Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.1 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.27 - msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.31] + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: POST uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Storage/storageAccounts/clitest000002/listKeys?api-version=2017-10-01 response: - body: {string: '{"keys":[{"keyName":"key1","value":"vdsU97P3F2fUyGLcN8CGKwJdmI0/qApTFXNyFqtmjlNqUU6NUHYzO7XCDI9hNQ+xD2Pesvq5V6NNGBpuNOLZ4A==","permissions":"FULL"},{"keyName":"key2","value":"onGSdrdU4VyZ9l7mlBKYb95zgcMENkmvs/jJKkaV5XPIoR7dRJ5IfHwwQtmPUiQVruFgvdqt5OALKBFHYcLD7w==","permissions":"FULL"}]}'} + body: {string: '{"keys":[{"keyName":"key1","value":"qWOSwO1BVzgMfrWqXaYHDfEZuzviUAd9vNxnv+kxHY/sQvIbDhcByrFMSbeBBEbkdz+55p6bUPJmXSdjdNNtVg==","permissions":"FULL"},{"keyName":"key2","value":"Dpx3hse6j7dQQ3EWvIbIU5c0it8ICT5oNyVuJ+HJ0En485eXvJGZpJ6yYrz30YmpajDslBBxYyrfpJ17NAxJ/w==","permissions":"FULL"}]}'} headers: cache-control: [no-cache] content-length: ['288'] content-type: [application/json] - date: ['Wed, 04 Apr 2018 18:20:05 GMT'] + date: ['Tue, 01 May 2018 21:50:42 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -117,7 +117,7 @@ interactions: transfer-encoding: [chunked] vary: [Accept-Encoding] x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-writes: ['1198'] + x-ms-ratelimit-remaining-subscription-writes: ['1196'] status: {code: 200, message: OK} - request: body: null @@ -127,19 +127,19 @@ interactions: CommandName: [storage account create] Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.1 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.27 + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.31] + AZURECLI/2.0.32] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_storage_service_endpoints000001?api-version=2017-05-10 response: - body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001","name":"cli_test_storage_service_endpoints000001","location":"westus","tags":{"product":"azurecli","cause":"automation","date":"2018-04-04T18:19:44Z"},"properties":{"provisioningState":"Succeeded"}}'} + body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001","name":"cli_test_storage_service_endpoints000001","location":"westus","tags":{"product":"azurecli","cause":"automation","date":"2018-05-01T21:50:23Z"},"properties":{"provisioningState":"Succeeded"}}'} headers: cache-control: [no-cache] content-length: ['384'] content-type: [application/json; charset=utf-8] - date: ['Wed, 04 Apr 2018 18:20:05 GMT'] + date: ['Tue, 01 May 2018 21:50:44 GMT'] expires: ['-1'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] @@ -157,18 +157,18 @@ interactions: Connection: [keep-alive] Content-Length: ['190'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.1 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.27 - msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.31] + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Storage/storageAccounts/clitest000002?api-version=2017-10-01 response: - body: {string: '{"sku":{"name":"Standard_RAGRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"Metrics","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Deny"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-04-04T18:19:47.6247946Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-04-04T18:19:47.6247946Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-04-04T18:19:47.5622932Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available","secondaryEndpoints":{"blob":"https://clitest000002-secondary.blob.core.windows.net/","queue":"https://clitest000002-secondary.queue.core.windows.net/","table":"https://clitest000002-secondary.table.core.windows.net/"}}}'} + body: {string: '{"sku":{"name":"Standard_RAGRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"Metrics","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Deny"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:50:25.3720587Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:50:25.3720587Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:50:24.9657749Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available","secondaryEndpoints":{"blob":"https://clitest000002-secondary.blob.core.windows.net/","queue":"https://clitest000002-secondary.queue.core.windows.net/","table":"https://clitest000002-secondary.table.core.windows.net/"}}}'} headers: cache-control: [no-cache] content-length: ['1478'] content-type: [application/json] - date: ['Wed, 04 Apr 2018 18:20:07 GMT'] + date: ['Tue, 01 May 2018 21:50:44 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -187,18 +187,18 @@ interactions: CommandName: [storage account update] Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.1 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.27 - msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.31] + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Storage/storageAccounts/clitest000002?api-version=2017-10-01 response: - body: {string: '{"sku":{"name":"Standard_RAGRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"Metrics","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Deny"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-04-04T18:19:47.6247946Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-04-04T18:19:47.6247946Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-04-04T18:19:47.5622932Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available","secondaryEndpoints":{"blob":"https://clitest000002-secondary.blob.core.windows.net/","queue":"https://clitest000002-secondary.queue.core.windows.net/","table":"https://clitest000002-secondary.table.core.windows.net/"}}}'} + body: {string: '{"sku":{"name":"Standard_RAGRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"Metrics","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Deny"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:50:25.3720587Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:50:25.3720587Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:50:24.9657749Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available","secondaryEndpoints":{"blob":"https://clitest000002-secondary.blob.core.windows.net/","queue":"https://clitest000002-secondary.queue.core.windows.net/","table":"https://clitest000002-secondary.table.core.windows.net/"}}}'} headers: cache-control: [no-cache] content-length: ['1478'] content-type: [application/json] - date: ['Wed, 04 Apr 2018 18:20:07 GMT'] + date: ['Tue, 01 May 2018 21:50:44 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -220,18 +220,18 @@ interactions: Connection: [keep-alive] Content-Length: ['322'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.1 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.27 - msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.31] + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: PATCH uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Storage/storageAccounts/clitest000002?api-version=2017-10-01 response: - body: {string: '{"sku":{"name":"Standard_RAGRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"Logging","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-04-04T18:19:47.6247946Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-04-04T18:19:47.6247946Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-04-04T18:19:47.5622932Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available","secondaryEndpoints":{"blob":"https://clitest000002-secondary.blob.core.windows.net/","queue":"https://clitest000002-secondary.queue.core.windows.net/","table":"https://clitest000002-secondary.table.core.windows.net/"}}}'} + body: {string: '{"sku":{"name":"Standard_RAGRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"Logging","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:50:25.3720587Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:50:25.3720587Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:50:24.9657749Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available","secondaryEndpoints":{"blob":"https://clitest000002-secondary.blob.core.windows.net/","queue":"https://clitest000002-secondary.queue.core.windows.net/","table":"https://clitest000002-secondary.table.core.windows.net/"}}}'} headers: cache-control: [no-cache] content-length: ['1479'] content-type: [application/json] - date: ['Wed, 04 Apr 2018 18:20:08 GMT'] + date: ['Tue, 01 May 2018 21:50:45 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -240,7 +240,7 @@ interactions: transfer-encoding: [chunked] vary: [Accept-Encoding] x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-writes: ['1195'] + x-ms-ratelimit-remaining-subscription-writes: ['1197'] status: {code: 200, message: OK} - request: body: null @@ -250,18 +250,18 @@ interactions: CommandName: [storage account update] Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.1 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.27 - msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.31] + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Storage/storageAccounts/clitest000002?api-version=2017-10-01 response: - body: {string: '{"sku":{"name":"Standard_RAGRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"Logging","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-04-04T18:19:47.6247946Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-04-04T18:19:47.6247946Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-04-04T18:19:47.5622932Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available","secondaryEndpoints":{"blob":"https://clitest000002-secondary.blob.core.windows.net/","queue":"https://clitest000002-secondary.queue.core.windows.net/","table":"https://clitest000002-secondary.table.core.windows.net/"}}}'} + body: {string: '{"sku":{"name":"Standard_RAGRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"Logging","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:50:25.3720587Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:50:25.3720587Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:50:24.9657749Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available","secondaryEndpoints":{"blob":"https://clitest000002-secondary.blob.core.windows.net/","queue":"https://clitest000002-secondary.queue.core.windows.net/","table":"https://clitest000002-secondary.table.core.windows.net/"}}}'} headers: cache-control: [no-cache] content-length: ['1479'] content-type: [application/json] - date: ['Wed, 04 Apr 2018 18:20:09 GMT'] + date: ['Tue, 01 May 2018 21:50:46 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -283,18 +283,18 @@ interactions: Connection: [keep-alive] Content-Length: ['321'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.1 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.27 - msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.31] + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: PATCH uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Storage/storageAccounts/clitest000002?api-version=2017-10-01 response: - body: {string: '{"sku":{"name":"Standard_RAGRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"Logging","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Deny"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-04-04T18:19:47.6247946Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-04-04T18:19:47.6247946Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-04-04T18:19:47.5622932Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available","secondaryEndpoints":{"blob":"https://clitest000002-secondary.blob.core.windows.net/","queue":"https://clitest000002-secondary.queue.core.windows.net/","table":"https://clitest000002-secondary.table.core.windows.net/"}}}'} + body: {string: '{"sku":{"name":"Standard_RAGRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"Logging","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Deny"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:50:25.3720587Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:50:25.3720587Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:50:24.9657749Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available","secondaryEndpoints":{"blob":"https://clitest000002-secondary.blob.core.windows.net/","queue":"https://clitest000002-secondary.queue.core.windows.net/","table":"https://clitest000002-secondary.table.core.windows.net/"}}}'} headers: cache-control: [no-cache] content-length: ['1478'] content-type: [application/json] - date: ['Wed, 04 Apr 2018 18:20:10 GMT'] + date: ['Tue, 01 May 2018 21:50:46 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -303,7 +303,7 @@ interactions: transfer-encoding: [chunked] vary: [Accept-Encoding] x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-writes: ['1199'] + x-ms-ratelimit-remaining-subscription-writes: ['1198'] status: {code: 200, message: OK} - request: body: null @@ -313,19 +313,19 @@ interactions: CommandName: [network vnet create] Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.1 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.27 + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.31] + AZURECLI/2.0.32] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_storage_service_endpoints000001?api-version=2017-05-10 response: - body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001","name":"cli_test_storage_service_endpoints000001","location":"westus","tags":{"product":"azurecli","cause":"automation","date":"2018-04-04T18:19:44Z"},"properties":{"provisioningState":"Succeeded"}}'} + body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001","name":"cli_test_storage_service_endpoints000001","location":"westus","tags":{"product":"azurecli","cause":"automation","date":"2018-05-01T21:50:23Z"},"properties":{"provisioningState":"Succeeded"}}'} headers: cache-control: [no-cache] content-length: ['384'] content-type: [application/json; charset=utf-8] - date: ['Wed, 04 Apr 2018 18:20:10 GMT'] + date: ['Tue, 01 May 2018 21:50:51 GMT'] expires: ['-1'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] @@ -343,33 +343,33 @@ interactions: Connection: [keep-alive] Content-Length: ['205'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.1 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.27 + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 msrest_azure/0.4.25 networkmanagementclient/2.0.0rc2 Azure-SDK-For-Python - AZURECLI/2.0.31] + AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Network/virtualNetworks/vnet1?api-version=2018-02-01 response: body: {string: "{\r\n \"name\": \"vnet1\",\r\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Network/virtualNetworks/vnet1\"\ - ,\r\n \"etag\": \"W/\\\"5d72da09-4ebd-475b-8531-2ee87d015f8e\\\"\",\r\n \ + ,\r\n \"etag\": \"W/\\\"7caece64-81d6-43d8-9b18-7fc8aff7b06b\\\"\",\r\n \ \ \"type\": \"Microsoft.Network/virtualNetworks\",\r\n \"location\": \"westus\"\ ,\r\n \"tags\": {},\r\n \"properties\": {\r\n \"provisioningState\":\ - \ \"Updating\",\r\n \"resourceGuid\": \"7d82c69e-97c9-4b3a-a990-9c56412f1b85\"\ + \ \"Updating\",\r\n \"resourceGuid\": \"16adc12b-15c9-4456-9483-71ae34e5883e\"\ ,\r\n \"addressSpace\": {\r\n \"addressPrefixes\": [\r\n \"\ 10.0.0.0/16\"\r\n ]\r\n },\r\n \"dhcpOptions\": {\r\n \"dnsServers\"\ : []\r\n },\r\n \"subnets\": [\r\n {\r\n \"name\": \"subnet1\"\ ,\r\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Network/virtualNetworks/vnet1/subnets/subnet1\"\ - ,\r\n \"etag\": \"W/\\\"5d72da09-4ebd-475b-8531-2ee87d015f8e\\\"\"\ + ,\r\n \"etag\": \"W/\\\"7caece64-81d6-43d8-9b18-7fc8aff7b06b\\\"\"\ ,\r\n \"properties\": {\r\n \"provisioningState\": \"Updating\"\ ,\r\n \"addressPrefix\": \"10.0.0.0/24\"\r\n }\r\n }\r\ \n ],\r\n \"virtualNetworkPeerings\": [],\r\n \"enableDdosProtection\"\ : false,\r\n \"enableVmProtection\": false\r\n }\r\n}"} headers: - azure-asyncoperation: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Network/locations/westus/operations/9cc37ec6-0395-43a5-be35-9d10956b20f3?api-version=2018-02-01'] + azure-asyncoperation: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Network/locations/westus/operations/7dbb1e4a-e2e2-41ec-b99f-495eb60f654f?api-version=2018-02-01'] cache-control: [no-cache] content-length: ['1230'] content-type: [application/json; charset=utf-8] - date: ['Wed, 04 Apr 2018 18:20:11 GMT'] + date: ['Tue, 01 May 2018 21:50:51 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0, Microsoft-HTTPAPI/2.0] @@ -384,18 +384,18 @@ interactions: Accept-Encoding: ['gzip, deflate'] CommandName: [network vnet create] Connection: [keep-alive] - User-Agent: [python/3.6.1 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.27 + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 msrest_azure/0.4.25 networkmanagementclient/2.0.0rc2 Azure-SDK-For-Python - AZURECLI/2.0.31] + AZURECLI/2.0.32] method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Network/locations/westus/operations/9cc37ec6-0395-43a5-be35-9d10956b20f3?api-version=2018-02-01 + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Network/locations/westus/operations/7dbb1e4a-e2e2-41ec-b99f-495eb60f654f?api-version=2018-02-01 response: body: {string: "{\r\n \"status\": \"InProgress\"\r\n}"} headers: cache-control: [no-cache] content-length: ['30'] content-type: [application/json; charset=utf-8] - date: ['Wed, 04 Apr 2018 18:20:15 GMT'] + date: ['Tue, 01 May 2018 21:50:54 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0, Microsoft-HTTPAPI/2.0] @@ -411,18 +411,18 @@ interactions: Accept-Encoding: ['gzip, deflate'] CommandName: [network vnet create] Connection: [keep-alive] - User-Agent: [python/3.6.1 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.27 + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 msrest_azure/0.4.25 networkmanagementclient/2.0.0rc2 Azure-SDK-For-Python - AZURECLI/2.0.31] + AZURECLI/2.0.32] method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Network/locations/westus/operations/9cc37ec6-0395-43a5-be35-9d10956b20f3?api-version=2018-02-01 + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Network/locations/westus/operations/7dbb1e4a-e2e2-41ec-b99f-495eb60f654f?api-version=2018-02-01 response: body: {string: "{\r\n \"status\": \"Succeeded\"\r\n}"} headers: cache-control: [no-cache] content-length: ['29'] content-type: [application/json; charset=utf-8] - date: ['Wed, 04 Apr 2018 18:20:25 GMT'] + date: ['Tue, 01 May 2018 21:51:05 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0, Microsoft-HTTPAPI/2.0] @@ -438,22 +438,22 @@ interactions: Accept-Encoding: ['gzip, deflate'] CommandName: [network vnet create] Connection: [keep-alive] - User-Agent: [python/3.6.1 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.27 + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 msrest_azure/0.4.25 networkmanagementclient/2.0.0rc2 Azure-SDK-For-Python - AZURECLI/2.0.31] + AZURECLI/2.0.32] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Network/virtualNetworks/vnet1?api-version=2018-02-01 response: body: {string: "{\r\n \"name\": \"vnet1\",\r\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Network/virtualNetworks/vnet1\"\ - ,\r\n \"etag\": \"W/\\\"fcbfa7a6-5dd9-4213-9ec6-7fac99135368\\\"\",\r\n \ + ,\r\n \"etag\": \"W/\\\"31985a96-6d04-4122-b48e-9f096715aaa7\\\"\",\r\n \ \ \"type\": \"Microsoft.Network/virtualNetworks\",\r\n \"location\": \"westus\"\ ,\r\n \"tags\": {},\r\n \"properties\": {\r\n \"provisioningState\":\ - \ \"Succeeded\",\r\n \"resourceGuid\": \"7d82c69e-97c9-4b3a-a990-9c56412f1b85\"\ + \ \"Succeeded\",\r\n \"resourceGuid\": \"16adc12b-15c9-4456-9483-71ae34e5883e\"\ ,\r\n \"addressSpace\": {\r\n \"addressPrefixes\": [\r\n \"\ 10.0.0.0/16\"\r\n ]\r\n },\r\n \"dhcpOptions\": {\r\n \"dnsServers\"\ : []\r\n },\r\n \"subnets\": [\r\n {\r\n \"name\": \"subnet1\"\ ,\r\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Network/virtualNetworks/vnet1/subnets/subnet1\"\ - ,\r\n \"etag\": \"W/\\\"fcbfa7a6-5dd9-4213-9ec6-7fac99135368\\\"\"\ + ,\r\n \"etag\": \"W/\\\"31985a96-6d04-4122-b48e-9f096715aaa7\\\"\"\ ,\r\n \"properties\": {\r\n \"provisioningState\": \"Succeeded\"\ ,\r\n \"addressPrefix\": \"10.0.0.0/24\"\r\n }\r\n }\r\ \n ],\r\n \"virtualNetworkPeerings\": [],\r\n \"enableDdosProtection\"\ @@ -462,8 +462,8 @@ interactions: cache-control: [no-cache] content-length: ['1232'] content-type: [application/json; charset=utf-8] - date: ['Wed, 04 Apr 2018 18:20:26 GMT'] - etag: [W/"fcbfa7a6-5dd9-4213-9ec6-7fac99135368"] + date: ['Tue, 01 May 2018 21:51:05 GMT'] + etag: [W/"31985a96-6d04-4122-b48e-9f096715aaa7"] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0, Microsoft-HTTPAPI/2.0] @@ -480,23 +480,23 @@ interactions: CommandName: [network vnet subnet update] Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.1 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.27 + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 msrest_azure/0.4.25 networkmanagementclient/2.0.0rc2 Azure-SDK-For-Python - AZURECLI/2.0.31] + AZURECLI/2.0.32] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Network/virtualNetworks/vnet1/subnets/subnet1?api-version=2018-02-01 response: body: {string: "{\r\n \"name\": \"subnet1\",\r\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Network/virtualNetworks/vnet1/subnets/subnet1\"\ - ,\r\n \"etag\": \"W/\\\"fcbfa7a6-5dd9-4213-9ec6-7fac99135368\\\"\",\r\n \ + ,\r\n \"etag\": \"W/\\\"31985a96-6d04-4122-b48e-9f096715aaa7\\\"\",\r\n \ \ \"properties\": {\r\n \"provisioningState\": \"Succeeded\",\r\n \"\ addressPrefix\": \"10.0.0.0/24\"\r\n }\r\n}"} headers: cache-control: [no-cache] content-length: ['403'] content-type: [application/json; charset=utf-8] - date: ['Wed, 04 Apr 2018 18:20:26 GMT'] - etag: [W/"fcbfa7a6-5dd9-4213-9ec6-7fac99135368"] + date: ['Tue, 01 May 2018 21:51:06 GMT'] + etag: [W/"31985a96-6d04-4122-b48e-9f096715aaa7"] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0, Microsoft-HTTPAPI/2.0] @@ -509,7 +509,7 @@ interactions: body: 'b''{"id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Network/virtualNetworks/vnet1/subnets/subnet1", "properties": {"addressPrefix": "10.0.0.0/24", "serviceEndpoints": [{"service": "Microsoft.Storage"}], "provisioningState": "Succeeded"}, "name": "subnet1", - "etag": "W/\\"fcbfa7a6-5dd9-4213-9ec6-7fac99135368\\""}''' + "etag": "W/\\"31985a96-6d04-4122-b48e-9f096715aaa7\\""}''' headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] @@ -517,26 +517,26 @@ interactions: Connection: [keep-alive] Content-Length: ['429'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.1 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.27 + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 msrest_azure/0.4.25 networkmanagementclient/2.0.0rc2 Azure-SDK-For-Python - AZURECLI/2.0.31] + AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Network/virtualNetworks/vnet1/subnets/subnet1?api-version=2018-02-01 response: body: {string: "{\r\n \"name\": \"subnet1\",\r\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Network/virtualNetworks/vnet1/subnets/subnet1\"\ - ,\r\n \"etag\": \"W/\\\"1d5c59cf-a1a9-4e4c-9fb9-45b13c1638ea\\\"\",\r\n \ + ,\r\n \"etag\": \"W/\\\"a69be374-b963-45f6-ab1d-9c9f8176f949\\\"\",\r\n \ \ \"properties\": {\r\n \"provisioningState\": \"Updating\",\r\n \"\ addressPrefix\": \"10.0.0.0/24\",\r\n \"serviceEndpoints\": [\r\n \ \ {\r\n \"provisioningState\": \"Updating\",\r\n \"service\"\ : \"Microsoft.Storage\",\r\n \"locations\": [\r\n \"westus\"\ ,\r\n \"eastus\"\r\n ]\r\n }\r\n ]\r\n }\r\n}"} headers: - azure-asyncoperation: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Network/locations/westus/operations/a418b8fe-519a-48eb-b336-a1bb9b7209cb?api-version=2018-02-01'] + azure-asyncoperation: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Network/locations/westus/operations/5f42439d-cc62-4a42-9309-477d67c97ece?api-version=2018-02-01'] cache-control: [no-cache] content-length: ['614'] content-type: [application/json; charset=utf-8] - date: ['Wed, 04 Apr 2018 18:20:27 GMT'] + date: ['Tue, 01 May 2018 21:51:07 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0, Microsoft-HTTPAPI/2.0] @@ -544,7 +544,7 @@ interactions: transfer-encoding: [chunked] vary: [Accept-Encoding] x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-writes: ['1197'] + x-ms-ratelimit-remaining-subscription-writes: ['1196'] status: {code: 200, message: OK} - request: body: null @@ -553,18 +553,18 @@ interactions: Accept-Encoding: ['gzip, deflate'] CommandName: [network vnet subnet update] Connection: [keep-alive] - User-Agent: [python/3.6.1 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.27 + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 msrest_azure/0.4.25 networkmanagementclient/2.0.0rc2 Azure-SDK-For-Python - AZURECLI/2.0.31] + AZURECLI/2.0.32] method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Network/locations/westus/operations/a418b8fe-519a-48eb-b336-a1bb9b7209cb?api-version=2018-02-01 + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Network/locations/westus/operations/5f42439d-cc62-4a42-9309-477d67c97ece?api-version=2018-02-01 response: body: {string: "{\r\n \"status\": \"Succeeded\"\r\n}"} headers: cache-control: [no-cache] content-length: ['29'] content-type: [application/json; charset=utf-8] - date: ['Wed, 04 Apr 2018 18:20:31 GMT'] + date: ['Tue, 01 May 2018 21:51:10 GMT'] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0, Microsoft-HTTPAPI/2.0] @@ -580,14 +580,14 @@ interactions: Accept-Encoding: ['gzip, deflate'] CommandName: [network vnet subnet update] Connection: [keep-alive] - User-Agent: [python/3.6.1 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.27 + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 msrest_azure/0.4.25 networkmanagementclient/2.0.0rc2 Azure-SDK-For-Python - AZURECLI/2.0.31] + AZURECLI/2.0.32] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Network/virtualNetworks/vnet1/subnets/subnet1?api-version=2018-02-01 response: body: {string: "{\r\n \"name\": \"subnet1\",\r\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Network/virtualNetworks/vnet1/subnets/subnet1\"\ - ,\r\n \"etag\": \"W/\\\"b5052a24-23e5-45b1-b1c1-799fb50ec51f\\\"\",\r\n \ + ,\r\n \"etag\": \"W/\\\"4d7eebd5-7a63-4525-a927-a1b25fb98a40\\\"\",\r\n \ \ \"properties\": {\r\n \"provisioningState\": \"Succeeded\",\r\n \"\ addressPrefix\": \"10.0.0.0/24\",\r\n \"serviceEndpoints\": [\r\n \ \ {\r\n \"provisioningState\": \"Succeeded\",\r\n \"service\"\ @@ -597,8 +597,8 @@ interactions: cache-control: [no-cache] content-length: ['616'] content-type: [application/json; charset=utf-8] - date: ['Wed, 04 Apr 2018 18:20:31 GMT'] - etag: [W/"b5052a24-23e5-45b1-b1c1-799fb50ec51f"] + date: ['Tue, 01 May 2018 21:51:11 GMT'] + etag: [W/"4d7eebd5-7a63-4525-a927-a1b25fb98a40"] expires: ['-1'] pragma: [no-cache] server: [Microsoft-HTTPAPI/2.0, Microsoft-HTTPAPI/2.0] @@ -615,18 +615,18 @@ interactions: CommandName: [storage account network-rule add] Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.1 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.27 - msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.31] + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Storage/storageAccounts/clitest000002?api-version=2017-10-01 response: - body: {string: '{"sku":{"name":"Standard_RAGRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"Logging","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Deny"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-04-04T18:19:47.6247946Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-04-04T18:19:47.6247946Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-04-04T18:19:47.5622932Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available","secondaryEndpoints":{"blob":"https://clitest000002-secondary.blob.core.windows.net/","queue":"https://clitest000002-secondary.queue.core.windows.net/","table":"https://clitest000002-secondary.table.core.windows.net/"}}}'} + body: {string: '{"sku":{"name":"Standard_RAGRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"Logging","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Deny"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:50:25.3720587Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:50:25.3720587Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:50:24.9657749Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available","secondaryEndpoints":{"blob":"https://clitest000002-secondary.blob.core.windows.net/","queue":"https://clitest000002-secondary.queue.core.windows.net/","table":"https://clitest000002-secondary.table.core.windows.net/"}}}'} headers: cache-control: [no-cache] content-length: ['1478'] content-type: [application/json] - date: ['Wed, 04 Apr 2018 18:20:32 GMT'] + date: ['Tue, 01 May 2018 21:51:11 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -647,18 +647,18 @@ interactions: Connection: [keep-alive] Content-Length: ['196'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.1 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.27 - msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.31] + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: PATCH uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Storage/storageAccounts/clitest000002?api-version=2017-10-01 response: - body: {string: '{"sku":{"name":"Standard_RAGRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"Logging","virtualNetworkRules":[],"ipRules":[{"value":"25.1.2.3","action":"Allow"}],"defaultAction":"Deny"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-04-04T18:19:47.6247946Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-04-04T18:19:47.6247946Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-04-04T18:19:47.5622932Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available","secondaryEndpoints":{"blob":"https://clitest000002-secondary.blob.core.windows.net/","queue":"https://clitest000002-secondary.queue.core.windows.net/","table":"https://clitest000002-secondary.table.core.windows.net/"}}}'} + body: {string: '{"sku":{"name":"Standard_RAGRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"Logging","virtualNetworkRules":[],"ipRules":[{"value":"25.1.2.3","action":"Allow"}],"defaultAction":"Deny"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:50:25.3720587Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:50:25.3720587Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:50:24.9657749Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available","secondaryEndpoints":{"blob":"https://clitest000002-secondary.blob.core.windows.net/","queue":"https://clitest000002-secondary.queue.core.windows.net/","table":"https://clitest000002-secondary.table.core.windows.net/"}}}'} headers: cache-control: [no-cache] content-length: ['1515'] content-type: [application/json] - date: ['Wed, 04 Apr 2018 18:20:31 GMT'] + date: ['Tue, 01 May 2018 21:51:12 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -677,18 +677,18 @@ interactions: CommandName: [storage account network-rule add] Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.1 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.27 - msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.31] + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Storage/storageAccounts/clitest000002?api-version=2017-10-01 response: - body: {string: '{"sku":{"name":"Standard_RAGRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"Logging","virtualNetworkRules":[],"ipRules":[{"value":"25.1.2.3","action":"Allow"}],"defaultAction":"Deny"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-04-04T18:19:47.6247946Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-04-04T18:19:47.6247946Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-04-04T18:19:47.5622932Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available","secondaryEndpoints":{"blob":"https://clitest000002-secondary.blob.core.windows.net/","queue":"https://clitest000002-secondary.queue.core.windows.net/","table":"https://clitest000002-secondary.table.core.windows.net/"}}}'} + body: {string: '{"sku":{"name":"Standard_RAGRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"Logging","virtualNetworkRules":[],"ipRules":[{"value":"25.1.2.3","action":"Allow"}],"defaultAction":"Deny"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:50:25.3720587Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:50:25.3720587Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:50:24.9657749Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available","secondaryEndpoints":{"blob":"https://clitest000002-secondary.blob.core.windows.net/","queue":"https://clitest000002-secondary.queue.core.windows.net/","table":"https://clitest000002-secondary.table.core.windows.net/"}}}'} headers: cache-control: [no-cache] content-length: ['1515'] content-type: [application/json] - date: ['Wed, 04 Apr 2018 18:20:32 GMT'] + date: ['Tue, 01 May 2018 21:51:12 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -709,18 +709,18 @@ interactions: Connection: [keep-alive] Content-Length: ['241'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.1 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.27 - msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.31] + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: PATCH uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Storage/storageAccounts/clitest000002?api-version=2017-10-01 response: - body: {string: '{"sku":{"name":"Standard_RAGRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"Logging","virtualNetworkRules":[],"ipRules":[{"value":"25.1.2.3","action":"Allow"},{"value":"25.2.0.0/24","action":"Allow"}],"defaultAction":"Deny"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-04-04T18:19:47.6247946Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-04-04T18:19:47.6247946Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-04-04T18:19:47.5622932Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available","secondaryEndpoints":{"blob":"https://clitest000002-secondary.blob.core.windows.net/","queue":"https://clitest000002-secondary.queue.core.windows.net/","table":"https://clitest000002-secondary.table.core.windows.net/"}}}'} + body: {string: '{"sku":{"name":"Standard_RAGRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"Logging","virtualNetworkRules":[],"ipRules":[{"value":"25.1.2.3","action":"Allow"},{"value":"25.2.0.0/24","action":"Allow"}],"defaultAction":"Deny"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:50:25.3720587Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:50:25.3720587Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:50:24.9657749Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available","secondaryEndpoints":{"blob":"https://clitest000002-secondary.blob.core.windows.net/","queue":"https://clitest000002-secondary.queue.core.windows.net/","table":"https://clitest000002-secondary.table.core.windows.net/"}}}'} headers: cache-control: [no-cache] content-length: ['1556'] content-type: [application/json] - date: ['Wed, 04 Apr 2018 18:20:33 GMT'] + date: ['Tue, 01 May 2018 21:51:12 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -739,18 +739,18 @@ interactions: CommandName: [storage account network-rule add] Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.1 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.27 - msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.31] + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Storage/storageAccounts/clitest000002?api-version=2017-10-01 response: - body: {string: '{"sku":{"name":"Standard_RAGRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"Logging","virtualNetworkRules":[],"ipRules":[{"value":"25.1.2.3","action":"Allow"},{"value":"25.2.0.0/24","action":"Allow"}],"defaultAction":"Deny"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-04-04T18:19:47.6247946Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-04-04T18:19:47.6247946Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-04-04T18:19:47.5622932Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available","secondaryEndpoints":{"blob":"https://clitest000002-secondary.blob.core.windows.net/","queue":"https://clitest000002-secondary.queue.core.windows.net/","table":"https://clitest000002-secondary.table.core.windows.net/"}}}'} + body: {string: '{"sku":{"name":"Standard_RAGRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"Logging","virtualNetworkRules":[],"ipRules":[{"value":"25.1.2.3","action":"Allow"},{"value":"25.2.0.0/24","action":"Allow"}],"defaultAction":"Deny"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:50:25.3720587Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:50:25.3720587Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:50:24.9657749Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available","secondaryEndpoints":{"blob":"https://clitest000002-secondary.blob.core.windows.net/","queue":"https://clitest000002-secondary.queue.core.windows.net/","table":"https://clitest000002-secondary.table.core.windows.net/"}}}'} headers: cache-control: [no-cache] content-length: ['1556'] content-type: [application/json] - date: ['Wed, 04 Apr 2018 18:20:34 GMT'] + date: ['Tue, 01 May 2018 21:51:13 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -772,18 +772,18 @@ interactions: Connection: [keep-alive] Content-Length: ['478'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.1 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.27 - msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.31] + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: PATCH uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Storage/storageAccounts/clitest000002?api-version=2017-10-01 response: - body: {string: '{"sku":{"name":"Standard_RAGRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"Logging","virtualNetworkRules":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Network/virtualNetworks/vnet1/subnets/subnet1","action":"Allow","state":"Succeeded"}],"ipRules":[{"value":"25.1.2.3","action":"Allow"},{"value":"25.2.0.0/24","action":"Allow"}],"defaultAction":"Deny"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-04-04T18:19:47.6247946Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-04-04T18:19:47.6247946Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-04-04T18:19:47.5622932Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available","secondaryEndpoints":{"blob":"https://clitest000002-secondary.blob.core.windows.net/","queue":"https://clitest000002-secondary.queue.core.windows.net/","table":"https://clitest000002-secondary.table.core.windows.net/"}}}'} + body: {string: '{"sku":{"name":"Standard_RAGRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"Logging","virtualNetworkRules":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Network/virtualNetworks/vnet1/subnets/subnet1","action":"Allow","state":"Succeeded"}],"ipRules":[{"value":"25.1.2.3","action":"Allow"},{"value":"25.2.0.0/24","action":"Allow"}],"defaultAction":"Deny"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:50:25.3720587Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:50:25.3720587Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:50:24.9657749Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available","secondaryEndpoints":{"blob":"https://clitest000002-secondary.blob.core.windows.net/","queue":"https://clitest000002-secondary.queue.core.windows.net/","table":"https://clitest000002-secondary.table.core.windows.net/"}}}'} headers: cache-control: [no-cache] content-length: ['1810'] content-type: [application/json] - date: ['Wed, 04 Apr 2018 18:20:36 GMT'] + date: ['Tue, 01 May 2018 21:51:15 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -792,7 +792,7 @@ interactions: transfer-encoding: [chunked] vary: [Accept-Encoding] x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-writes: ['1199'] + x-ms-ratelimit-remaining-subscription-writes: ['1192'] status: {code: 200, message: OK} - request: body: null @@ -802,18 +802,18 @@ interactions: CommandName: [storage account network-rule list] Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.1 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.27 - msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.31] + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Storage/storageAccounts/clitest000002?api-version=2017-10-01 response: - body: {string: '{"sku":{"name":"Standard_RAGRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"Logging","virtualNetworkRules":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Network/virtualNetworks/vnet1/subnets/subnet1","action":"Allow","state":"Succeeded"}],"ipRules":[{"value":"25.1.2.3","action":"Allow"},{"value":"25.2.0.0/24","action":"Allow"}],"defaultAction":"Deny"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-04-04T18:19:47.6247946Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-04-04T18:19:47.6247946Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-04-04T18:19:47.5622932Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available","secondaryEndpoints":{"blob":"https://clitest000002-secondary.blob.core.windows.net/","queue":"https://clitest000002-secondary.queue.core.windows.net/","table":"https://clitest000002-secondary.table.core.windows.net/"}}}'} + body: {string: '{"sku":{"name":"Standard_RAGRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"Logging","virtualNetworkRules":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Network/virtualNetworks/vnet1/subnets/subnet1","action":"Allow","state":"Succeeded"}],"ipRules":[{"value":"25.1.2.3","action":"Allow"},{"value":"25.2.0.0/24","action":"Allow"}],"defaultAction":"Deny"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:50:25.3720587Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:50:25.3720587Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:50:24.9657749Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available","secondaryEndpoints":{"blob":"https://clitest000002-secondary.blob.core.windows.net/","queue":"https://clitest000002-secondary.queue.core.windows.net/","table":"https://clitest000002-secondary.table.core.windows.net/"}}}'} headers: cache-control: [no-cache] content-length: ['1810'] content-type: [application/json] - date: ['Wed, 04 Apr 2018 18:20:35 GMT'] + date: ['Tue, 01 May 2018 21:51:16 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -831,18 +831,18 @@ interactions: CommandName: [storage account network-rule remove] Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.1 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.27 - msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.31] + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Storage/storageAccounts/clitest000002?api-version=2017-10-01 response: - body: {string: '{"sku":{"name":"Standard_RAGRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"Logging","virtualNetworkRules":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Network/virtualNetworks/vnet1/subnets/subnet1","action":"Allow","state":"Succeeded"}],"ipRules":[{"value":"25.1.2.3","action":"Allow"},{"value":"25.2.0.0/24","action":"Allow"}],"defaultAction":"Deny"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-04-04T18:19:47.6247946Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-04-04T18:19:47.6247946Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-04-04T18:19:47.5622932Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available","secondaryEndpoints":{"blob":"https://clitest000002-secondary.blob.core.windows.net/","queue":"https://clitest000002-secondary.queue.core.windows.net/","table":"https://clitest000002-secondary.table.core.windows.net/"}}}'} + body: {string: '{"sku":{"name":"Standard_RAGRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"Logging","virtualNetworkRules":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Network/virtualNetworks/vnet1/subnets/subnet1","action":"Allow","state":"Succeeded"}],"ipRules":[{"value":"25.1.2.3","action":"Allow"},{"value":"25.2.0.0/24","action":"Allow"}],"defaultAction":"Deny"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:50:25.3720587Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:50:25.3720587Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:50:24.9657749Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available","secondaryEndpoints":{"blob":"https://clitest000002-secondary.blob.core.windows.net/","queue":"https://clitest000002-secondary.queue.core.windows.net/","table":"https://clitest000002-secondary.table.core.windows.net/"}}}'} headers: cache-control: [no-cache] content-length: ['1810'] content-type: [application/json] - date: ['Wed, 04 Apr 2018 18:20:36 GMT'] + date: ['Tue, 01 May 2018 21:51:16 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -864,18 +864,18 @@ interactions: Connection: [keep-alive] Content-Length: ['458'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.1 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.27 - msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.31] + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: PATCH uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Storage/storageAccounts/clitest000002?api-version=2017-10-01 response: - body: {string: '{"sku":{"name":"Standard_RAGRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"Logging","virtualNetworkRules":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Network/virtualNetworks/vnet1/subnets/subnet1","action":"Allow","state":"Succeeded"}],"ipRules":[{"value":"25.2.0.0/24","action":"Allow"}],"defaultAction":"Deny"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-04-04T18:19:47.6247946Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-04-04T18:19:47.6247946Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-04-04T18:19:47.5622932Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available","secondaryEndpoints":{"blob":"https://clitest000002-secondary.blob.core.windows.net/","queue":"https://clitest000002-secondary.queue.core.windows.net/","table":"https://clitest000002-secondary.table.core.windows.net/"}}}'} + body: {string: '{"sku":{"name":"Standard_RAGRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"Logging","virtualNetworkRules":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Network/virtualNetworks/vnet1/subnets/subnet1","action":"Allow","state":"Succeeded"}],"ipRules":[{"value":"25.2.0.0/24","action":"Allow"}],"defaultAction":"Deny"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:50:25.3720587Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:50:25.3720587Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:50:24.9657749Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available","secondaryEndpoints":{"blob":"https://clitest000002-secondary.blob.core.windows.net/","queue":"https://clitest000002-secondary.queue.core.windows.net/","table":"https://clitest000002-secondary.table.core.windows.net/"}}}'} headers: cache-control: [no-cache] content-length: ['1772'] content-type: [application/json] - date: ['Wed, 04 Apr 2018 18:20:39 GMT'] + date: ['Tue, 01 May 2018 21:51:18 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -884,7 +884,7 @@ interactions: transfer-encoding: [chunked] vary: [Accept-Encoding] x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-writes: ['1197'] + x-ms-ratelimit-remaining-subscription-writes: ['1199'] status: {code: 200, message: OK} - request: body: null @@ -894,18 +894,18 @@ interactions: CommandName: [storage account network-rule remove] Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.1 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.27 - msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.31] + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Storage/storageAccounts/clitest000002?api-version=2017-10-01 response: - body: {string: '{"sku":{"name":"Standard_RAGRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"Logging","virtualNetworkRules":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Network/virtualNetworks/vnet1/subnets/subnet1","action":"Allow","state":"Succeeded"}],"ipRules":[{"value":"25.2.0.0/24","action":"Allow"}],"defaultAction":"Deny"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-04-04T18:19:47.6247946Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-04-04T18:19:47.6247946Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-04-04T18:19:47.5622932Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available","secondaryEndpoints":{"blob":"https://clitest000002-secondary.blob.core.windows.net/","queue":"https://clitest000002-secondary.queue.core.windows.net/","table":"https://clitest000002-secondary.table.core.windows.net/"}}}'} + body: {string: '{"sku":{"name":"Standard_RAGRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"Logging","virtualNetworkRules":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Network/virtualNetworks/vnet1/subnets/subnet1","action":"Allow","state":"Succeeded"}],"ipRules":[{"value":"25.2.0.0/24","action":"Allow"}],"defaultAction":"Deny"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:50:25.3720587Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:50:25.3720587Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:50:24.9657749Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available","secondaryEndpoints":{"blob":"https://clitest000002-secondary.blob.core.windows.net/","queue":"https://clitest000002-secondary.queue.core.windows.net/","table":"https://clitest000002-secondary.table.core.windows.net/"}}}'} headers: cache-control: [no-cache] content-length: ['1772'] content-type: [application/json] - date: ['Wed, 04 Apr 2018 18:20:39 GMT'] + date: ['Tue, 01 May 2018 21:51:19 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -926,18 +926,18 @@ interactions: Connection: [keep-alive] Content-Length: ['199'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.1 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.27 - msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.31] + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: PATCH uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Storage/storageAccounts/clitest000002?api-version=2017-10-01 response: - body: {string: '{"sku":{"name":"Standard_RAGRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"Logging","virtualNetworkRules":[],"ipRules":[{"value":"25.2.0.0/24","action":"Allow"}],"defaultAction":"Deny"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-04-04T18:19:47.6247946Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-04-04T18:19:47.6247946Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-04-04T18:19:47.5622932Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available","secondaryEndpoints":{"blob":"https://clitest000002-secondary.blob.core.windows.net/","queue":"https://clitest000002-secondary.queue.core.windows.net/","table":"https://clitest000002-secondary.table.core.windows.net/"}}}'} + body: {string: '{"sku":{"name":"Standard_RAGRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"Logging","virtualNetworkRules":[],"ipRules":[{"value":"25.2.0.0/24","action":"Allow"}],"defaultAction":"Deny"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:50:25.3720587Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:50:25.3720587Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:50:24.9657749Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available","secondaryEndpoints":{"blob":"https://clitest000002-secondary.blob.core.windows.net/","queue":"https://clitest000002-secondary.queue.core.windows.net/","table":"https://clitest000002-secondary.table.core.windows.net/"}}}'} headers: cache-control: [no-cache] content-length: ['1518'] content-type: [application/json] - date: ['Wed, 04 Apr 2018 18:20:41 GMT'] + date: ['Tue, 01 May 2018 21:51:21 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -946,7 +946,7 @@ interactions: transfer-encoding: [chunked] vary: [Accept-Encoding] x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-writes: ['1197'] + x-ms-ratelimit-remaining-subscription-writes: ['1196'] status: {code: 200, message: OK} - request: body: null @@ -956,18 +956,18 @@ interactions: CommandName: [storage account network-rule list] Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.1 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.27 - msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.31] + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Storage/storageAccounts/clitest000002?api-version=2017-10-01 response: - body: {string: '{"sku":{"name":"Standard_RAGRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"Logging","virtualNetworkRules":[],"ipRules":[{"value":"25.2.0.0/24","action":"Allow"}],"defaultAction":"Deny"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-04-04T18:19:47.6247946Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-04-04T18:19:47.6247946Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-04-04T18:19:47.5622932Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available","secondaryEndpoints":{"blob":"https://clitest000002-secondary.blob.core.windows.net/","queue":"https://clitest000002-secondary.queue.core.windows.net/","table":"https://clitest000002-secondary.table.core.windows.net/"}}}'} + body: {string: '{"sku":{"name":"Standard_RAGRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_storage_service_endpoints000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"Logging","virtualNetworkRules":[],"ipRules":[{"value":"25.2.0.0/24","action":"Allow"}],"defaultAction":"Deny"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:50:25.3720587Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:50:25.3720587Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:50:24.9657749Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available","secondaryEndpoints":{"blob":"https://clitest000002-secondary.blob.core.windows.net/","queue":"https://clitest000002-secondary.queue.core.windows.net/","table":"https://clitest000002-secondary.table.core.windows.net/"}}}'} headers: cache-control: [no-cache] content-length: ['1518'] content-type: [application/json] - date: ['Wed, 04 Apr 2018 18:20:42 GMT'] + date: ['Tue, 01 May 2018 21:51:20 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -986,9 +986,9 @@ interactions: Connection: [keep-alive] Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.1 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.27 + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.31] + AZURECLI/2.0.32] accept-language: [en-US] method: DELETE uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_storage_service_endpoints000001?api-version=2017-05-10 @@ -997,12 +997,12 @@ interactions: headers: cache-control: [no-cache] content-length: ['0'] - date: ['Wed, 04 Apr 2018 18:20:42 GMT'] + date: ['Tue, 01 May 2018 21:51:21 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTEk6NUZURVNUOjVGU1RPUkFHRTo1RlNFUlZJQ0U6NUZFTkRQT0lOVFNERFBKRHxERDg2QTZFMTk2MTlCQjhBLVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTEk6NUZURVNUOjVGU1RPUkFHRTo1RlNFUlZJQ0U6NUZFTkRQT0lOVFM1NlQ1Rnw5RkIwNUI4RDM3Q0JGQzA0LVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-writes: ['1196'] + x-ms-ratelimit-remaining-subscription-writes: ['1197'] status: {code: 202, message: Accepted} version: 1 diff --git a/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_blob_append.yaml b/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_blob_append.yaml index 3dfe04c18d7..cafd625adc2 100644 --- a/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_blob_append.yaml +++ b/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_blob_append.yaml @@ -1,31 +1,32 @@ interactions: - request: - body: '{"location": "westus", "tags": {"use": "az-test"}}' + body: '{"location": "westus", "tags": {"product": "azurecli", "cause": "automation", + "date": "2018-05-01T21:45:25Z"}}' headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] CommandName: [group create] Connection: [keep-alive] - Content-Length: ['50'] + Content-Length: ['110'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.29] + msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2017-05-10 response: - body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"westus","tags":{"use":"az-test"},"properties":{"provisioningState":"Succeeded"}}'} + body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"westus","tags":{"product":"azurecli","cause":"automation","date":"2018-05-01T21:45:25Z"},"properties":{"provisioningState":"Succeeded"}}'} headers: cache-control: [no-cache] - content-length: ['328'] + content-length: ['384'] content-type: [application/json; charset=utf-8] - date: ['Fri, 09 Mar 2018 21:24:23 GMT'] + date: ['Tue, 01 May 2018 21:45:27 GMT'] expires: ['-1'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-writes: ['1198'] + x-ms-ratelimit-remaining-subscription-writes: ['1199'] status: {code: 201, message: Created} - request: body: '{"sku": {"name": "Standard_LRS"}, "kind": "Storage", "location": "westus", @@ -38,7 +39,7 @@ interactions: Content-Length: ['125'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.29] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002?api-version=2017-10-01 @@ -48,15 +49,15 @@ interactions: cache-control: [no-cache] content-length: ['0'] content-type: [text/plain; charset=utf-8] - date: ['Fri, 09 Mar 2018 21:24:26 GMT'] + date: ['Tue, 01 May 2018 21:45:27 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/c7130dc0-8742-4df0-b96f-9c735167b847?monitor=true&api-version=2017-10-01'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/1d74ead7-75d6-478d-bad1-b1e1b3b27c02?monitor=true&api-version=2017-10-01'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 Microsoft-HTTPAPI/2.0'] strict-transport-security: [max-age=31536000; includeSubDomains] x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-writes: ['1198'] + x-ms-ratelimit-remaining-subscription-writes: ['1199'] status: {code: 202, message: Accepted} - request: body: null @@ -67,45 +68,17 @@ interactions: Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.29] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/c7130dc0-8742-4df0-b96f-9c735167b847?monitor=true&api-version=2017-10-01 + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/1d74ead7-75d6-478d-bad1-b1e1b3b27c02?monitor=true&api-version=2017-10-01 response: - body: {string: ''} - headers: - cache-control: [no-cache] - content-length: ['0'] - content-type: [text/plain; charset=utf-8] - date: ['Fri, 09 Mar 2018 21:24:43 GMT'] - expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/c7130dc0-8742-4df0-b96f-9c735167b847?monitor=true&api-version=2017-10-01'] - pragma: [no-cache] - server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 - Microsoft-HTTPAPI/2.0'] - strict-transport-security: [max-age=31536000; includeSubDomains] - x-content-type-options: [nosniff] - status: {code: 202, message: Accepted} -- request: - body: null - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [storage account create] - Connection: [keep-alive] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.29] - accept-language: [en-US] - method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/c7130dc0-8742-4df0-b96f-9c735167b847?monitor=true&api-version=2017-10-01 - response: - body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-03-09T21:24:25.9673412Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-03-09T21:24:25.9673412Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-03-09T21:24:25.9517391Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} + body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:45:28.2151132Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:45:28.2151132Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:45:28.1369842Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} headers: cache-control: [no-cache] content-length: ['1231'] content-type: [application/json] - date: ['Fri, 09 Mar 2018 21:25:01 GMT'] + date: ['Tue, 01 May 2018 21:45:45 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -125,17 +98,17 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.29] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: POST uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002/listKeys?api-version=2017-10-01 response: - body: {string: '{"keys":[{"keyName":"key1","value":"wEpDeAcuqU8xPj0pKJGM1vQRqB/ldhPmOs/XzewVFIn3lFbKPofz7gNE4aILYdt29eEQ/1mk4TGOsNFpAX9oXQ==","permissions":"FULL"},{"keyName":"key2","value":"Iz3qoDlAi+yDuI7dfeirLiDpqmCfbz9WxvQRpNKFYtyvB7+1gr6sWh5umI73Uag12CdGATMDdrKwz+zQxsALlA==","permissions":"FULL"}]}'} + body: {string: '{"keys":[{"keyName":"key1","value":"OR+prta1aaKGZRHhg8YyrdKAgKgs2Nph57dO78Qs1lMWof4bnJoyXh6m6NN4D3Z93t8NlJjM7HM5wnU/woxOJA==","permissions":"FULL"},{"keyName":"key2","value":"wCuvmxZmKrxy4BAXAsvmP20XSN9gzJbQ+Apju3acibG8qHH05iSYKBdWgsuujA3A89huL5evdQ9NaPh+0icDgg==","permissions":"FULL"}]}'} headers: cache-control: [no-cache] content-length: ['288'] content-type: [application/json] - date: ['Fri, 09 Mar 2018 21:25:02 GMT'] + date: ['Tue, 01 May 2018 21:45:46 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -144,7 +117,7 @@ interactions: transfer-encoding: [chunked] vary: [Accept-Encoding] x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-writes: ['1198'] + x-ms-ratelimit-remaining-subscription-writes: ['1199'] status: {code: 200, message: OK} - request: body: null @@ -156,17 +129,17 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.29] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: POST uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002/listKeys?api-version=2017-10-01 response: - body: {string: '{"keys":[{"keyName":"key1","value":"wEpDeAcuqU8xPj0pKJGM1vQRqB/ldhPmOs/XzewVFIn3lFbKPofz7gNE4aILYdt29eEQ/1mk4TGOsNFpAX9oXQ==","permissions":"FULL"},{"keyName":"key2","value":"Iz3qoDlAi+yDuI7dfeirLiDpqmCfbz9WxvQRpNKFYtyvB7+1gr6sWh5umI73Uag12CdGATMDdrKwz+zQxsALlA==","permissions":"FULL"}]}'} + body: {string: '{"keys":[{"keyName":"key1","value":"OR+prta1aaKGZRHhg8YyrdKAgKgs2Nph57dO78Qs1lMWof4bnJoyXh6m6NN4D3Z93t8NlJjM7HM5wnU/woxOJA==","permissions":"FULL"},{"keyName":"key2","value":"wCuvmxZmKrxy4BAXAsvmP20XSN9gzJbQ+Apju3acibG8qHH05iSYKBdWgsuujA3A89huL5evdQ9NaPh+0icDgg==","permissions":"FULL"}]}'} headers: cache-control: [no-cache] content-length: ['288'] content-type: [application/json] - date: ['Fri, 09 Mar 2018 21:25:03 GMT'] + date: ['Tue, 01 May 2018 21:45:47 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -175,45 +148,47 @@ interactions: transfer-encoding: [chunked] vary: [Accept-Encoding] x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-writes: ['1197'] + x-ms-ratelimit-remaining-subscription-writes: ['1199'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.29] - x-ms-date: ['Fri, 09 Mar 2018 21:25:03 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:47 GMT'] + x-ms-version: ['2017-11-09'] method: PUT uri: https://clitest000002.blob.core.windows.net/cont000003?restype=container response: body: {string: ''} headers: - date: ['Fri, 09 Mar 2018 21:25:03 GMT'] - etag: ['"0x8D586043929E914"'] - last-modified: ['Fri, 09 Mar 2018 21:25:03 GMT'] + date: ['Tue, 01 May 2018 21:45:47 GMT'] + etag: ['"0x8D5AFACE694E4D5"'] + last-modified: ['Tue, 01 May 2018 21:45:48 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 201, message: Created} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.29] - x-ms-date: ['Fri, 09 Mar 2018 21:25:04 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:48 GMT'] + x-ms-version: ['2017-11-09'] method: HEAD uri: https://clitest000002.blob.core.windows.net/cont000003/blob000004 response: body: {string: ''} headers: - date: ['Fri, 09 Mar 2018 21:25:04 GMT'] + date: ['Tue, 01 May 2018 21:45:48 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-error-code: [BlobNotFound] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 404, message: The specified blob does not exist.} - request: body: null @@ -221,22 +196,23 @@ interactions: Connection: [keep-alive] Content-Length: ['0'] If-None-Match: ['*'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.29] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] x-ms-blob-type: [AppendBlob] - x-ms-date: ['Fri, 09 Mar 2018 21:25:04 GMT'] - x-ms-version: ['2017-07-29'] + x-ms-date: ['Tue, 01 May 2018 21:45:48 GMT'] + x-ms-version: ['2017-11-09'] method: PUT uri: https://clitest000002.blob.core.windows.net/cont000003/blob000004 response: body: {string: ''} headers: - date: ['Fri, 09 Mar 2018 21:25:04 GMT'] - etag: ['"0x8D58604397B2DAA"'] - last-modified: ['Fri, 09 Mar 2018 21:25:04 GMT'] + date: ['Tue, 01 May 2018 21:45:48 GMT'] + etag: ['"0x8D5AFACE6F34F3E"'] + last-modified: ['Tue, 01 May 2018 21:45:48 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-request-server-encrypted: ['true'] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 201, message: Created} - request: body: "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ @@ -269,56 +245,60 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['1024'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.29] - x-ms-date: ['Fri, 09 Mar 2018 21:25:04 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:48 GMT'] + x-ms-version: ['2017-11-09'] method: PUT uri: https://clitest000002.blob.core.windows.net/cont000003/blob000004?comp=appendblock response: body: {string: ''} headers: content-md5: [DzQ7CTESaiDxM9Z8KwGKOw==] - date: ['Fri, 09 Mar 2018 21:25:15 GMT'] - etag: ['"0x8D586043B54F45F"'] - last-modified: ['Fri, 09 Mar 2018 21:25:07 GMT'] + date: ['Tue, 01 May 2018 21:45:48 GMT'] + etag: ['"0x8D5AFACE70BE4D6"'] + last-modified: ['Tue, 01 May 2018 21:45:48 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-blob-append-offset: ['0'] x-ms-blob-committed-block-count: ['1'] x-ms-request-server-encrypted: ['true'] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 201, message: Created} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.29] - x-ms-date: ['Fri, 09 Mar 2018 21:25:15 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:49 GMT'] + x-ms-version: ['2017-11-09'] method: GET uri: https://clitest000002.blob.core.windows.net/cont000003?restype=container&comp=list response: body: {string: "\uFEFFblob000004Fri,\ - \ 09 Mar 2018 21:25:07 GMT0x8D586043B54F45F1024application/octet-streamblob000004Tue,\ + \ 01 May 2018 21:45:48 GMTTue, 01 May 2018\ + \ 21:45:48 GMT0x8D5AFACE70BE4D61024application/octet-streamAppendBlobunlockedavailabletrue"} headers: content-type: [application/xml] - date: ['Fri, 09 Mar 2018 21:25:15 GMT'] + date: ['Tue, 01 May 2018 21:45:49 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.29] - x-ms-date: ['Fri, 09 Mar 2018 21:25:16 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:49 GMT'] + x-ms-version: ['2017-11-09'] method: HEAD uri: https://clitest000002.blob.core.windows.net/cont000003/blob000004 response: @@ -327,35 +307,37 @@ interactions: accept-ranges: [bytes] content-length: ['1024'] content-type: [application/octet-stream] - date: ['Fri, 09 Mar 2018 21:25:15 GMT'] - etag: ['"0x8D586043B54F45F"'] - last-modified: ['Fri, 09 Mar 2018 21:25:07 GMT'] + date: ['Tue, 01 May 2018 21:45:48 GMT'] + etag: ['"0x8D5AFACE70BE4D6"'] + last-modified: ['Tue, 01 May 2018 21:45:48 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] x-ms-blob-committed-block-count: ['1'] x-ms-blob-type: [AppendBlob] + x-ms-creation-time: ['Tue, 01 May 2018 21:45:48 GMT'] x-ms-lease-state: [available] x-ms-lease-status: [unlocked] x-ms-server-encrypted: ['true'] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] If-None-Match: ['*'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.29] - x-ms-date: ['Fri, 09 Mar 2018 21:25:16 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:49 GMT'] + x-ms-version: ['2017-11-09'] method: HEAD uri: https://clitest000002.blob.core.windows.net/cont000003/blob000004 response: body: {string: ''} headers: - date: ['Fri, 09 Mar 2018 21:25:15 GMT'] + date: ['Tue, 01 May 2018 21:45:48 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-error-code: [UnsatisfiableCondition] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 400, message: The request includes an unsatisfiable condition for this operation.} - request: @@ -368,8 +350,8 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.29] + msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: DELETE uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2017-05-10 @@ -378,12 +360,12 @@ interactions: headers: cache-control: [no-cache] content-length: ['0'] - date: ['Fri, 09 Mar 2018 21:25:16 GMT'] + date: ['Tue, 01 May 2018 21:45:49 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTElURVNUOjJFUkdINExUUTdQSTRGVlVOT1RKQkxKSk41WVJNV1lOTUtQRUhIVHxBQkVDQjkwMkY4MDgxMjBFLVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTElURVNUOjJFUkdHNElBRE5USEpZS1BYUkdVRDVHWEpVNVJGUVpUSEI2VVZRRnxCREYyNzBFMURBMTdCQzU1LVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-writes: ['1198'] + x-ms-ratelimit-remaining-subscription-writes: ['1199'] status: {code: 202, message: Accepted} version: 1 diff --git a/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_blob_container_operations.yaml b/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_blob_container_operations.yaml index 8886f8ddd90..91d3a2cc339 100644 --- a/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_blob_container_operations.yaml +++ b/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_blob_container_operations.yaml @@ -1,30 +1,32 @@ interactions: - request: - body: '{"location": "westus", "tags": {"use": "az-test"}}' + body: '{"location": "westus", "tags": {"product": "azurecli", "cause": "automation", + "date": "2018-05-01T21:45:50Z"}}' headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] CommandName: [group create] Connection: [keep-alive] - Content-Length: ['50'] + Content-Length: ['110'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.27] + msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2017-05-10 response: - body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"westus","tags":{"use":"az-test"},"properties":{"provisioningState":"Succeeded"}}'} + body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"westus","tags":{"product":"azurecli","cause":"automation","date":"2018-05-01T21:45:50Z"},"properties":{"provisioningState":"Succeeded"}}'} headers: cache-control: [no-cache] - content-length: ['328'] + content-length: ['384'] content-type: [application/json; charset=utf-8] - date: ['Thu, 08 Feb 2018 19:27:55 GMT'] + date: ['Tue, 01 May 2018 21:45:51 GMT'] expires: ['-1'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1194'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1198'] status: {code: 201, message: Created} - request: body: '{"sku": {"name": "Standard_LRS"}, "kind": "Storage", "location": "westus", @@ -37,7 +39,7 @@ interactions: Content-Length: ['125'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002?api-version=2017-10-01 @@ -47,14 +49,15 @@ interactions: cache-control: [no-cache] content-length: ['0'] content-type: [text/plain; charset=utf-8] - date: ['Thu, 08 Feb 2018 19:27:56 GMT'] + date: ['Tue, 01 May 2018 21:45:51 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/105b3112-2a48-4f45-938b-c6f14b1f4f1b?monitor=true&api-version=2017-10-01'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/f01be2eb-5354-4e4e-bd41-56dbac4522b9?monitor=true&api-version=2017-10-01'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 Microsoft-HTTPAPI/2.0'] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1179'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1198'] status: {code: 202, message: Accepted} - request: body: null @@ -65,17 +68,17 @@ interactions: Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/105b3112-2a48-4f45-938b-c6f14b1f4f1b?monitor=true&api-version=2017-10-01 + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/f01be2eb-5354-4e4e-bd41-56dbac4522b9?monitor=true&api-version=2017-10-01 response: - body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T19:27:56.5462190Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T19:27:56.5462190Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T19:27:56.4993728Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} + body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:45:52.3404756Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:45:52.3404756Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:45:52.2623291Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} headers: cache-control: [no-cache] content-length: ['1231'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 19:28:13 GMT'] + date: ['Tue, 01 May 2018 21:46:09 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -83,6 +86,7 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] + x-content-type-options: [nosniff] status: {code: 200, message: OK} - request: body: null @@ -94,17 +98,17 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: POST uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002/listKeys?api-version=2017-10-01 response: - body: {string: '{"keys":[{"keyName":"key1","value":"/vl3rDqMusKbUOpktCjgYxJZcNezTrC0kMYWlIOzYpzaeg+/woRF1r/TKgKee5NiVEOG2a8KBMLWNHGAiDSzLA==","permissions":"FULL"},{"keyName":"key2","value":"B9VYtuhOeAwP4+fM6R77nXna5PeHhH8lIJrVUu0XlBc+hZGKxZYeiMwP1t1VSQ6JZ0WmjxQjVmBo3E8nB+HvAg==","permissions":"FULL"}]}'} + body: {string: '{"keys":[{"keyName":"key1","value":"tNwbYiizG3C+s/lu9T78/0AhW8nLLgRJG9m1Ap2TnU8J3JOvX41/i2onux/JvyydlmGocEzRz2/qZRrC1Qv+dA==","permissions":"FULL"},{"keyName":"key2","value":"+KZpz6le/ThUHtweZGUzIqkMrZ4uDjXi4lhL96dGjj2KSN5dJ9S29HGjxBLV3NvvdWVs9K2+zSzwoTZhV5seEQ==","permissions":"FULL"}]}'} headers: cache-control: [no-cache] content-length: ['288'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 19:28:15 GMT'] + date: ['Tue, 01 May 2018 21:46:10 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -112,7 +116,8 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] - x-ms-ratelimit-remaining-subscription-writes: ['1186'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1198'] status: {code: 200, message: OK} - request: body: null @@ -124,17 +129,17 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: POST uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002/listKeys?api-version=2017-10-01 response: - body: {string: '{"keys":[{"keyName":"key1","value":"/vl3rDqMusKbUOpktCjgYxJZcNezTrC0kMYWlIOzYpzaeg+/woRF1r/TKgKee5NiVEOG2a8KBMLWNHGAiDSzLA==","permissions":"FULL"},{"keyName":"key2","value":"B9VYtuhOeAwP4+fM6R77nXna5PeHhH8lIJrVUu0XlBc+hZGKxZYeiMwP1t1VSQ6JZ0WmjxQjVmBo3E8nB+HvAg==","permissions":"FULL"}]}'} + body: {string: '{"keys":[{"keyName":"key1","value":"tNwbYiizG3C+s/lu9T78/0AhW8nLLgRJG9m1Ap2TnU8J3JOvX41/i2onux/JvyydlmGocEzRz2/qZRrC1Qv+dA==","permissions":"FULL"},{"keyName":"key2","value":"+KZpz6le/ThUHtweZGUzIqkMrZ4uDjXi4lhL96dGjj2KSN5dJ9S29HGjxBLV3NvvdWVs9K2+zSzwoTZhV5seEQ==","permissions":"FULL"}]}'} headers: cache-control: [no-cache] content-length: ['288'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 19:28:16 GMT'] + date: ['Tue, 01 May 2018 21:46:10 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -142,56 +147,62 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] - x-ms-ratelimit-remaining-subscription-writes: ['1195'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1199'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:28:17 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:11 GMT'] + x-ms-version: ['2017-11-09'] method: PUT uri: https://clitest000002.blob.core.windows.net/cont000003?restype=container response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 19:28:17 GMT'] - etag: ['"0x8D56F2A1AFB6456"'] - last-modified: ['Thu, 08 Feb 2018 19:28:17 GMT'] + date: ['Tue, 01 May 2018 21:46:11 GMT'] + etag: ['"0x8D5AFACF4C9254E"'] + last-modified: ['Tue, 01 May 2018 21:46:11 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 201, message: Created} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:28:17 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:12 GMT'] + x-ms-version: ['2017-11-09'] method: GET uri: https://clitest000002.blob.core.windows.net/cont000003?restype=container response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 19:28:16 GMT'] - etag: ['"0x8D56F2A1AFB6456"'] - last-modified: ['Thu, 08 Feb 2018 19:28:17 GMT'] + date: ['Tue, 01 May 2018 21:46:11 GMT'] + etag: ['"0x8D5AFACF4C9254E"'] + last-modified: ['Tue, 01 May 2018 21:46:11 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] + x-ms-has-immutability-policy: ['false'] + x-ms-has-legal-hold: ['false'] x-ms-lease-state: [available] x-ms-lease-status: [unlocked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:28:17 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:12 GMT'] + x-ms-version: ['2017-11-09'] method: GET uri: https://clitest000002.blob.core.windows.net/cont000003?restype=container&comp=acl response: @@ -199,12 +210,12 @@ interactions: \ />"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 19:28:17 GMT'] - etag: ['"0x8D56F2A1AFB6456"'] - last-modified: ['Thu, 08 Feb 2018 19:28:17 GMT'] + date: ['Tue, 01 May 2018 21:46:12 GMT'] + etag: ['"0x8D5AFACF4C9254E"'] + last-modified: ['Tue, 01 May 2018 21:46:11 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: ' @@ -213,29 +224,31 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['60'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] x-ms-blob-public-access: [blob] - x-ms-date: ['Thu, 08 Feb 2018 19:28:17 GMT'] - x-ms-version: ['2017-07-29'] + x-ms-date: ['Tue, 01 May 2018 21:46:12 GMT'] + x-ms-version: ['2017-11-09'] method: PUT uri: https://clitest000002.blob.core.windows.net/cont000003?restype=container&comp=acl response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 19:28:17 GMT'] - etag: ['"0x8D56F2A1B7F5F8A"'] - last-modified: ['Thu, 08 Feb 2018 19:28:18 GMT'] + date: ['Tue, 01 May 2018 21:46:12 GMT'] + etag: ['"0x8D5AFACF54CCAB9"'] + last-modified: ['Tue, 01 May 2018 21:46:12 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:28:18 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:12 GMT'] + x-ms-version: ['2017-11-09'] method: GET uri: https://clitest000002.blob.core.windows.net/cont000003?restype=container&comp=acl response: @@ -243,21 +256,22 @@ interactions: \ />"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 19:28:17 GMT'] - etag: ['"0x8D56F2A1B7F5F8A"'] - last-modified: ['Thu, 08 Feb 2018 19:28:18 GMT'] + date: ['Tue, 01 May 2018 21:46:12 GMT'] + etag: ['"0x8D5AFACF54CCAB9"'] + last-modified: ['Tue, 01 May 2018 21:46:12 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-blob-public-access: [blob] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:28:18 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:13 GMT'] + x-ms-version: ['2017-11-09'] method: GET uri: https://clitest000002.blob.core.windows.net/cont000003?restype=container&comp=acl response: @@ -265,13 +279,13 @@ interactions: \ />"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 19:28:18 GMT'] - etag: ['"0x8D56F2A1B7F5F8A"'] - last-modified: ['Thu, 08 Feb 2018 19:28:18 GMT'] + date: ['Tue, 01 May 2018 21:46:13 GMT'] + etag: ['"0x8D5AFACF54CCAB9"'] + last-modified: ['Tue, 01 May 2018 21:46:12 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-blob-public-access: [blob] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: ' @@ -280,28 +294,30 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['60'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:28:18 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:13 GMT'] + x-ms-version: ['2017-11-09'] method: PUT uri: https://clitest000002.blob.core.windows.net/cont000003?restype=container&comp=acl response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 19:28:18 GMT'] - etag: ['"0x8D56F2A1BF24F99"'] - last-modified: ['Thu, 08 Feb 2018 19:28:19 GMT'] + date: ['Tue, 01 May 2018 21:46:13 GMT'] + etag: ['"0x8D5AFACF5CFD675"'] + last-modified: ['Tue, 01 May 2018 21:46:13 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:28:18 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:13 GMT'] + x-ms-version: ['2017-11-09'] method: GET uri: https://clitest000002.blob.core.windows.net/cont000003?restype=container&comp=acl response: @@ -309,136 +325,144 @@ interactions: \ />"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 19:28:18 GMT'] - etag: ['"0x8D56F2A1BF24F99"'] - last-modified: ['Thu, 08 Feb 2018 19:28:19 GMT'] + date: ['Tue, 01 May 2018 21:46:13 GMT'] + etag: ['"0x8D5AFACF5CFD675"'] + last-modified: ['Tue, 01 May 2018 21:46:13 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:28:19 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:14 GMT'] + x-ms-version: ['2017-11-09'] method: GET uri: https://clitest000002.blob.core.windows.net/cont000003?restype=container response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 19:28:18 GMT'] - etag: ['"0x8D56F2A1BF24F99"'] - last-modified: ['Thu, 08 Feb 2018 19:28:19 GMT'] + date: ['Tue, 01 May 2018 21:46:14 GMT'] + etag: ['"0x8D5AFACF5CFD675"'] + last-modified: ['Tue, 01 May 2018 21:46:13 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] + x-ms-has-immutability-policy: ['false'] + x-ms-has-legal-hold: ['false'] x-ms-lease-state: [available] x-ms-lease-status: [unlocked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:28:19 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:14 GMT'] + x-ms-version: ['2017-11-09'] method: GET uri: https://clitest000002.blob.core.windows.net/?comp=list response: body: {string: "\uFEFFcont000003Thu,\ - \ 08 Feb 2018 19:28:19 GMT\"0x8D56F2A1BF24F99\"unlockedavailablecont000003Tue,\ + \ 01 May 2018 21:46:13 GMT\"0x8D5AFACF5CFD675\"unlockedavailablefalsefalse"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 19:28:19 GMT'] + date: ['Tue, 01 May 2018 21:46:13 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:28:19 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:14 GMT'] x-ms-meta-foo: [bar] x-ms-meta-moo: [bak] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] method: PUT uri: https://clitest000002.blob.core.windows.net/cont000003?restype=container&comp=metadata response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 19:28:19 GMT'] - etag: ['"0x8D56F2A1C9B218F"'] - last-modified: ['Thu, 08 Feb 2018 19:28:20 GMT'] + date: ['Tue, 01 May 2018 21:46:14 GMT'] + etag: ['"0x8D5AFACF699E775"'] + last-modified: ['Tue, 01 May 2018 21:46:14 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:28:20 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:15 GMT'] + x-ms-version: ['2017-11-09'] method: GET uri: https://clitest000002.blob.core.windows.net/cont000003?restype=container&comp=metadata response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 19:28:19 GMT'] - etag: ['"0x8D56F2A1C9B218F"'] - last-modified: ['Thu, 08 Feb 2018 19:28:20 GMT'] + date: ['Tue, 01 May 2018 21:46:14 GMT'] + etag: ['"0x8D5AFACF699E775"'] + last-modified: ['Tue, 01 May 2018 21:46:14 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-meta-foo: [bar] x-ms-meta-moo: [bak] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:28:20 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:15 GMT'] + x-ms-version: ['2017-11-09'] method: PUT uri: https://clitest000002.blob.core.windows.net/cont000003?restype=container&comp=metadata response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 19:28:20 GMT'] - etag: ['"0x8D56F2A1CF88C0E"'] - last-modified: ['Thu, 08 Feb 2018 19:28:20 GMT'] + date: ['Tue, 01 May 2018 21:46:14 GMT'] + etag: ['"0x8D5AFACF7003C44"'] + last-modified: ['Tue, 01 May 2018 21:46:15 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:28:20 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:15 GMT'] + x-ms-version: ['2017-11-09'] method: GET uri: https://clitest000002.blob.core.windows.net/cont000003?restype=container&comp=metadata response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 19:28:20 GMT'] - etag: ['"0x8D56F2A1CF88C0E"'] - last-modified: ['Thu, 08 Feb 2018 19:28:20 GMT'] + date: ['Tue, 01 May 2018 21:46:15 GMT'] + etag: ['"0x8D5AFACF7003C44"'] + last-modified: ['Tue, 01 May 2018 21:46:15 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null @@ -446,241 +470,260 @@ interactions: Connection: [keep-alive] Content-Length: ['0'] If-Modified-Since: ['Fri, 01 Apr 2016 12:00:00 GMT'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:28:20 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:16 GMT'] x-ms-lease-action: [acquire] x-ms-lease-duration: ['60'] x-ms-proposed-lease-id: [abcdabcd-abcd-abcd-abcd-abcdabcdabcd] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] method: PUT uri: https://clitest000002.blob.core.windows.net/cont000003?restype=container&comp=lease response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 19:28:21 GMT'] - etag: ['"0x8D56F2A1CF88C0E"'] - last-modified: ['Thu, 08 Feb 2018 19:28:20 GMT'] + date: ['Tue, 01 May 2018 21:46:16 GMT'] + etag: ['"0x8D5AFACF7003C44"'] + last-modified: ['Tue, 01 May 2018 21:46:15 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-lease-id: [abcdabcd-abcd-abcd-abcd-abcdabcdabcd] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 201, message: Created} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:28:21 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:16 GMT'] + x-ms-version: ['2017-11-09'] method: GET uri: https://clitest000002.blob.core.windows.net/cont000003?restype=container response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 19:28:20 GMT'] - etag: ['"0x8D56F2A1CF88C0E"'] - last-modified: ['Thu, 08 Feb 2018 19:28:20 GMT'] + date: ['Tue, 01 May 2018 21:46:16 GMT'] + etag: ['"0x8D5AFACF7003C44"'] + last-modified: ['Tue, 01 May 2018 21:46:15 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] + x-ms-has-immutability-policy: ['false'] + x-ms-has-legal-hold: ['false'] x-ms-lease-duration: [fixed] x-ms-lease-state: [leased] x-ms-lease-status: [locked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:28:21 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:16 GMT'] x-ms-lease-action: [change] x-ms-lease-id: [abcdabcd-abcd-abcd-abcd-abcdabcdabcd] x-ms-proposed-lease-id: [dcbadcba-dcba-dcba-dcba-dcbadcbadcba] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] method: PUT uri: https://clitest000002.blob.core.windows.net/cont000003?restype=container&comp=lease response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 19:28:21 GMT'] - etag: ['"0x8D56F2A1CF88C0E"'] - last-modified: ['Thu, 08 Feb 2018 19:28:20 GMT'] + date: ['Tue, 01 May 2018 21:46:17 GMT'] + etag: ['"0x8D5AFACF7003C44"'] + last-modified: ['Tue, 01 May 2018 21:46:15 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-lease-id: [dcbadcba-dcba-dcba-dcba-dcbadcbadcba] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:28:21 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:17 GMT'] x-ms-lease-action: [renew] x-ms-lease-id: [dcbadcba-dcba-dcba-dcba-dcbadcbadcba] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] method: PUT uri: https://clitest000002.blob.core.windows.net/cont000003?restype=container&comp=lease response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 19:28:21 GMT'] - etag: ['"0x8D56F2A1CF88C0E"'] - last-modified: ['Thu, 08 Feb 2018 19:28:20 GMT'] + date: ['Tue, 01 May 2018 21:46:16 GMT'] + etag: ['"0x8D5AFACF7003C44"'] + last-modified: ['Tue, 01 May 2018 21:46:15 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-lease-id: [dcbadcba-dcba-dcba-dcba-dcbadcbadcba] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:28:22 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:17 GMT'] + x-ms-version: ['2017-11-09'] method: GET uri: https://clitest000002.blob.core.windows.net/cont000003?restype=container response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 19:28:21 GMT'] - etag: ['"0x8D56F2A1CF88C0E"'] - last-modified: ['Thu, 08 Feb 2018 19:28:20 GMT'] + date: ['Tue, 01 May 2018 21:46:16 GMT'] + etag: ['"0x8D5AFACF7003C44"'] + last-modified: ['Tue, 01 May 2018 21:46:15 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] + x-ms-has-immutability-policy: ['false'] + x-ms-has-legal-hold: ['false'] x-ms-lease-duration: [fixed] x-ms-lease-state: [leased] x-ms-lease-status: [locked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:28:22 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:17 GMT'] x-ms-lease-action: [break] x-ms-lease-break-period: ['30'] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] method: PUT uri: https://clitest000002.blob.core.windows.net/cont000003?restype=container&comp=lease response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 19:28:21 GMT'] - etag: ['"0x8D56F2A1CF88C0E"'] - last-modified: ['Thu, 08 Feb 2018 19:28:20 GMT'] + date: ['Tue, 01 May 2018 21:46:17 GMT'] + etag: ['"0x8D5AFACF7003C44"'] + last-modified: ['Tue, 01 May 2018 21:46:15 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-lease-time: ['30'] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 202, message: Accepted} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:28:22 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:18 GMT'] + x-ms-version: ['2017-11-09'] method: GET uri: https://clitest000002.blob.core.windows.net/cont000003?restype=container response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 19:28:22 GMT'] - etag: ['"0x8D56F2A1CF88C0E"'] - last-modified: ['Thu, 08 Feb 2018 19:28:20 GMT'] + date: ['Tue, 01 May 2018 21:46:17 GMT'] + etag: ['"0x8D5AFACF7003C44"'] + last-modified: ['Tue, 01 May 2018 21:46:15 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] + x-ms-has-immutability-policy: ['false'] + x-ms-has-legal-hold: ['false'] x-ms-lease-state: [breaking] x-ms-lease-status: [locked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:28:22 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:18 GMT'] x-ms-lease-action: [release] x-ms-lease-id: [dcbadcba-dcba-dcba-dcba-dcbadcbadcba] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] method: PUT uri: https://clitest000002.blob.core.windows.net/cont000003?restype=container&comp=lease response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 19:28:22 GMT'] - etag: ['"0x8D56F2A1CF88C0E"'] - last-modified: ['Thu, 08 Feb 2018 19:28:20 GMT'] + date: ['Tue, 01 May 2018 21:46:18 GMT'] + etag: ['"0x8D5AFACF7003C44"'] + last-modified: ['Tue, 01 May 2018 21:46:15 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:28:23 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:18 GMT'] + x-ms-version: ['2017-11-09'] method: GET uri: https://clitest000002.blob.core.windows.net/cont000003?restype=container response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 19:28:23 GMT'] - etag: ['"0x8D56F2A1CF88C0E"'] - last-modified: ['Thu, 08 Feb 2018 19:28:20 GMT'] + date: ['Tue, 01 May 2018 21:46:18 GMT'] + etag: ['"0x8D5AFACF7003C44"'] + last-modified: ['Tue, 01 May 2018 21:46:15 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] + x-ms-has-immutability-policy: ['false'] + x-ms-has-legal-hold: ['false'] x-ms-lease-state: [available] x-ms-lease-status: [unlocked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:28:23 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:19 GMT'] + x-ms-version: ['2017-11-09'] method: DELETE uri: https://clitest000002.blob.core.windows.net/cont000003?restype=container response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 19:28:23 GMT'] + date: ['Tue, 01 May 2018 21:46:18 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 202, message: Accepted} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:28:23 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:19 GMT'] + x-ms-version: ['2017-11-09'] method: GET uri: https://clitest000002.blob.core.windows.net/cont000003?restype=container response: body: {string: "\uFEFFContainerNotFoundThe\ - \ specified container does not exist.\nRequestId:f7082c34-001e-011b-4612-a1c00c000000\n\ - Time:2018-02-08T19:28:24.2397015Z"} + \ specified container does not exist.\nRequestId:5c2b7908-701e-00c3-3695-e16d4b000000\n\ + Time:2018-05-01T21:46:19.8336002Z"} headers: content-length: ['225'] content-type: [application/xml] - date: ['Thu, 08 Feb 2018 19:28:23 GMT'] + date: ['Tue, 01 May 2018 21:46:19 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] x-ms-error-code: [ContainerNotFound] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 404, message: The specified container does not exist.} - request: body: null @@ -692,8 +735,8 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.27] + msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: DELETE uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2017-05-10 @@ -702,11 +745,12 @@ interactions: headers: cache-control: [no-cache] content-length: ['0'] - date: ['Thu, 08 Feb 2018 19:28:25 GMT'] + date: ['Tue, 01 May 2018 21:46:19 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTElURVNUOjJFUkdRT0pVVjNCWEFQQ1hCVFUyUTM1NklFNkpQUjZNRTY0UzVYMnwzOUJBNTVEQjAzREYxNEI4LVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTElURVNUOjJFUkdDT0JHNDZEQ1lUQUNPN0xIUjVNU05INUJZVDVIVVo0TVlFTXw3RjQwRkM0MjMzMkFEMTZFLVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1194'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1197'] status: {code: 202, message: Accepted} version: 1 diff --git a/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_blob_incremental_copy.yaml b/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_blob_incremental_copy.yaml index 1f37f37ef73..4faece18660 100644 --- a/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_blob_incremental_copy.yaml +++ b/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_blob_incremental_copy.yaml @@ -1,34 +1,36 @@ interactions: - request: - body: !!python/unicode '{"location": "westus", "tags": {"use": "az-test"}}' + body: '{"location": "westus", "tags": {"product": "azurecli", "cause": "automation", + "date": "2018-05-01T21:46:20Z"}}' headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] CommandName: [group create] Connection: [keep-alive] - Content-Length: ['50'] + Content-Length: ['110'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/2.7.13 (Windows-10-10.0.16299) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.27] + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2017-05-10 response: - body: {string: !!python/unicode '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"westus","tags":{"use":"az-test"},"properties":{"provisioningState":"Succeeded"}}'} + body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"westus","tags":{"product":"azurecli","cause":"automation","date":"2018-05-01T21:46:20Z"},"properties":{"provisioningState":"Succeeded"}}'} headers: cache-control: [no-cache] - content-length: ['328'] + content-length: ['384'] content-type: [application/json; charset=utf-8] - date: ['Thu, 08 Feb 2018 23:20:42 GMT'] + date: ['Tue, 01 May 2018 21:46:21 GMT'] expires: ['-1'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1199'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1197'] status: {code: 201, message: Created} - request: - body: !!python/unicode '{"sku": {"name": "Standard_LRS"}, "kind": "Storage", "location": - "westus", "properties": {"supportsHttpsTrafficOnly": false}}' + body: '{"sku": {"name": "Standard_LRS"}, "kind": "Storage", "location": "westus", + "properties": {"supportsHttpsTrafficOnly": false}}' headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] @@ -36,25 +38,26 @@ interactions: Connection: [keep-alive] Content-Length: ['125'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/2.7.13 (Windows-10-10.0.16299) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002?api-version=2017-10-01 response: - body: {string: !!python/unicode ''} + body: {string: ''} headers: cache-control: [no-cache] content-length: ['0'] content-type: [text/plain; charset=utf-8] - date: ['Thu, 08 Feb 2018 23:20:44 GMT'] + date: ['Tue, 01 May 2018 21:46:22 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/9fbedf8b-29f6-45f5-aef6-fd2df092382a?monitor=true&api-version=2017-10-01'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/1ab09e5f-ddf3-44c9-9b6f-842c67fc1756?monitor=true&api-version=2017-10-01'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 Microsoft-HTTPAPI/2.0'] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1198'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1199'] status: {code: 202, message: Accepted} - request: body: null @@ -64,18 +67,18 @@ interactions: CommandName: [storage account create] Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/2.7.13 (Windows-10-10.0.16299) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/9fbedf8b-29f6-45f5-aef6-fd2df092382a?monitor=true&api-version=2017-10-01 + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/1ab09e5f-ddf3-44c9-9b6f-842c67fc1756?monitor=true&api-version=2017-10-01 response: - body: {string: !!python/unicode '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T23:20:44.9190016Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T23:20:44.9190016Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T23:20:44.8720832Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} + body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:46:22.6503039Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:46:22.6503039Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:46:22.4628157Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} headers: cache-control: [no-cache] content-length: ['1231'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 23:21:01 GMT'] + date: ['Tue, 01 May 2018 21:46:39 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -83,6 +86,7 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] + x-content-type-options: [nosniff] status: {code: 200, message: OK} - request: body: null @@ -93,18 +97,18 @@ interactions: Connection: [keep-alive] Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/2.7.13 (Windows-10-10.0.16299) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: POST uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002/listKeys?api-version=2017-10-01 response: - body: {string: !!python/unicode '{"keys":[{"keyName":"key1","value":"JuXvx0QEEaaBll22+oe0inVihHiW5hncEvtYdETzq+XQIvNyA9yuLhqoYtj0GgjZJqJ4v0Pax16sOIVXbKPXvQ==","permissions":"FULL"},{"keyName":"key2","value":"tYL4AWvj2wAG/i2Sc7LneS6hFZWjLEmGmpNmGQxpZWPimfcZIfuQ8IGQWPypD2BKgvPSo2ULfondTELG5szyHA==","permissions":"FULL"}]}'} + body: {string: '{"keys":[{"keyName":"key1","value":"4viMrgv1Qrz77ezf904epZDNY0SXTiA6kuEuLgw2mfKQAVOdKOHmlU1nojXikOSQJkbv+2Z73pl8jfWbSM34LQ==","permissions":"FULL"},{"keyName":"key2","value":"9Y/3gRD3svsE1vv11BCQn1r9qClTTlRssFs9mPn5uh66+GapGDt4SI8ve4uJLBOpAAHTwalDlVXDAUwEUePn0w==","permissions":"FULL"}]}'} headers: cache-control: [no-cache] content-length: ['288'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 23:21:03 GMT'] + date: ['Tue, 01 May 2018 21:46:40 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -112,11 +116,12 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] - x-ms-ratelimit-remaining-subscription-writes: ['1196'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1198'] status: {code: 200, message: OK} - request: - body: !!python/unicode '{"sku": {"name": "Standard_LRS"}, "kind": "Storage", "location": - "westus", "properties": {"supportsHttpsTrafficOnly": false}}' + body: '{"sku": {"name": "Standard_LRS"}, "kind": "Storage", "location": "westus", + "properties": {"supportsHttpsTrafficOnly": false}}' headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] @@ -124,25 +129,26 @@ interactions: Connection: [keep-alive] Content-Length: ['125'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/2.7.13 (Windows-10-10.0.16299) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000003?api-version=2017-10-01 response: - body: {string: !!python/unicode ''} + body: {string: ''} headers: cache-control: [no-cache] content-length: ['0'] content-type: [text/plain; charset=utf-8] - date: ['Thu, 08 Feb 2018 23:21:05 GMT'] + date: ['Tue, 01 May 2018 21:46:41 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/7d756e20-2d7a-40aa-9a1f-b2d84de0965f?monitor=true&api-version=2017-10-01'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/b7710f49-b5f3-42a1-8f48-fd96d080b961?monitor=true&api-version=2017-10-01'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 Microsoft-HTTPAPI/2.0'] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1194'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1199'] status: {code: 202, message: Accepted} - request: body: null @@ -152,18 +158,18 @@ interactions: CommandName: [storage account create] Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/2.7.13 (Windows-10-10.0.16299) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/7d756e20-2d7a-40aa-9a1f-b2d84de0965f?monitor=true&api-version=2017-10-01 + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/b7710f49-b5f3-42a1-8f48-fd96d080b961?monitor=true&api-version=2017-10-01 response: - body: {string: !!python/unicode '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000003","name":"clitest000003","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T23:21:05.7095326Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T23:21:05.7095326Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T23:21:05.6620484Z","primaryEndpoints":{"blob":"https://clitest000003.blob.core.windows.net/","queue":"https://clitest000003.queue.core.windows.net/","table":"https://clitest000003.table.core.windows.net/","file":"https://clitest000003.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} + body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000003","name":"clitest000003","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:46:42.0562503Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:46:42.0562503Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:46:41.9624816Z","primaryEndpoints":{"blob":"https://clitest000003.blob.core.windows.net/","queue":"https://clitest000003.queue.core.windows.net/","table":"https://clitest000003.table.core.windows.net/","file":"https://clitest000003.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} headers: cache-control: [no-cache] content-length: ['1231'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 23:21:22 GMT'] + date: ['Tue, 01 May 2018 21:46:58 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -171,6 +177,7 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] + x-content-type-options: [nosniff] status: {code: 200, message: OK} - request: body: null @@ -181,18 +188,18 @@ interactions: Connection: [keep-alive] Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/2.7.13 (Windows-10-10.0.16299) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: POST uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000003/listKeys?api-version=2017-10-01 response: - body: {string: !!python/unicode '{"keys":[{"keyName":"key1","value":"zF1d4ftumF5bxsApZkg41yOnKKINCivrVPP7564IMIOSfQ1AIq+kuJVJqjA+EoFxfLKVP7u2IyVXhAB/VkUqsw==","permissions":"FULL"},{"keyName":"key2","value":"ZeabPhhyrA41/DYbjhPL1obhmamA/Xkx0grOUAKsKaW+HZPcHRVh718BqCll/zFdBnOjlp59QvjH0wluSuEQ5w==","permissions":"FULL"}]}'} + body: {string: '{"keys":[{"keyName":"key1","value":"2aAhDTJ1gvnWrc+/l98kMjVrqMzS63NanaEKhNM92GF2cJfiueqeqcHP++4anKSbi8WzGBxBGSB1aP0QYQomJw==","permissions":"FULL"},{"keyName":"key2","value":"v4HFCbhURQvoL+VoZ7UknxYh0wczm1PBPhJgoN73rHjdbyVKpAAVKW5BoqUvdyTMFi9w6YjA5sI/GisdCml5nQ==","permissions":"FULL"}]}'} headers: cache-control: [no-cache] content-length: ['288'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 23:21:24 GMT'] + date: ['Tue, 01 May 2018 21:47:00 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -200,7 +207,8 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] - x-ms-ratelimit-remaining-subscription-writes: ['1199'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1197'] status: {code: 200, message: OK} - request: body: null @@ -211,18 +219,18 @@ interactions: Connection: [keep-alive] Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/2.7.13 (Windows-10-10.0.16299) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: POST uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002/listKeys?api-version=2017-10-01 response: - body: {string: !!python/unicode '{"keys":[{"keyName":"key1","value":"JuXvx0QEEaaBll22+oe0inVihHiW5hncEvtYdETzq+XQIvNyA9yuLhqoYtj0GgjZJqJ4v0Pax16sOIVXbKPXvQ==","permissions":"FULL"},{"keyName":"key2","value":"tYL4AWvj2wAG/i2Sc7LneS6hFZWjLEmGmpNmGQxpZWPimfcZIfuQ8IGQWPypD2BKgvPSo2ULfondTELG5szyHA==","permissions":"FULL"}]}'} + body: {string: '{"keys":[{"keyName":"key1","value":"4viMrgv1Qrz77ezf904epZDNY0SXTiA6kuEuLgw2mfKQAVOdKOHmlU1nojXikOSQJkbv+2Z73pl8jfWbSM34LQ==","permissions":"FULL"},{"keyName":"key2","value":"9Y/3gRD3svsE1vv11BCQn1r9qClTTlRssFs9mPn5uh66+GapGDt4SI8ve4uJLBOpAAHTwalDlVXDAUwEUePn0w==","permissions":"FULL"}]}'} headers: cache-control: [no-cache] content-length: ['288'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 23:21:25 GMT'] + date: ['Tue, 01 May 2018 21:47:00 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -230,527 +238,75 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] - x-ms-ratelimit-remaining-subscription-writes: ['1199'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1198'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 2.7.13; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 23:21:26 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:47:01 GMT'] + x-ms-version: ['2017-11-09'] method: PUT uri: https://clitest000002.blob.core.windows.net/cont000004?restype=container response: - body: {string: !!python/unicode ''} + body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 23:21:26 GMT'] - etag: ['"0x8D56F4AAD24AC5A"'] - last-modified: ['Thu, 08 Feb 2018 23:21:26 GMT'] + date: ['Tue, 01 May 2018 21:47:01 GMT'] + etag: ['"0x8D5AFAD12831841"'] + last-modified: ['Tue, 01 May 2018 21:47:01 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 201, message: Created} - request: body: null headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 2.7.13; Windows 10) AZURECLI/2.0.27] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] x-ms-blob-content-length: ['16384'] x-ms-blob-type: [PageBlob] - x-ms-date: ['Thu, 08 Feb 2018 23:21:26 GMT'] - x-ms-version: ['2017-07-29'] + x-ms-date: ['Tue, 01 May 2018 21:47:01 GMT'] + x-ms-version: ['2017-11-09'] method: PUT uri: https://clitest000002.blob.core.windows.net/cont000004/src response: - body: {string: !!python/unicode ''} - headers: - date: ['Thu, 08 Feb 2018 23:21:26 GMT'] - etag: ['"0x8D56F4AAD693EED"'] - last-modified: ['Thu, 08 Feb 2018 23:21:27 GMT'] - server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] - transfer-encoding: [chunked] - x-ms-request-server-encrypted: ['true'] - x-ms-version: ['2017-07-29'] - status: {code: 201, message: Created} -- request: - body: !!python/unicode "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ - \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - headers: - Connection: [keep-alive] - Content-Length: ['16384'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 2.7.13; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 23:21:26 GMT'] - x-ms-page-write: [update] - x-ms-range: [bytes=0-16383] - x-ms-version: ['2017-07-29'] - method: PUT - uri: https://clitest000002.blob.core.windows.net/cont000004/src?comp=page - response: - body: {string: !!python/unicode ''} + body: {string: ''} headers: - content-md5: [zjOP5omXeKrPwoQU8tlJiw==] - date: ['Thu, 08 Feb 2018 23:21:26 GMT'] - etag: ['"0x8D56F4AAD7B6BB5"'] - last-modified: ['Thu, 08 Feb 2018 23:21:27 GMT'] + date: ['Tue, 01 May 2018 21:47:01 GMT'] + etag: ['"0x8D5AFAD12BB46FA"'] + last-modified: ['Tue, 01 May 2018 21:47:02 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-blob-sequence-number: ['0'] x-ms-request-server-encrypted: ['true'] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 201, message: Created} - request: body: null headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 2.7.13; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 23:21:27 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:47:02 GMT'] + x-ms-version: ['2017-11-09'] method: PUT uri: https://clitest000002.blob.core.windows.net/cont000004/src?comp=snapshot response: - body: {string: !!python/unicode ''} + body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 23:21:27 GMT'] - etag: ['"0x8D56F4AAD7B6BB5"'] - last-modified: ['Thu, 08 Feb 2018 23:21:27 GMT'] + date: ['Tue, 01 May 2018 21:47:01 GMT'] + etag: ['"0x8D5AFAD12BB46FA"'] + last-modified: ['Tue, 01 May 2018 21:47:02 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-snapshot: ['2018-02-08T23:21:27.5176463Z'] - x-ms-version: ['2017-07-29'] + x-ms-snapshot: ['2018-05-01T21:47:02.6524496Z'] + x-ms-version: ['2017-11-09'] status: {code: 201, message: Created} - request: body: null @@ -761,18 +317,18 @@ interactions: Connection: [keep-alive] Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/2.7.13 (Windows-10-10.0.16299) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: POST uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000003/listKeys?api-version=2017-10-01 response: - body: {string: !!python/unicode '{"keys":[{"keyName":"key1","value":"zF1d4ftumF5bxsApZkg41yOnKKINCivrVPP7564IMIOSfQ1AIq+kuJVJqjA+EoFxfLKVP7u2IyVXhAB/VkUqsw==","permissions":"FULL"},{"keyName":"key2","value":"ZeabPhhyrA41/DYbjhPL1obhmamA/Xkx0grOUAKsKaW+HZPcHRVh718BqCll/zFdBnOjlp59QvjH0wluSuEQ5w==","permissions":"FULL"}]}'} + body: {string: '{"keys":[{"keyName":"key1","value":"2aAhDTJ1gvnWrc+/l98kMjVrqMzS63NanaEKhNM92GF2cJfiueqeqcHP++4anKSbi8WzGBxBGSB1aP0QYQomJw==","permissions":"FULL"},{"keyName":"key2","value":"v4HFCbhURQvoL+VoZ7UknxYh0wczm1PBPhJgoN73rHjdbyVKpAAVKW5BoqUvdyTMFi9w6YjA5sI/GisdCml5nQ==","permissions":"FULL"}]}'} headers: cache-control: [no-cache] content-length: ['288'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 23:21:28 GMT'] + date: ['Tue, 01 May 2018 21:47:02 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -780,6 +336,7 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] + x-content-type-options: [nosniff] x-ms-ratelimit-remaining-subscription-writes: ['1199'] status: {code: 200, message: OK} - request: @@ -787,43 +344,45 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 2.7.13; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 23:21:28 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:47:03 GMT'] + x-ms-version: ['2017-11-09'] method: PUT uri: https://clitest000003.blob.core.windows.net/cont000005?restype=container response: - body: {string: !!python/unicode ''} + body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 23:21:28 GMT'] - etag: ['"0x8D56F4AAE5990C9"'] - last-modified: ['Thu, 08 Feb 2018 23:21:28 GMT'] + date: ['Tue, 01 May 2018 21:47:03 GMT'] + etag: ['"0x8D5AFAD138AB323"'] + last-modified: ['Tue, 01 May 2018 21:47:03 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 201, message: Created} - request: body: null headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 2.7.13; Windows 10) AZURECLI/2.0.27] - x-ms-copy-source: ['https://clitestbi3jx6nbygi3a5yo6.blob.core.windows.net/contmdanozytk5cue3v4ki2d/src?sr=b&spr=https&sp=r&sv=2017-07-29&sig=R38Ehi6HoCDJbkYZyOP8kUL%2Byu6yLOfOg2VJuX1uzXU%3D&se=2018-02-09T23%3A21%3A28Z&snapshot=2018-02-08T23:21:27.5176463Z'] - x-ms-date: ['Thu, 08 Feb 2018 23:21:28 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-copy-source: ['https://clitest46yy2wcv7vboqpqlb.blob.core.windows.net/contbjs5ux3u5fa3ujgxxo2r/src?se=2018-05-02T21%3A47%3A03Z&sp=r&spr=https&sv=2017-11-09&sr=b&sig=Cy7kL6IT6mmC%2BAJ50bScE31rlwSJZMAtiXqJ4kGtNc8%3D&snapshot=2018-05-01T21:47:02.6524496Z'] + x-ms-date: ['Tue, 01 May 2018 21:47:03 GMT'] + x-ms-version: ['2017-11-09'] method: PUT uri: https://clitest000003.blob.core.windows.net/cont000005/backup?comp=incrementalcopy response: - body: {string: !!python/unicode ''} + body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 23:21:28 GMT'] - etag: ['"0x8D56F4AAEB098D4"'] - last-modified: ['Thu, 08 Feb 2018 23:21:29 GMT'] + date: ['Tue, 01 May 2018 21:47:03 GMT'] + etag: ['"0x8D5AFAD13D4F78D"'] + last-modified: ['Tue, 01 May 2018 21:47:03 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-copy-id: [4aa9c065-ecb3-4532-9ba1-bb5ec37c6251] + x-ms-copy-id: [35ffe903-d79d-4f2e-a89a-4ad5bc2a5f8b] x-ms-copy-status: [pending] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 202, message: Accepted} - request: body: null @@ -834,22 +393,23 @@ interactions: Connection: [keep-alive] Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/2.7.13 (Windows-10-10.0.16299) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.27] + User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: DELETE uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2017-05-10 response: - body: {string: !!python/unicode ''} + body: {string: ''} headers: cache-control: [no-cache] content-length: ['0'] - date: ['Thu, 08 Feb 2018 23:21:30 GMT'] + date: ['Tue, 01 May 2018 21:47:03 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTElURVNUOjJFUkc2NFg1QUNMNTRVSkVCSUpUNFdVQllWRkEyQ0hHNE5CWk9FQXwxNDFBNzBEMTYyRTEwNEIzLVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTElURVNUOjJFUkdJSkVXTjM1RkhEVVBJTlNFWjRERTI3RVU3M1M3TzNKQ0JINHxGQ0E0MkJBN0IyNDY5OTk5LVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1199'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1198'] status: {code: 202, message: Accepted} version: 1 diff --git a/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_blob_lease_operations.yaml b/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_blob_lease_operations.yaml index dd175cb4827..d0626fb797c 100644 --- a/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_blob_lease_operations.yaml +++ b/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_blob_lease_operations.yaml @@ -1,30 +1,32 @@ interactions: - request: - body: '{"location": "westus", "tags": {"use": "az-test"}}' + body: '{"location": "westus", "tags": {"product": "azurecli", "cause": "automation", + "date": "2018-05-01T21:47:04Z"}}' headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] CommandName: [group create] Connection: [keep-alive] - Content-Length: ['50'] + Content-Length: ['110'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.27] + msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2017-05-10 response: - body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"westus","tags":{"use":"az-test"},"properties":{"provisioningState":"Succeeded"}}'} + body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"westus","tags":{"product":"azurecli","cause":"automation","date":"2018-05-01T21:47:04Z"},"properties":{"provisioningState":"Succeeded"}}'} headers: cache-control: [no-cache] - content-length: ['328'] + content-length: ['384'] content-type: [application/json; charset=utf-8] - date: ['Thu, 08 Feb 2018 19:39:29 GMT'] + date: ['Tue, 01 May 2018 21:47:04 GMT'] expires: ['-1'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1194'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1198'] status: {code: 201, message: Created} - request: body: '{"sku": {"name": "Standard_LRS"}, "kind": "Storage", "location": "westus", @@ -37,7 +39,7 @@ interactions: Content-Length: ['125'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002?api-version=2017-10-01 @@ -47,14 +49,15 @@ interactions: cache-control: [no-cache] content-length: ['0'] content-type: [text/plain; charset=utf-8] - date: ['Thu, 08 Feb 2018 19:39:31 GMT'] + date: ['Tue, 01 May 2018 21:47:06 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/043b4021-7381-4720-a9a7-9e8e1421ea16?monitor=true&api-version=2017-10-01'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/cbfde942-a7fb-421f-983d-6a16db124841?monitor=true&api-version=2017-10-01'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 Microsoft-HTTPAPI/2.0'] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1179'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1197'] status: {code: 202, message: Accepted} - request: body: null @@ -65,44 +68,17 @@ interactions: Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/043b4021-7381-4720-a9a7-9e8e1421ea16?monitor=true&api-version=2017-10-01 + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/cbfde942-a7fb-421f-983d-6a16db124841?monitor=true&api-version=2017-10-01 response: - body: {string: ''} - headers: - cache-control: [no-cache] - content-length: ['0'] - content-type: [text/plain; charset=utf-8] - date: ['Thu, 08 Feb 2018 19:39:48 GMT'] - expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/043b4021-7381-4720-a9a7-9e8e1421ea16?monitor=true&api-version=2017-10-01'] - pragma: [no-cache] - server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 - Microsoft-HTTPAPI/2.0'] - strict-transport-security: [max-age=31536000; includeSubDomains] - status: {code: 202, message: Accepted} -- request: - body: null - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [storage account create] - Connection: [keep-alive] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] - accept-language: [en-US] - method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/043b4021-7381-4720-a9a7-9e8e1421ea16?monitor=true&api-version=2017-10-01 - response: - body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T19:39:31.0044104Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T19:39:31.0044104Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T19:39:30.9106510Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} + body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:47:06.3725603Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:47:06.3725603Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:47:06.2788294Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} headers: cache-control: [no-cache] content-length: ['1231'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 19:40:05 GMT'] + date: ['Tue, 01 May 2018 21:47:23 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -110,6 +86,7 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] + x-content-type-options: [nosniff] status: {code: 200, message: OK} - request: body: null @@ -121,17 +98,17 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: POST uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002/listKeys?api-version=2017-10-01 response: - body: {string: '{"keys":[{"keyName":"key1","value":"niTXyxI/+JfgaExQkTsfhNwkdH/4rQn/cPjT81lQt4elnnZPpm630VkZATpCDGkdyewzPJZ3G0MwMg+n2ClhZw==","permissions":"FULL"},{"keyName":"key2","value":"qx7dotSrrBPrSWBPXwNt7hcXRb+ewbeOIJoeTuWyfrYu3nYKAWHsoOElMkL0R/hvX8g1OnoknS3WW+DdnXZP0g==","permissions":"FULL"}]}'} + body: {string: '{"keys":[{"keyName":"key1","value":"a2oR83Z/uzGUCw1MP02lNmSbg9cX8GsgbMxkK3wZhuOrAeAQ8x/tgv7OBBV0Q0OrN5pOH45NG9MWk80NWijE0Q==","permissions":"FULL"},{"keyName":"key2","value":"cuZ45EUzKnpz59rlFdZD8hnSNfWwGASMcR+O8wdCSz/PHQPUXaMQIQ22jN6v/9CJuJRuVwgaaB/urSq9V8LMNw==","permissions":"FULL"}]}'} headers: cache-control: [no-cache] content-length: ['288'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 19:40:05 GMT'] + date: ['Tue, 01 May 2018 21:47:24 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -139,7 +116,8 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] - x-ms-ratelimit-remaining-subscription-writes: ['1195'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1197'] status: {code: 200, message: OK} - request: body: null @@ -151,17 +129,17 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: POST uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002/listKeys?api-version=2017-10-01 response: - body: {string: '{"keys":[{"keyName":"key1","value":"niTXyxI/+JfgaExQkTsfhNwkdH/4rQn/cPjT81lQt4elnnZPpm630VkZATpCDGkdyewzPJZ3G0MwMg+n2ClhZw==","permissions":"FULL"},{"keyName":"key2","value":"qx7dotSrrBPrSWBPXwNt7hcXRb+ewbeOIJoeTuWyfrYu3nYKAWHsoOElMkL0R/hvX8g1OnoknS3WW+DdnXZP0g==","permissions":"FULL"}]}'} + body: {string: '{"keys":[{"keyName":"key1","value":"a2oR83Z/uzGUCw1MP02lNmSbg9cX8GsgbMxkK3wZhuOrAeAQ8x/tgv7OBBV0Q0OrN5pOH45NG9MWk80NWijE0Q==","permissions":"FULL"},{"keyName":"key2","value":"cuZ45EUzKnpz59rlFdZD8hnSNfWwGASMcR+O8wdCSz/PHQPUXaMQIQ22jN6v/9CJuJRuVwgaaB/urSq9V8LMNw==","permissions":"FULL"}]}'} headers: cache-control: [no-cache] content-length: ['288'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 19:40:07 GMT'] + date: ['Tue, 01 May 2018 21:47:24 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -169,27 +147,29 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] - x-ms-ratelimit-remaining-subscription-writes: ['1181'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1198'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:40:07 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:47:26 GMT'] + x-ms-version: ['2017-11-09'] method: PUT uri: https://clitest000002.blob.core.windows.net/cont000003?restype=container response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 19:40:07 GMT'] - etag: ['"0x8D56F2BC26AC82D"'] - last-modified: ['Thu, 08 Feb 2018 19:40:07 GMT'] + date: ['Tue, 01 May 2018 21:47:26 GMT'] + etag: ['"0x8D5AFAD2133C5EB"'] + last-modified: ['Tue, 01 May 2018 21:47:26 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 201, message: Created} - request: body: "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ @@ -3645,23 +3625,24 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['131072'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] x-ms-blob-type: [BlockBlob] - x-ms-date: ['Thu, 08 Feb 2018 19:40:08 GMT'] - x-ms-version: ['2017-07-29'] + x-ms-date: ['Tue, 01 May 2018 21:47:26 GMT'] + x-ms-version: ['2017-11-09'] method: PUT uri: https://clitest000002.blob.core.windows.net/cont000003/blob000004 response: body: {string: ''} headers: content-md5: [DfvoqkwgtS4bi/PLbL3xkw==] - date: ['Thu, 08 Feb 2018 19:40:07 GMT'] - etag: ['"0x8D56F2BC2E31F5D"'] - last-modified: ['Thu, 08 Feb 2018 19:40:08 GMT'] + date: ['Tue, 01 May 2018 21:47:26 GMT'] + etag: ['"0x8D5AFAD217D442A"'] + last-modified: ['Tue, 01 May 2018 21:47:26 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-request-server-encrypted: ['true'] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 201, message: Created} - request: body: null @@ -3669,32 +3650,34 @@ interactions: Connection: [keep-alive] Content-Length: ['0'] If-Modified-Since: ['Fri, 01 Apr 2016 12:00:00 GMT'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:40:08 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:47:27 GMT'] x-ms-lease-action: [acquire] x-ms-lease-duration: ['60'] x-ms-proposed-lease-id: [abcdabcd-abcd-abcd-abcd-abcdabcdabcd] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] method: PUT uri: https://clitest000002.blob.core.windows.net/cont000003/blob000004?comp=lease response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 19:40:08 GMT'] - etag: ['"0x8D56F2BC2E31F5D"'] - last-modified: ['Thu, 08 Feb 2018 19:40:08 GMT'] + date: ['Tue, 01 May 2018 21:47:26 GMT'] + etag: ['"0x8D5AFAD217D442A"'] + last-modified: ['Tue, 01 May 2018 21:47:26 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-lease-id: [abcdabcd-abcd-abcd-abcd-abcdabcdabcd] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 201, message: Created} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:40:08 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:47:27 GMT'] + x-ms-version: ['2017-11-09'] method: HEAD uri: https://clitest000002.blob.core.windows.net/cont000003/blob000004 response: @@ -3704,71 +3687,75 @@ interactions: content-length: ['131072'] content-md5: [DfvoqkwgtS4bi/PLbL3xkw==] content-type: [application/octet-stream] - date: ['Thu, 08 Feb 2018 19:40:08 GMT'] - etag: ['"0x8D56F2BC2E31F5D"'] - last-modified: ['Thu, 08 Feb 2018 19:40:08 GMT'] + date: ['Tue, 01 May 2018 21:47:27 GMT'] + etag: ['"0x8D5AFAD217D442A"'] + last-modified: ['Tue, 01 May 2018 21:47:26 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] x-ms-blob-type: [BlockBlob] + x-ms-creation-time: ['Tue, 01 May 2018 21:47:26 GMT'] x-ms-lease-duration: [fixed] x-ms-lease-state: [leased] x-ms-lease-status: [locked] x-ms-server-encrypted: ['true'] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:40:09 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:47:27 GMT'] x-ms-lease-action: [change] x-ms-lease-id: [abcdabcd-abcd-abcd-abcd-abcdabcdabcd] x-ms-proposed-lease-id: [dcbadcba-dcba-dcba-dcba-dcbadcbadcba] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] method: PUT uri: https://clitest000002.blob.core.windows.net/cont000003/blob000004?comp=lease response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 19:40:09 GMT'] - etag: ['"0x8D56F2BC2E31F5D"'] - last-modified: ['Thu, 08 Feb 2018 19:40:08 GMT'] + date: ['Tue, 01 May 2018 21:47:27 GMT'] + etag: ['"0x8D5AFAD217D442A"'] + last-modified: ['Tue, 01 May 2018 21:47:26 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-lease-id: [dcbadcba-dcba-dcba-dcba-dcbadcbadcba] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:40:09 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:47:28 GMT'] x-ms-lease-action: [renew] x-ms-lease-id: [dcbadcba-dcba-dcba-dcba-dcbadcbadcba] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] method: PUT uri: https://clitest000002.blob.core.windows.net/cont000003/blob000004?comp=lease response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 19:40:09 GMT'] - etag: ['"0x8D56F2BC2E31F5D"'] - last-modified: ['Thu, 08 Feb 2018 19:40:08 GMT'] + date: ['Tue, 01 May 2018 21:47:28 GMT'] + etag: ['"0x8D5AFAD217D442A"'] + last-modified: ['Tue, 01 May 2018 21:47:26 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-lease-id: [dcbadcba-dcba-dcba-dcba-dcbadcbadcba] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:40:09 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:47:28 GMT'] + x-ms-version: ['2017-11-09'] method: HEAD uri: https://clitest000002.blob.core.windows.net/cont000003/blob000004 response: @@ -3778,47 +3765,50 @@ interactions: content-length: ['131072'] content-md5: [DfvoqkwgtS4bi/PLbL3xkw==] content-type: [application/octet-stream] - date: ['Thu, 08 Feb 2018 19:40:09 GMT'] - etag: ['"0x8D56F2BC2E31F5D"'] - last-modified: ['Thu, 08 Feb 2018 19:40:08 GMT'] + date: ['Tue, 01 May 2018 21:47:28 GMT'] + etag: ['"0x8D5AFAD217D442A"'] + last-modified: ['Tue, 01 May 2018 21:47:26 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] x-ms-blob-type: [BlockBlob] + x-ms-creation-time: ['Tue, 01 May 2018 21:47:26 GMT'] x-ms-lease-duration: [fixed] x-ms-lease-state: [leased] x-ms-lease-status: [locked] x-ms-server-encrypted: ['true'] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:40:10 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:47:29 GMT'] x-ms-lease-action: [break] x-ms-lease-break-period: ['30'] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] method: PUT uri: https://clitest000002.blob.core.windows.net/cont000003/blob000004?comp=lease response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 19:40:09 GMT'] - etag: ['"0x8D56F2BC2E31F5D"'] - last-modified: ['Thu, 08 Feb 2018 19:40:08 GMT'] + date: ['Tue, 01 May 2018 21:47:28 GMT'] + etag: ['"0x8D5AFAD217D442A"'] + last-modified: ['Tue, 01 May 2018 21:47:26 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-lease-time: ['30'] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 202, message: Accepted} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:40:10 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:47:29 GMT'] + x-ms-version: ['2017-11-09'] method: HEAD uri: https://clitest000002.blob.core.windows.net/cont000003/blob000004 response: @@ -3828,45 +3818,48 @@ interactions: content-length: ['131072'] content-md5: [DfvoqkwgtS4bi/PLbL3xkw==] content-type: [application/octet-stream] - date: ['Thu, 08 Feb 2018 19:40:10 GMT'] - etag: ['"0x8D56F2BC2E31F5D"'] - last-modified: ['Thu, 08 Feb 2018 19:40:08 GMT'] + date: ['Tue, 01 May 2018 21:47:29 GMT'] + etag: ['"0x8D5AFAD217D442A"'] + last-modified: ['Tue, 01 May 2018 21:47:26 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] x-ms-blob-type: [BlockBlob] + x-ms-creation-time: ['Tue, 01 May 2018 21:47:26 GMT'] x-ms-lease-state: [breaking] x-ms-lease-status: [locked] x-ms-server-encrypted: ['true'] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:40:10 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:47:29 GMT'] x-ms-lease-action: [release] x-ms-lease-id: [dcbadcba-dcba-dcba-dcba-dcbadcbadcba] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] method: PUT uri: https://clitest000002.blob.core.windows.net/cont000003/blob000004?comp=lease response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 19:40:10 GMT'] - etag: ['"0x8D56F2BC2E31F5D"'] - last-modified: ['Thu, 08 Feb 2018 19:40:08 GMT'] + date: ['Tue, 01 May 2018 21:47:29 GMT'] + etag: ['"0x8D5AFAD217D442A"'] + last-modified: ['Tue, 01 May 2018 21:47:26 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:40:10 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:47:30 GMT'] + x-ms-version: ['2017-11-09'] method: HEAD uri: https://clitest000002.blob.core.windows.net/cont000003/blob000004 response: @@ -3876,15 +3869,16 @@ interactions: content-length: ['131072'] content-md5: [DfvoqkwgtS4bi/PLbL3xkw==] content-type: [application/octet-stream] - date: ['Thu, 08 Feb 2018 19:40:10 GMT'] - etag: ['"0x8D56F2BC2E31F5D"'] - last-modified: ['Thu, 08 Feb 2018 19:40:08 GMT'] + date: ['Tue, 01 May 2018 21:47:30 GMT'] + etag: ['"0x8D5AFAD217D442A"'] + last-modified: ['Tue, 01 May 2018 21:47:26 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] x-ms-blob-type: [BlockBlob] + x-ms-creation-time: ['Tue, 01 May 2018 21:47:26 GMT'] x-ms-lease-state: [available] x-ms-lease-status: [unlocked] x-ms-server-encrypted: ['true'] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null @@ -3896,8 +3890,8 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.27] + msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: DELETE uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2017-05-10 @@ -3906,11 +3900,12 @@ interactions: headers: cache-control: [no-cache] content-length: ['0'] - date: ['Thu, 08 Feb 2018 19:40:11 GMT'] + date: ['Tue, 01 May 2018 21:47:30 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTElURVNUOjJFUkc0RFBTVllNUUdDT0tESkpHWlVSUTRQQ0xYVVo2WDZSVVVGR3w1MkQzMEVDMTAwOEZEMUM2LVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTElURVNUOjJFUkdHNUhINUNaQ1RXVkpZSVJLN1FLS1BMRUpJQ1hGU0VTUlhDWXw3MDdCNzVBMTgzNkQ4OTMwLVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1190'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1198'] status: {code: 202, message: Accepted} version: 1 diff --git a/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_blob_metadata_operations.yaml b/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_blob_metadata_operations.yaml index 9d9a266348f..b4946d282be 100644 --- a/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_blob_metadata_operations.yaml +++ b/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_blob_metadata_operations.yaml @@ -1,29 +1,31 @@ interactions: - request: - body: '{"location": "westus", "tags": {"use": "az-test"}}' + body: '{"location": "westus", "tags": {"product": "azurecli", "cause": "automation", + "date": "2018-05-01T21:47:31Z"}}' headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] CommandName: [group create] Connection: [keep-alive] - Content-Length: ['50'] + Content-Length: ['110'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.27] + msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2017-05-10 response: - body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"westus","tags":{"use":"az-test"},"properties":{"provisioningState":"Succeeded"}}'} + body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"westus","tags":{"product":"azurecli","cause":"automation","date":"2018-05-01T21:47:31Z"},"properties":{"provisioningState":"Succeeded"}}'} headers: cache-control: [no-cache] - content-length: ['328'] + content-length: ['384'] content-type: [application/json; charset=utf-8] - date: ['Thu, 08 Feb 2018 19:30:19 GMT'] + date: ['Tue, 01 May 2018 21:47:31 GMT'] expires: ['-1'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] + x-content-type-options: [nosniff] x-ms-ratelimit-remaining-subscription-writes: ['1197'] status: {code: 201, message: Created} - request: @@ -37,7 +39,7 @@ interactions: Content-Length: ['125'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002?api-version=2017-10-01 @@ -47,14 +49,15 @@ interactions: cache-control: [no-cache] content-length: ['0'] content-type: [text/plain; charset=utf-8] - date: ['Thu, 08 Feb 2018 19:30:20 GMT'] + date: ['Tue, 01 May 2018 21:47:32 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/9bdf8afb-45f2-4eae-8c2e-127d904c823c?monitor=true&api-version=2017-10-01'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/64395363-7da9-4c6c-bff7-ea6fe1e42ee2?monitor=true&api-version=2017-10-01'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 Microsoft-HTTPAPI/2.0'] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1186'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1198'] status: {code: 202, message: Accepted} - request: body: null @@ -65,44 +68,17 @@ interactions: Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/9bdf8afb-45f2-4eae-8c2e-127d904c823c?monitor=true&api-version=2017-10-01 + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/64395363-7da9-4c6c-bff7-ea6fe1e42ee2?monitor=true&api-version=2017-10-01 response: - body: {string: ''} - headers: - cache-control: [no-cache] - content-length: ['0'] - content-type: [text/plain; charset=utf-8] - date: ['Thu, 08 Feb 2018 19:30:38 GMT'] - expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/9bdf8afb-45f2-4eae-8c2e-127d904c823c?monitor=true&api-version=2017-10-01'] - pragma: [no-cache] - server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 - Microsoft-HTTPAPI/2.0'] - strict-transport-security: [max-age=31536000; includeSubDomains] - status: {code: 202, message: Accepted} -- request: - body: null - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [storage account create] - Connection: [keep-alive] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] - accept-language: [en-US] - method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/9bdf8afb-45f2-4eae-8c2e-127d904c823c?monitor=true&api-version=2017-10-01 - response: - body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T19:30:21.3217252Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T19:30:21.3217252Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T19:30:21.2748558Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} + body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:47:33.1932492Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:47:33.1932492Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:47:33.1307619Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} headers: cache-control: [no-cache] content-length: ['1231'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 19:30:55 GMT'] + date: ['Tue, 01 May 2018 21:47:50 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -110,6 +86,7 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] + x-content-type-options: [nosniff] status: {code: 200, message: OK} - request: body: null @@ -121,17 +98,17 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: POST uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002/listKeys?api-version=2017-10-01 response: - body: {string: '{"keys":[{"keyName":"key1","value":"RntPvIdHqnncSsSTTcA9HLXyMw4pXCC/hvRmtvAeVa5/rd5LGzNU8zzkZcZdSEuDW7bklfgqquuIEisaS7rnew==","permissions":"FULL"},{"keyName":"key2","value":"3s1GedWU/+AWOHbj0S1hVZWMlK13GB1erhh3GSF9voUL2LUnt9+dB1v0R/Bscyp62haHhCqEYkjVGMqtvEoGoQ==","permissions":"FULL"}]}'} + body: {string: '{"keys":[{"keyName":"key1","value":"WPdT48donsWUf4jsRPxmfhBfRjJy+j+RiW6LdYy4XoaFZ6OIV+aMY3jgtZuQ6YZmaI0ZOI8X0KnrGH7CU/JE5A==","permissions":"FULL"},{"keyName":"key2","value":"Rh/W4ble3jsp5UvOUD/d5m39F98+0JQNaopSferYCwfD2Yz66+RYncStEKYVGSg3ri96z/vCgY9xCfV3idefdA==","permissions":"FULL"}]}'} headers: cache-control: [no-cache] content-length: ['288'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 19:30:56 GMT'] + date: ['Tue, 01 May 2018 21:47:51 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -139,7 +116,8 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] - x-ms-ratelimit-remaining-subscription-writes: ['1193'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1197'] status: {code: 200, message: OK} - request: body: null @@ -151,17 +129,17 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: POST uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002/listKeys?api-version=2017-10-01 response: - body: {string: '{"keys":[{"keyName":"key1","value":"RntPvIdHqnncSsSTTcA9HLXyMw4pXCC/hvRmtvAeVa5/rd5LGzNU8zzkZcZdSEuDW7bklfgqquuIEisaS7rnew==","permissions":"FULL"},{"keyName":"key2","value":"3s1GedWU/+AWOHbj0S1hVZWMlK13GB1erhh3GSF9voUL2LUnt9+dB1v0R/Bscyp62haHhCqEYkjVGMqtvEoGoQ==","permissions":"FULL"}]}'} + body: {string: '{"keys":[{"keyName":"key1","value":"WPdT48donsWUf4jsRPxmfhBfRjJy+j+RiW6LdYy4XoaFZ6OIV+aMY3jgtZuQ6YZmaI0ZOI8X0KnrGH7CU/JE5A==","permissions":"FULL"},{"keyName":"key2","value":"Rh/W4ble3jsp5UvOUD/d5m39F98+0JQNaopSferYCwfD2Yz66+RYncStEKYVGSg3ri96z/vCgY9xCfV3idefdA==","permissions":"FULL"}]}'} headers: cache-control: [no-cache] content-length: ['288'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 19:30:57 GMT'] + date: ['Tue, 01 May 2018 21:47:51 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -169,6 +147,7 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] + x-content-type-options: [nosniff] x-ms-ratelimit-remaining-subscription-writes: ['1195'] status: {code: 200, message: OK} - request: @@ -176,20 +155,21 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:30:58 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:47:52 GMT'] + x-ms-version: ['2017-11-09'] method: PUT uri: https://clitest000002.blob.core.windows.net/cont000003?restype=container response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 19:30:58 GMT'] - etag: ['"0x8D56F2A7B3A85DD"'] - last-modified: ['Thu, 08 Feb 2018 19:30:58 GMT'] + date: ['Tue, 01 May 2018 21:47:52 GMT'] + etag: ['"0x8D5AFAD31035F92"'] + last-modified: ['Tue, 01 May 2018 21:47:52 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 201, message: Created} - request: body: "# --------------------------------------------------------------------------------------------\r\ @@ -283,18 +263,41 @@ interactions: \ 'The expected number of block put requests is {} but the actual '\r\ \n 'number is {}.'.format(block_count, len(put_blocks)))\r\ \n\r\n @ResourceGroupPreparer()\r\n @StorageAccountPreparer()\r\n def\ - \ test_storage_blob_lease_operations(self, resource_group, storage_account):\r\ - \n account_info = self.get_account_info(resource_group, storage_account)\r\ - \n local_file = self.create_temp_file(128)\r\n c = self.create_container(account_info)\r\ - \n b = self.create_random_name('blob', 24)\r\n proposed_lease_id\ - \ = 'abcdabcd-abcd-abcd-abcd-abcdabcdabcd'\r\n new_lease_id = 'dcbadcba-dcba-dcba-dcba-dcbadcbadcba'\r\ - \n date = '2016-04-01t12:00z'\r\n\r\n self.storage_cmd('storage\ - \ blob upload -c {} -n {} -f \"{}\"', account_info, c, b, local_file)\r\n\r\n\ - \ # test lease operations\r\n self.storage_cmd('storage blob lease\ - \ acquire --lease-duration 60 -b {} -c {} '\r\n '--if-modified-since\ - \ {} --proposed-lease-id {}', account_info, b, c, date,\r\n \ - \ proposed_lease_id)\r\n self.storage_cmd('storage blob show\ - \ -n {} -c {}', account_info, b, c) \\\r\n .assert_with_checks(JMESPathCheck('properties.lease.duration',\ + \ test_storage_blob_socket_timeout(self, resource_group, storage_account):\r\ + \n local_dir = self.create_temp_dir()\r\n local_file = self.create_temp_file(1)\r\ + \n blob_name = self.create_random_name(prefix='blob', length=24)\r\n\ + \ account_info = self.get_account_info(resource_group, storage_account)\r\ + \n\r\n container = self.create_container(account_info)\r\n\r\n \ + \ from azure.common import AzureException\r\n with self.assertRaises(AzureException):\r\ + \n self.storage_cmd('storage blob upload -c {} -f \"{}\" -n {} --type\ + \ block --socket-timeout -11',\r\n account_info,\ + \ container, local_file, blob_name)\r\n\r\n self.storage_cmd('storage\ + \ blob exists -n {} -c {}', account_info, blob_name, container) \\\r\n \ + \ .assert_with_checks(JMESPathCheck('exists', False))\r\n\r\n self.storage_cmd('storage\ + \ blob upload -c {} -f \"{}\" -n {} --type block --socket-timeout 10',\r\n \ + \ account_info, container, local_file, blob_name)\r\n\ + \ self.storage_cmd('storage blob exists -n {} -c {}', account_info, blob_name,\ + \ container) \\\r\n .assert_with_checks(JMESPathCheck('exists', True))\r\ + \n\r\n self.storage_cmd('storage blob show -n {} -c {}', account_info,\ + \ blob_name, container) \\\r\n .assert_with_checks(JMESPathCheck('name',\ + \ blob_name))\r\n\r\n downloaded = os.path.join(local_dir, 'test.file')\r\ + \n\r\n self.storage_cmd('storage blob download -n {} -c {} --file \"\ + {}\" --socket-timeout 10',\r\n account_info, blob_name,\ + \ container, downloaded)\r\n self.assertTrue(os.path.isfile(downloaded),\ + \ 'The file is not downloaded.')\r\n\r\n @ResourceGroupPreparer()\r\n \ + \ @StorageAccountPreparer()\r\n def test_storage_blob_lease_operations(self,\ + \ resource_group, storage_account):\r\n account_info = self.get_account_info(resource_group,\ + \ storage_account)\r\n local_file = self.create_temp_file(128)\r\n \ + \ c = self.create_container(account_info)\r\n b = self.create_random_name('blob',\ + \ 24)\r\n proposed_lease_id = 'abcdabcd-abcd-abcd-abcd-abcdabcdabcd'\r\ + \n new_lease_id = 'dcbadcba-dcba-dcba-dcba-dcbadcbadcba'\r\n date\ + \ = '2016-04-01t12:00z'\r\n\r\n self.storage_cmd('storage blob upload\ + \ -c {} -n {} -f \"{}\"', account_info, c, b, local_file)\r\n\r\n # test\ + \ lease operations\r\n self.storage_cmd('storage blob lease acquire --lease-duration\ + \ 60 -b {} -c {} '\r\n '--if-modified-since {} --proposed-lease-id\ + \ {}', account_info, b, c, date,\r\n proposed_lease_id)\r\ + \n self.storage_cmd('storage blob show -n {} -c {}', account_info, b,\ + \ c) \\\r\n .assert_with_checks(JMESPathCheck('properties.lease.duration',\ \ 'fixed'),\r\n JMESPathCheck('properties.lease.state',\ \ 'leased'),\r\n JMESPathCheck('properties.lease.status',\ \ 'locked'))\r\n self.storage_cmd('storage blob lease change -b {} -c\ @@ -398,20 +401,20 @@ interactions: \ account_info, c) \\\r\n .assert_with_checks(JMESPathCheck('deleted',\ \ True))\r\n self.storage_cmd('storage container exists -n {}', account_info,\ \ c) \\\r\n .assert_with_checks(JMESPathCheck('exists', False))\r\ - \n\r\n @api_version_constraint(ResourceType.MGMT_STORAGE, min_api='2017-07-29')\r\ - \n @ResourceGroupPreparer()\r\n @StorageAccountPreparer()\r\n def test_storage_blob_soft_delete(self,\ - \ resource_group, storage_account):\r\n account_info = self.get_account_info(resource_group,\ - \ storage_account)\r\n container = self.create_container(account_info)\r\ - \n\r\n # create a blob\r\n local_file = self.create_temp_file(1)\r\ - \n blob_name = self.create_random_name(prefix='blob', length=24)\r\n\r\ - \n self.storage_cmd('storage blob upload -c {} -f \"{}\" -n {} --type\ - \ block', account_info,\r\n container, local_file, blob_name)\r\ - \n self.assertEqual(len(self.storage_cmd('storage blob list -c {}',\r\ - \n account_info, container).get_output_in_json()),\ - \ 1)\r\n\r\n # set delete-policy to enable soft-delete\r\n self.storage_cmd('storage\ - \ blob service-properties delete-policy update --enable true --days-retained\ - \ 2',\r\n account_info)\r\n self.storage_cmd('storage\ - \ blob service-properties delete-policy show',\r\n account_info).assert_with_checks(JMESPathCheck('enabled',\ + \n\r\n @ResourceGroupPreparer()\r\n @StorageAccountPreparer()\r\n def\ + \ test_storage_blob_soft_delete(self, resource_group, storage_account):\r\n\ + \ account_info = self.get_account_info(resource_group, storage_account)\r\ + \n container = self.create_container(account_info)\r\n\r\n # create\ + \ a blob\r\n local_file = self.create_temp_file(1)\r\n blob_name\ + \ = self.create_random_name(prefix='blob', length=24)\r\n\r\n self.storage_cmd('storage\ + \ blob upload -c {} -f \"{}\" -n {} --type block', account_info,\r\n \ + \ container, local_file, blob_name)\r\n self.assertEqual(len(self.storage_cmd('storage\ + \ blob list -c {}',\r\n account_info,\ + \ container).get_output_in_json()), 1)\r\n\r\n # set delete-policy to\ + \ enable soft-delete\r\n self.storage_cmd('storage blob service-properties\ + \ delete-policy update --enable true --days-retained 2',\r\n \ + \ account_info)\r\n self.storage_cmd('storage blob service-properties\ + \ delete-policy show',\r\n account_info).assert_with_checks(JMESPathCheck('enabled',\ \ True),\r\n JMESPathCheck('days',\ \ 2))\r\n\r\n # soft-delete and check\r\n self.storage_cmd('storage\ \ blob delete -c {} -n {}', account_info, container, blob_name)\r\n self.assertEqual(len(self.storage_cmd('storage\ @@ -422,113 +425,132 @@ interactions: \ and check\r\n self.storage_cmd('storage blob undelete -c {} -n {}',\ \ account_info, container, blob_name)\r\n self.assertEqual(len(self.storage_cmd('storage\ \ blob list -c {}',\r\n account_info,\ - \ container).get_output_in_json()), 1)\r\n\r\n\r\nif __name__ == '__main__':\r\ - \n unittest.main()\r\n" + \ container).get_output_in_json()), 1)\r\n\r\n @ResourceGroupPreparer()\r\ + \n @StorageAccountPreparer()\r\n def test_storage_blob_append(self, resource_group,\ + \ storage_account):\r\n account_info = self.get_account_info(resource_group,\ + \ storage_account)\r\n container = self.create_container(account_info)\r\ + \n\r\n # create an append blob\r\n local_file = self.create_temp_file(1)\r\ + \n blob_name = self.create_random_name(prefix='blob', length=24)\r\n\r\ + \n self.storage_cmd('storage blob upload -c {} -f \"{}\" -n {} --type\ + \ append --if-none-match *', account_info,\r\n container,\ + \ local_file, blob_name)\r\n self.assertEqual(len(self.storage_cmd('storage\ + \ blob list -c {}',\r\n account_info,\ + \ container).get_output_in_json()), 1)\r\n\r\n # append if-none-match\ + \ should throw exception\r\n with self.assertRaises(Exception):\r\n \ + \ self.storage_cmd('storage blob upload -c {} -f \"{}\" -n {} --type\ + \ append --if-none-match *', account_info,\r\n container,\ + \ local_file, blob_name)\r\n\r\n\r\nif __name__ == '__main__':\r\n unittest.main()\r\ + \n" headers: Connection: [keep-alive] - Content-Length: ['18787'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] + Content-Length: ['21487'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] x-ms-blob-content-type: [text/plain] x-ms-blob-type: [BlockBlob] - x-ms-date: ['Thu, 08 Feb 2018 19:30:59 GMT'] - x-ms-version: ['2017-07-29'] + x-ms-date: ['Tue, 01 May 2018 21:47:53 GMT'] + x-ms-version: ['2017-11-09'] method: PUT uri: https://clitest000002.blob.core.windows.net/cont000003/blob000004 response: body: {string: ''} headers: - content-md5: [Zd3Jo95xLQtZkAAKeMC8Qg==] - date: ['Thu, 08 Feb 2018 19:30:58 GMT'] - etag: ['"0x8D56F2A7B831D98"'] - last-modified: ['Thu, 08 Feb 2018 19:30:59 GMT'] + content-md5: [+WFZhdwHyV1SHyRq6onVEw==] + date: ['Tue, 01 May 2018 21:47:52 GMT'] + etag: ['"0x8D5AFAD313B7741"'] + last-modified: ['Tue, 01 May 2018 21:47:53 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-request-server-encrypted: ['true'] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 201, message: Created} - request: body: null headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:30:59 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:47:53 GMT'] x-ms-meta-a: [b] x-ms-meta-c: [d] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] method: PUT uri: https://clitest000002.blob.core.windows.net/cont000003/blob000004?comp=metadata response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 19:30:59 GMT'] - etag: ['"0x8D56F2A7BB8E0C7"'] - last-modified: ['Thu, 08 Feb 2018 19:30:59 GMT'] + date: ['Tue, 01 May 2018 21:47:53 GMT'] + etag: ['"0x8D5AFAD316D8CF1"'] + last-modified: ['Tue, 01 May 2018 21:47:53 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-request-server-encrypted: ['true'] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:30:59 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:47:53 GMT'] + x-ms-version: ['2017-11-09'] method: GET uri: https://clitest000002.blob.core.windows.net/cont000003/blob000004?comp=metadata response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 19:30:59 GMT'] - etag: ['"0x8D56F2A7BB8E0C7"'] - last-modified: ['Thu, 08 Feb 2018 19:30:59 GMT'] + date: ['Tue, 01 May 2018 21:47:53 GMT'] + etag: ['"0x8D5AFAD316D8CF1"'] + last-modified: ['Tue, 01 May 2018 21:47:53 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-meta-a: [b] x-ms-meta-c: [d] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:30:59 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:47:54 GMT'] + x-ms-version: ['2017-11-09'] method: PUT uri: https://clitest000002.blob.core.windows.net/cont000003/blob000004?comp=metadata response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 19:30:59 GMT'] - etag: ['"0x8D56F2A7C0C9393"'] - last-modified: ['Thu, 08 Feb 2018 19:31:00 GMT'] + date: ['Tue, 01 May 2018 21:47:53 GMT'] + etag: ['"0x8D5AFAD31E93C43"'] + last-modified: ['Tue, 01 May 2018 21:47:54 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-request-server-encrypted: ['true'] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:31:00 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:47:54 GMT'] + x-ms-version: ['2017-11-09'] method: GET uri: https://clitest000002.blob.core.windows.net/cont000003/blob000004?comp=metadata response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 19:30:59 GMT'] - etag: ['"0x8D56F2A7C0C9393"'] - last-modified: ['Thu, 08 Feb 2018 19:31:00 GMT'] + date: ['Tue, 01 May 2018 21:47:54 GMT'] + etag: ['"0x8D5AFAD31E93C43"'] + last-modified: ['Tue, 01 May 2018 21:47:54 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null @@ -540,8 +562,8 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.27] + msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: DELETE uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2017-05-10 @@ -550,11 +572,12 @@ interactions: headers: cache-control: [no-cache] content-length: ['0'] - date: ['Thu, 08 Feb 2018 19:31:01 GMT'] + date: ['Tue, 01 May 2018 21:47:55 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTElURVNUOjJFUkdURDdINEZBNE9LQ08zWDNQVFlIT0VRM0hDWjRQNFFLVU1FWXxBODFDMkU3OUI2RTc5MUVFLVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTElURVNUOjJFUkdDUk9TNTMzSEFOQ0xUS1pGTVlSQ0JFTkhIQjVRV1ZDNEMyT3wwQThBNzAyQ0U0NDI5MjdDLVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1193'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1198'] status: {code: 202, message: Accepted} version: 1 diff --git a/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_blob_snapshot_operations.yaml b/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_blob_snapshot_operations.yaml index 0443596f004..2c09694d194 100644 --- a/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_blob_snapshot_operations.yaml +++ b/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_blob_snapshot_operations.yaml @@ -1,30 +1,32 @@ interactions: - request: - body: '{"location": "westus", "tags": {"use": "az-test"}}' + body: '{"location": "westus", "tags": {"product": "azurecli", "cause": "automation", + "date": "2018-05-01T21:47:55Z"}}' headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] CommandName: [group create] Connection: [keep-alive] - Content-Length: ['50'] + Content-Length: ['110'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.27] + msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2017-05-10 response: - body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"westus","tags":{"use":"az-test"},"properties":{"provisioningState":"Succeeded"}}'} + body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"westus","tags":{"product":"azurecli","cause":"automation","date":"2018-05-01T21:47:55Z"},"properties":{"provisioningState":"Succeeded"}}'} headers: cache-control: [no-cache] - content-length: ['328'] + content-length: ['384'] content-type: [application/json; charset=utf-8] - date: ['Thu, 08 Feb 2018 19:36:48 GMT'] + date: ['Tue, 01 May 2018 21:47:55 GMT'] expires: ['-1'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1186'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1197'] status: {code: 201, message: Created} - request: body: '{"sku": {"name": "Standard_LRS"}, "kind": "Storage", "location": "westus", @@ -37,7 +39,7 @@ interactions: Content-Length: ['125'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002?api-version=2017-10-01 @@ -47,14 +49,15 @@ interactions: cache-control: [no-cache] content-length: ['0'] content-type: [text/plain; charset=utf-8] - date: ['Thu, 08 Feb 2018 19:36:51 GMT'] + date: ['Tue, 01 May 2018 21:47:56 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/8c001b7c-bfa7-4a80-8770-7da057285bad?monitor=true&api-version=2017-10-01'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/b798e646-f8cb-4417-a58e-b42fe7eba2e6?monitor=true&api-version=2017-10-01'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 Microsoft-HTTPAPI/2.0'] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1194'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1197'] status: {code: 202, message: Accepted} - request: body: null @@ -65,17 +68,17 @@ interactions: Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/8c001b7c-bfa7-4a80-8770-7da057285bad?monitor=true&api-version=2017-10-01 + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/b798e646-f8cb-4417-a58e-b42fe7eba2e6?monitor=true&api-version=2017-10-01 response: - body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T19:36:50.9747872Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T19:36:50.9747872Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T19:36:50.9435347Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} + body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:47:57.5877755Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:47:57.5877755Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:47:57.5252776Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} headers: cache-control: [no-cache] content-length: ['1231'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 19:37:08 GMT'] + date: ['Tue, 01 May 2018 21:48:14 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -83,6 +86,7 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] + x-content-type-options: [nosniff] status: {code: 200, message: OK} - request: body: null @@ -94,17 +98,17 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: POST uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002/listKeys?api-version=2017-10-01 response: - body: {string: '{"keys":[{"keyName":"key1","value":"McfbAUdjb/RVU3qTjdgIr6UxAgXkMcj2KPAtEWqUQ2yQfoeMPXoAB5Hg5pO6RSx8y+q/wjoR3imnQ+xJ9oWEtQ==","permissions":"FULL"},{"keyName":"key2","value":"zK4P0jitAgSCMZMaTk1+HcdaPsVfGyRWgYitU+iVpc1tU5WQelAorllGKbB5Yrmc//1j48r7CF3Ac4GvRPgKAQ==","permissions":"FULL"}]}'} + body: {string: '{"keys":[{"keyName":"key1","value":"mSQyYeFjSWcHh4OQ0cI+sM0ltIbw37uXGCXXseczOS1s6fnU78/mmq/MELZC/f/YIcITEXjXC/lnvCVu3H01QQ==","permissions":"FULL"},{"keyName":"key2","value":"oMyycaVQzQ9qbelMiFVT3v6nbIKeVoByVl4W0XnQd7vesMUvINKjuIuDm/nebGLsaBnXkpeahoCjXgznWDJKiw==","permissions":"FULL"}]}'} headers: cache-control: [no-cache] content-length: ['288'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 19:37:09 GMT'] + date: ['Tue, 01 May 2018 21:48:16 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -112,7 +116,8 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] - x-ms-ratelimit-remaining-subscription-writes: ['1196'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1198'] status: {code: 200, message: OK} - request: body: null @@ -124,17 +129,17 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: POST uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002/listKeys?api-version=2017-10-01 response: - body: {string: '{"keys":[{"keyName":"key1","value":"McfbAUdjb/RVU3qTjdgIr6UxAgXkMcj2KPAtEWqUQ2yQfoeMPXoAB5Hg5pO6RSx8y+q/wjoR3imnQ+xJ9oWEtQ==","permissions":"FULL"},{"keyName":"key2","value":"zK4P0jitAgSCMZMaTk1+HcdaPsVfGyRWgYitU+iVpc1tU5WQelAorllGKbB5Yrmc//1j48r7CF3Ac4GvRPgKAQ==","permissions":"FULL"}]}'} + body: {string: '{"keys":[{"keyName":"key1","value":"mSQyYeFjSWcHh4OQ0cI+sM0ltIbw37uXGCXXseczOS1s6fnU78/mmq/MELZC/f/YIcITEXjXC/lnvCVu3H01QQ==","permissions":"FULL"},{"keyName":"key2","value":"oMyycaVQzQ9qbelMiFVT3v6nbIKeVoByVl4W0XnQd7vesMUvINKjuIuDm/nebGLsaBnXkpeahoCjXgznWDJKiw==","permissions":"FULL"}]}'} headers: cache-control: [no-cache] content-length: ['288'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 19:37:09 GMT'] + date: ['Tue, 01 May 2018 21:48:16 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -142,27 +147,29 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] - x-ms-ratelimit-remaining-subscription-writes: ['1186'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1198'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:37:10 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:48:16 GMT'] + x-ms-version: ['2017-11-09'] method: PUT uri: https://clitest000002.blob.core.windows.net/cont000003?restype=container response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 19:37:11 GMT'] - etag: ['"0x8D56F2B59104B06"'] - last-modified: ['Thu, 08 Feb 2018 19:37:11 GMT'] + date: ['Tue, 01 May 2018 21:48:16 GMT'] + etag: ['"0x8D5AFAD3F79B2C1"'] + last-modified: ['Tue, 01 May 2018 21:48:17 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 201, message: Created} - request: body: "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ @@ -3618,54 +3625,57 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['131072'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] x-ms-blob-type: [BlockBlob] - x-ms-date: ['Thu, 08 Feb 2018 19:37:11 GMT'] - x-ms-version: ['2017-07-29'] + x-ms-date: ['Tue, 01 May 2018 21:48:17 GMT'] + x-ms-version: ['2017-11-09'] method: PUT uri: https://clitest000002.blob.core.windows.net/cont000003/blob000004 response: body: {string: ''} headers: content-md5: [DfvoqkwgtS4bi/PLbL3xkw==] - date: ['Thu, 08 Feb 2018 19:37:11 GMT'] - etag: ['"0x8D56F2B597CEACA"'] - last-modified: ['Thu, 08 Feb 2018 19:37:11 GMT'] + date: ['Tue, 01 May 2018 21:48:17 GMT'] + etag: ['"0x8D5AFAD3FE3ED21"'] + last-modified: ['Tue, 01 May 2018 21:48:17 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-request-server-encrypted: ['true'] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 201, message: Created} - request: body: null headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:37:11 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:48:18 GMT'] + x-ms-version: ['2017-11-09'] method: PUT uri: https://clitest000002.blob.core.windows.net/cont000003/blob000004?comp=snapshot response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 19:37:11 GMT'] - etag: ['"0x8D56F2B597CEACA"'] - last-modified: ['Thu, 08 Feb 2018 19:37:11 GMT'] + date: ['Tue, 01 May 2018 21:48:18 GMT'] + etag: ['"0x8D5AFAD3FE3ED21"'] + last-modified: ['Tue, 01 May 2018 21:48:17 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-snapshot: ['2018-02-08T19:37:12.1381903Z'] - x-ms-version: ['2017-07-29'] + x-ms-snapshot: ['2018-05-01T21:48:18.2590880Z'] + x-ms-version: ['2017-11-09'] status: {code: 201, message: Created} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:37:11 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:48:18 GMT'] + x-ms-version: ['2017-11-09'] method: HEAD - uri: https://clitest000002.blob.core.windows.net/cont000003/blob000004?snapshot=2018-02-08T19%3A37%3A12.1381903Z + uri: https://clitest000002.blob.core.windows.net/cont000003/blob000004?snapshot=2018-05-01T21%3A48%3A18.2590880Z response: body: {string: ''} headers: @@ -3673,13 +3683,14 @@ interactions: content-length: ['131072'] content-md5: [DfvoqkwgtS4bi/PLbL3xkw==] content-type: [application/octet-stream] - date: ['Thu, 08 Feb 2018 19:37:11 GMT'] - etag: ['"0x8D56F2B597CEACA"'] - last-modified: ['Thu, 08 Feb 2018 19:37:11 GMT'] + date: ['Tue, 01 May 2018 21:48:18 GMT'] + etag: ['"0x8D5AFAD3FE3ED21"'] + last-modified: ['Tue, 01 May 2018 21:48:17 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] x-ms-blob-type: [BlockBlob] + x-ms-creation-time: ['Tue, 01 May 2018 21:48:17 GMT'] x-ms-server-encrypted: ['true'] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null @@ -3691,8 +3702,8 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.27] + msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: DELETE uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2017-05-10 @@ -3701,11 +3712,12 @@ interactions: headers: cache-control: [no-cache] content-length: ['0'] - date: ['Thu, 08 Feb 2018 19:37:13 GMT'] + date: ['Tue, 01 May 2018 21:48:18 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTElURVNUOjJFUkdVTFA3NEpKVExQVDY1VFlLR0hHSjdVTUxIWTRFTkZOUUpLVnw3MzJCNTA2Q0IwNkNDNTAzLVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTElURVNUOjJFUkdIRjIzR0VVVUw1RzQ2VURVM0QyNVA2QjdNNVlTMjNPVjZCWnxCMUJEREZDMTAzQzU1RjFELVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1194'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1196'] status: {code: 202, message: Accepted} version: 1 diff --git a/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_blob_socket_timeout.yaml b/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_blob_socket_timeout.yaml index e034fa49472..47579417e79 100644 --- a/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_blob_socket_timeout.yaml +++ b/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_blob_socket_timeout.yaml @@ -1,7 +1,7 @@ interactions: - request: body: '{"location": "westus", "tags": {"product": "azurecli", "cause": "automation", - "date": "2018-04-07T00:12:55Z"}}' + "date": "2018-05-01T21:48:19Z"}}' headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] @@ -11,17 +11,17 @@ interactions: Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.31] + AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2017-05-10 response: - body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"westus","tags":{"product":"azurecli","cause":"automation","date":"2018-04-07T00:12:55Z"},"properties":{"provisioningState":"Succeeded"}}'} + body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"westus","tags":{"product":"azurecli","cause":"automation","date":"2018-05-01T21:48:19Z"},"properties":{"provisioningState":"Succeeded"}}'} headers: cache-control: [no-cache] content-length: ['384'] content-type: [application/json; charset=utf-8] - date: ['Sat, 07 Apr 2018 00:12:56 GMT'] + date: ['Tue, 01 May 2018 21:48:20 GMT'] expires: ['-1'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] @@ -39,7 +39,7 @@ interactions: Content-Length: ['125'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.31] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002?api-version=2017-10-01 @@ -49,9 +49,9 @@ interactions: cache-control: [no-cache] content-length: ['0'] content-type: [text/plain; charset=utf-8] - date: ['Sat, 07 Apr 2018 00:12:59 GMT'] + date: ['Tue, 01 May 2018 21:48:21 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/01ef5cc2-8d4e-4b36-8ed8-add136c6770d?monitor=true&api-version=2017-10-01'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/0d0558c2-d824-467c-9cc3-557bcfe84843?monitor=true&api-version=2017-10-01'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 Microsoft-HTTPAPI/2.0'] @@ -66,17 +66,19 @@ interactions: Accept-Encoding: ['gzip, deflate'] CommandName: [storage account create] Connection: [keep-alive] + Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.31] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] + accept-language: [en-US] method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/01ef5cc2-8d4e-4b36-8ed8-add136c6770d?monitor=true&api-version=2017-10-01 + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/0d0558c2-d824-467c-9cc3-557bcfe84843?monitor=true&api-version=2017-10-01 response: - body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-04-07T00:12:59.1840796Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-04-07T00:12:59.1840796Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-04-07T00:12:59.1215645Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} + body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:48:21.6512920Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:48:21.6512920Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:48:21.5575410Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} headers: cache-control: [no-cache] content-length: ['1231'] content-type: [application/json] - date: ['Sat, 07 Apr 2018 00:13:15 GMT'] + date: ['Tue, 01 May 2018 21:48:38 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -96,17 +98,17 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.31] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: POST uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002/listKeys?api-version=2017-10-01 response: - body: {string: '{"keys":[{"keyName":"key1","value":"IYa076sCz4c4q+O0s/HVuP1Yh0JdguJw1DDQWsyxs1ZPYLIRp8hgDjIuZOjlyYDXD1u/7IkYN6DFI7Sv1jF3FA==","permissions":"FULL"},{"keyName":"key2","value":"GIs/71nI67FUFUXvMl1Abd8NAqZmbA80g+gbeKZ02h16GIdvWqmUvSIK3um8pDZXMnOK4vZJez69b2R+Z7akSw==","permissions":"FULL"}]}'} + body: {string: '{"keys":[{"keyName":"key1","value":"2DyFqrFaHyg5gZoURRCMdrDd60j0YCpC/d8s77k5bvTbZvMovR3FgH26PujOoSNEEcFVRVH41UpwrYRmdXMbGg==","permissions":"FULL"},{"keyName":"key2","value":"SF8vB+fEvoYI6CrC+HuAdO43ctX7R7p5k3DzRmT5L3LnnnAtmnD0Nuc5fTiWMNifZBlSOqMPpvn27qvYvyJZkQ==","permissions":"FULL"}]}'} headers: cache-control: [no-cache] content-length: ['288'] content-type: [application/json] - date: ['Sat, 07 Apr 2018 00:13:17 GMT'] + date: ['Tue, 01 May 2018 21:48:39 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -115,7 +117,7 @@ interactions: transfer-encoding: [chunked] vary: [Accept-Encoding] x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-writes: ['1198'] + x-ms-ratelimit-remaining-subscription-writes: ['1196'] status: {code: 200, message: OK} - request: body: null @@ -127,17 +129,17 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.31] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: POST uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002/listKeys?api-version=2017-10-01 response: - body: {string: '{"keys":[{"keyName":"key1","value":"IYa076sCz4c4q+O0s/HVuP1Yh0JdguJw1DDQWsyxs1ZPYLIRp8hgDjIuZOjlyYDXD1u/7IkYN6DFI7Sv1jF3FA==","permissions":"FULL"},{"keyName":"key2","value":"GIs/71nI67FUFUXvMl1Abd8NAqZmbA80g+gbeKZ02h16GIdvWqmUvSIK3um8pDZXMnOK4vZJez69b2R+Z7akSw==","permissions":"FULL"}]}'} + body: {string: '{"keys":[{"keyName":"key1","value":"2DyFqrFaHyg5gZoURRCMdrDd60j0YCpC/d8s77k5bvTbZvMovR3FgH26PujOoSNEEcFVRVH41UpwrYRmdXMbGg==","permissions":"FULL"},{"keyName":"key2","value":"SF8vB+fEvoYI6CrC+HuAdO43ctX7R7p5k3DzRmT5L3LnnnAtmnD0Nuc5fTiWMNifZBlSOqMPpvn27qvYvyJZkQ==","permissions":"FULL"}]}'} headers: cache-control: [no-cache] content-length: ['288'] content-type: [application/json] - date: ['Sat, 07 Apr 2018 00:13:17 GMT'] + date: ['Tue, 01 May 2018 21:48:40 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -146,45 +148,47 @@ interactions: transfer-encoding: [chunked] vary: [Accept-Encoding] x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-writes: ['1198'] + x-ms-ratelimit-remaining-subscription-writes: ['1196'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.31] - x-ms-date: ['Sat, 07 Apr 2018 00:13:18 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:48:41 GMT'] + x-ms-version: ['2017-11-09'] method: PUT uri: https://clitest000002.blob.core.windows.net/cont000004?restype=container response: body: {string: ''} headers: - date: ['Sat, 07 Apr 2018 00:13:18 GMT'] - etag: ['"0x8D59C1C5DE25CCF"'] - last-modified: ['Sat, 07 Apr 2018 00:13:19 GMT'] + date: ['Tue, 01 May 2018 21:48:40 GMT'] + etag: ['"0x8D5AFAD4DCDD1D8"'] + last-modified: ['Tue, 01 May 2018 21:48:41 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 201, message: Created} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.31] - x-ms-date: ['Sat, 07 Apr 2018 00:14:18 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:49:37 GMT'] + x-ms-version: ['2017-11-09'] method: HEAD uri: https://clitest000002.blob.core.windows.net/cont000004/blob000003 response: body: {string: ''} headers: - date: ['Sat, 07 Apr 2018 00:14:18 GMT'] + date: ['Tue, 01 May 2018 21:49:37 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-error-code: [BlobNotFound] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 404, message: The specified blob does not exist.} - request: body: "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ @@ -217,31 +221,33 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['1024'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.31] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] x-ms-blob-type: [BlockBlob] - x-ms-date: ['Sat, 07 Apr 2018 00:14:19 GMT'] - x-ms-version: ['2017-07-29'] + x-ms-date: ['Tue, 01 May 2018 21:49:38 GMT'] + x-ms-version: ['2017-11-09'] method: PUT uri: https://clitest000002.blob.core.windows.net/cont000004/blob000003 response: body: {string: ''} headers: content-md5: [DzQ7CTESaiDxM9Z8KwGKOw==] - date: ['Sat, 07 Apr 2018 00:14:18 GMT'] - etag: ['"0x8D59C1C81B17816"'] - last-modified: ['Sat, 07 Apr 2018 00:14:19 GMT'] + date: ['Tue, 01 May 2018 21:49:37 GMT'] + etag: ['"0x8D5AFAD6FD24C68"'] + last-modified: ['Tue, 01 May 2018 21:49:38 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-request-server-encrypted: ['true'] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 201, message: Created} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.31] - x-ms-date: ['Sat, 07 Apr 2018 00:14:19 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:49:38 GMT'] + x-ms-version: ['2017-11-09'] method: HEAD uri: https://clitest000002.blob.core.windows.net/cont000004/blob000003 response: @@ -251,23 +257,25 @@ interactions: content-length: ['1024'] content-md5: [DzQ7CTESaiDxM9Z8KwGKOw==] content-type: [application/octet-stream] - date: ['Sat, 07 Apr 2018 00:14:19 GMT'] - etag: ['"0x8D59C1C81B17816"'] - last-modified: ['Sat, 07 Apr 2018 00:14:19 GMT'] + date: ['Tue, 01 May 2018 21:49:38 GMT'] + etag: ['"0x8D5AFAD6FD24C68"'] + last-modified: ['Tue, 01 May 2018 21:49:38 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] x-ms-blob-type: [BlockBlob] + x-ms-creation-time: ['Tue, 01 May 2018 21:49:38 GMT'] x-ms-lease-state: [available] x-ms-lease-status: [unlocked] x-ms-server-encrypted: ['true'] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.31] - x-ms-date: ['Sat, 07 Apr 2018 00:14:19 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:49:38 GMT'] + x-ms-version: ['2017-11-09'] method: HEAD uri: https://clitest000002.blob.core.windows.net/cont000004/blob000003 response: @@ -277,24 +285,26 @@ interactions: content-length: ['1024'] content-md5: [DzQ7CTESaiDxM9Z8KwGKOw==] content-type: [application/octet-stream] - date: ['Sat, 07 Apr 2018 00:14:19 GMT'] - etag: ['"0x8D59C1C81B17816"'] - last-modified: ['Sat, 07 Apr 2018 00:14:19 GMT'] + date: ['Tue, 01 May 2018 21:49:38 GMT'] + etag: ['"0x8D5AFAD6FD24C68"'] + last-modified: ['Tue, 01 May 2018 21:49:38 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] x-ms-blob-type: [BlockBlob] + x-ms-creation-time: ['Tue, 01 May 2018 21:49:38 GMT'] x-ms-lease-state: [available] x-ms-lease-status: [unlocked] x-ms-server-encrypted: ['true'] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.31] - x-ms-date: ['Sat, 07 Apr 2018 00:14:20 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:49:39 GMT'] x-ms-range: [bytes=0-33554431] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] method: GET uri: https://clitest000002.blob.core.windows.net/cont000004/blob000003 response: @@ -331,16 +341,17 @@ interactions: content-length: ['1024'] content-range: [bytes 0-1023/1024] content-type: [application/octet-stream] - date: ['Sat, 07 Apr 2018 00:14:20 GMT'] - etag: ['"0x8D59C1C81B17816"'] - last-modified: ['Sat, 07 Apr 2018 00:14:19 GMT'] + date: ['Tue, 01 May 2018 21:49:38 GMT'] + etag: ['"0x8D5AFAD6FD24C68"'] + last-modified: ['Tue, 01 May 2018 21:49:38 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] x-ms-blob-content-md5: [DzQ7CTESaiDxM9Z8KwGKOw==] x-ms-blob-type: [BlockBlob] + x-ms-creation-time: ['Tue, 01 May 2018 21:49:38 GMT'] x-ms-lease-state: [available] x-ms-lease-status: [unlocked] x-ms-server-encrypted: ['true'] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 206, message: Partial Content} - request: body: null @@ -353,7 +364,7 @@ interactions: Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.31] + AZURECLI/2.0.32] accept-language: [en-US] method: DELETE uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2017-05-10 @@ -362,12 +373,12 @@ interactions: headers: cache-control: [no-cache] content-length: ['0'] - date: ['Sat, 07 Apr 2018 00:14:21 GMT'] + date: ['Tue, 01 May 2018 21:49:39 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTElURVNUOjJFUkdLWjRPMzNBUlFYTTNYUUFJTjYzVjVXRlpISkdEMlNOUFdLWHwyMkU5QzM0MjVBQ0Q1N0U4LVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTElURVNUOjJFUkdQUjJSNjM0RUdHUkpFWTJKWDdJWkJMREFZR01GUE80T1oyM3w2QTZCNkNBRDM4RTNBNDEyLVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-writes: ['1199'] + x-ms-ratelimit-remaining-subscription-writes: ['1196'] status: {code: 202, message: Accepted} version: 1 diff --git a/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_blob_soft_delete.yaml b/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_blob_soft_delete.yaml index 59e6c9f00f4..6bf6731b419 100644 --- a/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_blob_soft_delete.yaml +++ b/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_blob_soft_delete.yaml @@ -1,30 +1,32 @@ interactions: - request: - body: '{"location": "westus", "tags": {"use": "az-test"}}' + body: '{"location": "westus", "tags": {"product": "azurecli", "cause": "automation", + "date": "2018-05-01T21:49:39Z"}}' headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] CommandName: [group create] Connection: [keep-alive] - Content-Length: ['50'] + Content-Length: ['110'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.27] + msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2017-05-10 response: - body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"westus","tags":{"use":"az-test"},"properties":{"provisioningState":"Succeeded"}}'} + body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"westus","tags":{"product":"azurecli","cause":"automation","date":"2018-05-01T21:49:39Z"},"properties":{"provisioningState":"Succeeded"}}'} headers: cache-control: [no-cache] - content-length: ['328'] + content-length: ['384'] content-type: [application/json; charset=utf-8] - date: ['Thu, 08 Feb 2018 19:31:29 GMT'] + date: ['Tue, 01 May 2018 21:49:40 GMT'] expires: ['-1'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1186'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1197'] status: {code: 201, message: Created} - request: body: '{"sku": {"name": "Standard_LRS"}, "kind": "Storage", "location": "westus", @@ -37,7 +39,7 @@ interactions: Content-Length: ['125'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002?api-version=2017-10-01 @@ -47,14 +49,15 @@ interactions: cache-control: [no-cache] content-length: ['0'] content-type: [text/plain; charset=utf-8] - date: ['Thu, 08 Feb 2018 19:31:31 GMT'] + date: ['Tue, 01 May 2018 21:49:41 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/a8daa5ce-f344-45ea-a9bc-fb5c1a16a9f3?monitor=true&api-version=2017-10-01'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/67812c24-890c-48ed-9849-0005e7354367?monitor=true&api-version=2017-10-01'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 Microsoft-HTTPAPI/2.0'] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1195'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1198'] status: {code: 202, message: Accepted} - request: body: null @@ -65,44 +68,17 @@ interactions: Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/a8daa5ce-f344-45ea-a9bc-fb5c1a16a9f3?monitor=true&api-version=2017-10-01 + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/67812c24-890c-48ed-9849-0005e7354367?monitor=true&api-version=2017-10-01 response: - body: {string: ''} - headers: - cache-control: [no-cache] - content-length: ['0'] - content-type: [text/plain; charset=utf-8] - date: ['Thu, 08 Feb 2018 19:31:49 GMT'] - expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/a8daa5ce-f344-45ea-a9bc-fb5c1a16a9f3?monitor=true&api-version=2017-10-01'] - pragma: [no-cache] - server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 - Microsoft-HTTPAPI/2.0'] - strict-transport-security: [max-age=31536000; includeSubDomains] - status: {code: 202, message: Accepted} -- request: - body: null - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [storage account create] - Connection: [keep-alive] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] - accept-language: [en-US] - method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/a8daa5ce-f344-45ea-a9bc-fb5c1a16a9f3?monitor=true&api-version=2017-10-01 - response: - body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T19:31:31.9097589Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T19:31:31.9097589Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T19:31:31.8628627Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} + body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:49:41.9342494Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:49:41.9342494Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:49:41.8561236Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} headers: cache-control: [no-cache] content-length: ['1231'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 19:32:06 GMT'] + date: ['Tue, 01 May 2018 21:49:59 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -110,6 +86,7 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] + x-content-type-options: [nosniff] status: {code: 200, message: OK} - request: body: null @@ -121,17 +98,17 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: POST uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002/listKeys?api-version=2017-10-01 response: - body: {string: '{"keys":[{"keyName":"key1","value":"zoX/BuIQQNp6F1/u0onvdZw324M3I+0M1oSUMzhItBY3H6lpHnGPylVYqdglQVRGps8GliIcvgjKIgbaK8hyow==","permissions":"FULL"},{"keyName":"key2","value":"XbkNiuQaxUMRqNldTN8uwn71GuiAhngso8QuVxOiHdXEfY/MPTQLh2GZ23brHygh7Lp++ZEmQidBWC537+GOyw==","permissions":"FULL"}]}'} + body: {string: '{"keys":[{"keyName":"key1","value":"qf+rZABzdZKtF9qE66GwfTkLDDn1zrL1gdhmcDMILeI52dsGc9+YJ9MCg+qtQ8vW4pa4Zr3uE8A2hZaB2ZaM/Q==","permissions":"FULL"},{"keyName":"key2","value":"zCQl9+O2FWIJFZvwRAIlcJwUe/j+wBKWmmCrCuKFVPjaiMHcMnJGeKGpKJbOgG90VP1DO1pdFAp2qCNqLC9kOQ==","permissions":"FULL"}]}'} headers: cache-control: [no-cache] content-length: ['288'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 19:32:07 GMT'] + date: ['Tue, 01 May 2018 21:50:00 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -139,7 +116,8 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] - x-ms-ratelimit-remaining-subscription-writes: ['1190'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1198'] status: {code: 200, message: OK} - request: body: null @@ -151,17 +129,17 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: POST uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002/listKeys?api-version=2017-10-01 response: - body: {string: '{"keys":[{"keyName":"key1","value":"zoX/BuIQQNp6F1/u0onvdZw324M3I+0M1oSUMzhItBY3H6lpHnGPylVYqdglQVRGps8GliIcvgjKIgbaK8hyow==","permissions":"FULL"},{"keyName":"key2","value":"XbkNiuQaxUMRqNldTN8uwn71GuiAhngso8QuVxOiHdXEfY/MPTQLh2GZ23brHygh7Lp++ZEmQidBWC537+GOyw==","permissions":"FULL"}]}'} + body: {string: '{"keys":[{"keyName":"key1","value":"qf+rZABzdZKtF9qE66GwfTkLDDn1zrL1gdhmcDMILeI52dsGc9+YJ9MCg+qtQ8vW4pa4Zr3uE8A2hZaB2ZaM/Q==","permissions":"FULL"},{"keyName":"key2","value":"zCQl9+O2FWIJFZvwRAIlcJwUe/j+wBKWmmCrCuKFVPjaiMHcMnJGeKGpKJbOgG90VP1DO1pdFAp2qCNqLC9kOQ==","permissions":"FULL"}]}'} headers: cache-control: [no-cache] content-length: ['288'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 19:32:10 GMT'] + date: ['Tue, 01 May 2018 21:50:00 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -169,27 +147,29 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] - x-ms-ratelimit-remaining-subscription-writes: ['1192'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1199'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:32:11 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:50:01 GMT'] + x-ms-version: ['2017-11-09'] method: PUT uri: https://clitest000002.blob.core.windows.net/cont000003?restype=container response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 19:32:11 GMT'] - etag: ['"0x8D56F2AA6BC34C0"'] - last-modified: ['Thu, 08 Feb 2018 19:32:11 GMT'] + date: ['Tue, 01 May 2018 21:50:01 GMT'] + etag: ['"0x8D5AFAD7DD3A5C1"'] + last-modified: ['Tue, 01 May 2018 21:50:01 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 201, message: Created} - request: body: "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ @@ -222,55 +202,59 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['1024'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] x-ms-blob-type: [BlockBlob] - x-ms-date: ['Thu, 08 Feb 2018 19:32:11 GMT'] - x-ms-version: ['2017-07-29'] + x-ms-date: ['Tue, 01 May 2018 21:50:02 GMT'] + x-ms-version: ['2017-11-09'] method: PUT uri: https://clitest000002.blob.core.windows.net/cont000003/blob000004 response: body: {string: ''} headers: content-md5: [DzQ7CTESaiDxM9Z8KwGKOw==] - date: ['Thu, 08 Feb 2018 19:32:12 GMT'] - etag: ['"0x8D56F2AA6F1F969"'] - last-modified: ['Thu, 08 Feb 2018 19:32:12 GMT'] + date: ['Tue, 01 May 2018 21:50:01 GMT'] + etag: ['"0x8D5AFAD7E48DFBF"'] + last-modified: ['Tue, 01 May 2018 21:50:02 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-request-server-encrypted: ['true'] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 201, message: Created} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:32:12 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:50:02 GMT'] + x-ms-version: ['2017-11-09'] method: GET uri: https://clitest000002.blob.core.windows.net/cont000003?restype=container&comp=list response: body: {string: "\uFEFFblob000004Thu,\ - \ 08 Feb 2018 19:32:12 GMT0x8D56F2AA6F1F9691024application/octet-streamblob000004Tue,\ + \ 01 May 2018 21:50:02 GMTTue, 01 May 2018\ + \ 21:50:02 GMT0x8D5AFAD7E48DFBF1024application/octet-streamDzQ7CTESaiDxM9Z8KwGKOw==BlockBlobunlockedavailabletrue"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 19:32:11 GMT'] + date: ['Tue, 01 May 2018 21:50:02 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:32:12 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:50:03 GMT'] + x-ms-version: ['2017-11-09'] method: GET uri: https://clitest000002.blob.core.windows.net/?restype=service&comp=properties response: @@ -278,10 +262,10 @@ interactions: \ />false"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 19:32:12 GMT'] + date: ['Tue, 01 May 2018 21:50:02 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: ' @@ -290,26 +274,28 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['176'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:32:12 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:50:03 GMT'] + x-ms-version: ['2017-11-09'] method: PUT uri: https://clitest000002.blob.core.windows.net/?restype=service&comp=properties response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 19:32:12 GMT'] + date: ['Tue, 01 May 2018 21:50:02 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 202, message: Accepted} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:32:12 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:50:03 GMT'] + x-ms-version: ['2017-11-09'] method: GET uri: https://clitest000002.blob.core.windows.net/?restype=service&comp=properties response: @@ -317,18 +303,19 @@ interactions: \ />true2"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 19:32:12 GMT'] + date: ['Tue, 01 May 2018 21:50:03 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:32:12 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:50:04 GMT'] + x-ms-version: ['2017-11-09'] method: GET uri: https://clitest000002.blob.core.windows.net/?restype=service&comp=properties response: @@ -336,37 +323,39 @@ interactions: \ />true2"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 19:32:12 GMT'] + date: ['Tue, 01 May 2018 21:50:04 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:32:13 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:50:04 GMT'] + x-ms-version: ['2017-11-09'] method: DELETE uri: https://clitest000002.blob.core.windows.net/cont000003/blob000004 response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 19:32:13 GMT'] + date: ['Tue, 01 May 2018 21:50:04 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-delete-type-permanent: ['false'] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 202, message: Accepted} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:32:13 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:50:05 GMT'] + x-ms-version: ['2017-11-09'] method: GET uri: https://clitest000002.blob.core.windows.net/cont000003?restype=container&comp=list response: @@ -375,77 +364,82 @@ interactions: cont000003\">"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 19:32:13 GMT'] + date: ['Tue, 01 May 2018 21:50:05 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:32:13 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:50:05 GMT'] + x-ms-version: ['2017-11-09'] method: GET uri: https://clitest000002.blob.core.windows.net/cont000003?restype=container&comp=list&include=deleted response: body: {string: "\uFEFFblob000004trueThu,\ - \ 08 Feb 2018 19:32:12 GMT0x8D56F2AA6F1F9691024application/octet-streamblob000004trueTue,\ + \ 01 May 2018 21:50:02 GMTTue, 01 May 2018\ + \ 21:50:02 GMT0x8D5AFAD7E48DFBF1024application/octet-streamDzQ7CTESaiDxM9Z8KwGKOw==BlockBlobtrueThu,\ - \ 08 Feb 2018 19:32:13 GMT1BlockBlobtrueTue,\ + \ 01 May 2018 21:50:04 GMT1"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 19:32:13 GMT'] + date: ['Tue, 01 May 2018 21:50:05 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:32:14 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:50:06 GMT'] + x-ms-version: ['2017-11-09'] method: PUT uri: https://clitest000002.blob.core.windows.net/cont000003/blob000004?comp=undelete response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 19:32:14 GMT'] + date: ['Tue, 01 May 2018 21:50:06 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:32:14 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:50:07 GMT'] + x-ms-version: ['2017-11-09'] method: GET uri: https://clitest000002.blob.core.windows.net/cont000003?restype=container&comp=list response: body: {string: "\uFEFFblob000004Thu,\ - \ 08 Feb 2018 19:32:12 GMT0x8D56F2AA6F1F9691024application/octet-streamblob000004Tue,\ + \ 01 May 2018 21:50:02 GMTTue, 01 May 2018\ + \ 21:50:02 GMT0x8D5AFAD7E48DFBF1024application/octet-streamDzQ7CTESaiDxM9Z8KwGKOw==BlockBlobunlockedavailabletrue"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 19:32:14 GMT'] + date: ['Tue, 01 May 2018 21:50:07 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null @@ -457,8 +451,8 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.27] + msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: DELETE uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2017-05-10 @@ -467,11 +461,12 @@ interactions: headers: cache-control: [no-cache] content-length: ['0'] - date: ['Thu, 08 Feb 2018 19:32:14 GMT'] + date: ['Tue, 01 May 2018 21:50:07 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTElURVNUOjJFUkdZWkZJSVhSR0U0WE5ZVkhSUEpPSkdPSklBTUVSTjZUNlJDRHw1QTQzRENGQkEyMUNEMThCLVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTElURVNUOjJFUkdaQkNSRUJLN09NQ0JGVVFMSTRSUVlMSEdNTkEyRUs3TjVYQ3xERkQ3RkIyMTUyNkQ2Q0EyLVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1191'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1197'] status: {code: 202, message: Accepted} version: 1 diff --git a/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_blob_upload_midsize_file.yaml b/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_blob_upload_midsize_file.yaml index c72843f052f..5085add5b0a 100644 --- a/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_blob_upload_midsize_file.yaml +++ b/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_blob_upload_midsize_file.yaml @@ -1,30 +1,32 @@ interactions: - request: - body: '{"location": "westus", "tags": {"use": "az-test"}}' + body: '{"location": "westus", "tags": {"product": "azurecli", "cause": "automation", + "date": "2018-05-01T21:50:08Z"}}' headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] CommandName: [group create] Connection: [keep-alive] - Content-Length: ['50'] + Content-Length: ['110'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.27] + msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2017-05-10 response: - body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"westus","tags":{"use":"az-test"},"properties":{"provisioningState":"Succeeded"}}'} + body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"westus","tags":{"product":"azurecli","cause":"automation","date":"2018-05-01T21:50:08Z"},"properties":{"provisioningState":"Succeeded"}}'} headers: cache-control: [no-cache] - content-length: ['328'] + content-length: ['384'] content-type: [application/json; charset=utf-8] - date: ['Thu, 08 Feb 2018 19:32:16 GMT'] + date: ['Tue, 01 May 2018 21:50:08 GMT'] expires: ['-1'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1194'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1197'] status: {code: 201, message: Created} - request: body: '{"sku": {"name": "Standard_LRS"}, "kind": "Storage", "location": "westus", @@ -37,7 +39,7 @@ interactions: Content-Length: ['125'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002?api-version=2017-10-01 @@ -47,41 +49,15 @@ interactions: cache-control: [no-cache] content-length: ['0'] content-type: [text/plain; charset=utf-8] - date: ['Thu, 08 Feb 2018 19:32:17 GMT'] + date: ['Tue, 01 May 2018 21:50:12 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/61ac7975-3916-4dc7-bdc6-10e4d05d0601?monitor=true&api-version=2017-10-01'] - pragma: [no-cache] - server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 - Microsoft-HTTPAPI/2.0'] - strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1189'] - status: {code: 202, message: Accepted} -- request: - body: null - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [storage account create] - Connection: [keep-alive] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] - accept-language: [en-US] - method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/61ac7975-3916-4dc7-bdc6-10e4d05d0601?monitor=true&api-version=2017-10-01 - response: - body: {string: ''} - headers: - cache-control: [no-cache] - content-length: ['0'] - content-type: [text/plain; charset=utf-8] - date: ['Thu, 08 Feb 2018 19:32:35 GMT'] - expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/61ac7975-3916-4dc7-bdc6-10e4d05d0601?monitor=true&api-version=2017-10-01'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/d2cb0d08-1dbb-463a-8515-c7c3925f6e97?monitor=true&api-version=2017-10-01'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 Microsoft-HTTPAPI/2.0'] strict-transport-security: [max-age=31536000; includeSubDomains] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1193'] status: {code: 202, message: Accepted} - request: body: null @@ -92,17 +68,17 @@ interactions: Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/61ac7975-3916-4dc7-bdc6-10e4d05d0601?monitor=true&api-version=2017-10-01 + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/d2cb0d08-1dbb-463a-8515-c7c3925f6e97?monitor=true&api-version=2017-10-01 response: - body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T19:32:17.8634316Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T19:32:17.8634316Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T19:32:17.8165491Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} + body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:50:12.9813351Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:50:12.9813351Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:50:12.9031978Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} headers: cache-control: [no-cache] content-length: ['1231'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 19:32:51 GMT'] + date: ['Tue, 01 May 2018 21:50:29 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -110,6 +86,7 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] + x-content-type-options: [nosniff] status: {code: 200, message: OK} - request: body: null @@ -121,17 +98,17 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: POST uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002/listKeys?api-version=2017-10-01 response: - body: {string: '{"keys":[{"keyName":"key1","value":"Ur7LsInvxGhacID5lpL8Aje1Xsl6NNAIfo+RtPWdpeoUmiGhBGkJ9/PQt+gJPFVWHwKo+g07PFyWj6LK6iFlXQ==","permissions":"FULL"},{"keyName":"key2","value":"B7HOmVbjDvHp8TGYKUHAiN7z6Ixx7j3M4w2n915R8pRynF9JwO5U07uFi0tWDfx+Olh3YgU0Oh5tv2UY6oZqSw==","permissions":"FULL"}]}'} + body: {string: '{"keys":[{"keyName":"key1","value":"wRXnasKn+uHsAFzJlB0u452e3gzhrQgPSPautk76CDMNoCxVMDPdh9Sg9oDCQFpskuOfm61yXzsTD1GcfLU4mA==","permissions":"FULL"},{"keyName":"key2","value":"IkNMTb0ze5MM6VxN5vSlqxb4NzFLjwyUgn6VZjmTpCOoDwC/lXxIsJTH52C9kDxJxxoogWxa1r2QEergHPJ8rw==","permissions":"FULL"}]}'} headers: cache-control: [no-cache] content-length: ['288'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 19:32:53 GMT'] + date: ['Tue, 01 May 2018 21:50:31 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -139,7 +116,8 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] - x-ms-ratelimit-remaining-subscription-writes: ['1185'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1194'] status: {code: 200, message: OK} - request: body: null @@ -151,17 +129,17 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: POST uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002/listKeys?api-version=2017-10-01 response: - body: {string: '{"keys":[{"keyName":"key1","value":"Ur7LsInvxGhacID5lpL8Aje1Xsl6NNAIfo+RtPWdpeoUmiGhBGkJ9/PQt+gJPFVWHwKo+g07PFyWj6LK6iFlXQ==","permissions":"FULL"},{"keyName":"key2","value":"B7HOmVbjDvHp8TGYKUHAiN7z6Ixx7j3M4w2n915R8pRynF9JwO5U07uFi0tWDfx+Olh3YgU0Oh5tv2UY6oZqSw==","permissions":"FULL"}]}'} + body: {string: '{"keys":[{"keyName":"key1","value":"wRXnasKn+uHsAFzJlB0u452e3gzhrQgPSPautk76CDMNoCxVMDPdh9Sg9oDCQFpskuOfm61yXzsTD1GcfLU4mA==","permissions":"FULL"},{"keyName":"key2","value":"IkNMTb0ze5MM6VxN5vSlqxb4NzFLjwyUgn6VZjmTpCOoDwC/lXxIsJTH52C9kDxJxxoogWxa1r2QEergHPJ8rw==","permissions":"FULL"}]}'} headers: cache-control: [no-cache] content-length: ['288'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 19:32:57 GMT'] + date: ['Tue, 01 May 2018 21:50:32 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -169,45 +147,48 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] - x-ms-ratelimit-remaining-subscription-writes: ['1193'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1197'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:32:57 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:50:32 GMT'] + x-ms-version: ['2017-11-09'] method: PUT uri: https://clitest000002.blob.core.windows.net/cont000004?restype=container response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 19:32:58 GMT'] - etag: ['"0x8D56F2AC268C0EE"'] - last-modified: ['Thu, 08 Feb 2018 19:32:58 GMT'] + date: ['Tue, 01 May 2018 21:50:32 GMT'] + etag: ['"0x8D5AFAD90808EA6"'] + last-modified: ['Tue, 01 May 2018 21:50:33 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 201, message: Created} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:32:58 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:50:33 GMT'] + x-ms-version: ['2017-11-09'] method: HEAD uri: https://clitest000002.blob.core.windows.net/cont000004/blob000003 response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 19:32:58 GMT'] + date: ['Tue, 01 May 2018 21:50:33 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-error-code: [BlobNotFound] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 404, message: The specified blob does not exist.} - request: body: '!!! The request body has been omitted from the recording because its size @@ -215,31 +196,33 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['4194304'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] x-ms-blob-type: [BlockBlob] - x-ms-date: ['Thu, 08 Feb 2018 19:32:58 GMT'] - x-ms-version: ['2017-07-29'] + x-ms-date: ['Tue, 01 May 2018 21:50:33 GMT'] + x-ms-version: ['2017-11-09'] method: PUT uri: https://clitest000002.blob.core.windows.net/cont000004/blob000003 response: body: {string: ''} headers: content-md5: [tc+p1sj+vWGPkawoQ9UKHA==] - date: ['Thu, 08 Feb 2018 19:32:59 GMT'] - etag: ['"0x8D56F2AC2F8A79D"'] - last-modified: ['Thu, 08 Feb 2018 19:32:59 GMT'] + date: ['Tue, 01 May 2018 21:50:35 GMT'] + etag: ['"0x8D5AFAD91EC6872"'] + last-modified: ['Tue, 01 May 2018 21:50:35 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-request-server-encrypted: ['true'] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 201, message: Created} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:32:59 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:50:35 GMT'] + x-ms-version: ['2017-11-09'] method: HEAD uri: https://clitest000002.blob.core.windows.net/cont000004/blob000003 response: @@ -249,47 +232,51 @@ interactions: content-length: ['4194304'] content-md5: [tc+p1sj+vWGPkawoQ9UKHA==] content-type: [application/octet-stream] - date: ['Thu, 08 Feb 2018 19:32:58 GMT'] - etag: ['"0x8D56F2AC2F8A79D"'] - last-modified: ['Thu, 08 Feb 2018 19:32:59 GMT'] + date: ['Tue, 01 May 2018 21:50:35 GMT'] + etag: ['"0x8D5AFAD91EC6872"'] + last-modified: ['Tue, 01 May 2018 21:50:35 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] x-ms-blob-type: [BlockBlob] + x-ms-creation-time: ['Tue, 01 May 2018 21:50:35 GMT'] x-ms-lease-state: [available] x-ms-lease-status: [unlocked] x-ms-server-encrypted: ['true'] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:32:59 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:50:36 GMT'] + x-ms-version: ['2017-11-09'] method: GET uri: https://clitest000002.blob.core.windows.net/cont000004?restype=container&comp=list&maxresults=1 response: body: {string: "\uFEFF1blob000003Thu,\ - \ 08 Feb 2018 19:32:59 GMT0x8D56F2AC2F8A79D4194304application/octet-stream1blob000003Tue,\ + \ 01 May 2018 21:50:35 GMTTue, 01 May 2018\ + \ 21:50:35 GMT0x8D5AFAD91EC68724194304application/octet-streamtc+p1sj+vWGPkawoQ9UKHA==BlockBlobunlockedavailabletrue"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 19:32:59 GMT'] + date: ['Tue, 01 May 2018 21:50:36 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:32:59 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:50:36 GMT'] + x-ms-version: ['2017-11-09'] method: HEAD uri: https://clitest000002.blob.core.windows.net/cont000004/blob000003 response: @@ -299,23 +286,25 @@ interactions: content-length: ['4194304'] content-md5: [tc+p1sj+vWGPkawoQ9UKHA==] content-type: [application/octet-stream] - date: ['Thu, 08 Feb 2018 19:33:00 GMT'] - etag: ['"0x8D56F2AC2F8A79D"'] - last-modified: ['Thu, 08 Feb 2018 19:32:59 GMT'] + date: ['Tue, 01 May 2018 21:50:36 GMT'] + etag: ['"0x8D5AFAD91EC6872"'] + last-modified: ['Tue, 01 May 2018 21:50:35 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] x-ms-blob-type: [BlockBlob] + x-ms-creation-time: ['Tue, 01 May 2018 21:50:35 GMT'] x-ms-lease-state: [available] x-ms-lease-status: [unlocked] x-ms-server-encrypted: ['true'] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:33:00 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:50:37 GMT'] + x-ms-version: ['2017-11-09'] method: HEAD uri: https://clitest000002.blob.core.windows.net/cont000004/blob000003 response: @@ -325,45 +314,48 @@ interactions: content-length: ['4194304'] content-md5: [tc+p1sj+vWGPkawoQ9UKHA==] content-type: [application/octet-stream] - date: ['Thu, 08 Feb 2018 19:33:00 GMT'] - etag: ['"0x8D56F2AC2F8A79D"'] - last-modified: ['Thu, 08 Feb 2018 19:32:59 GMT'] + date: ['Tue, 01 May 2018 21:50:37 GMT'] + etag: ['"0x8D5AFAD91EC6872"'] + last-modified: ['Tue, 01 May 2018 21:50:35 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] x-ms-blob-type: [BlockBlob] + x-ms-creation-time: ['Tue, 01 May 2018 21:50:35 GMT'] x-ms-lease-state: [available] x-ms-lease-status: [unlocked] x-ms-server-encrypted: ['true'] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] x-ms-blob-content-md5: [tc+p1sj+vWGPkawoQ9UKHA==] x-ms-blob-content-type: [application/test-content] - x-ms-date: ['Thu, 08 Feb 2018 19:33:00 GMT'] - x-ms-version: ['2017-07-29'] + x-ms-date: ['Tue, 01 May 2018 21:50:38 GMT'] + x-ms-version: ['2017-11-09'] method: PUT uri: https://clitest000002.blob.core.windows.net/cont000004/blob000003?comp=properties response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 19:33:00 GMT'] - etag: ['"0x8D56F2AC3F9C77F"'] - last-modified: ['Thu, 08 Feb 2018 19:33:01 GMT'] + date: ['Tue, 01 May 2018 21:50:38 GMT'] + etag: ['"0x8D5AFAD93C17DFB"'] + last-modified: ['Tue, 01 May 2018 21:50:38 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:33:00 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:50:38 GMT'] + x-ms-version: ['2017-11-09'] method: HEAD uri: https://clitest000002.blob.core.windows.net/cont000004/blob000003 response: @@ -373,23 +365,25 @@ interactions: content-length: ['4194304'] content-md5: [tc+p1sj+vWGPkawoQ9UKHA==] content-type: [application/test-content] - date: ['Thu, 08 Feb 2018 19:33:00 GMT'] - etag: ['"0x8D56F2AC3F9C77F"'] - last-modified: ['Thu, 08 Feb 2018 19:33:01 GMT'] + date: ['Tue, 01 May 2018 21:50:38 GMT'] + etag: ['"0x8D5AFAD93C17DFB"'] + last-modified: ['Tue, 01 May 2018 21:50:38 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] x-ms-blob-type: [BlockBlob] + x-ms-creation-time: ['Tue, 01 May 2018 21:50:35 GMT'] x-ms-lease-state: [available] x-ms-lease-status: [unlocked] x-ms-server-encrypted: ['true'] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:33:01 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:50:39 GMT'] + x-ms-version: ['2017-11-09'] method: GET uri: https://clitest000002.blob.core.windows.net/?restype=service&comp=properties response: @@ -397,19 +391,20 @@ interactions: \ />false"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 19:33:01 GMT'] + date: ['Tue, 01 May 2018 21:50:39 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:33:01 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:50:39 GMT'] x-ms-range: [bytes=0-33554431] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] method: GET uri: https://clitest000002.blob.core.windows.net/cont000004/blob000003 response: @@ -421,25 +416,27 @@ interactions: content-length: ['4194304'] content-range: [bytes 0-4194303/4194304] content-type: [application/test-content] - date: ['Thu, 08 Feb 2018 19:33:01 GMT'] - etag: ['"0x8D56F2AC3F9C77F"'] - last-modified: ['Thu, 08 Feb 2018 19:33:01 GMT'] + date: ['Tue, 01 May 2018 21:50:39 GMT'] + etag: ['"0x8D5AFAD93C17DFB"'] + last-modified: ['Tue, 01 May 2018 21:50:38 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] x-ms-blob-content-md5: [tc+p1sj+vWGPkawoQ9UKHA==] x-ms-blob-type: [BlockBlob] + x-ms-creation-time: ['Tue, 01 May 2018 21:50:35 GMT'] x-ms-lease-state: [available] x-ms-lease-status: [unlocked] x-ms-server-encrypted: ['true'] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 206, message: Partial Content} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:33:02 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:50:41 GMT'] x-ms-range: [bytes=10-499] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] method: GET uri: https://clitest000002.blob.core.windows.net/cont000004/blob000003 response: @@ -462,16 +459,17 @@ interactions: content-length: ['490'] content-range: [bytes 10-499/4194304] content-type: [application/test-content] - date: ['Thu, 08 Feb 2018 19:33:02 GMT'] - etag: ['"0x8D56F2AC3F9C77F"'] - last-modified: ['Thu, 08 Feb 2018 19:33:01 GMT'] + date: ['Tue, 01 May 2018 21:50:41 GMT'] + etag: ['"0x8D5AFAD93C17DFB"'] + last-modified: ['Tue, 01 May 2018 21:50:38 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] x-ms-blob-content-md5: [tc+p1sj+vWGPkawoQ9UKHA==] x-ms-blob-type: [BlockBlob] + x-ms-creation-time: ['Tue, 01 May 2018 21:50:35 GMT'] x-ms-lease-state: [available] x-ms-lease-status: [unlocked] x-ms-server-encrypted: ['true'] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 206, message: Partial Content} - request: body: null @@ -483,8 +481,8 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.27] + msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: DELETE uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2017-05-10 @@ -493,11 +491,12 @@ interactions: headers: cache-control: [no-cache] content-length: ['0'] - date: ['Thu, 08 Feb 2018 19:33:02 GMT'] + date: ['Tue, 01 May 2018 21:50:42 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTElURVNUOjJFUkdWN01GTjdNVkE2SEtYQTM0UkpWSUVYMzZTQVhWNEc0R01ZVnxGRjFCNUY2Q0FCQTU5Mjc5LVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTElURVNUOjJFUkdFVVZXVUlTRUUyWlVQSTdQUUJPWVpFWEVYUE9GSVdJVlJQTnw3ODBEOTlGNjg5OEREQzc5LVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] + x-content-type-options: [nosniff] x-ms-ratelimit-remaining-subscription-writes: ['1196'] status: {code: 202, message: Accepted} version: 1 diff --git a/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_blob_upload_small_file.yaml b/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_blob_upload_small_file.yaml index 6d5b1479ca2..09bb3a15605 100644 --- a/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_blob_upload_small_file.yaml +++ b/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_blob_upload_small_file.yaml @@ -1,30 +1,32 @@ interactions: - request: - body: '{"location": "westus", "tags": {"use": "az-test"}}' + body: '{"location": "westus", "tags": {"product": "azurecli", "cause": "automation", + "date": "2018-05-01T21:50:42Z"}}' headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] CommandName: [group create] Connection: [keep-alive] - Content-Length: ['50'] + Content-Length: ['110'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.27] + msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2017-05-10 response: - body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"westus","tags":{"use":"az-test"},"properties":{"provisioningState":"Succeeded"}}'} + body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"westus","tags":{"product":"azurecli","cause":"automation","date":"2018-05-01T21:50:42Z"},"properties":{"provisioningState":"Succeeded"}}'} headers: cache-control: [no-cache] - content-length: ['328'] + content-length: ['384'] content-type: [application/json; charset=utf-8] - date: ['Thu, 08 Feb 2018 19:33:04 GMT'] + date: ['Tue, 01 May 2018 21:50:43 GMT'] expires: ['-1'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1194'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1197'] status: {code: 201, message: Created} - request: body: '{"sku": {"name": "Standard_LRS"}, "kind": "Storage", "location": "westus", @@ -37,7 +39,7 @@ interactions: Content-Length: ['125'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002?api-version=2017-10-01 @@ -47,14 +49,15 @@ interactions: cache-control: [no-cache] content-length: ['0'] content-type: [text/plain; charset=utf-8] - date: ['Thu, 08 Feb 2018 19:33:04 GMT'] + date: ['Tue, 01 May 2018 21:50:45 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/b3813c61-d24a-4a6a-b393-8ae2012c775e?monitor=true&api-version=2017-10-01'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/a3e66f58-ff0e-4387-9e2e-de3b957ff650?monitor=true&api-version=2017-10-01'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 Microsoft-HTTPAPI/2.0'] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1194'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1196'] status: {code: 202, message: Accepted} - request: body: null @@ -65,17 +68,17 @@ interactions: Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/b3813c61-d24a-4a6a-b393-8ae2012c775e?monitor=true&api-version=2017-10-01 + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/a3e66f58-ff0e-4387-9e2e-de3b957ff650?monitor=true&api-version=2017-10-01 response: - body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T19:33:05.2234370Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T19:33:05.2234370Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T19:33:05.1765750Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} + body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:50:45.5284344Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:50:45.5284344Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:50:45.4346559Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} headers: cache-control: [no-cache] content-length: ['1231'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 19:33:22 GMT'] + date: ['Tue, 01 May 2018 21:51:02 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -83,6 +86,7 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] + x-content-type-options: [nosniff] status: {code: 200, message: OK} - request: body: null @@ -94,17 +98,17 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: POST uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002/listKeys?api-version=2017-10-01 response: - body: {string: '{"keys":[{"keyName":"key1","value":"LA5+NYEamcl0Wtl8VJccTfEAB0aUcHoZ1nPcRr2Mu66Sudk7EYA/cvQ/T+cekNBz9zSH2GbKUDykkbpRjpLIwg==","permissions":"FULL"},{"keyName":"key2","value":"MCsIoNqh2jhX4bFJqQdNUzKXfMFP7b8F/MAr94J22axeaL2NND9Rj2MLhe6ejC3oCN2oCyllWnRMfYn62rr0KQ==","permissions":"FULL"}]}'} + body: {string: '{"keys":[{"keyName":"key1","value":"2mimZZUxn/JURj3ieoLKDLHvhOqq7YF+KiSObdcWZPpq6j95Bs+4quDv2VWy+IVb2L/mydR+7GwDEAV5z5n4SA==","permissions":"FULL"},{"keyName":"key2","value":"4haHUQSrifOctcUoGTnqmHGlstV78WSzvXT/iQ2XUOj9t1SmxXFZEepiDFABNa7BgJ+fDlWeSO/QEaZKWVet6w==","permissions":"FULL"}]}'} headers: cache-control: [no-cache] content-length: ['288'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 19:33:23 GMT'] + date: ['Tue, 01 May 2018 21:51:03 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -112,7 +116,8 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] - x-ms-ratelimit-remaining-subscription-writes: ['1193'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1196'] status: {code: 200, message: OK} - request: body: null @@ -124,17 +129,17 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: POST uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002/listKeys?api-version=2017-10-01 response: - body: {string: '{"keys":[{"keyName":"key1","value":"LA5+NYEamcl0Wtl8VJccTfEAB0aUcHoZ1nPcRr2Mu66Sudk7EYA/cvQ/T+cekNBz9zSH2GbKUDykkbpRjpLIwg==","permissions":"FULL"},{"keyName":"key2","value":"MCsIoNqh2jhX4bFJqQdNUzKXfMFP7b8F/MAr94J22axeaL2NND9Rj2MLhe6ejC3oCN2oCyllWnRMfYn62rr0KQ==","permissions":"FULL"}]}'} + body: {string: '{"keys":[{"keyName":"key1","value":"2mimZZUxn/JURj3ieoLKDLHvhOqq7YF+KiSObdcWZPpq6j95Bs+4quDv2VWy+IVb2L/mydR+7GwDEAV5z5n4SA==","permissions":"FULL"},{"keyName":"key2","value":"4haHUQSrifOctcUoGTnqmHGlstV78WSzvXT/iQ2XUOj9t1SmxXFZEepiDFABNa7BgJ+fDlWeSO/QEaZKWVet6w==","permissions":"FULL"}]}'} headers: cache-control: [no-cache] content-length: ['288'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 19:33:23 GMT'] + date: ['Tue, 01 May 2018 21:51:04 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -142,45 +147,48 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] - x-ms-ratelimit-remaining-subscription-writes: ['1188'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1195'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:33:24 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:51:04 GMT'] + x-ms-version: ['2017-11-09'] method: PUT uri: https://clitest000002.blob.core.windows.net/cont000004?restype=container response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 19:33:24 GMT'] - etag: ['"0x8D56F2AD2618067"'] - last-modified: ['Thu, 08 Feb 2018 19:33:25 GMT'] + date: ['Tue, 01 May 2018 21:51:04 GMT'] + etag: ['"0x8D5AFADA3A22AA1"'] + last-modified: ['Tue, 01 May 2018 21:51:05 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 201, message: Created} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:33:25 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:51:05 GMT'] + x-ms-version: ['2017-11-09'] method: HEAD uri: https://clitest000002.blob.core.windows.net/cont000004/blob000003 response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 19:33:24 GMT'] + date: ['Tue, 01 May 2018 21:51:05 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-error-code: [BlobNotFound] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 404, message: The specified blob does not exist.} - request: body: "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ @@ -213,31 +221,33 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['1024'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] x-ms-blob-type: [BlockBlob] - x-ms-date: ['Thu, 08 Feb 2018 19:33:25 GMT'] - x-ms-version: ['2017-07-29'] + x-ms-date: ['Tue, 01 May 2018 21:51:05 GMT'] + x-ms-version: ['2017-11-09'] method: PUT uri: https://clitest000002.blob.core.windows.net/cont000004/blob000003 response: body: {string: ''} headers: content-md5: [DzQ7CTESaiDxM9Z8KwGKOw==] - date: ['Thu, 08 Feb 2018 19:33:24 GMT'] - etag: ['"0x8D56F2AD2B1805D"'] - last-modified: ['Thu, 08 Feb 2018 19:33:25 GMT'] + date: ['Tue, 01 May 2018 21:51:05 GMT'] + etag: ['"0x8D5AFADA4139239"'] + last-modified: ['Tue, 01 May 2018 21:51:05 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-request-server-encrypted: ['true'] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 201, message: Created} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:33:25 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:51:06 GMT'] + x-ms-version: ['2017-11-09'] method: HEAD uri: https://clitest000002.blob.core.windows.net/cont000004/blob000003 response: @@ -247,47 +257,51 @@ interactions: content-length: ['1024'] content-md5: [DzQ7CTESaiDxM9Z8KwGKOw==] content-type: [application/octet-stream] - date: ['Thu, 08 Feb 2018 19:33:25 GMT'] - etag: ['"0x8D56F2AD2B1805D"'] - last-modified: ['Thu, 08 Feb 2018 19:33:25 GMT'] + date: ['Tue, 01 May 2018 21:51:06 GMT'] + etag: ['"0x8D5AFADA4139239"'] + last-modified: ['Tue, 01 May 2018 21:51:05 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] x-ms-blob-type: [BlockBlob] + x-ms-creation-time: ['Tue, 01 May 2018 21:51:05 GMT'] x-ms-lease-state: [available] x-ms-lease-status: [unlocked] x-ms-server-encrypted: ['true'] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:33:25 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:51:06 GMT'] + x-ms-version: ['2017-11-09'] method: GET uri: https://clitest000002.blob.core.windows.net/cont000004?restype=container&comp=list&maxresults=1 response: body: {string: "\uFEFF1blob000003Thu,\ - \ 08 Feb 2018 19:33:25 GMT0x8D56F2AD2B1805D1024application/octet-stream1blob000003Tue,\ + \ 01 May 2018 21:51:05 GMTTue, 01 May 2018\ + \ 21:51:05 GMT0x8D5AFADA41392391024application/octet-streamDzQ7CTESaiDxM9Z8KwGKOw==BlockBlobunlockedavailabletrue"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 19:33:25 GMT'] + date: ['Tue, 01 May 2018 21:51:06 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:33:26 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:51:07 GMT'] + x-ms-version: ['2017-11-09'] method: HEAD uri: https://clitest000002.blob.core.windows.net/cont000004/blob000003 response: @@ -297,23 +311,25 @@ interactions: content-length: ['1024'] content-md5: [DzQ7CTESaiDxM9Z8KwGKOw==] content-type: [application/octet-stream] - date: ['Thu, 08 Feb 2018 19:33:26 GMT'] - etag: ['"0x8D56F2AD2B1805D"'] - last-modified: ['Thu, 08 Feb 2018 19:33:25 GMT'] + date: ['Tue, 01 May 2018 21:51:07 GMT'] + etag: ['"0x8D5AFADA4139239"'] + last-modified: ['Tue, 01 May 2018 21:51:05 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] x-ms-blob-type: [BlockBlob] + x-ms-creation-time: ['Tue, 01 May 2018 21:51:05 GMT'] x-ms-lease-state: [available] x-ms-lease-status: [unlocked] x-ms-server-encrypted: ['true'] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:33:26 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:51:07 GMT'] + x-ms-version: ['2017-11-09'] method: HEAD uri: https://clitest000002.blob.core.windows.net/cont000004/blob000003 response: @@ -323,45 +339,48 @@ interactions: content-length: ['1024'] content-md5: [DzQ7CTESaiDxM9Z8KwGKOw==] content-type: [application/octet-stream] - date: ['Thu, 08 Feb 2018 19:33:26 GMT'] - etag: ['"0x8D56F2AD2B1805D"'] - last-modified: ['Thu, 08 Feb 2018 19:33:25 GMT'] + date: ['Tue, 01 May 2018 21:51:07 GMT'] + etag: ['"0x8D5AFADA4139239"'] + last-modified: ['Tue, 01 May 2018 21:51:05 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] x-ms-blob-type: [BlockBlob] + x-ms-creation-time: ['Tue, 01 May 2018 21:51:05 GMT'] x-ms-lease-state: [available] x-ms-lease-status: [unlocked] x-ms-server-encrypted: ['true'] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] x-ms-blob-content-md5: [DzQ7CTESaiDxM9Z8KwGKOw==] x-ms-blob-content-type: [application/test-content] - x-ms-date: ['Thu, 08 Feb 2018 19:33:26 GMT'] - x-ms-version: ['2017-07-29'] + x-ms-date: ['Tue, 01 May 2018 21:51:07 GMT'] + x-ms-version: ['2017-11-09'] method: PUT uri: https://clitest000002.blob.core.windows.net/cont000004/blob000003?comp=properties response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 19:33:26 GMT'] - etag: ['"0x8D56F2AD393A1C2"'] - last-modified: ['Thu, 08 Feb 2018 19:33:27 GMT'] + date: ['Tue, 01 May 2018 21:51:07 GMT'] + etag: ['"0x8D5AFADA5644442"'] + last-modified: ['Tue, 01 May 2018 21:51:08 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:33:26 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:51:08 GMT'] + x-ms-version: ['2017-11-09'] method: HEAD uri: https://clitest000002.blob.core.windows.net/cont000004/blob000003 response: @@ -371,23 +390,25 @@ interactions: content-length: ['1024'] content-md5: [DzQ7CTESaiDxM9Z8KwGKOw==] content-type: [application/test-content] - date: ['Thu, 08 Feb 2018 19:33:26 GMT'] - etag: ['"0x8D56F2AD393A1C2"'] - last-modified: ['Thu, 08 Feb 2018 19:33:27 GMT'] + date: ['Tue, 01 May 2018 21:51:08 GMT'] + etag: ['"0x8D5AFADA5644442"'] + last-modified: ['Tue, 01 May 2018 21:51:08 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] x-ms-blob-type: [BlockBlob] + x-ms-creation-time: ['Tue, 01 May 2018 21:51:05 GMT'] x-ms-lease-state: [available] x-ms-lease-status: [unlocked] x-ms-server-encrypted: ['true'] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:33:27 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:51:08 GMT'] + x-ms-version: ['2017-11-09'] method: GET uri: https://clitest000002.blob.core.windows.net/?restype=service&comp=properties response: @@ -395,19 +416,20 @@ interactions: \ />false"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 19:33:27 GMT'] + date: ['Tue, 01 May 2018 21:51:08 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:33:27 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:51:09 GMT'] x-ms-range: [bytes=0-33554431] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] method: GET uri: https://clitest000002.blob.core.windows.net/cont000004/blob000003 response: @@ -444,25 +466,27 @@ interactions: content-length: ['1024'] content-range: [bytes 0-1023/1024] content-type: [application/test-content] - date: ['Thu, 08 Feb 2018 19:33:26 GMT'] - etag: ['"0x8D56F2AD393A1C2"'] - last-modified: ['Thu, 08 Feb 2018 19:33:27 GMT'] + date: ['Tue, 01 May 2018 21:51:08 GMT'] + etag: ['"0x8D5AFADA5644442"'] + last-modified: ['Tue, 01 May 2018 21:51:08 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] x-ms-blob-content-md5: [DzQ7CTESaiDxM9Z8KwGKOw==] x-ms-blob-type: [BlockBlob] + x-ms-creation-time: ['Tue, 01 May 2018 21:51:05 GMT'] x-ms-lease-state: [available] x-ms-lease-status: [unlocked] x-ms-server-encrypted: ['true'] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 206, message: Partial Content} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 19:33:27 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:51:09 GMT'] x-ms-range: [bytes=10-499] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] method: GET uri: https://clitest000002.blob.core.windows.net/cont000004/blob000003 response: @@ -485,16 +509,17 @@ interactions: content-length: ['490'] content-range: [bytes 10-499/1024] content-type: [application/test-content] - date: ['Thu, 08 Feb 2018 19:33:27 GMT'] - etag: ['"0x8D56F2AD393A1C2"'] - last-modified: ['Thu, 08 Feb 2018 19:33:27 GMT'] + date: ['Tue, 01 May 2018 21:51:09 GMT'] + etag: ['"0x8D5AFADA5644442"'] + last-modified: ['Tue, 01 May 2018 21:51:08 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] x-ms-blob-content-md5: [DzQ7CTESaiDxM9Z8KwGKOw==] x-ms-blob-type: [BlockBlob] + x-ms-creation-time: ['Tue, 01 May 2018 21:51:05 GMT'] x-ms-lease-state: [available] x-ms-lease-status: [unlocked] x-ms-server-encrypted: ['true'] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 206, message: Partial Content} - request: body: null @@ -506,8 +531,8 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.27] + msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: DELETE uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2017-05-10 @@ -516,11 +541,12 @@ interactions: headers: cache-control: [no-cache] content-length: ['0'] - date: ['Thu, 08 Feb 2018 19:33:29 GMT'] + date: ['Tue, 01 May 2018 21:51:09 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTElURVNUOjJFUkdBVU9JSzNLUVBQM0syNEEzTVQyTkdPRVFIT1A3WEJKWlJZQ3wxNEQwNTA2NTNGMEM0QUVELVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTElURVNUOjJFUkdZS1JHUzNaUFY3UE41SUFKS0lNNUZNRzVWS0o1SjVKMkRUUXxBNEYxNDk3QkEzRkE4NDg4LVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1195'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1196'] status: {code: 202, message: Accepted} version: 1 diff --git a/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_container_acl_scenarios.yaml b/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_container_acl_scenarios.yaml index eefde60ba52..4f5f4b5b364 100644 --- a/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_container_acl_scenarios.yaml +++ b/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_container_acl_scenarios.yaml @@ -1,30 +1,32 @@ interactions: - request: - body: '{"location": "westus", "tags": {"use": "az-test"}}' + body: '{"location": "westus", "tags": {"product": "azurecli", "cause": "automation", + "date": "2018-05-01T21:45:23Z"}}' headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] CommandName: [group create] Connection: [keep-alive] - Content-Length: ['50'] + Content-Length: ['110'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.27] + msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2017-05-10 response: - body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"westus","tags":{"use":"az-test"},"properties":{"provisioningState":"Succeeded"}}'} + body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"westus","tags":{"product":"azurecli","cause":"automation","date":"2018-05-01T21:45:23Z"},"properties":{"provisioningState":"Succeeded"}}'} headers: cache-control: [no-cache] - content-length: ['328'] + content-length: ['384'] content-type: [application/json; charset=utf-8] - date: ['Thu, 08 Feb 2018 18:09:35 GMT'] + date: ['Tue, 01 May 2018 21:45:24 GMT'] expires: ['-1'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1178'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1199'] status: {code: 201, message: Created} - request: body: '{"sku": {"name": "Standard_LRS"}, "kind": "Storage", "location": "westus", @@ -37,7 +39,7 @@ interactions: Content-Length: ['125'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002?api-version=2017-10-01 @@ -47,14 +49,15 @@ interactions: cache-control: [no-cache] content-length: ['0'] content-type: [text/plain; charset=utf-8] - date: ['Thu, 08 Feb 2018 18:09:37 GMT'] + date: ['Tue, 01 May 2018 21:45:26 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/a3ff11a2-2cbd-45c8-8170-bbe8282176fb?monitor=true&api-version=2017-10-01'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/80f70c06-ac48-4d85-8e66-91f2b48f0f93?monitor=true&api-version=2017-10-01'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 Microsoft-HTTPAPI/2.0'] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1190'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1199'] status: {code: 202, message: Accepted} - request: body: null @@ -65,17 +68,17 @@ interactions: Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/a3ff11a2-2cbd-45c8-8170-bbe8282176fb?monitor=true&api-version=2017-10-01 + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/80f70c06-ac48-4d85-8e66-91f2b48f0f93?monitor=true&api-version=2017-10-01 response: - body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T18:09:37.4609831Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T18:09:37.4609831Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T18:09:37.4141297Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} + body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:45:26.3557297Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:45:26.3557297Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:45:26.0744949Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} headers: cache-control: [no-cache] content-length: ['1231'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 18:09:54 GMT'] + date: ['Tue, 01 May 2018 21:45:42 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -83,6 +86,7 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] + x-content-type-options: [nosniff] status: {code: 200, message: OK} - request: body: null @@ -94,17 +98,17 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: POST uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002/listKeys?api-version=2017-10-01 response: - body: {string: '{"keys":[{"keyName":"key1","value":"SJ0uzeZHe3ZgpAaauzxRImggR4O0xMAPa/YamrQOAR0fjbg2IBE7HHyTBEVsImHZhVZZBamKATZaBVXEzTSHiA==","permissions":"FULL"},{"keyName":"key2","value":"kvVhqfMatIwS8dSQCyrewNf/8uhaLuj/jeraDJwVMJUZ3AxxZxQx/JhkDErQTydQGAeT9xrdxEiZXQzX/evOlQ==","permissions":"FULL"}]}'} + body: {string: '{"keys":[{"keyName":"key1","value":"5DQL2KGZRDhCaj6aCM7nJXgWhouvokVB/HJJ8Jfqjv1eu4L49vaRPLk5v2r6ow251rrlMDsRxd127E+PtxlZOA==","permissions":"FULL"},{"keyName":"key2","value":"pngx0eu+HKX1JODUx870j4a6jc/Cy3o/LJ7GR9pS+pKJfxEqj4FZ7LwBrU8MWSlM047seum0bN4nKKJQ8xnD/A==","permissions":"FULL"}]}'} headers: cache-control: [no-cache] content-length: ['288'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 18:09:56 GMT'] + date: ['Tue, 01 May 2018 21:45:44 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -112,7 +116,8 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] - x-ms-ratelimit-remaining-subscription-writes: ['1177'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1199'] status: {code: 200, message: OK} - request: body: null @@ -124,17 +129,17 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: POST uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002/listKeys?api-version=2017-10-01 response: - body: {string: '{"keys":[{"keyName":"key1","value":"SJ0uzeZHe3ZgpAaauzxRImggR4O0xMAPa/YamrQOAR0fjbg2IBE7HHyTBEVsImHZhVZZBamKATZaBVXEzTSHiA==","permissions":"FULL"},{"keyName":"key2","value":"kvVhqfMatIwS8dSQCyrewNf/8uhaLuj/jeraDJwVMJUZ3AxxZxQx/JhkDErQTydQGAeT9xrdxEiZXQzX/evOlQ==","permissions":"FULL"}]}'} + body: {string: '{"keys":[{"keyName":"key1","value":"5DQL2KGZRDhCaj6aCM7nJXgWhouvokVB/HJJ8Jfqjv1eu4L49vaRPLk5v2r6ow251rrlMDsRxd127E+PtxlZOA==","permissions":"FULL"},{"keyName":"key2","value":"pngx0eu+HKX1JODUx870j4a6jc/Cy3o/LJ7GR9pS+pKJfxEqj4FZ7LwBrU8MWSlM047seum0bN4nKKJQ8xnD/A==","permissions":"FULL"}]}'} headers: cache-control: [no-cache] content-length: ['288'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 18:09:57 GMT'] + date: ['Tue, 01 May 2018 21:45:45 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -142,35 +147,38 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] - x-ms-ratelimit-remaining-subscription-writes: ['1189'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1199'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:09:57 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:45 GMT'] + x-ms-version: ['2017-11-09'] method: PUT uri: https://clitest000002.blob.core.windows.net/cont000003?restype=container response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:09:57 GMT'] - etag: ['"0x8D56F1F29E8BE16"'] - last-modified: ['Thu, 08 Feb 2018 18:09:58 GMT'] + date: ['Tue, 01 May 2018 21:45:45 GMT'] + etag: ['"0x8D5AFACE55529E7"'] + last-modified: ['Tue, 01 May 2018 21:45:45 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 201, message: Created} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:09:58 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:46 GMT'] + x-ms-version: ['2017-11-09'] method: GET uri: https://clitest000002.blob.core.windows.net/cont000003?restype=container&comp=acl response: @@ -178,20 +186,21 @@ interactions: \ />"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:09:58 GMT'] - etag: ['"0x8D56F1F29E8BE16"'] - last-modified: ['Thu, 08 Feb 2018 18:09:58 GMT'] + date: ['Tue, 01 May 2018 21:45:46 GMT'] + etag: ['"0x8D5AFACE55529E7"'] + last-modified: ['Tue, 01 May 2018 21:45:45 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:09:58 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:46 GMT'] + x-ms-version: ['2017-11-09'] method: GET uri: https://clitest000002.blob.core.windows.net/cont000003?restype=container&comp=acl response: @@ -199,12 +208,12 @@ interactions: \ />"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:09:58 GMT'] - etag: ['"0x8D56F1F29E8BE16"'] - last-modified: ['Thu, 08 Feb 2018 18:09:58 GMT'] + date: ['Tue, 01 May 2018 21:45:45 GMT'] + etag: ['"0x8D5AFACE55529E7"'] + last-modified: ['Tue, 01 May 2018 21:45:45 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: ' @@ -213,40 +222,42 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['184'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:09:58 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:46 GMT'] + x-ms-version: ['2017-11-09'] method: PUT uri: https://clitest000002.blob.core.windows.net/cont000003?restype=container&comp=acl response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:09:58 GMT'] - etag: ['"0x8D56F1F2A469256"'] - last-modified: ['Thu, 08 Feb 2018 18:09:58 GMT'] + date: ['Tue, 01 May 2018 21:45:45 GMT'] + etag: ['"0x8D5AFACE5C4F7B7"'] + last-modified: ['Tue, 01 May 2018 21:45:46 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:09:58 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:46 GMT'] + x-ms-version: ['2017-11-09'] method: GET uri: https://clitest000002.blob.core.windows.net/cont000003?restype=container&comp=acl response: body: {string: "\uFEFFtest1l"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:09:58 GMT'] - etag: ['"0x8D56F1F2A469256"'] - last-modified: ['Thu, 08 Feb 2018 18:09:58 GMT'] + date: ['Tue, 01 May 2018 21:45:46 GMT'] + etag: ['"0x8D5AFACE5C4F7B7"'] + last-modified: ['Tue, 01 May 2018 21:45:46 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: ' @@ -255,40 +266,42 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['296'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:09:58 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:47 GMT'] + x-ms-version: ['2017-11-09'] method: PUT uri: https://clitest000002.blob.core.windows.net/cont000003?restype=container&comp=acl response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:09:58 GMT'] - etag: ['"0x8D56F1F2A780BD5"'] - last-modified: ['Thu, 08 Feb 2018 18:09:58 GMT'] + date: ['Tue, 01 May 2018 21:45:46 GMT'] + etag: ['"0x8D5AFACE5FE617E"'] + last-modified: ['Tue, 01 May 2018 21:45:47 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:09:58 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:47 GMT'] + x-ms-version: ['2017-11-09'] method: GET uri: https://clitest000002.blob.core.windows.net/cont000003?restype=container&comp=acl response: body: {string: "\uFEFFtest1ltest22016-01-01T00:00:00.0000000Z"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:09:58 GMT'] - etag: ['"0x8D56F1F2A780BD5"'] - last-modified: ['Thu, 08 Feb 2018 18:09:58 GMT'] + date: ['Tue, 01 May 2018 21:45:47 GMT'] + etag: ['"0x8D5AFACE5FE617E"'] + last-modified: ['Tue, 01 May 2018 21:45:47 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: ' @@ -297,40 +310,42 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['413'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:09:59 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:47 GMT'] + x-ms-version: ['2017-11-09'] method: PUT uri: https://clitest000002.blob.core.windows.net/cont000003?restype=container&comp=acl response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:09:58 GMT'] - etag: ['"0x8D56F1F2AA0D121"'] - last-modified: ['Thu, 08 Feb 2018 18:09:59 GMT'] + date: ['Tue, 01 May 2018 21:45:47 GMT'] + etag: ['"0x8D5AFACE6327329"'] + last-modified: ['Tue, 01 May 2018 21:45:47 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:09:59 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:47 GMT'] + x-ms-version: ['2017-11-09'] method: GET uri: https://clitest000002.blob.core.windows.net/cont000003?restype=container&comp=acl response: body: {string: "\uFEFFtest1ltest22016-01-01T00:00:00.0000000Ztest32018-01-01T00:00:00.0000000Z"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:09:59 GMT'] - etag: ['"0x8D56F1F2AA0D121"'] - last-modified: ['Thu, 08 Feb 2018 18:09:59 GMT'] + date: ['Tue, 01 May 2018 21:45:47 GMT'] + etag: ['"0x8D5AFACE6327329"'] + last-modified: ['Tue, 01 May 2018 21:45:47 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: ' @@ -339,140 +354,147 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['591'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:09:59 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:47 GMT'] + x-ms-version: ['2017-11-09'] method: PUT uri: https://clitest000002.blob.core.windows.net/cont000003?restype=container&comp=acl response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:09:59 GMT'] - etag: ['"0x8D56F1F2AC8FA15"'] - last-modified: ['Thu, 08 Feb 2018 18:09:59 GMT'] + date: ['Tue, 01 May 2018 21:45:47 GMT'] + etag: ['"0x8D5AFACE6713515"'] + last-modified: ['Tue, 01 May 2018 21:45:47 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:09:59 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:47 GMT'] + x-ms-version: ['2017-11-09'] method: GET uri: https://clitest000002.blob.core.windows.net/cont000003?restype=container&comp=acl response: body: {string: "\uFEFFtest1ltest22016-01-01T00:00:00.0000000Ztest32018-01-01T00:00:00.0000000Ztest42016-01-01T00:00:00.0000000Z2016-05-01T00:00:00.0000000Zrwdl"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:09:59 GMT'] - etag: ['"0x8D56F1F2AC8FA15"'] - last-modified: ['Thu, 08 Feb 2018 18:09:59 GMT'] + date: ['Tue, 01 May 2018 21:45:48 GMT'] + etag: ['"0x8D5AFACE6713515"'] + last-modified: ['Tue, 01 May 2018 21:45:47 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:09:59 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:48 GMT'] + x-ms-version: ['2017-11-09'] method: GET uri: https://clitest000002.blob.core.windows.net/cont000003?restype=container&comp=acl response: body: {string: "\uFEFFtest1ltest22016-01-01T00:00:00.0000000Ztest32018-01-01T00:00:00.0000000Ztest42016-01-01T00:00:00.0000000Z2016-05-01T00:00:00.0000000Zrwdl"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:09:59 GMT'] - etag: ['"0x8D56F1F2AC8FA15"'] - last-modified: ['Thu, 08 Feb 2018 18:09:59 GMT'] + date: ['Tue, 01 May 2018 21:45:48 GMT'] + etag: ['"0x8D5AFACE6713515"'] + last-modified: ['Tue, 01 May 2018 21:45:47 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:09:59 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:48 GMT'] + x-ms-version: ['2017-11-09'] method: GET uri: https://clitest000002.blob.core.windows.net/cont000003?restype=container&comp=acl response: body: {string: "\uFEFFtest1ltest22016-01-01T00:00:00.0000000Ztest32018-01-01T00:00:00.0000000Ztest42016-01-01T00:00:00.0000000Z2016-05-01T00:00:00.0000000Zrwdl"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:09:59 GMT'] - etag: ['"0x8D56F1F2AC8FA15"'] - last-modified: ['Thu, 08 Feb 2018 18:09:59 GMT'] + date: ['Tue, 01 May 2018 21:45:48 GMT'] + etag: ['"0x8D5AFACE6713515"'] + last-modified: ['Tue, 01 May 2018 21:45:47 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:00 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:49 GMT'] + x-ms-version: ['2017-11-09'] method: GET uri: https://clitest000002.blob.core.windows.net/cont000003?restype=container&comp=acl response: body: {string: "\uFEFFtest1ltest22016-01-01T00:00:00.0000000Ztest32018-01-01T00:00:00.0000000Ztest42016-01-01T00:00:00.0000000Z2016-05-01T00:00:00.0000000Zrwdl"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:09:59 GMT'] - etag: ['"0x8D56F1F2AC8FA15"'] - last-modified: ['Thu, 08 Feb 2018 18:09:59 GMT'] + date: ['Tue, 01 May 2018 21:45:48 GMT'] + etag: ['"0x8D5AFACE6713515"'] + last-modified: ['Tue, 01 May 2018 21:45:47 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:00 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:49 GMT'] + x-ms-version: ['2017-11-09'] method: GET uri: https://clitest000002.blob.core.windows.net/cont000003?restype=container&comp=acl response: body: {string: "\uFEFFtest1ltest22016-01-01T00:00:00.0000000Ztest32018-01-01T00:00:00.0000000Ztest42016-01-01T00:00:00.0000000Z2016-05-01T00:00:00.0000000Zrwdl"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:10:00 GMT'] - etag: ['"0x8D56F1F2AC8FA15"'] - last-modified: ['Thu, 08 Feb 2018 18:09:59 GMT'] + date: ['Tue, 01 May 2018 21:45:49 GMT'] + etag: ['"0x8D5AFACE6713515"'] + last-modified: ['Tue, 01 May 2018 21:45:47 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:00 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:49 GMT'] + x-ms-version: ['2017-11-09'] method: GET uri: https://clitest000002.blob.core.windows.net/cont000003?restype=container&comp=acl response: body: {string: "\uFEFFtest1ltest22016-01-01T00:00:00.0000000Ztest32018-01-01T00:00:00.0000000Ztest42016-01-01T00:00:00.0000000Z2016-05-01T00:00:00.0000000Zrwdl"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:10:00 GMT'] - etag: ['"0x8D56F1F2AC8FA15"'] - last-modified: ['Thu, 08 Feb 2018 18:09:59 GMT'] + date: ['Tue, 01 May 2018 21:45:49 GMT'] + etag: ['"0x8D5AFACE6713515"'] + last-modified: ['Tue, 01 May 2018 21:45:47 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: ' @@ -481,60 +503,63 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['597'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:00 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:49 GMT'] + x-ms-version: ['2017-11-09'] method: PUT uri: https://clitest000002.blob.core.windows.net/cont000003?restype=container&comp=acl response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:10:01 GMT'] - etag: ['"0x8D56F1F2BC2CB00"'] - last-modified: ['Thu, 08 Feb 2018 18:10:01 GMT'] + date: ['Tue, 01 May 2018 21:45:49 GMT'] + etag: ['"0x8D5AFACE7BF9BF0"'] + last-modified: ['Tue, 01 May 2018 21:45:50 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:01 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:50 GMT'] + x-ms-version: ['2017-11-09'] method: GET uri: https://clitest000002.blob.core.windows.net/cont000003?restype=container&comp=acl response: body: {string: "\uFEFFtest1rtest22016-01-01T00:00:00.0000000Ztest32018-01-01T00:00:00.0000000Ztest42016-01-01T00:00:00.0000000Z2016-05-01T00:00:00.0000000Zrwdl"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:10:01 GMT'] - etag: ['"0x8D56F1F2BC2CB00"'] - last-modified: ['Thu, 08 Feb 2018 18:10:01 GMT'] + date: ['Tue, 01 May 2018 21:45:50 GMT'] + etag: ['"0x8D5AFACE7BF9BF0"'] + last-modified: ['Tue, 01 May 2018 21:45:50 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:01 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:50 GMT'] + x-ms-version: ['2017-11-09'] method: GET uri: https://clitest000002.blob.core.windows.net/cont000003?restype=container&comp=acl response: body: {string: "\uFEFFtest1rtest22016-01-01T00:00:00.0000000Ztest32018-01-01T00:00:00.0000000Ztest42016-01-01T00:00:00.0000000Z2016-05-01T00:00:00.0000000Zrwdl"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:10:00 GMT'] - etag: ['"0x8D56F1F2BC2CB00"'] - last-modified: ['Thu, 08 Feb 2018 18:10:01 GMT'] + date: ['Tue, 01 May 2018 21:45:50 GMT'] + etag: ['"0x8D5AFACE7BF9BF0"'] + last-modified: ['Tue, 01 May 2018 21:45:50 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: ' @@ -543,40 +568,42 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['491'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:01 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:50 GMT'] + x-ms-version: ['2017-11-09'] method: PUT uri: https://clitest000002.blob.core.windows.net/cont000003?restype=container&comp=acl response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:10:00 GMT'] - etag: ['"0x8D56F1F2C1343FC"'] - last-modified: ['Thu, 08 Feb 2018 18:10:01 GMT'] + date: ['Tue, 01 May 2018 21:45:50 GMT'] + etag: ['"0x8D5AFACE83D1FCD"'] + last-modified: ['Tue, 01 May 2018 21:45:50 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:01 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:51 GMT'] + x-ms-version: ['2017-11-09'] method: GET uri: https://clitest000002.blob.core.windows.net/cont000003?restype=container&comp=acl response: body: {string: "\uFEFFtest22016-01-01T00:00:00.0000000Ztest32018-01-01T00:00:00.0000000Ztest42016-01-01T00:00:00.0000000Z2016-05-01T00:00:00.0000000Zrwdl"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:10:01 GMT'] - etag: ['"0x8D56F1F2C1343FC"'] - last-modified: ['Thu, 08 Feb 2018 18:10:01 GMT'] + date: ['Tue, 01 May 2018 21:45:50 GMT'] + etag: ['"0x8D5AFACE83D1FCD"'] + last-modified: ['Tue, 01 May 2018 21:45:50 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null @@ -588,8 +615,8 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.27] + msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: DELETE uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2017-05-10 @@ -598,11 +625,12 @@ interactions: headers: cache-control: [no-cache] content-length: ['0'] - date: ['Thu, 08 Feb 2018 18:10:03 GMT'] + date: ['Tue, 01 May 2018 21:45:51 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTElURVNUOjJFUkdSU0NFQzc2WU5BTzJQNFVGUFRQNU1PVVVENzNJUFRVNkpZTXwxQzlEQjczNzFBRDU1ODFELVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTElURVNUOjJFUkdJNVUyRldCUFFJNktDNllPMk9EWVNHRzJaSEtEN0hURVlTQ3xDMDZDRjhCODZGRTE2QzRFLVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1191'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1199'] status: {code: 202, message: Accepted} version: 1 diff --git a/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_cors_scenario.yaml b/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_cors_scenario.yaml index 21f13f6d8ef..2ae36375192 100644 --- a/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_cors_scenario.yaml +++ b/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_cors_scenario.yaml @@ -1,43 +1,45 @@ interactions: - request: - body: '{"location": "westus", "tags": {"use": "az-test"}}' + body: '{"location": "eastus2", "tags": {"product": "azurecli", "cause": "automation", + "date": "2018-05-01T23:41:14Z"}}' headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] CommandName: [group create] Connection: [keep-alive] - Content-Length: ['50'] + Content-Length: ['111'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.27] + msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2017-05-10 response: - body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"westus","tags":{"use":"az-test"},"properties":{"provisioningState":"Succeeded"}}'} + body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"eastus2","tags":{"product":"azurecli","cause":"automation","date":"2018-05-01T23:41:14Z"},"properties":{"provisioningState":"Succeeded"}}'} headers: cache-control: [no-cache] - content-length: ['328'] + content-length: ['385'] content-type: [application/json; charset=utf-8] - date: ['Thu, 08 Feb 2018 18:09:38 GMT'] + date: ['Tue, 01 May 2018 23:41:16 GMT'] expires: ['-1'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1189'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1196'] status: {code: 201, message: Created} - request: - body: '{"sku": {"name": "Standard_LRS"}, "kind": "Storage", "location": "westus", + body: '{"sku": {"name": "Standard_LRS"}, "kind": "Storage", "location": "eastus2", "properties": {"supportsHttpsTrafficOnly": false}}' headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] CommandName: [storage account create] Connection: [keep-alive] - Content-Length: ['125'] + Content-Length: ['126'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002?api-version=2017-10-01 @@ -47,14 +49,15 @@ interactions: cache-control: [no-cache] content-length: ['0'] content-type: [text/plain; charset=utf-8] - date: ['Thu, 08 Feb 2018 18:09:39 GMT'] + date: ['Tue, 01 May 2018 23:41:17 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/a6dc502e-7696-4dbe-a9ef-d0e888461326?monitor=true&api-version=2017-10-01'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/eastus2/asyncoperations/0bd47cbe-aad5-4127-bd83-2d324c4114ec?monitor=true&api-version=2017-10-01'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 Microsoft-HTTPAPI/2.0'] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1178'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1197'] status: {code: 202, message: Accepted} - request: body: null @@ -65,44 +68,17 @@ interactions: Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/a6dc502e-7696-4dbe-a9ef-d0e888461326?monitor=true&api-version=2017-10-01 + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/eastus2/asyncoperations/0bd47cbe-aad5-4127-bd83-2d324c4114ec?monitor=true&api-version=2017-10-01 response: - body: {string: ''} - headers: - cache-control: [no-cache] - content-length: ['0'] - content-type: [text/plain; charset=utf-8] - date: ['Thu, 08 Feb 2018 18:09:57 GMT'] - expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/a6dc502e-7696-4dbe-a9ef-d0e888461326?monitor=true&api-version=2017-10-01'] - pragma: [no-cache] - server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 - Microsoft-HTTPAPI/2.0'] - strict-transport-security: [max-age=31536000; includeSubDomains] - status: {code: 202, message: Accepted} -- request: - body: null - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [storage account create] - Connection: [keep-alive] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] - accept-language: [en-US] - method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/a6dc502e-7696-4dbe-a9ef-d0e888461326?monitor=true&api-version=2017-10-01 - response: - body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T18:09:39.8672416Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T18:09:39.8672416Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T18:09:39.8047876Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} + body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"eastus2","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T23:41:18.5011159Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T23:41:18.5011159Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T23:41:18.4229399Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"eastus2","statusOfPrimary":"available"}}'} headers: cache-control: [no-cache] - content-length: ['1231'] + content-length: ['1233'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 18:10:13 GMT'] + date: ['Tue, 01 May 2018 23:41:35 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -110,6 +86,7 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] + x-content-type-options: [nosniff] status: {code: 200, message: OK} - request: body: null @@ -121,17 +98,17 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: POST uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002/listKeys?api-version=2017-10-01 response: - body: {string: '{"keys":[{"keyName":"key1","value":"fUCEtNowYlfvLI6DZP3F0VdcVCD3VIea0d+c5hS5REi510SubTalfMysl5BAUeOlGahl33Ic4WDJcncutDJkZA==","permissions":"FULL"},{"keyName":"key2","value":"ZNUhM80FIWzo9jyGMRKJIhUHYeWlJvqNzQN4qDDCzMzooWkhSgdOBvX2hmK2k4R0sVb4Urz6xKaX2lQAQ3OpjA==","permissions":"FULL"}]}'} + body: {string: '{"keys":[{"keyName":"key1","value":"HU0B1htVX7z5kftKvW2TmA6EX+E2Mhl8cGPG9HK1YU+tk1GfQoXsMZ9wZjTangh0ZhBTPvIq1yp2KcHqa/g3sA==","permissions":"FULL"},{"keyName":"key2","value":"skIKw3viQeZb+jr/4GGAivbeUVu+0atWwiPCICU4TZ1Y52ScQmheJpYNQwdMHjiqm6kYm/IbjKxc/95sCWwoeA==","permissions":"FULL"}]}'} headers: cache-control: [no-cache] content-length: ['288'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 18:10:16 GMT'] + date: ['Tue, 01 May 2018 23:41:36 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -139,7 +116,8 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] - x-ms-ratelimit-remaining-subscription-writes: ['1190'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1198'] status: {code: 200, message: OK} - request: body: null @@ -151,17 +129,17 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: POST uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002/listKeys?api-version=2017-10-01 response: - body: {string: '{"keys":[{"keyName":"key1","value":"fUCEtNowYlfvLI6DZP3F0VdcVCD3VIea0d+c5hS5REi510SubTalfMysl5BAUeOlGahl33Ic4WDJcncutDJkZA==","permissions":"FULL"},{"keyName":"key2","value":"ZNUhM80FIWzo9jyGMRKJIhUHYeWlJvqNzQN4qDDCzMzooWkhSgdOBvX2hmK2k4R0sVb4Urz6xKaX2lQAQ3OpjA==","permissions":"FULL"}]}'} + body: {string: '{"keys":[{"keyName":"key1","value":"HU0B1htVX7z5kftKvW2TmA6EX+E2Mhl8cGPG9HK1YU+tk1GfQoXsMZ9wZjTangh0ZhBTPvIq1yp2KcHqa/g3sA==","permissions":"FULL"},{"keyName":"key2","value":"skIKw3viQeZb+jr/4GGAivbeUVu+0atWwiPCICU4TZ1Y52ScQmheJpYNQwdMHjiqm6kYm/IbjKxc/95sCWwoeA==","permissions":"FULL"}]}'} headers: cache-control: [no-cache] content-length: ['288'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 18:10:19 GMT'] + date: ['Tue, 01 May 2018 23:41:37 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -169,26 +147,8 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] - x-ms-ratelimit-remaining-subscription-writes: ['1185'] - status: {code: 200, message: OK} -- request: - body: null - headers: - Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:19 GMT'] - x-ms-version: ['2017-07-29'] - method: GET - uri: https://clitest000002.file.core.windows.net/?restype=service&comp=properties - response: - body: {string: "\uFEFF1.0truetruetrue71.0falsefalse"} - headers: - content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:10:19 GMT'] - server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] - transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1198'] status: {code: 200, message: OK} - request: body: null @@ -196,8 +156,8 @@ interactions: Connection: [keep-alive] DataServiceVersion: [3.0;NetFx] MaxDataServiceVersion: ['3.0'] - User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:20 GMT'] + User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 23:41:38 GMT'] x-ms-version: ['2017-04-17'] method: GET uri: https://clitest000002.table.core.windows.net/?restype=service&comp=properties @@ -206,7 +166,7 @@ interactions: \ />"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:10:20 GMT'] + date: ['Tue, 01 May 2018 23:41:38 GMT'] server: [Windows-Azure-Table/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-04-17'] @@ -215,19 +175,19 @@ interactions: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:20 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 23:41:38 GMT'] x-ms-version: ['2017-07-29'] method: GET - uri: https://clitest000002.queue.core.windows.net/?restype=service&comp=properties + uri: https://clitest000002.file.core.windows.net/?restype=service&comp=properties response: - body: {string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue71.0falsefalse1.0truetruetrue71.0falsefalse"} headers: - cache-control: [no-cache] content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:10:20 GMT'] - server: [Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0] + date: ['Tue, 01 May 2018 23:41:38 GMT'] + server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-07-29'] status: {code: 200, message: OK} @@ -235,9 +195,10 @@ interactions: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:20 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 23:41:39 GMT'] + x-ms-version: ['2017-11-09'] method: GET uri: https://clitest000002.blob.core.windows.net/?restype=service&comp=properties response: @@ -245,17 +206,39 @@ interactions: \ />false"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:10:20 GMT'] + date: ['Tue, 01 May 2018 23:41:39 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:20 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 23:41:39 GMT'] + x-ms-version: ['2017-11-09'] + method: GET + uri: https://clitest000002.queue.core.windows.net/?restype=service&comp=properties + response: + body: {string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue71.0falsefalse"} + headers: + cache-control: [no-cache] + content-type: [application/xml] + date: ['Tue, 01 May 2018 23:41:39 GMT'] + server: [Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0] + transfer-encoding: [chunked] + x-ms-version: ['2017-11-09'] + status: {code: 200, message: OK} +- request: + body: null + headers: + Connection: [keep-alive] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 23:41:40 GMT'] x-ms-version: ['2017-07-29'] method: GET uri: https://clitest000002.file.core.windows.net/?restype=service&comp=properties @@ -264,7 +247,7 @@ interactions: \ />"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:10:20 GMT'] + date: ['Tue, 01 May 2018 23:41:39 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-07-29'] @@ -277,15 +260,16 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['287'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:21 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 23:41:40 GMT'] x-ms-version: ['2017-07-29'] method: PUT uri: https://clitest000002.file.core.windows.net/?restype=service&comp=properties response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:10:21 GMT'] + date: ['Tue, 01 May 2018 23:41:40 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-07-29'] @@ -294,21 +278,21 @@ interactions: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:21 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 23:41:40 GMT'] + x-ms-version: ['2017-11-09'] method: GET - uri: https://clitest000002.queue.core.windows.net/?restype=service&comp=properties + uri: https://clitest000002.blob.core.windows.net/?restype=service&comp=properties response: body: {string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue71.0falsefalse"} + \ />false"} headers: - cache-control: [no-cache] content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:10:20 GMT'] - server: [Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0] + date: ['Tue, 01 May 2018 23:41:40 GMT'] + server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: ' @@ -318,37 +302,40 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['287'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:21 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 23:41:41 GMT'] + x-ms-version: ['2017-11-09'] method: PUT - uri: https://clitest000002.queue.core.windows.net/?restype=service&comp=properties + uri: https://clitest000002.blob.core.windows.net/?restype=service&comp=properties response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:10:20 GMT'] - server: [Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0] + date: ['Tue, 01 May 2018 23:41:41 GMT'] + server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 202, message: Accepted} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:21 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 23:41:41 GMT'] + x-ms-version: ['2017-11-09'] method: GET - uri: https://clitest000002.blob.core.windows.net/?restype=service&comp=properties + uri: https://clitest000002.queue.core.windows.net/?restype=service&comp=properties response: body: {string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue71.0falsefalsefalse"} + \ />"} headers: + cache-control: [no-cache] content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:10:21 GMT'] - server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] + date: ['Tue, 01 May 2018 23:41:41 GMT'] + server: [Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: ' @@ -358,47 +345,28 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['287'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:21 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 23:41:41 GMT'] + x-ms-version: ['2017-11-09'] method: PUT - uri: https://clitest000002.blob.core.windows.net/?restype=service&comp=properties + uri: https://clitest000002.queue.core.windows.net/?restype=service&comp=properties response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:10:21 GMT'] - server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] + date: ['Tue, 01 May 2018 23:41:42 GMT'] + server: [Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 202, message: Accepted} -- request: - body: null - headers: - Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:22 GMT'] - x-ms-version: ['2017-07-29'] - method: GET - uri: https://clitest000002.file.core.windows.net/?restype=service&comp=properties - response: - body: {string: "\uFEFF1.0truetruetrue71.0falsefalsePOSThttp://example.com60"} - headers: - content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:10:22 GMT'] - server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] - transfer-encoding: [chunked] - vary: [Origin] - x-ms-version: ['2017-07-29'] - status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] DataServiceVersion: [3.0;NetFx] MaxDataServiceVersion: ['3.0'] - User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:22 GMT'] + User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 23:41:42 GMT'] x-ms-version: ['2017-04-17'] method: GET uri: https://clitest000002.table.core.windows.net/?restype=service&comp=properties @@ -407,7 +375,7 @@ interactions: \ />"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:10:22 GMT'] + date: ['Tue, 01 May 2018 23:41:42 GMT'] server: [Windows-Azure-Table/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-04-17'] @@ -416,19 +384,19 @@ interactions: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:22 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 23:41:42 GMT'] x-ms-version: ['2017-07-29'] method: GET - uri: https://clitest000002.queue.core.windows.net/?restype=service&comp=properties + uri: https://clitest000002.file.core.windows.net/?restype=service&comp=properties response: - body: {string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue71.0falsefalsePOSThttp://example.com1.0truetruetrue71.0falsefalsePOSThttp://example.com60"} headers: - cache-control: [no-cache] content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:10:22 GMT'] - server: [Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0] + date: ['Tue, 01 May 2018 23:41:42 GMT'] + server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] vary: [Origin] x-ms-version: ['2017-07-29'] @@ -437,9 +405,10 @@ interactions: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:22 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 23:41:43 GMT'] + x-ms-version: ['2017-11-09'] method: GET uri: https://clitest000002.blob.core.windows.net/?restype=service&comp=properties response: @@ -447,11 +416,33 @@ interactions: \ />60false"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:10:21 GMT'] + date: ['Tue, 01 May 2018 23:41:42 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] vary: [Origin] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] + status: {code: 200, message: OK} +- request: + body: null + headers: + Connection: [keep-alive] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 23:41:43 GMT'] + x-ms-version: ['2017-11-09'] + method: GET + uri: https://clitest000002.queue.core.windows.net/?restype=service&comp=properties + response: + body: {string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue71.0falsefalsePOSThttp://example.com60"} + headers: + cache-control: [no-cache] + content-type: [application/xml] + date: ['Tue, 01 May 2018 23:41:43 GMT'] + server: [Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0] + transfer-encoding: [chunked] + vary: [Origin] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: ' @@ -460,15 +451,16 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['100'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:22 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 23:41:44 GMT'] x-ms-version: ['2017-07-29'] method: PUT uri: https://clitest000002.file.core.windows.net/?restype=service&comp=properties response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:10:22 GMT'] + date: ['Tue, 01 May 2018 23:41:44 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-07-29'] @@ -480,46 +472,28 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['100'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:22 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 23:41:44 GMT'] + x-ms-version: ['2017-11-09'] method: PUT uri: https://clitest000002.blob.core.windows.net/?restype=service&comp=properties response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:10:23 GMT'] + date: ['Tue, 01 May 2018 23:41:44 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 202, message: Accepted} -- request: - body: null - headers: - Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:23 GMT'] - x-ms-version: ['2017-07-29'] - method: GET - uri: https://clitest000002.file.core.windows.net/?restype=service&comp=properties - response: - body: {string: "\uFEFF1.0truetruetrue71.0falsefalse"} - headers: - content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:10:23 GMT'] - server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] - transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] - status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] DataServiceVersion: [3.0;NetFx] MaxDataServiceVersion: ['3.0'] - User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:23 GMT'] + User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 23:41:45 GMT'] x-ms-version: ['2017-04-17'] method: GET uri: https://clitest000002.table.core.windows.net/?restype=service&comp=properties @@ -528,7 +502,7 @@ interactions: \ />"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:10:23 GMT'] + date: ['Tue, 01 May 2018 23:41:45 GMT'] server: [Windows-Azure-Table/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-04-17'] @@ -537,30 +511,30 @@ interactions: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:23 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 23:41:45 GMT'] x-ms-version: ['2017-07-29'] method: GET - uri: https://clitest000002.queue.core.windows.net/?restype=service&comp=properties + uri: https://clitest000002.file.core.windows.net/?restype=service&comp=properties response: - body: {string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue71.0falsefalsePOSThttp://example.com60"} + body: {string: "\uFEFF1.0truetruetrue71.0falsefalse"} headers: - cache-control: [no-cache] content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:10:23 GMT'] - server: [Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0] + date: ['Tue, 01 May 2018 23:41:46 GMT'] + server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - vary: [Origin] x-ms-version: ['2017-07-29'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:23 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 23:41:46 GMT'] + x-ms-version: ['2017-11-09'] method: GET uri: https://clitest000002.blob.core.windows.net/?restype=service&comp=properties response: @@ -568,10 +542,32 @@ interactions: \ />false"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:10:23 GMT'] + date: ['Tue, 01 May 2018 23:41:45 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] + status: {code: 200, message: OK} +- request: + body: null + headers: + Connection: [keep-alive] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 23:41:46 GMT'] + x-ms-version: ['2017-11-09'] + method: GET + uri: https://clitest000002.queue.core.windows.net/?restype=service&comp=properties + response: + body: {string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue71.0falsefalsePOSThttp://example.com60"} + headers: + cache-control: [no-cache] + content-type: [application/xml] + date: ['Tue, 01 May 2018 23:41:46 GMT'] + server: [Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0] + transfer-encoding: [chunked] + vary: [Origin] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: ' @@ -580,15 +576,16 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['100'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:24 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 23:41:46 GMT'] x-ms-version: ['2017-07-29'] method: PUT uri: https://clitest000002.file.core.windows.net/?restype=service&comp=properties response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:10:23 GMT'] + date: ['Tue, 01 May 2018 23:41:46 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-07-29'] @@ -600,18 +597,19 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['100'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:24 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 23:41:47 GMT'] + x-ms-version: ['2017-11-09'] method: PUT - uri: https://clitest000002.queue.core.windows.net/?restype=service&comp=properties + uri: https://clitest000002.blob.core.windows.net/?restype=service&comp=properties response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:10:24 GMT'] - server: [Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0] + date: ['Tue, 01 May 2018 23:41:47 GMT'] + server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 202, message: Accepted} - request: body: ' @@ -620,46 +618,28 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['100'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:24 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 23:41:47 GMT'] + x-ms-version: ['2017-11-09'] method: PUT - uri: https://clitest000002.blob.core.windows.net/?restype=service&comp=properties + uri: https://clitest000002.queue.core.windows.net/?restype=service&comp=properties response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:10:24 GMT'] - server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] + date: ['Tue, 01 May 2018 23:41:48 GMT'] + server: [Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] status: {code: 202, message: Accepted} -- request: - body: null - headers: - Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:24 GMT'] - x-ms-version: ['2017-07-29'] - method: GET - uri: https://clitest000002.file.core.windows.net/?restype=service&comp=properties - response: - body: {string: "\uFEFF1.0truetruetrue71.0falsefalse"} - headers: - content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:10:24 GMT'] - server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] - transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] - status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] DataServiceVersion: [3.0;NetFx] MaxDataServiceVersion: ['3.0'] - User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:24 GMT'] + User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 23:41:48 GMT'] x-ms-version: ['2017-04-17'] method: GET uri: https://clitest000002.table.core.windows.net/?restype=service&comp=properties @@ -668,7 +648,7 @@ interactions: \ />"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:10:24 GMT'] + date: ['Tue, 01 May 2018 23:41:48 GMT'] server: [Windows-Azure-Table/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-04-17'] @@ -677,19 +657,19 @@ interactions: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:25 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 23:41:48 GMT'] x-ms-version: ['2017-07-29'] method: GET - uri: https://clitest000002.queue.core.windows.net/?restype=service&comp=properties + uri: https://clitest000002.file.core.windows.net/?restype=service&comp=properties response: - body: {string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue71.0falsefalse1.0truetruetrue71.0falsefalse"} headers: - cache-control: [no-cache] content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:10:24 GMT'] - server: [Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0] + date: ['Tue, 01 May 2018 23:41:49 GMT'] + server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-07-29'] status: {code: 200, message: OK} @@ -697,9 +677,10 @@ interactions: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:25 GMT'] - x-ms-version: ['2017-07-29'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 23:41:49 GMT'] + x-ms-version: ['2017-11-09'] method: GET uri: https://clitest000002.blob.core.windows.net/?restype=service&comp=properties response: @@ -707,10 +688,31 @@ interactions: \ />false"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:10:25 GMT'] + date: ['Tue, 01 May 2018 23:41:52 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-version: ['2017-07-29'] + x-ms-version: ['2017-11-09'] + status: {code: 200, message: OK} +- request: + body: null + headers: + Connection: [keep-alive] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 23:41:52 GMT'] + x-ms-version: ['2017-11-09'] + method: GET + uri: https://clitest000002.queue.core.windows.net/?restype=service&comp=properties + response: + body: {string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue71.0falsefalse"} + headers: + cache-control: [no-cache] + content-type: [application/xml] + date: ['Tue, 01 May 2018 23:41:52 GMT'] + server: [Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0] + transfer-encoding: [chunked] + x-ms-version: ['2017-11-09'] status: {code: 200, message: OK} - request: body: null @@ -722,8 +724,8 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.27] + msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: DELETE uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2017-05-10 @@ -732,11 +734,12 @@ interactions: headers: cache-control: [no-cache] content-length: ['0'] - date: ['Thu, 08 Feb 2018 18:10:25 GMT'] + date: ['Tue, 01 May 2018 23:41:54 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTElURVNUOjJFUkdOWDdUVURRVzJNTkVOVDZMVldKWVVQRjM2WFNCWTdIUzJCT3xENjY1ODM0ODkwMjE3NTVFLVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTElURVNUOjJFUkdTQklaRUlNUE83RENONEFDNDJXTFdGWURRRjdJN0tMWUFBN3w1NUE2MUJFMDIyRDlDMzlGLUVBU1RVUzIiLCJqb2JMb2NhdGlvbiI6ImVhc3R1czIifQ?api-version=2017-05-10'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1190'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1196'] status: {code: 202, message: Accepted} version: 1 diff --git a/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_create_default_sku.yaml b/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_create_default_sku.yaml index 07e62d6262a..201fb0fd303 100644 --- a/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_create_default_sku.yaml +++ b/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_create_default_sku.yaml @@ -1,30 +1,32 @@ interactions: - request: - body: '{"location": "southcentralus", "tags": {"use": "az-test"}}' + body: '{"location": "southcentralus", "tags": {"product": "azurecli", "cause": + "automation", "date": "2018-05-01T21:51:22Z"}}' headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] CommandName: [group create] Connection: [keep-alive] - Content-Length: ['58'] + Content-Length: ['118'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.27] + msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2017-05-10 response: - body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"southcentralus","tags":{"use":"az-test"},"properties":{"provisioningState":"Succeeded"}}'} + body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"southcentralus","tags":{"product":"azurecli","cause":"automation","date":"2018-05-01T21:51:22Z"},"properties":{"provisioningState":"Succeeded"}}'} headers: cache-control: [no-cache] - content-length: ['336'] + content-length: ['392'] content-type: [application/json; charset=utf-8] - date: ['Thu, 08 Feb 2018 18:15:07 GMT'] + date: ['Tue, 01 May 2018 21:51:23 GMT'] expires: ['-1'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1184'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1193'] status: {code: 201, message: Created} - request: body: null @@ -35,22 +37,23 @@ interactions: Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.27] + msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2017-05-10 response: - body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"southcentralus","tags":{"use":"az-test"},"properties":{"provisioningState":"Succeeded"}}'} + body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"southcentralus","tags":{"product":"azurecli","cause":"automation","date":"2018-05-01T21:51:22Z"},"properties":{"provisioningState":"Succeeded"}}'} headers: cache-control: [no-cache] - content-length: ['336'] + content-length: ['392'] content-type: [application/json; charset=utf-8] - date: ['Thu, 08 Feb 2018 18:15:08 GMT'] + date: ['Tue, 01 May 2018 21:51:23 GMT'] expires: ['-1'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] vary: [Accept-Encoding] + x-content-type-options: [nosniff] status: {code: 200, message: OK} - request: body: '{"sku": {"name": "Standard_RAGRS"}, "kind": "Storage", "location": "southcentralus", @@ -63,7 +66,7 @@ interactions: Content-Length: ['135'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/cli000002?api-version=2017-10-01 @@ -73,14 +76,15 @@ interactions: cache-control: [no-cache] content-length: ['0'] content-type: [text/plain; charset=utf-8] - date: ['Thu, 08 Feb 2018 18:15:09 GMT'] + date: ['Tue, 01 May 2018 21:51:24 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/southcentralus/asyncoperations/6a4d5822-012b-4c17-9a8f-3fe96dc6b00f?monitor=true&api-version=2017-10-01'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/southcentralus/asyncoperations/2ea9ca23-94ff-470b-849f-ecad61d99f0b?monitor=true&api-version=2017-10-01'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 Microsoft-HTTPAPI/2.0'] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1179'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1194'] status: {code: 202, message: Accepted} - request: body: null @@ -91,17 +95,17 @@ interactions: Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/southcentralus/asyncoperations/6a4d5822-012b-4c17-9a8f-3fe96dc6b00f?monitor=true&api-version=2017-10-01 + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/southcentralus/asyncoperations/2ea9ca23-94ff-470b-849f-ecad61d99f0b?monitor=true&api-version=2017-10-01 response: - body: {string: '{"sku":{"name":"Standard_RAGRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/cli000002","name":"cli000002","type":"Microsoft.Storage/storageAccounts","location":"southcentralus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T18:15:09.0610322Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T18:15:09.0610322Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T18:15:08.9985152Z","primaryEndpoints":{"blob":"https://cli000002.blob.core.windows.net/","queue":"https://cli000002.queue.core.windows.net/","table":"https://cli000002.table.core.windows.net/","file":"https://cli000002.file.core.windows.net/"},"primaryLocation":"southcentralus","statusOfPrimary":"available","secondaryLocation":"northcentralus","statusOfSecondary":"available","secondaryEndpoints":{"blob":"https://cli000002-secondary.blob.core.windows.net/","queue":"https://cli000002-secondary.queue.core.windows.net/","table":"https://cli000002-secondary.table.core.windows.net/"}}}'} + body: {string: '{"sku":{"name":"Standard_RAGRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/cli000002","name":"cli000002","type":"Microsoft.Storage/storageAccounts","location":"southcentralus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:51:25.4792706Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:51:25.4792706Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:51:25.4167294Z","primaryEndpoints":{"blob":"https://cli000002.blob.core.windows.net/","queue":"https://cli000002.queue.core.windows.net/","table":"https://cli000002.table.core.windows.net/","file":"https://cli000002.file.core.windows.net/"},"primaryLocation":"southcentralus","statusOfPrimary":"available","secondaryLocation":"northcentralus","statusOfSecondary":"available","secondaryEndpoints":{"blob":"https://cli000002-secondary.blob.core.windows.net/","queue":"https://cli000002-secondary.queue.core.windows.net/","table":"https://cli000002-secondary.table.core.windows.net/"}}}'} headers: cache-control: [no-cache] content-length: ['1570'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 18:15:27 GMT'] + date: ['Tue, 01 May 2018 21:51:42 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -109,6 +113,7 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] + x-content-type-options: [nosniff] status: {code: 200, message: OK} - request: body: null @@ -120,8 +125,8 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.27] + msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: DELETE uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2017-05-10 @@ -130,11 +135,12 @@ interactions: headers: cache-control: [no-cache] content-length: ['0'] - date: ['Thu, 08 Feb 2018 18:15:28 GMT'] + date: ['Tue, 01 May 2018 21:51:44 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTElURVNUOjJFUkdLUkdEWUQ3R001TzJHUjUzM0hETlE1WVBDTTY2R1BJWFNSRHxGOEIyQjBGM0JDQzJBMDE3LVNPVVRIQ0VOVFJBTFVTIiwiam9iTG9jYXRpb24iOiJzb3V0aGNlbnRyYWx1cyJ9?api-version=2017-05-10'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTElURVNUOjJFUkdQRjMyTEJTM0NFUkNYWDdFQ0JNQzNCUDUzUlhOVlZVSU1QS3xFMkUwRDI5MTU2QzA0REZDLVNPVVRIQ0VOVFJBTFVTIiwiam9iTG9jYXRpb24iOiJzb3V0aGNlbnRyYWx1cyJ9?api-version=2017-05-10'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1179'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1196'] status: {code: 202, message: Accepted} version: 1 diff --git a/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_file_copy_scenario.yaml b/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_file_copy_scenario.yaml index 4df92b63dcf..b828a3ebf37 100644 --- a/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_file_copy_scenario.yaml +++ b/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_file_copy_scenario.yaml @@ -1,30 +1,32 @@ interactions: - request: - body: '{"location": "westus", "tags": {"use": "az-test"}}' + body: '{"location": "westus", "tags": {"product": "azurecli", "cause": "automation", + "date": "2018-05-01T21:45:26Z"}}' headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] CommandName: [group create] Connection: [keep-alive] - Content-Length: ['50'] + Content-Length: ['110'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.27] + msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2017-05-10 response: - body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"westus","tags":{"use":"az-test"},"properties":{"provisioningState":"Succeeded"}}'} + body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"westus","tags":{"product":"azurecli","cause":"automation","date":"2018-05-01T21:45:26Z"},"properties":{"provisioningState":"Succeeded"}}'} headers: cache-control: [no-cache] - content-length: ['328'] + content-length: ['384'] content-type: [application/json; charset=utf-8] - date: ['Thu, 08 Feb 2018 18:09:38 GMT'] + date: ['Tue, 01 May 2018 21:45:27 GMT'] expires: ['-1'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1181'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1198'] status: {code: 201, message: Created} - request: body: '{"sku": {"name": "Standard_LRS"}, "kind": "Storage", "location": "westus", @@ -37,7 +39,7 @@ interactions: Content-Length: ['125'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002?api-version=2017-10-01 @@ -47,14 +49,15 @@ interactions: cache-control: [no-cache] content-length: ['0'] content-type: [text/plain; charset=utf-8] - date: ['Thu, 08 Feb 2018 18:09:41 GMT'] + date: ['Tue, 01 May 2018 21:45:29 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/99c50eea-5352-4c61-8ebe-eaedc669708e?monitor=true&api-version=2017-10-01'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/bd2cb830-881a-4637-84c2-2e384c7ef451?monitor=true&api-version=2017-10-01'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 Microsoft-HTTPAPI/2.0'] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1178'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1199'] status: {code: 202, message: Accepted} - request: body: null @@ -65,44 +68,17 @@ interactions: Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/99c50eea-5352-4c61-8ebe-eaedc669708e?monitor=true&api-version=2017-10-01 + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/bd2cb830-881a-4637-84c2-2e384c7ef451?monitor=true&api-version=2017-10-01 response: - body: {string: ''} - headers: - cache-control: [no-cache] - content-length: ['0'] - content-type: [text/plain; charset=utf-8] - date: ['Thu, 08 Feb 2018 18:09:58 GMT'] - expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/99c50eea-5352-4c61-8ebe-eaedc669708e?monitor=true&api-version=2017-10-01'] - pragma: [no-cache] - server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 - Microsoft-HTTPAPI/2.0'] - strict-transport-security: [max-age=31536000; includeSubDomains] - status: {code: 202, message: Accepted} -- request: - body: null - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [storage account create] - Connection: [keep-alive] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] - accept-language: [en-US] - method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/99c50eea-5352-4c61-8ebe-eaedc669708e?monitor=true&api-version=2017-10-01 - response: - body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T18:09:41.2578466Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T18:09:41.2578466Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T18:09:41.1953447Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} + body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:45:29.0276324Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:45:29.0276324Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:45:28.8244943Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} headers: cache-control: [no-cache] content-length: ['1231'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 18:10:15 GMT'] + date: ['Tue, 01 May 2018 21:45:45 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -110,6 +86,7 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] + x-content-type-options: [nosniff] status: {code: 200, message: OK} - request: body: null @@ -121,17 +98,17 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: POST uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002/listKeys?api-version=2017-10-01 response: - body: {string: '{"keys":[{"keyName":"key1","value":"W0biWroI5505hXXb8mMTaxni5qLg1As8NFyD+i+W9xGUKLXpFtbkHXkfLBrXWcY1idHQz7S8MUqFgmziXwqvaw==","permissions":"FULL"},{"keyName":"key2","value":"7yIlMPQLXNoOdNKnWYk26GIRMYREqzuIMtg9KDGcGsYHXPBb+c7zoiiEXNI7M2d4mjkuancVJ27R9KC3X31Isw==","permissions":"FULL"}]}'} + body: {string: '{"keys":[{"keyName":"key1","value":"Fe/E096AuLFd1EMAzXijduK7WC7HM5k9eYCc7NZmuVXiKf7rFZsetSlek46eL/VTxUG8AKWswK4KJfqPTtg1Nw==","permissions":"FULL"},{"keyName":"key2","value":"1p6p85c4Jtt7vU+I4URMjrWQtY3WWDWygLomej1cm/Yj43mdfwIZAUGtgv203IDvusAHe9dvsxSwxD8fUKcS8A==","permissions":"FULL"}]}'} headers: cache-control: [no-cache] content-length: ['288'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 18:10:17 GMT'] + date: ['Tue, 01 May 2018 21:45:47 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -139,7 +116,8 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] - x-ms-ratelimit-remaining-subscription-writes: ['1192'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1199'] status: {code: 200, message: OK} - request: body: null @@ -151,17 +129,17 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: POST uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002/listKeys?api-version=2017-10-01 response: - body: {string: '{"keys":[{"keyName":"key1","value":"W0biWroI5505hXXb8mMTaxni5qLg1As8NFyD+i+W9xGUKLXpFtbkHXkfLBrXWcY1idHQz7S8MUqFgmziXwqvaw==","permissions":"FULL"},{"keyName":"key2","value":"7yIlMPQLXNoOdNKnWYk26GIRMYREqzuIMtg9KDGcGsYHXPBb+c7zoiiEXNI7M2d4mjkuancVJ27R9KC3X31Isw==","permissions":"FULL"}]}'} + body: {string: '{"keys":[{"keyName":"key1","value":"Fe/E096AuLFd1EMAzXijduK7WC7HM5k9eYCc7NZmuVXiKf7rFZsetSlek46eL/VTxUG8AKWswK4KJfqPTtg1Nw==","permissions":"FULL"},{"keyName":"key2","value":"1p6p85c4Jtt7vU+I4URMjrWQtY3WWDWygLomej1cm/Yj43mdfwIZAUGtgv203IDvusAHe9dvsxSwxD8fUKcS8A==","permissions":"FULL"}]}'} headers: cache-control: [no-cache] content-length: ['288'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 18:10:18 GMT'] + date: ['Tue, 01 May 2018 21:45:47 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -169,24 +147,26 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] - x-ms-ratelimit-remaining-subscription-writes: ['1190'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1199'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:19 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:48 GMT'] x-ms-version: ['2017-07-29'] method: PUT uri: https://clitest000002.file.core.windows.net/share000003?restype=share response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:10:19 GMT'] - etag: ['"0x8D56F1F36B66BCF"'] - last-modified: ['Thu, 08 Feb 2018 18:10:19 GMT'] + date: ['Tue, 01 May 2018 21:45:48 GMT'] + etag: ['"0x8D5AFACE725A5B2"'] + last-modified: ['Tue, 01 May 2018 21:45:49 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-07-29'] @@ -196,17 +176,18 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:19 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:49 GMT'] x-ms-version: ['2017-07-29'] method: PUT uri: https://clitest000002.file.core.windows.net/share000004?restype=share response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:10:19 GMT'] - etag: ['"0x8D56F1F36EFF278"'] - last-modified: ['Thu, 08 Feb 2018 18:10:19 GMT'] + date: ['Tue, 01 May 2018 21:45:48 GMT'] + etag: ['"0x8D5AFACE7628DDA"'] + last-modified: ['Tue, 01 May 2018 21:45:49 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-07-29'] @@ -216,17 +197,18 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:19 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:49 GMT'] x-ms-version: ['2017-07-29'] method: PUT uri: https://clitest000002.file.core.windows.net/share000003/dir1?restype=directory response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:10:19 GMT'] - etag: ['"0x8D56F1F3721AC0F"'] - last-modified: ['Thu, 08 Feb 2018 18:10:20 GMT'] + date: ['Tue, 01 May 2018 21:45:49 GMT'] + etag: ['"0x8D5AFACE79417FC"'] + last-modified: ['Tue, 01 May 2018 21:45:49 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-request-server-encrypted: ['true'] @@ -237,17 +219,18 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:20 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:49 GMT'] x-ms-version: ['2017-07-29'] method: PUT uri: https://clitest000002.file.core.windows.net/share000004/dir2?restype=directory response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:10:20 GMT'] - etag: ['"0x8D56F1F37694DBE"'] - last-modified: ['Thu, 08 Feb 2018 18:10:20 GMT'] + date: ['Tue, 01 May 2018 21:45:49 GMT'] + etag: ['"0x8D5AFACE7DACAC5"'] + last-modified: ['Tue, 01 May 2018 21:45:50 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-request-server-encrypted: ['true'] @@ -258,9 +241,10 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] x-ms-content-length: ['524288'] - x-ms-date: ['Thu, 08 Feb 2018 18:10:20 GMT'] + x-ms-date: ['Tue, 01 May 2018 21:45:50 GMT'] x-ms-type: [file] x-ms-version: ['2017-07-29'] method: PUT @@ -268,9 +252,9 @@ interactions: response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:10:21 GMT'] - etag: ['"0x8D56F1F37C42E0F"'] - last-modified: ['Thu, 08 Feb 2018 18:10:21 GMT'] + date: ['Tue, 01 May 2018 21:45:50 GMT'] + etag: ['"0x8D5AFACE8372C55"'] + last-modified: ['Tue, 01 May 2018 21:45:50 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-request-server-encrypted: ['true'] @@ -282,8 +266,9 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['524288'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:21 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:50 GMT'] x-ms-range: [bytes=0-524287] x-ms-version: ['2017-07-29'] x-ms-write: [update] @@ -293,9 +278,9 @@ interactions: body: {string: ''} headers: content-md5: [WQcVkAmdId1DmJZZIzi/lQ==] - date: ['Thu, 08 Feb 2018 18:10:21 GMT'] - etag: ['"0x8D56F1F37E06F86"'] - last-modified: ['Thu, 08 Feb 2018 18:10:21 GMT'] + date: ['Tue, 01 May 2018 21:45:50 GMT'] + etag: ['"0x8D5AFACE8523356"'] + last-modified: ['Tue, 01 May 2018 21:45:50 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-request-server-encrypted: ['true'] @@ -305,8 +290,9 @@ interactions: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:21 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:51 GMT'] x-ms-version: ['2017-07-29'] method: HEAD uri: https://clitest000002.file.core.windows.net/share000003/dir1/source_file.txt @@ -315,9 +301,9 @@ interactions: headers: content-length: ['524288'] content-type: [application/octet-stream] - date: ['Thu, 08 Feb 2018 18:10:21 GMT'] - etag: ['"0x8D56F1F37E06F86"'] - last-modified: ['Thu, 08 Feb 2018 18:10:21 GMT'] + date: ['Tue, 01 May 2018 21:45:50 GMT'] + etag: ['"0x8D5AFACE8523356"'] + last-modified: ['Tue, 01 May 2018 21:45:50 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] x-ms-server-encrypted: ['true'] x-ms-type: [File] @@ -328,21 +314,22 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-copy-source: ['https://clitest4cpdiwczs2jeateqh.file.core.windows.net/shares3a3ymchzo5w7kwc25n/dir1/source_file.txt'] - x-ms-date: ['Thu, 08 Feb 2018 18:10:21 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-copy-source: ['https://clitestmkl7mkwejyngxmxpm.file.core.windows.net/shareyna7cyahtxr2rinh26g/dir1/source_file.txt'] + x-ms-date: ['Tue, 01 May 2018 21:45:51 GMT'] x-ms-version: ['2017-07-29'] method: PUT uri: https://clitest000002.file.core.windows.net/share000004/dir2/destination_file.txt response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:10:22 GMT'] - etag: ['"0x8D56F1F38EE028A"'] - last-modified: ['Thu, 08 Feb 2018 18:10:23 GMT'] + date: ['Tue, 01 May 2018 21:45:52 GMT'] + etag: ['"0x8D5AFACE920F344"'] + last-modified: ['Tue, 01 May 2018 21:45:52 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-copy-id: [9191a902-f4c4-4771-81c3-1ef7dfc4fecf] + x-ms-copy-id: [601d8f07-18e3-4b8c-b460-532a978f41e0] x-ms-copy-status: [success] x-ms-version: ['2017-07-29'] status: {code: 202, message: Accepted} @@ -350,8 +337,9 @@ interactions: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:23 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:52 GMT'] x-ms-version: ['2017-07-29'] method: HEAD uri: https://clitest000002.file.core.windows.net/share000004/dir2/destination_file.txt @@ -360,14 +348,14 @@ interactions: headers: content-length: ['524288'] content-type: [application/octet-stream] - date: ['Thu, 08 Feb 2018 18:10:22 GMT'] - etag: ['"0x8D56F1F38EE028A"'] - last-modified: ['Thu, 08 Feb 2018 18:10:23 GMT'] + date: ['Tue, 01 May 2018 21:45:52 GMT'] + etag: ['"0x8D5AFACE920F344"'] + last-modified: ['Tue, 01 May 2018 21:45:52 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] - x-ms-copy-completion-time: ['Thu, 08 Feb 2018 18:10:23 GMT'] - x-ms-copy-id: [9191a902-f4c4-4771-81c3-1ef7dfc4fecf] + x-ms-copy-completion-time: ['Tue, 01 May 2018 21:45:52 GMT'] + x-ms-copy-id: [601d8f07-18e3-4b8c-b460-532a978f41e0] x-ms-copy-progress: [524288/524288] - x-ms-copy-source: ['https://clitest4cpdiwczs2jeateqh.file.core.windows.net/shares3a3ymchzo5w7kwc25n/dir1/source_file.txt'] + x-ms-copy-source: ['https://clitestmkl7mkwejyngxmxpm.file.core.windows.net/shareyna7cyahtxr2rinh26g/dir1/source_file.txt'] x-ms-copy-status: [success] x-ms-server-encrypted: ['true'] x-ms-type: [File] @@ -378,21 +366,22 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-copy-source: ['https://clitest4cpdiwczs2jeateqh.file.core.windows.net/shares3a3ymchzo5w7kwc25n/dir1/source_file.txt'] - x-ms-date: ['Thu, 08 Feb 2018 18:10:23 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-copy-source: ['https://clitestmkl7mkwejyngxmxpm.file.core.windows.net/shareyna7cyahtxr2rinh26g/dir1/source_file.txt'] + x-ms-date: ['Tue, 01 May 2018 21:45:52 GMT'] x-ms-version: ['2017-07-29'] method: PUT uri: https://clitest000002.file.core.windows.net/share000004/dir2/destination_file.txt response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:10:23 GMT'] - etag: ['"0x8D56F1F39623D6C"'] - last-modified: ['Thu, 08 Feb 2018 18:10:24 GMT'] + date: ['Tue, 01 May 2018 21:45:52 GMT'] + etag: ['"0x8D5AFACE994FFD7"'] + last-modified: ['Tue, 01 May 2018 21:45:53 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-copy-id: [c5902d54-4d29-4562-8164-894fdb0a8f47] + x-ms-copy-id: [827d179d-e3bd-4800-b313-7fb4140df5af] x-ms-copy-status: [success] x-ms-version: ['2017-07-29'] status: {code: 202, message: Accepted} @@ -400,8 +389,9 @@ interactions: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:23 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:53 GMT'] x-ms-version: ['2017-07-29'] method: HEAD uri: https://clitest000002.file.core.windows.net/share000004/dir2/destination_file.txt @@ -410,14 +400,14 @@ interactions: headers: content-length: ['524288'] content-type: [application/octet-stream] - date: ['Thu, 08 Feb 2018 18:10:23 GMT'] - etag: ['"0x8D56F1F39623D6C"'] - last-modified: ['Thu, 08 Feb 2018 18:10:24 GMT'] + date: ['Tue, 01 May 2018 21:45:52 GMT'] + etag: ['"0x8D5AFACE994FFD7"'] + last-modified: ['Tue, 01 May 2018 21:45:53 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] - x-ms-copy-completion-time: ['Thu, 08 Feb 2018 18:10:24 GMT'] - x-ms-copy-id: [c5902d54-4d29-4562-8164-894fdb0a8f47] + x-ms-copy-completion-time: ['Tue, 01 May 2018 21:45:53 GMT'] + x-ms-copy-id: [827d179d-e3bd-4800-b313-7fb4140df5af] x-ms-copy-progress: [524288/524288] - x-ms-copy-source: ['https://clitest4cpdiwczs2jeateqh.file.core.windows.net/shares3a3ymchzo5w7kwc25n/dir1/source_file.txt'] + x-ms-copy-source: ['https://clitestmkl7mkwejyngxmxpm.file.core.windows.net/shareyna7cyahtxr2rinh26g/dir1/source_file.txt'] x-ms-copy-status: [success] x-ms-server-encrypted: ['true'] x-ms-type: [File] @@ -428,21 +418,22 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-copy-source: ['https://clitest4cpdiwczs2jeateqh.file.core.windows.net/shares3a3ymchzo5w7kwc25n/dir1%5Csource_file.txt'] - x-ms-date: ['Thu, 08 Feb 2018 18:10:24 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-copy-source: ['https://clitestmkl7mkwejyngxmxpm.file.core.windows.net/shareyna7cyahtxr2rinh26g/dir1%5Csource_file.txt'] + x-ms-date: ['Tue, 01 May 2018 21:45:53 GMT'] x-ms-version: ['2017-07-29'] method: PUT uri: https://clitest000002.file.core.windows.net/share000004/dir2/destination_file.txt response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:10:24 GMT'] - etag: ['"0x8D56F1F39BD44D6"'] - last-modified: ['Thu, 08 Feb 2018 18:10:24 GMT'] + date: ['Tue, 01 May 2018 21:45:53 GMT'] + etag: ['"0x8D5AFACE9F580DF"'] + last-modified: ['Tue, 01 May 2018 21:45:53 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-copy-id: [90c5d15c-c4ed-4d9a-9a8f-3f3edcf567a6] + x-ms-copy-id: [f684c650-cf44-4956-82ce-5db74c2bf490] x-ms-copy-status: [success] x-ms-version: ['2017-07-29'] status: {code: 202, message: Accepted} @@ -456,8 +447,8 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.27] + msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: DELETE uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2017-05-10 @@ -466,11 +457,12 @@ interactions: headers: cache-control: [no-cache] content-length: ['0'] - date: ['Thu, 08 Feb 2018 18:10:24 GMT'] + date: ['Tue, 01 May 2018 21:45:54 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTElURVNUOjJFUkdBVzZRSFFOM1hTWE8yNU1WNENKNkxLSE9LWktKTUtSVVlIQ3w2Mzg4MzgxQUJENEE0MjgxLVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTElURVNUOjJFUkdWWFpVVUkzUU5ZQjNaQUI1VklWN0E2QlhHSU1YWjRLNElaNHwwMjFGMUNBNjk4NkE2RUQ1LVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1189'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1198'] status: {code: 202, message: Accepted} version: 1 diff --git a/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_file_main_scenario.yaml b/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_file_main_scenario.yaml index 3c1dcfb8bc5..71f184bd169 100644 --- a/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_file_main_scenario.yaml +++ b/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_file_main_scenario.yaml @@ -1,30 +1,32 @@ interactions: - request: - body: '{"location": "westus", "tags": {"use": "az-test"}}' + body: '{"location": "westus", "tags": {"product": "azurecli", "cause": "automation", + "date": "2018-05-01T21:45:54Z"}}' headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] CommandName: [group create] Connection: [keep-alive] - Content-Length: ['50'] + Content-Length: ['110'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.27] + msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2017-05-10 response: - body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"westus","tags":{"use":"az-test"},"properties":{"provisioningState":"Succeeded"}}'} + body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"westus","tags":{"product":"azurecli","cause":"automation","date":"2018-05-01T21:45:54Z"},"properties":{"provisioningState":"Succeeded"}}'} headers: cache-control: [no-cache] - content-length: ['328'] + content-length: ['384'] content-type: [application/json; charset=utf-8] - date: ['Thu, 08 Feb 2018 18:10:26 GMT'] + date: ['Tue, 01 May 2018 21:45:54 GMT'] expires: ['-1'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1188'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1199'] status: {code: 201, message: Created} - request: body: '{"sku": {"name": "Standard_LRS"}, "kind": "Storage", "location": "westus", @@ -37,7 +39,7 @@ interactions: Content-Length: ['125'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002?api-version=2017-10-01 @@ -47,14 +49,15 @@ interactions: cache-control: [no-cache] content-length: ['0'] content-type: [text/plain; charset=utf-8] - date: ['Thu, 08 Feb 2018 18:10:28 GMT'] + date: ['Tue, 01 May 2018 21:45:55 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/c4539dfb-2da8-46b3-97d4-99e3936b829c?monitor=true&api-version=2017-10-01'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/f3763a77-bcd8-4c3d-a7ee-d5f877796408?monitor=true&api-version=2017-10-01'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 Microsoft-HTTPAPI/2.0'] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1181'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1198'] status: {code: 202, message: Accepted} - request: body: null @@ -65,44 +68,17 @@ interactions: Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/c4539dfb-2da8-46b3-97d4-99e3936b829c?monitor=true&api-version=2017-10-01 + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/f3763a77-bcd8-4c3d-a7ee-d5f877796408?monitor=true&api-version=2017-10-01 response: - body: {string: ''} - headers: - cache-control: [no-cache] - content-length: ['0'] - content-type: [text/plain; charset=utf-8] - date: ['Thu, 08 Feb 2018 18:10:45 GMT'] - expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/c4539dfb-2da8-46b3-97d4-99e3936b829c?monitor=true&api-version=2017-10-01'] - pragma: [no-cache] - server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 - Microsoft-HTTPAPI/2.0'] - strict-transport-security: [max-age=31536000; includeSubDomains] - status: {code: 202, message: Accepted} -- request: - body: null - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [storage account create] - Connection: [keep-alive] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] - accept-language: [en-US] - method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/c4539dfb-2da8-46b3-97d4-99e3936b829c?monitor=true&api-version=2017-10-01 - response: - body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T18:10:27.8047087Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T18:10:27.8047087Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T18:10:27.7578007Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} + body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:45:56.3092305Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:45:56.3092305Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:45:56.1373257Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} headers: cache-control: [no-cache] content-length: ['1231'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 18:11:02 GMT'] + date: ['Tue, 01 May 2018 21:46:12 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -110,6 +86,7 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] + x-content-type-options: [nosniff] status: {code: 200, message: OK} - request: body: null @@ -121,17 +98,17 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: POST uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002/listKeys?api-version=2017-10-01 response: - body: {string: '{"keys":[{"keyName":"key1","value":"2KAvzS5kuzqep2D/vqmnQma+Uh2BYniNyaF/aHHH9mfehkvNSysCRoovtOEjCj/oN80O1QHqJcQWprZPWTFPYA==","permissions":"FULL"},{"keyName":"key2","value":"zMHodo4tnGVmUSUtJelsPikjdNVF/FajrSN1pC/DvCrkCGQC7M+Ra+5oUnxurjrQDGq581ep3UnClECLAgB5oQ==","permissions":"FULL"}]}'} + body: {string: '{"keys":[{"keyName":"key1","value":"Krg2dym2VgbL8W0f3/h6/tf/fDpW8KTtXFkWoajTbzwiBXnIJ88JzZQpMPqCYArRBwkS3nY9L1qGd38HYmXVgA==","permissions":"FULL"},{"keyName":"key2","value":"tmqcWdPZpw6i9kSzsejkceWBJVBuvQ41DkojSGq8q8GO2ns2oMTIHe373wyVxydtioX1yZa3q/thL+6RnG85Ow==","permissions":"FULL"}]}'} headers: cache-control: [no-cache] content-length: ['288'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 18:11:03 GMT'] + date: ['Tue, 01 May 2018 21:46:14 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -139,7 +116,8 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] - x-ms-ratelimit-remaining-subscription-writes: ['1190'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1198'] status: {code: 200, message: OK} - request: body: null @@ -151,17 +129,17 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: POST uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002/listKeys?api-version=2017-10-01 response: - body: {string: '{"keys":[{"keyName":"key1","value":"2KAvzS5kuzqep2D/vqmnQma+Uh2BYniNyaF/aHHH9mfehkvNSysCRoovtOEjCj/oN80O1QHqJcQWprZPWTFPYA==","permissions":"FULL"},{"keyName":"key2","value":"zMHodo4tnGVmUSUtJelsPikjdNVF/FajrSN1pC/DvCrkCGQC7M+Ra+5oUnxurjrQDGq581ep3UnClECLAgB5oQ==","permissions":"FULL"}]}'} + body: {string: '{"keys":[{"keyName":"key1","value":"Krg2dym2VgbL8W0f3/h6/tf/fDpW8KTtXFkWoajTbzwiBXnIJ88JzZQpMPqCYArRBwkS3nY9L1qGd38HYmXVgA==","permissions":"FULL"},{"keyName":"key2","value":"tmqcWdPZpw6i9kSzsejkceWBJVBuvQ41DkojSGq8q8GO2ns2oMTIHe373wyVxydtioX1yZa3q/thL+6RnG85Ow==","permissions":"FULL"}]}'} headers: cache-control: [no-cache] content-length: ['288'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 18:11:04 GMT'] + date: ['Tue, 01 May 2018 21:46:15 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -169,24 +147,26 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] - x-ms-ratelimit-remaining-subscription-writes: ['1186'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1199'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:11:04 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:15 GMT'] x-ms-version: ['2017-07-29'] method: PUT uri: https://clitest000002.file.core.windows.net/share000003?restype=share response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:11:03 GMT'] - etag: ['"0x8D56F1F5193A40A"'] - last-modified: ['Thu, 08 Feb 2018 18:11:04 GMT'] + date: ['Tue, 01 May 2018 21:46:15 GMT'] + etag: ['"0x8D5AFACF735FDAA"'] + last-modified: ['Tue, 01 May 2018 21:46:15 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-07-29'] @@ -196,8 +176,9 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:11:04 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:16 GMT'] x-ms-meta-cat: [hat] x-ms-meta-foo: [bar] x-ms-version: ['2017-07-29'] @@ -206,9 +187,9 @@ interactions: response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:11:04 GMT'] - etag: ['"0x8D56F1F51CD4B42"'] - last-modified: ['Thu, 08 Feb 2018 18:11:04 GMT'] + date: ['Tue, 01 May 2018 21:46:15 GMT'] + etag: ['"0x8D5AFACF76CBAB9"'] + last-modified: ['Tue, 01 May 2018 21:46:16 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-07-29'] @@ -217,17 +198,18 @@ interactions: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:11:05 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:16 GMT'] x-ms-version: ['2017-07-29'] method: GET uri: https://clitest000002.file.core.windows.net/share000003?restype=share response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:11:05 GMT'] - etag: ['"0x8D56F1F5193A40A"'] - last-modified: ['Thu, 08 Feb 2018 18:11:04 GMT'] + date: ['Tue, 01 May 2018 21:46:16 GMT'] + etag: ['"0x8D5AFACF735FDAA"'] + last-modified: ['Tue, 01 May 2018 21:46:15 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-share-quota: ['5120'] @@ -237,17 +219,18 @@ interactions: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:11:05 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:16 GMT'] x-ms-version: ['2017-07-29'] method: GET uri: https://clitest000002.file.core.windows.net/share000004?restype=share&comp=metadata response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:11:04 GMT'] - etag: ['"0x8D56F1F51CD4B42"'] - last-modified: ['Thu, 08 Feb 2018 18:11:04 GMT'] + date: ['Tue, 01 May 2018 21:46:16 GMT'] + etag: ['"0x8D5AFACF76CBAB9"'] + last-modified: ['Tue, 01 May 2018 21:46:16 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-meta-cat: [hat] @@ -258,20 +241,21 @@ interactions: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:11:05 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:17 GMT'] x-ms-version: ['2017-07-29'] method: GET uri: https://clitest000002.file.core.windows.net/?comp=list response: body: {string: "\uFEFFshare000004Thu,\ - \ 08 Feb 2018 18:11:04 GMT\"0x8D56F1F51CD4B42\"5120share000003Thu,\ - \ 08 Feb 2018 18:11:04 GMT\"0x8D56F1F5193A40A\"5120share000004Tue,\ + \ 01 May 2018 21:46:16 GMT\"0x8D5AFACF76CBAB9\"5120share000003Tue,\ + \ 01 May 2018 21:46:15 GMT\"0x8D5AFACF735FDAA\"5120"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:11:05 GMT'] + date: ['Tue, 01 May 2018 21:46:16 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-07-29'] @@ -281,8 +265,9 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:11:05 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:17 GMT'] x-ms-meta-a: [b] x-ms-meta-c: [d] x-ms-version: ['2017-07-29'] @@ -291,9 +276,9 @@ interactions: response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:11:05 GMT'] - etag: ['"0x8D56F1F52778D4E"'] - last-modified: ['Thu, 08 Feb 2018 18:11:06 GMT'] + date: ['Tue, 01 May 2018 21:46:17 GMT'] + etag: ['"0x8D5AFACF851B80F"'] + last-modified: ['Tue, 01 May 2018 21:46:17 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-07-29'] @@ -302,17 +287,18 @@ interactions: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:11:06 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:18 GMT'] x-ms-version: ['2017-07-29'] method: GET uri: https://clitest000002.file.core.windows.net/share000003?restype=share&comp=metadata response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:11:06 GMT'] - etag: ['"0x8D56F1F52778D4E"'] - last-modified: ['Thu, 08 Feb 2018 18:11:06 GMT'] + date: ['Tue, 01 May 2018 21:46:17 GMT'] + etag: ['"0x8D5AFACF851B80F"'] + last-modified: ['Tue, 01 May 2018 21:46:17 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-meta-a: [b] @@ -324,17 +310,18 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:11:06 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:18 GMT'] x-ms-version: ['2017-07-29'] method: PUT uri: https://clitest000002.file.core.windows.net/share000003?restype=share&comp=metadata response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:11:06 GMT'] - etag: ['"0x8D56F1F52D7720B"'] - last-modified: ['Thu, 08 Feb 2018 18:11:06 GMT'] + date: ['Tue, 01 May 2018 21:46:18 GMT'] + etag: ['"0x8D5AFACF8C7EF15"'] + last-modified: ['Tue, 01 May 2018 21:46:18 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-07-29'] @@ -343,17 +330,18 @@ interactions: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:11:06 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:18 GMT'] x-ms-version: ['2017-07-29'] method: GET uri: https://clitest000002.file.core.windows.net/share000003?restype=share&comp=metadata response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:11:06 GMT'] - etag: ['"0x8D56F1F52D7720B"'] - last-modified: ['Thu, 08 Feb 2018 18:11:06 GMT'] + date: ['Tue, 01 May 2018 21:46:18 GMT'] + etag: ['"0x8D5AFACF8C7EF15"'] + last-modified: ['Tue, 01 May 2018 21:46:18 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-07-29'] @@ -363,8 +351,9 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:11:07 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:19 GMT'] x-ms-share-quota: ['3'] x-ms-version: ['2017-07-29'] method: PUT @@ -372,9 +361,9 @@ interactions: response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:11:06 GMT'] - etag: ['"0x8D56F1F53313B2B"'] - last-modified: ['Thu, 08 Feb 2018 18:11:07 GMT'] + date: ['Tue, 01 May 2018 21:46:18 GMT'] + etag: ['"0x8D5AFACF931A01C"'] + last-modified: ['Tue, 01 May 2018 21:46:19 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-07-29'] @@ -383,17 +372,18 @@ interactions: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:11:07 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:19 GMT'] x-ms-version: ['2017-07-29'] method: GET uri: https://clitest000002.file.core.windows.net/share000003?restype=share response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:11:07 GMT'] - etag: ['"0x8D56F1F53313B2B"'] - last-modified: ['Thu, 08 Feb 2018 18:11:07 GMT'] + date: ['Tue, 01 May 2018 21:46:18 GMT'] + etag: ['"0x8D5AFACF931A01C"'] + last-modified: ['Tue, 01 May 2018 21:46:19 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-share-quota: ['3'] @@ -404,9 +394,10 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] x-ms-content-length: ['131072'] - x-ms-date: ['Thu, 08 Feb 2018 18:11:07 GMT'] + x-ms-date: ['Tue, 01 May 2018 21:46:19 GMT'] x-ms-type: [file] x-ms-version: ['2017-07-29'] method: PUT @@ -414,9 +405,9 @@ interactions: response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:11:07 GMT'] - etag: ['"0x8D56F1F53A66DAB"'] - last-modified: ['Thu, 08 Feb 2018 18:11:08 GMT'] + date: ['Tue, 01 May 2018 21:46:19 GMT'] + etag: ['"0x8D5AFACF9C0746C"'] + last-modified: ['Tue, 01 May 2018 21:46:20 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-request-server-encrypted: ['true'] @@ -3876,8 +3867,9 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['131072'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:11:08 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:20 GMT'] x-ms-range: [bytes=0-131071] x-ms-version: ['2017-07-29'] x-ms-write: [update] @@ -3887,9 +3879,9 @@ interactions: body: {string: ''} headers: content-md5: [DfvoqkwgtS4bi/PLbL3xkw==] - date: ['Thu, 08 Feb 2018 18:11:08 GMT'] - etag: ['"0x8D56F1F53BF0368"'] - last-modified: ['Thu, 08 Feb 2018 18:11:08 GMT'] + date: ['Tue, 01 May 2018 21:46:19 GMT'] + etag: ['"0x8D5AFACF9D9F5F5"'] + last-modified: ['Tue, 01 May 2018 21:46:20 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-request-server-encrypted: ['true'] @@ -3899,8 +3891,9 @@ interactions: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:11:08 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:20 GMT'] x-ms-version: ['2017-07-29'] method: HEAD uri: https://clitest000002.file.core.windows.net/share000003/sample_file.bin @@ -3909,9 +3902,9 @@ interactions: headers: content-length: ['131072'] content-type: [application/octet-stream] - date: ['Thu, 08 Feb 2018 18:11:08 GMT'] - etag: ['"0x8D56F1F53BF0368"'] - last-modified: ['Thu, 08 Feb 2018 18:11:08 GMT'] + date: ['Tue, 01 May 2018 21:46:19 GMT'] + etag: ['"0x8D5AFACF9D9F5F5"'] + last-modified: ['Tue, 01 May 2018 21:46:20 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] x-ms-server-encrypted: ['true'] x-ms-type: [File] @@ -3921,8 +3914,9 @@ interactions: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:11:08 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:20 GMT'] x-ms-range: [bytes=0-33554431] x-ms-version: ['2017-07-29'] method: GET @@ -7476,9 +7470,9 @@ interactions: content-length: ['131072'] content-range: [bytes 0-131071/131072] content-type: [application/octet-stream] - date: ['Thu, 08 Feb 2018 18:11:07 GMT'] - etag: ['"0x8D56F1F53BF0368"'] - last-modified: ['Thu, 08 Feb 2018 18:11:08 GMT'] + date: ['Tue, 01 May 2018 21:46:20 GMT'] + etag: ['"0x8D5AFACF9D9F5F5"'] + last-modified: ['Tue, 01 May 2018 21:46:20 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] x-ms-server-encrypted: ['true'] x-ms-type: [File] @@ -7488,8 +7482,9 @@ interactions: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:11:09 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:21 GMT'] x-ms-range: [bytes=0-511] x-ms-version: ['2017-07-29'] method: GET @@ -7514,9 +7509,9 @@ interactions: content-length: ['512'] content-range: [bytes 0-511/131072] content-type: [application/octet-stream] - date: ['Thu, 08 Feb 2018 18:11:08 GMT'] - etag: ['"0x8D56F1F53BF0368"'] - last-modified: ['Thu, 08 Feb 2018 18:11:08 GMT'] + date: ['Tue, 01 May 2018 21:46:20 GMT'] + etag: ['"0x8D5AFACF9D9F5F5"'] + last-modified: ['Tue, 01 May 2018 21:46:20 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] x-ms-server-encrypted: ['true'] x-ms-type: [File] @@ -7527,18 +7522,19 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] x-ms-content-length: ['1234'] - x-ms-date: ['Thu, 08 Feb 2018 18:11:09 GMT'] + x-ms-date: ['Tue, 01 May 2018 21:46:21 GMT'] x-ms-version: ['2017-07-29'] method: PUT uri: https://clitest000002.file.core.windows.net/share000003/sample_file.bin?comp=properties response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:11:10 GMT'] - etag: ['"0x8D56F1F55577DD0"'] - last-modified: ['Thu, 08 Feb 2018 18:11:10 GMT'] + date: ['Tue, 01 May 2018 21:46:20 GMT'] + etag: ['"0x8D5AFACFABE720B"'] + last-modified: ['Tue, 01 May 2018 21:46:21 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-request-server-encrypted: ['true'] @@ -7548,8 +7544,9 @@ interactions: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:11:11 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:22 GMT'] x-ms-version: ['2017-07-29'] method: HEAD uri: https://clitest000002.file.core.windows.net/share000003/sample_file.bin @@ -7558,9 +7555,9 @@ interactions: headers: content-length: ['1234'] content-type: [application/octet-stream] - date: ['Thu, 08 Feb 2018 18:11:10 GMT'] - etag: ['"0x8D56F1F55577DD0"'] - last-modified: ['Thu, 08 Feb 2018 18:11:10 GMT'] + date: ['Tue, 01 May 2018 21:46:21 GMT'] + etag: ['"0x8D5AFACFABE720B"'] + last-modified: ['Tue, 01 May 2018 21:46:21 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] x-ms-server-encrypted: ['true'] x-ms-type: [File] @@ -7571,8 +7568,9 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:11:11 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:22 GMT'] x-ms-meta-a: [b] x-ms-meta-c: [d] x-ms-version: ['2017-07-29'] @@ -7581,9 +7579,9 @@ interactions: response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:11:11 GMT'] - etag: ['"0x8D56F1F55AF72CE"'] - last-modified: ['Thu, 08 Feb 2018 18:11:11 GMT'] + date: ['Tue, 01 May 2018 21:46:22 GMT'] + etag: ['"0x8D5AFACFB303ACC"'] + last-modified: ['Tue, 01 May 2018 21:46:22 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-request-server-encrypted: ['true'] @@ -7593,17 +7591,18 @@ interactions: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:11:11 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:22 GMT'] x-ms-version: ['2017-07-29'] method: GET uri: https://clitest000002.file.core.windows.net/share000003/sample_file.bin?comp=metadata response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:11:11 GMT'] - etag: ['"0x8D56F1F55AF72CE"'] - last-modified: ['Thu, 08 Feb 2018 18:11:11 GMT'] + date: ['Tue, 01 May 2018 21:46:22 GMT'] + etag: ['"0x8D5AFACFB303ACC"'] + last-modified: ['Tue, 01 May 2018 21:46:22 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-meta-a: [b] @@ -7615,17 +7614,18 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:11:11 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:23 GMT'] x-ms-version: ['2017-07-29'] method: PUT uri: https://clitest000002.file.core.windows.net/share000003/sample_file.bin?comp=metadata response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:11:11 GMT'] - etag: ['"0x8D56F1F56082AF4"'] - last-modified: ['Thu, 08 Feb 2018 18:11:12 GMT'] + date: ['Tue, 01 May 2018 21:46:22 GMT'] + etag: ['"0x8D5AFACFB9B4B36"'] + last-modified: ['Tue, 01 May 2018 21:46:23 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-request-server-encrypted: ['true'] @@ -7635,17 +7635,18 @@ interactions: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:11:12 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:23 GMT'] x-ms-version: ['2017-07-29'] method: GET uri: https://clitest000002.file.core.windows.net/share000003/sample_file.bin?comp=metadata response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:11:11 GMT'] - etag: ['"0x8D56F1F56082AF4"'] - last-modified: ['Thu, 08 Feb 2018 18:11:12 GMT'] + date: ['Tue, 01 May 2018 21:46:22 GMT'] + etag: ['"0x8D5AFACFB9B4B36"'] + last-modified: ['Tue, 01 May 2018 21:46:23 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-07-29'] @@ -7654,8 +7655,9 @@ interactions: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:11:12 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:23 GMT'] x-ms-version: ['2017-07-29'] method: GET uri: https://clitest000002.file.core.windows.net/share000003?restype=directory&comp=list @@ -7666,7 +7668,7 @@ interactions: \ />"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:11:11 GMT'] + date: ['Tue, 01 May 2018 21:46:23 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-07-29'] @@ -7675,8 +7677,9 @@ interactions: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:11:12 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:24 GMT'] x-ms-version: ['2017-07-29'] method: HEAD uri: https://clitest000002.file.core.windows.net/share000003/sample_file.bin @@ -7685,9 +7688,9 @@ interactions: headers: content-length: ['1234'] content-type: [application/octet-stream] - date: ['Thu, 08 Feb 2018 18:11:13 GMT'] - etag: ['"0x8D56F1F56082AF4"'] - last-modified: ['Thu, 08 Feb 2018 18:11:12 GMT'] + date: ['Tue, 01 May 2018 21:46:23 GMT'] + etag: ['"0x8D5AFACFB9B4B36"'] + last-modified: ['Tue, 01 May 2018 21:46:23 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] x-ms-server-encrypted: ['false'] x-ms-type: [File] @@ -7698,18 +7701,19 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] x-ms-content-type: [test/type] - x-ms-date: ['Thu, 08 Feb 2018 18:11:13 GMT'] + x-ms-date: ['Tue, 01 May 2018 21:46:24 GMT'] x-ms-version: ['2017-07-29'] method: PUT uri: https://clitest000002.file.core.windows.net/share000003/sample_file.bin?comp=properties response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:11:12 GMT'] - etag: ['"0x8D56F1F56BC0D00"'] - last-modified: ['Thu, 08 Feb 2018 18:11:13 GMT'] + date: ['Tue, 01 May 2018 21:46:23 GMT'] + etag: ['"0x8D5AFACFC8D3802"'] + last-modified: ['Tue, 01 May 2018 21:46:24 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-request-server-encrypted: ['true'] @@ -7719,8 +7723,9 @@ interactions: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:11:13 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:25 GMT'] x-ms-version: ['2017-07-29'] method: HEAD uri: https://clitest000002.file.core.windows.net/share000003/sample_file.bin @@ -7729,9 +7734,9 @@ interactions: headers: content-length: ['1234'] content-type: [test/type] - date: ['Thu, 08 Feb 2018 18:11:13 GMT'] - etag: ['"0x8D56F1F56BC0D00"'] - last-modified: ['Thu, 08 Feb 2018 18:11:13 GMT'] + date: ['Tue, 01 May 2018 21:46:24 GMT'] + etag: ['"0x8D5AFACFC8D3802"'] + last-modified: ['Tue, 01 May 2018 21:46:24 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] x-ms-server-encrypted: ['false'] x-ms-type: [File] @@ -7742,15 +7747,16 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:11:13 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:25 GMT'] x-ms-version: ['2017-07-29'] method: DELETE uri: https://clitest000002.file.core.windows.net/share000003/sample_file.bin response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:11:13 GMT'] + date: ['Tue, 01 May 2018 21:46:25 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-07-29'] @@ -7759,15 +7765,16 @@ interactions: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:11:13 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:25 GMT'] x-ms-version: ['2017-07-29'] method: HEAD uri: https://clitest000002.file.core.windows.net/share000003/sample_file.bin response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:11:14 GMT'] + date: ['Tue, 01 May 2018 21:46:25 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-error-code: [ResourceNotFound] @@ -7778,17 +7785,18 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:11:14 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:26 GMT'] x-ms-version: ['2017-07-29'] method: PUT uri: https://clitest000002.file.core.windows.net/share000003/dir000005?restype=directory response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:11:14 GMT'] - etag: ['"0x8D56F1F576A6FC7"'] - last-modified: ['Thu, 08 Feb 2018 18:11:14 GMT'] + date: ['Tue, 01 May 2018 21:46:26 GMT'] + etag: ['"0x8D5AFACFD6D463D"'] + last-modified: ['Tue, 01 May 2018 21:46:26 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-request-server-encrypted: ['true'] @@ -7798,8 +7806,9 @@ interactions: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:11:14 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:26 GMT'] x-ms-version: ['2017-07-29'] method: GET uri: https://clitest000002.file.core.windows.net/share000003?restype=directory&comp=list @@ -7810,7 +7819,7 @@ interactions: \ />"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:11:14 GMT'] + date: ['Tue, 01 May 2018 21:46:26 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-07-29'] @@ -7819,17 +7828,18 @@ interactions: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:11:14 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:26 GMT'] x-ms-version: ['2017-07-29'] method: GET uri: https://clitest000002.file.core.windows.net/share000003/dir000005?restype=directory response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:11:14 GMT'] - etag: ['"0x8D56F1F576A6FC7"'] - last-modified: ['Thu, 08 Feb 2018 18:11:14 GMT'] + date: ['Tue, 01 May 2018 21:46:27 GMT'] + etag: ['"0x8D5AFACFD6D463D"'] + last-modified: ['Tue, 01 May 2018 21:46:26 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-server-encrypted: ['true'] @@ -7840,8 +7850,9 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:11:15 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:27 GMT'] x-ms-meta-a: [b] x-ms-meta-c: [d] x-ms-version: ['2017-07-29'] @@ -7850,9 +7861,9 @@ interactions: response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:11:15 GMT'] - etag: ['"0x8D56F1F57E6E38F"'] - last-modified: ['Thu, 08 Feb 2018 18:11:15 GMT'] + date: ['Tue, 01 May 2018 21:46:26 GMT'] + etag: ['"0x8D5AFACFE0BCF00"'] + last-modified: ['Tue, 01 May 2018 21:46:27 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-request-server-encrypted: ['true'] @@ -7862,17 +7873,18 @@ interactions: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:11:15 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:27 GMT'] x-ms-version: ['2017-07-29'] method: GET uri: https://clitest000002.file.core.windows.net/share000003/dir000005?restype=directory&comp=metadata response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:11:14 GMT'] - etag: ['"0x8D56F1F57E6E38F"'] - last-modified: ['Thu, 08 Feb 2018 18:11:15 GMT'] + date: ['Tue, 01 May 2018 21:46:27 GMT'] + etag: ['"0x8D5AFACFE0BCF00"'] + last-modified: ['Tue, 01 May 2018 21:46:27 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-meta-a: [b] @@ -7883,17 +7895,18 @@ interactions: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:11:15 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:27 GMT'] x-ms-version: ['2017-07-29'] method: GET uri: https://clitest000002.file.core.windows.net/share000003/dir000005?restype=directory response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:11:15 GMT'] - etag: ['"0x8D56F1F57E6E38F"'] - last-modified: ['Thu, 08 Feb 2018 18:11:15 GMT'] + date: ['Tue, 01 May 2018 21:46:27 GMT'] + etag: ['"0x8D5AFACFE0BCF00"'] + last-modified: ['Tue, 01 May 2018 21:46:27 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-meta-a: [b] @@ -7906,17 +7919,18 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:11:15 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:28 GMT'] x-ms-version: ['2017-07-29'] method: PUT uri: https://clitest000002.file.core.windows.net/share000003/dir000005?restype=directory&comp=metadata response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:11:15 GMT'] - etag: ['"0x8D56F1F5862E20C"'] - last-modified: ['Thu, 08 Feb 2018 18:11:16 GMT'] + date: ['Tue, 01 May 2018 21:46:27 GMT'] + etag: ['"0x8D5AFACFEB5A51F"'] + last-modified: ['Tue, 01 May 2018 21:46:28 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-request-server-encrypted: ['true'] @@ -7926,17 +7940,18 @@ interactions: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:11:16 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:28 GMT'] x-ms-version: ['2017-07-29'] method: GET uri: https://clitest000002.file.core.windows.net/share000003/dir000005?restype=directory&comp=metadata response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:11:15 GMT'] - etag: ['"0x8D56F1F5862E20C"'] - last-modified: ['Thu, 08 Feb 2018 18:11:16 GMT'] + date: ['Tue, 01 May 2018 21:46:28 GMT'] + etag: ['"0x8D5AFACFEB5A51F"'] + last-modified: ['Tue, 01 May 2018 21:46:28 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-07-29'] @@ -7946,9 +7961,10 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] x-ms-content-length: ['65536'] - x-ms-date: ['Thu, 08 Feb 2018 18:11:16 GMT'] + x-ms-date: ['Tue, 01 May 2018 21:46:29 GMT'] x-ms-type: [file] x-ms-version: ['2017-07-29'] method: PUT @@ -7956,9 +7972,9 @@ interactions: response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:11:15 GMT'] - etag: ['"0x8D56F1F58BEF659"'] - last-modified: ['Thu, 08 Feb 2018 18:11:16 GMT'] + date: ['Tue, 01 May 2018 21:46:29 GMT'] + etag: ['"0x8D5AFACFF2CC653"'] + last-modified: ['Tue, 01 May 2018 21:46:29 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-request-server-encrypted: ['true'] @@ -9693,8 +9709,9 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['65536'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:11:16 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:29 GMT'] x-ms-range: [bytes=0-65535] x-ms-version: ['2017-07-29'] x-ms-write: [update] @@ -9704,9 +9721,9 @@ interactions: body: {string: ''} headers: content-md5: [/Na8tWwWifzvKLV8IkdbrQ==] - date: ['Thu, 08 Feb 2018 18:11:15 GMT'] - etag: ['"0x8D56F1F58CD9F2C"'] - last-modified: ['Thu, 08 Feb 2018 18:11:16 GMT'] + date: ['Tue, 01 May 2018 21:46:29 GMT'] + etag: ['"0x8D5AFACFF4164B0"'] + last-modified: ['Tue, 01 May 2018 21:46:29 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-request-server-encrypted: ['true'] @@ -9716,8 +9733,9 @@ interactions: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:11:16 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:29 GMT'] x-ms-version: ['2017-07-29'] method: HEAD uri: https://clitest000002.file.core.windows.net/share000003/dir000005/testfile.txt @@ -9726,9 +9744,9 @@ interactions: headers: content-length: ['65536'] content-type: [application/octet-stream] - date: ['Thu, 08 Feb 2018 18:11:16 GMT'] - etag: ['"0x8D56F1F58CD9F2C"'] - last-modified: ['Thu, 08 Feb 2018 18:11:16 GMT'] + date: ['Tue, 01 May 2018 21:46:29 GMT'] + etag: ['"0x8D5AFACFF4164B0"'] + last-modified: ['Tue, 01 May 2018 21:46:29 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] x-ms-server-encrypted: ['true'] x-ms-type: [File] @@ -9738,8 +9756,9 @@ interactions: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:11:17 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:30 GMT'] x-ms-range: [bytes=0-33554431] x-ms-version: ['2017-07-29'] method: GET @@ -11522,9 +11541,9 @@ interactions: content-length: ['65536'] content-range: [bytes 0-65535/65536] content-type: [application/octet-stream] - date: ['Thu, 08 Feb 2018 18:11:17 GMT'] - etag: ['"0x8D56F1F58CD9F2C"'] - last-modified: ['Thu, 08 Feb 2018 18:11:16 GMT'] + date: ['Tue, 01 May 2018 21:46:30 GMT'] + etag: ['"0x8D5AFACFF4164B0"'] + last-modified: ['Tue, 01 May 2018 21:46:29 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] x-ms-server-encrypted: ['true'] x-ms-type: [File] @@ -11534,8 +11553,9 @@ interactions: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:11:17 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:30 GMT'] x-ms-version: ['2017-07-29'] method: GET uri: https://clitest000002.file.core.windows.net/share000003/dir000005?restype=directory&comp=list @@ -11546,7 +11566,7 @@ interactions: \ />"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:11:16 GMT'] + date: ['Tue, 01 May 2018 21:46:29 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-07-29'] @@ -11555,8 +11575,9 @@ interactions: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:11:17 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:30 GMT'] x-ms-version: ['2017-07-29'] method: GET uri: https://clitest000002.file.core.windows.net/share000003?restype=share&comp=stats @@ -11564,7 +11585,7 @@ interactions: body: {string: "\uFEFF1"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:11:17 GMT'] + date: ['Tue, 01 May 2018 21:46:30 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-07-29'] @@ -11574,15 +11595,16 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:11:18 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:31 GMT'] x-ms-version: ['2017-07-29'] method: DELETE uri: https://clitest000002.file.core.windows.net/share000003/dir000005/testfile.txt response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:11:17 GMT'] + date: ['Tue, 01 May 2018 21:46:30 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-07-29'] @@ -11591,15 +11613,16 @@ interactions: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:11:18 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:31 GMT'] x-ms-version: ['2017-07-29'] method: HEAD uri: https://clitest000002.file.core.windows.net/share000003/testfile.txt response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:11:18 GMT'] + date: ['Tue, 01 May 2018 21:46:31 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-error-code: [ResourceNotFound] @@ -11610,15 +11633,16 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:11:18 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:31 GMT'] x-ms-version: ['2017-07-29'] method: DELETE uri: https://clitest000002.file.core.windows.net/share000003/dir000005?restype=directory response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:11:18 GMT'] + date: ['Tue, 01 May 2018 21:46:31 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-07-29'] @@ -11627,19 +11651,20 @@ interactions: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:11:18 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:32 GMT'] x-ms-version: ['2017-07-29'] method: GET uri: https://clitest000002.file.core.windows.net/share000003/dir000005?restype=directory response: body: {string: "\uFEFFResourceNotFoundThe\ - \ specified resource does not exist.\nRequestId:781aa763-001a-00a1-6008-a14f24000000\n\ - Time:2018-02-08T18:11:19.0039587Z"} + \ specified resource does not exist.\nRequestId:1e9b357f-901a-000d-3f95-e1020e000000\n\ + Time:2018-05-01T21:46:32.5260555Z"} headers: content-length: ['223'] content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:11:18 GMT'] + date: ['Tue, 01 May 2018 21:46:32 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] x-ms-error-code: [ResourceNotFound] x-ms-version: ['2017-07-29'] @@ -11649,8 +11674,9 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:11:19 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:32 GMT'] x-ms-meta-cat: [hat] x-ms-meta-foo: [bar] x-ms-version: ['2017-07-29'] @@ -11659,9 +11685,9 @@ interactions: response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:11:18 GMT'] - etag: ['"0x8D56F1F5A4E956B"'] - last-modified: ['Thu, 08 Feb 2018 18:11:19 GMT'] + date: ['Tue, 01 May 2018 21:46:32 GMT'] + etag: ['"0x8D5AFAD014837F9"'] + last-modified: ['Tue, 01 May 2018 21:46:32 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-request-server-encrypted: ['true'] @@ -11671,17 +11697,18 @@ interactions: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:11:19 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:33 GMT'] x-ms-version: ['2017-07-29'] method: GET uri: https://clitest000002.file.core.windows.net/share000003/dir000006?restype=directory&comp=metadata response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:11:18 GMT'] - etag: ['"0x8D56F1F5A4E956B"'] - last-modified: ['Thu, 08 Feb 2018 18:11:19 GMT'] + date: ['Tue, 01 May 2018 21:46:33 GMT'] + etag: ['"0x8D5AFAD014837F9"'] + last-modified: ['Tue, 01 May 2018 21:46:32 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-meta-cat: [hat] @@ -11693,15 +11720,16 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:11:19 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:33 GMT'] x-ms-version: ['2017-07-29'] method: DELETE uri: https://clitest000002.file.core.windows.net/share000003/dir000006?restype=directory response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:11:19 GMT'] + date: ['Tue, 01 May 2018 21:46:33 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-07-29'] @@ -11711,15 +11739,16 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:11:19 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:33 GMT'] x-ms-version: ['2017-07-29'] method: DELETE uri: https://clitest000002.file.core.windows.net/share000003?restype=share response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:11:19 GMT'] + date: ['Tue, 01 May 2018 21:46:33 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-07-29'] @@ -11734,8 +11763,8 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.27] + msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: DELETE uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2017-05-10 @@ -11744,11 +11773,12 @@ interactions: headers: cache-control: [no-cache] content-length: ['0'] - date: ['Thu, 08 Feb 2018 18:11:20 GMT'] + date: ['Tue, 01 May 2018 21:46:33 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTElURVNUOjJFUkdPQ0pLSk0zR0tZVFZMSlBOU1FET1lSN0ZJQVlTWVJERU1JWXxDRjgyRTAwRDkxMzRBMzMwLVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTElURVNUOjJFUkc3R1JITEpCVENPN002VlNXSklBRkdPNVBDUFBUTTVIRkY2Mnw2OEE5RjAxMjgwRjg4QzczLVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1178'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1198'] status: {code: 202, message: Accepted} version: 1 diff --git a/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_share_acl_scenarios.yaml b/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_share_acl_scenarios.yaml index 3961c7e0ae5..ab9378b455d 100644 --- a/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_share_acl_scenarios.yaml +++ b/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_share_acl_scenarios.yaml @@ -1,30 +1,32 @@ interactions: - request: - body: '{"location": "westus", "tags": {"use": "az-test"}}' + body: '{"location": "westus", "tags": {"product": "azurecli", "cause": "automation", + "date": "2018-05-01T21:45:51Z"}}' headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] CommandName: [group create] Connection: [keep-alive] - Content-Length: ['50'] + Content-Length: ['110'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.27] + msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2017-05-10 response: - body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"westus","tags":{"use":"az-test"},"properties":{"provisioningState":"Succeeded"}}'} + body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"westus","tags":{"product":"azurecli","cause":"automation","date":"2018-05-01T21:45:51Z"},"properties":{"provisioningState":"Succeeded"}}'} headers: cache-control: [no-cache] - content-length: ['328'] + content-length: ['384'] content-type: [application/json; charset=utf-8] - date: ['Thu, 08 Feb 2018 18:10:04 GMT'] + date: ['Tue, 01 May 2018 21:45:52 GMT'] expires: ['-1'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1183'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1198'] status: {code: 201, message: Created} - request: body: '{"sku": {"name": "Standard_LRS"}, "kind": "Storage", "location": "westus", @@ -37,7 +39,7 @@ interactions: Content-Length: ['125'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002?api-version=2017-10-01 @@ -47,14 +49,15 @@ interactions: cache-control: [no-cache] content-length: ['0'] content-type: [text/plain; charset=utf-8] - date: ['Thu, 08 Feb 2018 18:10:06 GMT'] + date: ['Tue, 01 May 2018 21:45:53 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/b7b58b78-4abd-4f84-96ab-12b663cfd383?monitor=true&api-version=2017-10-01'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/e7ddae0b-f4c9-4f86-b95d-6ffd48417905?monitor=true&api-version=2017-10-01'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 Microsoft-HTTPAPI/2.0'] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1190'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1198'] status: {code: 202, message: Accepted} - request: body: null @@ -65,17 +68,17 @@ interactions: Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/b7b58b78-4abd-4f84-96ab-12b663cfd383?monitor=true&api-version=2017-10-01 + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/e7ddae0b-f4c9-4f86-b95d-6ffd48417905?monitor=true&api-version=2017-10-01 response: - body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T18:10:06.9633470Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T18:10:06.9633470Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T18:10:06.8851899Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} + body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:45:53.6685803Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:45:53.6685803Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:45:53.5904791Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} headers: cache-control: [no-cache] content-length: ['1231'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 18:10:23 GMT'] + date: ['Tue, 01 May 2018 21:46:10 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -83,6 +86,7 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] + x-content-type-options: [nosniff] status: {code: 200, message: OK} - request: body: null @@ -94,17 +98,17 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: POST uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002/listKeys?api-version=2017-10-01 response: - body: {string: '{"keys":[{"keyName":"key1","value":"aCbbyFgmI7NqwcdyfSuSWIdoxyuXUvhagv4CfnXPOG896Qkm8achaQIvLIrBDLJdG4WBs2+UKHewLM+eIn1BUg==","permissions":"FULL"},{"keyName":"key2","value":"h4GQGCe0mQwwjE9SiZQ96foFUAsl8CmY9MWBDGJlDc4OeEnsNSL3HhGCCxdTOtrYtQs1H/hk7cZuadOypdmEWA==","permissions":"FULL"}]}'} + body: {string: '{"keys":[{"keyName":"key1","value":"QUd54/Jo5bT7xAKNnZlsCbZz0A2QWVTVVhAEu1v8LTmoinvyvTfRWuIyEI2HEO5d/Ez0LX+m5Wn7ATgkoXSa5g==","permissions":"FULL"},{"keyName":"key2","value":"DykqlYU443lHJcsyaBgq19YOwsI3jav0fWuy4mkQ+b1FM1+pWVoUe+6fMDxqWL7Ya+FrwlvgikZL5LgevJb3GA==","permissions":"FULL"}]}'} headers: cache-control: [no-cache] content-length: ['288'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 18:10:25 GMT'] + date: ['Tue, 01 May 2018 21:46:11 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -112,7 +116,8 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] - x-ms-ratelimit-remaining-subscription-writes: ['1176'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1198'] status: {code: 200, message: OK} - request: body: null @@ -124,17 +129,17 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: POST uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002/listKeys?api-version=2017-10-01 response: - body: {string: '{"keys":[{"keyName":"key1","value":"aCbbyFgmI7NqwcdyfSuSWIdoxyuXUvhagv4CfnXPOG896Qkm8achaQIvLIrBDLJdG4WBs2+UKHewLM+eIn1BUg==","permissions":"FULL"},{"keyName":"key2","value":"h4GQGCe0mQwwjE9SiZQ96foFUAsl8CmY9MWBDGJlDc4OeEnsNSL3HhGCCxdTOtrYtQs1H/hk7cZuadOypdmEWA==","permissions":"FULL"}]}'} + body: {string: '{"keys":[{"keyName":"key1","value":"QUd54/Jo5bT7xAKNnZlsCbZz0A2QWVTVVhAEu1v8LTmoinvyvTfRWuIyEI2HEO5d/Ez0LX+m5Wn7ATgkoXSa5g==","permissions":"FULL"},{"keyName":"key2","value":"DykqlYU443lHJcsyaBgq19YOwsI3jav0fWuy4mkQ+b1FM1+pWVoUe+6fMDxqWL7Ya+FrwlvgikZL5LgevJb3GA==","permissions":"FULL"}]}'} headers: cache-control: [no-cache] content-length: ['288'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 18:10:26 GMT'] + date: ['Tue, 01 May 2018 21:46:12 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -142,24 +147,26 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] - x-ms-ratelimit-remaining-subscription-writes: ['1189'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1198'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:27 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:12 GMT'] x-ms-version: ['2017-07-29'] method: PUT uri: https://clitest000002.file.core.windows.net/share000003?restype=share response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:10:27 GMT'] - etag: ['"0x8D56F1F3BA62107"'] - last-modified: ['Thu, 08 Feb 2018 18:10:27 GMT'] + date: ['Tue, 01 May 2018 21:46:12 GMT'] + etag: ['"0x8D5AFACF594FBD5"'] + last-modified: ['Tue, 01 May 2018 21:46:13 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-07-29'] @@ -168,8 +175,9 @@ interactions: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:27 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:13 GMT'] x-ms-version: ['2017-07-29'] method: GET uri: https://clitest000002.file.core.windows.net/share000003?restype=share&comp=acl @@ -178,9 +186,9 @@ interactions: \ />"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:10:27 GMT'] - etag: ['"0x8D56F1F3BA62107"'] - last-modified: ['Thu, 08 Feb 2018 18:10:27 GMT'] + date: ['Tue, 01 May 2018 21:46:13 GMT'] + etag: ['"0x8D5AFACF594FBD5"'] + last-modified: ['Tue, 01 May 2018 21:46:13 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-07-29'] @@ -189,8 +197,9 @@ interactions: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:28 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:13 GMT'] x-ms-version: ['2017-07-29'] method: GET uri: https://clitest000002.file.core.windows.net/share000003?restype=share&comp=acl @@ -199,9 +208,9 @@ interactions: \ />"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:10:27 GMT'] - etag: ['"0x8D56F1F3BA62107"'] - last-modified: ['Thu, 08 Feb 2018 18:10:27 GMT'] + date: ['Tue, 01 May 2018 21:46:13 GMT'] + etag: ['"0x8D5AFACF594FBD5"'] + last-modified: ['Tue, 01 May 2018 21:46:13 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-07-29'] @@ -213,17 +222,18 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['184'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:28 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:14 GMT'] x-ms-version: ['2017-07-29'] method: PUT uri: https://clitest000002.file.core.windows.net/share000003?restype=share&comp=acl response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:10:27 GMT'] - etag: ['"0x8D56F1F3C2BFFDE"'] - last-modified: ['Thu, 08 Feb 2018 18:10:28 GMT'] + date: ['Tue, 01 May 2018 21:46:13 GMT'] + etag: ['"0x8D5AFACF615BB26"'] + last-modified: ['Tue, 01 May 2018 21:46:14 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-07-29'] @@ -232,8 +242,9 @@ interactions: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:28 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:14 GMT'] x-ms-version: ['2017-07-29'] method: GET uri: https://clitest000002.file.core.windows.net/share000003?restype=share&comp=acl @@ -241,9 +252,9 @@ interactions: body: {string: "\uFEFFtest1l"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:10:28 GMT'] - etag: ['"0x8D56F1F3C2BFFDE"'] - last-modified: ['Thu, 08 Feb 2018 18:10:28 GMT'] + date: ['Tue, 01 May 2018 21:46:14 GMT'] + etag: ['"0x8D5AFACF615BB26"'] + last-modified: ['Tue, 01 May 2018 21:46:14 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-07-29'] @@ -255,17 +266,18 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['296'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:28 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:14 GMT'] x-ms-version: ['2017-07-29'] method: PUT uri: https://clitest000002.file.core.windows.net/share000003?restype=share&comp=acl response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:10:28 GMT'] - etag: ['"0x8D56F1F3C628616"'] - last-modified: ['Thu, 08 Feb 2018 18:10:29 GMT'] + date: ['Tue, 01 May 2018 21:46:14 GMT'] + etag: ['"0x8D5AFACF67C097E"'] + last-modified: ['Tue, 01 May 2018 21:46:14 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-07-29'] @@ -274,8 +286,9 @@ interactions: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:28 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:14 GMT'] x-ms-version: ['2017-07-29'] method: GET uri: https://clitest000002.file.core.windows.net/share000003?restype=share&comp=acl @@ -283,9 +296,9 @@ interactions: body: {string: "\uFEFFtest1ltest22016-01-01T00:00:00.0000000Z"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:10:28 GMT'] - etag: ['"0x8D56F1F3C628616"'] - last-modified: ['Thu, 08 Feb 2018 18:10:29 GMT'] + date: ['Tue, 01 May 2018 21:46:14 GMT'] + etag: ['"0x8D5AFACF67C097E"'] + last-modified: ['Tue, 01 May 2018 21:46:14 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-07-29'] @@ -297,17 +310,18 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['413'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:29 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:15 GMT'] x-ms-version: ['2017-07-29'] method: PUT uri: https://clitest000002.file.core.windows.net/share000003?restype=share&comp=acl response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:10:28 GMT'] - etag: ['"0x8D56F1F3C9B56CD"'] - last-modified: ['Thu, 08 Feb 2018 18:10:29 GMT'] + date: ['Tue, 01 May 2018 21:46:14 GMT'] + etag: ['"0x8D5AFACF6B6FA41"'] + last-modified: ['Tue, 01 May 2018 21:46:15 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-07-29'] @@ -316,8 +330,9 @@ interactions: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:29 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:15 GMT'] x-ms-version: ['2017-07-29'] method: GET uri: https://clitest000002.file.core.windows.net/share000003?restype=share&comp=acl @@ -325,9 +340,9 @@ interactions: body: {string: "\uFEFFtest1ltest22016-01-01T00:00:00.0000000Ztest32018-01-01T00:00:00.0000000Z"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:10:29 GMT'] - etag: ['"0x8D56F1F3C9B56CD"'] - last-modified: ['Thu, 08 Feb 2018 18:10:29 GMT'] + date: ['Tue, 01 May 2018 21:46:14 GMT'] + etag: ['"0x8D5AFACF6B6FA41"'] + last-modified: ['Tue, 01 May 2018 21:46:15 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-07-29'] @@ -339,17 +354,18 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['591'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:29 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:15 GMT'] x-ms-version: ['2017-07-29'] method: PUT uri: https://clitest000002.file.core.windows.net/share000003?restype=share&comp=acl response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:10:29 GMT'] - etag: ['"0x8D56F1F3CC864EF"'] - last-modified: ['Thu, 08 Feb 2018 18:10:29 GMT'] + date: ['Tue, 01 May 2018 21:46:14 GMT'] + etag: ['"0x8D5AFACF6F76A43"'] + last-modified: ['Tue, 01 May 2018 21:46:15 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-07-29'] @@ -358,8 +374,9 @@ interactions: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:29 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:15 GMT'] x-ms-version: ['2017-07-29'] method: GET uri: https://clitest000002.file.core.windows.net/share000003?restype=share&comp=acl @@ -367,9 +384,9 @@ interactions: body: {string: "\uFEFFtest1ltest22016-01-01T00:00:00.0000000Ztest32018-01-01T00:00:00.0000000Ztest42016-01-01T00:00:00.0000000Z2016-05-01T00:00:00.0000000Zrwdl"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:10:29 GMT'] - etag: ['"0x8D56F1F3CC864EF"'] - last-modified: ['Thu, 08 Feb 2018 18:10:29 GMT'] + date: ['Tue, 01 May 2018 21:46:15 GMT'] + etag: ['"0x8D5AFACF6F76A43"'] + last-modified: ['Tue, 01 May 2018 21:46:15 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-07-29'] @@ -378,8 +395,9 @@ interactions: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:29 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:16 GMT'] x-ms-version: ['2017-07-29'] method: GET uri: https://clitest000002.file.core.windows.net/share000003?restype=share&comp=acl @@ -387,9 +405,9 @@ interactions: body: {string: "\uFEFFtest1ltest22016-01-01T00:00:00.0000000Ztest32018-01-01T00:00:00.0000000Ztest42016-01-01T00:00:00.0000000Z2016-05-01T00:00:00.0000000Zrwdl"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:10:30 GMT'] - etag: ['"0x8D56F1F3CC864EF"'] - last-modified: ['Thu, 08 Feb 2018 18:10:29 GMT'] + date: ['Tue, 01 May 2018 21:46:15 GMT'] + etag: ['"0x8D5AFACF6F76A43"'] + last-modified: ['Tue, 01 May 2018 21:46:15 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-07-29'] @@ -398,8 +416,9 @@ interactions: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:30 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:16 GMT'] x-ms-version: ['2017-07-29'] method: GET uri: https://clitest000002.file.core.windows.net/share000003?restype=share&comp=acl @@ -407,9 +426,9 @@ interactions: body: {string: "\uFEFFtest1ltest22016-01-01T00:00:00.0000000Ztest32018-01-01T00:00:00.0000000Ztest42016-01-01T00:00:00.0000000Z2016-05-01T00:00:00.0000000Zrwdl"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:10:29 GMT'] - etag: ['"0x8D56F1F3CC864EF"'] - last-modified: ['Thu, 08 Feb 2018 18:10:29 GMT'] + date: ['Tue, 01 May 2018 21:46:16 GMT'] + etag: ['"0x8D5AFACF6F76A43"'] + last-modified: ['Tue, 01 May 2018 21:46:15 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-07-29'] @@ -418,8 +437,9 @@ interactions: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:30 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:16 GMT'] x-ms-version: ['2017-07-29'] method: GET uri: https://clitest000002.file.core.windows.net/share000003?restype=share&comp=acl @@ -427,9 +447,9 @@ interactions: body: {string: "\uFEFFtest1ltest22016-01-01T00:00:00.0000000Ztest32018-01-01T00:00:00.0000000Ztest42016-01-01T00:00:00.0000000Z2016-05-01T00:00:00.0000000Zrwdl"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:10:30 GMT'] - etag: ['"0x8D56F1F3CC864EF"'] - last-modified: ['Thu, 08 Feb 2018 18:10:29 GMT'] + date: ['Tue, 01 May 2018 21:46:16 GMT'] + etag: ['"0x8D5AFACF6F76A43"'] + last-modified: ['Tue, 01 May 2018 21:46:15 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-07-29'] @@ -438,8 +458,9 @@ interactions: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:30 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:17 GMT'] x-ms-version: ['2017-07-29'] method: GET uri: https://clitest000002.file.core.windows.net/share000003?restype=share&comp=acl @@ -447,9 +468,9 @@ interactions: body: {string: "\uFEFFtest1ltest22016-01-01T00:00:00.0000000Ztest32018-01-01T00:00:00.0000000Ztest42016-01-01T00:00:00.0000000Z2016-05-01T00:00:00.0000000Zrwdl"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:10:30 GMT'] - etag: ['"0x8D56F1F3CC864EF"'] - last-modified: ['Thu, 08 Feb 2018 18:10:29 GMT'] + date: ['Tue, 01 May 2018 21:46:16 GMT'] + etag: ['"0x8D5AFACF6F76A43"'] + last-modified: ['Tue, 01 May 2018 21:46:15 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-07-29'] @@ -458,8 +479,9 @@ interactions: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:30 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:17 GMT'] x-ms-version: ['2017-07-29'] method: GET uri: https://clitest000002.file.core.windows.net/share000003?restype=share&comp=acl @@ -467,9 +489,9 @@ interactions: body: {string: "\uFEFFtest1ltest22016-01-01T00:00:00.0000000Ztest32018-01-01T00:00:00.0000000Ztest42016-01-01T00:00:00.0000000Z2016-05-01T00:00:00.0000000Zrwdl"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:10:30 GMT'] - etag: ['"0x8D56F1F3CC864EF"'] - last-modified: ['Thu, 08 Feb 2018 18:10:29 GMT'] + date: ['Tue, 01 May 2018 21:46:17 GMT'] + etag: ['"0x8D5AFACF6F76A43"'] + last-modified: ['Tue, 01 May 2018 21:46:15 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-07-29'] @@ -481,17 +503,18 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['597'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:31 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:17 GMT'] x-ms-version: ['2017-07-29'] method: PUT uri: https://clitest000002.file.core.windows.net/share000003?restype=share&comp=acl response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:10:30 GMT'] - etag: ['"0x8D56F1F3DD4E46E"'] - last-modified: ['Thu, 08 Feb 2018 18:10:31 GMT'] + date: ['Tue, 01 May 2018 21:46:17 GMT'] + etag: ['"0x8D5AFACF83C80BD"'] + last-modified: ['Tue, 01 May 2018 21:46:17 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-07-29'] @@ -500,8 +523,9 @@ interactions: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:31 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:17 GMT'] x-ms-version: ['2017-07-29'] method: GET uri: https://clitest000002.file.core.windows.net/share000003?restype=share&comp=acl @@ -509,9 +533,9 @@ interactions: body: {string: "\uFEFFtest1rtest22016-01-01T00:00:00.0000000Ztest32018-01-01T00:00:00.0000000Ztest42016-01-01T00:00:00.0000000Z2016-05-01T00:00:00.0000000Zrwdl"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:10:30 GMT'] - etag: ['"0x8D56F1F3DD4E46E"'] - last-modified: ['Thu, 08 Feb 2018 18:10:31 GMT'] + date: ['Tue, 01 May 2018 21:46:17 GMT'] + etag: ['"0x8D5AFACF83C80BD"'] + last-modified: ['Tue, 01 May 2018 21:46:17 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-07-29'] @@ -520,8 +544,9 @@ interactions: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:31 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:18 GMT'] x-ms-version: ['2017-07-29'] method: GET uri: https://clitest000002.file.core.windows.net/share000003?restype=share&comp=acl @@ -529,9 +554,9 @@ interactions: body: {string: "\uFEFFtest1rtest22016-01-01T00:00:00.0000000Ztest32018-01-01T00:00:00.0000000Ztest42016-01-01T00:00:00.0000000Z2016-05-01T00:00:00.0000000Zrwdl"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:10:31 GMT'] - etag: ['"0x8D56F1F3DD4E46E"'] - last-modified: ['Thu, 08 Feb 2018 18:10:31 GMT'] + date: ['Tue, 01 May 2018 21:46:18 GMT'] + etag: ['"0x8D5AFACF83C80BD"'] + last-modified: ['Tue, 01 May 2018 21:46:17 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-07-29'] @@ -543,17 +568,18 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['491'] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:32 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:18 GMT'] x-ms-version: ['2017-07-29'] method: PUT uri: https://clitest000002.file.core.windows.net/share000003?restype=share&comp=acl response: body: {string: ''} headers: - date: ['Thu, 08 Feb 2018 18:10:31 GMT'] - etag: ['"0x8D56F1F3E61402B"'] - last-modified: ['Thu, 08 Feb 2018 18:10:32 GMT'] + date: ['Tue, 01 May 2018 21:46:18 GMT'] + etag: ['"0x8D5AFACF8B8A4FF"'] + last-modified: ['Tue, 01 May 2018 21:46:18 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-07-29'] @@ -562,8 +588,9 @@ interactions: body: null headers: Connection: [keep-alive] - User-Agent: [Azure-Storage/1.1.0-1.1.0 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:32 GMT'] + User-Agent: [Azure-Storage/1.2.0rc0-1.1.0 (Python CPython 3.6.2; Windows 10) + AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:18 GMT'] x-ms-version: ['2017-07-29'] method: GET uri: https://clitest000002.file.core.windows.net/share000003?restype=share&comp=acl @@ -571,9 +598,9 @@ interactions: body: {string: "\uFEFFtest22016-01-01T00:00:00.0000000Ztest32018-01-01T00:00:00.0000000Ztest42016-01-01T00:00:00.0000000Z2016-05-01T00:00:00.0000000Zrwdl"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:10:31 GMT'] - etag: ['"0x8D56F1F3E61402B"'] - last-modified: ['Thu, 08 Feb 2018 18:10:32 GMT'] + date: ['Tue, 01 May 2018 21:46:18 GMT'] + etag: ['"0x8D5AFACF8B8A4FF"'] + last-modified: ['Tue, 01 May 2018 21:46:18 GMT'] server: [Windows-Azure-File/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-07-29'] @@ -588,8 +615,8 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.27] + msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: DELETE uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2017-05-10 @@ -598,11 +625,12 @@ interactions: headers: cache-control: [no-cache] content-length: ['0'] - date: ['Thu, 08 Feb 2018 18:10:32 GMT'] + date: ['Tue, 01 May 2018 21:46:18 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTElURVNUOjJFUkdWRlFVUlJVUTJONktSSk8zUzJUQ0dBR1ZQQzNPQVhUTUtKVXwzMUJCRjg5NkY5NEFGNjQ5LVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTElURVNUOjJFUkdBTjZVVkpRVDQ2Rko0TEpPSlZDTlFaT1daVEdDQ1hJM0pOS3xDRDNCNDNDNUU5QTVCNTVCLVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1191'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1197'] status: {code: 202, message: Accepted} version: 1 diff --git a/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_table_main_scenario.yaml b/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_table_main_scenario.yaml index f211f104be5..acdd42171d5 100644 --- a/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_table_main_scenario.yaml +++ b/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_table_main_scenario.yaml @@ -1,30 +1,32 @@ interactions: - request: - body: '{"location": "westus", "tags": {"use": "az-test"}}' + body: '{"location": "westus", "tags": {"product": "azurecli", "cause": "automation", + "date": "2018-05-01T21:45:28Z"}}' headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] CommandName: [group create] Connection: [keep-alive] - Content-Length: ['50'] + Content-Length: ['110'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.27] + msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2017-05-10 response: - body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"westus","tags":{"use":"az-test"},"properties":{"provisioningState":"Succeeded"}}'} + body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"westus","tags":{"product":"azurecli","cause":"automation","date":"2018-05-01T21:45:28Z"},"properties":{"provisioningState":"Succeeded"}}'} headers: cache-control: [no-cache] - content-length: ['328'] + content-length: ['384'] content-type: [application/json; charset=utf-8] - date: ['Thu, 08 Feb 2018 18:09:39 GMT'] + date: ['Tue, 01 May 2018 21:45:29 GMT'] expires: ['-1'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1177'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1199'] status: {code: 201, message: Created} - request: body: '{"sku": {"name": "Standard_RAGRS"}, "kind": "Storage", "location": "westus", @@ -37,7 +39,7 @@ interactions: Content-Length: ['127'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002?api-version=2017-10-01 @@ -47,41 +49,15 @@ interactions: cache-control: [no-cache] content-length: ['0'] content-type: [text/plain; charset=utf-8] - date: ['Thu, 08 Feb 2018 18:09:41 GMT'] + date: ['Tue, 01 May 2018 21:45:31 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/3ff7d27d-7fcc-436e-9d35-d27e49f3b7dc?monitor=true&api-version=2017-10-01'] - pragma: [no-cache] - server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 - Microsoft-HTTPAPI/2.0'] - strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1190'] - status: {code: 202, message: Accepted} -- request: - body: null - headers: - Accept: [application/json] - Accept-Encoding: ['gzip, deflate'] - CommandName: [storage account create] - Connection: [keep-alive] - Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] - accept-language: [en-US] - method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/3ff7d27d-7fcc-436e-9d35-d27e49f3b7dc?monitor=true&api-version=2017-10-01 - response: - body: {string: ''} - headers: - cache-control: [no-cache] - content-length: ['0'] - content-type: [text/plain; charset=utf-8] - date: ['Thu, 08 Feb 2018 18:09:59 GMT'] - expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/3ff7d27d-7fcc-436e-9d35-d27e49f3b7dc?monitor=true&api-version=2017-10-01'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/79bcc310-b663-4574-b037-da4e4560bf93?monitor=true&api-version=2017-10-01'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 Microsoft-HTTPAPI/2.0'] strict-transport-security: [max-age=31536000; includeSubDomains] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1199'] status: {code: 202, message: Accepted} - request: body: null @@ -92,17 +68,17 @@ interactions: Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/3ff7d27d-7fcc-436e-9d35-d27e49f3b7dc?monitor=true&api-version=2017-10-01 + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/79bcc310-b663-4574-b037-da4e4560bf93?monitor=true&api-version=2017-10-01 response: - body: {string: '{"sku":{"name":"Standard_RAGRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T18:09:41.3203800Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T18:09:41.3203800Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T18:09:41.2578466Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available","secondaryLocation":"eastus","statusOfSecondary":"available","secondaryEndpoints":{"blob":"https://clitest000002-secondary.blob.core.windows.net/","queue":"https://clitest000002-secondary.queue.core.windows.net/","table":"https://clitest000002-secondary.table.core.windows.net/"}}}'} + body: {string: '{"sku":{"name":"Standard_RAGRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:45:31.1057749Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:45:31.1057749Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:45:30.8713726Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available","secondaryLocation":"eastus","statusOfSecondary":"available","secondaryEndpoints":{"blob":"https://clitest000002-secondary.blob.core.windows.net/","queue":"https://clitest000002-secondary.queue.core.windows.net/","table":"https://clitest000002-secondary.table.core.windows.net/"}}}'} headers: cache-control: [no-cache] content-length: ['1546'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 18:10:15 GMT'] + date: ['Tue, 01 May 2018 21:45:48 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -110,6 +86,7 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] + x-content-type-options: [nosniff] status: {code: 200, message: OK} - request: body: null @@ -121,17 +98,17 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: POST uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002/listKeys?api-version=2017-10-01 response: - body: {string: '{"keys":[{"keyName":"key1","value":"gUenRqzGBNK7c9nkCXwOtvsqpb565IOCw5r/I8A4i6gdilHBL1X/7zYIAQ99L8jEHcaV0MMooN8U0e2C8byikQ==","permissions":"FULL"},{"keyName":"key2","value":"rsdSJkXe2VtbzCgncfrSovT8EHV823FHC7fCJTr3uGzTxvPc+SuO4jc2s5RS/koeniuQV0TLxiVoLlxjJpxr9A==","permissions":"FULL"}]}'} + body: {string: '{"keys":[{"keyName":"key1","value":"Z3FEYeyIW6IQcbvStmYTdFMLV8s5CdlOSPJtcyjUcYiHUVsqFZ4vEhVc2l+gHDZ1RRmzHGJWFLzjSLx+MpTunQ==","permissions":"FULL"},{"keyName":"key2","value":"lP99LhszlGpYtEg9vFPFsTiVhY4yUzSOGR/uvL5Cy5EMBnu4Xd+EPS2PCfu4trIeppI7wWqUbSawLYjo7DhUBQ==","permissions":"FULL"}]}'} headers: cache-control: [no-cache] content-length: ['288'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 18:10:17 GMT'] + date: ['Tue, 01 May 2018 21:45:49 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -139,7 +116,8 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] - x-ms-ratelimit-remaining-subscription-writes: ['1194'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1199'] status: {code: 200, message: OK} - request: body: null @@ -151,17 +129,17 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: POST uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002/listKeys?api-version=2017-10-01 response: - body: {string: '{"keys":[{"keyName":"key1","value":"gUenRqzGBNK7c9nkCXwOtvsqpb565IOCw5r/I8A4i6gdilHBL1X/7zYIAQ99L8jEHcaV0MMooN8U0e2C8byikQ==","permissions":"FULL"},{"keyName":"key2","value":"rsdSJkXe2VtbzCgncfrSovT8EHV823FHC7fCJTr3uGzTxvPc+SuO4jc2s5RS/koeniuQV0TLxiVoLlxjJpxr9A==","permissions":"FULL"}]}'} + body: {string: '{"keys":[{"keyName":"key1","value":"Z3FEYeyIW6IQcbvStmYTdFMLV8s5CdlOSPJtcyjUcYiHUVsqFZ4vEhVc2l+gHDZ1RRmzHGJWFLzjSLx+MpTunQ==","permissions":"FULL"},{"keyName":"key2","value":"lP99LhszlGpYtEg9vFPFsTiVhY4yUzSOGR/uvL5Cy5EMBnu4Xd+EPS2PCfu4trIeppI7wWqUbSawLYjo7DhUBQ==","permissions":"FULL"}]}'} headers: cache-control: [no-cache] content-length: ['288'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 18:10:18 GMT'] + date: ['Tue, 01 May 2018 21:45:49 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -169,7 +147,8 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] - x-ms-ratelimit-remaining-subscription-writes: ['1188'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1198'] status: {code: 200, message: OK} - request: body: 'b''{"TableName": "table000003"}''' @@ -181,8 +160,8 @@ interactions: DataServiceVersion: [3.0;NetFx] MaxDataServiceVersion: ['3.0'] Prefer: [return-no-content] - User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:19 GMT'] + User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:50 GMT'] x-ms-version: ['2017-04-17'] method: POST uri: https://clitest000002.table.core.windows.net/Tables @@ -191,8 +170,8 @@ interactions: headers: cache-control: [no-cache] content-length: ['0'] - dataserviceid: ['https://clitestdagorqwpomx2tg7ds.table.core.windows.net/Tables(''tablegqmljj6lkxci4urehdj'')'] - date: ['Thu, 08 Feb 2018 18:10:18 GMT'] + dataserviceid: ['https://clitestydki2n33vwyrmdoub.table.core.windows.net/Tables(''tablewtfhpnleqm5yr2w4clw'')'] + date: ['Tue, 01 May 2018 21:45:50 GMT'] location: ['https://clitest000002.table.core.windows.net/Tables(''table000003'')'] preference-applied: [return-no-content] server: [Windows-Azure-Table/1.0 Microsoft-HTTPAPI/2.0] @@ -206,8 +185,8 @@ interactions: Connection: [keep-alive] DataServiceVersion: [3.0;NetFx] MaxDataServiceVersion: ['3.0'] - User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:19 GMT'] + User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:51 GMT'] x-ms-version: ['2017-04-17'] method: GET uri: https://clitest000002.table.core.windows.net/Tables('table000003') @@ -216,7 +195,7 @@ interactions: headers: cache-control: [no-cache] content-type: [application/json;odata=nometadata;streaming=true;charset=utf-8] - date: ['Thu, 08 Feb 2018 18:10:19 GMT'] + date: ['Tue, 01 May 2018 21:45:51 GMT'] server: [Windows-Azure-Table/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-content-type-options: [nosniff] @@ -229,8 +208,8 @@ interactions: Connection: [keep-alive] DataServiceVersion: [3.0;NetFx] MaxDataServiceVersion: ['3.0'] - User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:19 GMT'] + User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:51 GMT'] x-ms-version: ['2017-04-17'] method: GET uri: https://clitest000002.table.core.windows.net/Tables @@ -239,7 +218,7 @@ interactions: headers: cache-control: [no-cache] content-type: [application/json;odata=nometadata;streaming=true;charset=utf-8] - date: ['Thu, 08 Feb 2018 18:10:19 GMT'] + date: ['Tue, 01 May 2018 21:45:50 GMT'] server: [Windows-Azure-Table/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-content-type-options: [nosniff] @@ -256,8 +235,8 @@ interactions: DataServiceVersion: [3.0;NetFx] MaxDataServiceVersion: ['3.0'] Prefer: [return-no-content] - User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:20 GMT'] + User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:52 GMT'] x-ms-version: ['2017-04-17'] method: POST uri: https://clitest000002.table.core.windows.net/table000003 @@ -266,9 +245,9 @@ interactions: headers: cache-control: [no-cache] content-length: ['0'] - dataserviceid: ['https://clitestdagorqwpomx2tg7ds.table.core.windows.net/tablegqmljj6lkxci4urehdj(PartitionKey=''001'',RowKey=''001'')'] - date: ['Thu, 08 Feb 2018 18:10:20 GMT'] - etag: [W/"datetime'2018-02-08T18%3A10%3A20.8644197Z'"] + dataserviceid: ['https://clitestydki2n33vwyrmdoub.table.core.windows.net/tablewtfhpnleqm5yr2w4clw(PartitionKey=''001'',RowKey=''001'')'] + date: ['Tue, 01 May 2018 21:45:52 GMT'] + etag: [W/"datetime'2018-05-01T21%3A45%3A52.1464357Z'"] location: ['https://clitest000002.table.core.windows.net/table000003(PartitionKey=''001'',RowKey=''001'')'] preference-applied: [return-no-content] server: [Windows-Azure-Table/1.0 Microsoft-HTTPAPI/2.0] @@ -282,18 +261,18 @@ interactions: Connection: [keep-alive] DataServiceVersion: [3.0;NetFx] MaxDataServiceVersion: ['3.0'] - User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:20 GMT'] + User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:52 GMT'] x-ms-version: ['2017-04-17'] method: GET uri: https://clitest000002.table.core.windows.net/table000003(PartitionKey='001',RowKey='001') response: - body: {string: '{"odata.metadata":"https://clitest000002.table.core.windows.net/$metadata#table000003/@Element","odata.etag":"W/\"datetime''2018-02-08T18%3A10%3A20.8644197Z''\"","PartitionKey":"001","RowKey":"001","Timestamp":"2018-02-08T18:10:20.8644197Z","name":"test","value":"something"}'} + body: {string: '{"odata.metadata":"https://clitest000002.table.core.windows.net/$metadata#table000003/@Element","odata.etag":"W/\"datetime''2018-05-01T21%3A45%3A52.1464357Z''\"","PartitionKey":"001","RowKey":"001","Timestamp":"2018-05-01T21:45:52.1464357Z","name":"test","value":"something"}'} headers: cache-control: [no-cache] content-type: [application/json;odata=minimalmetadata;streaming=true;charset=utf-8] - date: ['Thu, 08 Feb 2018 18:10:20 GMT'] - etag: [W/"datetime'2018-02-08T18%3A10%3A20.8644197Z'"] + date: ['Tue, 01 May 2018 21:45:52 GMT'] + etag: [W/"datetime'2018-05-01T21%3A45%3A52.1464357Z'"] server: [Windows-Azure-Table/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-content-type-options: [nosniff] @@ -306,18 +285,18 @@ interactions: Connection: [keep-alive] DataServiceVersion: [3.0;NetFx] MaxDataServiceVersion: ['3.0'] - User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:21 GMT'] + User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:52 GMT'] x-ms-version: ['2017-04-17'] method: GET uri: https://clitest000002.table.core.windows.net/table000003(PartitionKey='001',RowKey='001')?%24select=name response: - body: {string: '{"odata.metadata":"https://clitest000002.table.core.windows.net/$metadata#table000003/@Element&$select=name","odata.etag":"W/\"datetime''2018-02-08T18%3A10%3A20.8644197Z''\"","name":"test"}'} + body: {string: '{"odata.metadata":"https://clitest000002.table.core.windows.net/$metadata#table000003/@Element&$select=name","odata.etag":"W/\"datetime''2018-05-01T21%3A45%3A52.1464357Z''\"","name":"test"}'} headers: cache-control: [no-cache] content-type: [application/json;odata=minimalmetadata;streaming=true;charset=utf-8] - date: ['Thu, 08 Feb 2018 18:10:20 GMT'] - etag: [W/"datetime'2018-02-08T18%3A10%3A20.8644197Z'"] + date: ['Tue, 01 May 2018 21:45:52 GMT'] + etag: [W/"datetime'2018-05-01T21%3A45%3A52.1464357Z'"] server: [Windows-Azure-Table/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-content-type-options: [nosniff] @@ -333,8 +312,8 @@ interactions: DataServiceVersion: [3.0;NetFx] If-Match: ['*'] MaxDataServiceVersion: ['3.0'] - User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:21 GMT'] + User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:53 GMT'] x-ms-version: ['2017-04-17'] method: MERGE uri: https://clitest000002.table.core.windows.net/table000003(PartitionKey='001',RowKey='001') @@ -343,8 +322,8 @@ interactions: headers: cache-control: [no-cache] content-length: ['0'] - date: ['Thu, 08 Feb 2018 18:10:21 GMT'] - etag: [W/"datetime'2018-02-08T18%3A10%3A21.8044168Z'"] + date: ['Tue, 01 May 2018 21:45:52 GMT'] + etag: [W/"datetime'2018-05-01T21%3A45%3A53.2291965Z'"] server: [Windows-Azure-Table/1.0 Microsoft-HTTPAPI/2.0] x-content-type-options: [nosniff] x-ms-version: ['2017-04-17'] @@ -356,18 +335,18 @@ interactions: Connection: [keep-alive] DataServiceVersion: [3.0;NetFx] MaxDataServiceVersion: ['3.0'] - User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:21 GMT'] + User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:53 GMT'] x-ms-version: ['2017-04-17'] method: GET uri: https://clitest000002.table.core.windows.net/table000003(PartitionKey='001',RowKey='001') response: - body: {string: '{"odata.metadata":"https://clitest000002.table.core.windows.net/$metadata#table000003/@Element","odata.etag":"W/\"datetime''2018-02-08T18%3A10%3A21.8044168Z''\"","PartitionKey":"001","RowKey":"001","Timestamp":"2018-02-08T18:10:21.8044168Z","name":"test","value":"newval"}'} + body: {string: '{"odata.metadata":"https://clitest000002.table.core.windows.net/$metadata#table000003/@Element","odata.etag":"W/\"datetime''2018-05-01T21%3A45%3A53.2291965Z''\"","PartitionKey":"001","RowKey":"001","Timestamp":"2018-05-01T21:45:53.2291965Z","name":"test","value":"newval"}'} headers: cache-control: [no-cache] content-type: [application/json;odata=minimalmetadata;streaming=true;charset=utf-8] - date: ['Thu, 08 Feb 2018 18:10:22 GMT'] - etag: [W/"datetime'2018-02-08T18%3A10%3A21.8044168Z'"] + date: ['Tue, 01 May 2018 21:45:53 GMT'] + etag: [W/"datetime'2018-05-01T21%3A45%3A53.2291965Z'"] server: [Windows-Azure-Table/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-content-type-options: [nosniff] @@ -383,8 +362,8 @@ interactions: DataServiceVersion: [3.0;NetFx] If-Match: ['*'] MaxDataServiceVersion: ['3.0'] - User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:21 GMT'] + User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:53 GMT'] x-ms-version: ['2017-04-17'] method: PUT uri: https://clitest000002.table.core.windows.net/table000003(PartitionKey='001',RowKey='001') @@ -393,8 +372,8 @@ interactions: headers: cache-control: [no-cache] content-length: ['0'] - date: ['Thu, 08 Feb 2018 18:10:22 GMT'] - etag: [W/"datetime'2018-02-08T18%3A10%3A22.4698026Z'"] + date: ['Tue, 01 May 2018 21:45:53 GMT'] + etag: [W/"datetime'2018-05-01T21%3A45%3A53.8687998Z'"] server: [Windows-Azure-Table/1.0 Microsoft-HTTPAPI/2.0] x-content-type-options: [nosniff] x-ms-version: ['2017-04-17'] @@ -406,18 +385,18 @@ interactions: Connection: [keep-alive] DataServiceVersion: [3.0;NetFx] MaxDataServiceVersion: ['3.0'] - User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:22 GMT'] + User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:54 GMT'] x-ms-version: ['2017-04-17'] method: GET uri: https://clitest000002.table.core.windows.net/table000003(PartitionKey='001',RowKey='001') response: - body: {string: '{"odata.metadata":"https://clitest000002.table.core.windows.net/$metadata#table000003/@Element","odata.etag":"W/\"datetime''2018-02-08T18%3A10%3A22.4698026Z''\"","PartitionKey":"001","RowKey":"001","Timestamp":"2018-02-08T18:10:22.4698026Z","cat":"hat"}'} + body: {string: '{"odata.metadata":"https://clitest000002.table.core.windows.net/$metadata#table000003/@Element","odata.etag":"W/\"datetime''2018-05-01T21%3A45%3A53.8687998Z''\"","PartitionKey":"001","RowKey":"001","Timestamp":"2018-05-01T21:45:53.8687998Z","cat":"hat"}'} headers: cache-control: [no-cache] content-type: [application/json;odata=minimalmetadata;streaming=true;charset=utf-8] - date: ['Thu, 08 Feb 2018 18:10:21 GMT'] - etag: [W/"datetime'2018-02-08T18%3A10%3A22.4698026Z'"] + date: ['Tue, 01 May 2018 21:45:53 GMT'] + etag: [W/"datetime'2018-05-01T21%3A45%3A53.8687998Z'"] server: [Windows-Azure-Table/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-content-type-options: [nosniff] @@ -432,8 +411,8 @@ interactions: DataServiceVersion: [3.0;NetFx] If-Match: ['*'] MaxDataServiceVersion: ['3.0'] - User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:22 GMT'] + User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:54 GMT'] x-ms-version: ['2017-04-17'] method: DELETE uri: https://clitest000002.table.core.windows.net/table000003(PartitionKey='001',RowKey='001') @@ -442,7 +421,7 @@ interactions: headers: cache-control: [no-cache] content-length: ['0'] - date: ['Thu, 08 Feb 2018 18:10:22 GMT'] + date: ['Tue, 01 May 2018 21:45:54 GMT'] server: [Windows-Azure-Table/1.0 Microsoft-HTTPAPI/2.0] x-content-type-options: [nosniff] x-ms-version: ['2017-04-17'] @@ -454,18 +433,18 @@ interactions: Connection: [keep-alive] DataServiceVersion: [3.0;NetFx] MaxDataServiceVersion: ['3.0'] - User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:22 GMT'] + User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:54 GMT'] x-ms-version: ['2017-04-17'] method: GET uri: https://clitest000002.table.core.windows.net/table000003(PartitionKey='001',RowKey='001') response: body: {string: '{"odata.error":{"code":"ResourceNotFound","message":{"lang":"en-US","value":"The - specified resource does not exist.\nRequestId:dfe796d2-0002-00f9-6f08-a1c9d2000000\nTime:2018-02-08T18:10:23.2516014Z"}}}'} + specified resource does not exist.\nRequestId:281b235d-b002-00dd-2595-e1beac000000\nTime:2018-05-01T21:45:54.8674700Z"}}}'} headers: cache-control: [no-cache] content-type: [application/json;odata=minimalmetadata;streaming=true;charset=utf-8] - date: ['Thu, 08 Feb 2018 18:10:22 GMT'] + date: ['Tue, 01 May 2018 21:45:53 GMT'] server: [Windows-Azure-Table/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-content-type-options: [nosniff] @@ -477,8 +456,8 @@ interactions: Connection: [keep-alive] DataServiceVersion: [3.0;NetFx] MaxDataServiceVersion: ['3.0'] - User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:23 GMT'] + User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:55 GMT'] x-ms-version: ['2017-04-17'] method: GET uri: https://clitest000002.table.core.windows.net/table000003?comp=acl @@ -487,7 +466,7 @@ interactions: \ />"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:10:23 GMT'] + date: ['Tue, 01 May 2018 21:45:54 GMT'] server: [Windows-Azure-Table/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-04-17'] @@ -498,8 +477,8 @@ interactions: Connection: [keep-alive] DataServiceVersion: [3.0;NetFx] MaxDataServiceVersion: ['3.0'] - User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:23 GMT'] + User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:55 GMT'] x-ms-version: ['2017-04-17'] method: GET uri: https://clitest000002.table.core.windows.net/table000003?comp=acl @@ -508,7 +487,7 @@ interactions: \ />"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:10:23 GMT'] + date: ['Tue, 01 May 2018 21:45:55 GMT'] server: [Windows-Azure-Table/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-04-17'] @@ -522,8 +501,8 @@ interactions: Content-Length: ['184'] DataServiceVersion: [3.0;NetFx] MaxDataServiceVersion: ['3.0'] - User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:23 GMT'] + User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:55 GMT'] x-ms-version: ['2017-04-17'] method: PUT uri: https://clitest000002.table.core.windows.net/table000003?comp=acl @@ -531,7 +510,7 @@ interactions: body: {string: ''} headers: content-length: ['0'] - date: ['Thu, 08 Feb 2018 18:10:23 GMT'] + date: ['Tue, 01 May 2018 21:45:55 GMT'] server: [Windows-Azure-Table/1.0 Microsoft-HTTPAPI/2.0] x-ms-version: ['2017-04-17'] status: {code: 204, message: No Content} @@ -541,8 +520,8 @@ interactions: Connection: [keep-alive] DataServiceVersion: [3.0;NetFx] MaxDataServiceVersion: ['3.0'] - User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:23 GMT'] + User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:55 GMT'] x-ms-version: ['2017-04-17'] method: GET uri: https://clitest000002.table.core.windows.net/table000003?comp=acl @@ -550,7 +529,7 @@ interactions: body: {string: "\uFEFFtest1a"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:10:23 GMT'] + date: ['Tue, 01 May 2018 21:45:55 GMT'] server: [Windows-Azure-Table/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-04-17'] @@ -564,8 +543,8 @@ interactions: Content-Length: ['296'] DataServiceVersion: [3.0;NetFx] MaxDataServiceVersion: ['3.0'] - User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:23 GMT'] + User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:55 GMT'] x-ms-version: ['2017-04-17'] method: PUT uri: https://clitest000002.table.core.windows.net/table000003?comp=acl @@ -573,7 +552,7 @@ interactions: body: {string: ''} headers: content-length: ['0'] - date: ['Thu, 08 Feb 2018 18:10:23 GMT'] + date: ['Tue, 01 May 2018 21:45:55 GMT'] server: [Windows-Azure-Table/1.0 Microsoft-HTTPAPI/2.0] x-ms-version: ['2017-04-17'] status: {code: 204, message: No Content} @@ -583,8 +562,8 @@ interactions: Connection: [keep-alive] DataServiceVersion: [3.0;NetFx] MaxDataServiceVersion: ['3.0'] - User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:24 GMT'] + User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:56 GMT'] x-ms-version: ['2017-04-17'] method: GET uri: https://clitest000002.table.core.windows.net/table000003?comp=acl @@ -592,7 +571,7 @@ interactions: body: {string: "\uFEFFtest1atest22016-01-01T00:00:00.0000000Z"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:10:23 GMT'] + date: ['Tue, 01 May 2018 21:45:55 GMT'] server: [Windows-Azure-Table/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-04-17'] @@ -606,8 +585,8 @@ interactions: Content-Length: ['413'] DataServiceVersion: [3.0;NetFx] MaxDataServiceVersion: ['3.0'] - User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:24 GMT'] + User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:56 GMT'] x-ms-version: ['2017-04-17'] method: PUT uri: https://clitest000002.table.core.windows.net/table000003?comp=acl @@ -615,7 +594,7 @@ interactions: body: {string: ''} headers: content-length: ['0'] - date: ['Thu, 08 Feb 2018 18:10:23 GMT'] + date: ['Tue, 01 May 2018 21:45:55 GMT'] server: [Windows-Azure-Table/1.0 Microsoft-HTTPAPI/2.0] x-ms-version: ['2017-04-17'] status: {code: 204, message: No Content} @@ -625,8 +604,8 @@ interactions: Connection: [keep-alive] DataServiceVersion: [3.0;NetFx] MaxDataServiceVersion: ['3.0'] - User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:24 GMT'] + User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:56 GMT'] x-ms-version: ['2017-04-17'] method: GET uri: https://clitest000002.table.core.windows.net/table000003?comp=acl @@ -634,7 +613,7 @@ interactions: body: {string: "\uFEFFtest1atest22016-01-01T00:00:00.0000000Ztest32018-01-01T00:00:00.0000000Z"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:10:24 GMT'] + date: ['Tue, 01 May 2018 21:45:56 GMT'] server: [Windows-Azure-Table/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-04-17'] @@ -648,8 +627,8 @@ interactions: Content-Length: ['591'] DataServiceVersion: [3.0;NetFx] MaxDataServiceVersion: ['3.0'] - User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:24 GMT'] + User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:56 GMT'] x-ms-version: ['2017-04-17'] method: PUT uri: https://clitest000002.table.core.windows.net/table000003?comp=acl @@ -657,7 +636,7 @@ interactions: body: {string: ''} headers: content-length: ['0'] - date: ['Thu, 08 Feb 2018 18:10:24 GMT'] + date: ['Tue, 01 May 2018 21:45:56 GMT'] server: [Windows-Azure-Table/1.0 Microsoft-HTTPAPI/2.0] x-ms-version: ['2017-04-17'] status: {code: 204, message: No Content} @@ -667,8 +646,8 @@ interactions: Connection: [keep-alive] DataServiceVersion: [3.0;NetFx] MaxDataServiceVersion: ['3.0'] - User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:24 GMT'] + User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:57 GMT'] x-ms-version: ['2017-04-17'] method: GET uri: https://clitest000002.table.core.windows.net/table000003?comp=acl @@ -676,7 +655,7 @@ interactions: body: {string: "\uFEFFtest1atest22016-01-01T00:00:00.0000000Ztest32018-01-01T00:00:00.0000000Ztest42016-01-01T00:00:00.0000000Z2016-05-01T00:00:00.0000000Zraud"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:10:25 GMT'] + date: ['Tue, 01 May 2018 21:45:56 GMT'] server: [Windows-Azure-Table/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-04-17'] @@ -687,8 +666,8 @@ interactions: Connection: [keep-alive] DataServiceVersion: [3.0;NetFx] MaxDataServiceVersion: ['3.0'] - User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:25 GMT'] + User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:57 GMT'] x-ms-version: ['2017-04-17'] method: GET uri: https://clitest000002.table.core.windows.net/table000003?comp=acl @@ -696,7 +675,7 @@ interactions: body: {string: "\uFEFFtest1atest22016-01-01T00:00:00.0000000Ztest32018-01-01T00:00:00.0000000Ztest42016-01-01T00:00:00.0000000Z2016-05-01T00:00:00.0000000Zraud"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:10:25 GMT'] + date: ['Tue, 01 May 2018 21:45:56 GMT'] server: [Windows-Azure-Table/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-04-17'] @@ -707,8 +686,8 @@ interactions: Connection: [keep-alive] DataServiceVersion: [3.0;NetFx] MaxDataServiceVersion: ['3.0'] - User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:25 GMT'] + User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:57 GMT'] x-ms-version: ['2017-04-17'] method: GET uri: https://clitest000002.table.core.windows.net/table000003?comp=acl @@ -716,7 +695,7 @@ interactions: body: {string: "\uFEFFtest1atest22016-01-01T00:00:00.0000000Ztest32018-01-01T00:00:00.0000000Ztest42016-01-01T00:00:00.0000000Z2016-05-01T00:00:00.0000000Zraud"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:10:25 GMT'] + date: ['Tue, 01 May 2018 21:45:57 GMT'] server: [Windows-Azure-Table/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-04-17'] @@ -727,8 +706,8 @@ interactions: Connection: [keep-alive] DataServiceVersion: [3.0;NetFx] MaxDataServiceVersion: ['3.0'] - User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:25 GMT'] + User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:58 GMT'] x-ms-version: ['2017-04-17'] method: GET uri: https://clitest000002.table.core.windows.net/table000003?comp=acl @@ -736,7 +715,7 @@ interactions: body: {string: "\uFEFFtest1atest22016-01-01T00:00:00.0000000Ztest32018-01-01T00:00:00.0000000Ztest42016-01-01T00:00:00.0000000Z2016-05-01T00:00:00.0000000Zraud"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:10:26 GMT'] + date: ['Tue, 01 May 2018 21:45:57 GMT'] server: [Windows-Azure-Table/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-04-17'] @@ -747,8 +726,8 @@ interactions: Connection: [keep-alive] DataServiceVersion: [3.0;NetFx] MaxDataServiceVersion: ['3.0'] - User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:26 GMT'] + User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:58 GMT'] x-ms-version: ['2017-04-17'] method: GET uri: https://clitest000002.table.core.windows.net/table000003?comp=acl @@ -756,7 +735,7 @@ interactions: body: {string: "\uFEFFtest1atest22016-01-01T00:00:00.0000000Ztest32018-01-01T00:00:00.0000000Ztest42016-01-01T00:00:00.0000000Z2016-05-01T00:00:00.0000000Zraud"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:10:26 GMT'] + date: ['Tue, 01 May 2018 21:45:57 GMT'] server: [Windows-Azure-Table/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-04-17'] @@ -767,8 +746,8 @@ interactions: Connection: [keep-alive] DataServiceVersion: [3.0;NetFx] MaxDataServiceVersion: ['3.0'] - User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:26 GMT'] + User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:58 GMT'] x-ms-version: ['2017-04-17'] method: GET uri: https://clitest000002.table.core.windows.net/table000003?comp=acl @@ -776,7 +755,7 @@ interactions: body: {string: "\uFEFFtest1atest22016-01-01T00:00:00.0000000Ztest32018-01-01T00:00:00.0000000Ztest42016-01-01T00:00:00.0000000Z2016-05-01T00:00:00.0000000Zraud"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:10:26 GMT'] + date: ['Tue, 01 May 2018 21:45:58 GMT'] server: [Windows-Azure-Table/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-04-17'] @@ -790,8 +769,8 @@ interactions: Content-Length: ['598'] DataServiceVersion: [3.0;NetFx] MaxDataServiceVersion: ['3.0'] - User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:26 GMT'] + User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:58 GMT'] x-ms-version: ['2017-04-17'] method: PUT uri: https://clitest000002.table.core.windows.net/table000003?comp=acl @@ -799,7 +778,7 @@ interactions: body: {string: ''} headers: content-length: ['0'] - date: ['Thu, 08 Feb 2018 18:10:26 GMT'] + date: ['Tue, 01 May 2018 21:45:58 GMT'] server: [Windows-Azure-Table/1.0 Microsoft-HTTPAPI/2.0] x-ms-version: ['2017-04-17'] status: {code: 204, message: No Content} @@ -809,8 +788,8 @@ interactions: Connection: [keep-alive] DataServiceVersion: [3.0;NetFx] MaxDataServiceVersion: ['3.0'] - User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:26 GMT'] + User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:59 GMT'] x-ms-version: ['2017-04-17'] method: GET uri: https://clitest000002.table.core.windows.net/table000003?comp=acl @@ -818,7 +797,7 @@ interactions: body: {string: "\uFEFFtest1autest22016-01-01T00:00:00.0000000Ztest32018-01-01T00:00:00.0000000Ztest42016-01-01T00:00:00.0000000Z2016-05-01T00:00:00.0000000Zraud"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:10:26 GMT'] + date: ['Tue, 01 May 2018 21:45:58 GMT'] server: [Windows-Azure-Table/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-04-17'] @@ -829,8 +808,8 @@ interactions: Connection: [keep-alive] DataServiceVersion: [3.0;NetFx] MaxDataServiceVersion: ['3.0'] - User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:27 GMT'] + User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:59 GMT'] x-ms-version: ['2017-04-17'] method: GET uri: https://clitest000002.table.core.windows.net/table000003?comp=acl @@ -838,7 +817,7 @@ interactions: body: {string: "\uFEFFtest1autest22016-01-01T00:00:00.0000000Ztest32018-01-01T00:00:00.0000000Ztest42016-01-01T00:00:00.0000000Z2016-05-01T00:00:00.0000000Zraud"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:10:27 GMT'] + date: ['Tue, 01 May 2018 21:45:58 GMT'] server: [Windows-Azure-Table/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-04-17'] @@ -852,8 +831,8 @@ interactions: Content-Length: ['491'] DataServiceVersion: [3.0;NetFx] MaxDataServiceVersion: ['3.0'] - User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:27 GMT'] + User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:59 GMT'] x-ms-version: ['2017-04-17'] method: PUT uri: https://clitest000002.table.core.windows.net/table000003?comp=acl @@ -861,7 +840,7 @@ interactions: body: {string: ''} headers: content-length: ['0'] - date: ['Thu, 08 Feb 2018 18:10:27 GMT'] + date: ['Tue, 01 May 2018 21:45:58 GMT'] server: [Windows-Azure-Table/1.0 Microsoft-HTTPAPI/2.0] x-ms-version: ['2017-04-17'] status: {code: 204, message: No Content} @@ -871,8 +850,8 @@ interactions: Connection: [keep-alive] DataServiceVersion: [3.0;NetFx] MaxDataServiceVersion: ['3.0'] - User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:27 GMT'] + User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:45:59 GMT'] x-ms-version: ['2017-04-17'] method: GET uri: https://clitest000002.table.core.windows.net/table000003?comp=acl @@ -880,7 +859,7 @@ interactions: body: {string: "\uFEFFtest22016-01-01T00:00:00.0000000Ztest32018-01-01T00:00:00.0000000Ztest42016-01-01T00:00:00.0000000Z2016-05-01T00:00:00.0000000Zraud"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:10:27 GMT'] + date: ['Tue, 01 May 2018 21:45:59 GMT'] server: [Windows-Azure-Table/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-04-17'] @@ -893,8 +872,8 @@ interactions: Content-Length: ['0'] DataServiceVersion: [3.0;NetFx] MaxDataServiceVersion: ['3.0'] - User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:27 GMT'] + User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:00 GMT'] x-ms-version: ['2017-04-17'] method: DELETE uri: https://clitest000002.table.core.windows.net/Tables('table000003') @@ -903,7 +882,7 @@ interactions: headers: cache-control: [no-cache] content-length: ['0'] - date: ['Thu, 08 Feb 2018 18:10:28 GMT'] + date: ['Tue, 01 May 2018 21:46:00 GMT'] server: [Windows-Azure-Table/1.0 Microsoft-HTTPAPI/2.0] x-content-type-options: [nosniff] x-ms-version: ['2017-04-17'] @@ -915,18 +894,18 @@ interactions: Connection: [keep-alive] DataServiceVersion: [3.0;NetFx] MaxDataServiceVersion: ['3.0'] - User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:28 GMT'] + User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:00 GMT'] x-ms-version: ['2017-04-17'] method: GET uri: https://clitest000002.table.core.windows.net/Tables('table000003') response: body: {string: '{"odata.error":{"code":"ResourceNotFound","message":{"lang":"en-US","value":"The - specified resource does not exist.\nRequestId:8a828247-0002-00fe-3808-a13f57000000\nTime:2018-02-08T18:10:28.8979906Z"}}}'} + specified resource does not exist.\nRequestId:a8068353-4002-00ae-0a95-e1ce6f000000\nTime:2018-05-01T21:46:00.8222096Z"}}}'} headers: cache-control: [no-cache] content-type: [application/json;odata=nometadata;streaming=true;charset=utf-8] - date: ['Thu, 08 Feb 2018 18:10:28 GMT'] + date: ['Tue, 01 May 2018 21:46:00 GMT'] server: [Windows-Azure-Table/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-content-type-options: [nosniff] @@ -938,8 +917,8 @@ interactions: Connection: [keep-alive] DataServiceVersion: [3.0;NetFx] MaxDataServiceVersion: ['3.0'] - User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.27] - x-ms-date: ['Thu, 08 Feb 2018 18:10:28 GMT'] + User-Agent: [Azure-CosmosDB/0.37.1 (Python CPython 3.6.2; Windows 10) AZURECLI/2.0.32] + x-ms-date: ['Tue, 01 May 2018 21:46:00 GMT'] x-ms-version: ['2017-04-17'] method: GET uri: https://clitest000002-secondary.table.core.windows.net/?restype=service&comp=stats @@ -947,7 +926,7 @@ interactions: body: {string: "\uFEFFunavailable"} headers: content-type: [application/xml] - date: ['Thu, 08 Feb 2018 18:10:28 GMT'] + date: ['Tue, 01 May 2018 21:46:01 GMT'] server: [Windows-Azure-Table/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-04-17'] @@ -962,8 +941,8 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.27] + msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: DELETE uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2017-05-10 @@ -972,11 +951,12 @@ interactions: headers: cache-control: [no-cache] content-length: ['0'] - date: ['Thu, 08 Feb 2018 18:10:29 GMT'] + date: ['Tue, 01 May 2018 21:46:01 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTElURVNUOjJFUkdTT1ZBWE42VzVPRVBXSFRHVUJOQTc2NDdDNjY1U0ZJV0dFVnw0NTE2MTkzQzY5NDVDRjFBLVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTElURVNUOjJFUkdBVU5HT1JXWVBBR1VRMlVFSDc3VllFWFc3QkRNVTcyWjdWSnxDOEZGRDEyMEQyOTc4OThCLVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1189'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1199'] status: {code: 202, message: Accepted} version: 1 diff --git a/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_update_storage_account_with_assigned_identity.yaml b/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_update_storage_account_with_assigned_identity.yaml index 54254ec56e8..7b6d705f6c1 100644 --- a/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_update_storage_account_with_assigned_identity.yaml +++ b/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_update_storage_account_with_assigned_identity.yaml @@ -1,30 +1,32 @@ interactions: - request: - body: '{"location": "southcentralus", "tags": {"use": "az-test"}}' + body: '{"location": "southcentralus", "tags": {"product": "azurecli", "cause": + "automation", "date": "2018-05-01T21:51:44Z"}}' headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] CommandName: [group create] Connection: [keep-alive] - Content-Length: ['58'] + Content-Length: ['118'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.27] + msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2017-05-10 response: - body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"southcentralus","tags":{"use":"az-test"},"properties":{"provisioningState":"Succeeded"}}'} + body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"southcentralus","tags":{"product":"azurecli","cause":"automation","date":"2018-05-01T21:51:44Z"},"properties":{"provisioningState":"Succeeded"}}'} headers: cache-control: [no-cache] - content-length: ['336'] + content-length: ['392'] content-type: [application/json; charset=utf-8] - date: ['Thu, 08 Feb 2018 18:15:30 GMT'] + date: ['Tue, 01 May 2018 21:51:45 GMT'] expires: ['-1'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1185'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1195'] status: {code: 201, message: Created} - request: body: null @@ -35,22 +37,23 @@ interactions: Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.27] + msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2017-05-10 response: - body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"southcentralus","tags":{"use":"az-test"},"properties":{"provisioningState":"Succeeded"}}'} + body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"southcentralus","tags":{"product":"azurecli","cause":"automation","date":"2018-05-01T21:51:44Z"},"properties":{"provisioningState":"Succeeded"}}'} headers: cache-control: [no-cache] - content-length: ['336'] + content-length: ['392'] content-type: [application/json; charset=utf-8] - date: ['Thu, 08 Feb 2018 18:15:30 GMT'] + date: ['Tue, 01 May 2018 21:51:45 GMT'] expires: ['-1'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] vary: [Accept-Encoding] + x-content-type-options: [nosniff] status: {code: 200, message: OK} - request: body: '{"sku": {"name": "Standard_LRS"}, "kind": "Storage", "location": "southcentralus", @@ -63,7 +66,7 @@ interactions: Content-Length: ['133'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/cli000002?api-version=2017-10-01 @@ -73,14 +76,15 @@ interactions: cache-control: [no-cache] content-length: ['0'] content-type: [text/plain; charset=utf-8] - date: ['Thu, 08 Feb 2018 18:15:32 GMT'] + date: ['Tue, 01 May 2018 21:51:47 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/southcentralus/asyncoperations/4a467c9c-ebeb-4391-b4c5-f2b7ebfa0bfe?monitor=true&api-version=2017-10-01'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/southcentralus/asyncoperations/1157a6d0-1a72-479b-bdb7-5a1b7bb482ed?monitor=true&api-version=2017-10-01'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 Microsoft-HTTPAPI/2.0'] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1186'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1194'] status: {code: 202, message: Accepted} - request: body: null @@ -91,17 +95,17 @@ interactions: Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/southcentralus/asyncoperations/4a467c9c-ebeb-4391-b4c5-f2b7ebfa0bfe?monitor=true&api-version=2017-10-01 + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/southcentralus/asyncoperations/1157a6d0-1a72-479b-bdb7-5a1b7bb482ed?monitor=true&api-version=2017-10-01 response: - body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/cli000002","name":"cli000002","type":"Microsoft.Storage/storageAccounts","location":"southcentralus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T18:15:31.9838936Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T18:15:31.9838936Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T18:15:31.9214188Z","primaryEndpoints":{"blob":"https://cli000002.blob.core.windows.net/","queue":"https://cli000002.queue.core.windows.net/","table":"https://cli000002.table.core.windows.net/","file":"https://cli000002.file.core.windows.net/"},"primaryLocation":"southcentralus","statusOfPrimary":"available"}}'} + body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/cli000002","name":"cli000002","type":"Microsoft.Storage/storageAccounts","location":"southcentralus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:51:47.7085650Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:51:47.7085650Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:51:47.6460648Z","primaryEndpoints":{"blob":"https://cli000002.blob.core.windows.net/","queue":"https://cli000002.queue.core.windows.net/","table":"https://cli000002.table.core.windows.net/","file":"https://cli000002.file.core.windows.net/"},"primaryLocation":"southcentralus","statusOfPrimary":"available"}}'} headers: cache-control: [no-cache] content-length: ['1247'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 18:15:50 GMT'] + date: ['Tue, 01 May 2018 21:52:05 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -109,6 +113,7 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] + x-content-type-options: [nosniff] status: {code: 200, message: OK} - request: body: null @@ -119,17 +124,17 @@ interactions: Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: GET uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/cli000002?api-version=2017-10-01 response: - body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/cli000002","name":"cli000002","type":"Microsoft.Storage/storageAccounts","location":"southcentralus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T18:15:31.9838936Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T18:15:31.9838936Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T18:15:31.9214188Z","primaryEndpoints":{"blob":"https://cli000002.blob.core.windows.net/","queue":"https://cli000002.queue.core.windows.net/","table":"https://cli000002.table.core.windows.net/","file":"https://cli000002.file.core.windows.net/"},"primaryLocation":"southcentralus","statusOfPrimary":"available"}}'} + body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/cli000002","name":"cli000002","type":"Microsoft.Storage/storageAccounts","location":"southcentralus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:51:47.7085650Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:51:47.7085650Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:51:47.6460648Z","primaryEndpoints":{"blob":"https://cli000002.blob.core.windows.net/","queue":"https://cli000002.queue.core.windows.net/","table":"https://cli000002.table.core.windows.net/","file":"https://cli000002.file.core.windows.net/"},"primaryLocation":"southcentralus","statusOfPrimary":"available"}}'} headers: cache-control: [no-cache] content-length: ['1247'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 18:15:51 GMT'] + date: ['Tue, 01 May 2018 21:52:06 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -137,6 +142,7 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] + x-content-type-options: [nosniff] status: {code: 200, message: OK} - request: body: '{"sku": {"name": "Standard_LRS"}, "tags": {}, "identity": {"type": "SystemAssigned"}, @@ -152,17 +158,17 @@ interactions: Content-Length: ['366'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.27] + msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: PATCH uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/cli000002?api-version=2017-10-01 response: - body: {string: '{"identity":{"principalId":"6a4c76ca-9f31-4cb4-9417-1a6bb8b02298","tenantId":"54826b22-38d6-4fb2-bad9-b7b93a3e9c5a","type":"SystemAssigned"},"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/cli000002","name":"cli000002","type":"Microsoft.Storage/storageAccounts","location":"southcentralus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["54826b22-38d6-4fb2-bad9-b7b93a3e9c5a"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-02-08T18:15:31.9838936Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-02-08T18:15:31.9838936Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-02-08T18:15:31.9214188Z","primaryEndpoints":{"blob":"https://cli000002.blob.core.windows.net/","queue":"https://cli000002.queue.core.windows.net/","table":"https://cli000002.table.core.windows.net/","file":"https://cli000002.file.core.windows.net/"},"primaryLocation":"southcentralus","statusOfPrimary":"available"}}'} + body: {string: '{"identity":{"principalId":"e4f48cdc-5905-49fd-98f5-13ef0b6cbff9","tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","type":"SystemAssigned"},"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/cli000002","name":"cli000002","type":"Microsoft.Storage/storageAccounts","location":"southcentralus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:51:47.7085650Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:51:47.7085650Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:51:47.6460648Z","primaryEndpoints":{"blob":"https://cli000002.blob.core.windows.net/","queue":"https://cli000002.queue.core.windows.net/","table":"https://cli000002.table.core.windows.net/","file":"https://cli000002.file.core.windows.net/"},"primaryLocation":"southcentralus","statusOfPrimary":"available"}}'} headers: cache-control: [no-cache] content-length: ['1387'] content-type: [application/json] - date: ['Thu, 08 Feb 2018 18:15:54 GMT'] + date: ['Tue, 01 May 2018 21:52:09 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -170,7 +176,8 @@ interactions: strict-transport-security: [max-age=31536000; includeSubDomains] transfer-encoding: [chunked] vary: [Accept-Encoding] - x-ms-ratelimit-remaining-subscription-writes: ['1168'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1196'] status: {code: 200, message: OK} - request: body: null @@ -182,8 +189,8 @@ interactions: Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 - msrest_azure/0.4.21 resourcemanagementclient/1.2.1 Azure-SDK-For-Python - AZURECLI/2.0.27] + msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python + AZURECLI/2.0.32] accept-language: [en-US] method: DELETE uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2017-05-10 @@ -192,11 +199,12 @@ interactions: headers: cache-control: [no-cache] content-length: ['0'] - date: ['Thu, 08 Feb 2018 18:15:56 GMT'] + date: ['Tue, 01 May 2018 21:52:10 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTElURVNUOjJFUkdVUk9JWUpCV01MQkdZQjNHUlVMU1JETlJXT0VTSERTMkFQSXwzNzg1QjFFNjA3RTMyQTA2LVNPVVRIQ0VOVFJBTFVTIiwiam9iTG9jYXRpb24iOiJzb3V0aGNlbnRyYWx1cyJ9?api-version=2017-05-10'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTElURVNUOjJFUkdDVkdPMk1FWkZVRkpHWjRFVE82R1lQNldIUks1R0RDRTZWT3wwN0RDNUFFOTU1NTdFMjRBLVNPVVRIQ0VOVFJBTFVTIiwiam9iTG9jYXRpb24iOiJzb3V0aGNlbnRyYWx1cyJ9?api-version=2017-05-10'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] - x-ms-ratelimit-remaining-subscription-writes: ['1184'] + x-content-type-options: [nosniff] + x-ms-ratelimit-remaining-subscription-writes: ['1197'] status: {code: 202, message: Accepted} version: 1 From ddea23e08905def3db8d5ffeb20098c9ff49d972 Mon Sep 17 00:00:00 2001 From: williexu Date: Wed, 2 May 2018 12:10:12 -0700 Subject: [PATCH 06/19] fixed tests --- src/storage-preview/azext_storage_preview/_validators.py | 1 + .../tests/latest/test_storage_validators.py | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/storage-preview/azext_storage_preview/_validators.py b/src/storage-preview/azext_storage_preview/_validators.py index b2075abaa5f..10786c830d5 100644 --- a/src/storage-preview/azext_storage_preview/_validators.py +++ b/src/storage-preview/azext_storage_preview/_validators.py @@ -51,6 +51,7 @@ def _create_token_credential(cli_ctx): token_credential = TokenCredential(None) updater = TokenUpdater(token_credential, cli_ctx) + def _cancel_timer_event_handler(_, **__): updater.cancel() cli_ctx.register_event(EVENT_CLI_POST_EXECUTE, _cancel_timer_event_handler) diff --git a/src/storage-preview/azext_storage_preview/tests/latest/test_storage_validators.py b/src/storage-preview/azext_storage_preview/tests/latest/test_storage_validators.py index d2917f45640..2f119e748ca 100644 --- a/src/storage-preview/azext_storage_preview/tests/latest/test_storage_validators.py +++ b/src/storage-preview/azext_storage_preview/tests/latest/test_storage_validators.py @@ -11,7 +11,7 @@ from azure.cli.core._config import GLOBAL_CONFIG_DIR, ENV_VAR_PREFIX from azure.cli.core.cloud import get_active_cloud -from azure.cli.core.profiles import get_sdk, ResourceType, supported_api_version +from azure.cli.core.profiles import get_sdk, ResourceType, supported_api_version, register_resource_type from ..._validators import (get_permission_validator, get_datetime_type, ipv4_range_type, resource_type_type, services_type, @@ -32,6 +32,7 @@ def __init__(self): class MockLoader(object): def __init__(self, ctx): self.ctx = ctx + register_resource_type('latest', CUSTOM_DATA_STORAGE, '2017-11-09') def get_models(self, *attr_args, **_): from azure.cli.core.profiles import get_sdk From cd2d2a3830aec053cd542c2ececa3b81594a6980 Mon Sep 17 00:00:00 2001 From: williexu Date: Wed, 2 May 2018 13:15:57 -0700 Subject: [PATCH 07/19] use python2 recording for incremental copy --- .../test_storage_blob_incremental_copy.yaml | 621 +++++++++++++++--- 1 file changed, 539 insertions(+), 82 deletions(-) diff --git a/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_blob_incremental_copy.yaml b/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_blob_incremental_copy.yaml index 4faece18660..4b0663e1833 100644 --- a/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_blob_incremental_copy.yaml +++ b/src/storage-preview/azext_storage_preview/tests/latest/recordings/test_storage_blob_incremental_copy.yaml @@ -1,7 +1,7 @@ interactions: - request: - body: '{"location": "westus", "tags": {"product": "azurecli", "cause": "automation", - "date": "2018-05-01T21:46:20Z"}}' + body: !!python/unicode '{"location": "westus", "tags": {"date": "2018-05-02T19:43:58Z", + "product": "azurecli", "cause": "automation"}}' headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] @@ -9,28 +9,28 @@ interactions: Connection: [keep-alive] Content-Length: ['110'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + User-Agent: [python/2.7.13 (Windows-10-10.0.16299) requests/2.18.4 msrest/0.4.26 msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2017-05-10 response: - body: {string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"westus","tags":{"product":"azurecli","cause":"automation","date":"2018-05-01T21:46:20Z"},"properties":{"provisioningState":"Succeeded"}}'} + body: {string: !!python/unicode '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001","name":"clitest.rg000001","location":"westus","tags":{"date":"2018-05-02T19:43:58Z","product":"azurecli","cause":"automation"},"properties":{"provisioningState":"Succeeded"}}'} headers: cache-control: [no-cache] content-length: ['384'] content-type: [application/json; charset=utf-8] - date: ['Tue, 01 May 2018 21:46:21 GMT'] + date: ['Wed, 02 May 2018 19:44:00 GMT'] expires: ['-1'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-writes: ['1197'] + x-ms-ratelimit-remaining-subscription-writes: ['1195'] status: {code: 201, message: Created} - request: - body: '{"sku": {"name": "Standard_LRS"}, "kind": "Storage", "location": "westus", - "properties": {"supportsHttpsTrafficOnly": false}}' + body: !!python/unicode '{"sku": {"name": "Standard_LRS"}, "kind": "Storage", "location": + "westus", "properties": {"supportsHttpsTrafficOnly": false}}' headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] @@ -38,26 +38,26 @@ interactions: Connection: [keep-alive] Content-Length: ['125'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + User-Agent: [python/2.7.13 (Windows-10-10.0.16299) requests/2.18.4 msrest/0.4.26 msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002?api-version=2017-10-01 response: - body: {string: ''} + body: {string: !!python/unicode ''} headers: cache-control: [no-cache] content-length: ['0'] content-type: [text/plain; charset=utf-8] - date: ['Tue, 01 May 2018 21:46:22 GMT'] + date: ['Wed, 02 May 2018 19:44:02 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/1ab09e5f-ddf3-44c9-9b6f-842c67fc1756?monitor=true&api-version=2017-10-01'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/8c8b53d2-a910-435a-b60d-0b2544b5660a?monitor=true&api-version=2017-10-01'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 Microsoft-HTTPAPI/2.0'] strict-transport-security: [max-age=31536000; includeSubDomains] x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-writes: ['1199'] + x-ms-ratelimit-remaining-subscription-writes: ['1195'] status: {code: 202, message: Accepted} - request: body: null @@ -67,18 +67,18 @@ interactions: CommandName: [storage account create] Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + User-Agent: [python/2.7.13 (Windows-10-10.0.16299) requests/2.18.4 msrest/0.4.26 msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/1ab09e5f-ddf3-44c9-9b6f-842c67fc1756?monitor=true&api-version=2017-10-01 + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/8c8b53d2-a910-435a-b60d-0b2544b5660a?monitor=true&api-version=2017-10-01 response: - body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:46:22.6503039Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:46:22.6503039Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:46:22.4628157Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} + body: {string: !!python/unicode '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002","name":"clitest000002","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-02T19:44:02.2748953Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-02T19:44:02.2748953Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-02T19:44:02.1967762Z","primaryEndpoints":{"blob":"https://clitest000002.blob.core.windows.net/","queue":"https://clitest000002.queue.core.windows.net/","table":"https://clitest000002.table.core.windows.net/","file":"https://clitest000002.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} headers: cache-control: [no-cache] content-length: ['1231'] content-type: [application/json] - date: ['Tue, 01 May 2018 21:46:39 GMT'] + date: ['Wed, 02 May 2018 19:44:19 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -97,18 +97,18 @@ interactions: Connection: [keep-alive] Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + User-Agent: [python/2.7.13 (Windows-10-10.0.16299) requests/2.18.4 msrest/0.4.26 msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: POST uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002/listKeys?api-version=2017-10-01 response: - body: {string: '{"keys":[{"keyName":"key1","value":"4viMrgv1Qrz77ezf904epZDNY0SXTiA6kuEuLgw2mfKQAVOdKOHmlU1nojXikOSQJkbv+2Z73pl8jfWbSM34LQ==","permissions":"FULL"},{"keyName":"key2","value":"9Y/3gRD3svsE1vv11BCQn1r9qClTTlRssFs9mPn5uh66+GapGDt4SI8ve4uJLBOpAAHTwalDlVXDAUwEUePn0w==","permissions":"FULL"}]}'} + body: {string: !!python/unicode '{"keys":[{"keyName":"key1","value":"iSfpGgcvmAbaFtFdDnqIH/nRi3FlqID5Wd8ax8tU6Gue8ABZR/XzDgshrU1tDIN1TyrFUCCojRtSqPeQ0ERRjA==","permissions":"FULL"},{"keyName":"key2","value":"cWZxyLZpSwQ4DZ3xiqmqiYz7a4IirTs2HPdD5o2pIcnUwehOxk216iFFsicoQxSkNwBEZE4J3ry11uy5ImTlZg==","permissions":"FULL"}]}'} headers: cache-control: [no-cache] content-length: ['288'] content-type: [application/json] - date: ['Tue, 01 May 2018 21:46:40 GMT'] + date: ['Wed, 02 May 2018 19:44:20 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -117,11 +117,11 @@ interactions: transfer-encoding: [chunked] vary: [Accept-Encoding] x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-writes: ['1198'] + x-ms-ratelimit-remaining-subscription-writes: ['1192'] status: {code: 200, message: OK} - request: - body: '{"sku": {"name": "Standard_LRS"}, "kind": "Storage", "location": "westus", - "properties": {"supportsHttpsTrafficOnly": false}}' + body: !!python/unicode '{"sku": {"name": "Standard_LRS"}, "kind": "Storage", "location": + "westus", "properties": {"supportsHttpsTrafficOnly": false}}' headers: Accept: [application/json] Accept-Encoding: ['gzip, deflate'] @@ -129,26 +129,26 @@ interactions: Connection: [keep-alive] Content-Length: ['125'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + User-Agent: [python/2.7.13 (Windows-10-10.0.16299) requests/2.18.4 msrest/0.4.26 msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: PUT uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000003?api-version=2017-10-01 response: - body: {string: ''} + body: {string: !!python/unicode ''} headers: cache-control: [no-cache] content-length: ['0'] content-type: [text/plain; charset=utf-8] - date: ['Tue, 01 May 2018 21:46:41 GMT'] + date: ['Wed, 02 May 2018 19:44:22 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/b7710f49-b5f3-42a1-8f48-fd96d080b961?monitor=true&api-version=2017-10-01'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/435892af-a98b-4a72-8888-0a351e667294?monitor=true&api-version=2017-10-01'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 Microsoft-HTTPAPI/2.0'] strict-transport-security: [max-age=31536000; includeSubDomains] x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-writes: ['1199'] + x-ms-ratelimit-remaining-subscription-writes: ['1192'] status: {code: 202, message: Accepted} - request: body: null @@ -158,18 +158,18 @@ interactions: CommandName: [storage account create] Connection: [keep-alive] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + User-Agent: [python/2.7.13 (Windows-10-10.0.16299) requests/2.18.4 msrest/0.4.26 msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: GET - uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/b7710f49-b5f3-42a1-8f48-fd96d080b961?monitor=true&api-version=2017-10-01 + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/locations/westus/asyncoperations/435892af-a98b-4a72-8888-0a351e667294?monitor=true&api-version=2017-10-01 response: - body: {string: '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000003","name":"clitest000003","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-01T21:46:42.0562503Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-01T21:46:42.0562503Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-01T21:46:41.9624816Z","primaryEndpoints":{"blob":"https://clitest000003.blob.core.windows.net/","queue":"https://clitest000003.queue.core.windows.net/","table":"https://clitest000003.table.core.windows.net/","file":"https://clitest000003.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} + body: {string: !!python/unicode '{"sku":{"name":"Standard_LRS","tier":"Standard"},"kind":"Storage","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000003","name":"clitest000003","type":"Microsoft.Storage/storageAccounts","location":"westus","tags":{},"properties":{"networkAcls":{"bypass":"AzureServices","virtualNetworkRules":[],"ipRules":[],"defaultAction":"Allow"},"trustedDirectories":["72f988bf-86f1-41af-91ab-2d7cd011db47"],"supportsHttpsTrafficOnly":false,"encryption":{"services":{"file":{"enabled":true,"lastEnabledTime":"2018-05-02T19:44:22.3795443Z"},"blob":{"enabled":true,"lastEnabledTime":"2018-05-02T19:44:22.3795443Z"}},"keySource":"Microsoft.Storage"},"provisioningState":"Succeeded","creationTime":"2018-05-02T19:44:22.1919822Z","primaryEndpoints":{"blob":"https://clitest000003.blob.core.windows.net/","queue":"https://clitest000003.queue.core.windows.net/","table":"https://clitest000003.table.core.windows.net/","file":"https://clitest000003.file.core.windows.net/"},"primaryLocation":"westus","statusOfPrimary":"available"}}'} headers: cache-control: [no-cache] content-length: ['1231'] content-type: [application/json] - date: ['Tue, 01 May 2018 21:46:58 GMT'] + date: ['Wed, 02 May 2018 19:44:39 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -188,18 +188,18 @@ interactions: Connection: [keep-alive] Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + User-Agent: [python/2.7.13 (Windows-10-10.0.16299) requests/2.18.4 msrest/0.4.26 msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: POST uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000003/listKeys?api-version=2017-10-01 response: - body: {string: '{"keys":[{"keyName":"key1","value":"2aAhDTJ1gvnWrc+/l98kMjVrqMzS63NanaEKhNM92GF2cJfiueqeqcHP++4anKSbi8WzGBxBGSB1aP0QYQomJw==","permissions":"FULL"},{"keyName":"key2","value":"v4HFCbhURQvoL+VoZ7UknxYh0wczm1PBPhJgoN73rHjdbyVKpAAVKW5BoqUvdyTMFi9w6YjA5sI/GisdCml5nQ==","permissions":"FULL"}]}'} + body: {string: !!python/unicode '{"keys":[{"keyName":"key1","value":"BbTbkKSkBtL4LovzPMZd4F7X9iwXL4+WAColh/j94Bf1IWXAPmgbvmATih3hqhkAy7sEb/Oq3xvJMNNp95SCnA==","permissions":"FULL"},{"keyName":"key2","value":"R/miHYtsnRkKsoE34tblzJ+OCPb6YKB/EaJk+f4nKwe1PLTceyKx0WBC8onWzTEbKG9cKOQP8zvxIu3z1YJmzQ==","permissions":"FULL"}]}'} headers: cache-control: [no-cache] content-length: ['288'] content-type: [application/json] - date: ['Tue, 01 May 2018 21:47:00 GMT'] + date: ['Wed, 02 May 2018 19:44:40 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -208,7 +208,7 @@ interactions: transfer-encoding: [chunked] vary: [Accept-Encoding] x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-writes: ['1197'] + x-ms-ratelimit-remaining-subscription-writes: ['1193'] status: {code: 200, message: OK} - request: body: null @@ -219,18 +219,18 @@ interactions: Connection: [keep-alive] Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + User-Agent: [python/2.7.13 (Windows-10-10.0.16299) requests/2.18.4 msrest/0.4.26 msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: POST uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000002/listKeys?api-version=2017-10-01 response: - body: {string: '{"keys":[{"keyName":"key1","value":"4viMrgv1Qrz77ezf904epZDNY0SXTiA6kuEuLgw2mfKQAVOdKOHmlU1nojXikOSQJkbv+2Z73pl8jfWbSM34LQ==","permissions":"FULL"},{"keyName":"key2","value":"9Y/3gRD3svsE1vv11BCQn1r9qClTTlRssFs9mPn5uh66+GapGDt4SI8ve4uJLBOpAAHTwalDlVXDAUwEUePn0w==","permissions":"FULL"}]}'} + body: {string: !!python/unicode '{"keys":[{"keyName":"key1","value":"iSfpGgcvmAbaFtFdDnqIH/nRi3FlqID5Wd8ax8tU6Gue8ABZR/XzDgshrU1tDIN1TyrFUCCojRtSqPeQ0ERRjA==","permissions":"FULL"},{"keyName":"key2","value":"cWZxyLZpSwQ4DZ3xiqmqiYz7a4IirTs2HPdD5o2pIcnUwehOxk216iFFsicoQxSkNwBEZE4J3ry11uy5ImTlZg==","permissions":"FULL"}]}'} headers: cache-control: [no-cache] content-length: ['288'] content-type: [application/json] - date: ['Tue, 01 May 2018 21:47:00 GMT'] + date: ['Wed, 02 May 2018 19:44:41 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -239,25 +239,25 @@ interactions: transfer-encoding: [chunked] vary: [Accept-Encoding] x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-writes: ['1198'] + x-ms-ratelimit-remaining-subscription-writes: ['1194'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 2.7.13; Windows 10) AZURECLI/2.0.32] - x-ms-date: ['Tue, 01 May 2018 21:47:01 GMT'] + x-ms-date: ['Wed, 02 May 2018 19:44:42 GMT'] x-ms-version: ['2017-11-09'] method: PUT uri: https://clitest000002.blob.core.windows.net/cont000004?restype=container response: - body: {string: ''} + body: {string: !!python/unicode ''} headers: - date: ['Tue, 01 May 2018 21:47:01 GMT'] - etag: ['"0x8D5AFAD12831841"'] - last-modified: ['Tue, 01 May 2018 21:47:01 GMT'] + date: ['Wed, 02 May 2018 19:44:41 GMT'] + etag: ['"0x8D5B06526655E80"'] + last-modified: ['Wed, 02 May 2018 19:44:42 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-11-09'] @@ -267,45 +267,502 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 2.7.13; Windows 10) AZURECLI/2.0.32] x-ms-blob-content-length: ['16384'] x-ms-blob-type: [PageBlob] - x-ms-date: ['Tue, 01 May 2018 21:47:01 GMT'] + x-ms-date: ['Wed, 02 May 2018 19:44:42 GMT'] x-ms-version: ['2017-11-09'] method: PUT uri: https://clitest000002.blob.core.windows.net/cont000004/src response: - body: {string: ''} + body: {string: !!python/unicode ''} headers: - date: ['Tue, 01 May 2018 21:47:01 GMT'] - etag: ['"0x8D5AFAD12BB46FA"'] - last-modified: ['Tue, 01 May 2018 21:47:02 GMT'] + date: ['Wed, 02 May 2018 19:44:42 GMT'] + etag: ['"0x8D5B06526AC4FA7"'] + last-modified: ['Wed, 02 May 2018 19:44:42 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-request-server-encrypted: ['true'] x-ms-version: ['2017-11-09'] status: {code: 201, message: Created} +- request: + body: !!python/unicode "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ + \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + headers: + Connection: [keep-alive] + Content-Length: ['16384'] + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 2.7.13; Windows + 10) AZURECLI/2.0.32] + x-ms-date: ['Wed, 02 May 2018 19:44:43 GMT'] + x-ms-page-write: [update] + x-ms-range: [bytes=0-16383] + x-ms-version: ['2017-11-09'] + method: PUT + uri: https://clitest000002.blob.core.windows.net/cont000004/src?comp=page + response: + body: {string: !!python/unicode ''} + headers: + content-md5: [zjOP5omXeKrPwoQU8tlJiw==] + date: ['Wed, 02 May 2018 19:44:42 GMT'] + etag: ['"0x8D5B06526BC7F53"'] + last-modified: ['Wed, 02 May 2018 19:44:43 GMT'] + server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] + transfer-encoding: [chunked] + x-ms-blob-sequence-number: ['0'] + x-ms-request-server-encrypted: ['true'] + x-ms-version: ['2017-11-09'] + status: {code: 201, message: Created} - request: body: null headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 2.7.13; Windows 10) AZURECLI/2.0.32] - x-ms-date: ['Tue, 01 May 2018 21:47:02 GMT'] + x-ms-date: ['Wed, 02 May 2018 19:44:43 GMT'] x-ms-version: ['2017-11-09'] method: PUT uri: https://clitest000002.blob.core.windows.net/cont000004/src?comp=snapshot response: - body: {string: ''} + body: {string: !!python/unicode ''} headers: - date: ['Tue, 01 May 2018 21:47:01 GMT'] - etag: ['"0x8D5AFAD12BB46FA"'] - last-modified: ['Tue, 01 May 2018 21:47:02 GMT'] + date: ['Wed, 02 May 2018 19:44:42 GMT'] + etag: ['"0x8D5B06526BC7F53"'] + last-modified: ['Wed, 02 May 2018 19:44:43 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-snapshot: ['2018-05-01T21:47:02.6524496Z'] + x-ms-snapshot: ['2018-05-02T19:44:43.5039308Z'] x-ms-version: ['2017-11-09'] status: {code: 201, message: Created} - request: @@ -317,18 +774,18 @@ interactions: Connection: [keep-alive] Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + User-Agent: [python/2.7.13 (Windows-10-10.0.16299) requests/2.18.4 msrest/0.4.26 msrest_azure/0.4.25 azure-mgmt-storage/1.5.0 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: POST uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Storage/storageAccounts/clitest000003/listKeys?api-version=2017-10-01 response: - body: {string: '{"keys":[{"keyName":"key1","value":"2aAhDTJ1gvnWrc+/l98kMjVrqMzS63NanaEKhNM92GF2cJfiueqeqcHP++4anKSbi8WzGBxBGSB1aP0QYQomJw==","permissions":"FULL"},{"keyName":"key2","value":"v4HFCbhURQvoL+VoZ7UknxYh0wczm1PBPhJgoN73rHjdbyVKpAAVKW5BoqUvdyTMFi9w6YjA5sI/GisdCml5nQ==","permissions":"FULL"}]}'} + body: {string: !!python/unicode '{"keys":[{"keyName":"key1","value":"BbTbkKSkBtL4LovzPMZd4F7X9iwXL4+WAColh/j94Bf1IWXAPmgbvmATih3hqhkAy7sEb/Oq3xvJMNNp95SCnA==","permissions":"FULL"},{"keyName":"key2","value":"R/miHYtsnRkKsoE34tblzJ+OCPb6YKB/EaJk+f4nKwe1PLTceyKx0WBC8onWzTEbKG9cKOQP8zvxIu3z1YJmzQ==","permissions":"FULL"}]}'} headers: cache-control: [no-cache] content-length: ['288'] content-type: [application/json] - date: ['Tue, 01 May 2018 21:47:02 GMT'] + date: ['Wed, 02 May 2018 19:44:43 GMT'] expires: ['-1'] pragma: [no-cache] server: ['Microsoft-Azure-Storage-Resource-Provider/1.0,Microsoft-HTTPAPI/2.0 @@ -337,25 +794,25 @@ interactions: transfer-encoding: [chunked] vary: [Accept-Encoding] x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-writes: ['1199'] + x-ms-ratelimit-remaining-subscription-writes: ['1195'] status: {code: 200, message: OK} - request: body: null headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 2.7.13; Windows 10) AZURECLI/2.0.32] - x-ms-date: ['Tue, 01 May 2018 21:47:03 GMT'] + x-ms-date: ['Wed, 02 May 2018 19:44:44 GMT'] x-ms-version: ['2017-11-09'] method: PUT uri: https://clitest000003.blob.core.windows.net/cont000005?restype=container response: - body: {string: ''} + body: {string: !!python/unicode ''} headers: - date: ['Tue, 01 May 2018 21:47:03 GMT'] - etag: ['"0x8D5AFAD138AB323"'] - last-modified: ['Tue, 01 May 2018 21:47:03 GMT'] + date: ['Wed, 02 May 2018 19:44:43 GMT'] + etag: ['"0x8D5B0652781BC35"'] + last-modified: ['Wed, 02 May 2018 19:44:44 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] x-ms-version: ['2017-11-09'] @@ -365,22 +822,22 @@ interactions: headers: Connection: [keep-alive] Content-Length: ['0'] - User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 3.6.2; Windows + User-Agent: [Azure-Storage/1.2.0rc0-1.2.0rc0 (Python CPython 2.7.13; Windows 10) AZURECLI/2.0.32] - x-ms-copy-source: ['https://clitest46yy2wcv7vboqpqlb.blob.core.windows.net/contbjs5ux3u5fa3ujgxxo2r/src?se=2018-05-02T21%3A47%3A03Z&sp=r&spr=https&sv=2017-11-09&sr=b&sig=Cy7kL6IT6mmC%2BAJ50bScE31rlwSJZMAtiXqJ4kGtNc8%3D&snapshot=2018-05-01T21:47:02.6524496Z'] - x-ms-date: ['Tue, 01 May 2018 21:47:03 GMT'] + x-ms-copy-source: ['https://clitestcnlkcrkpqx7wradry.blob.core.windows.net/cont4dqskpfdpndkgy5iw6fd/src?sr=b&spr=https&sp=r&sv=2017-11-09&sig=5mmvYLaxdFL5z12ATWgHzBlFlJnC9Qpqa/lMUPb%2B4NI%3D&se=2018-05-03T19%3A44%3A44Z&snapshot=2018-05-02T19:44:43.5039308Z'] + x-ms-date: ['Wed, 02 May 2018 19:44:44 GMT'] x-ms-version: ['2017-11-09'] method: PUT uri: https://clitest000003.blob.core.windows.net/cont000005/backup?comp=incrementalcopy response: - body: {string: ''} + body: {string: !!python/unicode ''} headers: - date: ['Tue, 01 May 2018 21:47:03 GMT'] - etag: ['"0x8D5AFAD13D4F78D"'] - last-modified: ['Tue, 01 May 2018 21:47:03 GMT'] + date: ['Wed, 02 May 2018 19:44:44 GMT'] + etag: ['"0x8D5B06527BA7155"'] + last-modified: ['Wed, 02 May 2018 19:44:44 GMT'] server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0] transfer-encoding: [chunked] - x-ms-copy-id: [35ffe903-d79d-4f2e-a89a-4ad5bc2a5f8b] + x-ms-copy-id: [0193b26a-a085-4797-95bf-f03b9605f8c7] x-ms-copy-status: [pending] x-ms-version: ['2017-11-09'] status: {code: 202, message: Accepted} @@ -393,23 +850,23 @@ interactions: Connection: [keep-alive] Content-Length: ['0'] Content-Type: [application/json; charset=utf-8] - User-Agent: [python/3.6.2 (Windows-10-10.0.16299-SP0) requests/2.18.4 msrest/0.4.26 + User-Agent: [python/2.7.13 (Windows-10-10.0.16299) requests/2.18.4 msrest/0.4.26 msrest_azure/0.4.25 resourcemanagementclient/1.2.1 Azure-SDK-For-Python AZURECLI/2.0.32] accept-language: [en-US] method: DELETE uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001?api-version=2017-05-10 response: - body: {string: ''} + body: {string: !!python/unicode ''} headers: cache-control: [no-cache] content-length: ['0'] - date: ['Tue, 01 May 2018 21:47:03 GMT'] + date: ['Wed, 02 May 2018 19:44:45 GMT'] expires: ['-1'] - location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTElURVNUOjJFUkdJSkVXTjM1RkhEVVBJTlNFWjRERTI3RVU3M1M3TzNKQ0JINHxGQ0E0MkJBN0IyNDY5OTk5LVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] + location: ['https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/operationresults/eyJqb2JJZCI6IlJFU09VUkNFR1JPVVBERUxFVElPTkpPQi1DTElURVNUOjJFUkdCUFJMSkU3VEVLUjZZTFZYQ0w0S05QNEQ0NlFHWlE1NUpIQnwyQURDQjYwM0MxMUM4REU2LVdFU1RVUyIsImpvYkxvY2F0aW9uIjoid2VzdHVzIn0?api-version=2017-05-10'] pragma: [no-cache] strict-transport-security: [max-age=31536000; includeSubDomains] x-content-type-options: [nosniff] - x-ms-ratelimit-remaining-subscription-writes: ['1198'] + x-ms-ratelimit-remaining-subscription-writes: ['1195'] status: {code: 202, message: Accepted} version: 1 From 9570d4c8f04ad97b4743fc23fa1d4add3a7c708e Mon Sep 17 00:00:00 2001 From: williexu Date: Wed, 2 May 2018 14:35:56 -0700 Subject: [PATCH 08/19] excluded vendored sdk directory from ci --- scripts/ci/test_static.sh | 4 ++-- src/storage-preview/azext_storage_preview/__init__.py | 4 ++-- src/storage-preview/azext_storage_preview/_validators.py | 2 +- src/storage-preview/azext_storage_preview/profiles.py | 2 +- .../{azure_storage => vendored_sdks}/__init__.py | 0 .../v2017_11_09 => vendored_sdks/azure_storage}/__init__.py | 0 .../vendored_sdks/azure_storage/v2017_11_09/__init__.py | 1 + .../azure_storage/v2017_11_09/blob/__init__.py | 0 .../azure_storage/v2017_11_09/blob/_constants.py | 0 .../azure_storage/v2017_11_09/blob/_deserialization.py | 0 .../azure_storage/v2017_11_09/blob/_download_chunking.py | 0 .../azure_storage/v2017_11_09/blob/_encryption.py | 0 .../azure_storage/v2017_11_09/blob/_error.py | 0 .../azure_storage/v2017_11_09/blob/_serialization.py | 0 .../azure_storage/v2017_11_09/blob/_upload_chunking.py | 0 .../azure_storage/v2017_11_09/blob/appendblobservice.py | 0 .../azure_storage/v2017_11_09/blob/baseblobservice.py | 0 .../azure_storage/v2017_11_09/blob/blockblobservice.py | 0 .../azure_storage/v2017_11_09/blob/models.py | 0 .../azure_storage/v2017_11_09/blob/pageblobservice.py | 0 .../azure_storage/v2017_11_09/blob/sharedaccesssignature.py | 0 .../azure_storage/v2017_11_09/common/__init__.py | 0 .../azure_storage/v2017_11_09/common/_auth.py | 0 .../azure_storage/v2017_11_09/common/_common_conversion.py | 0 .../azure_storage/v2017_11_09/common/_connection.py | 0 .../azure_storage/v2017_11_09/common/_constants.py | 0 .../azure_storage/v2017_11_09/common/_deserialization.py | 0 .../azure_storage/v2017_11_09/common/_encryption.py | 0 .../azure_storage/v2017_11_09/common/_error.py | 0 .../azure_storage/v2017_11_09/common/_http/__init__.py | 0 .../azure_storage/v2017_11_09/common/_http/httpclient.py | 0 .../azure_storage/v2017_11_09/common/_serialization.py | 0 .../azure_storage/v2017_11_09/common/cloudstorageaccount.py | 0 .../azure_storage/v2017_11_09/common/models.py | 0 .../azure_storage/v2017_11_09/common/retry.py | 0 .../azure_storage/v2017_11_09/common/sharedaccesssignature.py | 0 .../azure_storage/v2017_11_09/common/storageclient.py | 0 .../azure_storage/v2017_11_09/common/tokencredential.py | 0 .../azure_storage/v2017_11_09/file/__init__.py | 0 .../azure_storage/v2017_11_09/file/_constants.py | 0 .../azure_storage/v2017_11_09/file/_deserialization.py | 0 .../azure_storage/v2017_11_09/file/_download_chunking.py | 0 .../azure_storage/v2017_11_09/file/_serialization.py | 0 .../azure_storage/v2017_11_09/file/_upload_chunking.py | 0 .../azure_storage/v2017_11_09/file/fileservice.py | 0 .../azure_storage/v2017_11_09/file/models.py | 0 .../azure_storage/v2017_11_09/file/sharedaccesssignature.py | 0 .../azure_storage/v2017_11_09/queue/__init__.py | 0 .../azure_storage/v2017_11_09/queue/_constants.py | 0 .../azure_storage/v2017_11_09/queue/_deserialization.py | 0 .../azure_storage/v2017_11_09/queue/_encryption.py | 0 .../azure_storage/v2017_11_09/queue/_error.py | 0 .../azure_storage/v2017_11_09/queue/_serialization.py | 0 .../azure_storage/v2017_11_09/queue/models.py | 0 .../azure_storage/v2017_11_09/queue/queueservice.py | 0 .../azure_storage/v2017_11_09/queue/sharedaccesssignature.py | 0 56 files changed, 7 insertions(+), 6 deletions(-) rename src/storage-preview/azext_storage_preview/{azure_storage => vendored_sdks}/__init__.py (100%) rename src/storage-preview/azext_storage_preview/{azure_storage/v2017_11_09 => vendored_sdks/azure_storage}/__init__.py (100%) create mode 100644 src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/__init__.py rename src/storage-preview/azext_storage_preview/{ => vendored_sdks}/azure_storage/v2017_11_09/blob/__init__.py (100%) rename src/storage-preview/azext_storage_preview/{ => vendored_sdks}/azure_storage/v2017_11_09/blob/_constants.py (100%) rename src/storage-preview/azext_storage_preview/{ => vendored_sdks}/azure_storage/v2017_11_09/blob/_deserialization.py (100%) rename src/storage-preview/azext_storage_preview/{ => vendored_sdks}/azure_storage/v2017_11_09/blob/_download_chunking.py (100%) rename src/storage-preview/azext_storage_preview/{ => vendored_sdks}/azure_storage/v2017_11_09/blob/_encryption.py (100%) rename src/storage-preview/azext_storage_preview/{ => vendored_sdks}/azure_storage/v2017_11_09/blob/_error.py (100%) rename src/storage-preview/azext_storage_preview/{ => vendored_sdks}/azure_storage/v2017_11_09/blob/_serialization.py (100%) rename src/storage-preview/azext_storage_preview/{ => vendored_sdks}/azure_storage/v2017_11_09/blob/_upload_chunking.py (100%) rename src/storage-preview/azext_storage_preview/{ => vendored_sdks}/azure_storage/v2017_11_09/blob/appendblobservice.py (100%) rename src/storage-preview/azext_storage_preview/{ => vendored_sdks}/azure_storage/v2017_11_09/blob/baseblobservice.py (100%) rename src/storage-preview/azext_storage_preview/{ => vendored_sdks}/azure_storage/v2017_11_09/blob/blockblobservice.py (100%) rename src/storage-preview/azext_storage_preview/{ => vendored_sdks}/azure_storage/v2017_11_09/blob/models.py (100%) rename src/storage-preview/azext_storage_preview/{ => vendored_sdks}/azure_storage/v2017_11_09/blob/pageblobservice.py (100%) rename src/storage-preview/azext_storage_preview/{ => vendored_sdks}/azure_storage/v2017_11_09/blob/sharedaccesssignature.py (100%) rename src/storage-preview/azext_storage_preview/{ => vendored_sdks}/azure_storage/v2017_11_09/common/__init__.py (100%) rename src/storage-preview/azext_storage_preview/{ => vendored_sdks}/azure_storage/v2017_11_09/common/_auth.py (100%) rename src/storage-preview/azext_storage_preview/{ => vendored_sdks}/azure_storage/v2017_11_09/common/_common_conversion.py (100%) rename src/storage-preview/azext_storage_preview/{ => vendored_sdks}/azure_storage/v2017_11_09/common/_connection.py (100%) rename src/storage-preview/azext_storage_preview/{ => vendored_sdks}/azure_storage/v2017_11_09/common/_constants.py (100%) rename src/storage-preview/azext_storage_preview/{ => vendored_sdks}/azure_storage/v2017_11_09/common/_deserialization.py (100%) rename src/storage-preview/azext_storage_preview/{ => vendored_sdks}/azure_storage/v2017_11_09/common/_encryption.py (100%) rename src/storage-preview/azext_storage_preview/{ => vendored_sdks}/azure_storage/v2017_11_09/common/_error.py (100%) rename src/storage-preview/azext_storage_preview/{ => vendored_sdks}/azure_storage/v2017_11_09/common/_http/__init__.py (100%) rename src/storage-preview/azext_storage_preview/{ => vendored_sdks}/azure_storage/v2017_11_09/common/_http/httpclient.py (100%) rename src/storage-preview/azext_storage_preview/{ => vendored_sdks}/azure_storage/v2017_11_09/common/_serialization.py (100%) rename src/storage-preview/azext_storage_preview/{ => vendored_sdks}/azure_storage/v2017_11_09/common/cloudstorageaccount.py (100%) rename src/storage-preview/azext_storage_preview/{ => vendored_sdks}/azure_storage/v2017_11_09/common/models.py (100%) rename src/storage-preview/azext_storage_preview/{ => vendored_sdks}/azure_storage/v2017_11_09/common/retry.py (100%) rename src/storage-preview/azext_storage_preview/{ => vendored_sdks}/azure_storage/v2017_11_09/common/sharedaccesssignature.py (100%) rename src/storage-preview/azext_storage_preview/{ => vendored_sdks}/azure_storage/v2017_11_09/common/storageclient.py (100%) rename src/storage-preview/azext_storage_preview/{ => vendored_sdks}/azure_storage/v2017_11_09/common/tokencredential.py (100%) rename src/storage-preview/azext_storage_preview/{ => vendored_sdks}/azure_storage/v2017_11_09/file/__init__.py (100%) rename src/storage-preview/azext_storage_preview/{ => vendored_sdks}/azure_storage/v2017_11_09/file/_constants.py (100%) rename src/storage-preview/azext_storage_preview/{ => vendored_sdks}/azure_storage/v2017_11_09/file/_deserialization.py (100%) rename src/storage-preview/azext_storage_preview/{ => vendored_sdks}/azure_storage/v2017_11_09/file/_download_chunking.py (100%) rename src/storage-preview/azext_storage_preview/{ => vendored_sdks}/azure_storage/v2017_11_09/file/_serialization.py (100%) rename src/storage-preview/azext_storage_preview/{ => vendored_sdks}/azure_storage/v2017_11_09/file/_upload_chunking.py (100%) rename src/storage-preview/azext_storage_preview/{ => vendored_sdks}/azure_storage/v2017_11_09/file/fileservice.py (100%) rename src/storage-preview/azext_storage_preview/{ => vendored_sdks}/azure_storage/v2017_11_09/file/models.py (100%) rename src/storage-preview/azext_storage_preview/{ => vendored_sdks}/azure_storage/v2017_11_09/file/sharedaccesssignature.py (100%) rename src/storage-preview/azext_storage_preview/{ => vendored_sdks}/azure_storage/v2017_11_09/queue/__init__.py (100%) rename src/storage-preview/azext_storage_preview/{ => vendored_sdks}/azure_storage/v2017_11_09/queue/_constants.py (100%) rename src/storage-preview/azext_storage_preview/{ => vendored_sdks}/azure_storage/v2017_11_09/queue/_deserialization.py (100%) rename src/storage-preview/azext_storage_preview/{ => vendored_sdks}/azure_storage/v2017_11_09/queue/_encryption.py (100%) rename src/storage-preview/azext_storage_preview/{ => vendored_sdks}/azure_storage/v2017_11_09/queue/_error.py (100%) rename src/storage-preview/azext_storage_preview/{ => vendored_sdks}/azure_storage/v2017_11_09/queue/_serialization.py (100%) rename src/storage-preview/azext_storage_preview/{ => vendored_sdks}/azure_storage/v2017_11_09/queue/models.py (100%) rename src/storage-preview/azext_storage_preview/{ => vendored_sdks}/azure_storage/v2017_11_09/queue/queueservice.py (100%) rename src/storage-preview/azext_storage_preview/{ => vendored_sdks}/azure_storage/v2017_11_09/queue/sharedaccesssignature.py (100%) diff --git a/scripts/ci/test_static.sh b/scripts/ci/test_static.sh index 528544e6221..6b3d8c418ca 100755 --- a/scripts/ci/test_static.sh +++ b/scripts/ci/test_static.sh @@ -9,12 +9,12 @@ PYLINT_EXCLUDES=$(echo "$AZURE_SDK_AUTOGEN_FILES" | sed -e s=\./src/=src/=g -e ' # Run pylint/flake8 on extensions echo "Running pylint on extensions..." -pylint ./src/rdbms/azext_rdbms/ --ignore=$PYLINT_EXCLUDES --ignore-patterns=test_* --rcfile=./pylintrc -j $proc_number +pylint ./src/rdbms/azext_rdbms/ --ignore=$PYLINT_EXCLUDES,vendored_sdks --ignore-patterns=test_* --rcfile=./pylintrc -j $proc_number echo "Pylint OK." echo "Running flake8 on extensions..." -flake8 --statistics --exclude=$FLAKE8_EXCLUDES --append-config=./.flake8 ./src/*/azext_*/ +flake8 --statistics --exclude=$FLAKE8_EXCLUDES,vendored_sdks --append-config=./.flake8 ./src/*/azext_*/ echo "Flake8 OK." # Run pylint/flake8 on CI files diff --git a/src/storage-preview/azext_storage_preview/__init__.py b/src/storage-preview/azext_storage_preview/__init__.py index 7d4dadd7f82..fb5bd8b82ca 100644 --- a/src/storage-preview/azext_storage_preview/__init__.py +++ b/src/storage-preview/azext_storage_preview/__init__.py @@ -165,7 +165,7 @@ def handler(ex): def _register_data_plane_account_arguments(self, command_name, oauth): """ Add parameters required to create a storage client """ - from ._validators import select_correct_validator + from ._validators import get_client_parameters_validator command = self.command_loader.command_table.get(command_name, None) if not command: return @@ -183,7 +183,7 @@ def _register_data_plane_account_arguments(self, command_name, oauth): help='Storage account key. Must be used in conjunction with storage account name. ' 'Environment variable: AZURE_STORAGE_KEY') command.add_argument('connection_string', '--connection-string', required=False, default=None, - validator=select_correct_validator(oauth), arg_group=group_name, + validator=get_client_parameters_validator(oauth), arg_group=group_name, help='Storage account connection string. Environment variable: ' 'AZURE_STORAGE_CONNECTION_STRING') command.add_argument('sas_token', '--sas-token', required=False, default=None, diff --git a/src/storage-preview/azext_storage_preview/_validators.py b/src/storage-preview/azext_storage_preview/_validators.py index 10786c830d5..42f00717e62 100644 --- a/src/storage-preview/azext_storage_preview/_validators.py +++ b/src/storage-preview/azext_storage_preview/_validators.py @@ -76,7 +76,7 @@ def validate_bypass(namespace): namespace.bypass = ', '.join(namespace.bypass) if isinstance(namespace.bypass, list) else namespace.bypass -def select_correct_validator(oauth): +def get_client_parameters_validator(oauth): def func(cmd, namespace): validate_client_parameters(cmd, namespace, oauth=oauth) return func diff --git a/src/storage-preview/azext_storage_preview/profiles.py b/src/storage-preview/azext_storage_preview/profiles.py index 08e06337853..1af24df81dc 100644 --- a/src/storage-preview/azext_storage_preview/profiles.py +++ b/src/storage-preview/azext_storage_preview/profiles.py @@ -6,5 +6,5 @@ from azure.cli.core.profiles import CustomResourceType, ResourceType -CUSTOM_DATA_STORAGE = CustomResourceType('azext_storage_preview.azure_storage', None) +CUSTOM_DATA_STORAGE = CustomResourceType('azext_storage_preview.vendored_sdks.azure_storage', None) # CUSTOM_DATA_STORAGE = ResourceType.DATA_STORAGE diff --git a/src/storage-preview/azext_storage_preview/azure_storage/__init__.py b/src/storage-preview/azext_storage_preview/vendored_sdks/__init__.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/__init__.py rename to src/storage-preview/azext_storage_preview/vendored_sdks/__init__.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/__init__.py b/src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/__init__.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/__init__.py rename to src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/__init__.py diff --git a/src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/__init__.py b/src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/__init__.py new file mode 100644 index 00000000000..de40ea7ca05 --- /dev/null +++ b/src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/__init__.py @@ -0,0 +1 @@ +__import__('pkg_resources').declare_namespace(__name__) diff --git a/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/__init__.py b/src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/blob/__init__.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/__init__.py rename to src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/blob/__init__.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/_constants.py b/src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/blob/_constants.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/_constants.py rename to src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/blob/_constants.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/_deserialization.py b/src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/blob/_deserialization.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/_deserialization.py rename to src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/blob/_deserialization.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/_download_chunking.py b/src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/blob/_download_chunking.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/_download_chunking.py rename to src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/blob/_download_chunking.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/_encryption.py b/src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/blob/_encryption.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/_encryption.py rename to src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/blob/_encryption.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/_error.py b/src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/blob/_error.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/_error.py rename to src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/blob/_error.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/_serialization.py b/src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/blob/_serialization.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/_serialization.py rename to src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/blob/_serialization.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/_upload_chunking.py b/src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/blob/_upload_chunking.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/_upload_chunking.py rename to src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/blob/_upload_chunking.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/appendblobservice.py b/src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/blob/appendblobservice.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/appendblobservice.py rename to src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/blob/appendblobservice.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/baseblobservice.py b/src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/blob/baseblobservice.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/baseblobservice.py rename to src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/blob/baseblobservice.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/blockblobservice.py b/src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/blob/blockblobservice.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/blockblobservice.py rename to src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/blob/blockblobservice.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/models.py b/src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/blob/models.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/models.py rename to src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/blob/models.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/pageblobservice.py b/src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/blob/pageblobservice.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/pageblobservice.py rename to src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/blob/pageblobservice.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/sharedaccesssignature.py b/src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/blob/sharedaccesssignature.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/blob/sharedaccesssignature.py rename to src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/blob/sharedaccesssignature.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/__init__.py b/src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/common/__init__.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/__init__.py rename to src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/common/__init__.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/_auth.py b/src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/common/_auth.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/_auth.py rename to src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/common/_auth.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/_common_conversion.py b/src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/common/_common_conversion.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/_common_conversion.py rename to src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/common/_common_conversion.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/_connection.py b/src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/common/_connection.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/_connection.py rename to src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/common/_connection.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/_constants.py b/src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/common/_constants.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/_constants.py rename to src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/common/_constants.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/_deserialization.py b/src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/common/_deserialization.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/_deserialization.py rename to src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/common/_deserialization.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/_encryption.py b/src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/common/_encryption.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/_encryption.py rename to src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/common/_encryption.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/_error.py b/src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/common/_error.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/_error.py rename to src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/common/_error.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/_http/__init__.py b/src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/common/_http/__init__.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/_http/__init__.py rename to src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/common/_http/__init__.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/_http/httpclient.py b/src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/common/_http/httpclient.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/_http/httpclient.py rename to src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/common/_http/httpclient.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/_serialization.py b/src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/common/_serialization.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/_serialization.py rename to src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/common/_serialization.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/cloudstorageaccount.py b/src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/common/cloudstorageaccount.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/cloudstorageaccount.py rename to src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/common/cloudstorageaccount.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/models.py b/src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/common/models.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/models.py rename to src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/common/models.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/retry.py b/src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/common/retry.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/retry.py rename to src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/common/retry.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/sharedaccesssignature.py b/src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/common/sharedaccesssignature.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/sharedaccesssignature.py rename to src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/common/sharedaccesssignature.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/storageclient.py b/src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/common/storageclient.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/storageclient.py rename to src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/common/storageclient.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/tokencredential.py b/src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/common/tokencredential.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/common/tokencredential.py rename to src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/common/tokencredential.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/file/__init__.py b/src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/file/__init__.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/file/__init__.py rename to src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/file/__init__.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/file/_constants.py b/src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/file/_constants.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/file/_constants.py rename to src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/file/_constants.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/file/_deserialization.py b/src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/file/_deserialization.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/file/_deserialization.py rename to src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/file/_deserialization.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/file/_download_chunking.py b/src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/file/_download_chunking.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/file/_download_chunking.py rename to src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/file/_download_chunking.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/file/_serialization.py b/src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/file/_serialization.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/file/_serialization.py rename to src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/file/_serialization.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/file/_upload_chunking.py b/src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/file/_upload_chunking.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/file/_upload_chunking.py rename to src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/file/_upload_chunking.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/file/fileservice.py b/src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/file/fileservice.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/file/fileservice.py rename to src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/file/fileservice.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/file/models.py b/src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/file/models.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/file/models.py rename to src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/file/models.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/file/sharedaccesssignature.py b/src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/file/sharedaccesssignature.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/file/sharedaccesssignature.py rename to src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/file/sharedaccesssignature.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/queue/__init__.py b/src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/queue/__init__.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/queue/__init__.py rename to src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/queue/__init__.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/queue/_constants.py b/src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/queue/_constants.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/queue/_constants.py rename to src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/queue/_constants.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/queue/_deserialization.py b/src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/queue/_deserialization.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/queue/_deserialization.py rename to src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/queue/_deserialization.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/queue/_encryption.py b/src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/queue/_encryption.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/queue/_encryption.py rename to src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/queue/_encryption.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/queue/_error.py b/src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/queue/_error.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/queue/_error.py rename to src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/queue/_error.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/queue/_serialization.py b/src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/queue/_serialization.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/queue/_serialization.py rename to src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/queue/_serialization.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/queue/models.py b/src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/queue/models.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/queue/models.py rename to src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/queue/models.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/queue/queueservice.py b/src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/queue/queueservice.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/queue/queueservice.py rename to src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/queue/queueservice.py diff --git a/src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/queue/sharedaccesssignature.py b/src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/queue/sharedaccesssignature.py similarity index 100% rename from src/storage-preview/azext_storage_preview/azure_storage/v2017_11_09/queue/sharedaccesssignature.py rename to src/storage-preview/azext_storage_preview/vendored_sdks/azure_storage/v2017_11_09/queue/sharedaccesssignature.py From d8c1e90a7972d283d75c8eb3a13d304e79390978 Mon Sep 17 00:00:00 2001 From: williexu Date: Wed, 2 May 2018 15:37:13 -0700 Subject: [PATCH 09/19] added script to ignore license header in vendored sdks --- scripts/ci/test_static.sh | 2 +- scripts/ci/verify_license.py | 13 +++++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/scripts/ci/test_static.sh b/scripts/ci/test_static.sh index 6b3d8c418ca..4f463fff6d6 100755 --- a/scripts/ci/test_static.sh +++ b/scripts/ci/test_static.sh @@ -23,4 +23,4 @@ flake8 --append-config=./.flake8 ./scripts/ci/*.py # Other static checks python ./scripts/ci/verify_codeowners.py -python ./scripts/ci/verify_license.py +python ./scripts/ci/verify_license.py 'src/storage-preview/azext_storage_preview/vendored_sdks' diff --git a/scripts/ci/verify_license.py b/scripts/ci/verify_license.py index aa5f47b5c0d..65bbab7b130 100644 --- a/scripts/ci/verify_license.py +++ b/scripts/ci/verify_license.py @@ -7,6 +7,7 @@ import os import sys +import argparse from util import get_repo_root @@ -31,12 +32,14 @@ """ -def main(): - env_path = os.path.join(REPO_ROOT, 'env') +def main(args): + excluded_paths = args.excluded_paths + excluded_paths.append('env') + excluded_paths = tuple([os.path.join(REPO_ROOT, relative_path) for relative_path in excluded_paths]) files_without_header = [] for current_dir, _, files in os.walk(get_repo_root()): - if current_dir.startswith(env_path): + if current_dir.startswith(excluded_paths): continue file_itr = (os.path.join(current_dir, p) for p in files if p.endswith('.py')) for python_file in file_itr: @@ -52,4 +55,6 @@ def main(): if __name__ == '__main__': - main() + parser = argparse.ArgumentParser() + parser.add_argument('excluded_paths', nargs='*') + main(parser.parse_args()) From cfafb94147dbb00c1eeeb7e4a7063a1adb067b57 Mon Sep 17 00:00:00 2001 From: williexu Date: Wed, 2 May 2018 17:14:07 -0700 Subject: [PATCH 10/19] added auth_mode param and default to oauth del auth_mode attr --- .../azext_storage_preview/__init__.py | 25 +++++++++++++++---- .../azext_storage_preview/_validators.py | 15 ++++++----- 2 files changed, 29 insertions(+), 11 deletions(-) diff --git a/src/storage-preview/azext_storage_preview/__init__.py b/src/storage-preview/azext_storage_preview/__init__.py index fb5bd8b82ca..09f11b8ec67 100644 --- a/src/storage-preview/azext_storage_preview/__init__.py +++ b/src/storage-preview/azext_storage_preview/__init__.py @@ -137,14 +137,18 @@ def storage_command(self, name, method_name=None, command_type=None, oauth=False command_name = self.command(name, method_name, command_type=command_type, **kwargs) else: command_name = self.command(name, method_name, **kwargs) - self._register_data_plane_account_arguments(command_name, oauth) + self._register_data_plane_account_arguments(command_name) + if oauth: + self._register_data_plane_oauth_arguments(command_name) def storage_command_oauth(self, *args, **kwargs): self.storage_command(*args, oauth=True, **kwargs) def storage_custom_command(self, name, method_name, oauth=False, **kwargs): command_name = self.custom_command(name, method_name, **kwargs) - self._register_data_plane_account_arguments(command_name, oauth) + self._register_data_plane_account_arguments(command_name) + if oauth: + self._register_data_plane_oauth_arguments(command_name) def storage_custom_command_oauth(self, *args, **kwargs): self.storage_custom_command(*args, oauth=True, **kwargs) @@ -163,9 +167,9 @@ def handler(ex): return handler - def _register_data_plane_account_arguments(self, command_name, oauth): + def _register_data_plane_account_arguments(self, command_name): """ Add parameters required to create a storage client """ - from ._validators import get_client_parameters_validator + from ._validators import validate_client_parameters command = self.command_loader.command_table.get(command_name, None) if not command: return @@ -183,7 +187,7 @@ def _register_data_plane_account_arguments(self, command_name, oauth): help='Storage account key. Must be used in conjunction with storage account name. ' 'Environment variable: AZURE_STORAGE_KEY') command.add_argument('connection_string', '--connection-string', required=False, default=None, - validator=get_client_parameters_validator(oauth), arg_group=group_name, + validator=validate_client_parameters, arg_group=group_name, help='Storage account connection string. Environment variable: ' 'AZURE_STORAGE_CONNECTION_STRING') command.add_argument('sas_token', '--sas-token', required=False, default=None, @@ -191,5 +195,16 @@ def _register_data_plane_account_arguments(self, command_name, oauth): help='A Shared Access Signature (SAS). Must be used in conjunction with storage account ' 'name. Environment variable: AZURE_STORAGE_SAS_TOKEN') + def _register_data_plane_oauth_arguments(self, command_name): + from azure.cli.core.commands.parameters import get_enum_type + command = self.command_loader.command_table.get(command_name, None) + if not command: + return + + command.add_argument('auth_mode', arg_type=get_enum_type(['oauth', 'legacy']), default='oauth', + help='The mode in which to run the command. The legacy mode will attempt to query for ' + 'an account key if no authentication parameters for the account are provided.') + + COMMAND_LOADER_CLS = StorageCommandsLoader diff --git a/src/storage-preview/azext_storage_preview/_validators.py b/src/storage-preview/azext_storage_preview/_validators.py index 42f00717e62..a5d3eabf7e9 100644 --- a/src/storage-preview/azext_storage_preview/_validators.py +++ b/src/storage-preview/azext_storage_preview/_validators.py @@ -76,13 +76,13 @@ def validate_bypass(namespace): namespace.bypass = ', '.join(namespace.bypass) if isinstance(namespace.bypass, list) else namespace.bypass -def get_client_parameters_validator(oauth): - def func(cmd, namespace): - validate_client_parameters(cmd, namespace, oauth=oauth) - return func +# def get_client_parameters_validator(oauth): +# def func(cmd, namespace): +# validate_client_parameters(cmd, namespace, oauth=oauth) +# return func -def validate_client_parameters(cmd, namespace, oauth=False): +def validate_client_parameters(cmd, namespace): """ Retrieves storage connection parameters from environment variables and parses out connection string into account name and key """ n = namespace @@ -118,11 +118,14 @@ def get_config_value(section, key, default): # if account name is specified but no key, attempt to query if n.account_name and not n.account_key and not n.sas_token: - if oauth: + if hasattr(n, 'auth_mode') and n.auth_mode == 'oauth': n.token_credential = _create_token_credential(cmd.cli_ctx) else: n.account_key = _query_account_key(cmd.cli_ctx, n.account_name) + if hasattr(n, 'auth_mode'): + del n.auth_mode + def process_blob_source_uri(cmd, namespace): """ From 88f469fcd717b5d11ae7a41d0bb6d935f7a99b2d Mon Sep 17 00:00:00 2001 From: williexu Date: Thu, 3 May 2018 16:19:28 -0700 Subject: [PATCH 11/19] handle 403 error and auth mode tweaks --- .../azext_storage_preview/__init__.py | 58 ++++++++++++++++--- .../azext_storage_preview/_validators.py | 35 ++++++----- 2 files changed, 71 insertions(+), 22 deletions(-) diff --git a/src/storage-preview/azext_storage_preview/__init__.py b/src/storage-preview/azext_storage_preview/__init__.py index 09f11b8ec67..9c428068609 100644 --- a/src/storage-preview/azext_storage_preview/__init__.py +++ b/src/storage-preview/azext_storage_preview/__init__.py @@ -142,6 +142,7 @@ def storage_command(self, name, method_name=None, command_type=None, oauth=False self._register_data_plane_oauth_arguments(command_name) def storage_command_oauth(self, *args, **kwargs): + _merge_new_exception_handler(kwargs, self.get_handler_suppress_403()) self.storage_command(*args, oauth=True, **kwargs) def storage_custom_command(self, name, method_name, oauth=False, **kwargs): @@ -151,10 +152,10 @@ def storage_custom_command(self, name, method_name, oauth=False, **kwargs): self._register_data_plane_oauth_arguments(command_name) def storage_custom_command_oauth(self, *args, **kwargs): + _merge_new_exception_handler(kwargs, self.get_handler_suppress_403()) self.storage_custom_command(*args, oauth=True, **kwargs) def get_handler_suppress_404(self): - # pylint: disable=inconsistent-return-statements def handler(ex): from azure.cli.core.profiles import get_sdk @@ -162,7 +163,33 @@ def handler(ex): CUSTOM_DATA_STORAGE, 'common._error#AzureMissingResourceHttpError') if isinstance(ex, t_error): - return None + return + raise ex + + return handler + + def get_handler_suppress_403(self): + def handler(ex): + from azure.cli.core.profiles import get_sdk + from knack.log import get_logger + + logger = get_logger(__name__) + t_error = get_sdk(self.command_loader.cli_ctx, + CUSTOM_DATA_STORAGE, + 'common._error#AzureHttpError') + if isinstance(ex, t_error) and ex.status_code == 403: + message = """ +You do not have the required permissions needed to perform this operation. +Depending on your operation, you may need to be assigned one of the following roles: + "Storage Blob Data Contributor (Preview)" + "Storage Blob Data Reader (Preview)" + "Storage Queue Data Contributor (Preview)" + "Storage Queue Data Reader (Preview)" + +If you want to use the old authentication method and allow querying for the right account key, please use the "--auth-mode" parameter and "key" value. + """ + logger.error(message) + return raise ex return handler @@ -197,14 +224,27 @@ def _register_data_plane_account_arguments(self, command_name): def _register_data_plane_oauth_arguments(self, command_name): from azure.cli.core.commands.parameters import get_enum_type - command = self.command_loader.command_table.get(command_name, None) - if not command: - return - - command.add_argument('auth_mode', arg_type=get_enum_type(['oauth', 'legacy']), default='oauth', - help='The mode in which to run the command. The legacy mode will attempt to query for ' - 'an account key if no authentication parameters for the account are provided.') + # workaround to allow use of AzArgumentContext.extra() + self.command_loader.command_name = command_name + with self.command_loader.argument_context(command_name) as c: + c.extra('auth_mode', arg_type=get_enum_type(['login', 'key']), + help='The mode in which to run the command. The legacy mode will attempt to query for ' + 'an account key if no authentication parameters for the account are provided. ' + 'Environment variable: AZURE_STORAGE_AUTH_MODE') + + +def _merge_new_exception_handler(kwargs, handler): + if kwargs.get('exception_handler'): + def new_handler(ex): + first = kwargs['exception_handler'] + try: + first(ex) + except Exception as raised_ex: + handler(raised_ex) + kwargs['exception_handler'] = new_handler + else: + kwargs['exception_handler'] = handler COMMAND_LOADER_CLS = StorageCommandsLoader diff --git a/src/storage-preview/azext_storage_preview/_validators.py b/src/storage-preview/azext_storage_preview/_validators.py index a5d3eabf7e9..5fd4dd94ea3 100644 --- a/src/storage-preview/azext_storage_preview/_validators.py +++ b/src/storage-preview/azext_storage_preview/_validators.py @@ -76,12 +76,6 @@ def validate_bypass(namespace): namespace.bypass = ', '.join(namespace.bypass) if isinstance(namespace.bypass, list) else namespace.bypass -# def get_client_parameters_validator(oauth): -# def func(cmd, namespace): -# validate_client_parameters(cmd, namespace, oauth=oauth) -# return func - - def validate_client_parameters(cmd, namespace): """ Retrieves storage connection parameters from environment variables and parses out connection string into account name and key """ @@ -90,6 +84,27 @@ def validate_client_parameters(cmd, namespace): def get_config_value(section, key, default): return cmd.cli_ctx.config.get(section, key, default) + if hasattr(n, 'auth_mode'): + auth_mode = n.auth_mode or get_config_value('storage', 'auth_mode', None) + del n.auth_mode + if not n.account_name: + n.account_name = get_config_value('storage', 'account', None) + if auth_mode == 'login': + n.token_credential = _create_token_credential(cmd.cli_ctx) + + # give warning if there are account key args being ignored + account_key_args = [n.account_key and "--account-key", n.sas_token and "--sas-token", + n.connection_string and "--connection-string"] + account_key_args = [arg for arg in account_key_args if arg] + + if account_key_args: + from knack.log import get_logger + + logger = get_logger(__name__) + logger.warning('In "login" auth mode, the following arguments are ignored: %s', + ' ,'.join(account_key_args)) + return + if not n.connection_string: n.connection_string = get_config_value('storage', 'connection_string', None) @@ -118,13 +133,7 @@ def get_config_value(section, key, default): # if account name is specified but no key, attempt to query if n.account_name and not n.account_key and not n.sas_token: - if hasattr(n, 'auth_mode') and n.auth_mode == 'oauth': - n.token_credential = _create_token_credential(cmd.cli_ctx) - else: - n.account_key = _query_account_key(cmd.cli_ctx, n.account_name) - - if hasattr(n, 'auth_mode'): - del n.auth_mode + n.account_key = _query_account_key(cmd.cli_ctx, n.account_name) def process_blob_source_uri(cmd, namespace): From 5027cc817e3c328dc58d828f0c72e0968fa1a140 Mon Sep 17 00:00:00 2001 From: williexu Date: Thu, 3 May 2018 17:23:05 -0700 Subject: [PATCH 12/19] added storage-preview url to index.json typo in index.json --- src/index.json | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/src/index.json b/src/index.json index f530ed52c33..4d099dbb955 100644 --- a/src/index.json +++ b/src/index.json @@ -823,6 +823,53 @@ "version": "0.0.1" } } + ], + "storage-preview": [ + { + "filename": "storage_preview-0.1.0-py2.py3-none-any.whl", + "sha256Digest": "05401260adccc99d59e086f441f2230ebc357fa2e399da78eb0074ea9a256212", + "downloadUrl": "https://azurecliprod.blob.core.windows.net/cli-extensions/storage_preview-0.1.0-py2.py3-none-any.whl", + "metadata": { + "azext.isPreview": true, + "azext.minCliCoreVersion": "2.0.31.dev0", + "classifiers": [ + "Development Status :: 4 - Beta", + "Intended Audience :: Developers", + "Intended Audience :: System Administrators", + "Programming Language :: Python", + "Programming Language :: Python :: 2", + "Programming Language :: Python :: 2.7", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.4", + "Programming Language :: Python :: 3.5", + "Programming Language :: Python :: 3.6", + "License :: OSI Approved :: MIT License" + ], + "extensions": { + "python.details": { + "contacts": [ + { + "email": "wilx@microsoft.com", + "name": "Willie Xu", + "role": "author" + } + ], + "document_names": { + "description": "DESCRIPTION.rst" + }, + "project_urls": { + "Home": "https://github.com/Azure/azure-cli-extensions" + } + } + }, + "generator": "bdist_wheel (0.30.0)", + "license": "MIT", + "metadata_version": "2.0", + "name": "storage-preview", + "summary": "Preview Azure Storage commands.", + "version": "0.1.0" + } + } ] } } \ No newline at end of file From 4c3fa3eda5093bc2eaff9f5539602aadf32924a7 Mon Sep 17 00:00:00 2001 From: williexu Date: Thu, 3 May 2018 17:45:42 -0700 Subject: [PATCH 13/19] bump min cli version to 2.0.32 --- src/index.json | 4 ++-- src/storage-preview/azext_storage_preview/azext_metadata.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/index.json b/src/index.json index 4d099dbb955..94762f37c51 100644 --- a/src/index.json +++ b/src/index.json @@ -827,11 +827,11 @@ "storage-preview": [ { "filename": "storage_preview-0.1.0-py2.py3-none-any.whl", - "sha256Digest": "05401260adccc99d59e086f441f2230ebc357fa2e399da78eb0074ea9a256212", + "sha256Digest": "b18d6a8e75d945be8681b1df8921eb3d8881bb2ec66f72ea4ddfea0a838c7c94", "downloadUrl": "https://azurecliprod.blob.core.windows.net/cli-extensions/storage_preview-0.1.0-py2.py3-none-any.whl", "metadata": { "azext.isPreview": true, - "azext.minCliCoreVersion": "2.0.31.dev0", + "azext.minCliCoreVersion": "2.0.32.dev0", "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", diff --git a/src/storage-preview/azext_storage_preview/azext_metadata.json b/src/storage-preview/azext_storage_preview/azext_metadata.json index 391858872b6..3a32f9f753f 100644 --- a/src/storage-preview/azext_storage_preview/azext_metadata.json +++ b/src/storage-preview/azext_storage_preview/azext_metadata.json @@ -1,4 +1,4 @@ { - "azext.minCliCoreVersion": "2.0.32", + "azext.minCliCoreVersion": "2.0.32.dev0", "azext.isPreview": true } \ No newline at end of file From 5abac85bfefec3d33ad17cbac6b1801a178c9943 Mon Sep 17 00:00:00 2001 From: williexu Date: Thu, 3 May 2018 17:48:06 -0700 Subject: [PATCH 14/19] update sha hash new whl --- src/index.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/index.json b/src/index.json index 94762f37c51..d255319033c 100644 --- a/src/index.json +++ b/src/index.json @@ -827,7 +827,7 @@ "storage-preview": [ { "filename": "storage_preview-0.1.0-py2.py3-none-any.whl", - "sha256Digest": "b18d6a8e75d945be8681b1df8921eb3d8881bb2ec66f72ea4ddfea0a838c7c94", + "sha256Digest": "fa3d34780f49b5995a5192214d69473325e24fc0d0b58b82851194fadcc9114d", "downloadUrl": "https://azurecliprod.blob.core.windows.net/cli-extensions/storage_preview-0.1.0-py2.py3-none-any.whl", "metadata": { "azext.isPreview": true, From 5d30b5b3ba48dd32fea2ff561368ca5e2dfc766a Mon Sep 17 00:00:00 2001 From: williexu Date: Fri, 4 May 2018 10:25:47 -0700 Subject: [PATCH 15/19] updated index.json to match whl summary --- src/index.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/index.json b/src/index.json index d255319033c..96677285c7c 100644 --- a/src/index.json +++ b/src/index.json @@ -849,8 +849,8 @@ "python.details": { "contacts": [ { - "email": "wilx@microsoft.com", - "name": "Willie Xu", + "email": "azpycli@microsoft.com", + "name": "Microsoft Corporation", "role": "author" } ], @@ -862,11 +862,11 @@ } } }, - "generator": "bdist_wheel (0.30.0)", + "generator": "bdist_wheel (0.29.0)", "license": "MIT", "metadata_version": "2.0", "name": "storage-preview", - "summary": "Preview Azure Storage commands.", + "summary": "Provides a preview for upcoming storage features.", "version": "0.1.0" } } From 26f8852312ddbee185d92a05c3f914242f8ed3e1 Mon Sep 17 00:00:00 2001 From: williexu Date: Fri, 4 May 2018 12:36:06 -0700 Subject: [PATCH 16/19] updated help for auth modes --- src/storage-preview/azext_storage_preview/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/storage-preview/azext_storage_preview/__init__.py b/src/storage-preview/azext_storage_preview/__init__.py index 9c428068609..78b8fdf1361 100644 --- a/src/storage-preview/azext_storage_preview/__init__.py +++ b/src/storage-preview/azext_storage_preview/__init__.py @@ -229,7 +229,8 @@ def _register_data_plane_oauth_arguments(self, command_name): self.command_loader.command_name = command_name with self.command_loader.argument_context(command_name) as c: c.extra('auth_mode', arg_type=get_enum_type(['login', 'key']), - help='The mode in which to run the command. The legacy mode will attempt to query for ' + help='The mode in which to run the command. "login" mode will directly use your login credentials ' + 'for the authentication. The legacy "key" mode will attempt to query for ' 'an account key if no authentication parameters for the account are provided. ' 'Environment variable: AZURE_STORAGE_AUTH_MODE') From 4bb5deaecdbda8da866a6ad5a1a1345efc5d2b36 Mon Sep 17 00:00:00 2001 From: williexu Date: Fri, 4 May 2018 14:09:45 -0700 Subject: [PATCH 17/19] addressed comments --- scripts/ci/test_static.sh | 2 +- src/storage-preview/azext_storage_preview/oauth_token_util.py | 2 +- src/storage-preview/azext_storage_preview/profiles.py | 3 +-- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/scripts/ci/test_static.sh b/scripts/ci/test_static.sh index 4f463fff6d6..e83ecd9a1e0 100755 --- a/scripts/ci/test_static.sh +++ b/scripts/ci/test_static.sh @@ -9,7 +9,7 @@ PYLINT_EXCLUDES=$(echo "$AZURE_SDK_AUTOGEN_FILES" | sed -e s=\./src/=src/=g -e ' # Run pylint/flake8 on extensions echo "Running pylint on extensions..." -pylint ./src/rdbms/azext_rdbms/ --ignore=$PYLINT_EXCLUDES,vendored_sdks --ignore-patterns=test_* --rcfile=./pylintrc -j $proc_number +pylint ./src/*/azext_*/ --ignore=$PYLINT_EXCLUDES,vendored_sdks --ignore-patterns=test_* --rcfile=./pylintrc -j $proc_number echo "Pylint OK." diff --git a/src/storage-preview/azext_storage_preview/oauth_token_util.py b/src/storage-preview/azext_storage_preview/oauth_token_util.py index 3cbd5f0c166..043678a85d9 100644 --- a/src/storage-preview/azext_storage_preview/oauth_token_util.py +++ b/src/storage-preview/azext_storage_preview/oauth_token_util.py @@ -38,7 +38,7 @@ def timer_callback(self): self.timer.start() def cancel(self): - # the timer needs to be canceled if the application is terminating + # the timer needs to be canceled once the command has finished executing # if not the timer will keep going with self.lock: self.timer.cancel() diff --git a/src/storage-preview/azext_storage_preview/profiles.py b/src/storage-preview/azext_storage_preview/profiles.py index 1af24df81dc..05cdc4c3244 100644 --- a/src/storage-preview/azext_storage_preview/profiles.py +++ b/src/storage-preview/azext_storage_preview/profiles.py @@ -3,8 +3,7 @@ # Licensed under the MIT License. See License.txt in the project root for license information. # -------------------------------------------------------------------------------------------- -from azure.cli.core.profiles import CustomResourceType, ResourceType +from azure.cli.core.profiles import CustomResourceType CUSTOM_DATA_STORAGE = CustomResourceType('azext_storage_preview.vendored_sdks.azure_storage', None) -# CUSTOM_DATA_STORAGE = ResourceType.DATA_STORAGE From d065925761a44b0e50958ad8db35b6f0228ebc58 Mon Sep 17 00:00:00 2001 From: williexu Date: Fri, 4 May 2018 14:46:52 -0700 Subject: [PATCH 18/19] fix storage pylint and revert running pylint on all extensions for this pr --- scripts/ci/test_static.sh | 2 +- src/storage-preview/azext_storage_preview/__init__.py | 2 +- src/storage-preview/azext_storage_preview/_client_factory.py | 1 - src/storage-preview/azext_storage_preview/_format.py | 2 +- src/storage-preview/azext_storage_preview/services_wrapper.py | 2 +- 5 files changed, 4 insertions(+), 5 deletions(-) diff --git a/scripts/ci/test_static.sh b/scripts/ci/test_static.sh index e83ecd9a1e0..4f463fff6d6 100755 --- a/scripts/ci/test_static.sh +++ b/scripts/ci/test_static.sh @@ -9,7 +9,7 @@ PYLINT_EXCLUDES=$(echo "$AZURE_SDK_AUTOGEN_FILES" | sed -e s=\./src/=src/=g -e ' # Run pylint/flake8 on extensions echo "Running pylint on extensions..." -pylint ./src/*/azext_*/ --ignore=$PYLINT_EXCLUDES,vendored_sdks --ignore-patterns=test_* --rcfile=./pylintrc -j $proc_number +pylint ./src/rdbms/azext_rdbms/ --ignore=$PYLINT_EXCLUDES,vendored_sdks --ignore-patterns=test_* --rcfile=./pylintrc -j $proc_number echo "Pylint OK." diff --git a/src/storage-preview/azext_storage_preview/__init__.py b/src/storage-preview/azext_storage_preview/__init__.py index 78b8fdf1361..7ae28d3456b 100644 --- a/src/storage-preview/azext_storage_preview/__init__.py +++ b/src/storage-preview/azext_storage_preview/__init__.py @@ -241,7 +241,7 @@ def new_handler(ex): first = kwargs['exception_handler'] try: first(ex) - except Exception as raised_ex: + except Exception as raised_ex: # pylint: disable=broad-except handler(raised_ex) kwargs['exception_handler'] = new_handler else: diff --git a/src/storage-preview/azext_storage_preview/_client_factory.py b/src/storage-preview/azext_storage_preview/_client_factory.py index be72006cd7a..849babefca2 100644 --- a/src/storage-preview/azext_storage_preview/_client_factory.py +++ b/src/storage-preview/azext_storage_preview/_client_factory.py @@ -71,7 +71,6 @@ def generic_data_service_factory(cli_ctx, service, name=None, key=None, connecti message = str(val_exception) if message == _ERROR_STORAGE_MISSING_INFO: message = NO_CREDENTIALS_ERROR_MESSAGE - from knack.util import CLIError raise CLIError(message) diff --git a/src/storage-preview/azext_storage_preview/_format.py b/src/storage-preview/azext_storage_preview/_format.py index 199bbc6fefb..908bb395e65 100644 --- a/src/storage-preview/azext_storage_preview/_format.py +++ b/src/storage-preview/azext_storage_preview/_format.py @@ -3,7 +3,7 @@ # Licensed under the MIT License. See License.txt in the project root for license information. # -------------------------------------------------------------------------------------------- -from azure.cli.core.profiles import get_sdk, ResourceType +from azure.cli.core.profiles import get_sdk from .profiles import CUSTOM_DATA_STORAGE diff --git a/src/storage-preview/azext_storage_preview/services_wrapper.py b/src/storage-preview/azext_storage_preview/services_wrapper.py index 7b1b66108ed..ef9cde6dfa7 100644 --- a/src/storage-preview/azext_storage_preview/services_wrapper.py +++ b/src/storage-preview/azext_storage_preview/services_wrapper.py @@ -3,7 +3,7 @@ # Licensed under the MIT License. See License.txt in the project root for license information. # -------------------------------------------------------------------------------------------- -from azure.cli.core.profiles import get_sdk, ResourceType +from azure.cli.core.profiles import get_sdk from ._client_factory import generic_data_service_factory from .profiles import CUSTOM_DATA_STORAGE From d6493539ce7eccc274149bb20d217c6ecd79fb59 Mon Sep 17 00:00:00 2001 From: williexu Date: Fri, 4 May 2018 16:40:59 -0700 Subject: [PATCH 19/19] update hash --- src/index.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/index.json b/src/index.json index 96677285c7c..1a19ff851cc 100644 --- a/src/index.json +++ b/src/index.json @@ -827,7 +827,7 @@ "storage-preview": [ { "filename": "storage_preview-0.1.0-py2.py3-none-any.whl", - "sha256Digest": "fa3d34780f49b5995a5192214d69473325e24fc0d0b58b82851194fadcc9114d", + "sha256Digest": "36768962d09c65b9668581f5bc01f1ad252acf832f22afdb04ed00c3333379cc", "downloadUrl": "https://azurecliprod.blob.core.windows.net/cli-extensions/storage_preview-0.1.0-py2.py3-none-any.whl", "metadata": { "azext.isPreview": true,