Added support for specifying public access type when creating a file system. (#1447)

This commit is contained in:
Kan Tang 2021-01-24 18:37:34 -08:00 committed by GitHub
parent 6b71b5416d
commit 6f6c3c9cde
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 94 additions and 43 deletions

View File

@ -10,6 +10,7 @@
- Moved all protocol layer generated result types to `Details` namespace.
- Renamed `FileSystem` type returned from `ListDataLakeFileSystems` to be `FileSystemItem`. Member object name `FileSystems` is renamed to `Items`.
- Renamed `Path` type returned from `ListDataLakePaths` to be `PathItem`. Member object name `Paths` is renamed to `Items`.
- Added support for specifying public access type when creating a file system.
- Added `DataLakeDirectoryClient::ListPathsSinglePage` API to list DataLake paths under certain directory.
- Added `Metadata`, `AccessType`, `HasImmutabilityPolicy`, `HasLegalHold`, `LeaseDuration`, `LeaseState` and `LeaseStatus` to `FileSystemItem`.
- Added new type `LeaseDurationType` to indicate if a lease duration is fixed or infinite.

View File

@ -120,6 +120,11 @@ namespace Azure { namespace Storage { namespace Files { namespace DataLake {
* ISO-8859-1 character set.
*/
Storage::Metadata Metadata;
/**
* @brief The public access type of the file system.
*/
Models::PublicAccessType AccessType = Models::PublicAccessType::None;
};
/**

View File

@ -193,6 +193,22 @@ namespace Azure { namespace Storage { namespace Files { namespace DataLake {
Blobs::CreateBlobContainerOptions blobOptions;
blobOptions.Context = options.Context;
blobOptions.Metadata = options.Metadata;
if (options.AccessType == Models::PublicAccessType::FileSystem)
{
blobOptions.AccessType = Blobs::Models::PublicAccessType::BlobContainer;
}
else if (options.AccessType == Models::PublicAccessType::Path)
{
blobOptions.AccessType = Blobs::Models::PublicAccessType::Blob;
}
else if (options.AccessType == Models::PublicAccessType::None)
{
blobOptions.AccessType = Blobs::Models::PublicAccessType::Private;
}
else
{
blobOptions.AccessType = Blobs::Models::PublicAccessType(options.AccessType.Get());
}
auto result = m_blobContainerClient.Create(blobOptions);
Models::CreateDataLakeFileSystemResult ret;
ret.ETag = std::move(result->ETag);

View File

@ -368,50 +368,79 @@ namespace Azure { namespace Storage { namespace Test {
TEST_F(DataLakeFileSystemClientTest, GetSetAccessPolicy)
{
auto fileSystem = Files::DataLake::DataLakeFileSystemClient::CreateFromConnectionString(
AdlsGen2ConnectionString(), LowercaseRandomString());
fileSystem.Create();
Files::DataLake::SetDataLakeFileSystemAccessPolicyOptions options;
options.AccessType = Files::DataLake::Models::PublicAccessType::Path;
Files::DataLake::Models::DataLakeSignedIdentifier identifier;
identifier.Id = RandomString(64);
identifier.StartsOn = std::chrono::system_clock::now() - std::chrono::minutes(1);
identifier.ExpiresOn = std::chrono::system_clock::now() + std::chrono::minutes(1);
identifier.Permissions = "r";
options.SignedIdentifiers.emplace_back(identifier);
identifier.Id = RandomString(64);
identifier.StartsOn = std::chrono::system_clock::now() - std::chrono::minutes(2);
identifier.ExpiresOn = std::chrono::system_clock::now() + std::chrono::minutes(2);
identifier.Permissions = "racwdxlt";
options.SignedIdentifiers.emplace_back(identifier);
auto ret = fileSystem.SetAccessPolicy(options);
EXPECT_FALSE(ret->ETag.empty());
EXPECT_TRUE(IsValidTime(ret->LastModified));
auto ret2 = fileSystem.GetAccessPolicy();
EXPECT_EQ(ret2->ETag, ret->ETag);
EXPECT_EQ(ret2->LastModified, ret->LastModified);
EXPECT_EQ(ret2->AccessType, options.AccessType);
for (size_t i = 0; i < ret2->SignedIdentifiers.size(); ++i)
{
EXPECT_EQ(ret2->SignedIdentifiers[i].StartsOn, options.SignedIdentifiers[i].StartsOn);
EXPECT_EQ(ret2->SignedIdentifiers[i].ExpiresOn, options.SignedIdentifiers[i].ExpiresOn);
EXPECT_EQ(ret2->SignedIdentifiers[i].Id, options.SignedIdentifiers[i].Id);
EXPECT_EQ(ret2->SignedIdentifiers[i].Permissions, options.SignedIdentifiers[i].Permissions);
auto fileSystem = Files::DataLake::DataLakeFileSystemClient::CreateFromConnectionString(
AdlsGen2ConnectionString(), LowercaseRandomString());
fileSystem.Create();
Files::DataLake::SetDataLakeFileSystemAccessPolicyOptions options;
options.AccessType = Files::DataLake::Models::PublicAccessType::Path;
Files::DataLake::Models::DataLakeSignedIdentifier identifier;
identifier.Id = RandomString(64);
identifier.StartsOn = std::chrono::system_clock::now() - std::chrono::minutes(1);
identifier.ExpiresOn = std::chrono::system_clock::now() + std::chrono::minutes(1);
identifier.Permissions = "r";
options.SignedIdentifiers.emplace_back(identifier);
identifier.Id = RandomString(64);
identifier.StartsOn = std::chrono::system_clock::now() - std::chrono::minutes(2);
identifier.ExpiresOn = std::chrono::system_clock::now() + std::chrono::minutes(2);
identifier.Permissions = "racwdxlt";
options.SignedIdentifiers.emplace_back(identifier);
auto ret = fileSystem.SetAccessPolicy(options);
EXPECT_FALSE(ret->ETag.empty());
EXPECT_TRUE(IsValidTime(ret->LastModified));
auto ret2 = fileSystem.GetAccessPolicy();
EXPECT_EQ(ret2->ETag, ret->ETag);
EXPECT_EQ(ret2->LastModified, ret->LastModified);
EXPECT_EQ(ret2->AccessType, options.AccessType);
for (size_t i = 0; i < ret2->SignedIdentifiers.size(); ++i)
{
EXPECT_EQ(ret2->SignedIdentifiers[i].StartsOn, options.SignedIdentifiers[i].StartsOn);
EXPECT_EQ(ret2->SignedIdentifiers[i].ExpiresOn, options.SignedIdentifiers[i].ExpiresOn);
EXPECT_EQ(ret2->SignedIdentifiers[i].Id, options.SignedIdentifiers[i].Id);
EXPECT_EQ(ret2->SignedIdentifiers[i].Permissions, options.SignedIdentifiers[i].Permissions);
}
options.AccessType = Files::DataLake::Models::PublicAccessType::FileSystem;
EXPECT_NO_THROW(fileSystem.SetAccessPolicy(options));
ret2 = fileSystem.GetAccessPolicy();
EXPECT_EQ(ret2->AccessType, options.AccessType);
options.AccessType = Files::DataLake::Models::PublicAccessType::None;
EXPECT_NO_THROW(fileSystem.SetAccessPolicy(options));
ret2 = fileSystem.GetAccessPolicy();
EXPECT_EQ(ret2->AccessType, options.AccessType);
fileSystem.Delete();
}
{
auto fileSystem = Files::DataLake::DataLakeFileSystemClient::CreateFromConnectionString(
AdlsGen2ConnectionString(), LowercaseRandomString());
Files::DataLake::CreateDataLakeFileSystemOptions options;
options.AccessType = Files::DataLake::Models::PublicAccessType::FileSystem;
fileSystem.Create(options);
auto ret = fileSystem.GetAccessPolicy();
EXPECT_EQ(Files::DataLake::Models::PublicAccessType::FileSystem, ret->AccessType);
}
{
auto fileSystem = Files::DataLake::DataLakeFileSystemClient::CreateFromConnectionString(
AdlsGen2ConnectionString(), LowercaseRandomString());
Files::DataLake::CreateDataLakeFileSystemOptions options;
options.AccessType = Files::DataLake::Models::PublicAccessType::Path;
fileSystem.Create(options);
auto ret = fileSystem.GetAccessPolicy();
EXPECT_EQ(Files::DataLake::Models::PublicAccessType::Path, ret->AccessType);
}
{
auto fileSystem = Files::DataLake::DataLakeFileSystemClient::CreateFromConnectionString(
AdlsGen2ConnectionString(), LowercaseRandomString());
Files::DataLake::CreateDataLakeFileSystemOptions options;
options.AccessType = Files::DataLake::Models::PublicAccessType::Path;
fileSystem.Create(options);
auto ret = fileSystem.GetAccessPolicy();
EXPECT_EQ(Files::DataLake::Models::PublicAccessType::Path, ret->AccessType);
}
options.AccessType = Files::DataLake::Models::PublicAccessType::FileSystem;
EXPECT_NO_THROW(fileSystem.SetAccessPolicy(options));
ret2 = fileSystem.GetAccessPolicy();
EXPECT_EQ(ret2->AccessType, options.AccessType);
// options.AccessType = Files::DataLake::Models::PublicAccessType::Private;
// EXPECT_NO_THROW(fileSystem.SetAccessPolicy(options));
// ret2 = fileSystem.GetAccessPolicy();
// EXPECT_EQ(ret2->AccessType, options.AccessType.GetValue());
fileSystem.Delete();
}
}}} // namespace Azure::Storage::Test