You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by bm...@apache.org on 2016/04/25 23:15:20 UTC

[04/24] mesos git commit: Fixed parsing network ip address with docker.

Fixed parsing network ip address with docker.

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


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

Branch: refs/heads/0.28.x
Commit: 95dae310486eaa10a125b32b0cf9e55e2b626001
Parents: b709724
Author: Timothy Chen <tn...@apache.org>
Authored: Mon Mar 7 23:40:55 2016 -0800
Committer: Vinod Kone <vi...@gmail.com>
Committed: Fri Mar 11 13:45:35 2016 -0500

----------------------------------------------------------------------
 src/docker/docker.cpp | 55 ++++++++++++++++++++++++++++++++++++----------
 1 file changed, 44 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/95dae310/src/docker/docker.cpp
----------------------------------------------------------------------
diff --git a/src/docker/docker.cpp b/src/docker/docker.cpp
index 5272870..4d35513 100755
--- a/src/docker/docker.cpp
+++ b/src/docker/docker.cpp
@@ -301,19 +301,52 @@ Try<Docker::Container> Docker::Container::create(const string& output)
 
   bool started = startedAtValue.get().value != "0001-01-01T00:00:00Z";
 
-  Result<JSON::String> ipAddressValue =
-    json.find<JSON::String>("NetworkSettings.IPAddress");
-  if (ipAddressValue.isNone()) {
-    return Error("Unable to find NetworkSettings.IPAddress in container");
-  } else if (ipAddressValue.isError()) {
-    return Error(
-        "Error finding NetworkSettings.Name in container: " +
-        ipAddressValue.error());
+  Option<string> ipAddress;
+  bool findDeprecatedIP = false;
+  Result<JSON::String> networkMode =
+    json.find<JSON::String>("HostConfig.NetworkMode");
+  if (!networkMode.isSome()) {
+    // We need to fail back to the old field as Docker added NetworkMode
+    // since Docker remote API 1.15.
+    VLOG(1) << "Unable to detect HostConfig.NetworkMode, "
+            << "attempting deprecated IP field";
+    findDeprecatedIP = true;
+  } else {
+    // We currently rely on the fact that we always set --net when
+    // we shell out to docker run, and therefore the network mode
+    // matches what --net is. Without --net, the network mode would be set
+    // to 'default' and we won't be able to find the IP address as
+    // it will be in 'Networks.bridge' key.
+    string addressLocation = "NetworkSettings.Networks." +
+                             networkMode->value + ".IPAddress";
+
+    Result<JSON::String> ipAddressValue =
+      json.find<JSON::String>(addressLocation);
+
+    if (!ipAddressValue.isSome()) {
+      // We also need to failback to the old field as the IP Address
+      // field location also changed since Docker remote API 1.20.
+      VLOG(1) << "Unable to detect IP Address at '" << addressLocation << "',"
+              << " attempting deprecated field";
+      findDeprecatedIP = true;
+    } else if (!ipAddressValue->value.empty()) {
+      ipAddress = ipAddressValue->value;
+    }
   }
 
-  Option<string> ipAddress;
-  if (!ipAddressValue->value.empty()) {
-    ipAddress = ipAddressValue->value;
+  if (findDeprecatedIP) {
+    Result<JSON::String> ipAddressValue =
+      json.find<JSON::String>("NetworkSettings.IPAddress");
+
+    if (ipAddressValue.isNone()) {
+      return Error("Unable to find NetworkSettings.IPAddress in container");
+    } else if (ipAddressValue.isError()) {
+      return Error(
+        "Error finding NetworkSettings.IPAddress in container: " +
+        ipAddressValue.error());
+    } else if (!ipAddressValue->value.empty()) {
+      ipAddress = ipAddressValue->value;
+    }
   }
 
   return Docker::Container(output, id, name, optionalPid, started, ipAddress);