diff --git a/sdk/storage/azure-storage-file-datalake/CHANGELOG.md b/sdk/storage/azure-storage-file-datalake/CHANGELOG.md index a0bbdb0ac76d..7ba66710578c 100644 --- a/sdk/storage/azure-storage-file-datalake/CHANGELOG.md +++ b/sdk/storage/azure-storage-file-datalake/CHANGELOG.md @@ -4,6 +4,7 @@ - Added SAS generation methods on clients to improve discoverability and convenience of sas. - Mapped StorageErrorException and BlobStorageException to DataLakeStorageException. - Added support for exists method on FileClients and DirectoryClients +- Added support for no overwrite by default on min create method on FileClients and DirectoryClients and flush method on FileClients ## Version 12.0.0-beta.7 (2019-12-04) This package's diff --git a/sdk/storage/azure-storage-file-datalake/src/main/java/com/azure/storage/file/datalake/DataLakeFileAsyncClient.java b/sdk/storage/azure-storage-file-datalake/src/main/java/com/azure/storage/file/datalake/DataLakeFileAsyncClient.java index bf6b985a94e7..475819fffccf 100644 --- a/sdk/storage/azure-storage-file-datalake/src/main/java/com/azure/storage/file/datalake/DataLakeFileAsyncClient.java +++ b/sdk/storage/azure-storage-file-datalake/src/main/java/com/azure/storage/file/datalake/DataLakeFileAsyncClient.java @@ -12,6 +12,7 @@ import com.azure.core.util.logging.ClientLogger; import com.azure.storage.blob.BlobContainerAsyncClient; import com.azure.storage.blob.specialized.BlockBlobAsyncClient; +import com.azure.storage.common.implementation.Constants; import com.azure.storage.file.datalake.implementation.models.LeaseAccessConditions; import com.azure.storage.file.datalake.implementation.models.ModifiedAccessConditions; import com.azure.storage.file.datalake.implementation.models.PathResourceType; @@ -217,6 +218,7 @@ Mono> appendWithResponse(Flux data, long fileOffset, /** * Flushes (writes) data previously appended to the file through a call to append. * The previously uploaded data must be contiguous. + *

By default this method will not overwrite existing data.

* *

Code Samples>Code Samples

