Added docker_tests to test the docker abstraction.
Project: http://git-wip-us.apache.org/repos/asf/mesos/repo Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/ded35583 Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/ded35583 Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/ded35583 Branch: refs/heads/master Commit: ded355832eb12540740c6b16e758896855d99db6 Parents: 965e29a Author: Yifan Gu <[email protected]> Authored: Wed Jul 2 14:01:02 2014 -0700 Committer: Benjamin Hindman <[email protected]> Committed: Mon Aug 4 15:08:16 2014 -0700 ---------------------------------------------------------------------- src/Makefile.am | 1 + src/tests/docker_tests.cpp | 175 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 176 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/mesos/blob/ded35583/src/Makefile.am ---------------------------------------------------------------------- diff --git a/src/Makefile.am b/src/Makefile.am index aad5440..e5b26df 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1045,6 +1045,7 @@ mesos_tests_SOURCES = \ tests/containerizer.cpp \ tests/containerizer_tests.cpp \ tests/credentials_tests.cpp \ + tests/docker_tests.cpp \ tests/docker_containerizer_tests.cpp \ tests/environment.cpp \ tests/examples_tests.cpp \ http://git-wip-us.apache.org/repos/asf/mesos/blob/ded35583/src/tests/docker_tests.cpp ---------------------------------------------------------------------- diff --git a/src/tests/docker_tests.cpp b/src/tests/docker_tests.cpp new file mode 100644 index 0000000..62d5657 --- /dev/null +++ b/src/tests/docker_tests.cpp @@ -0,0 +1,175 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <gtest/gtest.h> + +#include <process/future.hpp> +#include <process/gtest.hpp> + +#include <stout/option.hpp> +#include <stout/gtest.hpp> + +#include "docker/docker.hpp" + +#include "mesos/resources.hpp" + +#include "tests/flags.hpp" + +using namespace mesos; +using namespace mesos::internal; + +using process::Future; + +using std::list; +using std::string; + + +// This test tests the functionality of the +// docker's interfaces. +TEST(DockerTest, DOCKER_interface) +{ + string containerName = "mesos-docker-test"; + Resources resources = Resources::parse("cpus:1;mem:512").get(); + Docker docker(tests::flags.docker); + + // Cleaning up the container first. + Future<Option<int> > status = docker.rm(containerName, true); + AWAIT_READY(status); + ASSERT_SOME(status.get()); + + // Verify that we do not see the container. + Future<list<Docker::Container> > containers = docker.ps(true); + AWAIT_READY(containers); + foreach (const Docker::Container& container, containers.get()) { + EXPECT_NE("/" + containerName, container.name()); + } + + // Start the container. + status = docker.run("busybox", "sleep 120", containerName); + AWAIT_READY(status); + ASSERT_SOME(status.get()); + + // Should be able to see the container now. + containers = docker.ps(); + AWAIT_READY(containers); + bool found = false; + foreach (const Docker::Container& container, containers.get()) { + if ("/" + containerName == container.name()) { + found = true; + break; + } + } + EXPECT_TRUE(found); + + Future<Docker::Container> container = docker.inspect(containerName); + AWAIT_READY(container); + + // Test some fields of the container. + EXPECT_NE("", container.get().id()); + EXPECT_EQ("/" + containerName, container.get().name()); + EXPECT_SOME(container.get().pid()); + + // Kill the container. + status = docker.kill(containerName); + AWAIT_READY(status); + ASSERT_SOME(status.get()); + + // Now, the container should not appear in the result of ps(). + // But it should appear in the result of ps(true). + containers = docker.ps(); + AWAIT_READY(containers); + foreach (const Docker::Container& container, containers.get()) { + EXPECT_NE("/" + containerName, container.name()); + } + + containers = docker.ps(true); + AWAIT_READY(containers); + found = false; + foreach (const Docker::Container& container, containers.get()) { + if ("/" + containerName == container.name()) { + found = true; + break; + } + } + EXPECT_TRUE(found); + + // Check the container's info, both id and name should remain + // the same since we haven't removed it, but the pid should be none + // since it's not running. + container = docker.inspect(containerName); + AWAIT_READY(container); + + EXPECT_NE("", container.get().id()); + EXPECT_EQ("/" + containerName, container.get().name()); + EXPECT_NONE(container.get().pid()); + + // Remove the container. + status = docker.rm(containerName); + AWAIT_READY(status); + ASSERT_SOME(status.get()); + + // Should not be able to inspect the container. + container = docker.inspect(containerName); + AWAIT_FAILED(container); + + // Also, now we should not be able to see the container + // by invoking ps(true). + containers = docker.ps(true); + AWAIT_READY(containers); + foreach (const Docker::Container& container, containers.get()) { + EXPECT_NE("/" + containerName, container.name()); + } + + // Start the container again, this time we will do a "rm -f" + // directly, instead of killing and rm. + // + // First, Invoke docker.run() + status = docker.run("busybox", "sleep 120", containerName); + AWAIT_READY(status); + ASSERT_SOME(status.get()); + + // Verify that the container is there. + containers = docker.ps(); + AWAIT_READY(containers); + found = false; + foreach (const Docker::Container& container, containers.get()) { + if ("/" + containerName == container.name()) { + found = true; + break; + } + } + EXPECT_TRUE(found); + + // Then do a "rm -f". + status = docker.rm(containerName, true); + AWAIT_READY(status); + ASSERT_SOME(status.get()); + + // Verify that the container is totally removed, + // that is we can't find it by ps() or ps(true). + containers = docker.ps(); + AWAIT_READY(containers); + foreach (const Docker::Container& container, containers.get()) { + EXPECT_NE("/" + containerName, container.name()); + } + containers = docker.ps(true); + AWAIT_READY(containers); + foreach (const Docker::Container& container, containers.get()) { + EXPECT_NE("/" + containerName, container.name()); + } +}
