Fix some bugs when testing opensds ansible
[stor4nfv.git] / src / 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, 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
123 TEST_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
146 TEST_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