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/02 20:39:29 UTC

[1/3] mesos git commit: Implemented status() method of "network/cni" isolator.

Repository: mesos
Updated Branches:
  refs/heads/master be504a943 -> c6d988552


Implemented status() method of "network/cni" isolator.

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


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

Branch: refs/heads/master
Commit: 3004bf44ee242c07e538ab54a8543a62f3f1394c
Parents: be504a9
Author: Qian Zhang <zh...@cn.ibm.com>
Authored: Sat Apr 2 10:15:34 2016 -0700
Committer: Jie Yu <yu...@gmail.com>
Committed: Sat Apr 2 10:15:34 2016 -0700

----------------------------------------------------------------------
 .../mesos/isolators/network/cni/cni.cpp         | 52 +++++++++++++++++---
 .../mesos/isolators/network/cni/cni.hpp         |  8 ++-
 2 files changed, 52 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/3004bf44/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 991139f..68a6077 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);
+    Try<Nothing> recover = _recover(containerId, state.executor_info());
     if (recover.isError()) {
       return Failure(
           "Failed to recover CNI network information for container " +
@@ -366,7 +366,8 @@ Future<Nothing> NetworkCniIsolatorProcess::recover(
 
 
 Try<Nothing> NetworkCniIsolatorProcess::_recover(
-    const ContainerID& containerId)
+    const ContainerID& containerId,
+    const Option<ExecutorInfo>& executorInfo)
 {
   // 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_
@@ -433,6 +434,15 @@ Try<Nothing> NetworkCniIsolatorProcess::_recover(
     networkInfo.networkName = networkName;
     networkInfo.ifName = interfaces->front();
 
+    if (executorInfo.isSome()) {
+      foreach (const mesos::NetworkInfo& _networkInfo,
+               executorInfo->container().network_infos()) {
+        if (_networkInfo.name() == networkName) {
+          networkInfo.networkInfo = _networkInfo;
+        }
+      }
+    }
+
     const string networkInfoPath = paths::getNetworkInfoPath(
         rootDir.get(),
         containerId.value(),
@@ -507,13 +517,13 @@ Future<Option<ContainerLaunchInfo>> NetworkCniIsolatorProcess::prepare(
   int ifIndex = 0;
   hashset<string> networkNames;
   hashmap<string, NetworkInfo> networkInfos;
-  foreach (const mesos::NetworkInfo& netInfo,
+  foreach (const mesos::NetworkInfo& _networkInfo,
            executorInfo.container().network_infos()) {
-    if (!netInfo.has_name()) {
+    if (!_networkInfo.has_name()) {
       continue;
     }
 
-    const string& name = netInfo.name();
+    const string& name = _networkInfo.name();
     if (!networkConfigs.contains(name)) {
       return Failure("Unknown CNI network '" + name + "'");
     }
@@ -528,6 +538,7 @@ Future<Option<ContainerLaunchInfo>> NetworkCniIsolatorProcess::prepare(
     NetworkInfo networkInfo;
     networkInfo.networkName = name;
     networkInfo.ifName = "eth" + stringify(ifIndex++);
+    networkInfo.networkInfo = _networkInfo;
 
     networkInfos.put(name, networkInfo);
   }
@@ -569,7 +580,7 @@ Future<Nothing> NetworkCniIsolatorProcess::isolate(
 
   // Bind mount the network namespace handle of the process 'pid' to
   // /var/run/mesos/isolators/network/cni/<containerId>/ns to hold an extra
-  // reference to the network namespace which will be released in 'cleanup'.
+  // reference to the network namespace which will be released in '_cleanup'.
   const string source = path::join("/proc", stringify(pid), "ns", "net");
   const string target =
       paths::getNamespacePath(rootDir.get(), containerId.value());
@@ -800,7 +811,34 @@ Future<ResourceStatistics> NetworkCniIsolatorProcess::usage(
 Future<ContainerStatus> NetworkCniIsolatorProcess::status(
     const ContainerID& containerId)
 {
-  return ContainerStatus();
+  if (!infos.contains(containerId)) {
+    return ContainerStatus();
+  }
+
+  ContainerStatus status;
+  foreachvalue (const NetworkInfo& _networkInfo,
+                infos[containerId]->networkInfos) {
+    mesos::NetworkInfo* networkInfo = status.add_network_infos();
+    networkInfo->CopyFrom(_networkInfo.networkInfo);
+
+    if (_networkInfo.network.isSome()) {
+      networkInfo->clear_ip_addresses();
+
+      if (_networkInfo.network->has_ip4()) {
+        mesos::NetworkInfo::IPAddress* ip = networkInfo->add_ip_addresses();
+        ip->set_protocol(mesos::NetworkInfo::IPv4);
+        ip->set_ip_address(_networkInfo.network->ip4().ip());
+      }
+
+      if (_networkInfo.network->has_ip6()) {
+        mesos::NetworkInfo::IPAddress* ip = networkInfo->add_ip_addresses();
+        ip->set_protocol(mesos::NetworkInfo::IPv6);
+        ip->set_ip_address(_networkInfo.network->ip6().ip());
+      }
+    }
+  }
+
+  return status;
 }
 
 

http://git-wip-us.apache.org/repos/asf/mesos/blob/3004bf44/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 9fe394a..6b2f627 100644
--- a/src/slave/containerizer/mesos/isolators/network/cni/cni.hpp
+++ b/src/slave/containerizer/mesos/isolators/network/cni/cni.hpp
@@ -90,6 +90,10 @@ private:
     // Interface name.
     std::string ifName;
 
+    // NetworkInfo copied from the ExecutorInfo.containerInfo.network_infos
+    // in 'prepare()' and '_recover()'.
+    mesos::NetworkInfo networkInfo;
+
     // Protobuf of CNI network information returned by CNI plugin.
     Option<cni::spec::NetworkInfo> network;
   };
@@ -140,7 +144,9 @@ private:
       const ContainerID& containerId,
       const std::list<process::Future<Nothing>>& detaches);
 
-  Try<Nothing> _recover(const ContainerID& containerId);
+  Try<Nothing> _recover(
+      const ContainerID& containerId,
+      const Option<ExecutorInfo>& executorInfo = None());
 
   // CNI network configurations keyed by network name.
   hashmap<std::string, NetworkConfigInfo> networkConfigs;


[3/3] mesos git commit: Renamed 'NetworkInfo' to 'ContainerNetwork' in CNI isolator.

Posted by ji...@apache.org.
Renamed 'NetworkInfo' to 'ContainerNetwork' in CNI isolator.

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


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

Branch: refs/heads/master
Commit: c6d988552ebebfcfe9160884f69064c1e997d873
Parents: 653f51a
Author: Qian Zhang <zh...@cn.ibm.com>
Authored: Sat Apr 2 10:15:41 2016 -0700
Committer: Jie Yu <yu...@gmail.com>
Committed: Sat Apr 2 10:15:51 2016 -0700

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


http://git-wip-us.apache.org/repos/asf/mesos/blob/c6d98855/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 f7c313a..af5f490 100644
--- a/src/slave/containerizer/mesos/isolators/network/cni/cni.cpp
+++ b/src/slave/containerizer/mesos/isolators/network/cni/cni.cpp
@@ -397,7 +397,7 @@ Try<Nothing> NetworkCniIsolatorProcess::_recover(
     return Error("Failed to list CNI network names: " + networkNames.error());
   }
 
-  hashmap<string, NetworkInfo> networkInfos;
+  hashmap<string, ContainerNetwork> containerNetworks;
   foreach (const string& networkName, networkNames.get()) {
     if (!networkConfigs.contains(networkName)) {
       return Error("Unknown CNI network name '" + networkName + "'");
@@ -430,15 +430,15 @@ Try<Nothing> NetworkCniIsolatorProcess::_recover(
           networkName + "'");
     }
 
-    NetworkInfo networkInfo;
-    networkInfo.networkName = networkName;
-    networkInfo.ifName = interfaces->front();
+    ContainerNetwork containerNetwork;
+    containerNetwork.networkName = networkName;
+    containerNetwork.ifName = interfaces->front();
 
     if (executorInfo.isSome()) {
       foreach (const mesos::NetworkInfo& _networkInfo,
                executorInfo->container().network_infos()) {
         if (_networkInfo.name() == networkName) {
-          networkInfo.networkInfo = _networkInfo;
+          containerNetwork.networkInfo = _networkInfo;
         }
       }
     }
@@ -446,8 +446,8 @@ Try<Nothing> NetworkCniIsolatorProcess::_recover(
     const string networkInfoPath = paths::getNetworkInfoPath(
         rootDir.get(),
         containerId.value(),
-        networkInfo.networkName,
-        networkInfo.ifName);
+        containerNetwork.networkName,
+        containerNetwork.ifName);
 
     if (!os::exists(networkInfoPath)) {
       // This may occur in the case that agent dies before the isolator
@@ -456,7 +456,7 @@ Try<Nothing> NetworkCniIsolatorProcess::_recover(
           << "The checkpointed CNI plugin output '" << networkInfoPath
           << "' for container " << containerId << " does not exist";
 
-      networkInfos.put(networkName, networkInfo);
+      containerNetworks.put(networkName, containerNetwork);
       continue;
     }
 
@@ -478,16 +478,17 @@ Try<Nothing> NetworkCniIsolatorProcess::_recover(
           networkInfoPath + "': " + parse.error());
     }
 
-    networkInfo.network = parse.get();
+    containerNetwork.cniNetworkInfo = parse.get();
 
-    networkInfos.put(networkName, networkInfo);
+    containerNetworks.put(networkName, containerNetwork);
   }
 
-  // We add to 'infos' even if 'networkInfos' is empty. This is because it's
-  // likely that the slave crashed after removing all interface directories but
-  // before it is able to unmount the namespace handle and remove the container
-  // directory. In that case, we still rely on 'cleanup' to clean it up.
-  infos.put(containerId, Owned<Info>(new Info(networkInfos)));
+  // We add to 'infos' even if 'containerNetworks' is empty. This is because
+  // it's likely that the slave crashed after removing all interface
+  // directories but before it is able to unmount the namespace handle and
+  // remove the container directory. In that case, we still rely on 'cleanup'
+  // to clean it up.
+  infos.put(containerId, Owned<Info>(new Info(containerNetworks)));
 
   return Nothing();
 }
@@ -516,7 +517,7 @@ Future<Option<ContainerLaunchInfo>> NetworkCniIsolatorProcess::prepare(
 
   int ifIndex = 0;
   hashset<string> networkNames;
-  hashmap<string, NetworkInfo> networkInfos;
+  hashmap<string, ContainerNetwork> containerNetworks;
   foreach (const mesos::NetworkInfo& _networkInfo,
            executorInfo.container().network_infos()) {
     if (!_networkInfo.has_name()) {
@@ -535,16 +536,16 @@ Future<Option<ContainerLaunchInfo>> NetworkCniIsolatorProcess::prepare(
 
     networkNames.insert(name);
 
-    NetworkInfo networkInfo;
-    networkInfo.networkName = name;
-    networkInfo.ifName = "eth" + stringify(ifIndex++);
-    networkInfo.networkInfo = _networkInfo;
+    ContainerNetwork containerNetwork;
+    containerNetwork.networkName = name;
+    containerNetwork.ifName = "eth" + stringify(ifIndex++);
+    containerNetwork.networkInfo = _networkInfo;
 
-    networkInfos.put(name, networkInfo);
+    containerNetworks.put(name, containerNetwork);
   }
 
-  if (!networkInfos.empty()) {
-    infos.put(containerId, Owned<Info>(new Info(networkInfos)));
+  if (!containerNetworks.empty()) {
+    infos.put(containerId, Owned<Info>(new Info(containerNetworks)));
 
     ContainerLaunchInfo launchInfo;
     launchInfo.set_namespaces(CLONE_NEWNET | CLONE_NEWNS | CLONE_NEWUTS);
@@ -602,7 +603,8 @@ Future<Nothing> NetworkCniIsolatorProcess::isolate(
 
   // Invoke CNI plugin to attach container to CNI networks.
   list<Future<Nothing>> futures;
-  foreachkey (const string& networkName, infos[containerId]->networkInfos) {
+  foreachkey (const string& networkName,
+              infos[containerId]->containerNetworks) {
     futures.push_back(attach(containerId, networkName, target));
   }
 
@@ -634,23 +636,23 @@ Future<Nothing> NetworkCniIsolatorProcess::attach(
     const std::string& netNsHandle)
 {
   CHECK(infos.contains(containerId));
-  CHECK(infos[containerId]->networkInfos.contains(networkName));
+  CHECK(infos[containerId]->containerNetworks.contains(networkName));
 
-  const NetworkInfo& networkInfo =
-      infos[containerId]->networkInfos[networkName];
+  const ContainerNetwork& containerNetwork =
+      infos[containerId]->containerNetworks[networkName];
 
   const string ifDir = paths::getInterfaceDir(
       rootDir.get(),
       containerId.value(),
       networkName,
-      networkInfo.ifName);
+      containerNetwork.ifName);
 
   Try<Nothing> mkdir = os::mkdir(ifDir);
   if (mkdir.isError()) {
     return Failure(
         "Failed to create interface directory for the interface '" +
-        networkInfo.ifName + "' of the network '" +
-        networkInfo.networkName + "': "+ mkdir.error());
+        containerNetwork.ifName + "' of the network '" +
+        containerNetwork.networkName + "': "+ mkdir.error());
   }
 
   // Prepare environment variables for CNI plugin.
@@ -658,7 +660,7 @@ Future<Nothing> NetworkCniIsolatorProcess::attach(
   environment["CNI_COMMAND"] = "ADD";
   environment["CNI_CONTAINERID"] = containerId.value();
   environment["CNI_PATH"] = pluginDir.get();
-  environment["CNI_IFNAME"] = networkInfo.ifName;
+  environment["CNI_IFNAME"] = containerNetwork.ifName;
   environment["CNI_NETNS"] = netNsHandle;
 
   // Some CNI plugins need to run "iptables" to set up IP Masquerade,
@@ -673,7 +675,7 @@ Future<Nothing> NetworkCniIsolatorProcess::attach(
   }
 
   const NetworkConfigInfo& networkConfig =
-      networkConfigs[networkInfo.networkName];
+      networkConfigs[containerNetwork.networkName];
 
   // Invoke the CNI plugin.
   const string& plugin = networkConfig.config.type();
@@ -710,7 +712,7 @@ Future<Nothing> NetworkCniIsolatorProcess::_attach(
     const tuple<Future<Option<int>>, Future<string>>& t)
 {
   CHECK(infos.contains(containerId));
-  CHECK(infos[containerId]->networkInfos.contains(networkName));
+  CHECK(infos[containerId]->containerNetworks.contains(networkName));
 
   Future<Option<int>> status = std::get<0>(t);
   if (!status.isReady()) {
@@ -766,13 +768,14 @@ Future<Nothing> NetworkCniIsolatorProcess::_attach(
   // The destruction of the container cannot happen in the middle of
   // 'attach()' and '_attach()' because the containerizer will wait
   // for 'isolate()' to finish before destroying the container.
-  NetworkInfo& networkInfo = infos[containerId]->networkInfos[networkName];
+  ContainerNetwork& containerNetwork =
+      infos[containerId]->containerNetworks[networkName];
 
   const string networkInfoPath = paths::getNetworkInfoPath(
       rootDir.get(),
       containerId.value(),
       networkName,
-      networkInfo.ifName);
+      containerNetwork.ifName);
 
   Try<Nothing> write = os::write(networkInfoPath, output.get());
   if (write.isError()) {
@@ -781,7 +784,7 @@ Future<Nothing> NetworkCniIsolatorProcess::_attach(
         output.get() + "': " + write.error());
   }
 
-  networkInfo.network = parse.get();
+  containerNetwork.cniNetworkInfo = parse.get();
 
   return Nothing();
 }
@@ -816,24 +819,24 @@ Future<ContainerStatus> NetworkCniIsolatorProcess::status(
   }
 
   ContainerStatus status;
-  foreachvalue (const NetworkInfo& _networkInfo,
-                infos[containerId]->networkInfos) {
+  foreachvalue (const ContainerNetwork& _containerNetwork,
+                infos[containerId]->containerNetworks) {
     mesos::NetworkInfo* networkInfo = status.add_network_infos();
-    networkInfo->CopyFrom(_networkInfo.networkInfo);
+    networkInfo->CopyFrom(_containerNetwork.networkInfo);
 
-    if (_networkInfo.network.isSome()) {
+    if (_containerNetwork.cniNetworkInfo.isSome()) {
       networkInfo->clear_ip_addresses();
 
-      if (_networkInfo.network->has_ip4()) {
+      if (_containerNetwork.cniNetworkInfo->has_ip4()) {
         mesos::NetworkInfo::IPAddress* ip = networkInfo->add_ip_addresses();
         ip->set_protocol(mesos::NetworkInfo::IPv4);
-        ip->set_ip_address(_networkInfo.network->ip4().ip());
+        ip->set_ip_address(_containerNetwork.cniNetworkInfo->ip4().ip());
       }
 
-      if (_networkInfo.network->has_ip6()) {
+      if (_containerNetwork.cniNetworkInfo->has_ip6()) {
         mesos::NetworkInfo::IPAddress* ip = networkInfo->add_ip_addresses();
         ip->set_protocol(mesos::NetworkInfo::IPv6);
-        ip->set_ip_address(_networkInfo.network->ip6().ip());
+        ip->set_ip_address(_containerNetwork.cniNetworkInfo->ip6().ip());
       }
     }
   }
@@ -855,7 +858,8 @@ Future<Nothing> NetworkCniIsolatorProcess::cleanup(
 
   // Invoke CNI plugin to detach container from CNI networks.
   list<Future<Nothing>> futures;
-  foreachkey (const string& networkName, infos[containerId]->networkInfos) {
+  foreachkey (const string& networkName,
+              infos[containerId]->containerNetworks) {
     futures.push_back(detach(containerId, networkName));
   }
 
@@ -924,17 +928,17 @@ Future<Nothing> NetworkCniIsolatorProcess::detach(
     const std::string& networkName)
 {
   CHECK(infos.contains(containerId));
-  CHECK(infos[containerId]->networkInfos.contains(networkName));
+  CHECK(infos[containerId]->containerNetworks.contains(networkName));
 
-  const NetworkInfo& networkInfo =
-      infos[containerId]->networkInfos[networkName];
+  const ContainerNetwork& containerNetwork =
+      infos[containerId]->containerNetworks[networkName];
 
   // Prepare environment variables for CNI plugin.
   map<string, string> environment;
   environment["CNI_COMMAND"] = "DEL";
   environment["CNI_CONTAINERID"] = containerId.value();
   environment["CNI_PATH"] = pluginDir.get();
-  environment["CNI_IFNAME"] = networkInfo.ifName;
+  environment["CNI_IFNAME"] = containerNetwork.ifName;
   environment["CNI_NETNS"] =
       paths::getNamespacePath(rootDir.get(), containerId.value());
 
@@ -986,7 +990,7 @@ Future<Nothing> NetworkCniIsolatorProcess::_detach(
     const tuple<Future<Option<int>>, Future<string>>& t)
 {
   CHECK(infos.contains(containerId));
-  CHECK(infos[containerId]->networkInfos.contains(networkName));
+  CHECK(infos[containerId]->containerNetworks.contains(networkName));
 
   Future<Option<int>> status = std::get<0>(t);
   if (!status.isReady()) {
@@ -1006,7 +1010,7 @@ Future<Nothing> NetworkCniIsolatorProcess::_detach(
         rootDir.get(),
         containerId.value(),
         networkName,
-        infos[containerId]->networkInfos[networkName].ifName);
+        infos[containerId]->containerNetworks[networkName].ifName);
 
     Try<Nothing> rmdir = os::rmdir(ifDir);
     if (rmdir.isError()) {

http://git-wip-us.apache.org/repos/asf/mesos/blob/c6d98855/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 6b2f627..b1173d5 100644
--- a/src/slave/containerizer/mesos/isolators/network/cni/cni.hpp
+++ b/src/slave/containerizer/mesos/isolators/network/cni/cni.hpp
@@ -82,7 +82,7 @@ private:
     cni::spec::NetworkConfig config;
   };
 
-  struct NetworkInfo
+  struct ContainerNetwork
   {
     // CNI network name.
     std::string networkName;
@@ -95,16 +95,16 @@ private:
     mesos::NetworkInfo networkInfo;
 
     // Protobuf of CNI network information returned by CNI plugin.
-    Option<cni::spec::NetworkInfo> network;
+    Option<cni::spec::NetworkInfo> cniNetworkInfo;
   };
 
   struct Info
   {
-    Info (const hashmap<std::string, NetworkInfo>& _networkInfos)
-      : networkInfos (_networkInfos) {}
+    Info (const hashmap<std::string, ContainerNetwork>& _containerNetworks)
+      : containerNetworks (_containerNetworks) {}
 
     // CNI network information keyed by network name.
-    hashmap<std::string, NetworkInfo> networkInfos;
+    hashmap<std::string, ContainerNetwork> containerNetworks;
   };
 
   NetworkCniIsolatorProcess(


[2/3] mesos git commit: Add some log messages in 'network/cni' isolator.

Posted by ji...@apache.org.
Add some log messages in 'network/cni' isolator.

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


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

Branch: refs/heads/master
Commit: 653f51aa9730c8c5b9e59138fb5de6b6a66cf75d
Parents: 3004bf4
Author: Qian Zhang <zh...@cn.ibm.com>
Authored: Sat Apr 2 10:15:38 2016 -0700
Committer: Jie Yu <yu...@gmail.com>
Committed: Sat Apr 2 10:15:38 2016 -0700

----------------------------------------------------------------------
 src/slave/containerizer/mesos/isolators/network/cni/cni.cpp | 5 +++++
 1 file changed, 5 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/653f51aa/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 68a6077..f7c313a 100644
--- a/src/slave/containerizer/mesos/isolators/network/cni/cni.cpp
+++ b/src/slave/containerizer/mesos/isolators/network/cni/cni.cpp
@@ -899,6 +899,9 @@ Future<Nothing> NetworkCniIsolatorProcess::_cleanup(
           "Failed to unmount the network namespace handle '" +
           target + "': " + unmount.error());
     }
+
+    LOG(INFO) << "Unmounted the network namespace handle '"
+              << target << "' for container " << containerId;
   }
 
   Try<Nothing> rmdir = os::rmdir(containerDir);
@@ -908,6 +911,8 @@ Future<Nothing> NetworkCniIsolatorProcess::_cleanup(
         containerDir + "': " + rmdir.error());
   }
 
+  LOG(INFO) << "Removed the container directory '" << containerDir << "'";
+
   infos.erase(containerId);
 
   return Nothing();