diff --git a/sdk/storage/assets.json b/sdk/storage/assets.json index 2e59f235e..fb19ffabe 100644 --- a/sdk/storage/assets.json +++ b/sdk/storage/assets.json @@ -2,5 +2,5 @@ "AssetsRepo": "Azure/azure-sdk-assets", "AssetsRepoPrefixPath": "cpp", "TagPrefix": "cpp/storage", - "Tag": "cpp/storage_1d5e4a5574" + "Tag": "cpp/storage_90ac51538b" } diff --git a/sdk/storage/azure-storage-blobs/inc/azure/storage/blobs/rest_client.hpp b/sdk/storage/azure-storage-blobs/inc/azure/storage/blobs/rest_client.hpp index 3b855068a..4ba1e301c 100644 --- a/sdk/storage/azure-storage-blobs/inc/azure/storage/blobs/rest_client.hpp +++ b/sdk/storage/azure-storage-blobs/inc/azure/storage/blobs/rest_client.hpp @@ -31,7 +31,7 @@ namespace Azure { namespace Storage { namespace Blobs { /** * The version used for the operations to Azure storage services. */ - constexpr static const char* ApiVersion = "2021-04-10"; + constexpr static const char* ApiVersion = "2021-12-02"; } // namespace _detail namespace Models { /** @@ -977,6 +977,7 @@ namespace Azure { namespace Storage { namespace Blobs { AZ_STORAGE_BLOBS_DLLEXPORT const static AccessTier Cool; AZ_STORAGE_BLOBS_DLLEXPORT const static AccessTier Archive; AZ_STORAGE_BLOBS_DLLEXPORT const static AccessTier Premium; + AZ_STORAGE_BLOBS_DLLEXPORT const static AccessTier Cold; private: std::string m_value; diff --git a/sdk/storage/azure-storage-blobs/src/rest_client.cpp b/sdk/storage/azure-storage-blobs/src/rest_client.cpp index f49fb800c..5b638a590 100644 --- a/sdk/storage/azure-storage-blobs/src/rest_client.cpp +++ b/sdk/storage/azure-storage-blobs/src/rest_client.cpp @@ -134,24 +134,25 @@ namespace Azure { namespace Storage { namespace Blobs { const CopyStatus CopyStatus::Success("success"); const CopyStatus CopyStatus::Aborted("aborted"); const CopyStatus CopyStatus::Failed("failed"); - const AccessTier AccessTier::P1("P1"); - const AccessTier AccessTier::P2("P2"); - const AccessTier AccessTier::P3("P3"); - const AccessTier AccessTier::P4("P4"); - const AccessTier AccessTier::P6("P6"); - const AccessTier AccessTier::P10("P10"); - const AccessTier AccessTier::P15("P15"); - const AccessTier AccessTier::P20("P20"); - const AccessTier AccessTier::P30("P30"); - const AccessTier AccessTier::P40("P40"); - const AccessTier AccessTier::P50("P50"); - const AccessTier AccessTier::P60("P60"); - const AccessTier AccessTier::P70("P70"); - const AccessTier AccessTier::P80("P80"); + const AccessTier AccessTier::P1("p1"); + const AccessTier AccessTier::P2("p2"); + const AccessTier AccessTier::P3("p3"); + const AccessTier AccessTier::P4("p4"); + const AccessTier AccessTier::P6("p6"); + const AccessTier AccessTier::P10("p10"); + const AccessTier AccessTier::P15("p15"); + const AccessTier AccessTier::P20("p20"); + const AccessTier AccessTier::P30("p30"); + const AccessTier AccessTier::P40("p40"); + const AccessTier AccessTier::P50("p50"); + const AccessTier AccessTier::P60("p60"); + const AccessTier AccessTier::P70("p70"); + const AccessTier AccessTier::P80("p80"); const AccessTier AccessTier::Hot("Hot"); const AccessTier AccessTier::Cool("Cool"); const AccessTier AccessTier::Archive("Archive"); const AccessTier AccessTier::Premium("Premium"); + const AccessTier AccessTier::Cold("Cold"); const ArchiveStatus ArchiveStatus::RehydratePendingToHot("rehydrate-pending-to-hot"); const ArchiveStatus ArchiveStatus::RehydratePendingToCool("rehydrate-pending-to-cool"); const RehydratePriority RehydratePriority::High("High"); @@ -376,7 +377,7 @@ namespace Azure { namespace Storage { namespace Blobs { request.SetHeader("Content-Length", std::to_string(requestBody.Length())); request.GetUrl().AppendQueryParameter("restype", "service"); request.GetUrl().AppendQueryParameter("comp", "properties"); - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Accepted) @@ -396,7 +397,7 @@ namespace Azure { namespace Storage { namespace Blobs { auto request = Core::Http::Request(Core::Http::HttpMethod::Get, url); request.GetUrl().AppendQueryParameter("restype", "service"); request.GetUrl().AppendQueryParameter("comp", "properties"); - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); (void)options; auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); @@ -692,7 +693,7 @@ namespace Azure { namespace Storage { namespace Blobs { auto request = Core::Http::Request(Core::Http::HttpMethod::Get, url); request.GetUrl().AppendQueryParameter("restype", "service"); request.GetUrl().AppendQueryParameter("comp", "stats"); - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); (void)options; auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); @@ -792,7 +793,7 @@ namespace Azure { namespace Storage { namespace Blobs { _internal::UrlEncodeQueryParameter( ListBlobContainersIncludeFlagsToString(options.Include.Value()))); } - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Ok) @@ -1077,7 +1078,7 @@ namespace Azure { namespace Storage { namespace Blobs { request.SetHeader("Content-Length", std::to_string(requestBody.Length())); request.GetUrl().AppendQueryParameter("restype", "service"); request.GetUrl().AppendQueryParameter("comp", "userdelegationkey"); - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Ok) @@ -1192,7 +1193,7 @@ namespace Azure { namespace Storage { namespace Blobs { auto request = Core::Http::Request(Core::Http::HttpMethod::Get, url); request.GetUrl().AppendQueryParameter("restype", "account"); request.GetUrl().AppendQueryParameter("comp", "properties"); - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); (void)options; auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); @@ -1222,7 +1223,7 @@ namespace Azure { namespace Storage { namespace Blobs { { request.SetHeader("Content-Type", options.MultipartContentType); } - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Accepted) @@ -1243,7 +1244,7 @@ namespace Azure { namespace Storage { namespace Blobs { { auto request = Core::Http::Request(Core::Http::HttpMethod::Get, url); request.GetUrl().AppendQueryParameter("comp", "blobs"); - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); if (options.Where.HasValue() && !options.Where.Value().empty()) { request.GetUrl().AppendQueryParameter( @@ -1399,7 +1400,7 @@ namespace Azure { namespace Storage { namespace Blobs { { request.SetHeader("x-ms-blob-public-access", options.Access.ToString()); } - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); if (options.DefaultEncryptionScope.HasValue() && !options.DefaultEncryptionScope.Value().empty()) { @@ -1436,7 +1437,7 @@ namespace Azure { namespace Storage { namespace Blobs { { request.SetHeader("x-ms-lease-id", options.LeaseId.Value()); } - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Ok) @@ -1514,7 +1515,7 @@ namespace Azure { namespace Storage { namespace Blobs { "If-Unmodified-Since", options.IfUnmodifiedSince.Value().ToString(Azure::DateTime::DateFormat::Rfc1123)); } - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Accepted) @@ -1548,7 +1549,7 @@ namespace Azure { namespace Storage { namespace Blobs { "If-Modified-Since", options.IfModifiedSince.Value().ToString(Azure::DateTime::DateFormat::Rfc1123)); } - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Ok) @@ -1575,7 +1576,7 @@ namespace Azure { namespace Storage { namespace Blobs { { request.SetHeader("x-ms-lease-id", options.LeaseId.Value()); } - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Ok) @@ -1744,7 +1745,7 @@ namespace Azure { namespace Storage { namespace Blobs { "If-Unmodified-Since", options.IfUnmodifiedSince.Value().ToString(Azure::DateTime::DateFormat::Rfc1123)); } - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Ok) @@ -1767,7 +1768,7 @@ namespace Azure { namespace Storage { namespace Blobs { auto request = Core::Http::Request(Core::Http::HttpMethod::Put, url); request.GetUrl().AppendQueryParameter("restype", "container"); request.GetUrl().AppendQueryParameter("comp", "undelete"); - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); if (options.DeletedContainerName.HasValue() && !options.DeletedContainerName.Value().empty()) { request.SetHeader("x-ms-deleted-container-name", options.DeletedContainerName.Value()); @@ -1797,7 +1798,7 @@ namespace Azure { namespace Storage { namespace Blobs { auto request = Core::Http::Request(Core::Http::HttpMethod::Put, url); request.GetUrl().AppendQueryParameter("restype", "container"); request.GetUrl().AppendQueryParameter("comp", "rename"); - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); if (!options.SourceContainerName.empty()) { request.SetHeader("x-ms-source-container-name", options.SourceContainerName); @@ -1831,7 +1832,7 @@ namespace Azure { namespace Storage { namespace Blobs { { request.SetHeader("Content-Type", options.MultipartContentType); } - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Accepted) @@ -1853,7 +1854,7 @@ namespace Azure { namespace Storage { namespace Blobs { auto request = Core::Http::Request(Core::Http::HttpMethod::Get, url); request.GetUrl().AppendQueryParameter("restype", "container"); request.GetUrl().AppendQueryParameter("comp", "blobs"); - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); if (options.Where.HasValue() && !options.Where.Value().empty()) { request.GetUrl().AppendQueryParameter( @@ -2023,7 +2024,7 @@ namespace Azure { namespace Storage { namespace Blobs { "If-Unmodified-Since", options.IfUnmodifiedSince.Value().ToString(Azure::DateTime::DateFormat::Rfc1123)); } - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Created) @@ -2064,7 +2065,7 @@ namespace Azure { namespace Storage { namespace Blobs { "If-Unmodified-Since", options.IfUnmodifiedSince.Value().ToString(Azure::DateTime::DateFormat::Rfc1123)); } - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Ok) @@ -2104,7 +2105,7 @@ namespace Azure { namespace Storage { namespace Blobs { "If-Unmodified-Since", options.IfUnmodifiedSince.Value().ToString(Azure::DateTime::DateFormat::Rfc1123)); } - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Ok) @@ -2145,7 +2146,7 @@ namespace Azure { namespace Storage { namespace Blobs { "If-Unmodified-Since", options.IfUnmodifiedSince.Value().ToString(Azure::DateTime::DateFormat::Rfc1123)); } - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Accepted) @@ -2190,7 +2191,7 @@ namespace Azure { namespace Storage { namespace Blobs { "If-Unmodified-Since", options.IfUnmodifiedSince.Value().ToString(Azure::DateTime::DateFormat::Rfc1123)); } - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Ok) @@ -2237,7 +2238,7 @@ namespace Azure { namespace Storage { namespace Blobs { _internal::UrlEncodeQueryParameter( ListBlobsIncludeFlagsToString(options.Include.Value()))); } - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Ok) @@ -2916,7 +2917,7 @@ namespace Azure { namespace Storage { namespace Blobs { _internal::UrlEncodeQueryParameter( ListBlobsIncludeFlagsToString(options.Include.Value()))); } - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); if (options.ShowOnly.HasValue() && !options.ShowOnly.Value().empty()) { request.GetUrl().AppendQueryParameter( @@ -3671,7 +3672,7 @@ namespace Azure { namespace Storage { namespace Blobs { { request.SetHeader("x-ms-if-tags", options.IfTags.Value()); } - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (!(httpStatusCode == Core::Http::HttpStatusCode::Ok @@ -3947,7 +3948,7 @@ namespace Azure { namespace Storage { namespace Blobs { { request.SetHeader("x-ms-if-tags", options.IfTags.Value()); } - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Ok) @@ -4209,7 +4210,7 @@ namespace Azure { namespace Storage { namespace Blobs { { request.SetHeader("x-ms-if-tags", options.IfTags.Value()); } - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Accepted) @@ -4227,7 +4228,7 @@ namespace Azure { namespace Storage { namespace Blobs { { auto request = Core::Http::Request(Core::Http::HttpMethod::Put, url); request.GetUrl().AppendQueryParameter("comp", "undelete"); - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); (void)options; auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); @@ -4246,7 +4247,7 @@ namespace Azure { namespace Storage { namespace Blobs { { auto request = Core::Http::Request(Core::Http::HttpMethod::Put, url); request.GetUrl().AppendQueryParameter("comp", "expiry"); - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); if (!options.ExpiryOptions.ToString().empty()) { request.SetHeader("x-ms-expiry-option", options.ExpiryOptions.ToString()); @@ -4334,7 +4335,7 @@ namespace Azure { namespace Storage { namespace Blobs { { request.SetHeader("x-ms-blob-content-disposition", options.BlobContentDisposition); } - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Ok) @@ -4367,7 +4368,7 @@ namespace Azure { namespace Storage { namespace Blobs { { auto request = Core::Http::Request(Core::Http::HttpMethod::Put, url); request.GetUrl().AppendQueryParameter("comp", "immutabilityPolicies"); - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); if (options.IfUnmodifiedSince.HasValue()) { request.SetHeader( @@ -4410,7 +4411,7 @@ namespace Azure { namespace Storage { namespace Blobs { { auto request = Core::Http::Request(Core::Http::HttpMethod::Delete, url); request.GetUrl().AppendQueryParameter("comp", "immutabilityPolicies"); - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); (void)options; auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); @@ -4430,7 +4431,7 @@ namespace Azure { namespace Storage { namespace Blobs { { auto request = Core::Http::Request(Core::Http::HttpMethod::Put, url); request.GetUrl().AppendQueryParameter("comp", "legalhold"); - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); request.SetHeader("x-ms-legal-hold", options.LegalHold ? "true" : "false"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); @@ -4502,7 +4503,7 @@ namespace Azure { namespace Storage { namespace Blobs { { request.SetHeader("x-ms-if-tags", options.IfTags.Value()); } - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Ok) @@ -4577,7 +4578,7 @@ namespace Azure { namespace Storage { namespace Blobs { { request.SetHeader("x-ms-if-tags", options.IfTags.Value()); } - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Created) @@ -4635,7 +4636,7 @@ namespace Azure { namespace Storage { namespace Blobs { { request.SetHeader("x-ms-if-tags", options.IfTags.Value()); } - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Ok) @@ -4692,7 +4693,7 @@ namespace Azure { namespace Storage { namespace Blobs { { request.SetHeader("x-ms-if-tags", options.IfTags.Value()); } - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Ok) @@ -4754,7 +4755,7 @@ namespace Azure { namespace Storage { namespace Blobs { { request.SetHeader("x-ms-if-tags", options.IfTags.Value()); } - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Ok) @@ -4812,7 +4813,7 @@ namespace Azure { namespace Storage { namespace Blobs { { request.SetHeader("x-ms-if-tags", options.IfTags.Value()); } - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Accepted) @@ -4892,7 +4893,7 @@ namespace Azure { namespace Storage { namespace Blobs { { request.SetHeader("x-ms-lease-id", options.LeaseId.Value()); } - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Created) @@ -4999,7 +5000,7 @@ namespace Azure { namespace Storage { namespace Blobs { { request.SetHeader("x-ms-lease-id", options.LeaseId.Value()); } - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); if (options.BlobTagsString.HasValue() && !options.BlobTagsString.Value().empty()) { request.SetHeader("x-ms-tags", options.BlobTagsString.Value()); @@ -5118,7 +5119,7 @@ namespace Azure { namespace Storage { namespace Blobs { { request.SetHeader("x-ms-lease-id", options.LeaseId.Value()); } - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); if (options.SourceContentMD5.HasValue() && !Core::Convert::Base64Encode(options.SourceContentMD5.Value()).empty()) { @@ -5228,7 +5229,7 @@ namespace Azure { namespace Storage { namespace Blobs { { request.SetHeader("x-ms-lease-id", options.LeaseId.Value()); } - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::NoContent) @@ -5266,7 +5267,7 @@ namespace Azure { namespace Storage { namespace Blobs { { request.SetHeader("x-ms-rehydrate-priority", options.RehydratePriority.Value().ToString()); } - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); if (options.LeaseId.HasValue() && !options.LeaseId.Value().empty()) { request.SetHeader("x-ms-lease-id", options.LeaseId.Value()); @@ -5568,7 +5569,7 @@ namespace Azure { namespace Storage { namespace Blobs { { request.SetHeader("x-ms-if-tags", options.IfTags.Value()); } - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); if (options.EncryptionScope.HasValue() && !options.EncryptionScope.Value().empty()) { request.SetHeader("x-ms-encryption-scope", options.EncryptionScope.Value()); @@ -5617,7 +5618,7 @@ namespace Azure { namespace Storage { namespace Blobs { { auto request = Core::Http::Request(Core::Http::HttpMethod::Get, url); request.GetUrl().AppendQueryParameter("comp", "tags"); - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); if (options.Snapshot.HasValue() && !options.Snapshot.Value().empty()) { request.GetUrl().AppendQueryParameter( @@ -5744,7 +5745,7 @@ namespace Azure { namespace Storage { namespace Blobs { request.SetHeader("Content-Type", "application/xml; charset=UTF-8"); request.SetHeader("Content-Length", std::to_string(requestBody.Length())); request.GetUrl().AppendQueryParameter("comp", "tags"); - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); if (options.VersionId.HasValue() && !options.VersionId.Value().empty()) { request.GetUrl().AppendQueryParameter( @@ -5875,7 +5876,7 @@ namespace Azure { namespace Storage { namespace Blobs { request.SetHeader( "x-ms-blob-sequence-number", std::to_string(options.BlobSequenceNumber.Value())); } - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); if (options.BlobTagsString.HasValue() && !options.BlobTagsString.Value().empty()) { request.SetHeader("x-ms-tags", options.BlobTagsString.Value()); @@ -6021,7 +6022,7 @@ namespace Azure { namespace Storage { namespace Blobs { { request.SetHeader("x-ms-if-tags", options.IfTags.Value()); } - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Created) @@ -6147,7 +6148,7 @@ namespace Azure { namespace Storage { namespace Blobs { { request.SetHeader("x-ms-if-tags", options.IfTags.Value()); } - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Created) @@ -6290,7 +6291,7 @@ namespace Azure { namespace Storage { namespace Blobs { { request.SetHeader("x-ms-source-if-none-match", options.SourceIfNoneMatch.ToString()); } - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); if (options.CopySourceAuthorization.HasValue() && !options.CopySourceAuthorization.Value().empty()) { @@ -6391,7 +6392,7 @@ namespace Azure { namespace Storage { namespace Blobs { { request.SetHeader("x-ms-if-tags", options.IfTags.Value()); } - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); if (options.Marker.HasValue() && !options.Marker.Value().empty()) { request.GetUrl().AppendQueryParameter( @@ -6569,7 +6570,7 @@ namespace Azure { namespace Storage { namespace Blobs { { request.SetHeader("x-ms-if-tags", options.IfTags.Value()); } - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); if (options.Marker.HasValue() && !options.Marker.Value().empty()) { request.GetUrl().AppendQueryParameter( @@ -6749,7 +6750,7 @@ namespace Azure { namespace Storage { namespace Blobs { request.SetHeader("x-ms-if-tags", options.IfTags.Value()); } request.SetHeader("x-ms-blob-content-length", std::to_string(options.BlobContentLength)); - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Ok) @@ -6815,7 +6816,7 @@ namespace Azure { namespace Storage { namespace Blobs { request.SetHeader( "x-ms-blob-sequence-number", std::to_string(options.BlobSequenceNumber.Value())); } - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Ok) @@ -6873,7 +6874,7 @@ namespace Azure { namespace Storage { namespace Blobs { { request.SetHeader("x-ms-copy-source", options.CopySource); } - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Accepted) @@ -6984,7 +6985,7 @@ namespace Azure { namespace Storage { namespace Blobs { { request.SetHeader("x-ms-if-tags", options.IfTags.Value()); } - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); if (options.BlobTagsString.HasValue() && !options.BlobTagsString.Value().empty()) { request.SetHeader("x-ms-tags", options.BlobTagsString.Value()); @@ -7112,7 +7113,7 @@ namespace Azure { namespace Storage { namespace Blobs { { request.SetHeader("x-ms-if-tags", options.IfTags.Value()); } - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Created) @@ -7266,7 +7267,7 @@ namespace Azure { namespace Storage { namespace Blobs { { request.SetHeader("x-ms-source-if-none-match", options.SourceIfNoneMatch.ToString()); } - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); if (options.CopySourceAuthorization.HasValue() && !options.CopySourceAuthorization.Value().empty()) { @@ -7322,7 +7323,7 @@ namespace Azure { namespace Storage { namespace Blobs { { auto request = Core::Http::Request(Core::Http::HttpMethod::Put, url); request.GetUrl().AppendQueryParameter("comp", "seal"); - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); if (options.LeaseId.HasValue() && !options.LeaseId.Value().empty()) { request.SetHeader("x-ms-lease-id", options.LeaseId.Value()); @@ -7461,7 +7462,7 @@ namespace Azure { namespace Storage { namespace Blobs { { request.SetHeader("x-ms-if-tags", options.IfTags.Value()); } - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); if (options.BlobTagsString.HasValue() && !options.BlobTagsString.Value().empty()) { request.SetHeader("x-ms-tags", options.BlobTagsString.Value()); @@ -7644,7 +7645,7 @@ namespace Azure { namespace Storage { namespace Blobs { { request.SetHeader("x-ms-source-if-tags", options.SourceIfTags.Value()); } - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); if (options.SourceContentMD5.HasValue() && !Core::Convert::Base64Encode(options.SourceContentMD5.Value()).empty()) { @@ -7776,7 +7777,7 @@ namespace Azure { namespace Storage { namespace Blobs { { request.SetHeader("x-ms-encryption-scope", options.EncryptionScope.Value()); } - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Created) @@ -7890,7 +7891,7 @@ namespace Azure { namespace Storage { namespace Blobs { { request.SetHeader("x-ms-source-if-none-match", options.SourceIfNoneMatch.ToString()); } - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); if (options.CopySourceAuthorization.HasValue() && !options.CopySourceAuthorization.Value().empty()) { @@ -8057,7 +8058,7 @@ namespace Azure { namespace Storage { namespace Blobs { { request.SetHeader("x-ms-if-tags", options.IfTags.Value()); } - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); if (options.BlobTagsString.HasValue() && !options.BlobTagsString.Value().empty()) { request.SetHeader("x-ms-tags", options.BlobTagsString.Value()); @@ -8146,7 +8147,7 @@ namespace Azure { namespace Storage { namespace Blobs { { request.SetHeader("x-ms-if-tags", options.IfTags.Value()); } - request.SetHeader("x-ms-version", "2021-04-10"); + request.SetHeader("x-ms-version", "2021-12-02"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Ok) diff --git a/sdk/storage/azure-storage-blobs/swagger/README.md b/sdk/storage/azure-storage-blobs/swagger/README.md index 4d30abab0..5548a63c9 100644 --- a/sdk/storage/azure-storage-blobs/swagger/README.md +++ b/sdk/storage/azure-storage-blobs/swagger/README.md @@ -9,7 +9,7 @@ package-name: azure-storage-blobs namespace: Azure::Storage::Blobs output-folder: generated clear-output-folder: true -input-file: https://raw.githubusercontent.com/Azure/azure-rest-api-specs/main/specification/storage/data-plane/Microsoft.BlobStorage/preview/2021-04-10/blob.json +input-file: https://raw.githubusercontent.com/Azure/azure-rest-api-specs/main/specification/storage/data-plane/Microsoft.BlobStorage/preview/2021-12-02/blob.json ``` ## ModelFour Options @@ -102,7 +102,7 @@ directive: "name": "ApiVersion", "modelAsString": false }, - "enum": ["2021-04-10"], + "enum": ["2021-12-02"], "description": "The version used for the operations to Azure storage services." }; ``` @@ -290,6 +290,7 @@ directive: delete $.EncryptionAlgorithm["x-ms-enum"]; $.ImmutabilityPolicyMode.enum = $.ImmutabilityPolicyMode.enum.map(e => e.toLowerCase()); $.CopySourceTags["x-ms-enum"]["name"] = "BlobCopySourceTagsMode"; + delete $.FilterBlobsInclude; - from: swagger-document where: $.definitions transform: > @@ -299,7 +300,27 @@ directive: $.CopyStatus["x-ms-enum"]["name"] = "CopyStatus"; $.PublicAccessType["x-ms-enum"]["values"] = [{"value": "container", "name": "BlobContainer"}, {"value": "blob", "name": "Blob"}, {"value": "", "name": "None"}]; $.PublicAccessType.description = "Specifies whether data in the container may be accessed publicly and the level of access"; - $.AccessTier.enum.unshift("P1", "P2", "P3"); + $.AccessTier["x-ms-enum"]["values"] = [ + {"value": "p1", "name": "P1"}, + {"value": "p2", "name": "P2"}, + {"value": "p3", "name": "P3"}, + {"value": "p4", "name": "P4"}, + {"value": "p6", "name": "P6"}, + {"value": "p10", "name": "P10"}, + {"value": "p15", "name": "P15"}, + {"value": "p20", "name": "P20"}, + {"value": "p30", "name": "P30"}, + {"value": "p40", "name": "P40"}, + {"value": "p50", "name": "P50"}, + {"value": "p60", "name": "P60"}, + {"value": "p70", "name": "P70"}, + {"value": "p80", "name": "P80"}, + {"value": "Hot", "name": "Hot"}, + {"value": "Cool", "name": "Cool"}, + {"value": "Archive", "name": "Archive"}, + {"value": "Premium", "name": "Premium"}, + {"value": "Cold", "name": "Cold"} + ]; $.AccessTier.description = "The tier of page blob on a premium storage account or tier of block blob on blob storage or general purpose v2 account."; $.EncryptionAlgorithm = { "type": "string", @@ -688,6 +709,14 @@ directive: ```yaml directive: + - from: swagger-document + where: $["x-ms-paths"]["/?comp=blobs"].get.parameters + transform: > + $ = $.filter(p => !p["$ref"] || !p["$ref"].endsWith("#/parameters/FilterBlobsInclude")); + - from: swagger-document + where: $["x-ms-paths"]["/{containerName}?restype=container&comp=blobs"].get.parameters + transform: > + $ = $.filter(p => !p["$ref"] || !p["$ref"].endsWith("#/parameters/FilterBlobsInclude")); - from: swagger-document where: $.definitions transform: > @@ -695,6 +724,8 @@ directive: $.FilterBlobItem.properties["Name"]["x-ms-client-name"] = "BlobName"; $.FilterBlobItem.properties["ContainerName"]["x-ms-client-name"] = "BlobContainerName"; delete $.FilterBlobItem.properties["TagValue"]; + delete $.FilterBlobItem.properties["VersionId"]; + delete $.FilterBlobItem.properties["IsCurrentVersion"]; $.FilterBlobItem.properties["Name"].description = "Blob name."; $.FilterBlobItem.properties["ContainerName"].description = "Blob container name."; $.FilterBlobItem.properties["Tags"]["x-ms-xml"] = {"name": "Tags/TagSet"}; @@ -1596,10 +1627,6 @@ directive: ```yaml directive: - - from: swagger-document - where: $["x-ms-paths"]["/{containerName}/{blob}?BlockBlob"].put.parameters - transform: > - $.push({"$ref": "#/parameters/ContentCrc64"}); - from: swagger-document where: $["x-ms-paths"]["/{containerName}/{blob}?BlockBlob"].put.responses["201"].headers transform: > diff --git a/sdk/storage/azure-storage-blobs/test/ut/block_blob_client_test.cpp b/sdk/storage/azure-storage-blobs/test/ut/block_blob_client_test.cpp index 2caf96652..c27d71df4 100644 --- a/sdk/storage/azure-storage-blobs/test/ut/block_blob_client_test.cpp +++ b/sdk/storage/azure-storage-blobs/test/ut/block_blob_client_test.cpp @@ -1509,6 +1509,22 @@ namespace Azure { namespace Storage { namespace Test { blobItem.Details.RehydratePriority.Value(), Blobs::Models::RehydratePriority::Standard); } + TEST_F(BlockBlobClientTest, DISABLED_SetTierCold) + { + + auto const testName(GetTestName()); + auto blobClient = GetBlockBlobClient(testName); + + std::vector emptyContent; + std::string blobName(testName); + blobClient.UploadFrom(emptyContent.data(), emptyContent.size()); + + // set to cold + blobClient.SetAccessTier(Blobs::Models::AccessTier::Cold); + auto properties = blobClient.GetProperties().Value; + EXPECT_EQ(properties.AccessTier.Value(), Blobs::Models::AccessTier::Cold); + } + TEST_F(BlockBlobClientTest, SetTierWithLeaseId) { auto const testName(GetTestName()); diff --git a/sdk/storage/azure-storage-files-datalake/inc/azure/storage/files/datalake/datalake_options.hpp b/sdk/storage/azure-storage-files-datalake/inc/azure/storage/files/datalake/datalake_options.hpp index d31100b9b..f2209f88f 100644 --- a/sdk/storage/azure-storage-files-datalake/inc/azure/storage/files/datalake/datalake_options.hpp +++ b/sdk/storage/azure-storage-files-datalake/inc/azure/storage/files/datalake/datalake_options.hpp @@ -371,6 +371,28 @@ namespace Azure { namespace Storage { namespace Files { namespace DataLake { * If true, the file will be flushed after the append. */ Azure::Nullable Flush; + + /** + * If "acquire" it will acquire the lease. + * If "auto-renew" it will renew the lease. + * If "release" it will release the lease only on flush. Only applicable if Flush is set to + * true. + * If "acquire-release" it will acquire & complete the operation & release the lease once + * operation is done. Only applicable if Flush is set to true. + */ + Azure::Nullable LeaseAction; + + /** + * Proposed LeaseId. + */ + Azure::Nullable LeaseId; + + /** + * Specifies the duration of the lease, in seconds, or InfiniteLeaseDuration 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. + */ + Azure::Nullable LeaseDuration; }; /** @@ -418,6 +440,28 @@ namespace Azure { namespace Storage { namespace Files { namespace DataLake { * Specify the access condition for the path. */ PathAccessConditions AccessConditions; + + /** + * If "acquire" it will acquire the lease. + * If "auto-renew" it will renew the lease. + * If "release" it will release the lease only on flush. Only applicable if Flush is set to + * true. + * If "acquire-release" it will acquire & complete the operation & release the lease once + * operation is done. Only applicable if Flush is set to true. + */ + Azure::Nullable LeaseAction; + + /** + * Proposed LeaseId. + */ + Azure::Nullable LeaseId; + + /** + * Specifies the duration of the lease, in seconds, or InfiniteLeaseDuration 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. + */ + Azure::Nullable LeaseDuration; }; /** diff --git a/sdk/storage/azure-storage-files-datalake/inc/azure/storage/files/datalake/rest_client.hpp b/sdk/storage/azure-storage-files-datalake/inc/azure/storage/files/datalake/rest_client.hpp index cce269de9..79878e13f 100644 --- a/sdk/storage/azure-storage-files-datalake/inc/azure/storage/files/datalake/rest_client.hpp +++ b/sdk/storage/azure-storage-files-datalake/inc/azure/storage/files/datalake/rest_client.hpp @@ -276,6 +276,26 @@ namespace Azure { namespace Storage { namespace Files { namespace DataLake { std::string Acl; }; } // namespace _detail + /** + * @brief Optional. If "acquire" it will acquire the lease. If "auto-renew" it will renew the + * lease. If "release" it will release the lease only on flush. If "acquire-release" it will + * acquire & complete the operation & release the lease once operation is done. + */ + class LeaseAction final { + public: + LeaseAction() = default; + explicit LeaseAction(std::string value) : m_value(std::move(value)) {} + bool operator==(const LeaseAction& other) const { return m_value == other.m_value; } + bool operator!=(const LeaseAction& other) const { return !(*this == other); } + const std::string& ToString() const { return m_value; } + AZ_STORAGE_FILES_DATALAKE_DLLEXPORT const static LeaseAction Acquire; + AZ_STORAGE_FILES_DATALAKE_DLLEXPORT const static LeaseAction AutoRenew; + AZ_STORAGE_FILES_DATALAKE_DLLEXPORT const static LeaseAction Release; + AZ_STORAGE_FILES_DATALAKE_DLLEXPORT const static LeaseAction AcquireRelease; + + private: + std::string m_value; + }; /** * @brief Response type for #Azure::Storage::Files::DataLake::FileClient::Flush. */ @@ -304,6 +324,10 @@ namespace Azure { namespace Storage { namespace Files { namespace DataLake { * returned when the blob was encrypted with a customer-provided key. */ Nullable> EncryptionKeySha256; + /** + * If the lease was auto-renewed with this request. + */ + Nullable IsLeaseRenewed; }; /** * @brief Response type for #Azure::Storage::Files::DataLake::FileClient::Append. @@ -325,6 +349,10 @@ namespace Azure { namespace Storage { namespace Files { namespace DataLake { * returned when the blob was encrypted with a customer-provided key. */ Nullable> EncryptionKeySha256; + /** + * If the lease was auto-renewed with this request. + */ + Nullable IsLeaseRenewed; }; } // namespace Models namespace _detail { @@ -471,6 +499,9 @@ namespace Azure { namespace Storage { namespace Files { namespace DataLake { Nullable Close; Nullable> ContentMD5; Nullable LeaseId; + Nullable LeaseAction; + Nullable LeaseDuration; + Nullable ProposedLeaseId; Nullable CacheControl; Nullable ContentType; Nullable ContentDisposition; @@ -495,6 +526,9 @@ namespace Azure { namespace Storage { namespace Files { namespace DataLake { Nullable> TransactionalContentHash; Nullable> TransactionalContentCrc64; Nullable LeaseId; + Nullable LeaseAction; + Nullable LeaseDuration; + Nullable ProposedLeaseId; Nullable EncryptionKey; Nullable> EncryptionKeySha256; Nullable EncryptionAlgorithm; diff --git a/sdk/storage/azure-storage-files-datalake/src/datalake_file_client.cpp b/sdk/storage/azure-storage-files-datalake/src/datalake_file_client.cpp index b40d4b6c0..aa9018b9d 100644 --- a/sdk/storage/azure-storage-files-datalake/src/datalake_file_client.cpp +++ b/sdk/storage/azure-storage-files-datalake/src/datalake_file_client.cpp @@ -88,6 +88,12 @@ namespace Azure { namespace Storage { namespace Files { namespace DataLake { protocolLayerOptions.EncryptionKeySha256 = m_customerProvidedKey.Value().KeyHash; protocolLayerOptions.EncryptionAlgorithm = m_customerProvidedKey.Value().Algorithm.ToString(); } + protocolLayerOptions.LeaseAction = options.LeaseAction; + protocolLayerOptions.ProposedLeaseId = options.LeaseId; + if (options.LeaseDuration.HasValue()) + { + protocolLayerOptions.LeaseDuration = static_cast(options.LeaseDuration->count()); + } return _detail::FileClient::Append( *m_pipeline, m_pathUrl, content, protocolLayerOptions, context); } @@ -124,6 +130,12 @@ namespace Azure { namespace Storage { namespace Files { namespace DataLake { protocolLayerOptions.EncryptionKeySha256 = m_customerProvidedKey.Value().KeyHash; protocolLayerOptions.EncryptionAlgorithm = m_customerProvidedKey.Value().Algorithm.ToString(); } + protocolLayerOptions.LeaseAction = options.LeaseAction; + protocolLayerOptions.ProposedLeaseId = options.LeaseId; + if (options.LeaseDuration.HasValue()) + { + protocolLayerOptions.LeaseDuration = static_cast(options.LeaseDuration->count()); + } return _detail::FileClient::Flush(*m_pipeline, m_pathUrl, protocolLayerOptions, context); } diff --git a/sdk/storage/azure-storage-files-datalake/src/rest_client.cpp b/sdk/storage/azure-storage-files-datalake/src/rest_client.cpp index a88801e2d..ff40ae8d8 100644 --- a/sdk/storage/azure-storage-files-datalake/src/rest_client.cpp +++ b/sdk/storage/azure-storage-files-datalake/src/rest_client.cpp @@ -40,6 +40,10 @@ namespace Azure { namespace Storage { namespace Files { namespace DataLake { const PublicAccessType PublicAccessType::Path("blob"); const PathResourceType PathResourceType::Directory("directory"); const PathResourceType PathResourceType::File("file"); + const LeaseAction LeaseAction::Acquire("acquire"); + const LeaseAction LeaseAction::AutoRenew("auto-renew"); + const LeaseAction LeaseAction::Release("release"); + const LeaseAction LeaseAction::AcquireRelease("acquire-release"); } // namespace Models namespace _detail { Response FileSystemClient::ListPaths( @@ -624,6 +628,18 @@ namespace Azure { namespace Storage { namespace Files { namespace DataLake { { request.SetHeader("x-ms-lease-id", options.LeaseId.Value()); } + if (options.LeaseAction.HasValue() && !options.LeaseAction.Value().ToString().empty()) + { + request.SetHeader("x-ms-lease-action", options.LeaseAction.Value().ToString()); + } + if (options.LeaseDuration.HasValue()) + { + request.SetHeader("x-ms-lease-duration", std::to_string(options.LeaseDuration.Value())); + } + if (options.ProposedLeaseId.HasValue() && !options.ProposedLeaseId.Value().empty()) + { + request.SetHeader("x-ms-proposed-lease-id", options.ProposedLeaseId.Value()); + } if (options.CacheControl.HasValue() && !options.CacheControl.Value().empty()) { request.SetHeader("x-ms-cache-control", options.CacheControl.Value()); @@ -698,6 +714,11 @@ namespace Azure { namespace Storage { namespace Files { namespace DataLake { response.EncryptionKeySha256 = Core::Convert::Base64Decode( pRawResponse->GetHeaders().at("x-ms-encryption-key-sha256")); } + if (pRawResponse->GetHeaders().count("x-ms-lease-renewed") != 0) + { + response.IsLeaseRenewed + = pRawResponse->GetHeaders().at("x-ms-lease-renewed") == std::string("true"); + } return Response(std::move(response), std::move(pRawResponse)); } Response FileClient::Append( @@ -731,6 +752,18 @@ namespace Azure { namespace Storage { namespace Files { namespace DataLake { { request.SetHeader("x-ms-lease-id", options.LeaseId.Value()); } + if (options.LeaseAction.HasValue() && !options.LeaseAction.Value().ToString().empty()) + { + request.SetHeader("x-ms-lease-action", options.LeaseAction.Value().ToString()); + } + if (options.LeaseDuration.HasValue()) + { + request.SetHeader("x-ms-lease-duration", std::to_string(options.LeaseDuration.Value())); + } + if (options.ProposedLeaseId.HasValue() && !options.ProposedLeaseId.Value().empty()) + { + request.SetHeader("x-ms-proposed-lease-id", options.ProposedLeaseId.Value()); + } request.SetHeader("x-ms-version", "2021-06-08"); if (options.EncryptionKey.HasValue() && !options.EncryptionKey.Value().empty()) { @@ -779,6 +812,11 @@ namespace Azure { namespace Storage { namespace Files { namespace DataLake { response.EncryptionKeySha256 = Core::Convert::Base64Decode( pRawResponse->GetHeaders().at("x-ms-encryption-key-sha256")); } + if (pRawResponse->GetHeaders().count("x-ms-lease-renewed") != 0) + { + response.IsLeaseRenewed + = pRawResponse->GetHeaders().at("x-ms-lease-renewed") == std::string("true"); + } return Response(std::move(response), std::move(pRawResponse)); } } // namespace _detail diff --git a/sdk/storage/azure-storage-files-datalake/swagger/README.md b/sdk/storage/azure-storage-files-datalake/swagger/README.md index 1ff26382a..467d8e189 100644 --- a/sdk/storage/azure-storage-files-datalake/swagger/README.md +++ b/sdk/storage/azure-storage-files-datalake/swagger/README.md @@ -438,6 +438,8 @@ directive: $["x-ms-content-crc64"]["x-ms-client-name"] = "TransactionalContentHash"; $["x-ms-content-crc64"]["x-nullable"] = true; $["x-ms-encryption-key-sha256"]["x-nullable"] = true; + $["x-ms-lease-renewed"]["x-nullable"] = true; + $["x-ms-lease-renewed"]["x-ms-client-name"] = "IsLeaseRenewed"; delete $["ETag"]; ``` @@ -450,4 +452,6 @@ directive: transform: > $["Content-Length"]["x-ms-client-name"] = "FileSize"; $["x-ms-encryption-key-sha256"]["x-nullable"] = true; + $["x-ms-lease-renewed"]["x-nullable"] = true; + $["x-ms-lease-renewed"]["x-ms-client-name"] = "IsLeaseRenewed"; ``` \ No newline at end of file diff --git a/sdk/storage/azure-storage-files-datalake/test/ut/datalake_file_client_test.cpp b/sdk/storage/azure-storage-files-datalake/test/ut/datalake_file_client_test.cpp index a253e807b..d7e1f2878 100644 --- a/sdk/storage/azure-storage-files-datalake/test/ut/datalake_file_client_test.cpp +++ b/sdk/storage/azure-storage-files-datalake/test/ut/datalake_file_client_test.cpp @@ -279,6 +279,196 @@ namespace Azure { namespace Storage { namespace Test { } } + TEST_F(DataLakeFileClientTest, AppendFileWithLease) + { + const int32_t bufferSize = 4 * 1024; // 4KB data size + std::vector buffer(bufferSize, 'x'); + auto bufferStream = std::make_unique( + Azure::Core::IO::MemoryBodyStream(buffer)); + + // Append Lease Acquire + { + auto client = m_fileSystemClient->GetFileClient(GetTestNameLowerCase() + "_acquire"); + client.Create(); + Files::DataLake::AppendFileOptions options; + options.LeaseAction = Files::DataLake::Models::LeaseAction::Acquire; + options.LeaseId = Files::DataLake::DataLakeLeaseClient::CreateUniqueLeaseId(); + options.LeaseDuration = std::chrono::seconds(20); + bufferStream->Rewind(); + client.Append(*bufferStream, 0, options); + auto properties = client.GetProperties(); + EXPECT_TRUE(properties.Value.LeaseStatus.HasValue()); + EXPECT_EQ(Files::DataLake::Models::LeaseStatus::Locked, properties.Value.LeaseStatus.Value()); + EXPECT_TRUE(properties.Value.LeaseState.HasValue()); + EXPECT_EQ(Files::DataLake::Models::LeaseState::Leased, properties.Value.LeaseState.Value()); + EXPECT_TRUE(properties.Value.LeaseDuration.HasValue()); + EXPECT_EQ( + Files::DataLake::Models::LeaseDurationType::Fixed, + properties.Value.LeaseDuration.Value()); + } + // Append Lease AutoRenew + { + auto client = m_fileSystemClient->GetFileClient(GetTestNameLowerCase() + "_auto_renew"); + client.Create(); + const std::string leaseId = Files::DataLake::DataLakeLeaseClient::CreateUniqueLeaseId(); + Files::DataLake::DataLakeLeaseClient leaseClient(client, leaseId); + leaseClient.Acquire(std::chrono::seconds(20)); + Files::DataLake::AppendFileOptions options; + options.LeaseAction = Files::DataLake::Models::LeaseAction::AutoRenew; + options.AccessConditions.LeaseId = leaseId; + bufferStream->Rewind(); + auto response = client.Append(*bufferStream, 0, options); + EXPECT_TRUE(response.Value.IsLeaseRenewed.HasValue()); + auto properties = client.GetProperties(); + EXPECT_TRUE(properties.Value.LeaseStatus.HasValue()); + EXPECT_EQ(Files::DataLake::Models::LeaseStatus::Locked, properties.Value.LeaseStatus.Value()); + EXPECT_TRUE(properties.Value.LeaseState.HasValue()); + EXPECT_EQ(Files::DataLake::Models::LeaseState::Leased, properties.Value.LeaseState.Value()); + EXPECT_TRUE(properties.Value.LeaseDuration.HasValue()); + EXPECT_EQ( + Files::DataLake::Models::LeaseDurationType::Fixed, + properties.Value.LeaseDuration.Value()); + } + // Append Lease Release + { + auto client = m_fileSystemClient->GetFileClient(GetTestNameLowerCase() + "_release"); + client.Create(); + const std::string leaseId = Files::DataLake::DataLakeLeaseClient::CreateUniqueLeaseId(); + Files::DataLake::DataLakeLeaseClient leaseClient(client, leaseId); + leaseClient.Acquire(std::chrono::seconds(20)); + Files::DataLake::AppendFileOptions options; + options.LeaseAction = Files::DataLake::Models::LeaseAction::Release; + options.AccessConditions.LeaseId = leaseId; + options.Flush = true; + bufferStream->Rewind(); + client.Append(*bufferStream, 0, options); + auto properties = client.GetProperties(); + EXPECT_TRUE(properties.Value.LeaseStatus.HasValue()); + EXPECT_EQ( + Files::DataLake::Models::LeaseStatus::Unlocked, properties.Value.LeaseStatus.Value()); + EXPECT_TRUE(properties.Value.LeaseState.HasValue()); + EXPECT_EQ( + Files::DataLake::Models::LeaseState::Available, properties.Value.LeaseState.Value()); + } + // Append Lease AcquireRelease + { + auto client = m_fileSystemClient->GetFileClient(GetTestNameLowerCase() + "_acquire_release"); + client.Create(); + Files::DataLake::AppendFileOptions options; + options.LeaseAction = Files::DataLake::Models::LeaseAction::AcquireRelease; + options.LeaseId = Files::DataLake::DataLakeLeaseClient::CreateUniqueLeaseId(); + options.LeaseDuration = std::chrono::seconds(20); + options.Flush = true; + bufferStream->Rewind(); + client.Append(*bufferStream, 0, options); + auto properties = client.GetProperties(); + EXPECT_TRUE(properties.Value.LeaseStatus.HasValue()); + EXPECT_EQ( + Files::DataLake::Models::LeaseStatus::Unlocked, properties.Value.LeaseStatus.Value()); + EXPECT_TRUE(properties.Value.LeaseState.HasValue()); + EXPECT_EQ( + Files::DataLake::Models::LeaseState::Available, properties.Value.LeaseState.Value()); + } + } + + TEST_F(DataLakeFileClientTest, FlushFileWithLease) + { + const int32_t bufferSize = 4 * 1024; // 4KB data size + std::vector buffer(bufferSize, 'x'); + auto bufferStream = std::make_unique( + Azure::Core::IO::MemoryBodyStream(buffer)); + + // Flush Lease Acquire + { + auto client = m_fileSystemClient->GetFileClient(GetTestNameLowerCase() + "_acquire"); + client.Create(); + bufferStream->Rewind(); + client.Append(*bufferStream, 0); + Files::DataLake::FlushFileOptions options; + options.LeaseAction = Files::DataLake::Models::LeaseAction::Acquire; + options.LeaseId = Files::DataLake::DataLakeLeaseClient::CreateUniqueLeaseId(); + options.LeaseDuration = std::chrono::seconds(20); + client.Flush(bufferSize, options); + auto properties = client.GetProperties(); + EXPECT_TRUE(properties.Value.LeaseStatus.HasValue()); + EXPECT_EQ(Files::DataLake::Models::LeaseStatus::Locked, properties.Value.LeaseStatus.Value()); + EXPECT_TRUE(properties.Value.LeaseState.HasValue()); + EXPECT_EQ(Files::DataLake::Models::LeaseState::Leased, properties.Value.LeaseState.Value()); + EXPECT_TRUE(properties.Value.LeaseDuration.HasValue()); + EXPECT_EQ( + Files::DataLake::Models::LeaseDurationType::Fixed, + properties.Value.LeaseDuration.Value()); + } + // Flush Lease AutoRenew + { + auto client = m_fileSystemClient->GetFileClient(GetTestNameLowerCase() + "_auto_renew"); + client.Create(); + const std::string leaseId = Files::DataLake::DataLakeLeaseClient::CreateUniqueLeaseId(); + Files::DataLake::AppendFileOptions options; + options.LeaseAction = Files::DataLake::Models::LeaseAction::Acquire; + options.LeaseId = leaseId; + options.LeaseDuration = std::chrono::seconds(20); + bufferStream->Rewind(); + client.Append(*bufferStream, 0, options); + Files::DataLake::FlushFileOptions flushOptions; + flushOptions.LeaseAction = Files::DataLake::Models::LeaseAction::AutoRenew; + flushOptions.AccessConditions.LeaseId = leaseId; + auto response = client.Flush(bufferSize, flushOptions); + EXPECT_TRUE(response.Value.IsLeaseRenewed.HasValue()); + auto properties = client.GetProperties(); + EXPECT_TRUE(properties.Value.LeaseStatus.HasValue()); + EXPECT_EQ(Files::DataLake::Models::LeaseStatus::Locked, properties.Value.LeaseStatus.Value()); + EXPECT_TRUE(properties.Value.LeaseState.HasValue()); + EXPECT_EQ(Files::DataLake::Models::LeaseState::Leased, properties.Value.LeaseState.Value()); + EXPECT_TRUE(properties.Value.LeaseDuration.HasValue()); + EXPECT_EQ( + Files::DataLake::Models::LeaseDurationType::Fixed, + properties.Value.LeaseDuration.Value()); + } + // Flush Lease Release + { + auto client = m_fileSystemClient->GetFileClient(GetTestNameLowerCase() + "_release"); + client.Create(); + const std::string leaseId = Files::DataLake::DataLakeLeaseClient::CreateUniqueLeaseId(); + Files::DataLake::AppendFileOptions options; + options.LeaseAction = Files::DataLake::Models::LeaseAction::Acquire; + options.LeaseId = leaseId; + options.LeaseDuration = std::chrono::seconds(20); + bufferStream->Rewind(); + client.Append(*bufferStream, 0, options); + Files::DataLake::FlushFileOptions flushOptions; + flushOptions.LeaseAction = Files::DataLake::Models::LeaseAction::Release; + flushOptions.AccessConditions.LeaseId = leaseId; + client.Flush(bufferSize, flushOptions); + auto properties = client.GetProperties(); + EXPECT_TRUE(properties.Value.LeaseStatus.HasValue()); + EXPECT_EQ( + Files::DataLake::Models::LeaseStatus::Unlocked, properties.Value.LeaseStatus.Value()); + EXPECT_TRUE(properties.Value.LeaseState.HasValue()); + EXPECT_EQ( + Files::DataLake::Models::LeaseState::Available, properties.Value.LeaseState.Value()); + } + // Flush Lease AcquireRelease + { + auto client = m_fileSystemClient->GetFileClient(GetTestNameLowerCase() + "_acquire_release"); + client.Create(); + bufferStream->Rewind(); + client.Append(*bufferStream, 0); + Files::DataLake::FlushFileOptions options; + options.LeaseAction = Files::DataLake::Models::LeaseAction::AcquireRelease; + options.LeaseId = Files::DataLake::DataLakeLeaseClient::CreateUniqueLeaseId(); + options.LeaseDuration = std::chrono::seconds(20); + client.Flush(bufferSize, options); + auto properties = client.GetProperties(); + EXPECT_TRUE(properties.Value.LeaseStatus.HasValue()); + EXPECT_EQ( + Files::DataLake::Models::LeaseStatus::Unlocked, properties.Value.LeaseStatus.Value()); + EXPECT_TRUE(properties.Value.LeaseState.HasValue()); + EXPECT_EQ( + Files::DataLake::Models::LeaseState::Available, properties.Value.LeaseState.Value()); + } + } + TEST_F(DataLakeFileClientTest, FileReadReturns) { const int32_t bufferSize = 4 * 1024; // 4KB data size diff --git a/sdk/storage/azure-storage-files-shares/inc/azure/storage/files/shares/rest_client.hpp b/sdk/storage/azure-storage-files-shares/inc/azure/storage/files/shares/rest_client.hpp index 92e0068ea..371dc8e05 100644 --- a/sdk/storage/azure-storage-files-shares/inc/azure/storage/files/shares/rest_client.hpp +++ b/sdk/storage/azure-storage-files-shares/inc/azure/storage/files/shares/rest_client.hpp @@ -31,7 +31,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { /** * The version used for the operations to Azure storage services. */ - constexpr static const char* ApiVersion = "2021-06-08"; + constexpr static const char* ApiVersion = "2021-12-02"; } // namespace _detail namespace Models { /** @@ -956,6 +956,13 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { */ bool IsServerEncrypted = bool(); }; + namespace _detail { + struct StringEncoded final + { + bool Encoded = bool(); + std::string Content; + }; + } // namespace _detail /** * @brief File properties. */ @@ -969,17 +976,19 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { */ FileSmbProperties SmbProperties; }; - /** - * @brief A listed directory item. - */ - struct DirectoryItem final - { - std::string Name; + namespace _detail { /** - * File properties. + * @brief A listed directory item. */ - DirectoryItemDetails Details; - }; + struct DirectoryItem final + { + StringEncoded Name; + /** + * File properties. + */ + DirectoryItemDetails Details; + }; + } // namespace _detail /** * @brief File properties. */ @@ -1000,18 +1009,18 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { */ FileSmbProperties SmbProperties; }; - /** - * @brief A listed file item. - */ - struct FileItem final - { - std::string Name; - /** - * File properties. - */ - FileItemDetails Details; - }; namespace _detail { + /** + * @brief A listed file item. + */ + struct FileItem final + { + StringEncoded Name; + /** + * File properties. + */ + FileItemDetails Details; + }; /** * @brief Abstract for entries that can be listed from Directory. */ @@ -1067,8 +1076,9 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { std::string ServiceEndpoint; std::string ShareName; Nullable ShareSnapshot; + Nullable Encoded; std::string DirectoryPath; - std::string Prefix; + StringEncoded Prefix; Nullable Marker; Nullable MaxResults; /** @@ -1078,46 +1088,44 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { std::string NextMarker; Nullable DirectoryId; }; - } // namespace _detail - /** - * @brief A listed Azure Storage handle item. - */ - struct HandleItem final - { /** - * XSMB service handle ID. + * @brief A listed Azure Storage handle item. */ - std::string HandleId; - /** - * File or directory name including full path starting from share root. - */ - std::string Path; - /** - * FileId uniquely identifies the file or directory. - */ - std::string FileId; - /** - * ParentId uniquely identifies the parent directory of the object. - */ - std::string ParentId; - /** - * SMB session ID in context of which the file handle was opened. - */ - std::string SessionId; - /** - * Client IP that opened the handle. - */ - std::string ClientIp; - /** - * Time when the session that previously opened the handle has last been reconnected. (UTC). - */ - DateTime OpenedOn; - /** - * Time handle was last connected to (UTC). - */ - DateTime LastReconnectedOn; - }; - namespace _detail { + struct HandleItem final + { + /** + * XSMB service handle ID. + */ + std::string HandleId; + /** + * File or directory name including full path starting from share root. + */ + StringEncoded Path; + /** + * FileId uniquely identifies the file or directory. + */ + std::string FileId; + /** + * ParentId uniquely identifies the parent directory of the object. + */ + std::string ParentId; + /** + * SMB session ID in context of which the file handle was opened. + */ + std::string SessionId; + /** + * Client IP that opened the handle. + */ + std::string ClientIp; + /** + * Time when the session that previously opened the handle has last been reconnected. (UTC). + */ + DateTime OpenedOn; + /** + * Time handle was last connected to (UTC). + */ + DateTime LastReconnectedOn; + }; /** * @brief Response type for * #Azure::Storage::Files::Shares::DirectoryClient::ForceCloseHandles. diff --git a/sdk/storage/azure-storage-files-shares/inc/azure/storage/files/shares/share_responses.hpp b/sdk/storage/azure-storage-files-shares/inc/azure/storage/files/shares/share_responses.hpp index e8289b229..b14a22b3e 100644 --- a/sdk/storage/azure-storage-files-shares/inc/azure/storage/files/shares/share_responses.hpp +++ b/sdk/storage/azure-storage-files-shares/inc/azure/storage/files/shares/share_responses.hpp @@ -189,6 +189,69 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { */ DateTime LastModified; }; + + /** + * @brief A listed directory item. + */ + struct DirectoryItem final + { + std::string Name; + /** + * File properties. + */ + DirectoryItemDetails Details; + }; + + /** + * @brief A listed file item. + */ + struct FileItem final + { + std::string Name; + /** + * File properties. + */ + FileItemDetails Details; + }; + + /** + * @brief A listed Azure Storage handle item. + */ + struct HandleItem final + { + /** + * XSMB service handle ID. + */ + std::string HandleId; + /** + * File or directory name including full path starting from share root. + */ + std::string Path; + /** + * FileId uniquely identifies the file or directory. + */ + std::string FileId; + /** + * ParentId uniquely identifies the parent directory of the object. + */ + std::string ParentId; + /** + * SMB session ID in context of which the file handle was opened. + */ + std::string SessionId; + /** + * Client IP that opened the handle. + */ + std::string ClientIp; + /** + * Time when the session that previously opened the handle has last been reconnected. (UTC). + */ + DateTime OpenedOn; + /** + * Time handle was last connected to (UTC). + */ + DateTime LastReconnectedOn; + }; } // namespace Models /** diff --git a/sdk/storage/azure-storage-files-shares/src/rest_client.cpp b/sdk/storage/azure-storage-files-shares/src/rest_client.cpp index 7100363a1..746db51fe 100644 --- a/sdk/storage/azure-storage-files-shares/src/rest_client.cpp +++ b/sdk/storage/azure-storage-files-shares/src/rest_client.cpp @@ -312,7 +312,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { request.SetHeader("Content-Length", std::to_string(requestBody.Length())); request.GetUrl().AppendQueryParameter("restype", "service"); request.GetUrl().AppendQueryParameter("comp", "properties"); - request.SetHeader("x-ms-version", "2021-06-08"); + request.SetHeader("x-ms-version", "2021-12-02"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Accepted) @@ -332,7 +332,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { auto request = Core::Http::Request(Core::Http::HttpMethod::Get, url); request.GetUrl().AppendQueryParameter("restype", "service"); request.GetUrl().AppendQueryParameter("comp", "properties"); - request.SetHeader("x-ms-version", "2021-06-08"); + request.SetHeader("x-ms-version", "2021-12-02"); (void)options; auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); @@ -564,7 +564,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { _internal::UrlEncodeQueryParameter( ListSharesIncludeFlagsToString(options.Include.Value()))); } - request.SetHeader("x-ms-version", "2021-06-08"); + request.SetHeader("x-ms-version", "2021-12-02"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Ok) @@ -917,7 +917,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { { request.SetHeader("x-ms-access-tier", options.AccessTier.Value().ToString()); } - request.SetHeader("x-ms-version", "2021-06-08"); + request.SetHeader("x-ms-version", "2021-12-02"); if (options.EnabledProtocols.HasValue() && !options.EnabledProtocols.Value().ToString().empty()) { @@ -952,7 +952,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { request.GetUrl().AppendQueryParameter( "sharesnapshot", _internal::UrlEncodeQueryParameter(options.Sharesnapshot.Value())); } - request.SetHeader("x-ms-version", "2021-06-08"); + request.SetHeader("x-ms-version", "2021-12-02"); if (options.LeaseId.HasValue() && !options.LeaseId.Value().empty()) { request.SetHeader("x-ms-lease-id", options.LeaseId.Value()); @@ -1054,7 +1054,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { request.GetUrl().AppendQueryParameter( "sharesnapshot", _internal::UrlEncodeQueryParameter(options.Sharesnapshot.Value())); } - request.SetHeader("x-ms-version", "2021-06-08"); + request.SetHeader("x-ms-version", "2021-12-02"); if (options.DeleteSnapshots.HasValue() && !options.DeleteSnapshots.Value().ToString().empty()) { request.SetHeader("x-ms-delete-snapshots", options.DeleteSnapshots.Value().ToString()); @@ -1090,7 +1090,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { { request.SetHeader("x-ms-proposed-lease-id", options.ProposedLeaseId.Value()); } - request.SetHeader("x-ms-version", "2021-06-08"); + request.SetHeader("x-ms-version", "2021-12-02"); if (options.Sharesnapshot.HasValue() && !options.Sharesnapshot.Value().empty()) { request.GetUrl().AppendQueryParameter( @@ -1124,7 +1124,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { { request.SetHeader("x-ms-lease-id", options.LeaseId); } - request.SetHeader("x-ms-version", "2021-06-08"); + request.SetHeader("x-ms-version", "2021-12-02"); if (options.Sharesnapshot.HasValue() && !options.Sharesnapshot.Value().empty()) { request.GetUrl().AppendQueryParameter( @@ -1161,7 +1161,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { { request.SetHeader("x-ms-proposed-lease-id", options.ProposedLeaseId.Value()); } - request.SetHeader("x-ms-version", "2021-06-08"); + request.SetHeader("x-ms-version", "2021-12-02"); if (options.Sharesnapshot.HasValue() && !options.Sharesnapshot.Value().empty()) { request.GetUrl().AppendQueryParameter( @@ -1195,7 +1195,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { { request.SetHeader("x-ms-lease-id", options.LeaseId); } - request.SetHeader("x-ms-version", "2021-06-08"); + request.SetHeader("x-ms-version", "2021-12-02"); if (options.Sharesnapshot.HasValue() && !options.Sharesnapshot.Value().empty()) { request.GetUrl().AppendQueryParameter( @@ -1233,7 +1233,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { { request.SetHeader("x-ms-lease-id", options.LeaseId.Value()); } - request.SetHeader("x-ms-version", "2021-06-08"); + request.SetHeader("x-ms-version", "2021-12-02"); if (options.Sharesnapshot.HasValue() && !options.Sharesnapshot.Value().empty()) { request.GetUrl().AppendQueryParameter( @@ -1266,7 +1266,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { { request.SetHeader("x-ms-meta-" + p.first, p.second); } - request.SetHeader("x-ms-version", "2021-06-08"); + request.SetHeader("x-ms-version", "2021-12-02"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Created) @@ -1300,7 +1300,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { request.SetHeader("Content-Length", std::to_string(requestBody.Length())); request.GetUrl().AppendQueryParameter("restype", "share"); request.GetUrl().AppendQueryParameter("comp", "filepermission"); - request.SetHeader("x-ms-version", "2021-06-08"); + request.SetHeader("x-ms-version", "2021-12-02"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Created) @@ -1325,7 +1325,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { { request.SetHeader("x-ms-file-permission-key", options.FilePermissionKey); } - request.SetHeader("x-ms-version", "2021-06-08"); + request.SetHeader("x-ms-version", "2021-12-02"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Ok) @@ -1351,7 +1351,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { auto request = Core::Http::Request(Core::Http::HttpMethod::Put, url); request.GetUrl().AppendQueryParameter("restype", "share"); request.GetUrl().AppendQueryParameter("comp", "properties"); - request.SetHeader("x-ms-version", "2021-06-08"); + request.SetHeader("x-ms-version", "2021-12-02"); if (options.Quota.HasValue()) { request.SetHeader("x-ms-share-quota", std::to_string(options.Quota.Value())); @@ -1394,7 +1394,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { { request.SetHeader("x-ms-meta-" + p.first, p.second); } - request.SetHeader("x-ms-version", "2021-06-08"); + request.SetHeader("x-ms-version", "2021-12-02"); if (options.LeaseId.HasValue() && !options.LeaseId.Value().empty()) { request.SetHeader("x-ms-lease-id", options.LeaseId.Value()); @@ -1420,7 +1420,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { auto request = Core::Http::Request(Core::Http::HttpMethod::Get, url); request.GetUrl().AppendQueryParameter("restype", "share"); request.GetUrl().AppendQueryParameter("comp", "acl"); - request.SetHeader("x-ms-version", "2021-06-08"); + request.SetHeader("x-ms-version", "2021-12-02"); if (options.LeaseId.HasValue() && !options.LeaseId.Value().empty()) { request.SetHeader("x-ms-lease-id", options.LeaseId.Value()); @@ -1567,7 +1567,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { request.SetHeader("Content-Length", std::to_string(requestBody.Length())); request.GetUrl().AppendQueryParameter("restype", "share"); request.GetUrl().AppendQueryParameter("comp", "acl"); - request.SetHeader("x-ms-version", "2021-06-08"); + request.SetHeader("x-ms-version", "2021-12-02"); if (options.LeaseId.HasValue() && !options.LeaseId.Value().empty()) { request.SetHeader("x-ms-lease-id", options.LeaseId.Value()); @@ -1594,7 +1594,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { auto request = Core::Http::Request(Core::Http::HttpMethod::Get, url); request.GetUrl().AppendQueryParameter("restype", "share"); request.GetUrl().AppendQueryParameter("comp", "stats"); - request.SetHeader("x-ms-version", "2021-06-08"); + request.SetHeader("x-ms-version", "2021-12-02"); if (options.LeaseId.HasValue() && !options.LeaseId.Value().empty()) { request.SetHeader("x-ms-lease-id", options.LeaseId.Value()); @@ -1669,7 +1669,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { { request.SetHeader("x-ms-meta-" + p.first, p.second); } - request.SetHeader("x-ms-version", "2021-06-08"); + request.SetHeader("x-ms-version", "2021-12-02"); if (options.FilePermission.HasValue() && !options.FilePermission.Value().empty()) { request.SetHeader("x-ms-file-permission", options.FilePermission.Value()); @@ -1748,7 +1748,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { request.GetUrl().AppendQueryParameter( "sharesnapshot", _internal::UrlEncodeQueryParameter(options.Sharesnapshot.Value())); } - request.SetHeader("x-ms-version", "2021-06-08"); + request.SetHeader("x-ms-version", "2021-12-02"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Ok) @@ -1804,7 +1804,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { { auto request = Core::Http::Request(Core::Http::HttpMethod::Delete, url); request.GetUrl().AppendQueryParameter("restype", "directory"); - request.SetHeader("x-ms-version", "2021-06-08"); + request.SetHeader("x-ms-version", "2021-12-02"); (void)options; auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); @@ -1824,7 +1824,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { auto request = Core::Http::Request(Core::Http::HttpMethod::Put, url); request.GetUrl().AppendQueryParameter("restype", "directory"); request.GetUrl().AppendQueryParameter("comp", "properties"); - request.SetHeader("x-ms-version", "2021-06-08"); + request.SetHeader("x-ms-version", "2021-12-02"); if (options.FilePermission.HasValue() && !options.FilePermission.Value().empty()) { request.SetHeader("x-ms-file-permission", options.FilePermission.Value()); @@ -1904,7 +1904,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { { request.SetHeader("x-ms-meta-" + p.first, p.second); } - request.SetHeader("x-ms-version", "2021-06-08"); + request.SetHeader("x-ms-version", "2021-12-02"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Ok) @@ -1948,7 +1948,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { request.GetUrl().AppendQueryParameter( "maxresults", std::to_string(options.MaxResults.Value())); } - request.SetHeader("x-ms-version", "2021-06-08"); + request.SetHeader("x-ms-version", "2021-12-02"); if (options.Include.HasValue() && !ListFilesIncludeFlagsToString(options.Include.Value()).empty()) { @@ -2022,8 +2022,8 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { {"DirectoryId", XmlTagEnum::kDirectoryId}, }; std::vector xmlPath; - Models::DirectoryItem vectorElement1; - Models::FileItem vectorElement2; + Models::_detail::DirectoryItem vectorElement1; + Models::_detail::FileItem vectorElement2; while (true) { auto node = reader.Read(); @@ -2041,7 +2041,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { if (xmlPath.size() == 2 && xmlPath[0] == XmlTagEnum::kEnumerationResults && xmlPath[1] == XmlTagEnum::kPrefix) { - response.Prefix = node.Value; + response.Prefix.Content = node.Value; } else if ( xmlPath.size() == 2 && xmlPath[0] == XmlTagEnum::kEnumerationResults @@ -2060,7 +2060,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { && xmlPath[1] == XmlTagEnum::kEntries && xmlPath[2] == XmlTagEnum::kDirectory && xmlPath[3] == XmlTagEnum::kName) { - vectorElement1.Name = node.Value; + vectorElement1.Name.Content = node.Value; } else if ( xmlPath.size() == 5 && xmlPath[0] == XmlTagEnum::kEnumerationResults @@ -2137,7 +2137,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { && xmlPath[1] == XmlTagEnum::kEntries && xmlPath[2] == XmlTagEnum::kFile && xmlPath[3] == XmlTagEnum::kName) { - vectorElement2.Name = node.Value; + vectorElement2.Name.Content = node.Value; } else if ( xmlPath.size() == 5 && xmlPath[0] == XmlTagEnum::kEnumerationResults @@ -2249,12 +2249,38 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { { response.ShareSnapshot = node.Value; } + else if ( + xmlPath.size() == 1 && xmlPath[0] == XmlTagEnum::kEnumerationResults + && node.Name == "Encoded") + { + response.Encoded = node.Value == std::string("true"); + } else if ( xmlPath.size() == 1 && xmlPath[0] == XmlTagEnum::kEnumerationResults && node.Name == "DirectoryPath") { response.DirectoryPath = node.Value; } + else if ( + xmlPath.size() == 2 && xmlPath[0] == XmlTagEnum::kEnumerationResults + && xmlPath[1] == XmlTagEnum::kPrefix && node.Name == "Encoded") + { + response.Prefix.Encoded = node.Value == std::string("true"); + } + else if ( + xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kEnumerationResults + && xmlPath[1] == XmlTagEnum::kEntries && xmlPath[2] == XmlTagEnum::kDirectory + && xmlPath[3] == XmlTagEnum::kName && node.Name == "Encoded") + { + vectorElement1.Name.Encoded = node.Value == std::string("true"); + } + else if ( + xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kEnumerationResults + && xmlPath[1] == XmlTagEnum::kEntries && xmlPath[2] == XmlTagEnum::kFile + && xmlPath[3] == XmlTagEnum::kName && node.Name == "Encoded") + { + vectorElement2.Name.Encoded = node.Value == std::string("true"); + } } else if (node.Type == _internal::XmlNodeType::EndTag) { @@ -2262,14 +2288,14 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { && xmlPath[1] == XmlTagEnum::kEntries && xmlPath[2] == XmlTagEnum::kDirectory) { response.Segment.DirectoryItems.push_back(std::move(vectorElement1)); - vectorElement1 = Models::DirectoryItem(); + vectorElement1 = Models::_detail::DirectoryItem(); } else if ( xmlPath.size() == 3 && xmlPath[0] == XmlTagEnum::kEnumerationResults && xmlPath[1] == XmlTagEnum::kEntries && xmlPath[2] == XmlTagEnum::kFile) { response.Segment.FileItems.push_back(std::move(vectorElement2)); - vectorElement2 = Models::FileItem(); + vectorElement2 = Models::_detail::FileItem(); } xmlPath.pop_back(); } @@ -2305,7 +2331,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { { request.SetHeader("x-ms-recursive", options.Recursive.Value() ? "true" : "false"); } - request.SetHeader("x-ms-version", "2021-06-08"); + request.SetHeader("x-ms-version", "2021-12-02"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Ok) @@ -2348,7 +2374,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { {"NextMarker", XmlTagEnum::kNextMarker}, }; std::vector xmlPath; - Models::HandleItem vectorElement1; + Models::_detail::HandleItem vectorElement1; while (true) { auto node = reader.Read(); @@ -2374,7 +2400,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { && xmlPath[1] == XmlTagEnum::kHandleList && xmlPath[2] == XmlTagEnum::kHandle && xmlPath[3] == XmlTagEnum::kPath) { - vectorElement1.Path = node.Value; + vectorElement1.Path.Content = node.Value; } else if ( xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kEnumerationResults @@ -2429,6 +2455,12 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { } else if (node.Type == _internal::XmlNodeType::Attribute) { + if (xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kEnumerationResults + && xmlPath[1] == XmlTagEnum::kHandleList && xmlPath[2] == XmlTagEnum::kHandle + && xmlPath[3] == XmlTagEnum::kPath && node.Name == "Encoded") + { + vectorElement1.Path.Encoded = node.Value == std::string("true"); + } } else if (node.Type == _internal::XmlNodeType::EndTag) { @@ -2436,7 +2468,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { && xmlPath[1] == XmlTagEnum::kHandleList && xmlPath[2] == XmlTagEnum::kHandle) { response.HandleList.push_back(std::move(vectorElement1)); - vectorElement1 = Models::HandleItem(); + vectorElement1 = Models::_detail::HandleItem(); } xmlPath.pop_back(); } @@ -2471,7 +2503,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { { request.SetHeader("x-ms-recursive", options.Recursive.Value() ? "true" : "false"); } - request.SetHeader("x-ms-version", "2021-06-08"); + request.SetHeader("x-ms-version", "2021-12-02"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Ok) @@ -2499,7 +2531,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { auto request = Core::Http::Request(Core::Http::HttpMethod::Put, url); request.GetUrl().AppendQueryParameter("restype", "directory"); request.GetUrl().AppendQueryParameter("comp", "rename"); - request.SetHeader("x-ms-version", "2021-06-08"); + request.SetHeader("x-ms-version", "2021-12-02"); if (!options.RenameSource.empty()) { request.SetHeader("x-ms-file-rename-source", options.RenameSource); @@ -2586,7 +2618,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { const Core::Context& context) { auto request = Core::Http::Request(Core::Http::HttpMethod::Put, url); - request.SetHeader("x-ms-version", "2021-06-08"); + request.SetHeader("x-ms-version", "2021-12-02"); request.SetHeader("x-ms-content-length", std::to_string(options.FileContentLength)); request.SetHeader("x-ms-type", "file"); if (options.FileContentType.HasValue() && !options.FileContentType.Value().empty()) @@ -2696,7 +2728,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { const Core::Context& context) { auto request = Core::Http::Request(Core::Http::HttpMethod::Get, url, false); - request.SetHeader("x-ms-version", "2021-06-08"); + request.SetHeader("x-ms-version", "2021-12-02"); if (options.Range.HasValue() && !options.Range.Value().empty()) { request.SetHeader("x-ms-range", options.Range.Value()); @@ -2871,7 +2903,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { request.GetUrl().AppendQueryParameter( "sharesnapshot", _internal::UrlEncodeQueryParameter(options.Sharesnapshot.Value())); } - request.SetHeader("x-ms-version", "2021-06-08"); + request.SetHeader("x-ms-version", "2021-12-02"); if (options.LeaseId.HasValue() && !options.LeaseId.Value().empty()) { request.SetHeader("x-ms-lease-id", options.LeaseId.Value()); @@ -2999,7 +3031,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { const Core::Context& context) { auto request = Core::Http::Request(Core::Http::HttpMethod::Delete, url); - request.SetHeader("x-ms-version", "2021-06-08"); + request.SetHeader("x-ms-version", "2021-12-02"); if (options.LeaseId.HasValue() && !options.LeaseId.Value().empty()) { request.SetHeader("x-ms-lease-id", options.LeaseId.Value()); @@ -3021,7 +3053,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { { auto request = Core::Http::Request(Core::Http::HttpMethod::Put, url); request.GetUrl().AppendQueryParameter("comp", "properties"); - request.SetHeader("x-ms-version", "2021-06-08"); + request.SetHeader("x-ms-version", "2021-12-02"); if (options.FileContentLength.HasValue()) { request.SetHeader("x-ms-content-length", std::to_string(options.FileContentLength.Value())); @@ -3135,7 +3167,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { { request.SetHeader("x-ms-meta-" + p.first, p.second); } - request.SetHeader("x-ms-version", "2021-06-08"); + request.SetHeader("x-ms-version", "2021-12-02"); if (options.LeaseId.HasValue() && !options.LeaseId.Value().empty()) { request.SetHeader("x-ms-lease-id", options.LeaseId.Value()); @@ -3169,7 +3201,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { { request.SetHeader("x-ms-proposed-lease-id", options.ProposedLeaseId.Value()); } - request.SetHeader("x-ms-version", "2021-06-08"); + request.SetHeader("x-ms-version", "2021-12-02"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Created) @@ -3197,7 +3229,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { { request.SetHeader("x-ms-lease-id", options.LeaseId); } - request.SetHeader("x-ms-version", "2021-06-08"); + request.SetHeader("x-ms-version", "2021-12-02"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Ok) @@ -3228,7 +3260,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { { request.SetHeader("x-ms-proposed-lease-id", options.ProposedLeaseId.Value()); } - request.SetHeader("x-ms-version", "2021-06-08"); + request.SetHeader("x-ms-version", "2021-12-02"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Ok) @@ -3256,7 +3288,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { { request.SetHeader("x-ms-lease-id", options.LeaseId.Value()); } - request.SetHeader("x-ms-version", "2021-06-08"); + request.SetHeader("x-ms-version", "2021-12-02"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Accepted) @@ -3293,7 +3325,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { { request.SetHeader("Content-MD5", Core::Convert::Base64Encode(options.ContentMD5.Value())); } - request.SetHeader("x-ms-version", "2021-06-08"); + request.SetHeader("x-ms-version", "2021-12-02"); if (options.LeaseId.HasValue() && !options.LeaseId.Value().empty()) { request.SetHeader("x-ms-lease-id", options.LeaseId.Value()); @@ -3370,7 +3402,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { "x-ms-source-if-none-match-crc64", Core::Convert::Base64Encode(options.SourceIfNoneMatchCrc64.Value())); } - request.SetHeader("x-ms-version", "2021-06-08"); + request.SetHeader("x-ms-version", "2021-12-02"); if (options.LeaseId.HasValue() && !options.LeaseId.Value().empty()) { request.SetHeader("x-ms-lease-id", options.LeaseId.Value()); @@ -3430,7 +3462,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { "prevsharesnapshot", _internal::UrlEncodeQueryParameter(options.Prevsharesnapshot.Value())); } - request.SetHeader("x-ms-version", "2021-06-08"); + request.SetHeader("x-ms-version", "2021-12-02"); if (options.Range.HasValue() && !options.Range.Value().empty()) { request.SetHeader("x-ms-range", options.Range.Value()); @@ -3544,7 +3576,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { const Core::Context& context) { auto request = Core::Http::Request(Core::Http::HttpMethod::Put, url); - request.SetHeader("x-ms-version", "2021-06-08"); + request.SetHeader("x-ms-version", "2021-12-02"); for (const auto& p : options.Metadata) { request.SetHeader("x-ms-meta-" + p.first, p.second); @@ -3626,7 +3658,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { "copyid", _internal::UrlEncodeQueryParameter(options.CopyId)); } request.SetHeader("x-ms-copy-action", "abort"); - request.SetHeader("x-ms-version", "2021-06-08"); + request.SetHeader("x-ms-version", "2021-12-02"); if (options.LeaseId.HasValue() && !options.LeaseId.Value().empty()) { request.SetHeader("x-ms-lease-id", options.LeaseId.Value()); @@ -3663,7 +3695,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { request.GetUrl().AppendQueryParameter( "sharesnapshot", _internal::UrlEncodeQueryParameter(options.Sharesnapshot.Value())); } - request.SetHeader("x-ms-version", "2021-06-08"); + request.SetHeader("x-ms-version", "2021-12-02"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Ok) @@ -3706,7 +3738,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { {"NextMarker", XmlTagEnum::kNextMarker}, }; std::vector xmlPath; - Models::HandleItem vectorElement1; + Models::_detail::HandleItem vectorElement1; while (true) { auto node = reader.Read(); @@ -3732,7 +3764,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { && xmlPath[1] == XmlTagEnum::kHandleList && xmlPath[2] == XmlTagEnum::kHandle && xmlPath[3] == XmlTagEnum::kPath) { - vectorElement1.Path = node.Value; + vectorElement1.Path.Content = node.Value; } else if ( xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kEnumerationResults @@ -3787,6 +3819,12 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { } else if (node.Type == _internal::XmlNodeType::Attribute) { + if (xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kEnumerationResults + && xmlPath[1] == XmlTagEnum::kHandleList && xmlPath[2] == XmlTagEnum::kHandle + && xmlPath[3] == XmlTagEnum::kPath && node.Name == "Encoded") + { + vectorElement1.Path.Encoded = node.Value == std::string("true"); + } } else if (node.Type == _internal::XmlNodeType::EndTag) { @@ -3794,7 +3832,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { && xmlPath[1] == XmlTagEnum::kHandleList && xmlPath[2] == XmlTagEnum::kHandle) { response.HandleList.push_back(std::move(vectorElement1)); - vectorElement1 = Models::HandleItem(); + vectorElement1 = Models::_detail::HandleItem(); } xmlPath.pop_back(); } @@ -3825,7 +3863,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { { request.SetHeader("x-ms-handle-id", options.HandleId); } - request.SetHeader("x-ms-version", "2021-06-08"); + request.SetHeader("x-ms-version", "2021-12-02"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Ok) @@ -3852,7 +3890,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { { auto request = Core::Http::Request(Core::Http::HttpMethod::Put, url); request.GetUrl().AppendQueryParameter("comp", "rename"); - request.SetHeader("x-ms-version", "2021-06-08"); + request.SetHeader("x-ms-version", "2021-12-02"); if (!options.RenameSource.empty()) { request.SetHeader("x-ms-file-rename-source", options.RenameSource); diff --git a/sdk/storage/azure-storage-files-shares/src/share_directory_client.cpp b/sdk/storage/azure-storage-files-shares/src/share_directory_client.cpp index ada8cbe57..c47a6ee18 100644 --- a/sdk/storage/azure-storage-files-shares/src/share_directory_client.cpp +++ b/sdk/storage/azure-storage-files-shares/src/share_directory_client.cpp @@ -437,10 +437,50 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { pagedResponse.ServiceEndpoint = std::move(response.Value.ServiceEndpoint); pagedResponse.ShareName = std::move(response.Value.ShareName); pagedResponse.ShareSnapshot = response.Value.ShareSnapshot.ValueOr(std::string()); - pagedResponse.DirectoryPath = std::move(response.Value.DirectoryPath); - pagedResponse.Prefix = std::move(response.Value.Prefix); - pagedResponse.Directories = std::move(response.Value.Segment.DirectoryItems); - pagedResponse.Files = std::move(response.Value.Segment.FileItems); + if (response.Value.Encoded) + { + pagedResponse.DirectoryPath = Core::Url::Decode(response.Value.DirectoryPath); + } + else + { + pagedResponse.DirectoryPath = std::move(response.Value.DirectoryPath); + } + if (response.Value.Prefix.Encoded) + { + pagedResponse.Prefix = Core::Url::Decode(response.Value.Prefix.Content); + } + else + { + pagedResponse.Prefix = std::move(response.Value.Prefix.Content); + } + for (auto& item : response.Value.Segment.DirectoryItems) + { + Models::DirectoryItem directoryItem; + if (item.Name.Encoded) + { + directoryItem.Name = Core::Url::Decode(item.Name.Content); + } + else + { + directoryItem.Name = std::move(item.Name.Content); + } + directoryItem.Details = std::move(item.Details); + pagedResponse.Directories.push_back(std::move(directoryItem)); + } + for (auto& item : response.Value.Segment.FileItems) + { + Models::FileItem fileItem; + if (item.Name.Encoded) + { + fileItem.Name = Core::Url::Decode(item.Name.Content); + } + else + { + fileItem.Name = std::move(item.Name.Content); + } + fileItem.Details = std::move(item.Details); + pagedResponse.Files.push_back(std::move(fileItem)); + } pagedResponse.DirectoryId = response.Value.DirectoryId.ValueOr(std::string()); pagedResponse.m_shareDirectoryClient = std::make_shared(*this); pagedResponse.m_operationOptions = options; @@ -464,7 +504,27 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { ListDirectoryHandlesPagedResponse pagedResponse; - pagedResponse.DirectoryHandles = std::move(response.Value.HandleList); + for (auto& handle : response.Value.HandleList) + { + Models::HandleItem directoryHandle; + if (handle.Path.Encoded) + { + directoryHandle.Path = Core::Url::Decode(handle.Path.Content); + } + else + { + directoryHandle.Path = std::move(handle.Path.Content); + } + directoryHandle.ClientIp = std::move(handle.ClientIp); + directoryHandle.FileId = std::move(handle.FileId); + directoryHandle.HandleId = std::move(handle.HandleId); + directoryHandle.LastReconnectedOn = std::move(handle.LastReconnectedOn); + directoryHandle.OpenedOn = std::move(handle.OpenedOn); + directoryHandle.ParentId = std::move(handle.ParentId); + directoryHandle.SessionId = std::move(handle.SessionId); + + pagedResponse.DirectoryHandles.push_back(std::move(directoryHandle)); + } pagedResponse.m_shareDirectoryClient = std::make_shared(*this); pagedResponse.m_operationOptions = options; pagedResponse.CurrentPageToken = options.ContinuationToken.ValueOr(std::string()); diff --git a/sdk/storage/azure-storage-files-shares/src/share_file_client.cpp b/sdk/storage/azure-storage-files-shares/src/share_file_client.cpp index 766b0778a..57fa432aa 100644 --- a/sdk/storage/azure-storage-files-shares/src/share_file_client.cpp +++ b/sdk/storage/azure-storage-files-shares/src/share_file_client.cpp @@ -617,7 +617,27 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { ListFileHandlesPagedResponse pagedResponse; - pagedResponse.FileHandles = std::move(response.Value.HandleList); + for (auto& handle : response.Value.HandleList) + { + Models::HandleItem fileHandle; + if (handle.Path.Encoded) + { + fileHandle.Path = Core::Url::Decode(handle.Path.Content); + } + else + { + fileHandle.Path = std::move(handle.Path.Content); + } + fileHandle.ClientIp = std::move(handle.ClientIp); + fileHandle.FileId = std::move(handle.FileId); + fileHandle.HandleId = std::move(handle.HandleId); + fileHandle.LastReconnectedOn = std::move(handle.LastReconnectedOn); + fileHandle.OpenedOn = std::move(handle.OpenedOn); + fileHandle.ParentId = std::move(handle.ParentId); + fileHandle.SessionId = std::move(handle.SessionId); + + pagedResponse.FileHandles.push_back(std::move(fileHandle)); + } pagedResponse.m_shareFileClient = std::make_shared(*this); pagedResponse.m_operationOptions = options; pagedResponse.CurrentPageToken = options.ContinuationToken.ValueOr(std::string()); diff --git a/sdk/storage/azure-storage-files-shares/swagger/README.md b/sdk/storage/azure-storage-files-shares/swagger/README.md index 3c6784af8..d35b2a83f 100644 --- a/sdk/storage/azure-storage-files-shares/swagger/README.md +++ b/sdk/storage/azure-storage-files-shares/swagger/README.md @@ -9,7 +9,7 @@ package-name: azure-storage-files-shares namespace: Azure::Storage::Files::Shares output-folder: generated clear-output-folder: true -input-file: https://raw.githubusercontent.com/Azure/azure-rest-api-specs/main/specification/storage/data-plane/Microsoft.FileStorage/preview/2021-06-08/file.json +input-file: https://raw.githubusercontent.com/Azure/azure-rest-api-specs/main/specification/storage/data-plane/Microsoft.FileStorage/preview/2021-12-02/file.json ``` ## ModelFour Options @@ -79,13 +79,13 @@ directive: "name": "ApiVersion", "modelAsString": false }, - "enum": ["2021-06-08"], + "enum": ["2021-12-02"], "description": "The version used for the operations to Azure storage services." }; - from: swagger-document where: $.parameters transform: > - $.ApiVersionParameter.enum[0] = "2021-06-08"; + $.ApiVersionParameter.enum[0] = "2021-12-02"; ``` ### Rename Operations @@ -307,6 +307,10 @@ directive: $.ShareEnabledProtocols["enum"] = ["Smb", "Nfs"]; $.ShareEnabledProtocols["x-ms-enum"] = {"name": "ShareProtocols", "modelAsString": false}; $.ShareEnabledProtocols["x-ms-enum"]["values"] = [{"value": "SMB", "name": "Smb"},{"value": "NFS", "name": "Nfs"}]; + $.StringEncoded["x-namespace"] = "_detail"; + delete $.StringEncoded.properties["content"]["xml"]; + $.StringEncoded["xml"] = {"name": "Name"}; + $.StringEncoded.properties["content"]["x-ms-xml"] = {"name": "."}; - from: swagger-document where: $["x-ms-paths"].*.*.responses.*.headers transform: > @@ -553,7 +557,8 @@ directive: delete $.FileItem.properties["PermissionKey"]; delete $.FileItem.required; $.FileItem.properties["Details"] = {"$ref": "#/definitions/FileItemDetails", "x-ms-xml" : {"name": "Properties"}}; - + $.FileItem["x-namespace"] = "_detail"; + delete $.DirectoryItem.properties["Properties"]; delete $.DirectoryItem.properties["FileId"]; delete $.DirectoryItem.properties["Attributes"]; @@ -562,7 +567,8 @@ directive: $.DirectoryItemDetails = JSON.parse(JSON.stringify($.FileItemDetails)); delete $.DirectoryItemDetails.properties["Content-Length"]; $.DirectoryItem.properties["Details"] = {"$ref": "#/definitions/DirectoryItemDetails", "x-ms-xml" : {"name": "Properties"}}; - + $.DirectoryItem["x-namespace"] = "_detail"; + $.FilesAndDirectoriesListSegment.properties["DirectoryItems"]["x-ms-xml"] = {"name": "."}; $.FilesAndDirectoriesListSegment.properties["FileItems"]["x-ms-xml"] = {"name": "."}; ``` @@ -577,6 +583,8 @@ directive: delete $.HandleItem.required; $.HandleItem.properties["OpenTime"]["x-ms-client-name"] = "OpenedOn"; $.HandleItem.properties["LastReconnectTime"]["x-ms-client-name"] = "LastReconnectedOn"; + $.HandleItem.properties["Path"]["description"] = "File or directory name including full path starting from share root."; + $.HandleItem["x-namespace"] = "_detail"; ``` ### ForceCloseFileHandles diff --git a/sdk/storage/azure-storage-files-shares/test/ut/share_directory_client_test.cpp b/sdk/storage/azure-storage-files-shares/test/ut/share_directory_client_test.cpp index 6321ca4f7..6e278e1d0 100644 --- a/sdk/storage/azure-storage-files-shares/test/ut/share_directory_client_test.cpp +++ b/sdk/storage/azure-storage-files-shares/test/ut/share_directory_client_test.cpp @@ -820,6 +820,37 @@ namespace Azure { namespace Storage { namespace Test { } } + TEST_F(FileShareDirectoryClientTest, ListFilesAndDirectoriesEncoded) + { + const std::string prefix = "prefix\xEF\xBF\xBF"; + const std::string specialParentDirectoryName = prefix + "directory_parent"; + const std::string specialFileName = prefix + "file"; + const std::string specialDirectoryName = prefix + "directory"; + auto parentDirectoryClient + = m_shareClient->GetRootDirectoryClient().GetSubdirectoryClient(specialParentDirectoryName); + auto fileClient = parentDirectoryClient.GetFileClient(specialFileName); + auto directoryClient = parentDirectoryClient.GetSubdirectoryClient(specialDirectoryName); + parentDirectoryClient.Create(); + fileClient.Create(1024); + directoryClient.Create(); + auto fileUrl = fileClient.GetUrl(); + EXPECT_EQ( + fileUrl, parentDirectoryClient.GetUrl() + "/" + _internal::UrlEncodePath(specialFileName)); + auto directoryUrl = directoryClient.GetUrl(); + EXPECT_EQ( + directoryUrl, + parentDirectoryClient.GetUrl() + "/" + _internal::UrlEncodePath(specialDirectoryName)); + Files::Shares::ListFilesAndDirectoriesOptions options; + options.Prefix = prefix; + auto response = parentDirectoryClient.ListFilesAndDirectories(options); + EXPECT_EQ(response.DirectoryPath, specialParentDirectoryName); + EXPECT_EQ(response.Prefix, prefix); + EXPECT_EQ(response.Directories.size(), 1L); + EXPECT_EQ(response.Directories[0].Name, specialDirectoryName); + EXPECT_EQ(response.Files.size(), 1L); + EXPECT_EQ(response.Files[0].Name, specialFileName); + } + TEST_F(FileShareDirectoryClientTest, HandlesFunctionalityWorks) { auto result = m_fileShareDirectoryClient->ListHandles();