Exposed Docker container IP via labels. This would allow mesos-dns to lookup container information such as its IP address.
Review: https://reviews.apache.org/r/36585 Project: http://git-wip-us.apache.org/repos/asf/mesos/repo Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/b175cfcd Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/b175cfcd Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/b175cfcd Branch: refs/heads/master Commit: b175cfcddec4aa4d66f1f85efc683046ae5ca723 Parents: a434ecc Author: Kapil Arya <[email protected]> Authored: Tue Jul 21 13:30:21 2015 -0700 Committer: Benjamin Hindman <[email protected]> Committed: Tue Jul 21 13:32:10 2015 -0700 ---------------------------------------------------------------------- src/docker/docker.cpp | 14 +++++++++++++- src/docker/docker.hpp | 14 ++++++++++++-- src/docker/executor.cpp | 5 +++++ src/tests/docker_containerizer_tests.cpp | 7 +++++++ 4 files changed, 37 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/mesos/blob/b175cfcd/src/docker/docker.cpp ---------------------------------------------------------------------- diff --git a/src/docker/docker.cpp b/src/docker/docker.cpp index 2793258..1367de8 100644 --- a/src/docker/docker.cpp +++ b/src/docker/docker.cpp @@ -274,7 +274,19 @@ Try<Docker::Container> Docker::Container::create(const string& output) bool started = startedAtValue.get().value != "0001-01-01T00:00:00Z"; - return Docker::Container(output, id, name, optionalPid, started); + 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()); + } + + string ipAddress = ipAddressValue.get().value; + + return Docker::Container(output, id, name, optionalPid, started, ipAddress); } http://git-wip-us.apache.org/repos/asf/mesos/blob/b175cfcd/src/docker/docker.hpp ---------------------------------------------------------------------- diff --git a/src/docker/docker.hpp b/src/docker/docker.hpp index fbae7bd..38e5299 100644 --- a/src/docker/docker.hpp +++ b/src/docker/docker.hpp @@ -69,14 +69,24 @@ public: // needed since pid is empty when the container terminates. const bool started; + // Returns the IPAddress of the container, or None if no IP has + // been not been assigned. + const Option<std::string> ipAddress; + private: Container( const std::string& output, const std::string& id, const std::string& name, const Option<pid_t>& pid, - bool started) - : output(output), id(id), name(name), pid(pid), started(started) {} + bool started, + const Option<std::string>& ipAddress) + : output(output), + id(id), + name(name), + pid(pid), + started(started), + ipAddress(ipAddress) {} }; class Image http://git-wip-us.apache.org/repos/asf/mesos/blob/b175cfcd/src/docker/executor.cpp ---------------------------------------------------------------------- diff --git a/src/docker/executor.cpp b/src/docker/executor.cpp index cdcd8ee..256d53d 100644 --- a/src/docker/executor.cpp +++ b/src/docker/executor.cpp @@ -158,6 +158,11 @@ public: status.mutable_task_id()->CopyFrom(taskId); status.set_state(TASK_RUNNING); status.set_data(container.output); + if (container.ipAddress.isSome()) { + Label* label = status.mutable_labels()->add_labels(); + label->set_key("Docker.NetworkSettings.IPAddress"); + label->set_value(container.ipAddress.get()); + } driver->sendStatusUpdate(status); } http://git-wip-us.apache.org/repos/asf/mesos/blob/b175cfcd/src/tests/docker_containerizer_tests.cpp ---------------------------------------------------------------------- diff --git a/src/tests/docker_containerizer_tests.cpp b/src/tests/docker_containerizer_tests.cpp index dc87d9f..5086af3 100644 --- a/src/tests/docker_containerizer_tests.cpp +++ b/src/tests/docker_containerizer_tests.cpp @@ -722,6 +722,13 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_Launch) Try<JSON::Array> parse = JSON::parse<JSON::Array>(statusRunning.get().data()); ASSERT_SOME(parse); + // Now verify that the Docker.NetworkSettings.IPAddress label is + // present. + ASSERT_TRUE(statusRunning.get().has_labels()); + EXPECT_EQ(1, statusRunning.get().labels().labels().size()); + EXPECT_EQ("Docker.NetworkSettings.IPAddress", + statusRunning.get().labels().labels(0).key()); + ASSERT_TRUE(exists(docker, slaveId, containerId.get())); Future<containerizer::Termination> termination =
