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);

Reply via email to