Repository: mesos Updated Branches: refs/heads/master 71c500a72 -> 4bf5833e5
Implemented prepare() method of "network/cni" isolator. Review: https://reviews.apache.org/r/44514/ Project: http://git-wip-us.apache.org/repos/asf/mesos/repo Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/4bf5833e Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/4bf5833e Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/4bf5833e Branch: refs/heads/master Commit: 4bf5833e58324df65e48f607a0d2b73b56f23f40 Parents: 71c500a Author: Qian Zhang <zhang...@cn.ibm.com> Authored: Thu Mar 24 16:09:26 2016 -0700 Committer: Jie Yu <yujie....@gmail.com> Committed: Thu Mar 24 16:09:26 2016 -0700 ---------------------------------------------------------------------- .../mesos/isolators/network/cni/cni.cpp | 58 ++++++++++++++++++++ .../mesos/isolators/network/cni/cni.hpp | 24 ++++++++ 2 files changed, 82 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/mesos/blob/4bf5833e/src/slave/containerizer/mesos/isolators/network/cni/cni.cpp ---------------------------------------------------------------------- diff --git a/src/slave/containerizer/mesos/isolators/network/cni/cni.cpp b/src/slave/containerizer/mesos/isolators/network/cni/cni.cpp index 9552312..7cda571 100644 --- a/src/slave/containerizer/mesos/isolators/network/cni/cni.cpp +++ b/src/slave/containerizer/mesos/isolators/network/cni/cni.cpp @@ -19,6 +19,8 @@ #include <stout/os.hpp> +#include "linux/ns.hpp" + #include "slave/containerizer/mesos/isolators/network/cni/cni.hpp" namespace spec = mesos::internal::slave::cni::spec; @@ -26,9 +28,11 @@ namespace spec = mesos::internal::slave::cni::spec; using std::list; using std::set; using std::string; +using std::vector; using process::Future; using process::Owned; +using process::Failure; using mesos::slave::ContainerConfig; using mesos::slave::ContainerLaunchInfo; @@ -204,6 +208,60 @@ Future<Option<ContainerLaunchInfo>> NetworkCniIsolatorProcess::prepare( const ContainerID& containerId, const ContainerConfig& containerConfig) { + if (infos.contains(containerId)) { + return Failure("Container has already been prepared"); + } + + const ExecutorInfo& executorInfo = containerConfig.executor_info(); + if (!executorInfo.has_container()) { + return None(); + } + + if (executorInfo.container().type() != ContainerInfo::MESOS) { + return Failure("Can only prepare CNI networks for a MESOS container"); + } + + if (executorInfo.container().network_infos_size() == 0) { + return None(); + } + + int ifIndex = 0; + hashset<string> networkNames; + hashmap<string, NetworkInfo> networkInfos; + foreach (const mesos::NetworkInfo& netInfo, + executorInfo.container().network_infos()) { + if (!netInfo.has_name()) { + continue; + } + + const string& name = netInfo.name(); + if (!networkConfigs.contains(name)) { + return Failure("Unknown CNI network '" + name + "'"); + } + + if (networkNames.contains(name)) { + return Failure( + "Attempted to join CNI network '" + name + "' multiple times"); + } + + networkNames.insert(name); + + NetworkInfo networkInfo; + networkInfo.networkName = name; + networkInfo.ifName = "eth" + stringify(ifIndex++); + + networkInfos.put(name, networkInfo); + } + + if (!networkInfos.empty()) { + infos.put(containerId, Owned<Info>(new Info(networkInfos))); + + ContainerLaunchInfo launchInfo; + launchInfo.set_namespaces(CLONE_NEWNET | CLONE_NEWNS | CLONE_NEWUTS); + + return launchInfo; + } + return None(); } http://git-wip-us.apache.org/repos/asf/mesos/blob/4bf5833e/src/slave/containerizer/mesos/isolators/network/cni/cni.hpp ---------------------------------------------------------------------- diff --git a/src/slave/containerizer/mesos/isolators/network/cni/cni.hpp b/src/slave/containerizer/mesos/isolators/network/cni/cni.hpp index 3878a7e..b1b7205 100644 --- a/src/slave/containerizer/mesos/isolators/network/cni/cni.hpp +++ b/src/slave/containerizer/mesos/isolators/network/cni/cni.hpp @@ -79,6 +79,27 @@ private: cni::spec::NetworkConfig config; }; + struct NetworkInfo + { + // CNI network name. + std::string networkName; + + // Interface name. + std::string ifName; + + // Protobuf of CNI network information returned by CNI plugin. + Option<cni::spec::NetworkInfo> network; + }; + + struct Info + { + Info (const hashmap<std::string, NetworkInfo>& _networkInfos) + : networkInfos (_networkInfos) {} + + // CNI network information keyed by network name. + hashmap<std::string, NetworkInfo> networkInfos; + }; + NetworkCniIsolatorProcess( const Flags& _flags, const hashmap<std::string, NetworkConfigInfo>& _networkConfigs) @@ -89,6 +110,9 @@ private: // CNI network configurations keyed by network name. hashmap<std::string, NetworkConfigInfo> networkConfigs; + + // Information of CNI networks that each container joins. + hashmap<ContainerID, process::Owned<Info>> infos; }; } // namespace slave {