You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by qi...@apache.org on 2017/08/03 07:49:47 UTC
[8/9] mesos git commit: Added a test
`DefaultContainerDNSCniTest.ROOT_VerifyDefaultDNS`.
Added a test `DefaultContainerDNSCniTest.ROOT_VerifyDefaultDNS`.
Review: https://reviews.apache.org/r/60793
Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/18ad7fb7
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/18ad7fb7
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/18ad7fb7
Branch: refs/heads/master
Commit: 18ad7fb7473849ba67b1ff007e2d131556eb42d8
Parents: d67595c
Author: Qian Zhang <zh...@gmail.com>
Authored: Wed Jul 12 14:48:08 2017 +0800
Committer: Qian Zhang <zh...@gmail.com>
Committed: Thu Aug 3 13:53:26 2017 +0800
----------------------------------------------------------------------
src/tests/containerizer/cni_isolator_tests.cpp | 179 ++++++++++++++++++++
1 file changed, 179 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/mesos/blob/18ad7fb7/src/tests/containerizer/cni_isolator_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/containerizer/cni_isolator_tests.cpp b/src/tests/containerizer/cni_isolator_tests.cpp
index ae0980b..0a16294 100644
--- a/src/tests/containerizer/cni_isolator_tests.cpp
+++ b/src/tests/containerizer/cni_isolator_tests.cpp
@@ -1732,6 +1732,185 @@ TEST_F(CniIsolatorPortMapperTest, ROOT_INTERNET_CURL_PortMapper)
driver.join();
}
+
+class DefaultContainerDNSCniTest
+ : public CniIsolatorTest,
+ public WithParamInterface<string> {};
+
+
+INSTANTIATE_TEST_CASE_P(
+ DefaultContainerDNSInfo,
+ DefaultContainerDNSCniTest,
+ ::testing::Values(
+ // A DNS information for the `__MESOS_TEST__` CNI network.
+ R"~(
+ {
+ "mesos": [
+ {
+ "network_mode": "CNI",
+ "network_name": "__MESOS_TEST__",
+ "dns": {
+ "nameservers": [ "8.8.8.8", "8.8.4.4" ],
+ "domain": "mesos.apache.org",
+ "search": [ "a.mesos.apache.org", "a.mesos.apache.org" ],
+ "options": [ "timeout:3", "attempts:2" ]
+ }
+ }
+ ]
+ })~",
+ // A DNS information with `network_mode == CNI`, but without a network
+ // name, acts as a wildcard match making it the default DNS for any CNI
+ // network not specified in the `--default_container_dns` flag.
+ R"~(
+ {
+ "mesos": [
+ {
+ "network_mode": "CNI",
+ "dns": {
+ "nameservers": [ "8.8.8.8", "8.8.4.4" ],
+ "domain": "mesos.apache.org",
+ "search": [ "a.mesos.apache.org", "a.mesos.apache.org" ],
+ "options": [ "timeout:3", "attempts:2" ]
+ }
+ }
+ ]
+ })~",
+ // Two DNS information, one is specific for `__MESOS_TEST__` CNI
+ // network, the other is the defaule DNS for any CNI network not
+ // specified in the `--default_container_dns` flag.
+ R"~(
+ {
+ "mesos": [
+ {
+ "network_mode": "CNI",
+ "network_name": "__MESOS_TEST__",
+ "dns": {
+ "nameservers": [ "8.8.8.8", "8.8.4.4" ],
+ "domain": "mesos.apache.org",
+ "search": [ "a.mesos.apache.org", "a.mesos.apache.org" ],
+ "options": [ "timeout:3", "attempts:2" ]
+ }
+ },
+ {
+ "network_mode": "CNI",
+ "dns": {
+ "nameservers": [ "8.8.8.9", "8.8.4.5" ],
+ "domain": "mesos1.apache.org",
+ "search": [ "b.mesos.apache.org", "b.mesos.apache.org" ],
+ "options": [ "timeout:9", "attempts:5" ]
+ }
+ }
+ ]
+ })~"));
+
+
+// This test verifies the DNS configuration of the container can be
+// successfully set with the agent flag `--default_container_dns`.
+TEST_P(DefaultContainerDNSCniTest, ROOT_VerifyDefaultDNS)
+{
+ Try<net::IP::Network> hostNetwork = getNonLoopbackIP();
+ ASSERT_SOME(hostNetwork);
+
+ Try<string> mockPlugin = strings::format(
+ R"~(
+ #!/bin/sh
+ echo '{'
+ echo ' "ip4": {'
+ echo ' "ip": "%s/%d"'
+ echo ' }'
+ echo '}'
+ )~",
+ hostNetwork.get().address(),
+ hostNetwork.get().prefix());
+
+ ASSERT_SOME(mockPlugin);
+
+ ASSERT_SOME(setupMockPlugin(mockPlugin.get()));
+
+ Try<Owned<cluster::Master>> master = StartMaster();
+ ASSERT_SOME(master);
+
+ slave::Flags flags = CreateSlaveFlags();
+ flags.isolation = "network/cni";
+
+ flags.network_cni_plugins_dir = cniPluginDir;
+ flags.network_cni_config_dir = cniConfigDir;
+
+ Try<ContainerDNSInfo> parse = flags::parse<ContainerDNSInfo>(GetParam());
+ ASSERT_SOME(parse);
+
+ flags.default_container_dns = parse.get();
+
+ Owned<MasterDetector> detector = master.get()->createDetector();
+
+ Try<Owned<cluster::Slave>> slave = StartSlave(detector.get(), flags);
+ ASSERT_SOME(slave);
+
+ MockScheduler sched;
+
+ MesosSchedulerDriver driver(
+ &sched,
+ DEFAULT_FRAMEWORK_INFO,
+ master.get()->pid,
+ DEFAULT_CREDENTIAL);
+
+ EXPECT_CALL(sched, registered(_, _, _));
+
+ Future<vector<Offer>> offers;
+ EXPECT_CALL(sched, resourceOffers(&driver, _))
+ .WillOnce(FutureArg<1>(&offers))
+ .WillRepeatedly(Return()); // Ignore subsequent offers.
+
+ driver.start();
+
+ AWAIT_READY(offers);
+ ASSERT_EQ(1u, offers->size());
+
+ const Offer& offer = offers.get()[0];
+
+ // Verify that /etc/resolv.conf was generated the way we expect.
+ // This is sensitive to changes in 'formatResolverConfig()'.
+ const string command =
+ "#! /bin/sh\n"
+ "set -x\n"
+ "cat > expected <<EOF\n"
+ "domain mesos.apache.org\n"
+ "search a.mesos.apache.org a.mesos.apache.org\n"
+ "options timeout:3 attempts:2\n"
+ "nameserver 8.8.8.8\n"
+ "nameserver 8.8.4.4\n"
+ "EOF\n"
+ "cat /etc/resolv.conf\n"
+ "exec diff -c /etc/resolv.conf expected\n";
+
+ TaskInfo task = createTask(offer, command);
+
+ ContainerInfo* container = task.mutable_container();
+ container->set_type(ContainerInfo::MESOS);
+
+ // Make sure the container joins the mock CNI network.
+ container->add_network_infos()->set_name("__MESOS_TEST__");
+
+ Future<TaskStatus> statusRunning;
+ Future<TaskStatus> statusFinished;
+ EXPECT_CALL(sched, statusUpdate(&driver, _))
+ .WillOnce(FutureArg<1>(&statusRunning))
+ .WillOnce(FutureArg<1>(&statusFinished));
+
+ driver.launchTasks(offer.id(), {task});
+
+ AWAIT_READY(statusRunning);
+ EXPECT_EQ(task.task_id(), statusRunning->task_id());
+ EXPECT_EQ(TASK_RUNNING, statusRunning->state());
+
+ AWAIT_READY(statusFinished);
+ EXPECT_EQ(task.task_id(), statusFinished->task_id());
+ EXPECT_EQ(TASK_FINISHED, statusFinished->state());
+
+ driver.stop();
+ driver.join();
+}
+
} // namespace tests {
} // namespace internal {
} // namespace mesos {