diff --git a/.vscode/cspell.json b/.vscode/cspell.json index 77305e988d..37bd71ed91 100644 --- a/.vscode/cspell.json +++ b/.vscode/cspell.json @@ -224,6 +224,12 @@ "numofmessages" ] }, + { + "filename": "**/sdk/storage/azure-storage-files-shares/**/*", + "words": [ + "mibps" + ] + }, { "filename": "**/cmake-modules/**/*", "words": [ 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 d5881956ac..cb6f59c01d 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 = "2020-02-10"; + constexpr static const char* ApiVersion = "2021-06-08"; } // namespace _detail namespace Models { /** @@ -232,6 +232,39 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { AZ_STORAGE_FILES_SHARES_DLLEXPORT const static LeaseDurationType Infinite; AZ_STORAGE_FILES_SHARES_DLLEXPORT const static LeaseDurationType Fixed; + private: + std::string m_value; + }; + /** + * @brief The protocols that have been enabled on the share. + */ + class ShareProtocols final { + public: + ShareProtocols() = default; + explicit ShareProtocols(std::string value) : m_value(std::move(value)) {} + bool operator==(const ShareProtocols& other) const { return m_value == other.m_value; } + bool operator!=(const ShareProtocols& other) const { return !(*this == other); } + const std::string& ToString() const { return m_value; } + AZ_STORAGE_FILES_SHARES_DLLEXPORT const static ShareProtocols Smb; + AZ_STORAGE_FILES_SHARES_DLLEXPORT const static ShareProtocols Nfs; + + private: + std::string m_value; + }; + /** + * @brief Root squash to set on the share. Only valid for NFS shares. + */ + class ShareRootSquash final { + public: + ShareRootSquash() = default; + explicit ShareRootSquash(std::string value) : m_value(std::move(value)) {} + bool operator==(const ShareRootSquash& other) const { return m_value == other.m_value; } + bool operator!=(const ShareRootSquash& other) const { return !(*this == other); } + const std::string& ToString() const { return m_value; } + AZ_STORAGE_FILES_SHARES_DLLEXPORT const static ShareRootSquash NoRootSquash; + AZ_STORAGE_FILES_SHARES_DLLEXPORT const static ShareRootSquash RootSquash; + AZ_STORAGE_FILES_SHARES_DLLEXPORT const static ShareRootSquash AllSquash; + private: std::string m_value; }; @@ -246,6 +279,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { Nullable ProvisionedIops; Nullable ProvisionedIngressMBps; Nullable ProvisionedEgressMBps; + Nullable ProvisionedBandwidthMBps; Nullable NextAllowedQuotaDowngradeTime; Nullable DeletedOn; int32_t RemainingRetentionDays = int32_t(); @@ -267,6 +301,8 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { * When a share is leased, specifies whether the lease is of infinite or fixed duration. */ LeaseDurationType LeaseDuration; + Nullable EnabledProtocols; + Nullable RootSquash; }; /** * @brief A listed Azure Storage share item. @@ -408,6 +444,10 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { * Returns the current share next allowed quota downgrade time. */ Nullable NextAllowedQuotaDowngradeTime; + /** + * Returns the current share provisioned bandwidth in megabits per second. + */ + Nullable ProvisionedBandwidthMBps; /** * When a share is leased, specifies whether the lease is of infinite or fixed duration. */ @@ -428,6 +468,14 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { * Returns the transition state between access tiers, when present. */ Nullable AccessTierTransitionState; + /** + * The protocols that have been enabled on the share. + */ + Nullable EnabledProtocols; + /** + * Valid for NFS shares only. + */ + Nullable RootSquash; }; /** * @brief Specifies the option include to delete the base share and all of its snapshots. @@ -912,12 +960,29 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { */ bool IsServerEncrypted = bool(); }; + /** + * @brief File properties. + */ + struct DirectoryItemDetails final + { + Nullable LastAccessedOn; + DateTime LastModified; + ETag Etag; + /** + * The SMB related properties for the file. + */ + FileSmbProperties SmbProperties; + }; /** * @brief A listed directory item. */ struct DirectoryItem final { std::string Name; + /** + * File properties. + */ + DirectoryItemDetails Details; }; /** * @brief File properties. @@ -931,6 +996,13 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { * File Properties. */ int64_t FileSize = int64_t(); + Nullable LastAccessedOn; + DateTime LastModified; + ETag Etag; + /** + * The SMB related properties for the file. + */ + FileSmbProperties SmbProperties; }; /** * @brief A listed file item. @@ -958,6 +1030,39 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { */ std::vector FileItems; }; + } // namespace _detail + /** + * @brief Include this parameter to specify one or more datasets to include in the response. + */ + enum class ListFilesIncludeType + { + None = 0, + Timestamps = 1, + ETag = 2, + Attributes = 4, + PermissionKey = 8, + }; + inline ListFilesIncludeType operator|(ListFilesIncludeType lhs, ListFilesIncludeType rhs) + { + using type = std::underlying_type_t; + return static_cast(static_cast(lhs) | static_cast(rhs)); + } + inline ListFilesIncludeType& operator|=(ListFilesIncludeType& lhs, ListFilesIncludeType rhs) + { + lhs = lhs | rhs; + return lhs; + } + inline ListFilesIncludeType operator&(ListFilesIncludeType lhs, ListFilesIncludeType rhs) + { + using type = std::underlying_type_t; + return static_cast(static_cast(lhs) & static_cast(rhs)); + } + inline ListFilesIncludeType& operator&=(ListFilesIncludeType& lhs, ListFilesIncludeType rhs) + { + lhs = lhs & rhs; + return lhs; + } + namespace _detail { /** * @brief An enumeration of directories and files. */ @@ -975,6 +1080,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { */ FilesAndDirectoriesListSegment Segment; std::string NextMarker; + Nullable DirectoryId; }; } // namespace _detail /** @@ -1036,6 +1142,55 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { */ int32_t NumberOfHandlesFailedToClose = int32_t(); }; + /** + * @brief Response type for #Azure::Storage::Files::Shares::DirectoryClient::Rename. + */ + struct RenameDirectoryResult final + { + /** + * The ETag contains a value which represents the version of the file, in quotes. + */ + Azure::ETag ETag; + /** + * Returns the date and time the share was last modified. Any operation that modifies the + * directory or its properties updates the last modified time. Operations on files do not + * affect the last modified time of the directory. + */ + DateTime LastModified; + /** + * The value of this header is set to true if the contents of the request are successfully + * encrypted using the specified algorithm, and false otherwise. + */ + bool IsServerEncrypted = bool(); + /** + * Key of the permission set for the file. + */ + std::string FilePermissionKey; + /** + * Attributes set for the file. + */ + std::string FileAttributes; + /** + * Creation time for the file. + */ + DateTime FileCreationTime; + /** + * Last write time for the file. + */ + DateTime FileLastWriteTime; + /** + * Change time for the file. + */ + DateTime FileChangeTime; + /** + * The fileId of the file. + */ + std::string FileId; + /** + * The parent fileId of the directory. + */ + std::string FileParentId; + }; } // namespace _detail /** * @brief Response type for #Azure::Storage::Files::Shares::FileClient::Create. @@ -1438,6 +1593,22 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { DateTime LastModified; }; } // namespace _detail + /** + * @brief If the file last write time should be preserved or overwritten. + */ + class FileLastWrittenMode final { + public: + FileLastWrittenMode() = default; + explicit FileLastWrittenMode(std::string value) : m_value(std::move(value)) {} + bool operator==(const FileLastWrittenMode& other) const { return m_value == other.m_value; } + bool operator!=(const FileLastWrittenMode& other) const { return !(*this == other); } + const std::string& ToString() const { return m_value; } + AZ_STORAGE_FILES_SHARES_DLLEXPORT const static FileLastWrittenMode Now; + AZ_STORAGE_FILES_SHARES_DLLEXPORT const static FileLastWrittenMode Preserve; + + private: + std::string m_value; + }; /** * @brief Response type for #Azure::Storage::Files::Shares::FileClient::UploadRange. */ @@ -1602,6 +1773,55 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { */ int32_t NumberOfHandlesFailedToClose = int32_t(); }; + /** + * @brief Response type for #Azure::Storage::Files::Shares::FileClient::Rename. + */ + struct RenameFileResult final + { + /** + * The ETag contains a value which represents the version of the file, in quotes. + */ + Azure::ETag ETag; + /** + * Returns the date and time the share was last modified. Any operation that modifies the + * directory or its properties updates the last modified time. Operations on files do not + * affect the last modified time of the directory. + */ + DateTime LastModified; + /** + * The value of this header is set to true if the contents of the request are successfully + * encrypted using the specified algorithm, and false otherwise. + */ + bool IsServerEncrypted = bool(); + /** + * Key of the permission set for the file. + */ + std::string FilePermissionKey; + /** + * Attributes set for the file. + */ + std::string FileAttributes; + /** + * Creation time for the file. + */ + DateTime FileCreationTime; + /** + * Last write time for the file. + */ + DateTime FileLastWriteTime; + /** + * Change time for the file. + */ + DateTime FileChangeTime; + /** + * The fileId of the file. + */ + std::string FileId; + /** + * The parent fileId of the directory. + */ + std::string FileParentId; + }; } // namespace _detail } // namespace Models namespace _detail { @@ -1644,6 +1864,8 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { std::map Metadata; Nullable Quota; Nullable AccessTier; + Nullable EnabledProtocols; + Nullable RootSquash; }; static Response Create( Core::Http::_internal::HttpPipeline& pipeline, @@ -1756,6 +1978,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { Nullable Quota; Nullable AccessTier; Nullable LeaseId; + Nullable RootSquash; }; static Response SetProperties( Core::Http::_internal::HttpPipeline& pipeline, @@ -1809,8 +2032,9 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { Nullable FilePermission; Nullable FilePermissionKey; std::string FileAttributes; - std::string FileCreationTime; - std::string FileLastWriteTime; + Nullable FileCreationTime; + Nullable FileLastWriteTime; + Nullable FileChangeTime; }; static Response Create( Core::Http::_internal::HttpPipeline& pipeline, @@ -1839,8 +2063,9 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { Nullable FilePermission; Nullable FilePermissionKey; std::string FileAttributes; - std::string FileCreationTime; - std::string FileLastWriteTime; + Nullable FileCreationTime; + Nullable FileLastWriteTime; + Nullable FileChangeTime; }; static Response SetProperties( Core::Http::_internal::HttpPipeline& pipeline, @@ -1862,6 +2087,8 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { Nullable Sharesnapshot; Nullable Marker; Nullable MaxResults; + Nullable Include; + Nullable IncludeExtendedInfo; }; static Response ListFilesAndDirectoriesSegment( @@ -1893,6 +2120,26 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { const Core::Url& url, const ForceDirectoryCloseHandlesOptions& options, const Core::Context& context); + struct RenameDirectoryOptions final + { + std::string RenameSource; + Nullable ReplaceIfExists; + Nullable IgnoreReadOnly; + Nullable SourceLeaseId; + Nullable DestinationLeaseId; + Nullable FileAttributes; + Nullable FileCreationTime; + Nullable FileLastWriteTime; + Nullable FileChangeTime; + Nullable FilePermission; + Nullable FilePermissionKey; + std::map Metadata; + }; + static Response Rename( + Core::Http::_internal::HttpPipeline& pipeline, + const Core::Url& url, + const RenameDirectoryOptions& options, + const Core::Context& context); }; class FileClient final { public: @@ -1909,8 +2156,9 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { Nullable FilePermission; Nullable FilePermissionKey; std::string FileAttributes; - std::string FileCreationTime; - std::string FileLastWriteTime; + Nullable FileCreationTime; + Nullable FileLastWriteTime; + Nullable FileChangeTime; Nullable LeaseId; }; static Response Create( @@ -1960,8 +2208,9 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { Nullable FilePermission; Nullable FilePermissionKey; std::string FileAttributes; - std::string FileCreationTime; - std::string FileLastWriteTime; + Nullable FileCreationTime; + Nullable FileLastWriteTime; + Nullable FileChangeTime; Nullable LeaseId; }; static Response SetHttpHeaders( @@ -2023,6 +2272,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { std::string FileRangeWrite; Nullable> ContentMD5; Nullable LeaseId; + Nullable FileLastWrittenMode; }; static Response UploadRange( Core::Http::_internal::HttpPipeline& pipeline, @@ -2039,6 +2289,8 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { Nullable> SourceIfMatchCrc64; Nullable> SourceIfNoneMatchCrc64; Nullable LeaseId; + Nullable CopySourceAuthorization; + Nullable FileLastWrittenMode; }; static Response UploadRangeFromUri( Core::Http::_internal::HttpPipeline& pipeline, @@ -2068,6 +2320,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { Nullable FileAttributes; Nullable FileCreationTime; Nullable FileLastWriteTime; + Nullable FileChangeTime; Nullable SetArchiveAttribute; Nullable LeaseId; }; @@ -2108,6 +2361,27 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { const Core::Url& url, const ForceFileCloseHandlesOptions& options, const Core::Context& context); + struct RenameFileOptions final + { + std::string RenameSource; + Nullable ReplaceIfExists; + Nullable IgnoreReadOnly; + Nullable SourceLeaseId; + Nullable DestinationLeaseId; + Nullable FileAttributes; + Nullable FileCreationTime; + Nullable FileLastWriteTime; + Nullable FileChangeTime; + Nullable FilePermission; + Nullable FilePermissionKey; + std::map Metadata; + Nullable FileContentType; + }; + static Response Rename( + Core::Http::_internal::HttpPipeline& pipeline, + const Core::Url& url, + const RenameFileOptions& options, + const Core::Context& context); }; } // namespace _detail }}}} // namespace Azure::Storage::Files::Shares \ No newline at end of file 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 9b3635e327..6967141004 100644 --- a/sdk/storage/azure-storage-files-shares/src/rest_client.cpp +++ b/sdk/storage/azure-storage-files-shares/src/rest_client.cpp @@ -55,6 +55,35 @@ std::string ListSharesIncludeFlagsToString( } return ret; } +std::string ListFilesIncludeTypeToString( + const Azure::Storage::Files::Shares::Models::ListFilesIncludeType& val) +{ + const Azure::Storage::Files::Shares::Models::ListFilesIncludeType valueList[] = { + Azure::Storage::Files::Shares::Models::ListFilesIncludeType::Timestamps, + Azure::Storage::Files::Shares::Models::ListFilesIncludeType::ETag, + Azure::Storage::Files::Shares::Models::ListFilesIncludeType::Attributes, + Azure::Storage::Files::Shares::Models::ListFilesIncludeType::PermissionKey, + }; + const char* stringList[] = { + "Timestamps", + "Etag", + "Attributes", + "PermissionKey", + }; + std::string ret; + for (size_t i = 0; i < 4; ++i) + { + if ((val & valueList[i]) == valueList[i]) + { + if (!ret.empty()) + { + ret += ","; + } + ret += stringList[i]; + } + } + return ret; +} } // namespace namespace Azure { namespace Storage { namespace Files { namespace Shares { namespace Models { @@ -71,6 +100,11 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { const LeaseState LeaseState::Broken("broken"); const LeaseDurationType LeaseDurationType::Infinite("infinite"); const LeaseDurationType LeaseDurationType::Fixed("fixed"); + const ShareProtocols ShareProtocols::Smb("SMB"); + const ShareProtocols ShareProtocols::Nfs("NFS"); + const ShareRootSquash ShareRootSquash::NoRootSquash("NoRootSquash"); + const ShareRootSquash ShareRootSquash::RootSquash("RootSquash"); + const ShareRootSquash ShareRootSquash::AllSquash("AllSquash"); const DeleteSnapshotsOption DeleteSnapshotsOption::Include("include"); FileAttributes::FileAttributes(const std::string& value) { @@ -153,6 +187,8 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { const CopyStatus CopyStatus::Success("success"); const CopyStatus CopyStatus::Aborted("aborted"); const CopyStatus CopyStatus::Failed("failed"); + const FileLastWrittenMode FileLastWrittenMode::Now("Now"); + const FileLastWrittenMode FileLastWrittenMode::Preserve("Preserve"); const PermissionCopyMode PermissionCopyMode::Source("source"); const PermissionCopyMode PermissionCopyMode::Override("override"); } // namespace Models @@ -276,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", "2020-02-10"); + request.SetHeader("x-ms-version", "2021-06-08"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Accepted) @@ -296,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", "2020-02-10"); + request.SetHeader("x-ms-version", "2021-06-08"); (void)options; auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); @@ -528,7 +564,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { _internal::UrlEncodeQueryParameter( ListSharesIncludeFlagsToString(options.Include.Value()))); } - request.SetHeader("x-ms-version", "2020-02-10"); + request.SetHeader("x-ms-version", "2021-06-08"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Ok) @@ -561,6 +597,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { kProvisionedIops, kProvisionedIngressMBps, kProvisionedEgressMBps, + kProvisionedBandwidthMiBps, kNextAllowedQuotaDowngradeTime, kDeletedTime, kRemainingRetentionDays, @@ -570,6 +607,8 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { kLeaseStatus, kLeaseState, kLeaseDuration, + kEnabledProtocols, + kRootSquash, kNextMarker, }; const std::unordered_map XmlTagEnumMap{ @@ -591,6 +630,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { {"ProvisionedIops", XmlTagEnum::kProvisionedIops}, {"ProvisionedIngressMBps", XmlTagEnum::kProvisionedIngressMBps}, {"ProvisionedEgressMBps", XmlTagEnum::kProvisionedEgressMBps}, + {"ProvisionedBandwidthMiBps", XmlTagEnum::kProvisionedBandwidthMiBps}, {"NextAllowedQuotaDowngradeTime", XmlTagEnum::kNextAllowedQuotaDowngradeTime}, {"DeletedTime", XmlTagEnum::kDeletedTime}, {"RemainingRetentionDays", XmlTagEnum::kRemainingRetentionDays}, @@ -600,6 +640,8 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { {"LeaseStatus", XmlTagEnum::kLeaseStatus}, {"LeaseState", XmlTagEnum::kLeaseState}, {"LeaseDuration", XmlTagEnum::kLeaseDuration}, + {"EnabledProtocols", XmlTagEnum::kEnabledProtocols}, + {"RootSquash", XmlTagEnum::kRootSquash}, {"NextMarker", XmlTagEnum::kNextMarker}, }; std::vector xmlPath; @@ -724,6 +766,14 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { { vectorElement1.Details.ProvisionedEgressMBps = std::stoi(node.Value); } + else if ( + xmlPath.size() == 5 && xmlPath[0] == XmlTagEnum::kEnumerationResults + && xmlPath[1] == XmlTagEnum::kShares && xmlPath[2] == XmlTagEnum::kShare + && xmlPath[3] == XmlTagEnum::kProperties + && xmlPath[4] == XmlTagEnum::kProvisionedBandwidthMiBps) + { + vectorElement1.Details.ProvisionedBandwidthMBps = std::stoi(node.Value); + } else if ( xmlPath.size() == 5 && xmlPath[0] == XmlTagEnum::kEnumerationResults && xmlPath[1] == XmlTagEnum::kShares && xmlPath[2] == XmlTagEnum::kShare @@ -795,6 +845,21 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { { vectorElement1.Details.LeaseDuration = Models::LeaseDurationType(node.Value); } + else if ( + xmlPath.size() == 5 && xmlPath[0] == XmlTagEnum::kEnumerationResults + && xmlPath[1] == XmlTagEnum::kShares && xmlPath[2] == XmlTagEnum::kShare + && xmlPath[3] == XmlTagEnum::kProperties + && xmlPath[4] == XmlTagEnum::kEnabledProtocols) + { + vectorElement1.Details.EnabledProtocols = Models::ShareProtocols(node.Value); + } + else if ( + xmlPath.size() == 5 && xmlPath[0] == XmlTagEnum::kEnumerationResults + && xmlPath[1] == XmlTagEnum::kShares && xmlPath[2] == XmlTagEnum::kShare + && xmlPath[3] == XmlTagEnum::kProperties && xmlPath[4] == XmlTagEnum::kRootSquash) + { + vectorElement1.Details.RootSquash = Models::ShareRootSquash(node.Value); + } else if ( xmlPath.size() == 2 && xmlPath[0] == XmlTagEnum::kEnumerationResults && xmlPath[1] == XmlTagEnum::kNextMarker) @@ -852,7 +917,16 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { { request.SetHeader("x-ms-access-tier", options.AccessTier.Value().ToString()); } - request.SetHeader("x-ms-version", "2020-02-10"); + request.SetHeader("x-ms-version", "2021-06-08"); + if (options.EnabledProtocols.HasValue() + && !options.EnabledProtocols.Value().ToString().empty()) + { + request.SetHeader("x-ms-enabled-protocols", options.EnabledProtocols.Value().ToString()); + } + if (options.RootSquash.HasValue() && !options.RootSquash.Value().ToString().empty()) + { + request.SetHeader("x-ms-root-squash", options.RootSquash.Value().ToString()); + } auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Created) @@ -878,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", "2020-02-10"); + request.SetHeader("x-ms-version", "2021-06-08"); if (options.LeaseId.HasValue() && !options.LeaseId.Value().empty()) { request.SetHeader("x-ms-lease-id", options.LeaseId.Value()); @@ -921,6 +995,11 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { pRawResponse->GetHeaders().at("x-ms-share-next-allowed-quota-downgrade-time"), Azure::DateTime::DateFormat::Rfc1123); } + if (pRawResponse->GetHeaders().count("x-ms-share-provisioned-bandwidth-mibps") != 0) + { + response.ProvisionedBandwidthMBps + = std::stoi(pRawResponse->GetHeaders().at("x-ms-share-provisioned-bandwidth-mibps")); + } if (pRawResponse->GetHeaders().count("x-ms-lease-duration") != 0) { response.LeaseDuration @@ -950,6 +1029,16 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { response.AccessTierTransitionState = pRawResponse->GetHeaders().at("x-ms-access-tier-transition-state"); } + if (pRawResponse->GetHeaders().count("x-ms-enabled-protocols") != 0) + { + response.EnabledProtocols + = Models::ShareProtocols(pRawResponse->GetHeaders().at("x-ms-enabled-protocols")); + } + if (pRawResponse->GetHeaders().count("x-ms-root-squash") != 0) + { + response.RootSquash + = Models::ShareRootSquash(pRawResponse->GetHeaders().at("x-ms-root-squash")); + } return Response(std::move(response), std::move(pRawResponse)); } Response ShareClient::Delete( @@ -965,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", "2020-02-10"); + request.SetHeader("x-ms-version", "2021-06-08"); if (options.DeleteSnapshots.HasValue() && !options.DeleteSnapshots.Value().ToString().empty()) { request.SetHeader("x-ms-delete-snapshots", options.DeleteSnapshots.Value().ToString()); @@ -1001,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", "2020-02-10"); + request.SetHeader("x-ms-version", "2021-06-08"); if (options.Sharesnapshot.HasValue() && !options.Sharesnapshot.Value().empty()) { request.GetUrl().AppendQueryParameter( @@ -1035,7 +1124,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { { request.SetHeader("x-ms-lease-id", options.LeaseId); } - request.SetHeader("x-ms-version", "2020-02-10"); + request.SetHeader("x-ms-version", "2021-06-08"); if (options.Sharesnapshot.HasValue() && !options.Sharesnapshot.Value().empty()) { request.GetUrl().AppendQueryParameter( @@ -1072,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", "2020-02-10"); + request.SetHeader("x-ms-version", "2021-06-08"); if (options.Sharesnapshot.HasValue() && !options.Sharesnapshot.Value().empty()) { request.GetUrl().AppendQueryParameter( @@ -1106,7 +1195,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { { request.SetHeader("x-ms-lease-id", options.LeaseId); } - request.SetHeader("x-ms-version", "2020-02-10"); + request.SetHeader("x-ms-version", "2021-06-08"); if (options.Sharesnapshot.HasValue() && !options.Sharesnapshot.Value().empty()) { request.GetUrl().AppendQueryParameter( @@ -1144,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", "2020-02-10"); + request.SetHeader("x-ms-version", "2021-06-08"); if (options.Sharesnapshot.HasValue() && !options.Sharesnapshot.Value().empty()) { request.GetUrl().AppendQueryParameter( @@ -1178,7 +1267,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { { request.SetHeader("x-ms-meta-" + p.first, p.second); } - request.SetHeader("x-ms-version", "2020-02-10"); + request.SetHeader("x-ms-version", "2021-06-08"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Created) @@ -1212,7 +1301,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", "2020-02-10"); + request.SetHeader("x-ms-version", "2021-06-08"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Created) @@ -1237,7 +1326,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { { request.SetHeader("x-ms-file-permission-key", options.FilePermissionKey); } - request.SetHeader("x-ms-version", "2020-02-10"); + request.SetHeader("x-ms-version", "2021-06-08"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Ok) @@ -1263,7 +1352,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", "2020-02-10"); + request.SetHeader("x-ms-version", "2021-06-08"); if (options.Quota.HasValue()) { request.SetHeader("x-ms-share-quota", std::to_string(options.Quota.Value())); @@ -1276,6 +1365,10 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { { request.SetHeader("x-ms-lease-id", options.LeaseId.Value()); } + if (options.RootSquash.HasValue() && !options.RootSquash.Value().ToString().empty()) + { + request.SetHeader("x-ms-root-squash", options.RootSquash.Value().ToString()); + } auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Ok) @@ -1302,7 +1395,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { { request.SetHeader("x-ms-meta-" + p.first, p.second); } - request.SetHeader("x-ms-version", "2020-02-10"); + request.SetHeader("x-ms-version", "2021-06-08"); if (options.LeaseId.HasValue() && !options.LeaseId.Value().empty()) { request.SetHeader("x-ms-lease-id", options.LeaseId.Value()); @@ -1328,7 +1421,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", "2020-02-10"); + request.SetHeader("x-ms-version", "2021-06-08"); if (options.LeaseId.HasValue() && !options.LeaseId.Value().empty()) { request.SetHeader("x-ms-lease-id", options.LeaseId.Value()); @@ -1475,7 +1568,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", "2020-02-10"); + request.SetHeader("x-ms-version", "2021-06-08"); if (options.LeaseId.HasValue() && !options.LeaseId.Value().empty()) { request.SetHeader("x-ms-lease-id", options.LeaseId.Value()); @@ -1502,7 +1595,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", "2020-02-10"); + request.SetHeader("x-ms-version", "2021-06-08"); if (options.LeaseId.HasValue() && !options.LeaseId.Value().empty()) { request.SetHeader("x-ms-lease-id", options.LeaseId.Value()); @@ -1577,7 +1670,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { { request.SetHeader("x-ms-meta-" + p.first, p.second); } - request.SetHeader("x-ms-version", "2020-02-10"); + request.SetHeader("x-ms-version", "2021-06-08"); if (options.FilePermission.HasValue() && !options.FilePermission.Value().empty()) { request.SetHeader("x-ms-file-permission", options.FilePermission.Value()); @@ -1590,13 +1683,19 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { { request.SetHeader("x-ms-file-attributes", options.FileAttributes); } - if (!options.FileCreationTime.empty()) + if (options.FileCreationTime.HasValue() && !options.FileCreationTime.Value().empty()) { - request.SetHeader("x-ms-file-creation-time", options.FileCreationTime); + request.SetHeader("x-ms-file-creation-time", options.FileCreationTime.Value()); } - if (!options.FileLastWriteTime.empty()) + if (options.FileLastWriteTime.HasValue() && !options.FileLastWriteTime.Value().empty()) { - request.SetHeader("x-ms-file-last-write-time", options.FileLastWriteTime); + request.SetHeader("x-ms-file-last-write-time", options.FileLastWriteTime.Value()); + } + if (options.FileChangeTime.HasValue()) + { + request.SetHeader( + "x-ms-file-change-time", + options.FileChangeTime.Value().ToString(Azure::DateTime::DateFormat::Rfc1123)); } auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); @@ -1652,7 +1751,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { request.GetUrl().AppendQueryParameter( "sharesnapshot", _internal::UrlEncodeQueryParameter(options.Sharesnapshot.Value())); } - request.SetHeader("x-ms-version", "2020-02-10"); + request.SetHeader("x-ms-version", "2021-06-08"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Ok) @@ -1708,7 +1807,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", "2020-02-10"); + request.SetHeader("x-ms-version", "2021-06-08"); (void)options; auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); @@ -1728,7 +1827,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", "2020-02-10"); + request.SetHeader("x-ms-version", "2021-06-08"); if (options.FilePermission.HasValue() && !options.FilePermission.Value().empty()) { request.SetHeader("x-ms-file-permission", options.FilePermission.Value()); @@ -1741,13 +1840,19 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { { request.SetHeader("x-ms-file-attributes", options.FileAttributes); } - if (!options.FileCreationTime.empty()) + if (options.FileCreationTime.HasValue() && !options.FileCreationTime.Value().empty()) + { + request.SetHeader("x-ms-file-creation-time", options.FileCreationTime.Value()); + } + if (options.FileLastWriteTime.HasValue() && !options.FileLastWriteTime.Value().empty()) { - request.SetHeader("x-ms-file-creation-time", options.FileCreationTime); + request.SetHeader("x-ms-file-last-write-time", options.FileLastWriteTime.Value()); } - if (!options.FileLastWriteTime.empty()) + if (options.FileChangeTime.HasValue()) { - request.SetHeader("x-ms-file-last-write-time", options.FileLastWriteTime); + request.SetHeader( + "x-ms-file-change-time", + options.FileChangeTime.Value().ToString(Azure::DateTime::DateFormat::Rfc1123)); } auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); @@ -1804,7 +1909,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { { request.SetHeader("x-ms-meta-" + p.first, p.second); } - request.SetHeader("x-ms-version", "2020-02-10"); + request.SetHeader("x-ms-version", "2021-06-08"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Ok) @@ -1848,7 +1953,20 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { request.GetUrl().AppendQueryParameter( "maxresults", std::to_string(options.MaxResults.Value())); } - request.SetHeader("x-ms-version", "2020-02-10"); + request.SetHeader("x-ms-version", "2021-06-08"); + if (options.Include.HasValue() + && !ListFilesIncludeTypeToString(options.Include.Value()).empty()) + { + request.GetUrl().AppendQueryParameter( + "include", + _internal::UrlEncodeQueryParameter( + ListFilesIncludeTypeToString(options.Include.Value()))); + } + if (options.IncludeExtendedInfo.HasValue()) + { + request.SetHeader( + "x-ms-file-extended-info", options.IncludeExtendedInfo.Value() ? "true" : "false"); + } auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Ok) @@ -1870,10 +1988,20 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { kEntries, kDirectory, kName, - kFile, kProperties, + kLastAccessTime, + kLastModified, + kEtag, + kPermissionKey, + kAttributes, + kCreationTime, + kLastWriteTime, + kChangeTime, + kFileId, + kFile, kContentLength, kNextMarker, + kDirectoryId, }; const std::unordered_map XmlTagEnumMap{ {"EnumerationResults", XmlTagEnum::kEnumerationResults}, @@ -1883,10 +2011,20 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { {"Entries", XmlTagEnum::kEntries}, {"Directory", XmlTagEnum::kDirectory}, {"Name", XmlTagEnum::kName}, - {"File", XmlTagEnum::kFile}, {"Properties", XmlTagEnum::kProperties}, + {"LastAccessTime", XmlTagEnum::kLastAccessTime}, + {"Last-Modified", XmlTagEnum::kLastModified}, + {"Etag", XmlTagEnum::kEtag}, + {"PermissionKey", XmlTagEnum::kPermissionKey}, + {"Attributes", XmlTagEnum::kAttributes}, + {"CreationTime", XmlTagEnum::kCreationTime}, + {"LastWriteTime", XmlTagEnum::kLastWriteTime}, + {"ChangeTime", XmlTagEnum::kChangeTime}, + {"FileId", XmlTagEnum::kFileId}, + {"File", XmlTagEnum::kFile}, {"Content-Length", XmlTagEnum::kContentLength}, {"NextMarker", XmlTagEnum::kNextMarker}, + {"DirectoryId", XmlTagEnum::kDirectoryId}, }; std::vector xmlPath; Models::DirectoryItem vectorElement1; @@ -1929,6 +2067,76 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { { vectorElement1.Name = node.Value; } + else if ( + xmlPath.size() == 5 && xmlPath[0] == XmlTagEnum::kEnumerationResults + && xmlPath[1] == XmlTagEnum::kEntries && xmlPath[2] == XmlTagEnum::kDirectory + && xmlPath[3] == XmlTagEnum::kProperties + && xmlPath[4] == XmlTagEnum::kLastAccessTime) + { + vectorElement1.Details.LastAccessedOn + = DateTime::Parse(node.Value, Azure::DateTime::DateFormat::Rfc3339); + } + else if ( + xmlPath.size() == 5 && xmlPath[0] == XmlTagEnum::kEnumerationResults + && xmlPath[1] == XmlTagEnum::kEntries && xmlPath[2] == XmlTagEnum::kDirectory + && xmlPath[3] == XmlTagEnum::kProperties && xmlPath[4] == XmlTagEnum::kLastModified) + { + vectorElement1.Details.LastModified + = DateTime::Parse(node.Value, Azure::DateTime::DateFormat::Rfc1123); + } + else if ( + xmlPath.size() == 5 && xmlPath[0] == XmlTagEnum::kEnumerationResults + && xmlPath[1] == XmlTagEnum::kEntries && xmlPath[2] == XmlTagEnum::kDirectory + && xmlPath[3] == XmlTagEnum::kProperties && xmlPath[4] == XmlTagEnum::kEtag) + { + vectorElement1.Details.Etag = ETag(node.Value); + } + else if ( + xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kEnumerationResults + && xmlPath[1] == XmlTagEnum::kEntries && xmlPath[2] == XmlTagEnum::kDirectory + && xmlPath[3] == XmlTagEnum::kPermissionKey) + { + vectorElement1.Details.SmbProperties.PermissionKey = node.Value; + } + else if ( + xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kEnumerationResults + && xmlPath[1] == XmlTagEnum::kEntries && xmlPath[2] == XmlTagEnum::kDirectory + && xmlPath[3] == XmlTagEnum::kAttributes) + { + vectorElement1.Details.SmbProperties.Attributes = Models::FileAttributes(node.Value); + } + else if ( + xmlPath.size() == 5 && xmlPath[0] == XmlTagEnum::kEnumerationResults + && xmlPath[1] == XmlTagEnum::kEntries && xmlPath[2] == XmlTagEnum::kDirectory + && xmlPath[3] == XmlTagEnum::kProperties && xmlPath[4] == XmlTagEnum::kCreationTime) + { + vectorElement1.Details.SmbProperties.CreatedOn + = DateTime::Parse(node.Value, Azure::DateTime::DateFormat::Rfc3339); + } + else if ( + xmlPath.size() == 5 && xmlPath[0] == XmlTagEnum::kEnumerationResults + && xmlPath[1] == XmlTagEnum::kEntries && xmlPath[2] == XmlTagEnum::kDirectory + && xmlPath[3] == XmlTagEnum::kProperties + && xmlPath[4] == XmlTagEnum::kLastWriteTime) + { + vectorElement1.Details.SmbProperties.LastWrittenOn + = DateTime::Parse(node.Value, Azure::DateTime::DateFormat::Rfc3339); + } + else if ( + xmlPath.size() == 5 && xmlPath[0] == XmlTagEnum::kEnumerationResults + && xmlPath[1] == XmlTagEnum::kEntries && xmlPath[2] == XmlTagEnum::kDirectory + && xmlPath[3] == XmlTagEnum::kProperties && xmlPath[4] == XmlTagEnum::kChangeTime) + { + vectorElement1.Details.SmbProperties.ChangedOn + = DateTime::Parse(node.Value, Azure::DateTime::DateFormat::Rfc3339); + } + else if ( + xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kEnumerationResults + && xmlPath[1] == XmlTagEnum::kEntries && xmlPath[2] == XmlTagEnum::kDirectory + && xmlPath[3] == XmlTagEnum::kFileId) + { + vectorElement1.Details.SmbProperties.FileId = node.Value; + } else if ( xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kEnumerationResults && xmlPath[1] == XmlTagEnum::kEntries && xmlPath[2] == XmlTagEnum::kFile @@ -1944,12 +2152,88 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { { vectorElement2.Details.FileSize = std::stoll(node.Value); } + else if ( + xmlPath.size() == 5 && xmlPath[0] == XmlTagEnum::kEnumerationResults + && xmlPath[1] == XmlTagEnum::kEntries && xmlPath[2] == XmlTagEnum::kFile + && xmlPath[3] == XmlTagEnum::kProperties + && xmlPath[4] == XmlTagEnum::kLastAccessTime) + { + vectorElement2.Details.LastAccessedOn + = DateTime::Parse(node.Value, Azure::DateTime::DateFormat::Rfc3339); + } + else if ( + xmlPath.size() == 5 && xmlPath[0] == XmlTagEnum::kEnumerationResults + && xmlPath[1] == XmlTagEnum::kEntries && xmlPath[2] == XmlTagEnum::kFile + && xmlPath[3] == XmlTagEnum::kProperties && xmlPath[4] == XmlTagEnum::kLastModified) + { + vectorElement2.Details.LastModified + = DateTime::Parse(node.Value, Azure::DateTime::DateFormat::Rfc1123); + } + else if ( + xmlPath.size() == 5 && xmlPath[0] == XmlTagEnum::kEnumerationResults + && xmlPath[1] == XmlTagEnum::kEntries && xmlPath[2] == XmlTagEnum::kFile + && xmlPath[3] == XmlTagEnum::kProperties && xmlPath[4] == XmlTagEnum::kEtag) + { + vectorElement2.Details.Etag = ETag(node.Value); + } + else if ( + xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kEnumerationResults + && xmlPath[1] == XmlTagEnum::kEntries && xmlPath[2] == XmlTagEnum::kFile + && xmlPath[3] == XmlTagEnum::kPermissionKey) + { + vectorElement2.Details.SmbProperties.PermissionKey = node.Value; + } + else if ( + xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kEnumerationResults + && xmlPath[1] == XmlTagEnum::kEntries && xmlPath[2] == XmlTagEnum::kFile + && xmlPath[3] == XmlTagEnum::kAttributes) + { + vectorElement2.Details.SmbProperties.Attributes = Models::FileAttributes(node.Value); + } + else if ( + xmlPath.size() == 5 && xmlPath[0] == XmlTagEnum::kEnumerationResults + && xmlPath[1] == XmlTagEnum::kEntries && xmlPath[2] == XmlTagEnum::kFile + && xmlPath[3] == XmlTagEnum::kProperties && xmlPath[4] == XmlTagEnum::kCreationTime) + { + vectorElement2.Details.SmbProperties.CreatedOn + = DateTime::Parse(node.Value, Azure::DateTime::DateFormat::Rfc3339); + } + else if ( + xmlPath.size() == 5 && xmlPath[0] == XmlTagEnum::kEnumerationResults + && xmlPath[1] == XmlTagEnum::kEntries && xmlPath[2] == XmlTagEnum::kFile + && xmlPath[3] == XmlTagEnum::kProperties + && xmlPath[4] == XmlTagEnum::kLastWriteTime) + { + vectorElement2.Details.SmbProperties.LastWrittenOn + = DateTime::Parse(node.Value, Azure::DateTime::DateFormat::Rfc3339); + } + else if ( + xmlPath.size() == 5 && xmlPath[0] == XmlTagEnum::kEnumerationResults + && xmlPath[1] == XmlTagEnum::kEntries && xmlPath[2] == XmlTagEnum::kFile + && xmlPath[3] == XmlTagEnum::kProperties && xmlPath[4] == XmlTagEnum::kChangeTime) + { + vectorElement2.Details.SmbProperties.ChangedOn + = DateTime::Parse(node.Value, Azure::DateTime::DateFormat::Rfc3339); + } + else if ( + xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kEnumerationResults + && xmlPath[1] == XmlTagEnum::kEntries && xmlPath[2] == XmlTagEnum::kFile + && xmlPath[3] == XmlTagEnum::kFileId) + { + vectorElement2.Details.SmbProperties.FileId = node.Value; + } else if ( xmlPath.size() == 2 && xmlPath[0] == XmlTagEnum::kEnumerationResults && xmlPath[1] == XmlTagEnum::kNextMarker) { response.NextMarker = node.Value; } + else if ( + xmlPath.size() == 2 && xmlPath[0] == XmlTagEnum::kEnumerationResults + && xmlPath[1] == XmlTagEnum::kDirectoryId) + { + response.DirectoryId = node.Value; + } } else if (node.Type == _internal::XmlNodeType::Attribute) { @@ -2026,7 +2310,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { { request.SetHeader("x-ms-recursive", options.Recursive.Value() ? "true" : "false"); } - request.SetHeader("x-ms-version", "2020-02-10"); + request.SetHeader("x-ms-version", "2021-06-08"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Ok) @@ -2192,7 +2476,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { { request.SetHeader("x-ms-recursive", options.Recursive.Value() ? "true" : "false"); } - request.SetHeader("x-ms-version", "2020-02-10"); + request.SetHeader("x-ms-version", "2021-06-08"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Ok) @@ -2211,6 +2495,95 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { return Response( std::move(response), std::move(pRawResponse)); } + Response DirectoryClient::Rename( + Core::Http::_internal::HttpPipeline& pipeline, + const Core::Url& url, + const RenameDirectoryOptions& options, + const Core::Context& context) + { + 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"); + if (!options.RenameSource.empty()) + { + request.SetHeader("x-ms-file-rename-source", options.RenameSource); + } + if (options.ReplaceIfExists.HasValue()) + { + request.SetHeader( + "x-ms-file-rename-replace-if-exists", + options.ReplaceIfExists.Value() ? "true" : "false"); + } + if (options.IgnoreReadOnly.HasValue()) + { + request.SetHeader( + "x-ms-file-rename-ignore-readonly", options.IgnoreReadOnly.Value() ? "true" : "false"); + } + if (options.SourceLeaseId.HasValue() && !options.SourceLeaseId.Value().empty()) + { + request.SetHeader("x-ms-source-lease-id", options.SourceLeaseId.Value()); + } + if (options.DestinationLeaseId.HasValue() && !options.DestinationLeaseId.Value().empty()) + { + request.SetHeader("x-ms-destination-lease-id", options.DestinationLeaseId.Value()); + } + if (options.FileAttributes.HasValue() && !options.FileAttributes.Value().empty()) + { + request.SetHeader("x-ms-file-attributes", options.FileAttributes.Value()); + } + if (options.FileCreationTime.HasValue() && !options.FileCreationTime.Value().empty()) + { + request.SetHeader("x-ms-file-creation-time", options.FileCreationTime.Value()); + } + if (options.FileLastWriteTime.HasValue() && !options.FileLastWriteTime.Value().empty()) + { + request.SetHeader("x-ms-file-last-write-time", options.FileLastWriteTime.Value()); + } + if (options.FileChangeTime.HasValue() && !options.FileChangeTime.Value().empty()) + { + request.SetHeader("x-ms-file-change-time", options.FileChangeTime.Value()); + } + if (options.FilePermission.HasValue() && !options.FilePermission.Value().empty()) + { + request.SetHeader("x-ms-file-permission", options.FilePermission.Value()); + } + if (options.FilePermissionKey.HasValue() && !options.FilePermissionKey.Value().empty()) + { + request.SetHeader("x-ms-file-permission-key", options.FilePermissionKey.Value()); + } + for (const auto& p : options.Metadata) + { + request.SetHeader("x-ms-meta-" + p.first, p.second); + } + auto pRawResponse = pipeline.Send(request, context); + auto httpStatusCode = pRawResponse->GetStatusCode(); + if (httpStatusCode != Core::Http::HttpStatusCode::Ok) + { + throw StorageException::CreateFromResponse(std::move(pRawResponse)); + } + Models::_detail::RenameDirectoryResult response; + response.ETag = ETag(pRawResponse->GetHeaders().at("ETag")); + response.LastModified = DateTime::Parse( + pRawResponse->GetHeaders().at("Last-Modified"), Azure::DateTime::DateFormat::Rfc1123); + response.IsServerEncrypted + = pRawResponse->GetHeaders().at("x-ms-request-server-encrypted") == std::string("true"); + response.FilePermissionKey = pRawResponse->GetHeaders().at("x-ms-file-permission-key"); + response.FileAttributes = pRawResponse->GetHeaders().at("x-ms-file-attributes"); + response.FileCreationTime = DateTime::Parse( + pRawResponse->GetHeaders().at("x-ms-file-creation-time"), + Azure::DateTime::DateFormat::Rfc1123); + response.FileLastWriteTime = DateTime::Parse( + pRawResponse->GetHeaders().at("x-ms-file-last-write-time"), + Azure::DateTime::DateFormat::Rfc1123); + response.FileChangeTime = DateTime::Parse( + pRawResponse->GetHeaders().at("x-ms-file-change-time"), + Azure::DateTime::DateFormat::Rfc1123); + response.FileId = pRawResponse->GetHeaders().at("x-ms-file-id"); + response.FileParentId = pRawResponse->GetHeaders().at("x-ms-file-parent-id"); + return Response( + std::move(response), std::move(pRawResponse)); + } Response FileClient::Create( Core::Http::_internal::HttpPipeline& pipeline, const Core::Url& url, @@ -2218,7 +2591,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", "2020-02-10"); + request.SetHeader("x-ms-version", "2021-06-08"); 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()) @@ -2264,13 +2637,19 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { { request.SetHeader("x-ms-file-attributes", options.FileAttributes); } - if (!options.FileCreationTime.empty()) + if (options.FileCreationTime.HasValue() && !options.FileCreationTime.Value().empty()) + { + request.SetHeader("x-ms-file-creation-time", options.FileCreationTime.Value()); + } + if (options.FileLastWriteTime.HasValue() && !options.FileLastWriteTime.Value().empty()) { - request.SetHeader("x-ms-file-creation-time", options.FileCreationTime); + request.SetHeader("x-ms-file-last-write-time", options.FileLastWriteTime.Value()); } - if (!options.FileLastWriteTime.empty()) + if (options.FileChangeTime.HasValue()) { - request.SetHeader("x-ms-file-last-write-time", options.FileLastWriteTime); + request.SetHeader( + "x-ms-file-change-time", + options.FileChangeTime.Value().ToString(Azure::DateTime::DateFormat::Rfc1123)); } if (options.LeaseId.HasValue() && !options.LeaseId.Value().empty()) { @@ -2324,7 +2703,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", "2020-02-10"); + request.SetHeader("x-ms-version", "2021-06-08"); if (options.Range.HasValue() && !options.Range.Value().empty()) { request.SetHeader("x-ms-range", options.Range.Value()); @@ -2499,7 +2878,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { request.GetUrl().AppendQueryParameter( "sharesnapshot", _internal::UrlEncodeQueryParameter(options.Sharesnapshot.Value())); } - request.SetHeader("x-ms-version", "2020-02-10"); + request.SetHeader("x-ms-version", "2021-06-08"); if (options.LeaseId.HasValue() && !options.LeaseId.Value().empty()) { request.SetHeader("x-ms-lease-id", options.LeaseId.Value()); @@ -2627,7 +3006,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", "2020-02-10"); + request.SetHeader("x-ms-version", "2021-06-08"); if (options.LeaseId.HasValue() && !options.LeaseId.Value().empty()) { request.SetHeader("x-ms-lease-id", options.LeaseId.Value()); @@ -2649,7 +3028,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", "2020-02-10"); + request.SetHeader("x-ms-version", "2021-06-08"); if (options.FileContentLength.HasValue()) { request.SetHeader("x-ms-content-length", std::to_string(options.FileContentLength.Value())); @@ -2693,13 +3072,19 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { { request.SetHeader("x-ms-file-attributes", options.FileAttributes); } - if (!options.FileCreationTime.empty()) + if (options.FileCreationTime.HasValue() && !options.FileCreationTime.Value().empty()) { - request.SetHeader("x-ms-file-creation-time", options.FileCreationTime); + request.SetHeader("x-ms-file-creation-time", options.FileCreationTime.Value()); + } + if (options.FileLastWriteTime.HasValue() && !options.FileLastWriteTime.Value().empty()) + { + request.SetHeader("x-ms-file-last-write-time", options.FileLastWriteTime.Value()); } - if (!options.FileLastWriteTime.empty()) + if (options.FileChangeTime.HasValue()) { - request.SetHeader("x-ms-file-last-write-time", options.FileLastWriteTime); + request.SetHeader( + "x-ms-file-change-time", + options.FileChangeTime.Value().ToString(Azure::DateTime::DateFormat::Rfc1123)); } if (options.LeaseId.HasValue() && !options.LeaseId.Value().empty()) { @@ -2759,7 +3144,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { { request.SetHeader("x-ms-meta-" + p.first, p.second); } - request.SetHeader("x-ms-version", "2020-02-10"); + request.SetHeader("x-ms-version", "2021-06-08"); if (options.LeaseId.HasValue() && !options.LeaseId.Value().empty()) { request.SetHeader("x-ms-lease-id", options.LeaseId.Value()); @@ -2793,7 +3178,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { { request.SetHeader("x-ms-proposed-lease-id", options.ProposedLeaseId.Value()); } - request.SetHeader("x-ms-version", "2020-02-10"); + request.SetHeader("x-ms-version", "2021-06-08"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Created) @@ -2821,7 +3206,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { { request.SetHeader("x-ms-lease-id", options.LeaseId); } - request.SetHeader("x-ms-version", "2020-02-10"); + request.SetHeader("x-ms-version", "2021-06-08"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Ok) @@ -2852,7 +3237,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { { request.SetHeader("x-ms-proposed-lease-id", options.ProposedLeaseId.Value()); } - request.SetHeader("x-ms-version", "2020-02-10"); + request.SetHeader("x-ms-version", "2021-06-08"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Ok) @@ -2880,7 +3265,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { { request.SetHeader("x-ms-lease-id", options.LeaseId.Value()); } - request.SetHeader("x-ms-version", "2020-02-10"); + request.SetHeader("x-ms-version", "2021-06-08"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Accepted) @@ -2917,11 +3302,17 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { { request.SetHeader("Content-MD5", Core::Convert::Base64Encode(options.ContentMD5.Value())); } - request.SetHeader("x-ms-version", "2020-02-10"); + request.SetHeader("x-ms-version", "2021-06-08"); if (options.LeaseId.HasValue() && !options.LeaseId.Value().empty()) { request.SetHeader("x-ms-lease-id", options.LeaseId.Value()); } + if (options.FileLastWrittenMode.HasValue() + && !options.FileLastWrittenMode.Value().ToString().empty()) + { + request.SetHeader( + "x-ms-file-last-write-time", options.FileLastWrittenMode.Value().ToString()); + } auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Created) @@ -2988,11 +3379,23 @@ 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", "2020-02-10"); + request.SetHeader("x-ms-version", "2021-06-08"); if (options.LeaseId.HasValue() && !options.LeaseId.Value().empty()) { request.SetHeader("x-ms-lease-id", options.LeaseId.Value()); } + if (options.CopySourceAuthorization.HasValue() + && !options.CopySourceAuthorization.Value().empty()) + { + request.SetHeader( + "x-ms-copy-source-authorization", options.CopySourceAuthorization.Value()); + } + if (options.FileLastWrittenMode.HasValue() + && !options.FileLastWrittenMode.Value().ToString().empty()) + { + request.SetHeader( + "x-ms-file-last-write-time", options.FileLastWrittenMode.Value().ToString()); + } auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Created) @@ -3036,7 +3439,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { "prevsharesnapshot", _internal::UrlEncodeQueryParameter(options.Prevsharesnapshot.Value())); } - request.SetHeader("x-ms-version", "2020-02-10"); + request.SetHeader("x-ms-version", "2021-06-08"); if (options.Range.HasValue() && !options.Range.Value().empty()) { request.SetHeader("x-ms-range", options.Range.Value()); @@ -3150,7 +3553,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", "2020-02-10"); + request.SetHeader("x-ms-version", "2021-06-08"); for (const auto& p : options.Metadata) { request.SetHeader("x-ms-meta-" + p.first, p.second); @@ -3176,7 +3579,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { if (options.IgnoreReadOnly.HasValue()) { request.SetHeader( - "x-ms-file-copy-ignore-read-only", options.IgnoreReadOnly.Value() ? "true" : "false"); + "x-ms-file-copy-ignore-readonly", options.IgnoreReadOnly.Value() ? "true" : "false"); } if (options.FileAttributes.HasValue() && !options.FileAttributes.Value().empty()) { @@ -3190,6 +3593,10 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { { request.SetHeader("x-ms-file-last-write-time", options.FileLastWriteTime.Value()); } + if (options.FileChangeTime.HasValue() && !options.FileChangeTime.Value().empty()) + { + request.SetHeader("x-ms-file-change-time", options.FileChangeTime.Value()); + } if (options.SetArchiveAttribute.HasValue()) { request.SetHeader( @@ -3228,7 +3635,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", "2020-02-10"); + request.SetHeader("x-ms-version", "2021-06-08"); if (options.LeaseId.HasValue() && !options.LeaseId.Value().empty()) { request.SetHeader("x-ms-lease-id", options.LeaseId.Value()); @@ -3265,7 +3672,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { request.GetUrl().AppendQueryParameter( "sharesnapshot", _internal::UrlEncodeQueryParameter(options.Sharesnapshot.Value())); } - request.SetHeader("x-ms-version", "2020-02-10"); + request.SetHeader("x-ms-version", "2021-06-08"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Ok) @@ -3427,7 +3834,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { { request.SetHeader("x-ms-handle-id", options.HandleId); } - request.SetHeader("x-ms-version", "2020-02-10"); + request.SetHeader("x-ms-version", "2021-06-08"); auto pRawResponse = pipeline.Send(request, context); auto httpStatusCode = pRawResponse->GetStatusCode(); if (httpStatusCode != Core::Http::HttpStatusCode::Ok) @@ -3446,5 +3853,97 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares { return Response( std::move(response), std::move(pRawResponse)); } + Response FileClient::Rename( + Core::Http::_internal::HttpPipeline& pipeline, + const Core::Url& url, + const RenameFileOptions& options, + const Core::Context& context) + { + auto request = Core::Http::Request(Core::Http::HttpMethod::Put, url); + request.GetUrl().AppendQueryParameter("comp", "rename"); + request.SetHeader("x-ms-version", "2021-06-08"); + if (!options.RenameSource.empty()) + { + request.SetHeader("x-ms-file-rename-source", options.RenameSource); + } + if (options.ReplaceIfExists.HasValue()) + { + request.SetHeader( + "x-ms-file-rename-replace-if-exists", + options.ReplaceIfExists.Value() ? "true" : "false"); + } + if (options.IgnoreReadOnly.HasValue()) + { + request.SetHeader( + "x-ms-file-rename-ignore-readonly", options.IgnoreReadOnly.Value() ? "true" : "false"); + } + if (options.SourceLeaseId.HasValue() && !options.SourceLeaseId.Value().empty()) + { + request.SetHeader("x-ms-source-lease-id", options.SourceLeaseId.Value()); + } + if (options.DestinationLeaseId.HasValue() && !options.DestinationLeaseId.Value().empty()) + { + request.SetHeader("x-ms-destination-lease-id", options.DestinationLeaseId.Value()); + } + if (options.FileAttributes.HasValue() && !options.FileAttributes.Value().empty()) + { + request.SetHeader("x-ms-file-attributes", options.FileAttributes.Value()); + } + if (options.FileCreationTime.HasValue() && !options.FileCreationTime.Value().empty()) + { + request.SetHeader("x-ms-file-creation-time", options.FileCreationTime.Value()); + } + if (options.FileLastWriteTime.HasValue() && !options.FileLastWriteTime.Value().empty()) + { + request.SetHeader("x-ms-file-last-write-time", options.FileLastWriteTime.Value()); + } + if (options.FileChangeTime.HasValue() && !options.FileChangeTime.Value().empty()) + { + request.SetHeader("x-ms-file-change-time", options.FileChangeTime.Value()); + } + if (options.FilePermission.HasValue() && !options.FilePermission.Value().empty()) + { + request.SetHeader("x-ms-file-permission", options.FilePermission.Value()); + } + if (options.FilePermissionKey.HasValue() && !options.FilePermissionKey.Value().empty()) + { + request.SetHeader("x-ms-file-permission-key", options.FilePermissionKey.Value()); + } + for (const auto& p : options.Metadata) + { + request.SetHeader("x-ms-meta-" + p.first, p.second); + } + if (options.FileContentType.HasValue() && !options.FileContentType.Value().empty()) + { + request.SetHeader("x-ms-content-type", options.FileContentType.Value()); + } + auto pRawResponse = pipeline.Send(request, context); + auto httpStatusCode = pRawResponse->GetStatusCode(); + if (httpStatusCode != Core::Http::HttpStatusCode::Ok) + { + throw StorageException::CreateFromResponse(std::move(pRawResponse)); + } + Models::_detail::RenameFileResult response; + response.ETag = ETag(pRawResponse->GetHeaders().at("ETag")); + response.LastModified = DateTime::Parse( + pRawResponse->GetHeaders().at("Last-Modified"), Azure::DateTime::DateFormat::Rfc1123); + response.IsServerEncrypted + = pRawResponse->GetHeaders().at("x-ms-request-server-encrypted") == std::string("true"); + response.FilePermissionKey = pRawResponse->GetHeaders().at("x-ms-file-permission-key"); + response.FileAttributes = pRawResponse->GetHeaders().at("x-ms-file-attributes"); + response.FileCreationTime = DateTime::Parse( + pRawResponse->GetHeaders().at("x-ms-file-creation-time"), + Azure::DateTime::DateFormat::Rfc1123); + response.FileLastWriteTime = DateTime::Parse( + pRawResponse->GetHeaders().at("x-ms-file-last-write-time"), + Azure::DateTime::DateFormat::Rfc1123); + response.FileChangeTime = DateTime::Parse( + pRawResponse->GetHeaders().at("x-ms-file-change-time"), + Azure::DateTime::DateFormat::Rfc1123); + response.FileId = pRawResponse->GetHeaders().at("x-ms-file-id"); + response.FileParentId = pRawResponse->GetHeaders().at("x-ms-file-parent-id"); + return Response( + std::move(response), std::move(pRawResponse)); + } } // namespace _detail }}}} // namespace Azure::Storage::Files::Shares \ No newline at end of file diff --git a/sdk/storage/azure-storage-files-shares/swagger/README.md b/sdk/storage/azure-storage-files-shares/swagger/README.md index e4ce1a8d9e..cb9b88e431 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/Jinming-Hu/azure-storage-api-specs/main/Microsoft.FileStorage/preview/2020-02-10/file.json +input-file: https://raw.githubusercontent.com/Azure/azure-rest-api-specs/main/specification/storage/data-plane/Microsoft.FileStorage/preview/2021-06-08/file.json ``` ## ModelFour Options @@ -79,13 +79,13 @@ directive: "name": "ApiVersion", "modelAsString": false }, - "enum": ["2020-02-10"], + "enum": ["2021-06-08"], "description": "The version used for the operations to Azure storage services." }; - from: swagger-document where: $.parameters transform: > - $.ApiVersionParameter.enum[0] = "2020-02-10"; + $.ApiVersionParameter.enum[0] = "2021-06-08"; ``` ### Rename Operations @@ -159,6 +159,8 @@ directive: "File_StartCopy", "Directory_ForceCloseHandles", "File_ForceCloseHandles", + "Directory_Rename", + "File_Rename", ]; for (const url in $["x-ms-paths"]) { for (const verb in $["x-ms-paths"][url]) { @@ -214,6 +216,9 @@ directive: $.MaxResults["x-ms-client-name"] = "MaxResults"; delete $.FileCreationTime.format; delete $.FileLastWriteTime.format; + $.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"}]; - from: swagger-document where: $.definitions transform: > @@ -296,6 +301,9 @@ directive: "description": "Standard HTTP properties supported files." }; $.SharePermission["x-namespace"] = "_detail"; + $.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"}]; - from: swagger-document where: $["x-ms-paths"].*.*.responses.*.headers transform: > @@ -388,16 +396,18 @@ directive: where: $.definitions transform: > $.ListSharesResponse.properties["ShareItems"]["x-ms-xml"] = {"name": "Shares"}; - $.ShareItemDetails = $.ShareProperties; - delete $.ShareProperties; + $.ShareItemDetails = $.SharePropertiesInternal; + delete $.SharePropertiesInternal; $.ShareItemDetails.properties["Quota"]["format"] = "int64"; $.ShareItemDetails.properties["AccessTierChangeTime"]["x-ms-client-name"] = "AccessTierChangedOn"; $.ShareItemDetails.properties["AccessTier"] = {"$ref": "#/definitions/AccessTier"}; $.ShareItemDetails.properties["DeletedTime"]["x-ms-client-name"] = "DeletedOn"; $.ShareItemDetails.required.push("RemainingRetentionDays", "LeaseStatus", "LeaseState", "LeaseDuration"); - $.ShareItem.properties["Details"] = {"$ref": "#/definitions/ShareItemDetails", "x-ms-xml": {"name": "Properties"}}; - delete $.ShareItem.properties["Properties"]; - delete $.ShareItem.required; + $.ShareItemInternal.properties["Details"] = {"$ref": "#/definitions/ShareItemDetails", "x-ms-xml": {"name": "Properties"}}; + $.ShareItemInternal["x-ms-client-name"] = "ShareItem"; + $.ShareItemDetails.properties["ProvisionedBandwidthMiBps"]["x-ms-client-name"] = "ProvisionedBandwidthMBps"; + delete $.ShareItemInternal.properties["Properties"]; + delete $.ShareItemInternal.required; ``` ### CreateShare @@ -441,6 +451,13 @@ directive: $["x-ms-access-tier-transition-state"]["x-nullable"] = true; $["x-ms-access-tier-transition-state"].description = "Returns the transition state between access tiers, when present."; $["x-ms-share-provisioned-iops"].description = "Returns the current share provisioned IOPS."; + $["x-ms-share-provisioned-bandwidth-mibps"]["x-nullable"] = true; + $["x-ms-share-provisioned-bandwidth-mibps"]["x-ms-client-name"] = "ProvisionedBandwidthMBps"; + $["x-ms-enabled-protocols"]["x-nullable"] = true; + $["x-ms-root-squash"]["x-nullable"] = true; + $["x-ms-enabled-protocols"]["enum"] = ["Smb", "Nfs"]; + $["x-ms-enabled-protocols"]["x-ms-enum"] = {"name": "ShareProtocols", "modelAsString": false}; + $["x-ms-enabled-protocols"]["x-ms-enum"]["values"] = [{"value": "SMB", "name": "Smb"},{"value": "NFS", "name": "Nfs"}]; - from: swagger-document where: $["x-ms-paths"]["/{shareName}?restype=share"].get.responses["200"] transform: > @@ -502,19 +519,49 @@ directive: ```yaml directive: + - from: swagger-document + where: $.parameters + transform: > + $.ListFilesInclude["items"]["x-ms-enum"]["values"] = [{"name": "Timestamps", "value": "Timestamps"}, {"name": "ETag", "value": "Etag"}, {"name": "Attributes", "value": "Attributes"}, {"name": "PermissionKey", "value": "PermissionKey"},]; - from: swagger-document where: $.definitions transform: > $.ListFilesAndDirectoriesSegmentResponse.properties["Segment"]["x-ms-xml"] = {"name": "Entries"}; $.FileItemDetails = $.FileProperty; $.FileItemDetails.properties["Content-Length"]["x-ms-client-name"] = "FileSize"; + $.FileItemDetails.properties["SmbProperties"] = {"$ref": "#/definitions/FileSmbProperties", "x-ms-xml": {"name": "."}}; + $.FileItemDetails.properties["LastAccessTime"]["x-ms-client-name"] = "LastAccessedOn"; + $.FileItemDetails.properties["LastAccessTime"]["x-nullable"] = true; + $.FileSmbProperties.properties["PermissionKey"]["x-ms-xml"] = {"name": "../PermissionKey"}; + $.FileSmbProperties.properties["Attributes"]["x-ms-xml"] = {"name": "../Attributes"}; + $.FileSmbProperties.properties["CreatedOn"]["x-ms-xml"] = {"name": "CreationTime"}; + $.FileSmbProperties.properties["LastWrittenOn"]["x-ms-xml"] = {"name": "LastWriteTime"}; + $.FileSmbProperties.properties["ChangedOn"]["x-ms-xml"] = {"name": "ChangeTime"}; + $.FileSmbProperties.properties["FileId"]["x-ms-xml"] = {"name": "../FileId"}; + $.FileSmbProperties.properties["ParentFileId"]["x-ms-xml"] = {"name": ""}; + delete $.FileItemDetails.properties["CreationTime"]; + delete $.FileItemDetails.properties["LastWriteTime"]; + delete $.FileItemDetails.properties["ChangeTime"]; + delete $.FileItemDetails.required; delete $.FileProperty; - $.FileItem.properties["Details"] = {"$ref": "#/definitions/FileItemDetails"}; delete $.FileItem.properties["Properties"]; + delete $.FileItem.properties["FileId"]; + delete $.FileItem.properties["Attributes"]; + delete $.FileItem.properties["PermissionKey"]; delete $.FileItem.required; + $.FileItem.properties["Details"] = {"$ref": "#/definitions/FileItemDetails", "x-ms-xml" : {"name": "Properties"}}; + + delete $.DirectoryItem.properties["Properties"]; + delete $.DirectoryItem.properties["FileId"]; + delete $.DirectoryItem.properties["Attributes"]; + delete $.DirectoryItem.properties["PermissionKey"]; + delete $.DirectoryItem.required; + $.DirectoryItemDetails = JSON.parse(JSON.stringify($.FileItemDetails)); + delete $.DirectoryItemDetails.properties["Content-Length"]; + $.DirectoryItem.properties["Details"] = {"$ref": "#/definitions/DirectoryItemDetails", "x-ms-xml" : {"name": "Properties"}}; + $.FilesAndDirectoriesListSegment.properties["DirectoryItems"]["x-ms-xml"] = {"name": "."}; $.FilesAndDirectoriesListSegment.properties["FileItems"]["x-ms-xml"] = {"name": "."}; - $.FileItem.properties["Details"]["x-ms-xml"] = {"name": "Properties"}; ``` ### ListHandles @@ -862,6 +909,7 @@ directive: $["Content-MD5"]["x-nullable"] = true; $["x-ms-request-server-encrypted"]["x-ms-client-default"] = false; $["x-ms-request-server-encrypted"]["x-nullable"] = true; + delete $["x-ms-file-last-write-time"]; ``` ### UploadFileRangeFromUri @@ -876,6 +924,7 @@ directive: $["x-ms-content-crc64"]["x-nullable"] = true; $["x-ms-request-server-encrypted"]["x-ms-client-default"] = false; $["x-ms-request-server-encrypted"]["x-nullable"] = true; + delete $["x-ms-file-last-write-time"]; ``` ### GetFileRangeList