This is an automated email from the ASF dual-hosted git repository. chhsiao pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/mesos.git
commit 20b5dda99dda43b47e001dd3826b71597debee02 Author: Chun-Hung Hsiao <chhs...@mesosphere.io> AuthorDate: Wed Nov 14 20:34:51 2018 -0800 Added validation for `Offer.Operation.CreateDisk.target_profile`. Review: https://reviews.apache.org/r/69356 --- src/master/validation.cpp | 6 +++++ src/tests/master_validation_tests.cpp | 44 +++++++++++++++++++++++++++++++---- 2 files changed, 46 insertions(+), 4 deletions(-) diff --git a/src/master/validation.cpp b/src/master/validation.cpp index 5768ac8..5fccc9f 100644 --- a/src/master/validation.cpp +++ b/src/master/validation.cpp @@ -2528,6 +2528,12 @@ Option<Error> validate(const Offer::Operation::CreateDisk& createDisk) return Error("'target_type' is neither MOUNT or BLOCK"); } + if (source.disk().source().has_profile() == createDisk.has_target_profile()) { + return createDisk.has_target_profile() + ? Error("'target_profile' must not be set when 'source' has a profile") + : Error("'target_profile' must be set when 'source' has no profile"); + } + return None(); } diff --git a/src/tests/master_validation_tests.cpp b/src/tests/master_validation_tests.cpp index aa7c8f7..3aa7b2a 100644 --- a/src/tests/master_validation_tests.cpp +++ b/src/tests/master_validation_tests.cpp @@ -2025,32 +2025,46 @@ TEST_F(ShrinkVolumeOperationValidationTest, MissingCapability) TEST(OperationValidationTest, CreateDisk) { Resource disk1 = createDiskResource( - "10", "*", None(), None(), createDiskSourceRaw()); + "10", "*", None(), None(), createDiskSourceRaw(None(), "profile")); Resource disk2 = createDiskResource( - "20", "*", None(), None(), createDiskSourceMount()); + "20", "*", None(), None(), createDiskSourceRaw()); Resource disk3 = createDiskResource( - "30", "*", None(), None(), createDiskSourceRaw()); + "30", "*", None(), None(), createDiskSourceMount()); + + Resource disk4 = createDiskResource( + "40", "*", None(), None(), createDiskSourceRaw(None(), "profile")); disk1.mutable_provider_id()->set_value("provider1"); disk2.mutable_provider_id()->set_value("provider2"); + disk3.mutable_provider_id()->set_value("provider3"); Offer::Operation::CreateDisk createDisk; createDisk.mutable_source()->CopyFrom(disk1); createDisk.set_target_type(Resource::DiskInfo::Source::MOUNT); + createDisk.clear_target_profile(); Option<Error> error = operation::validate(createDisk); EXPECT_NONE(error); createDisk.mutable_source()->CopyFrom(disk1); createDisk.set_target_type(Resource::DiskInfo::Source::BLOCK); + createDisk.clear_target_profile(); + + error = operation::validate(createDisk); + EXPECT_NONE(error); + + createDisk.mutable_source()->CopyFrom(disk2); + createDisk.set_target_type(Resource::DiskInfo::Source::MOUNT); + createDisk.set_target_profile("profile"); error = operation::validate(createDisk); EXPECT_NONE(error); createDisk.mutable_source()->CopyFrom(disk1); createDisk.set_target_type(Resource::DiskInfo::Source::PATH); + createDisk.clear_target_profile(); error = operation::validate(createDisk); ASSERT_SOME(error); @@ -2058,17 +2072,39 @@ TEST(OperationValidationTest, CreateDisk) error->message, "'target_type' is neither MOUNT or BLOCK")); + createDisk.mutable_source()->CopyFrom(disk1); + createDisk.set_target_type(Resource::DiskInfo::Source::MOUNT); + createDisk.set_target_profile("profile"); + + error = operation::validate(createDisk); + ASSERT_SOME(error); + EXPECT_TRUE(strings::contains( + error->message, + "'target_profile' must not be set when 'source' has a profile")); + createDisk.mutable_source()->CopyFrom(disk2); createDisk.set_target_type(Resource::DiskInfo::Source::MOUNT); + createDisk.clear_target_profile(); error = operation::validate(createDisk); ASSERT_SOME(error); EXPECT_TRUE(strings::contains( error->message, - "'source' is not a RAW disk resource")); + "'target_profile' must be set when 'source' has no profile")); createDisk.mutable_source()->CopyFrom(disk3); createDisk.set_target_type(Resource::DiskInfo::Source::MOUNT); + createDisk.clear_target_profile(); + + error = operation::validate(createDisk); + ASSERT_SOME(error); + EXPECT_TRUE(strings::contains( + error->message, + "'source' is not a RAW disk resource")); + + createDisk.mutable_source()->CopyFrom(disk4); + createDisk.set_target_type(Resource::DiskInfo::Source::MOUNT); + createDisk.clear_target_profile(); error = operation::validate(createDisk); ASSERT_SOME(error);