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 {

Reply via email to