Added capabilities support to mesos-execute. Review: https://reviews.apache.org/r/52741/
Project: http://git-wip-us.apache.org/repos/asf/mesos/repo Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/f6d5b883 Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/f6d5b883 Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/f6d5b883 Branch: refs/heads/master Commit: f6d5b883d1b61eb0fd97e60bfb363ac706ab30ed Parents: 057fd2c Author: Jie Yu <yujie....@gmail.com> Authored: Tue Oct 18 10:12:21 2016 -0700 Committer: Jie Yu <yujie....@gmail.com> Committed: Tue Oct 18 13:39:24 2016 -0700 ---------------------------------------------------------------------- src/cli/execute.cpp | 40 ++++++++++++++++++++++++++++++++++------ 1 file changed, 34 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/mesos/blob/f6d5b883/src/cli/execute.cpp ---------------------------------------------------------------------- diff --git a/src/cli/execute.cpp b/src/cli/execute.cpp index f308b34..c7d6aa8 100644 --- a/src/cli/execute.cpp +++ b/src/cli/execute.cpp @@ -46,6 +46,8 @@ #include "internal/devolve.hpp" +#include "common/parse.hpp" + using std::cerr; using std::cout; using std::endl; @@ -58,6 +60,7 @@ using google::protobuf::RepeatedPtrField; using mesos::internal::devolve; using mesos::v1::AgentID; +using mesos::v1::CapabilityInfo; using mesos::v1::CommandInfo; using mesos::v1::ContainerInfo; using mesos::v1::Credential; @@ -209,6 +212,18 @@ public: "Containerizer to be used (i.e., docker, mesos).", "mesos"); + add(&Flags::capabilities, + "capabilities", + "JSON representation of system capabilities needed to execute \n" + "the command.\n" + "Example:\n" + "{\n" + " \"capabilities\": [\n" + " \"NET_RAW\",\n" + " \"SYS_ADMIN\"\n" + " ]\n" + "}"); + add(&Flags::role, "role", "Role to use when registering.", @@ -282,6 +297,7 @@ public: Option<std::set<string>> framework_capabilities; Option<JSON::Array> volumes; string containerizer; + Option<CapabilityInfo> capabilities; string role; Option<Duration> kill_after; Option<string> networks; @@ -651,7 +667,8 @@ static Result<ContainerInfo> getContainerInfo( const Option<vector<Volume>>& volumes, const Option<string>& networks, const Option<string>& appcImage, - const Option<string>& dockerImage) + const Option<string>& dockerImage, + const Option<CapabilityInfo>& capabilities) { if (containerizer.empty()) { return None(); @@ -667,7 +684,9 @@ static Result<ContainerInfo> getContainerInfo( // Mesos containerizer supports 'appc' and 'docker' images. if (containerizer == "mesos") { - if (dockerImage.isNone() && appcImage.isNone() && + if (appcImage.isNone() && + capabilities.isNone() && + dockerImage.isNone() && (networks.isNone() || networks->empty()) && (volumes.isNone() || volumes->empty())) { return None(); @@ -712,6 +731,13 @@ static Result<ContainerInfo> getContainerInfo( } } + if (capabilities.isSome()) { + containerInfo + .mutable_linux_info() + ->mutable_capability_info() + ->CopyFrom(capabilities.get()); + } + return containerInfo; } else if (containerizer == "docker") { // 'docker' containerizer only supports 'docker' images. @@ -893,7 +919,7 @@ int main(int argc, char** argv) } // We set the TASK_KILLING_STATE capability by default. - vector<FrameworkInfo::Capability::Type> capabilities = + vector<FrameworkInfo::Capability::Type> frameworkCapabilities = { FrameworkInfo::Capability::TASK_KILLING_STATE }; if (flags.framework_capabilities.isSome()) { @@ -914,7 +940,7 @@ int main(int argc, char** argv) return EXIT_FAILURE; } - capabilities.push_back(type); + frameworkCapabilities.push_back(type); } } @@ -944,7 +970,8 @@ int main(int argc, char** argv) frameworkInfo.set_name("mesos-execute instance"); frameworkInfo.set_role(flags.role); frameworkInfo.set_checkpoint(flags.checkpoint); - foreach (const FrameworkInfo::Capability::Type& capability, capabilities) { + foreach (const FrameworkInfo::Capability::Type& capability, + frameworkCapabilities) { frameworkInfo.add_capabilities()->set_type(capability); } @@ -1012,7 +1039,8 @@ int main(int argc, char** argv) volumes, flags.networks, appcImage, - dockerImage); + dockerImage, + flags.capabilities); if (containerInfo.isError()){ EXIT(EXIT_FAILURE) << containerInfo.error();