From 6f6c3c9cdefa93aa44e99bf0f597b2698b47ea4c Mon Sep 17 00:00:00 2001 From: Kan Tang Date: Sun, 24 Jan 2021 18:37:34 -0800 Subject: [PATCH] Added support for specifying public access type when creating a file system. (#1447) --- .../azure-storage-files-datalake/CHANGELOG.md | 1 + .../files/datalake/datalake_options.hpp | 5 + .../src/datalake_file_system_client.cpp | 16 +++ .../test/datalake_file_system_client_test.cpp | 115 +++++++++++------- 4 files changed, 94 insertions(+), 43 deletions(-) diff --git a/sdk/storage/azure-storage-files-datalake/CHANGELOG.md b/sdk/storage/azure-storage-files-datalake/CHANGELOG.md index 0e8765098..ec0a0da99 100644 --- a/sdk/storage/azure-storage-files-datalake/CHANGELOG.md +++ b/sdk/storage/azure-storage-files-datalake/CHANGELOG.md @@ -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. 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 d23005d14..89110d5d0 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 @@ -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; }; /** diff --git a/sdk/storage/azure-storage-files-datalake/src/datalake_file_system_client.cpp b/sdk/storage/azure-storage-files-datalake/src/datalake_file_system_client.cpp index 84eca54aa..2d35af039 100644 --- a/sdk/storage/azure-storage-files-datalake/src/datalake_file_system_client.cpp +++ b/sdk/storage/azure-storage-files-datalake/src/datalake_file_system_client.cpp @@ -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); diff --git a/sdk/storage/azure-storage-files-datalake/test/datalake_file_system_client_test.cpp b/sdk/storage/azure-storage-files-datalake/test/datalake_file_system_client_test.cpp index 3e5961fa3..7d4626442 100644 --- a/sdk/storage/azure-storage-files-datalake/test/datalake_file_system_client_test.cpp +++ b/sdk/storage/azure-storage-files-datalake/test/datalake_file_system_client_test.cpp @@ -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