Added tests for validation of `GrowVolume` and `ShrinkVolume`. Review: https://reviews.apache.org/r/66858/
Project: http://git-wip-us.apache.org/repos/asf/mesos/repo Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/fa1ca073 Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/fa1ca073 Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/fa1ca073 Branch: refs/heads/master Commit: fa1ca073ceec0fe24073a1c873ebbb328f806885 Parents: 71057f2 Author: Zhitao Li <zhitaoli...@gmail.com> Authored: Thu May 3 17:04:44 2018 -0700 Committer: Chun-Hung Hsiao <chhs...@mesosphere.io> Committed: Thu May 3 17:04:44 2018 -0700 ---------------------------------------------------------------------- src/tests/master_validation_tests.cpp | 298 +++++++++++++++++++++++++++++ 1 file changed, 298 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/mesos/blob/fa1ca073/src/tests/master_validation_tests.cpp ---------------------------------------------------------------------- diff --git a/src/tests/master_validation_tests.cpp b/src/tests/master_validation_tests.cpp index a522961..fb1d8bd 100644 --- a/src/tests/master_validation_tests.cpp +++ b/src/tests/master_validation_tests.cpp @@ -1460,6 +1460,304 @@ TEST_F(DestroyOperationValidationTest, MultipleResourceProviders) } +class GrowVolumeOperationValidationTest : public MesosTest { +protected: + Offer::Operation::GrowVolume createGrowVolume() + { + Resource volume = createPersistentVolume( + Megabytes(128), + "role1", + "id1", + "path1"); + + Resource addition = Resources::parse("disk", "128", "role1").get(); + + Offer::Operation::GrowVolume growVolume; + growVolume.mutable_volume()->CopyFrom(volume); + growVolume.mutable_addition()->CopyFrom(addition); + + return growVolume; + } +}; + + +// This test verifies that validation succeeds on a valid operation. +TEST_F(GrowVolumeOperationValidationTest, Valid) +{ + protobuf::slave::Capabilities capabilities; + capabilities.resizeVolume = true; + + Offer::Operation::GrowVolume growVolume = createGrowVolume(); + + Option<Error> error = operation::validate(growVolume, capabilities); + EXPECT_NONE(error); +} + + +// This test verifies that validation fails if `GrowVolume.volume` is not a +// persistent volume. +TEST_F(GrowVolumeOperationValidationTest, NonPersistentVolume) +{ + protobuf::slave::Capabilities capabilities; + capabilities.resizeVolume = true; + + Offer::Operation::GrowVolume growVolume = createGrowVolume(); + growVolume.mutable_volume()->mutable_disk()->clear_persistence(); + + Option<Error> error = operation::validate(growVolume, capabilities); + EXPECT_SOME(error); +} + + +// This test verifies that validation fails if `GrowVolume.addition` has a zero +// value. +TEST_F(GrowVolumeOperationValidationTest, ZeroAddition) +{ + protobuf::slave::Capabilities capabilities; + capabilities.resizeVolume = true; + + Offer::Operation::GrowVolume growVolume = createGrowVolume(); + growVolume.mutable_addition()->mutable_scalar()->set_value(0); + + Option<Error> error = operation::validate(growVolume, capabilities); + EXPECT_SOME(error); +} + + +// This test verifies that validation fails if `GrowVolume.volume` and +// `GrowVolume.addition' are incompatible. +TEST_F(GrowVolumeOperationValidationTest, IncompatibleDisk) +{ + protobuf::slave::Capabilities capabilities; + capabilities.resizeVolume = true; + + // Make the volume on a PATH disk so it cannot be grown with a ROOT disk. + Resource pathVolume = createPersistentVolume( + Megabytes(128), + "role1", + "id1", + "path1", + None(), + createDiskSourcePath("root")); + + Offer::Operation::GrowVolume growVolume = createGrowVolume(); + growVolume.mutable_volume()->CopyFrom(pathVolume); + + Option<Error> error = operation::validate(growVolume, capabilities); + EXPECT_SOME(error); +} + + +// This test verifies that validation fails if `GrowVolume.volume` is a shared +// persistent volume. +TEST_F(GrowVolumeOperationValidationTest, Shared) +{ + protobuf::slave::Capabilities capabilities; + capabilities.resizeVolume = true; + + Offer::Operation::GrowVolume growVolume = createGrowVolume(); + growVolume.mutable_volume()->mutable_shared(); + + Option<Error> error = operation::validate(growVolume, capabilities); + EXPECT_SOME(error); +} + + +// This test verifies that validation fails if `GrowVolume.volume` has resource +// provider id. +TEST_F(GrowVolumeOperationValidationTest, ResourceProvider) +{ + protobuf::slave::Capabilities capabilities; + capabilities.resizeVolume = true; + + Offer::Operation::GrowVolume growVolume = createGrowVolume(); + growVolume.mutable_volume()->mutable_provider_id()->set_value("provider"); + + Option<Error> error = operation::validate(growVolume, capabilities); + EXPECT_SOME(error); +} + + +// This test verifies that validation fails if `GrowVolume.volume` and +// `GrowVolume.addition` are on MOUNT disks, which are not addable. +TEST_F(GrowVolumeOperationValidationTest, Mount) +{ + protobuf::slave::Capabilities capabilities; + capabilities.resizeVolume = true; + + Resource mountVolume = createPersistentVolume( + Megabytes(128), + "role1", + "id1", + "path1", + None(), + createDiskSourceMount()); + + Resource mountDisk = createDiskResource( + "128", "role1", None(), None(), createDiskSourceMount()); + + Offer::Operation::GrowVolume growVolume = createGrowVolume(); + growVolume.mutable_volume()->CopyFrom(mountVolume); + growVolume.mutable_addition()->CopyFrom(mountDisk); + + Option<Error> error = operation::validate(growVolume, capabilities); + EXPECT_SOME(error); +} + + +// This test verifies that validation fails if agent has no RESIZE_VOLUME +// capability. +TEST_F(GrowVolumeOperationValidationTest, MissingCapability) +{ + protobuf::slave::Capabilities capabilities; + + Option<Error> error = operation::validate(createGrowVolume(), capabilities); + EXPECT_SOME(error); +} + + +class ShrinkVolumeOperationValidationTest : public MesosTest { +protected: + Offer::Operation::ShrinkVolume createShrinkVolume() + { + Resource volume = createPersistentVolume( + Megabytes(128), + "role1", + "id1", + "path1"); + + Offer::Operation::ShrinkVolume shrinkVolume; + shrinkVolume.mutable_volume()->CopyFrom(volume); + shrinkVolume.mutable_subtract()->set_value(64); + + return shrinkVolume; + } +}; + + +// This test verifies that validation succeeds on a valid `ShrinkVolume` +// operation. +TEST_F(ShrinkVolumeOperationValidationTest, Valid) +{ + protobuf::slave::Capabilities capabilities; + capabilities.resizeVolume = true; + + Offer::Operation::ShrinkVolume shrinkVolume = createShrinkVolume(); + + Option<Error> error = operation::validate(shrinkVolume, capabilities); + EXPECT_NONE(error); +} + + +// This test verifies that validation fails if `ShrinkVolume.volume` is not a +// persistent volume. +TEST_F(ShrinkVolumeOperationValidationTest, NonPersistentVolume) +{ + protobuf::slave::Capabilities capabilities; + capabilities.resizeVolume = true; + + Offer::Operation::ShrinkVolume shrinkVolume = createShrinkVolume(); + shrinkVolume.mutable_volume()->mutable_disk()->clear_persistence(); + + Option<Error> error = operation::validate(shrinkVolume, capabilities); + EXPECT_SOME(error); +} + + +// This test verifies that validation fails if `ShrinkVolume.subtract` has a +// zero value. +TEST_F(ShrinkVolumeOperationValidationTest, ZeroSubtract) +{ + protobuf::slave::Capabilities capabilities; + capabilities.resizeVolume = true; + + Offer::Operation::ShrinkVolume shrinkVolume = createShrinkVolume(); + shrinkVolume.mutable_subtract()->set_value(0); + + Option<Error> error = operation::validate(shrinkVolume, capabilities); + EXPECT_SOME(error); +} + + +// This test verifies that validation fails if `ShrinkVolume.subtract` has a +// value equal to the size of `ShrinkVolume.volume` +TEST_F(ShrinkVolumeOperationValidationTest, EmptyAfterShrink) +{ + protobuf::slave::Capabilities capabilities; + capabilities.resizeVolume = true; + + Offer::Operation::ShrinkVolume shrinkVolume = createShrinkVolume(); + shrinkVolume.mutable_subtract()->CopyFrom(shrinkVolume.volume().scalar()); + + Option<Error> error = operation::validate(shrinkVolume, capabilities); + EXPECT_SOME(error); +} + + +// This test verifies that validation fails if `ShrinkVolume.volume` is a +// MOUNT disk. +TEST_F(ShrinkVolumeOperationValidationTest, Mount) +{ + protobuf::slave::Capabilities capabilities; + capabilities.resizeVolume = true; + + Resource mountVolume = createPersistentVolume( + Megabytes(128), + "role1", + "id1", + "path1", + None(), + createDiskSourceMount()); + + Offer::Operation::ShrinkVolume shrinkVolume = createShrinkVolume(); + shrinkVolume.mutable_volume()->CopyFrom(mountVolume); + + Option<Error> error = operation::validate(shrinkVolume, capabilities); + EXPECT_SOME(error); +} + + +// This test verifies that validation fails if `ShrinkVolume.volume` is a +// shared volume. +TEST_F(ShrinkVolumeOperationValidationTest, Shared) +{ + protobuf::slave::Capabilities capabilities; + capabilities.resizeVolume = true; + + Offer::Operation::ShrinkVolume shrinkVolume = createShrinkVolume(); + shrinkVolume.mutable_volume()->mutable_shared(); + + Option<Error> error = operation::validate(shrinkVolume, capabilities); + EXPECT_SOME(error); +} + + +// This test verifies that validation fails if `ShrinkVolume.volume` has +// resource provider id. +TEST_F(ShrinkVolumeOperationValidationTest, ResourceProvider) +{ + protobuf::slave::Capabilities capabilities; + capabilities.resizeVolume = true; + + Offer::Operation::ShrinkVolume shrinkVolume = createShrinkVolume(); + shrinkVolume.mutable_volume()->mutable_provider_id()->set_value("provider"); + + Option<Error> error = operation::validate(shrinkVolume, capabilities); + EXPECT_SOME(error); +} + + +// This test verifies that validation fails if agent has no RESIZE_VOLUME +// capability. +TEST_F(ShrinkVolumeOperationValidationTest, MissingCapability) +{ + protobuf::slave::Capabilities capabilities; + + Option<Error> error = operation::validate(createShrinkVolume(), capabilities); + EXPECT_SOME(error); +} + + TEST(OperationValidationTest, CreateVolume) { Resource disk1 = createDiskResource(