Added SetExpiry DataLake convenience layer. (#696)

This commit is contained in:
Kan Tang 2020-09-30 01:13:37 -07:00 committed by GitHub
parent e238e28b0d
commit a898fd819a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 112 additions and 0 deletions

View File

@ -227,6 +227,18 @@ namespace Azure { namespace Storage { namespace Files { namespace DataLake {
const std::string& file,
const DownloadFileToOptions& options = DownloadFileToOptions()) const;
/**
* @brief Schedules the file for deletion.
* @param expiryOrigin Specify the origin of expiry.
* @param options Optional parameters to schedule the file for deletion.
* @return Azure::Core::Response<ScheduleFileDeletionResult> containing the information and
* content returned when schedule the file for deletion.
* @remark This request is sent to blob endpoint.
*/
Azure::Core::Response<ScheduleFileDeletionResult> ScheduleDeletion(
ScheduleFileExpiryOriginType expiryOrigin,
const ScheduleFileDeletionOptions& options = ScheduleFileDeletionOptions()) const;
private:
Blobs::BlockBlobClient m_blockBlobClient;

View File

@ -681,6 +681,32 @@ namespace Azure { namespace Storage { namespace Files { namespace DataLake {
int Concurrency = 1;
};
using ScheduleFileExpiryOriginType = Blobs::ScheduleBlobExpiryOriginType;
/**
* @brief Optional parameters for FileClient::UploadFromBuffer and FileClient::UploadFromFile
*/
struct ScheduleFileDeletionOptions
{
/**
* @brief Context for cancelling long running operations.
*/
Azure::Core::Context Context;
/**
* @brief The expiry time from the specified origin. Only work if ExpiryOrigin is
* ScheduleFileExpiryOriginType::RelativeToCreation or
* ScheduleFileExpiryOriginType::RelativeToNow.
*/
Azure::Core::Nullable<int64_t> TimeToExpireInMs;
/**
* @brief The expiry time in RFC1123 format. Only work if ExpiryOrigin is
* ScheduleFileExpiryOriginType::Absolute.
*/
Azure::Core::Nullable<std::string> ExpiresOn;
};
/**
* @brief Optional parameters for FileClient::DownloadToBuffer and FileClient::DownloadToFile.
*/

View File

@ -93,6 +93,8 @@ namespace Azure { namespace Storage { namespace Files { namespace DataLake {
Azure::Core::Nullable<Blobs::CopyStatus> CopyStatus;
Azure::Core::Nullable<std::string> CopyProgress;
Azure::Core::Nullable<std::string> CopyCompletionTime;
Azure::Core::Nullable<std::string> ExpiryTime;
Azure::Core::Nullable<std::string> LastAccessTime;
};
struct GetPathAccessControlResult
@ -128,6 +130,7 @@ namespace Azure { namespace Storage { namespace Files { namespace DataLake {
using UploadFileFromResult = Blobs::UploadBlockBlobResult;
using AppendFileDataResult = PathAppendDataResult;
using FlushFileDataResult = PathFlushDataResult;
using ScheduleFileDeletionResult = Blobs::SetBlobExpiryResult;
struct ReadFileResult
{
@ -143,6 +146,9 @@ namespace Azure { namespace Storage { namespace Files { namespace DataLake {
LeaseStatusType LeaseStatus = LeaseStatusType::Unknown;
Azure::Core::Nullable<std::string> ContentMd5;
std::map<std::string, std::string> Metadata;
std::string CreationTime;
Azure::Core::Nullable<std::string> ExpiryTime;
Azure::Core::Nullable<std::string> LastAccessTime;
};
struct RenameFileResult

View File

@ -323,6 +323,9 @@ namespace Azure { namespace Storage { namespace Files { namespace DataLake {
? FromBlobLeaseStatus(result->LeaseStatus.GetValue())
: ret.LeaseStatus;
ret.Metadata = std::move(result->Metadata);
ret.CreationTime = std::move(result->CreationTime);
ret.ExpiryTime = std::move(result->ExpiryTime);
ret.LastAccessTime = std::move(result->LastAccessTime);
return Azure::Core::Response<ReadFileResult>(std::move(ret), result.ExtractRawResponse());
}
@ -386,4 +389,26 @@ namespace Azure { namespace Storage { namespace Files { namespace DataLake {
return Azure::Core::Response<DownloadFileToResult>(std::move(ret), result.ExtractRawResponse());
}
Azure::Core::Response<ScheduleFileDeletionResult> FileClient::ScheduleDeletion(
ScheduleFileExpiryOriginType expiryOrigin,
const ScheduleFileDeletionOptions& options) const
{
Blobs::BlobRestClient::Blob::SetBlobExpiryOptions protocolLayerOptions;
protocolLayerOptions.ExpiryOrigin = expiryOrigin;
if (options.ExpiresOn.HasValue() && options.TimeToExpireInMs.HasValue())
{
throw std::runtime_error("ExpiresOn and TimeToExpireInMs should be mutually exlusive.");
}
if (options.ExpiresOn.HasValue())
{
protocolLayerOptions.ExpiryTime = options.ExpiresOn;
}
else if (options.TimeToExpireInMs.HasValue())
{
protocolLayerOptions.ExpiryTime = std::to_string(options.TimeToExpireInMs.GetValue());
}
return Blobs::BlobRestClient::Blob::ScheduleDeletion(
options.Context, *m_pipeline, m_blobClient.m_blobUrl, protocolLayerOptions);
}
}}}} // namespace Azure::Storage::Files::DataLake

View File

@ -303,6 +303,8 @@ namespace Azure { namespace Storage { namespace Files { namespace DataLake {
ret.CopyStatus = std::move(result->CopyStatus);
ret.CopyProgress = std::move(result->CopyProgress);
ret.CopyCompletionTime = std::move(result->CopyCompletionTime);
ret.ExpiryTime = std::move(result->ExpiryTime);
ret.LastAccessTime = std::move(result->LastAccessTime);
return Azure::Core::Response<GetPathPropertiesResult>(
std::move(ret), result.ExtractRawResponse());
}

View File

@ -377,4 +377,45 @@ namespace Azure { namespace Storage { namespace Test {
}
}
TEST_F(DataLakeFileClientTest, ScheduleForDeletion)
{
{
auto client = m_fileSystemClient->GetFileClient(LowercaseRandomString());
EXPECT_NO_THROW(client.Create());
EXPECT_NO_THROW(
client.ScheduleDeletion(Files::DataLake::ScheduleFileExpiryOriginType::NeverExpire));
}
{
auto client = m_fileSystemClient->GetFileClient(LowercaseRandomString());
EXPECT_NO_THROW(client.Create());
Files::DataLake::ScheduleFileDeletionOptions options;
EXPECT_THROW(
client.ScheduleDeletion(
Files::DataLake::ScheduleFileExpiryOriginType::RelativeToNow, options),
StorageError);
options.TimeToExpireInMs = 1000;
EXPECT_NO_THROW(client.ScheduleDeletion(
Files::DataLake::ScheduleFileExpiryOriginType::RelativeToNow, options));
}
{
auto client = m_fileSystemClient->GetFileClient(LowercaseRandomString());
EXPECT_NO_THROW(client.Create());
Files::DataLake::ScheduleFileDeletionOptions options;
EXPECT_THROW(
client.ScheduleDeletion(Files::DataLake::ScheduleFileExpiryOriginType::Absolute, options),
StorageError);
options.TimeToExpireInMs = 1000;
EXPECT_THROW(
client.ScheduleDeletion(Files::DataLake::ScheduleFileExpiryOriginType::Absolute, options),
StorageError);
options.ExpiresOn = "Tue, 29 Sep 2100 09:53:03 GMT";
EXPECT_THROW(
client.ScheduleDeletion(Files::DataLake::ScheduleFileExpiryOriginType::Absolute, options),
std::runtime_error);
options.TimeToExpireInMs = Azure::Core::Nullable<int64_t>();
EXPECT_NO_THROW(client.ScheduleDeletion(
Files::DataLake::ScheduleFileExpiryOriginType::Absolute, options));
}
}
}}} // namespace Azure::Storage::Test