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/07/18 17:24:36 UTC

[4/5] mesos git commit: Handled systems that miss /etc/hostname in CNI isolator.

Handled systems that miss /etc/hostname in CNI isolator.

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


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

Branch: refs/heads/1.0.x
Commit: 8a0d7e0c185a46938bcce8fbeef8c4c04923ebcf
Parents: 76ed504
Author: Jie Yu <yu...@gmail.com>
Authored: Fri Jul 15 22:20:19 2016 -0700
Committer: Jie Yu <yu...@gmail.com>
Committed: Mon Jul 18 10:23:39 2016 -0700

----------------------------------------------------------------------
 .../mesos/isolators/network/cni/cni.cpp         | 28 +++++++++++++-------
 1 file changed, 18 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/8a0d7e0c/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 122e2a8..81121a6 100644
--- a/src/slave/containerizer/mesos/isolators/network/cni/cni.cpp
+++ b/src/slave/containerizer/mesos/isolators/network/cni/cni.cpp
@@ -660,9 +660,14 @@ Future<Nothing> NetworkCniIsolatorProcess::isolate(
     setup.flags.pid = pid;
     setup.flags.rootfs = infos[containerId]->rootfs;
     setup.flags.etc_hosts_path = "/etc/hosts";
-    setup.flags.etc_hostname_path = "/etc/hostname";
     setup.flags.etc_resolv_conf = "/etc/resolv.conf";
 
+    // NOTE: On some Linux distributions, `/etc/hostname` might not
+    // exist, but hostname is still accessible by `getHostname()`.
+    if (os::exists("/etc/hostname")) {
+      setup.flags.etc_hostname_path = "/etc/hostname";
+    }
+
     return __isolate(setup);
   }
 
@@ -1447,20 +1452,28 @@ int NetworkCniIsolatorSetup::execute()
     return EXIT_FAILURE;
   }
 
+  // Initialize the host path and container path for the set of files
+  // that need to be setup in the container file system.
+  hashmap<string, string> files;
+
   if (flags.etc_hosts_path.isNone()) {
     cerr << "Path to 'hosts' not specified" <<endl;
     return EXIT_FAILURE;
   } else if (!os::exists(flags.etc_hosts_path.get())) {
     cerr << "Unable to find '" << flags.etc_hosts_path.get() << "'" << endl;
     return EXIT_FAILURE;
+  } else {
+    files["/etc/hosts"] = flags.etc_hosts_path.get();
   }
 
   if (flags.etc_hostname_path.isNone()) {
-    cerr << "Path to 'hostname' not specified" << endl;
-    return EXIT_FAILURE;
+    // This is the case where host network is used, container has an
+    // image, and `/etc/hostname` does not exist in the system.
   } else if (!os::exists(flags.etc_hostname_path.get())) {
     cerr << "Unable to find '" << flags.etc_hostname_path.get() << "'" << endl;
     return EXIT_FAILURE;
+  } else {
+    files["/etc/hostname"] = flags.etc_hostname_path.get();
   }
 
   if (flags.etc_resolv_conf.isNone()) {
@@ -1469,6 +1482,8 @@ int NetworkCniIsolatorSetup::execute()
   } else if (!os::exists(flags.etc_resolv_conf.get())) {
     cerr << "Unable to find '" << flags.etc_resolv_conf.get() << "'" << endl;
     return EXIT_FAILURE;
+  } else {
+    files["/etc/resolv.conf"] = flags.etc_resolv_conf.get();
   }
 
   // Enter the mount namespace.
@@ -1502,13 +1517,6 @@ int NetworkCniIsolatorSetup::execute()
     return EXIT_FAILURE;
   }
 
-  // Initialize the host path and container path for the set of files
-  // that need to be setup in the container file system.
-  hashmap<string, string> files;
-  files["/etc/hosts"] = flags.etc_hosts_path.get();
-  files["/etc/hostname"] = flags.etc_hostname_path.get();
-  files["/etc/resolv.conf"] = flags.etc_resolv_conf.get();
-
   foreachpair (const string& file, const string& source, files) {
     // Do the bind mount in the host filesystem since no process in
     // the new network namespace should be seeing the original network