Repository: mesos Updated Branches: refs/heads/master 388e5d5bb -> 31c40e03c
Added printing of extended attributes to Resource objects. Review: https://reviews.apache.org/r/34676 Project: http://git-wip-us.apache.org/repos/asf/mesos/repo Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/31c40e03 Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/31c40e03 Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/31c40e03 Branch: refs/heads/master Commit: 31c40e03cbf299e44febc895db57a8d15707a298 Parents: 388e5d5 Author: Brian Wickman <[email protected]> Authored: Mon Jun 1 16:29:25 2015 -0700 Committer: Vinod Kone <[email protected]> Committed: Mon Jun 1 16:29:26 2015 -0700 ---------------------------------------------------------------------- src/common/resources.cpp | 61 +++++++++++++++++++++++++++++++++++++- src/tests/resources_tests.cpp | 54 +++++++++++++++++++++++++++++++++ 2 files changed, 114 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/mesos/blob/31c40e03/src/common/resources.cpp ---------------------------------------------------------------------- diff --git a/src/common/resources.cpp b/src/common/resources.cpp index d93f38e..01c79fb 100644 --- a/src/common/resources.cpp +++ b/src/common/resources.cpp @@ -338,6 +338,9 @@ Try<Resource> Resources::parse( } +// TODO(wickman) It is possible for Resources::ostream<< to produce +// unparseable resources, i.e. those with +// ReservationInfo/DiskInfo/RevocableInfo. Try<Resources> Resources::parse( const string& text, const string& defaultRole) @@ -1113,9 +1116,65 @@ Resources& Resources::operator -= (const Resources& that) } +ostream& operator << (ostream& stream, const Volume& volume) { + string volumeConfig = volume.container_path(); + + if (volume.has_host_path()) { + volumeConfig = volume.host_path() + ":" + volumeConfig; + + if (volume.has_mode()) { + switch (volume.mode()) { + case Volume::RW: volumeConfig += ":rw"; break; + case Volume::RO: volumeConfig += ":ro"; break; + default: + LOG(FATAL) << "Unknown Volume mode: " << volume.mode(); + break; + } + } + } + + stream << volumeConfig; + + return stream; +} + + +ostream& operator << (ostream& stream, const Resource::DiskInfo& disk) { + if (disk.has_persistence()) { + stream << disk.persistence().id(); + } + + if (disk.has_volume()) { + stream << ":" << disk.volume(); + } + + return stream; +} + + ostream& operator << (ostream& stream, const Resource& resource) { - stream << resource.name() << "(" << resource.role() << "):"; + stream << resource.name(); + + stream << "(" << resource.role(); + + if (resource.has_reservation()) { + stream << ", " << resource.reservation().principal(); + } + + stream << ")"; + + if (resource.has_disk()) { + stream << "[" << resource.disk() << "]"; + } + + // Once extended revocable attributes are available, change this to a more + // meaningful value. + if (resource.has_revocable()) { + stream << "{REV}"; + } + + stream << ":"; switch (resource.type()) { case Value::SCALAR: stream << resource.scalar(); break; http://git-wip-us.apache.org/repos/asf/mesos/blob/31c40e03/src/tests/resources_tests.cpp ---------------------------------------------------------------------- diff --git a/src/tests/resources_tests.cpp b/src/tests/resources_tests.cpp index 459a68b..b4a9bbf 100644 --- a/src/tests/resources_tests.cpp +++ b/src/tests/resources_tests.cpp @@ -180,6 +180,60 @@ TEST(ResourcesTest, Printing) } +TEST(ResourcesTest, PrintingExtendedAttributes) +{ + Resource disk; + disk.set_name("disk"); + disk.set_type(Value::SCALAR); + disk.mutable_scalar()->set_value(1); + + // Standard resource. + ostringstream stream; + stream << disk; + EXPECT_EQ(stream.str(), "disk(*):1"); + + // Standard resource with role. + stream.str(""); + disk.set_role("alice"); + stream << disk; + EXPECT_EQ(stream.str(), "disk(alice):1"); + + // Standard revocable resource. + stream.str(""); + disk.mutable_revocable(); + stream << disk; + EXPECT_EQ(stream.str(), "disk(alice){REV}:1"); + disk.clear_revocable(); + + // Disk resource with persistent volume. + stream.str(""); + disk.mutable_disk()->mutable_persistence()->set_id("hadoop"); + disk.mutable_disk()->mutable_volume()->set_container_path("/data"); + stream << disk; + EXPECT_EQ(stream.str(), "disk(alice)[hadoop:/data]:1"); + + // Ensure {REV} comes after [disk]. + stream.str(""); + disk.mutable_revocable(); + stream << disk; + EXPECT_EQ(stream.str(), "disk(alice)[hadoop:/data]{REV}:1"); + disk.clear_revocable(); + + // Disk resource with host path. + stream.str(""); + disk.mutable_disk()->mutable_volume()->set_host_path("/hdfs"); + disk.mutable_disk()->mutable_volume()->set_mode(Volume::RW); + stream << disk; + EXPECT_EQ(stream.str(), "disk(alice)[hadoop:/hdfs:/data:rw]:1"); + + // Disk resource with host path and reservation. + stream.str(""); + disk.mutable_reservation()->set_principal("hdfs-1234-4321"); + stream << disk; + EXPECT_EQ(stream.str(), "disk(alice, hdfs-1234-4321)[hadoop:/hdfs:/data:rw]:1"); +} + + TEST(ResourcesTest, InitializedIsEmpty) { Resources r;
