diff --git a/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/implementation/util/ModelHelper.java b/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/implementation/util/ModelHelper.java index 5de41dd10a21..5d8b837b8e00 100644 --- a/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/implementation/util/ModelHelper.java +++ b/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/implementation/util/ModelHelper.java @@ -202,6 +202,9 @@ public static BlobItem populateBlobItem(BlobItemInternal blobItemInternal) { } blobItem.setTags(tags); + blobItem.setObjectReplicationSourcePolicies( + transformObjectReplicationMetadata(blobItemInternal.getObjectReplicationMetadata())); + return blobItem; } @@ -247,25 +250,36 @@ public static BlobItemProperties populateBlobItemProperties(BlobItemPropertiesIn blobItemProperties.setAccessTierChangeTime(blobItemPropertiesInternal.getAccessTierChangeTime()); blobItemProperties.setTagCount(blobItemPropertiesInternal.getTagCount()); - // TODO: (rickle-msft) Uncomment when these properties are returned on lists. - /*this.objectReplicationSourcePolicies = new HashMap<>(); - this.objectReplicationDestinationPolicyId = objectReplicationStatus.getOrDefault("policy-id", null); - if (objectReplicationDestinationPolicyId == null) { - for (String str : objectReplicationStatus.keySet()) { - String[] split = str.split("_"); - String policyId = split[0]; - String ruleId = split[1]; - if (objectReplicationSourcePolicies.containsKey(policyId)) { - objectReplicationSourcePolicies.get(policyId) - .putRuleAndStatus(ruleId, objectReplicationStatus.get(str)); - } else { - ObjectReplicationPolicy policy = new ObjectReplicationPolicy(policyId); - policy.putRuleAndStatus(ruleId, objectReplicationStatus.get(str)); - objectReplicationSourcePolicies.put(policyId, policy); - } + return blobItemProperties; + } + + private static List transformObjectReplicationMetadata( + Map objectReplicationMetadata) { + + Map> internalSourcePolicies = new HashMap<>(); + objectReplicationMetadata = objectReplicationMetadata == null ? new HashMap<>() : objectReplicationMetadata; + for (Map.Entry entry : objectReplicationMetadata.entrySet()) { + String orString = entry.getKey(); + String str = orString.startsWith("or-") ? orString.substring(3) : orString; + String[] split = str.split("_"); + String policyId = split[0]; + String ruleId = split[1]; + ObjectReplicationRule rule = new ObjectReplicationRule(ruleId, + ObjectReplicationStatus.fromString(entry.getValue())); + if (!internalSourcePolicies.containsKey(policyId)) { + internalSourcePolicies.put(policyId, new ArrayList<>()); } - }*/ + internalSourcePolicies.get(policyId).add(rule); + } - return blobItemProperties; + if (internalSourcePolicies.isEmpty()) { + return null; + } + List objectReplicationSourcePolicies = new ArrayList<>(); + for (Map.Entry> entry : internalSourcePolicies.entrySet()) { + objectReplicationSourcePolicies.add(new ObjectReplicationPolicy(entry.getKey(), entry.getValue())); + } + return objectReplicationSourcePolicies; } + } diff --git a/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/models/BlobItem.java b/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/models/BlobItem.java index 24c0072d6782..8d7f452f3738 100644 --- a/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/models/BlobItem.java +++ b/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/models/BlobItem.java @@ -8,6 +8,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement; +import java.util.List; import java.util.Map; /** @@ -57,17 +58,11 @@ public final class BlobItem { private Boolean isCurrentVersion; - /* - * The objectReplicationPolicyId property. - */ - @JsonProperty(value = "ObjectReplicationPolicyId") - private String objectReplicationPolicyId; - /* * The objectReplicationRuleStatus property. */ @JsonProperty(value = "BlobObjectReplicationRuleStatus") - private Map objectReplicationRuleStatus; + private List objectReplicationSourcePolicies; /* * The isPrefix property. @@ -236,48 +231,25 @@ public BlobItem setCurrentVersion(Boolean isCurrentVersion) { } /** - * Get the objectReplicationPolicyId property: The - * objectReplicationPolicyId property. - * - * @return the objectReplicationPolicyId value. - */ - public String getObjectReplicationPolicyId() { - return this.objectReplicationPolicyId; - } - - /** - * Set the objectReplicationPolicyId property: The - * objectReplicationPolicyId property. - * - * @param objectReplicationPolicyId the objectReplicationPolicyId value to - * set. - * @return the BlobItem object itself. - */ - public BlobItem setObjectReplicationPolicyId(String objectReplicationPolicyId) { - this.objectReplicationPolicyId = objectReplicationPolicyId; - return this; - } - - /** - * Get the objectReplicationRuleStatus property: The - * objectReplicationRuleStatus property. + * Get the objectReplicationSourcePolicies property: The + * objectReplicationSourcePolicies property. * - * @return the objectReplicationRuleStatus value. + * @return the objectReplicationSourcePolicies value. */ - public Map getObjectReplicationRuleStatus() { - return this.objectReplicationRuleStatus; + public List getObjectReplicationSourcePolicies() { + return this.objectReplicationSourcePolicies; } /** - * Set the objectReplicationRuleStatus property: The - * objectReplicationRuleStatus property. + * Set the objectReplicationSourcePolicies property: The + * objectReplicationSourcePolicies property. * - * @param objectReplicationRuleStatus the objectReplicationRuleStatus value + * @param objectReplicationSourcePolicies the objectReplicationSourcePolicies value * to set. * @return the BlobItem object itself. */ - public BlobItem setObjectReplicationRuleStatus(Map objectReplicationRuleStatus) { - this.objectReplicationRuleStatus = objectReplicationRuleStatus; + public BlobItem setObjectReplicationSourcePolicies(List objectReplicationSourcePolicies) { + this.objectReplicationSourcePolicies = objectReplicationSourcePolicies; return this; } diff --git a/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/models/BlobItemProperties.java b/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/models/BlobItemProperties.java index fedca0cb3a09..877ca109e249 100644 --- a/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/models/BlobItemProperties.java +++ b/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/models/BlobItemProperties.java @@ -212,13 +212,6 @@ public final class BlobItemProperties { @JsonProperty(value = "AccessTierChangeTime") private OffsetDateTime accessTierChangeTime; - // TODO: (rickle-msft) uncomment when these are returned on lists. - /* - private Map objectReplicationSourcePolicies; - - private String objectReplicationDestinationPolicyId; - */ - /* * The tagCount property. */ diff --git a/sdk/storage/azure-storage-blob/src/test/java/com/azure/storage/blob/ContainerAPITest.groovy b/sdk/storage/azure-storage-blob/src/test/java/com/azure/storage/blob/ContainerAPITest.groovy index 3bd7fd98bb06..ca0004a8bdc2 100644 --- a/sdk/storage/azure-storage-blob/src/test/java/com/azure/storage/blob/ContainerAPITest.groovy +++ b/sdk/storage/azure-storage-blob/src/test/java/com/azure/storage/blob/ContainerAPITest.groovy @@ -20,12 +20,15 @@ import com.azure.storage.blob.models.CustomerProvidedKey import com.azure.storage.blob.models.LeaseStateType import com.azure.storage.blob.models.LeaseStatusType import com.azure.storage.blob.models.ListBlobsOptions +import com.azure.storage.blob.models.ObjectReplicationPolicy +import com.azure.storage.blob.models.ObjectReplicationStatus import com.azure.storage.blob.options.PageBlobCreateOptions import com.azure.storage.blob.models.PublicAccessType import com.azure.storage.blob.specialized.AppendBlobClient import com.azure.storage.blob.specialized.BlobClientBase import com.azure.storage.common.Utility import reactor.test.StepVerifier +import spock.lang.Requires import spock.lang.Unroll import java.time.Duration @@ -983,6 +986,50 @@ class ContainerAPITest extends APISpec { notThrown(Exception) } + /* + This test requires two accounts that are configured in a very specific way. It is not feasible to setup that + relationship programmatically, so we have recorded a successful interaction and only test recordings. + */ + @Requires( {playbackMode()}) + def "List blobs flat ORS"() { + setup: + def sourceContainer = primaryBlobServiceClient.getBlobContainerClient("test1") + def destContainer = alternateBlobServiceClient.getBlobContainerClient("test2") + + when: + def sourceBlobs = sourceContainer.listBlobs().stream().collect(Collectors.toList()) + def destBlobs = destContainer.listBlobs().stream().collect(Collectors.toList()) + + then: + int i = 0 + for (def blob : sourceBlobs) { + if (i == 1) { + assert blob.getObjectReplicationSourcePolicies() == null + } else { + assert validateOR(blob.getObjectReplicationSourcePolicies(), "fd2da1b9-56f5-45ff-9eb6-310e6dfc2c80", "105f9aad-f39b-4064-8e47-ccd7937295ca") + } + i++ + } + + /* Service specifies no ors metadata on the dest blobs. */ + for (def blob : destBlobs) { + assert blob.getObjectReplicationSourcePolicies() == null + } + } + + def validateOR(List policies, String policyId, String ruleId) { + return policies.stream() + .filter({ policy -> policyId.equals(policy.getPolicyId()) }) + .findFirst() + .get() + .getRules() + .stream() + .filter({ rule -> ruleId.equals(rule.getRuleId()) }) + .findFirst() + .get() + .getStatus() == ObjectReplicationStatus.COMPLETE + } + def "List blobs hierarchy"() { setup: def name = generateBlobName() @@ -1226,6 +1273,37 @@ class ContainerAPITest extends APISpec { secondPage.getContinuationToken() == null } + /* + This test requires two accounts that are configured in a very specific way. It is not feasible to setup that + relationship programmatically, so we have recorded a successful interaction and only test recordings. + */ + @Requires( {playbackMode()}) + def "List blobs hier ORS"() { + setup: + def sourceContainer = primaryBlobServiceClient.getBlobContainerClient("test1") + def destContainer = alternateBlobServiceClient.getBlobContainerClient("test2") + + when: + def sourceBlobs = sourceContainer.listBlobsByHierarchy("/").stream().collect(Collectors.toList()) + def destBlobs = destContainer.listBlobsByHierarchy("/").stream().collect(Collectors.toList()) + + then: + int i = 0 + for (def blob : sourceBlobs) { + if (i == 1) { + assert blob.getObjectReplicationSourcePolicies() == null + } else { + assert validateOR(blob.getObjectReplicationSourcePolicies(), "fd2da1b9-56f5-45ff-9eb6-310e6dfc2c80", "105f9aad-f39b-4064-8e47-ccd7937295ca") + } + i++ + } + + /* Service specifies no ors metadata on the dest blobs. */ + for (def blob : destBlobs) { + assert blob.getObjectReplicationSourcePolicies() == null + } + } + def "List blobs flat simple"() { setup: "Create 10 page blobs in the container" def NUM_BLOBS = 10 diff --git a/sdk/storage/azure-storage-blob/src/test/resources/session-records/ContainerAPITestlistblobsflators.json b/sdk/storage/azure-storage-blob/src/test/resources/session-records/ContainerAPITestlistblobsflators.json new file mode 100644 index 000000000000..9803f8fd4bab --- /dev/null +++ b/sdk/storage/azure-storage-blob/src/test/resources/session-records/ContainerAPITestlistblobsflators.json @@ -0,0 +1,107 @@ +{ + "networkCallRecords" : [ { + "Method" : "PUT", + "Uri" : "https://REDACTED.blob.core.windows.net/jtclistblobsflators0containerapitestlistblobsflatorsa59637709?restype=container", + "Headers" : { + "x-ms-version" : "2019-12-12", + "User-Agent" : "azsdk-java-azure-storage-blob/12.8.0-beta.2 (11.0.7; Windows 10; 10.0)", + "x-ms-client-request-id" : "d07024dd-1f41-4c49-9df9-1b1b39c9fdc6" + }, + "Response" : { + "x-ms-version" : "2019-12-12", + "Server" : "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0", + "ETag" : "0x8D82784272BC411", + "Last-Modified" : "Mon, 13 Jul 2020 23:26:21 GMT", + "retry-after" : "0", + "Content-Length" : "0", + "StatusCode" : "201", + "x-ms-request-id" : "dadc1a5e-601e-005d-3e6d-594724000000", + "Date" : "Mon, 13 Jul 2020 23:26:21 GMT", + "x-ms-client-request-id" : "d07024dd-1f41-4c49-9df9-1b1b39c9fdc6" + }, + "Exception" : null + }, { + "Method" : "GET", + "Uri" : "https://REDACTED.blob.core.windows.net/test1?restype=container&comp=list", + "Headers" : { + "x-ms-version" : "2019-12-12", + "User-Agent" : "azsdk-java-azure-storage-blob/12.8.0-beta.2 (11.0.7; Windows 10; 10.0)", + "x-ms-client-request-id" : "2407cee4-8724-45f8-9035-566088ae4def" + }, + "Response" : { + "Transfer-Encoding" : "chunked", + "x-ms-version" : "2019-12-12", + "Server" : "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0", + "retry-after" : "0", + "StatusCode" : "200", + "x-ms-request-id" : "a7f8263e-301e-007f-386d-59823b000000", + "Body" : "bla.txt2020-05-18T09:53:04.5502688ZtrueMon, 18 May 2020 09:53:04 GMTMon, 18 May 2020 09:53:04 GMT0x8D7FB114288CFC90application/octet-stream1B2M2Y8AsgTpgAmY7PhCfg==BlockBlobHottrueunlockedavailabletruecompleteempty.txt2020-03-19T18:21:09.4878662ZtrueThu, 19 Mar 2020 18:21:09 GMTThu, 19 Mar 2020 18:21:09 GMT0x8D7CC324C3049C60text/plain1B2M2Y8AsgTpgAmY7PhCfg==BlockBlobHottrueunlockedavailabletrueempty2.txt2020-03-19T18:36:03.0870309ZtrueThu, 19 Mar 2020 18:36:03 GMTThu, 19 Mar 2020 18:36:03 GMT0x8D7CC3460D0B3250text/plain1B2M2Y8AsgTpgAmY7PhCfg==BlockBlobHottrueunlockedavailabletruecompletejavablobgetpropertiesors2blobapitestgetpropertiesors57d93407b2020-04-21T21:14:42.3905881ZtrueTue, 21 Apr 2020 21:14:42 GMTTue, 21 Apr 2020 21:14:42 GMT0x8D7E6390264E6597application/octet-streamwh+Wm18D0z1D4E+PE252gg==BlockBlobHottrueunlockedavailabletruecompletejavablobgetpropertiesors2blobapitestgetpropertiesorsa300090272020-04-21T21:12:08.2403198ZtrueTue, 21 Apr 2020 21:12:08 GMTTue, 21 Apr 2020 21:12:08 GMT0x8D7E638A68348677application/octet-streamwh+Wm18D0z1D4E+PE252gg==BlockBlobHottrueunlockedavailabletruecompletenetgetpropertiesors2blobapitestgetpropertiesors2020-04-23T22:04:56.9882747ZtrueThu, 23 Apr 2020 22:04:56 GMTThu, 23 Apr 2020 22:04:56 GMT0x8D7E7D25C0F807B1024application/octet-streameyObQAWrMwC74Eh3CuRM2g==BlockBlobHottrueunlockedavailabletruecompletepythonorstest2020-05-19T08:19:55.0147367ZtrueTue, 19 May 2020 08:19:55 GMTTue, 19 May 2020 08:19:55 GMT0x8D7FBCD695347271024application/octet-streameyObQAWrMwC74Eh3CuRM2g==BlockBlobHottrueunlockedavailabletruecompletetest-blob-19f4217a-3814-436b-a70d-3be4b0c604e22020-04-15T09:03:31.2849799ZtrueWed, 15 Apr 2020 09:03:31 GMTWed, 15 Apr 2020 09:03:31 GMT0x8D7E11BDEB2C86B1024application/octet-streamsVLUBL9mQUUJgLz3ayOPnw==BlockBlobHottrueunlockedavailabletruecomplete", + "Date" : "Mon, 13 Jul 2020 23:26:21 GMT", + "x-ms-client-request-id" : "2407cee4-8724-45f8-9035-566088ae4def", + "Content-Type" : "application/xml" + }, + "Exception" : null + }, { + "Method" : "GET", + "Uri" : "https://REDACTED.blob.core.windows.net/test2?restype=container&comp=list", + "Headers" : { + "x-ms-version" : "2019-12-12", + "User-Agent" : "azsdk-java-azure-storage-blob/12.8.0-beta.2 (11.0.7; Windows 10; 10.0)", + "x-ms-client-request-id" : "5153d2bc-ef9a-469c-98b8-4245ff663d0e" + }, + "Response" : { + "Transfer-Encoding" : "chunked", + "x-ms-version" : "2019-12-12", + "Server" : "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0", + "retry-after" : "0", + "StatusCode" : "200", + "x-ms-request-id" : "6d9b466f-a01e-0084-4f6d-59a8c3000000", + "Body" : "bla.txtMon, 18 May 2020 09:55:04 GMTMon, 18 May 2020 09:55:04 GMT0x8D7FB118A463E240application/octet-streamAAAAAAAAAAA=1B2M2Y8AsgTpgAmY7PhCfg==BlockBlobHottrueunlockedavailabletrueempty2.txtThu, 19 Mar 2020 18:37:06 GMTThu, 19 Mar 2020 18:37:06 GMT0x8D7CC3486E43BC60text/plainAAAAAAAAAAA=1B2M2Y8AsgTpgAmY7PhCfg==BlockBlobHottrueunlockedavailabletruejavablobgetpropertiesors2blobapitestgetpropertiesors57d93407b2020-04-21T21:15:42.8141548ZtrueTue, 21 Apr 2020 21:15:42 GMTTue, 21 Apr 2020 21:15:42 GMT0x8D7E6392667E1617application/octet-stream6RYQPwaVsyQ=wh+Wm18D0z1D4E+PE252gg==BlockBlobHottrueunlockedavailabletruejavablobgetpropertiesors2blobapitestgetpropertiesorsa30009027Tue, 21 Apr 2020 21:13:08 GMTTue, 21 Apr 2020 21:13:08 GMT0x8D7E638CA717B137application/octet-stream6RYQPwaVsyQ=wh+Wm18D0z1D4E+PE252gg==BlockBlobHottrueunlockedavailabletruenetgetpropertiesors2blobapitestgetpropertiesorsThu, 23 Apr 2020 22:06:35 GMTThu, 23 Apr 2020 22:06:35 GMT0x8D7E7D296E942361024application/octet-streammvPi4gbJB9o=eyObQAWrMwC74Eh3CuRM2g==BlockBlobHottrueunlockedavailabletruepythonorstest2020-05-19T08:22:07.2080089ZtrueTue, 19 May 2020 08:22:07 GMTTue, 19 May 2020 08:22:07 GMT0x8D7FBCDB81E37C01024application/octet-streamBlockBlobHottrueunlockedavailabletruetest-blob-19f4217a-3814-436b-a70d-3be4b0c604e22020-04-15T09:05:43.9282492ZtrueWed, 15 Apr 2020 09:05:43 GMTWed, 15 Apr 2020 09:05:43 GMT0x8D7E11C2DC2456B1024application/octet-stream94WCAc7HFGQ=sVLUBL9mQUUJgLz3ayOPnw==BlockBlobHottrueunlockedavailabletrue", + "Date" : "Mon, 13 Jul 2020 23:26:22 GMT", + "x-ms-client-request-id" : "5153d2bc-ef9a-469c-98b8-4245ff663d0e", + "Content-Type" : "application/xml" + }, + "Exception" : null + }, { + "Method" : "GET", + "Uri" : "https://REDACTED.blob.core.windows.net?prefix=jtclistblobsflators&comp=list", + "Headers" : { + "x-ms-version" : "2019-12-12", + "User-Agent" : "azsdk-java-azure-storage-blob/12.8.0-beta.2 (11.0.7; Windows 10; 10.0)", + "x-ms-client-request-id" : "e9a2dc50-309a-41e3-8eff-3fb70f3ca180" + }, + "Response" : { + "Transfer-Encoding" : "chunked", + "x-ms-version" : "2019-12-12", + "Server" : "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0", + "retry-after" : "0", + "StatusCode" : "200", + "x-ms-request-id" : "86a74d5c-d01e-0067-3f6d-595d5c000000", + "Body" : "jtclistblobsflatorsjtclistblobsflators0containerapitestlistblobsflatorsa59637709Mon, 13 Jul 2020 23:26:21 GMT\"0x8D82784272BC411\"unlockedavailable$account-encryption-keyfalsefalsefalse", + "Date" : "Mon, 13 Jul 2020 23:26:23 GMT", + "x-ms-client-request-id" : "e9a2dc50-309a-41e3-8eff-3fb70f3ca180", + "Content-Type" : "application/xml" + }, + "Exception" : null + }, { + "Method" : "DELETE", + "Uri" : "https://REDACTED.blob.core.windows.net/jtclistblobsflators0containerapitestlistblobsflatorsa59637709?restype=container", + "Headers" : { + "x-ms-version" : "2019-12-12", + "User-Agent" : "azsdk-java-azure-storage-blob/12.8.0-beta.2 (11.0.7; Windows 10; 10.0)", + "x-ms-client-request-id" : "21e86bfe-fcb7-48ec-ad5c-433a92c2a17d" + }, + "Response" : { + "x-ms-version" : "2019-12-12", + "Server" : "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0", + "retry-after" : "0", + "Content-Length" : "0", + "StatusCode" : "202", + "x-ms-request-id" : "ea0167d8-001e-0039-196d-59b6bc000000", + "Date" : "Mon, 13 Jul 2020 23:26:24 GMT", + "x-ms-client-request-id" : "21e86bfe-fcb7-48ec-ad5c-433a92c2a17d" + }, + "Exception" : null + } ], + "variables" : [ "jtclistblobsflators0containerapitestlistblobsflatorsa59637709" ] +} \ No newline at end of file diff --git a/sdk/storage/azure-storage-blob/src/test/resources/session-records/ContainerAPITestlistblobshierors.json b/sdk/storage/azure-storage-blob/src/test/resources/session-records/ContainerAPITestlistblobshierors.json new file mode 100644 index 000000000000..9ec76ca0880e --- /dev/null +++ b/sdk/storage/azure-storage-blob/src/test/resources/session-records/ContainerAPITestlistblobshierors.json @@ -0,0 +1,107 @@ +{ + "networkCallRecords" : [ { + "Method" : "PUT", + "Uri" : "https://REDACTED.blob.core.windows.net/jtclistblobshierors0containerapitestlistblobshierors3d8486925?restype=container", + "Headers" : { + "x-ms-version" : "2019-12-12", + "User-Agent" : "azsdk-java-azure-storage-blob/12.8.0-beta.2 (11.0.7; Windows 10; 10.0)", + "x-ms-client-request-id" : "6440d54d-c90b-4c72-85a6-44d65ec36c9b" + }, + "Response" : { + "x-ms-version" : "2019-12-12", + "Server" : "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0", + "ETag" : "0x8D8278470455EF4", + "Last-Modified" : "Mon, 13 Jul 2020 23:28:24 GMT", + "retry-after" : "0", + "Content-Length" : "0", + "StatusCode" : "201", + "x-ms-request-id" : "4929ce18-701e-001c-236d-591fc0000000", + "Date" : "Mon, 13 Jul 2020 23:28:24 GMT", + "x-ms-client-request-id" : "6440d54d-c90b-4c72-85a6-44d65ec36c9b" + }, + "Exception" : null + }, { + "Method" : "GET", + "Uri" : "https://REDACTED.blob.core.windows.net/test1?prefix=/&delimiter=/&restype=container&comp=list", + "Headers" : { + "x-ms-version" : "2019-12-12", + "User-Agent" : "azsdk-java-azure-storage-blob/12.8.0-beta.2 (11.0.7; Windows 10; 10.0)", + "x-ms-client-request-id" : "179bfd9c-1189-48a6-93e5-8694a3ca545e" + }, + "Response" : { + "Transfer-Encoding" : "chunked", + "x-ms-version" : "2019-12-12", + "Server" : "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0", + "retry-after" : "0", + "StatusCode" : "200", + "x-ms-request-id" : "210c151d-301e-0022-726d-5988bf000000", + "Body" : "//", + "Date" : "Mon, 13 Jul 2020 23:28:24 GMT", + "x-ms-client-request-id" : "179bfd9c-1189-48a6-93e5-8694a3ca545e", + "Content-Type" : "application/xml" + }, + "Exception" : null + }, { + "Method" : "GET", + "Uri" : "https://REDACTED.blob.core.windows.net/test2?prefix=/&delimiter=/&restype=container&comp=list", + "Headers" : { + "x-ms-version" : "2019-12-12", + "User-Agent" : "azsdk-java-azure-storage-blob/12.8.0-beta.2 (11.0.7; Windows 10; 10.0)", + "x-ms-client-request-id" : "058cfb63-f0cb-432e-a3d9-eb41e2bab6a8" + }, + "Response" : { + "Transfer-Encoding" : "chunked", + "x-ms-version" : "2019-12-12", + "Server" : "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0", + "retry-after" : "0", + "StatusCode" : "200", + "x-ms-request-id" : "1e1044d0-d01e-0018-5d6d-5905a5000000", + "Body" : "//", + "Date" : "Mon, 13 Jul 2020 23:28:25 GMT", + "x-ms-client-request-id" : "058cfb63-f0cb-432e-a3d9-eb41e2bab6a8", + "Content-Type" : "application/xml" + }, + "Exception" : null + }, { + "Method" : "GET", + "Uri" : "https://REDACTED.blob.core.windows.net?prefix=jtclistblobshierors&comp=list", + "Headers" : { + "x-ms-version" : "2019-12-12", + "User-Agent" : "azsdk-java-azure-storage-blob/12.8.0-beta.2 (11.0.7; Windows 10; 10.0)", + "x-ms-client-request-id" : "d278b929-6978-4505-97ec-b3f060894a90" + }, + "Response" : { + "Transfer-Encoding" : "chunked", + "x-ms-version" : "2019-12-12", + "Server" : "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0", + "retry-after" : "0", + "StatusCode" : "200", + "x-ms-request-id" : "5c1900e6-201e-002e-656d-591fb7000000", + "Body" : "jtclistblobshierorsjtclistblobshierors0containerapitestlistblobshierors3d8486925Mon, 13 Jul 2020 23:28:24 GMT\"0x8D8278470455EF4\"unlockedavailable$account-encryption-keyfalsefalsefalse", + "Date" : "Mon, 13 Jul 2020 23:28:26 GMT", + "x-ms-client-request-id" : "d278b929-6978-4505-97ec-b3f060894a90", + "Content-Type" : "application/xml" + }, + "Exception" : null + }, { + "Method" : "DELETE", + "Uri" : "https://REDACTED.blob.core.windows.net/jtclistblobshierors0containerapitestlistblobshierors3d8486925?restype=container", + "Headers" : { + "x-ms-version" : "2019-12-12", + "User-Agent" : "azsdk-java-azure-storage-blob/12.8.0-beta.2 (11.0.7; Windows 10; 10.0)", + "x-ms-client-request-id" : "97729b9b-8a2a-481e-848e-0bd5cf61b945" + }, + "Response" : { + "x-ms-version" : "2019-12-12", + "Server" : "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0", + "retry-after" : "0", + "Content-Length" : "0", + "StatusCode" : "202", + "x-ms-request-id" : "2458a4d8-f01e-0070-7d6d-59f457000000", + "Date" : "Mon, 13 Jul 2020 23:28:26 GMT", + "x-ms-client-request-id" : "97729b9b-8a2a-481e-848e-0bd5cf61b945" + }, + "Exception" : null + } ], + "variables" : [ "jtclistblobshierors0containerapitestlistblobshierors3d8486925" ] +} \ No newline at end of file