You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by ji...@apache.org on 2016/04/05 18:46:54 UTC

mesos git commit: Adjusted the status semantics in CNI isolator.

Repository: mesos
Updated Branches:
  refs/heads/master e81046dc1 -> 5fcc857ef


Adjusted the status semantics in CNI isolator.

This patch also does a few minor cleanups.

Review: https://reviews.apache.org/r/45620


Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/5fcc857e
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/5fcc857e
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/5fcc857e

Branch: refs/heads/master
Commit: 5fcc857efd5eaadb13715aac71a66368a6ae0ecc
Parents: e81046d
Author: Jie Yu <yu...@gmail.com>
Authored: Sat Apr 2 11:37:51 2016 -0700
Committer: Jie Yu <yu...@gmail.com>
Committed: Tue Apr 5 09:46:50 2016 -0700

----------------------------------------------------------------------
 .../mesos/isolators/network/cni/cni.cpp         | 60 +++++++++++---------
 .../mesos/isolators/network/cni/cni.hpp         | 10 ++--
 2 files changed, 39 insertions(+), 31 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/5fcc857e/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 af5f490..5640f4b 100644
--- a/src/slave/containerizer/mesos/isolators/network/cni/cni.cpp
+++ b/src/slave/containerizer/mesos/isolators/network/cni/cni.cpp
@@ -319,7 +319,7 @@ Future<Nothing> NetworkCniIsolatorProcess::recover(
   foreach (const ContainerState& state, states) {
     const ContainerID& containerId = state.container_id();
 
-    Try<Nothing> recover = _recover(containerId, state.executor_info());
+    Try<Nothing> recover = _recover(containerId, state);
     if (recover.isError()) {
       return Failure(
           "Failed to recover CNI network information for container " +
@@ -367,7 +367,7 @@ Future<Nothing> NetworkCniIsolatorProcess::recover(
 
 Try<Nothing> NetworkCniIsolatorProcess::_recover(
     const ContainerID& containerId,
-    const Option<ExecutorInfo>& executorInfo)
+    const Option<ContainerState>& state)
 {
   // NOTE: This method will add an 'Info' to 'infos' only if the container was
   // launched by the CNI isolator and joined CNI network(s), and cleanup _might_
@@ -434,11 +434,11 @@ Try<Nothing> NetworkCniIsolatorProcess::_recover(
     containerNetwork.networkName = networkName;
     containerNetwork.ifName = interfaces->front();
 
-    if (executorInfo.isSome()) {
-      foreach (const mesos::NetworkInfo& _networkInfo,
-               executorInfo->container().network_infos()) {
-        if (_networkInfo.name() == networkName) {
-          containerNetwork.networkInfo = _networkInfo;
+    if (state.isSome()) {
+      foreach (const mesos::NetworkInfo& networkInfo,
+               state->executor_info().container().network_infos()) {
+        if (networkInfo.name() == networkName) {
+          containerNetwork.networkInfo = networkInfo;
         }
       }
     }
@@ -518,13 +518,13 @@ Future<Option<ContainerLaunchInfo>> NetworkCniIsolatorProcess::prepare(
   int ifIndex = 0;
   hashset<string> networkNames;
   hashmap<string, ContainerNetwork> containerNetworks;
-  foreach (const mesos::NetworkInfo& _networkInfo,
+  foreach (const mesos::NetworkInfo& networkInfo,
            executorInfo.container().network_infos()) {
-    if (!_networkInfo.has_name()) {
+    if (!networkInfo.has_name()) {
       continue;
     }
 
-    const string& name = _networkInfo.name();
+    const string& name = networkInfo.name();
     if (!networkConfigs.contains(name)) {
       return Failure("Unknown CNI network '" + name + "'");
     }
@@ -539,7 +539,7 @@ Future<Option<ContainerLaunchInfo>> NetworkCniIsolatorProcess::prepare(
     ContainerNetwork containerNetwork;
     containerNetwork.networkName = name;
     containerNetwork.ifName = "eth" + stringify(ifIndex++);
-    containerNetwork.networkInfo = _networkInfo;
+    containerNetwork.networkInfo = networkInfo;
 
     containerNetworks.put(name, containerNetwork);
   }
@@ -814,30 +814,38 @@ Future<ResourceStatistics> NetworkCniIsolatorProcess::usage(
 Future<ContainerStatus> NetworkCniIsolatorProcess::status(
     const ContainerID& containerId)
 {
+  // TODO(jieyu): We don't create 'Info' struct for containers that
+  // want to join the host network. Currently, we rely on the
+  // slave/containerizer to set the IP addresses in ContainerStatus.
+  // Consider returning the IP address of the slave here.
   if (!infos.contains(containerId)) {
     return ContainerStatus();
   }
 
   ContainerStatus status;
-  foreachvalue (const ContainerNetwork& _containerNetwork,
+  foreachvalue (const ContainerNetwork& containerNetwork,
                 infos[containerId]->containerNetworks) {
-    mesos::NetworkInfo* networkInfo = status.add_network_infos();
-    networkInfo->CopyFrom(_containerNetwork.networkInfo);
+    CHECK_SOME(containerNetwork.networkInfo);
 
-    if (_containerNetwork.cniNetworkInfo.isSome()) {
-      networkInfo->clear_ip_addresses();
+    // NOTE: 'cniNetworkInfo' is None() before 'isolate()' finishes.
+    if (containerNetwork.cniNetworkInfo.isNone()) {
+      continue;
+    }
 
-      if (_containerNetwork.cniNetworkInfo->has_ip4()) {
-        mesos::NetworkInfo::IPAddress* ip = networkInfo->add_ip_addresses();
-        ip->set_protocol(mesos::NetworkInfo::IPv4);
-        ip->set_ip_address(_containerNetwork.cniNetworkInfo->ip4().ip());
-      }
+    mesos::NetworkInfo* networkInfo = status.add_network_infos();
+    networkInfo->CopyFrom(containerNetwork.networkInfo.get());
+    networkInfo->clear_ip_addresses();
 
-      if (_containerNetwork.cniNetworkInfo->has_ip6()) {
-        mesos::NetworkInfo::IPAddress* ip = networkInfo->add_ip_addresses();
-        ip->set_protocol(mesos::NetworkInfo::IPv6);
-        ip->set_ip_address(_containerNetwork.cniNetworkInfo->ip6().ip());
-      }
+    if (containerNetwork.cniNetworkInfo->has_ip4()) {
+      mesos::NetworkInfo::IPAddress* ip = networkInfo->add_ip_addresses();
+      ip->set_protocol(mesos::NetworkInfo::IPv4);
+      ip->set_ip_address(containerNetwork.cniNetworkInfo->ip4().ip());
+    }
+
+    if (containerNetwork.cniNetworkInfo->has_ip6()) {
+      mesos::NetworkInfo::IPAddress* ip = networkInfo->add_ip_addresses();
+      ip->set_protocol(mesos::NetworkInfo::IPv6);
+      ip->set_ip_address(containerNetwork.cniNetworkInfo->ip6().ip());
     }
   }
 

http://git-wip-us.apache.org/repos/asf/mesos/blob/5fcc857e/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 b1173d5..654137c 100644
--- a/src/slave/containerizer/mesos/isolators/network/cni/cni.hpp
+++ b/src/slave/containerizer/mesos/isolators/network/cni/cni.hpp
@@ -92,7 +92,7 @@ private:
 
     // NetworkInfo copied from the ExecutorInfo.containerInfo.network_infos
     // in 'prepare()' and '_recover()'.
-    mesos::NetworkInfo networkInfo;
+    Option<mesos::NetworkInfo> networkInfo;
 
     // Protobuf of CNI network information returned by CNI plugin.
     Option<cni::spec::NetworkInfo> cniNetworkInfo;
@@ -115,6 +115,10 @@ private:
       rootDir(_rootDir),
       pluginDir(_pluginDir) {}
 
+  Try<Nothing> _recover(
+      const ContainerID& containerId,
+      const Option<mesos::slave::ContainerState>& state = None());
+
   process::Future<Nothing> attach(
       const ContainerID& containerId,
       const std::string& networkName,
@@ -144,10 +148,6 @@ private:
       const ContainerID& containerId,
       const std::list<process::Future<Nothing>>& detaches);
 
-  Try<Nothing> _recover(
-      const ContainerID& containerId,
-      const Option<ExecutorInfo>& executorInfo = None());
-
   // CNI network configurations keyed by network name.
   hashmap<std::string, NetworkConfigInfo> networkConfigs;