]> git.proxmox.com Git - ceph.git/blame - ceph/src/test/mon/MonMap.cc
add subtree-ish sources for 12.0.3
[ceph.git] / ceph / src / test / mon / MonMap.cc
CommitLineData
7c673cae
FG
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
30using ::testing::Return;
31using ::testing::_;
32using ::testing::SetArrayArgument;
33using ::testing::DoAll;
34using ::testing::StrEq;
35
36
37class 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
48TEST_F(MonMapTest, 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", false);
101 MonMap monmap;
102 int r = monmap.build_initial(cct, std::cerr);
103
104 ASSERT_EQ(r, 0);
105 ASSERT_EQ(monmap.mon_addr.size(), (unsigned int)3);
106 map<string,entity_addr_t>::iterator it = monmap.mon_addr.find("mon.a");
107 ASSERT_NE(it, monmap.mon_addr.end());
108 std::ostringstream os;
109 os << it->second;
110 ASSERT_EQ(os.str(), "192.168.1.11:6789/0");
111 os.str("");
112 it = monmap.mon_addr.find("mon.b");
113 ASSERT_NE(it, monmap.mon_addr.end());
114 os << it->second;
115 ASSERT_EQ(os.str(), "192.168.1.12:6789/0");
116 os.str("");
117 it = monmap.mon_addr.find("mon.c");
118 ASSERT_NE(it, monmap.mon_addr.end());
119 os << it->second;
120 ASSERT_EQ(os.str(), "192.168.1.13:6789/0");
121}
122
123TEST_F(MonMapTest, 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, std::cerr);
140
141 ASSERT_EQ(r, -ENOENT);
142 ASSERT_EQ(monmap.mon_addr.size(), (unsigned int)0);
143
144}
145
146TEST_F(MonMapTest, 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", false);
199 MonMap monmap;
200 int r = monmap.build_initial(cct, std::cerr);
201
202 ASSERT_EQ(r, 0);
203 ASSERT_EQ(monmap.mon_addr.size(), (unsigned int)3);
204 map<string,entity_addr_t>::iterator it = monmap.mon_addr.find("mon.a");
205 ASSERT_NE(it, monmap.mon_addr.end());
206 std::ostringstream os;
207 os << it->second;
208 ASSERT_EQ(os.str(), "192.168.1.11:6789/0");
209 os.str("");
210 it = monmap.mon_addr.find("mon.b");
211 ASSERT_NE(it, monmap.mon_addr.end());
212 os << it->second;
213 ASSERT_EQ(os.str(), "192.168.1.12:6789/0");
214 os.str("");
215 it = monmap.mon_addr.find("mon.c");
216 ASSERT_NE(it, monmap.mon_addr.end());
217 os << it->second;
218 ASSERT_EQ(os.str(), "192.168.1.13:6789/0");
219}
220