* @@ -232,7 +234,37 @@ Mono> appendWithResponse(Flux data, long fileOffset, */ public Mono flush(long position) { try { - return flushWithResponse(position, false, false, null, null).flatMap(FluxUtil::toMono); + return flush(position, false); + } catch (RuntimeException ex) { + return monoError(logger, ex); + } + } + + /** + * Flushes (writes) data previously appended to the file through a call to append. + * The previously uploaded data must be contiguous. + * + *

Code Samples>Code Samples

+ * + * {@codesnippet com.azure.storage.file.datalake.DataLakeFileAsyncClient.flush#long-boolean} + * + *

For more information, see the + * Azure + * Docs

+ * + * @param position The length of the file after all data has been written. + * @param overwrite Whether or not to overwrite, should data exist on the file. + * + * @return A reactive response containing the information of the created resource. + */ + public Mono flush(long position, boolean overwrite) { + try { + DataLakeRequestConditions requestConditions = null; + if (!overwrite) { + requestConditions = new DataLakeRequestConditions() + .setIfNoneMatch(Constants.HeaderConstants.ETAG_WILDCARD); + } + return flushWithResponse(position, false, false, null, requestConditions).flatMap(FluxUtil::toMono); } catch (RuntimeException ex) { return monoError(logger, ex); } diff --git a/sdk/storage/azure-storage-file-datalake/src/main/java/com/azure/storage/file/datalake/DataLakeFileClient.java b/sdk/storage/azure-storage-file-datalake/src/main/java/com/azure/storage/file/datalake/DataLakeFileClient.java index 4452f5c9e439..df29def80f17 100644 --- a/sdk/storage/azure-storage-file-datalake/src/main/java/com/azure/storage/file/datalake/DataLakeFileClient.java +++ b/sdk/storage/azure-storage-file-datalake/src/main/java/com/azure/storage/file/datalake/DataLakeFileClient.java @@ -11,6 +11,7 @@ import com.azure.storage.blob.models.BlobDownloadResponse; import com.azure.storage.blob.specialized.BlockBlobClient; import com.azure.storage.common.Utility; +import com.azure.storage.common.implementation.Constants; import com.azure.storage.common.implementation.StorageImplUtils; import com.azure.storage.file.datalake.implementation.util.DataLakeImplUtils; import com.azure.storage.file.datalake.models.DataLakeRequestConditions; @@ -188,6 +189,7 @@ public Response appendWithResponse(InputStream data, long fileOffset, long /** * Flushes (writes) data previously appended to the file through a call to append. * The previously uploaded data must be contiguous. + *

By default this method will not overwrite existing data.

* *

Code Samples>Code Samples

* @@ -202,7 +204,32 @@ public Response appendWithResponse(InputStream data, long fileOffset, long * @return Information about the created resource. */ public PathInfo flush(long position) { - return flushWithResponse(position, false, false, null, null, null, Context.NONE).getValue(); + return flush(position, false); + } + + /** + * Flushes (writes) data previously appended to the file through a call to append. + * The previously uploaded data must be contiguous. + * + *

Code Samples>Code Samples

+ * + * {@codesnippet com.azure.storage.file.datalake.DataLakeFileClient.flush#long-boolean} + * + *

For more information, see the + * Azure + * Docs

+ * + * @param position The length of the file after all data has been written. + * @param overwrite Whether or not to overwrite, should data exist on the file. + * + * @return Information about the created resource. + */ + public PathInfo flush(long position, boolean overwrite) { + DataLakeRequestConditions requestConditions = new DataLakeRequestConditions(); + if (!overwrite) { + requestConditions = new DataLakeRequestConditions().setIfNoneMatch(Constants.HeaderConstants.ETAG_WILDCARD); + } + return flushWithResponse(position, false, false, null, requestConditions, null, Context.NONE).getValue(); } /** diff --git a/sdk/storage/azure-storage-file-datalake/src/main/java/com/azure/storage/file/datalake/DataLakePathAsyncClient.java b/sdk/storage/azure-storage-file-datalake/src/main/java/com/azure/storage/file/datalake/DataLakePathAsyncClient.java index 424477b18b62..e711ab51f185 100644 --- a/sdk/storage/azure-storage-file-datalake/src/main/java/com/azure/storage/file/datalake/DataLakePathAsyncClient.java +++ b/sdk/storage/azure-storage-file-datalake/src/main/java/com/azure/storage/file/datalake/DataLakePathAsyncClient.java @@ -13,11 +13,11 @@ import com.azure.storage.blob.BlobContainerAsyncClient; import com.azure.storage.blob.BlobServiceVersion; import com.azure.storage.blob.BlobUrlParts; -import com.azure.storage.blob.models.BlobStorageException; import com.azure.storage.blob.specialized.BlockBlobAsyncClient; import com.azure.storage.blob.specialized.SpecializedBlobClientBuilder; import com.azure.storage.common.StorageSharedKeyCredential; import com.azure.storage.common.Utility; +import com.azure.storage.common.implementation.Constants; import com.azure.storage.file.datalake.implementation.DataLakeStorageClientBuilder; import com.azure.storage.file.datalake.implementation.DataLakeStorageClientImpl; import com.azure.storage.file.datalake.implementation.models.LeaseAccessConditions; @@ -194,7 +194,7 @@ public DataLakeServiceVersion getServiceVersion() { } /** - * Creates a resource. + * Creates a resource. By default this method will not overwrite an existing path. * *

Code Samples

* @@ -208,7 +208,34 @@ public DataLakeServiceVersion getServiceVersion() { */ public Mono create() { try { - return createWithResponse(null, null, null, null, null).flatMap(FluxUtil::toMono); + return create(false); + } catch (RuntimeException ex) { + return monoError(logger, ex); + } + } + + /** + * Creates a resource. + * + *

Code Samples

+ * + * {@codesnippet com.azure.storage.file.datalake.DataLakePathAsyncClient.create#boolean} + * + *

For more information see the + * Azure + * Docs

+ * + * @param overwrite Whether or not to overwrite, should data exist on the file. + * + * @return A reactive response containing information about the created resource. + */ + public Mono create(boolean overwrite) { + try { + DataLakeRequestConditions requestConditions = new DataLakeRequestConditions(); + if (!overwrite) { + requestConditions.setIfNoneMatch(Constants.HeaderConstants.ETAG_WILDCARD); + } + return createWithResponse(null, null, null, null, requestConditions).flatMap(FluxUtil::toMono); } catch (RuntimeException ex) { return monoError(logger, ex); } @@ -326,7 +353,7 @@ public Mono> setMetadataWithResponse(Map metadata try { return this.blockBlobAsyncClient.setMetadataWithResponse(metadata, Transforms.toBlobRequestConditions(requestConditions)) - .onErrorMap(ex -> DataLakeImplUtils.transformBlobStorageException((BlobStorageException) ex)); + .onErrorMap(DataLakeImplUtils::transformBlobStorageException); } catch (RuntimeException ex) { return monoError(logger, ex); } @@ -374,7 +401,7 @@ public Mono> setHttpHeadersWithResponse(PathHttpHeaders headers, try { return this.blockBlobAsyncClient.setHttpHeadersWithResponse(Transforms.toBlobHttpHeaders(headers), Transforms.toBlobRequestConditions(requestConditions)) - .onErrorMap(ex -> DataLakeImplUtils.transformBlobStorageException((BlobStorageException) ex)); + .onErrorMap(DataLakeImplUtils::transformBlobStorageException); } catch (RuntimeException ex) { return monoError(logger, ex); } @@ -416,7 +443,7 @@ public Mono getProperties() { public Mono> getPropertiesWithResponse(DataLakeRequestConditions requestConditions) { try { return blockBlobAsyncClient.getPropertiesWithResponse(Transforms.toBlobRequestConditions(requestConditions)) - .onErrorMap(ex -> DataLakeImplUtils.transformBlobStorageException((BlobStorageException) ex)) + .onErrorMap(DataLakeImplUtils::transformBlobStorageException) .map(response -> new SimpleResponse<>(response, Transforms.toPathProperties(response.getValue()))); } catch (RuntimeException ex) { return monoError(logger, ex); @@ -451,8 +478,8 @@ public Mono exists() { */ public Mono> existsWithResponse() { try { - // TODO (gapra) : Once datalake error mapping is merged, add onErrorMap - return blockBlobAsyncClient.existsWithResponse(); + return blockBlobAsyncClient.existsWithResponse() + .onErrorMap(DataLakeImplUtils::transformBlobStorageException); } catch (RuntimeException ex) { return monoError(logger, ex); } diff --git a/sdk/storage/azure-storage-file-datalake/src/main/java/com/azure/storage/file/datalake/DataLakePathClient.java b/sdk/storage/azure-storage-file-datalake/src/main/java/com/azure/storage/file/datalake/DataLakePathClient.java index 6fa13a5db864..1c1bbe445b92 100644 --- a/sdk/storage/azure-storage-file-datalake/src/main/java/com/azure/storage/file/datalake/DataLakePathClient.java +++ b/sdk/storage/azure-storage-file-datalake/src/main/java/com/azure/storage/file/datalake/DataLakePathClient.java @@ -11,6 +11,7 @@ import com.azure.storage.blob.models.BlobProperties; import com.azure.storage.blob.specialized.BlockBlobClient; import com.azure.storage.common.StorageSharedKeyCredential; +import com.azure.storage.common.implementation.Constants; import com.azure.storage.common.implementation.StorageImplUtils; import com.azure.storage.file.datalake.implementation.models.LeaseAccessConditions; import com.azure.storage.file.datalake.implementation.models.ModifiedAccessConditions; @@ -111,7 +112,7 @@ public DataLakeServiceVersion getServiceVersion() { } /** - * Creates a resource. + * Creates a resource. By default this method will not overwrite an existing path. * *

Code Samples

* @@ -124,7 +125,30 @@ public DataLakeServiceVersion getServiceVersion() { * @return Information about the created resource. */ public PathInfo create() { - return createWithResponse(null, null, null, null, null, null, Context.NONE).getValue(); + return create(false); + } + + /** + * Creates a resource. + * + *

Code Samples

+ * + * {@codesnippet com.azure.storage.file.datalake.DataLakePathClient.create#boolean} + * + *

For more information see the + * Azure + * Docs

+ * + * @param overwrite Whether or not to overwrite, should data exist on the path. + * + * @return Information about the created resource. + */ + public PathInfo create(boolean overwrite) { + DataLakeRequestConditions requestConditions = new DataLakeRequestConditions(); + if (!overwrite) { + requestConditions.setIfNoneMatch(Constants.HeaderConstants.ETAG_WILDCARD); + } + return createWithResponse(null, null, null, null, requestConditions, null, Context.NONE).getValue(); } /** @@ -435,8 +459,8 @@ public Boolean exists() { * @return true if the path exists, false if it doesn't */ public Response existsWithResponse(Duration timeout, Context context) { - // TODO (gapra) : Once error mapping is merged add error mapping - return blockBlobClient.existsWithResponse(timeout, context); + return DataLakeImplUtils.returnOrConvertException(() -> + blockBlobClient.existsWithResponse(timeout, context), logger); } /** diff --git a/sdk/storage/azure-storage-file-datalake/src/samples/java/com/azure/storage/file/datalake/DataLakeFileAsyncClientJavaDocSamples.java b/sdk/storage/azure-storage-file-datalake/src/samples/java/com/azure/storage/file/datalake/DataLakeFileAsyncClientJavaDocSamples.java index 7477bd2b362d..7355e3d629f4 100644 --- a/sdk/storage/azure-storage-file-datalake/src/samples/java/com/azure/storage/file/datalake/DataLakeFileAsyncClientJavaDocSamples.java +++ b/sdk/storage/azure-storage-file-datalake/src/samples/java/com/azure/storage/file/datalake/DataLakeFileAsyncClientJavaDocSamples.java @@ -136,6 +136,12 @@ public void flushCodeSnippets() { System.out.println("Flush data completed")); // END: com.azure.storage.file.datalake.DataLakeFileAsyncClient.flush#long + // BEGIN: com.azure.storage.file.datalake.DataLakeFileAsyncClient.flush#long-boolean + boolean overwrite = true; + client.flush(position, overwrite).subscribe(response -> + System.out.println("Flush data completed")); + // END: com.azure.storage.file.datalake.DataLakeFileAsyncClient.flush#long-boolean + // BEGIN: com.azure.storage.file.datalake.DataLakeFileAsyncClient.flushWithResponse#long-boolean-boolean-PathHttpHeaders-DataLakeRequestConditions FileRange range = new FileRange(1024, 2048L); DownloadRetryOptions options = new DownloadRetryOptions().setMaxRetryRequests(5); diff --git a/sdk/storage/azure-storage-file-datalake/src/samples/java/com/azure/storage/file/datalake/DataLakeFileClientJavaDocSamples.java b/sdk/storage/azure-storage-file-datalake/src/samples/java/com/azure/storage/file/datalake/DataLakeFileClientJavaDocSamples.java index d40739b90857..6b04c75e00b3 100644 --- a/sdk/storage/azure-storage-file-datalake/src/samples/java/com/azure/storage/file/datalake/DataLakeFileClientJavaDocSamples.java +++ b/sdk/storage/azure-storage-file-datalake/src/samples/java/com/azure/storage/file/datalake/DataLakeFileClientJavaDocSamples.java @@ -128,6 +128,12 @@ public void flushCodeSnippets() { System.out.println("Flush data completed"); // END: com.azure.storage.file.datalake.DataLakeFileClient.flush#long + // BEGIN: com.azure.storage.file.datalake.DataLakeFileClient.flush#long-boolean + boolean overwrite = true; + client.flush(position, overwrite); + System.out.println("Flush data completed"); + // END: com.azure.storage.file.datalake.DataLakeFileClient.flush#long-boolean + // BEGIN: com.azure.storage.file.datalake.DataLakeFileClient.flushWithResponse#long-boolean-boolean-PathHttpHeaders-DataLakeRequestConditions-Duration-Context FileRange range = new FileRange(1024, 2048L); DownloadRetryOptions options = new DownloadRetryOptions().setMaxRetryRequests(5); diff --git a/sdk/storage/azure-storage-file-datalake/src/samples/java/com/azure/storage/file/datalake/PathAsyncClientJavaDocCodeSamples.java b/sdk/storage/azure-storage-file-datalake/src/samples/java/com/azure/storage/file/datalake/PathAsyncClientJavaDocCodeSamples.java index b8d89127f4cf..ea7213236d43 100644 --- a/sdk/storage/azure-storage-file-datalake/src/samples/java/com/azure/storage/file/datalake/PathAsyncClientJavaDocCodeSamples.java +++ b/sdk/storage/azure-storage-file-datalake/src/samples/java/com/azure/storage/file/datalake/PathAsyncClientJavaDocCodeSamples.java @@ -38,6 +38,12 @@ public void createCodeSnippets() { System.out.printf("Last Modified Time:%s", response.getLastModified())); // END: com.azure.storage.file.datalake.DataLakePathAsyncClient.create + // BEGIN: com.azure.storage.file.datalake.DataLakePathAsyncClient.create#boolean + boolean overwrite = true; + client.create(overwrite).subscribe(response -> + System.out.printf("Last Modified Time:%s", response.getLastModified())); + // END: com.azure.storage.file.datalake.DataLakePathAsyncClient.create#boolean + // BEGIN: com.azure.storage.file.datalake.DataLakePathAsyncClient.createWithResponse#String-String-PathHttpHeaders-Map-DataLakeRequestConditions PathHttpHeaders httpHeaders = new PathHttpHeaders() .setContentLanguage("en-US") diff --git a/sdk/storage/azure-storage-file-datalake/src/samples/java/com/azure/storage/file/datalake/PathClientJavaDocCodeSamples.java b/sdk/storage/azure-storage-file-datalake/src/samples/java/com/azure/storage/file/datalake/PathClientJavaDocCodeSamples.java index ffa4262566a2..98f6e9e067d7 100644 --- a/sdk/storage/azure-storage-file-datalake/src/samples/java/com/azure/storage/file/datalake/PathClientJavaDocCodeSamples.java +++ b/sdk/storage/azure-storage-file-datalake/src/samples/java/com/azure/storage/file/datalake/PathClientJavaDocCodeSamples.java @@ -49,6 +49,11 @@ public void createCodeSnippets() { System.out.printf("Last Modified Time:%s", client.create().getLastModified()); // END: com.azure.storage.file.datalake.DataLakePathClient.create + // BEGIN: com.azure.storage.file.datalake.DataLakePathClient.create#boolean + boolean overwrite = true; + System.out.printf("Last Modified Time:%s", client.create(true).getLastModified()); + // END: com.azure.storage.file.datalake.DataLakePathClient.create#boolean + // BEGIN: com.azure.storage.file.datalake.DataLakePathClient.createWithResponse#String-String-PathHttpHeaders-Map-DataLakeRequestConditions-Duration-Context PathHttpHeaders httpHeaders = new PathHttpHeaders() .setContentLanguage("en-US") diff --git a/sdk/storage/azure-storage-file-datalake/src/test/java/com/azure/storage/file/datalake/DirectoryAPITest.groovy b/sdk/storage/azure-storage-file-datalake/src/test/java/com/azure/storage/file/datalake/DirectoryAPITest.groovy index 28b5632cc38d..bbbaae7ad4fe 100644 --- a/sdk/storage/azure-storage-file-datalake/src/test/java/com/azure/storage/file/datalake/DirectoryAPITest.groovy +++ b/sdk/storage/azure-storage-file-datalake/src/test/java/com/azure/storage/file/datalake/DirectoryAPITest.groovy @@ -6,7 +6,6 @@ import com.azure.identity.DefaultAzureCredentialBuilder import com.azure.storage.blob.BlobUrlParts import com.azure.storage.blob.models.BlobErrorCode -import com.azure.storage.file.datalake.implementation.models.StorageErrorException import com.azure.storage.file.datalake.models.* import spock.lang.Unroll @@ -36,7 +35,7 @@ class DirectoryAPITest extends APISpec { dc.create() then: - notThrown(StorageErrorException) + notThrown(DataLakeStorageException) } def "Create defaults"() { @@ -63,6 +62,18 @@ class DirectoryAPITest extends APISpec { thrown(DataLakeStorageException) } + def "Create overwrite"() { + when: + dc = fsc.getDirectoryClient(generatePathName()) + dc.create() + + // Try to create the resource again + dc.create(false) + + then: + thrown(DataLakeStorageException) + } + def "Exists"() { when: dc = fsc.getDirectoryClient(generatePathName()) diff --git a/sdk/storage/azure-storage-file-datalake/src/test/java/com/azure/storage/file/datalake/FileAPITest.groovy b/sdk/storage/azure-storage-file-datalake/src/test/java/com/azure/storage/file/datalake/FileAPITest.groovy index a69ccf3afd23..fe001d58c08e 100644 --- a/sdk/storage/azure-storage-file-datalake/src/test/java/com/azure/storage/file/datalake/FileAPITest.groovy +++ b/sdk/storage/azure-storage-file-datalake/src/test/java/com/azure/storage/file/datalake/FileAPITest.groovy @@ -66,6 +66,18 @@ class FileAPITest extends APISpec { thrown(DataLakeStorageException) } + def "Create overwrite"() { + when: + fc = fsc.getFileClient(generatePathName()) + fc.create() + + // Try to create the resource again + fc.create(false) + + then: + thrown(DataLakeStorageException) + } + def "Exists"() { when: fc = fsc.getFileClient(generatePathName()) @@ -1400,6 +1412,18 @@ class FileAPITest extends APISpec { thrown(DataLakeStorageException) } + def "Flush data overwrite"() { + when: + fc.append(new ByteArrayInputStream(defaultData.array()), 0, defaultDataSize) + fc.flush(defaultDataSize) + fc.append(new ByteArrayInputStream(defaultData.array()), 0, defaultDataSize) + // Attempt to write data without overwrite enabled + fc.flush(defaultDataSize, false) + + then: + thrown(DataLakeStorageException) + } + def "Get File Name and Build Client"() { when: DataLakeFileClient client = fsc.getFileClient(originalFileName) diff --git a/sdk/storage/azure-storage-file-datalake/src/test/resources/session-records/DirectoryAPITestcreateoverwrite.json b/sdk/storage/azure-storage-file-datalake/src/test/resources/session-records/DirectoryAPITestcreateoverwrite.json new file mode 100644 index 000000000000..d833ea4999b5 --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/src/test/resources/session-records/DirectoryAPITestcreateoverwrite.json @@ -0,0 +1,129 @@ +{ + "networkCallRecords" : [ { + "Method" : "PUT", + "Uri" : "http://gaprahns.blob.core.windows.net/jtfscreateoverwrite0directoryapitestcreateoverwriteaab41084c6?restype=container", + "Headers" : { + "x-ms-version" : "2019-02-02", + "User-Agent" : "azsdk-java-azure-storage-blob/12.2.0-beta.1 (11.0.4; Windows 10 10.0)", + "x-ms-client-request-id" : "51e95184-b962-46cc-8e4e-f98d1496e4a9" + }, + "Response" : { + "x-ms-version" : "2019-02-02", + "Server" : "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0", + "ETag" : "0x8D77E9BAD404567", + "Last-Modified" : "Thu, 12 Dec 2019 00:38:58 GMT", + "retry-after" : "0", + "Content-Length" : "0", + "StatusCode" : "201", + "x-ms-request-id" : "fd2051e9-e01e-007c-3c84-b0d34f000000", + "Date" : "Thu, 12 Dec 2019 00:38:58 GMT", + "x-ms-client-request-id" : "51e95184-b962-46cc-8e4e-f98d1496e4a9" + }, + "Exception" : null + }, { + "Method" : "PUT", + "Uri" : "http://gaprahns.dfs.core.windows.net/jtfscreateoverwrite0directoryapitestcreateoverwriteaab41084c6/javapathcreateoverwrite158945939f30ffae9e4a429?resource=directory", + "Headers" : { + "x-ms-version" : "2019-02-02", + "User-Agent" : "azsdk-java-azure-storage-file-datalake/12.0.0-beta.8 (11.0.4; Windows 10 10.0)", + "x-ms-client-request-id" : "130f50f4-451c-4911-8215-3f0276b6e294" + }, + "Response" : { + "x-ms-version" : "2019-02-02", + "Server" : "Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0", + "ETag" : "0x8D77E9BAD5D2879", + "Last-Modified" : "Thu, 12 Dec 2019 00:38:58 GMT", + "retry-after" : "0", + "Content-Length" : "0", + "StatusCode" : "201", + "x-ms-request-id" : "e1c25cd0-c01f-000d-7584-b0a176000000", + "Date" : "Thu, 12 Dec 2019 00:38:58 GMT", + "x-ms-client-request-id" : "130f50f4-451c-4911-8215-3f0276b6e294" + }, + "Exception" : null + }, { + "Method" : "PUT", + "Uri" : "http://gaprahns.dfs.core.windows.net/jtfscreateoverwrite0directoryapitestcreateoverwriteaab41084c6/javapathcreateoverwrite22124067e18ab684844e3bb?resource=directory", + "Headers" : { + "x-ms-version" : "2019-02-02", + "User-Agent" : "azsdk-java-azure-storage-file-datalake/12.0.0-beta.8 (11.0.4; Windows 10 10.0)", + "x-ms-client-request-id" : "5de21c8c-d9ee-4a8e-8792-40d1bf0050df" + }, + "Response" : { + "x-ms-version" : "2019-02-02", + "Server" : "Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0", + "ETag" : "0x8D77E9BAD66BD5B", + "Last-Modified" : "Thu, 12 Dec 2019 00:38:59 GMT", + "retry-after" : "0", + "Content-Length" : "0", + "StatusCode" : "201", + "x-ms-request-id" : "e1c25cd2-c01f-000d-7784-b0a176000000", + "Date" : "Thu, 12 Dec 2019 00:38:58 GMT", + "x-ms-client-request-id" : "5de21c8c-d9ee-4a8e-8792-40d1bf0050df" + }, + "Exception" : null + }, { + "Method" : "PUT", + "Uri" : "http://gaprahns.dfs.core.windows.net/jtfscreateoverwrite0directoryapitestcreateoverwriteaab41084c6/javapathcreateoverwrite22124067e18ab684844e3bb?resource=directory", + "Headers" : { + "x-ms-version" : "2019-02-02", + "User-Agent" : "azsdk-java-azure-storage-file-datalake/12.0.0-beta.8 (11.0.4; Windows 10 10.0)", + "x-ms-client-request-id" : "52181380-3e08-4765-92ca-d53b3b6f7f2d" + }, + "Response" : { + "x-ms-version" : "2019-02-02", + "Server" : "Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0", + "x-ms-error-code" : "PathAlreadyExists", + "retry-after" : "0", + "Content-Length" : "168", + "StatusCode" : "409", + "x-ms-request-id" : "e1c25cd3-c01f-000d-7884-b0a176000000", + "Body" : "{\"error\":{\"code\":\"PathAlreadyExists\",\"message\":\"The specified path already exists.\\nRequestId:e1c25cd3-c01f-000d-7884-b0a176000000\\nTime:2019-12-12T00:38:59.0983814Z\"}}", + "Date" : "Thu, 12 Dec 2019 00:38:58 GMT", + "x-ms-client-request-id" : "52181380-3e08-4765-92ca-d53b3b6f7f2d", + "Content-Type" : "application/json;charset=utf-8" + }, + "Exception" : null + }, { + "Method" : "GET", + "Uri" : "http://gaprahns.blob.core.windows.net?prefix=jtfscreateoverwrite&comp=list", + "Headers" : { + "x-ms-version" : "2019-02-02", + "User-Agent" : "azsdk-java-azure-storage-blob/12.2.0-beta.1 (11.0.4; Windows 10 10.0)", + "x-ms-client-request-id" : "4299efc6-d4a5-4d5a-8faa-33401e6bf350" + }, + "Response" : { + "Transfer-Encoding" : "chunked", + "x-ms-version" : "2019-02-02", + "Server" : "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0", + "retry-after" : "0", + "StatusCode" : "200", + "x-ms-request-id" : "fd205251-e01e-007c-1484-b0d34f000000", + "Body" : "jtfscreateoverwritejtfscreateoverwrite0directoryapitestcreateoverwriteaab41084c6Thu, 12 Dec 2019 00:38:58 GMT\"0x8D77E9BAD404567\"unlockedavailable$account-encryption-keyfalsefalsefalse", + "Date" : "Thu, 12 Dec 2019 00:38:58 GMT", + "x-ms-client-request-id" : "4299efc6-d4a5-4d5a-8faa-33401e6bf350", + "Content-Type" : "application/xml" + }, + "Exception" : null + }, { + "Method" : "DELETE", + "Uri" : "http://gaprahns.blob.core.windows.net/jtfscreateoverwrite0directoryapitestcreateoverwriteaab41084c6?restype=container", + "Headers" : { + "x-ms-version" : "2019-02-02", + "User-Agent" : "azsdk-java-azure-storage-blob/12.2.0-beta.1 (11.0.4; Windows 10 10.0)", + "x-ms-client-request-id" : "ea94f840-4ad4-44ed-8038-1c97f442e4c4" + }, + "Response" : { + "x-ms-version" : "2019-02-02", + "Server" : "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0", + "retry-after" : "0", + "Content-Length" : "0", + "StatusCode" : "202", + "x-ms-request-id" : "fd205273-e01e-007c-2f84-b0d34f000000", + "Date" : "Thu, 12 Dec 2019 00:38:58 GMT", + "x-ms-client-request-id" : "ea94f840-4ad4-44ed-8038-1c97f442e4c4" + }, + "Exception" : null + } ], + "variables" : [ "jtfscreateoverwrite0directoryapitestcreateoverwriteaab41084c6", "javapathcreateoverwrite158945939f30ffae9e4a429", "javapathcreateoverwrite22124067e18ab684844e3bb" ] +} \ No newline at end of file diff --git a/sdk/storage/azure-storage-file-datalake/src/test/resources/session-records/FileAPITestcreateoverwrite.json b/sdk/storage/azure-storage-file-datalake/src/test/resources/session-records/FileAPITestcreateoverwrite.json new file mode 100644 index 000000000000..584776e1b389 --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/src/test/resources/session-records/FileAPITestcreateoverwrite.json @@ -0,0 +1,129 @@ +{ + "networkCallRecords" : [ { + "Method" : "PUT", + "Uri" : "http://gaprahns.blob.core.windows.net/jtfscreateoverwrite0fileapitestcreateoverwritee7602801e9f1?restype=container", + "Headers" : { + "x-ms-version" : "2019-02-02", + "User-Agent" : "azsdk-java-azure-storage-blob/12.2.0-beta.1 (11.0.4; Windows 10 10.0)", + "x-ms-client-request-id" : "1d7c6cde-4404-43bc-ae32-39fd0461caa9" + }, + "Response" : { + "x-ms-version" : "2019-02-02", + "Server" : "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0", + "ETag" : "0x8D77E9B87A990E7", + "Last-Modified" : "Thu, 12 Dec 2019 00:37:55 GMT", + "retry-after" : "0", + "Content-Length" : "0", + "StatusCode" : "201", + "x-ms-request-id" : "fd200f09-e01e-007c-2084-b0d34f000000", + "Date" : "Thu, 12 Dec 2019 00:37:55 GMT", + "x-ms-client-request-id" : "1d7c6cde-4404-43bc-ae32-39fd0461caa9" + }, + "Exception" : null + }, { + "Method" : "PUT", + "Uri" : "http://gaprahns.dfs.core.windows.net/jtfscreateoverwrite0fileapitestcreateoverwritee7602801e9f1/javapathcreateoverwrite1fileapitestcreateoverwritee765991278?resource=file", + "Headers" : { + "x-ms-version" : "2019-02-02", + "User-Agent" : "azsdk-java-azure-storage-file-datalake/12.0.0-beta.8 (11.0.4; Windows 10 10.0)", + "x-ms-client-request-id" : "4cd528b6-4c3e-4fa6-be54-b04d91fa5440" + }, + "Response" : { + "x-ms-version" : "2019-02-02", + "Server" : "Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0", + "ETag" : "0x8D77E9B87F2F078", + "Last-Modified" : "Thu, 12 Dec 2019 00:37:56 GMT", + "retry-after" : "0", + "Content-Length" : "0", + "StatusCode" : "201", + "x-ms-request-id" : "e1c25b64-c01f-000d-2084-b0a176000000", + "Date" : "Thu, 12 Dec 2019 00:37:55 GMT", + "x-ms-client-request-id" : "4cd528b6-4c3e-4fa6-be54-b04d91fa5440" + }, + "Exception" : null + }, { + "Method" : "PUT", + "Uri" : "http://gaprahns.dfs.core.windows.net/jtfscreateoverwrite0fileapitestcreateoverwritee7602801e9f1/javapathcreateoverwrite2fileapitestcreateoverwritee7634810ee?resource=file", + "Headers" : { + "x-ms-version" : "2019-02-02", + "User-Agent" : "azsdk-java-azure-storage-file-datalake/12.0.0-beta.8 (11.0.4; Windows 10 10.0)", + "x-ms-client-request-id" : "c22e46b6-228e-48d5-9825-8415d6c8b9fd" + }, + "Response" : { + "x-ms-version" : "2019-02-02", + "Server" : "Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0", + "ETag" : "0x8D77E9B87FDCE4F", + "Last-Modified" : "Thu, 12 Dec 2019 00:37:56 GMT", + "retry-after" : "0", + "Content-Length" : "0", + "StatusCode" : "201", + "x-ms-request-id" : "e1c25b66-c01f-000d-2184-b0a176000000", + "Date" : "Thu, 12 Dec 2019 00:37:55 GMT", + "x-ms-client-request-id" : "c22e46b6-228e-48d5-9825-8415d6c8b9fd" + }, + "Exception" : null + }, { + "Method" : "PUT", + "Uri" : "http://gaprahns.dfs.core.windows.net/jtfscreateoverwrite0fileapitestcreateoverwritee7602801e9f1/javapathcreateoverwrite2fileapitestcreateoverwritee7634810ee?resource=file", + "Headers" : { + "x-ms-version" : "2019-02-02", + "User-Agent" : "azsdk-java-azure-storage-file-datalake/12.0.0-beta.8 (11.0.4; Windows 10 10.0)", + "x-ms-client-request-id" : "9bdce872-9e7a-4a8f-8546-3d9a48fa3062" + }, + "Response" : { + "x-ms-version" : "2019-02-02", + "Server" : "Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0", + "x-ms-error-code" : "PathAlreadyExists", + "retry-after" : "0", + "Content-Length" : "168", + "StatusCode" : "409", + "x-ms-request-id" : "e1c25b67-c01f-000d-2284-b0a176000000", + "Body" : "{\"error\":{\"code\":\"PathAlreadyExists\",\"message\":\"The specified path already exists.\\nRequestId:e1c25b67-c01f-000d-2284-b0a176000000\\nTime:2019-12-12T00:37:56.3718836Z\"}}", + "Date" : "Thu, 12 Dec 2019 00:37:55 GMT", + "x-ms-client-request-id" : "9bdce872-9e7a-4a8f-8546-3d9a48fa3062", + "Content-Type" : "application/json;charset=utf-8" + }, + "Exception" : null + }, { + "Method" : "GET", + "Uri" : "http://gaprahns.blob.core.windows.net?prefix=jtfscreateoverwrite&comp=list", + "Headers" : { + "x-ms-version" : "2019-02-02", + "User-Agent" : "azsdk-java-azure-storage-blob/12.2.0-beta.1 (11.0.4; Windows 10 10.0)", + "x-ms-client-request-id" : "190b3253-5e9c-47d5-9375-023d7809775b" + }, + "Response" : { + "Transfer-Encoding" : "chunked", + "x-ms-version" : "2019-02-02", + "Server" : "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0", + "retry-after" : "0", + "StatusCode" : "200", + "x-ms-request-id" : "fd201036-e01e-007c-3284-b0d34f000000", + "Body" : "jtfscreateoverwritejtfscreateoverwrite0fileapitestcreateoverwritee7602801e9f1Thu, 12 Dec 2019 00:37:55 GMT\"0x8D77E9B87A990E7\"unlockedavailable$account-encryption-keyfalsefalsefalse", + "Date" : "Thu, 12 Dec 2019 00:37:56 GMT", + "x-ms-client-request-id" : "190b3253-5e9c-47d5-9375-023d7809775b", + "Content-Type" : "application/xml" + }, + "Exception" : null + }, { + "Method" : "DELETE", + "Uri" : "http://gaprahns.blob.core.windows.net/jtfscreateoverwrite0fileapitestcreateoverwritee7602801e9f1?restype=container", + "Headers" : { + "x-ms-version" : "2019-02-02", + "User-Agent" : "azsdk-java-azure-storage-blob/12.2.0-beta.1 (11.0.4; Windows 10 10.0)", + "x-ms-client-request-id" : "fe0d09b5-4fab-4deb-a22c-ad7e2786edce" + }, + "Response" : { + "x-ms-version" : "2019-02-02", + "Server" : "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0", + "retry-after" : "0", + "Content-Length" : "0", + "StatusCode" : "202", + "x-ms-request-id" : "fd20105d-e01e-007c-5484-b0d34f000000", + "Date" : "Thu, 12 Dec 2019 00:37:56 GMT", + "x-ms-client-request-id" : "fe0d09b5-4fab-4deb-a22c-ad7e2786edce" + }, + "Exception" : null + } ], + "variables" : [ "jtfscreateoverwrite0fileapitestcreateoverwritee7602801e9f1", "javapathcreateoverwrite1fileapitestcreateoverwritee765991278", "javapathcreateoverwrite2fileapitestcreateoverwritee7634810ee" ] +} \ No newline at end of file diff --git a/sdk/storage/azure-storage-file-datalake/src/test/resources/session-records/FileAPITestflushdataoverwrite.json b/sdk/storage/azure-storage-file-datalake/src/test/resources/session-records/FileAPITestflushdataoverwrite.json new file mode 100644 index 000000000000..7bd3a96a2a61 --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/src/test/resources/session-records/FileAPITestflushdataoverwrite.json @@ -0,0 +1,129 @@ +{ + "networkCallRecords" : [ { + "Method" : "PUT", + "Uri" : "http://gaprahns.blob.core.windows.net/jtfsflushdataoverwrite0fileapitestflushdataoverwritefef997834?restype=container", + "Headers" : { + "x-ms-version" : "2019-02-02", + "User-Agent" : "azsdk-java-azure-storage-blob/12.2.0-beta.1 (11.0.4; Windows 10 10.0)", + "x-ms-client-request-id" : "dba7b674-2ecd-436f-95ec-3241b70f17e3" + }, + "Response" : { + "x-ms-version" : "2019-02-02", + "Server" : "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0", + "ETag" : "0x8D77E99EDBAE3C3", + "Last-Modified" : "Thu, 12 Dec 2019 00:26:27 GMT", + "retry-after" : "0", + "Content-Length" : "0", + "StatusCode" : "201", + "x-ms-request-id" : "cbc3bb90-701e-00d8-1a82-b0e9ab000000", + "Date" : "Thu, 12 Dec 2019 00:26:27 GMT", + "x-ms-client-request-id" : "dba7b674-2ecd-436f-95ec-3241b70f17e3" + }, + "Exception" : null + }, { + "Method" : "PUT", + "Uri" : "http://gaprahns.dfs.core.windows.net/jtfsflushdataoverwrite0fileapitestflushdataoverwritefef997834/javapathflushdataoverwrite126880f420b74c84ce40e?resource=file", + "Headers" : { + "x-ms-version" : "2019-02-02", + "User-Agent" : "azsdk-java-azure-storage-file-datalake/12.0.0-beta.8 (11.0.4; Windows 10 10.0)", + "x-ms-client-request-id" : "d17cc7ec-2b83-4ca5-91aa-13878c884e1c" + }, + "Response" : { + "x-ms-version" : "2019-02-02", + "Server" : "Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0", + "ETag" : "0x8D77E99EDEE1FD4", + "Last-Modified" : "Thu, 12 Dec 2019 00:26:28 GMT", + "retry-after" : "0", + "Content-Length" : "0", + "StatusCode" : "201", + "x-ms-request-id" : "758d3c29-601f-00aa-5382-b09895000000", + "Date" : "Thu, 12 Dec 2019 00:26:27 GMT", + "x-ms-client-request-id" : "d17cc7ec-2b83-4ca5-91aa-13878c884e1c" + }, + "Exception" : null + }, { + "Method" : "PATCH", + "Uri" : "http://gaprahns.dfs.core.windows.net/jtfsflushdataoverwrite0fileapitestflushdataoverwritefef997834/javapathflushdataoverwrite126880f420b74c84ce40e?position=0&action=append", + "Headers" : { + "x-ms-version" : "2019-02-02", + "User-Agent" : "azsdk-java-azure-storage-file-datalake/12.0.0-beta.8 (11.0.4; Windows 10 10.0)", + "x-ms-client-request-id" : "34a922ea-1fe0-4014-9e56-a73199d27bd4", + "Content-Type" : "application/octet-stream" + }, + "Response" : { + "x-ms-version" : "2019-02-02", + "Server" : "Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0", + "retry-after" : "0", + "Content-Length" : "0", + "StatusCode" : "202", + "x-ms-request-server-encrypted" : "true", + "x-ms-request-id" : "758d3c2a-601f-00aa-5482-b09895000000", + "Date" : "Thu, 12 Dec 2019 00:26:27 GMT", + "x-ms-client-request-id" : "34a922ea-1fe0-4014-9e56-a73199d27bd4" + }, + "Exception" : null + }, { + "Method" : "PATCH", + "Uri" : "http://gaprahns.dfs.core.windows.net/jtfsflushdataoverwrite0fileapitestflushdataoverwritefef997834/javapathflushdataoverwrite126880f420b74c84ce40e?position=7&retainUncommittedData=false&close=false&action=flush", + "Headers" : { + "x-ms-version" : "2019-02-02", + "User-Agent" : "azsdk-java-azure-storage-file-datalake/12.0.0-beta.8 (11.0.4; Windows 10 10.0)", + "x-ms-client-request-id" : "bbc60eba-8e9b-4cb2-831a-f03da6f5878b" + }, + "Response" : { + "x-ms-version" : "2019-02-02", + "Server" : "Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0", + "x-ms-error-code" : "ConditionNotMet", + "retry-after" : "0", + "Content-Length" : "200", + "StatusCode" : "412", + "x-ms-request-id" : "758d3c2b-601f-00aa-5582-b09895000000", + "Body" : "{\"error\":{\"code\":\"ConditionNotMet\",\"message\":\"The condition specified using HTTP conditional header(s) is not met.\\nRequestId:758d3c2b-601f-00aa-5582-b09895000000\\nTime:2019-12-12T00:26:28.4680557Z\"}}", + "Date" : "Thu, 12 Dec 2019 00:26:27 GMT", + "x-ms-client-request-id" : "bbc60eba-8e9b-4cb2-831a-f03da6f5878b", + "Content-Type" : "application/json;charset=utf-8" + }, + "Exception" : null + }, { + "Method" : "GET", + "Uri" : "http://gaprahns.blob.core.windows.net?prefix=jtfsflushdataoverwrite&comp=list", + "Headers" : { + "x-ms-version" : "2019-02-02", + "User-Agent" : "azsdk-java-azure-storage-blob/12.2.0-beta.1 (11.0.4; Windows 10 10.0)", + "x-ms-client-request-id" : "216d5ea6-187e-4e60-b527-0b20f102aea4" + }, + "Response" : { + "Transfer-Encoding" : "chunked", + "x-ms-version" : "2019-02-02", + "Server" : "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0", + "retry-after" : "0", + "StatusCode" : "200", + "x-ms-request-id" : "cbc3bd31-701e-00d8-0882-b0e9ab000000", + "Body" : "jtfsflushdataoverwritejtfsflushdataoverwrite0fileapitestflushdataoverwritefef997834Thu, 12 Dec 2019 00:26:27 GMT\"0x8D77E99EDBAE3C3\"unlockedavailable$account-encryption-keyfalsefalsefalse", + "Date" : "Thu, 12 Dec 2019 00:26:27 GMT", + "x-ms-client-request-id" : "216d5ea6-187e-4e60-b527-0b20f102aea4", + "Content-Type" : "application/xml" + }, + "Exception" : null + }, { + "Method" : "DELETE", + "Uri" : "http://gaprahns.blob.core.windows.net/jtfsflushdataoverwrite0fileapitestflushdataoverwritefef997834?restype=container", + "Headers" : { + "x-ms-version" : "2019-02-02", + "User-Agent" : "azsdk-java-azure-storage-blob/12.2.0-beta.1 (11.0.4; Windows 10 10.0)", + "x-ms-client-request-id" : "b276b301-59dc-4e5e-b389-65d469bb2398" + }, + "Response" : { + "x-ms-version" : "2019-02-02", + "Server" : "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0", + "retry-after" : "0", + "Content-Length" : "0", + "StatusCode" : "202", + "x-ms-request-id" : "cbc3bd7d-701e-00d8-4b82-b0e9ab000000", + "Date" : "Thu, 12 Dec 2019 00:26:27 GMT", + "x-ms-client-request-id" : "b276b301-59dc-4e5e-b389-65d469bb2398" + }, + "Exception" : null + } ], + "variables" : [ "jtfsflushdataoverwrite0fileapitestflushdataoverwritefef997834", "javapathflushdataoverwrite126880f420b74c84ce40e" ] +} \ No newline at end of file