]> git.proxmox.com Git - ceph.git/blob - ceph/src/test/mon/MonMap.cc
Import ceph 15.2.8
[ceph.git] / ceph / src / test / mon / MonMap.cc
1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
3 /*
4 * Ceph - scalable distributed file system
5 *
6 * Copyright (C) 2016 SUSE LINUX GmbH
7 *
8 * This is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License version 2.1, as published by the Free Software
11 * Foundation. See file COPYING.
12 *
13 */
14 #include "mon/MonMap.h"
15 #include "common/ceph_context.h"
16 #include "common/dns_resolve.h"
17 #include "test/common/dns_messages.h"
18
19 #include "common/debug.h"
20 #include "gmock/gmock.h"
21 #include "gtest/gtest.h"
22
23 #include <sstream>
24
25 #define TEST_DEBUG 20
26
27 #define dout_subsys ceph_subsys_mon
28
29
30 using ::testing::Return;
31 using ::testing::_;
32 using ::testing::SetArrayArgument;
33 using ::testing::DoAll;
34 using ::testing::StrEq;
35
36
37 class MonMapTest : public ::testing::Test {
38 protected:
39 virtual void SetUp() {
40 g_ceph_context->_conf->subsys.set_log_level(dout_subsys, TEST_DEBUG);
41 }
42
43 virtual void TearDown() {
44 DNSResolver::get_instance(nullptr);
45 }
46 };
47
48 TEST_F(MonMapTest, DISABLED_build_initial_config_from_dns) {
49
50 MockResolvHWrapper *resolvH = new MockResolvHWrapper();
51 DNSResolver::get_instance(resolvH);
52
53 int len = sizeof(ns_search_msg_ok_payload);
54 int lena = sizeof(ns_query_msg_mon_a_payload);
55 int lenb = sizeof(ns_query_msg_mon_b_payload);
56 int lenc = sizeof(ns_query_msg_mon_c_payload);
57
58 using ::testing::InSequence;
59 {
60 InSequence s;
61
62 #ifdef HAVE_RES_NQUERY
63 EXPECT_CALL(*resolvH, res_nsearch(_, StrEq("_cephmon._tcp"), C_IN, T_SRV, _, _))
64 .WillOnce(DoAll(SetArrayArgument<4>(ns_search_msg_ok_payload,
65 ns_search_msg_ok_payload+len), Return(len)));
66
67 EXPECT_CALL(*resolvH, res_nquery(_,StrEq("mon.a.ceph.com"), C_IN, T_A,_,_))
68 .WillOnce(DoAll(SetArrayArgument<4>(ns_query_msg_mon_a_payload,
69 ns_query_msg_mon_a_payload+lena), Return(lena)));
70
71 EXPECT_CALL(*resolvH, res_nquery(_, StrEq("mon.c.ceph.com"), C_IN, T_A,_,_))
72 .WillOnce(DoAll(SetArrayArgument<4>(ns_query_msg_mon_c_payload,
73 ns_query_msg_mon_c_payload+lenc), Return(lenc)));
74
75 EXPECT_CALL(*resolvH, res_nquery(_,StrEq("mon.b.ceph.com"), C_IN, T_A, _,_))
76 .WillOnce(DoAll(SetArrayArgument<4>(ns_query_msg_mon_b_payload,
77 ns_query_msg_mon_b_payload+lenb), Return(lenb)));
78 #else
79 EXPECT_CALL(*resolvH, res_search(StrEq("_cephmon._tcp"), C_IN, T_SRV, _, _))
80 .WillOnce(DoAll(SetArrayArgument<3>(ns_search_msg_ok_payload,
81 ns_search_msg_ok_payload+len), Return(len)));
82
83 EXPECT_CALL(*resolvH, res_query(StrEq("mon.a.ceph.com"), C_IN, T_A,_,_))
84 .WillOnce(DoAll(SetArrayArgument<3>(ns_query_msg_mon_a_payload,
85 ns_query_msg_mon_a_payload+lena), Return(lena)));
86
87 EXPECT_CALL(*resolvH, res_query(StrEq("mon.c.ceph.com"), C_IN, T_A,_,_))
88 .WillOnce(DoAll(SetArrayArgument<3>(ns_query_msg_mon_c_payload,
89 ns_query_msg_mon_c_payload+lenc), Return(lenc)));
90
91 EXPECT_CALL(*resolvH, res_query(StrEq("mon.b.ceph.com"), C_IN, T_A, _,_))
92 .WillOnce(DoAll(SetArrayArgument<3>(ns_query_msg_mon_b_payload,
93 ns_query_msg_mon_b_payload+lenb), Return(lenb)));
94 #endif
95 }
96
97
98
99 CephContext *cct = (new CephContext(CEPH_ENTITY_TYPE_MON))->get();
100 cct->_conf.set_val("mon_dns_srv_name", "cephmon");
101 MonMap monmap;
102 int r = monmap.build_initial(cct, false, std::cerr);
103
104 ASSERT_EQ(r, 0);
105 ASSERT_EQ(monmap.mon_info.size(), (unsigned int)3);
106 auto it = monmap.mon_info.find("mon.a");
107 ASSERT_NE(it, monmap.mon_info.end());
108 std::ostringstream os;
109 os << it->second.public_addrs;
110 ASSERT_EQ(os.str(), "192.168.1.11:6789/0");
111 os.str("");
112 it = monmap.mon_info.find("mon.b");
113 ASSERT_NE(it, monmap.mon_info.end());
114 os << it->second.public_addrs;
115 ASSERT_EQ(os.str(), "192.168.1.12:6789/0");
116 os.str("");
117 it = monmap.mon_info.find("mon.c");
118 ASSERT_NE(it, monmap.mon_info.end());
119 os << it->second.public_addrs;
120 ASSERT_EQ(os.str(), "192.168.1.13:6789/0");
121 }
122
123 TEST_F(MonMapTest, DISABLED_build_initial_config_from_dns_fail) {
124 MockResolvHWrapper *resolvH = new MockResolvHWrapper();
125 DNSResolver::get_instance(resolvH);
126
127
128 #ifdef HAVE_RES_NQUERY
129 EXPECT_CALL(*resolvH, res_nsearch(_, StrEq("_ceph-mon._tcp"), C_IN, T_SRV, _, _))
130 .WillOnce(Return(0));
131 #else
132 EXPECT_CALL(*resolvH, res_search(StrEq("_ceph-mon._tcp"), C_IN, T_SRV, _, _))
133 .WillOnce(Return(0));
134 #endif
135
136 CephContext *cct = (new CephContext(CEPH_ENTITY_TYPE_MON))->get();
137 // using default value of mon_dns_srv_name option
138 MonMap monmap;
139 int r = monmap.build_initial(cct, false, std::cerr);
140
141 ASSERT_EQ(r, -ENOENT);
142 ASSERT_EQ(monmap.mon_info.size(), (unsigned int)0);
143
144 }
145
146 TEST_F(MonMapTest, DISABLED_build_initial_config_from_dns_with_domain) {
147
148 MockResolvHWrapper *resolvH = new MockResolvHWrapper();
149 DNSResolver::get_instance(resolvH);
150
151 int len = sizeof(ns_search_msg_ok_payload);
152 int lena = sizeof(ns_query_msg_mon_a_payload);
153 int lenb = sizeof(ns_query_msg_mon_b_payload);
154 int lenc = sizeof(ns_query_msg_mon_c_payload);
155
156 using ::testing::InSequence;
157 {
158 InSequence s;
159
160 #ifdef HAVE_RES_NQUERY
161 EXPECT_CALL(*resolvH, res_nsearch(_, StrEq("_cephmon._tcp.ceph.com"), C_IN, T_SRV, _, _))
162 .WillOnce(DoAll(SetArrayArgument<4>(ns_search_msg_ok_payload,
163 ns_search_msg_ok_payload+len), Return(len)));
164
165 EXPECT_CALL(*resolvH, res_nquery(_,StrEq("mon.a.ceph.com"), C_IN, T_A,_,_))
166 .WillOnce(DoAll(SetArrayArgument<4>(ns_query_msg_mon_a_payload,
167 ns_query_msg_mon_a_payload+lena), Return(lena)));
168
169 EXPECT_CALL(*resolvH, res_nquery(_, StrEq("mon.c.ceph.com"), C_IN, T_A,_,_))
170 .WillOnce(DoAll(SetArrayArgument<4>(ns_query_msg_mon_c_payload,
171 ns_query_msg_mon_c_payload+lenc), Return(lenc)));
172
173 EXPECT_CALL(*resolvH, res_nquery(_,StrEq("mon.b.ceph.com"), C_IN, T_A, _,_))
174 .WillOnce(DoAll(SetArrayArgument<4>(ns_query_msg_mon_b_payload,
175 ns_query_msg_mon_b_payload+lenb), Return(lenb)));
176 #else
177 EXPECT_CALL(*resolvH, res_search(StrEq("_cephmon._tcp.ceph.com"), C_IN, T_SRV, _, _))
178 .WillOnce(DoAll(SetArrayArgument<3>(ns_search_msg_ok_payload,
179 ns_search_msg_ok_payload+len), Return(len)));
180
181 EXPECT_CALL(*resolvH, res_query(StrEq("mon.a.ceph.com"), C_IN, T_A,_,_))
182 .WillOnce(DoAll(SetArrayArgument<3>(ns_query_msg_mon_a_payload,
183 ns_query_msg_mon_a_payload+lena), Return(lena)));
184
185 EXPECT_CALL(*resolvH, res_query(StrEq("mon.c.ceph.com"), C_IN, T_A,_,_))
186 .WillOnce(DoAll(SetArrayArgument<3>(ns_query_msg_mon_c_payload,
187 ns_query_msg_mon_c_payload+lenc), Return(lenc)));
188
189 EXPECT_CALL(*resolvH, res_query(StrEq("mon.b.ceph.com"), C_IN, T_A, _,_))
190 .WillOnce(DoAll(SetArrayArgument<3>(ns_query_msg_mon_b_payload,
191 ns_query_msg_mon_b_payload+lenb), Return(lenb)));
192 #endif
193 }
194
195
196
197 CephContext *cct = (new CephContext(CEPH_ENTITY_TYPE_MON))->get();
198 cct->_conf.set_val("mon_dns_srv_name", "cephmon_ceph.com");
199 MonMap monmap;
200 int r = monmap.build_initial(cct, false, std::cerr);
201
202 ASSERT_EQ(r, 0);
203 ASSERT_EQ(monmap.mon_info.size(), (unsigned int)3);
204 auto it = monmap.mon_info.find("mon.a");
205 ASSERT_NE(it, monmap.mon_info.end());
206 std::ostringstream os;
207 os << it->second.public_addrs;
208 ASSERT_EQ(os.str(), "192.168.1.11:6789/0");
209 os.str("");
210 it = monmap.mon_info.find("mon.b");
211 ASSERT_NE(it, monmap.mon_info.end());
212 os << it->second.public_addrs;
213 ASSERT_EQ(os.str(), "192.168.1.12:6789/0");
214 os.str("");
215 it = monmap.mon_info.find("mon.c");
216 ASSERT_NE(it, monmap.mon_info.end());
217 os << it->second.public_addrs;
218 ASSERT_EQ(os.str(), "192.168.1.13:6789/0");
219 }
220
221 TEST(MonMapBuildInitial, build_initial_mon_host_from_dns) {
222 CephContext *cct = (new CephContext(CEPH_ENTITY_TYPE_MON))->get();
223 cct->_conf.set_val("mon_host", "ceph.io");
224 MonMap monmap;
225 int r = monmap.build_initial(cct, false, std::cerr);
226 ASSERT_EQ(r, 0);
227 ASSERT_GE(monmap.mon_info.size(), 1u);
228 for (const auto& [name, info] : monmap.mon_info) {
229 std::cerr << info << std::endl;
230 }
231 }
232
233 TEST(MonMapBuildInitial, build_initial_mon_host_from_dns_fail) {
234 CephContext *cct = (new CephContext(CEPH_ENTITY_TYPE_MON))->get();
235 cct->_conf.set_val("mon_host", "ceph.noname");
236 MonMap monmap;
237 int r = monmap.build_initial(cct, false, std::cerr);
238 ASSERT_EQ(r, -EINVAL);
239 }