Statistics
| Branch: | Tag: | Revision:

root / test / ganeti.rpc_unittest.py @ 83e7af18

History | View | Annotate | Download (15.8 kB)

1 33231500 Michael Hanselmann
#!/usr/bin/python
2 33231500 Michael Hanselmann
#
3 33231500 Michael Hanselmann
4 33231500 Michael Hanselmann
# Copyright (C) 2010 Google Inc.
5 33231500 Michael Hanselmann
#
6 33231500 Michael Hanselmann
# This program is free software; you can redistribute it and/or modify
7 33231500 Michael Hanselmann
# it under the terms of the GNU General Public License as published by
8 33231500 Michael Hanselmann
# the Free Software Foundation; either version 2 of the License, or
9 33231500 Michael Hanselmann
# (at your option) any later version.
10 33231500 Michael Hanselmann
#
11 33231500 Michael Hanselmann
# This program is distributed in the hope that it will be useful, but
12 33231500 Michael Hanselmann
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 33231500 Michael Hanselmann
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 33231500 Michael Hanselmann
# General Public License for more details.
15 33231500 Michael Hanselmann
#
16 33231500 Michael Hanselmann
# You should have received a copy of the GNU General Public License
17 33231500 Michael Hanselmann
# along with this program; if not, write to the Free Software
18 33231500 Michael Hanselmann
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 33231500 Michael Hanselmann
# 02110-1301, USA.
20 33231500 Michael Hanselmann
21 33231500 Michael Hanselmann
22 33231500 Michael Hanselmann
"""Script for testing ganeti.rpc"""
23 33231500 Michael Hanselmann
24 33231500 Michael Hanselmann
import os
25 33231500 Michael Hanselmann
import sys
26 33231500 Michael Hanselmann
import unittest
27 33231500 Michael Hanselmann
28 33231500 Michael Hanselmann
from ganeti import constants
29 33231500 Michael Hanselmann
from ganeti import compat
30 33231500 Michael Hanselmann
from ganeti import rpc
31 33231500 Michael Hanselmann
from ganeti import http
32 33231500 Michael Hanselmann
from ganeti import errors
33 33231500 Michael Hanselmann
from ganeti import serializer
34 00267bfe Michael Hanselmann
from ganeti import objects
35 33231500 Michael Hanselmann
36 33231500 Michael Hanselmann
import testutils
37 33231500 Michael Hanselmann
38 33231500 Michael Hanselmann
39 abbf2cd9 Michael Hanselmann
class _FakeRequestProcessor:
40 33231500 Michael Hanselmann
  def __init__(self, response_fn):
41 33231500 Michael Hanselmann
    self._response_fn = response_fn
42 33231500 Michael Hanselmann
    self.reqcount = 0
43 33231500 Michael Hanselmann
44 abbf2cd9 Michael Hanselmann
  def __call__(self, reqs, lock_monitor_cb=None):
45 abbf2cd9 Michael Hanselmann
    assert lock_monitor_cb is None or callable(lock_monitor_cb)
46 33231500 Michael Hanselmann
    for req in reqs:
47 33231500 Michael Hanselmann
      self.reqcount += 1
48 33231500 Michael Hanselmann
      self._response_fn(req)
49 33231500 Michael Hanselmann
50 33231500 Michael Hanselmann
51 eb202c13 Manuel Franceschini
def GetFakeSimpleStoreClass(fn):
52 eb202c13 Manuel Franceschini
  class FakeSimpleStore:
53 eb202c13 Manuel Franceschini
    GetNodePrimaryIPList = fn
54 b43dcc5a Manuel Franceschini
    GetPrimaryIPFamily = lambda _: None
55 eb202c13 Manuel Franceschini
56 eb202c13 Manuel Franceschini
  return FakeSimpleStore
57 eb202c13 Manuel Franceschini
58 eb202c13 Manuel Franceschini
59 00267bfe Michael Hanselmann
class TestRpcProcessor(unittest.TestCase):
60 eb202c13 Manuel Franceschini
  def _FakeAddressLookup(self, map):
61 eb202c13 Manuel Franceschini
    return lambda node_list: [map.get(node) for node in node_list]
62 eb202c13 Manuel Franceschini
63 33231500 Michael Hanselmann
  def _GetVersionResponse(self, req):
64 00267bfe Michael Hanselmann
    self.assertEqual(req.host, "127.0.0.1")
65 33231500 Michael Hanselmann
    self.assertEqual(req.port, 24094)
66 33231500 Michael Hanselmann
    self.assertEqual(req.path, "/version")
67 00267bfe Michael Hanselmann
    self.assertEqual(req.read_timeout, rpc._TMO_URGENT)
68 33231500 Michael Hanselmann
    req.success = True
69 33231500 Michael Hanselmann
    req.resp_status_code = http.HTTP_OK
70 33231500 Michael Hanselmann
    req.resp_body = serializer.DumpJson((True, 123))
71 33231500 Michael Hanselmann
72 33231500 Michael Hanselmann
  def testVersionSuccess(self):
73 00267bfe Michael Hanselmann
    resolver = rpc._StaticResolver(["127.0.0.1"])
74 abbf2cd9 Michael Hanselmann
    http_proc = _FakeRequestProcessor(self._GetVersionResponse)
75 00267bfe Michael Hanselmann
    proc = rpc._RpcProcessor(resolver, 24094)
76 abbf2cd9 Michael Hanselmann
    result = proc(["localhost"], "version", None, _req_process_fn=http_proc)
77 33231500 Michael Hanselmann
    self.assertEqual(result.keys(), ["localhost"])
78 33231500 Michael Hanselmann
    lhresp = result["localhost"]
79 33231500 Michael Hanselmann
    self.assertFalse(lhresp.offline)
80 33231500 Michael Hanselmann
    self.assertEqual(lhresp.node, "localhost")
81 33231500 Michael Hanselmann
    self.assertFalse(lhresp.fail_msg)
82 33231500 Michael Hanselmann
    self.assertEqual(lhresp.payload, 123)
83 33231500 Michael Hanselmann
    self.assertEqual(lhresp.call, "version")
84 33231500 Michael Hanselmann
    lhresp.Raise("should not raise")
85 abbf2cd9 Michael Hanselmann
    self.assertEqual(http_proc.reqcount, 1)
86 33231500 Michael Hanselmann
87 00267bfe Michael Hanselmann
  def _ReadTimeoutResponse(self, req):
88 00267bfe Michael Hanselmann
    self.assertEqual(req.host, "192.0.2.13")
89 00267bfe Michael Hanselmann
    self.assertEqual(req.port, 19176)
90 00267bfe Michael Hanselmann
    self.assertEqual(req.path, "/version")
91 00267bfe Michael Hanselmann
    self.assertEqual(req.read_timeout, 12356)
92 00267bfe Michael Hanselmann
    req.success = True
93 00267bfe Michael Hanselmann
    req.resp_status_code = http.HTTP_OK
94 00267bfe Michael Hanselmann
    req.resp_body = serializer.DumpJson((True, -1))
95 00267bfe Michael Hanselmann
96 00267bfe Michael Hanselmann
  def testReadTimeout(self):
97 00267bfe Michael Hanselmann
    resolver = rpc._StaticResolver(["192.0.2.13"])
98 abbf2cd9 Michael Hanselmann
    http_proc = _FakeRequestProcessor(self._ReadTimeoutResponse)
99 00267bfe Michael Hanselmann
    proc = rpc._RpcProcessor(resolver, 19176)
100 abbf2cd9 Michael Hanselmann
    result = proc(["node31856"], "version", None, _req_process_fn=http_proc,
101 00267bfe Michael Hanselmann
                  read_timeout=12356)
102 00267bfe Michael Hanselmann
    self.assertEqual(result.keys(), ["node31856"])
103 00267bfe Michael Hanselmann
    lhresp = result["node31856"]
104 00267bfe Michael Hanselmann
    self.assertFalse(lhresp.offline)
105 00267bfe Michael Hanselmann
    self.assertEqual(lhresp.node, "node31856")
106 00267bfe Michael Hanselmann
    self.assertFalse(lhresp.fail_msg)
107 00267bfe Michael Hanselmann
    self.assertEqual(lhresp.payload, -1)
108 00267bfe Michael Hanselmann
    self.assertEqual(lhresp.call, "version")
109 00267bfe Michael Hanselmann
    lhresp.Raise("should not raise")
110 abbf2cd9 Michael Hanselmann
    self.assertEqual(http_proc.reqcount, 1)
111 00267bfe Michael Hanselmann
112 00267bfe Michael Hanselmann
  def testOfflineNode(self):
113 00267bfe Michael Hanselmann
    resolver = rpc._StaticResolver([rpc._OFFLINE])
114 abbf2cd9 Michael Hanselmann
    http_proc = _FakeRequestProcessor(NotImplemented)
115 00267bfe Michael Hanselmann
    proc = rpc._RpcProcessor(resolver, 30668)
116 abbf2cd9 Michael Hanselmann
    result = proc(["n17296"], "version", None, _req_process_fn=http_proc)
117 00267bfe Michael Hanselmann
    self.assertEqual(result.keys(), ["n17296"])
118 00267bfe Michael Hanselmann
    lhresp = result["n17296"]
119 00267bfe Michael Hanselmann
    self.assertTrue(lhresp.offline)
120 00267bfe Michael Hanselmann
    self.assertEqual(lhresp.node, "n17296")
121 00267bfe Michael Hanselmann
    self.assertTrue(lhresp.fail_msg)
122 00267bfe Michael Hanselmann
    self.assertFalse(lhresp.payload)
123 00267bfe Michael Hanselmann
    self.assertEqual(lhresp.call, "version")
124 00267bfe Michael Hanselmann
125 00267bfe Michael Hanselmann
    # With a message
126 00267bfe Michael Hanselmann
    self.assertRaises(errors.OpExecError, lhresp.Raise, "should raise")
127 00267bfe Michael Hanselmann
128 00267bfe Michael Hanselmann
    # No message
129 00267bfe Michael Hanselmann
    self.assertRaises(errors.OpExecError, lhresp.Raise, None)
130 00267bfe Michael Hanselmann
131 abbf2cd9 Michael Hanselmann
    self.assertEqual(http_proc.reqcount, 0)
132 00267bfe Michael Hanselmann
133 33231500 Michael Hanselmann
  def _GetMultiVersionResponse(self, req):
134 33231500 Michael Hanselmann
    self.assert_(req.host.startswith("node"))
135 33231500 Michael Hanselmann
    self.assertEqual(req.port, 23245)
136 33231500 Michael Hanselmann
    self.assertEqual(req.path, "/version")
137 33231500 Michael Hanselmann
    req.success = True
138 33231500 Michael Hanselmann
    req.resp_status_code = http.HTTP_OK
139 33231500 Michael Hanselmann
    req.resp_body = serializer.DumpJson((True, 987))
140 33231500 Michael Hanselmann
141 33231500 Michael Hanselmann
  def testMultiVersionSuccess(self):
142 33231500 Michael Hanselmann
    nodes = ["node%s" % i for i in range(50)]
143 00267bfe Michael Hanselmann
    resolver = rpc._StaticResolver(nodes)
144 abbf2cd9 Michael Hanselmann
    http_proc = _FakeRequestProcessor(self._GetMultiVersionResponse)
145 00267bfe Michael Hanselmann
    proc = rpc._RpcProcessor(resolver, 23245)
146 abbf2cd9 Michael Hanselmann
    result = proc(nodes, "version", None, _req_process_fn=http_proc)
147 33231500 Michael Hanselmann
    self.assertEqual(sorted(result.keys()), sorted(nodes))
148 33231500 Michael Hanselmann
149 33231500 Michael Hanselmann
    for name in nodes:
150 33231500 Michael Hanselmann
      lhresp = result[name]
151 33231500 Michael Hanselmann
      self.assertFalse(lhresp.offline)
152 33231500 Michael Hanselmann
      self.assertEqual(lhresp.node, name)
153 33231500 Michael Hanselmann
      self.assertFalse(lhresp.fail_msg)
154 33231500 Michael Hanselmann
      self.assertEqual(lhresp.payload, 987)
155 33231500 Michael Hanselmann
      self.assertEqual(lhresp.call, "version")
156 33231500 Michael Hanselmann
      lhresp.Raise("should not raise")
157 33231500 Michael Hanselmann
158 abbf2cd9 Michael Hanselmann
    self.assertEqual(http_proc.reqcount, len(nodes))
159 33231500 Michael Hanselmann
160 00267bfe Michael Hanselmann
  def _GetVersionResponseFail(self, errinfo, req):
161 33231500 Michael Hanselmann
    self.assertEqual(req.path, "/version")
162 33231500 Michael Hanselmann
    req.success = True
163 33231500 Michael Hanselmann
    req.resp_status_code = http.HTTP_OK
164 00267bfe Michael Hanselmann
    req.resp_body = serializer.DumpJson((False, errinfo))
165 33231500 Michael Hanselmann
166 33231500 Michael Hanselmann
  def testVersionFailure(self):
167 00267bfe Michael Hanselmann
    resolver = rpc._StaticResolver(["aef9ur4i.example.com"])
168 00267bfe Michael Hanselmann
    proc = rpc._RpcProcessor(resolver, 5903)
169 00267bfe Michael Hanselmann
    for errinfo in [None, "Unknown error"]:
170 abbf2cd9 Michael Hanselmann
      http_proc = \
171 abbf2cd9 Michael Hanselmann
        _FakeRequestProcessor(compat.partial(self._GetVersionResponseFail,
172 abbf2cd9 Michael Hanselmann
                                             errinfo))
173 abbf2cd9 Michael Hanselmann
      result = proc(["aef9ur4i.example.com"], "version", None,
174 abbf2cd9 Michael Hanselmann
                    _req_process_fn=http_proc)
175 00267bfe Michael Hanselmann
      self.assertEqual(result.keys(), ["aef9ur4i.example.com"])
176 00267bfe Michael Hanselmann
      lhresp = result["aef9ur4i.example.com"]
177 00267bfe Michael Hanselmann
      self.assertFalse(lhresp.offline)
178 00267bfe Michael Hanselmann
      self.assertEqual(lhresp.node, "aef9ur4i.example.com")
179 00267bfe Michael Hanselmann
      self.assert_(lhresp.fail_msg)
180 00267bfe Michael Hanselmann
      self.assertFalse(lhresp.payload)
181 00267bfe Michael Hanselmann
      self.assertEqual(lhresp.call, "version")
182 00267bfe Michael Hanselmann
      self.assertRaises(errors.OpExecError, lhresp.Raise, "failed")
183 abbf2cd9 Michael Hanselmann
      self.assertEqual(http_proc.reqcount, 1)
184 33231500 Michael Hanselmann
185 33231500 Michael Hanselmann
  def _GetHttpErrorResponse(self, httperrnodes, failnodes, req):
186 33231500 Michael Hanselmann
    self.assertEqual(req.path, "/vg_list")
187 33231500 Michael Hanselmann
    self.assertEqual(req.port, 15165)
188 33231500 Michael Hanselmann
189 33231500 Michael Hanselmann
    if req.host in httperrnodes:
190 33231500 Michael Hanselmann
      req.success = False
191 33231500 Michael Hanselmann
      req.error = "Node set up for HTTP errors"
192 33231500 Michael Hanselmann
193 33231500 Michael Hanselmann
    elif req.host in failnodes:
194 33231500 Michael Hanselmann
      req.success = True
195 33231500 Michael Hanselmann
      req.resp_status_code = 404
196 33231500 Michael Hanselmann
      req.resp_body = serializer.DumpJson({
197 33231500 Michael Hanselmann
        "code": 404,
198 33231500 Michael Hanselmann
        "message": "Method not found",
199 33231500 Michael Hanselmann
        "explain": "Explanation goes here",
200 33231500 Michael Hanselmann
        })
201 33231500 Michael Hanselmann
    else:
202 33231500 Michael Hanselmann
      req.success = True
203 33231500 Michael Hanselmann
      req.resp_status_code = http.HTTP_OK
204 33231500 Michael Hanselmann
      req.resp_body = serializer.DumpJson((True, hash(req.host)))
205 33231500 Michael Hanselmann
206 33231500 Michael Hanselmann
  def testHttpError(self):
207 33231500 Michael Hanselmann
    nodes = ["uaf6pbbv%s" % i for i in range(50)]
208 00267bfe Michael Hanselmann
    resolver = rpc._StaticResolver(nodes)
209 33231500 Michael Hanselmann
210 33231500 Michael Hanselmann
    httperrnodes = set(nodes[1::7])
211 33231500 Michael Hanselmann
    self.assertEqual(len(httperrnodes), 7)
212 33231500 Michael Hanselmann
213 33231500 Michael Hanselmann
    failnodes = set(nodes[2::3]) - httperrnodes
214 33231500 Michael Hanselmann
    self.assertEqual(len(failnodes), 14)
215 33231500 Michael Hanselmann
216 33231500 Michael Hanselmann
    self.assertEqual(len(set(nodes) - failnodes - httperrnodes), 29)
217 33231500 Michael Hanselmann
218 00267bfe Michael Hanselmann
    proc = rpc._RpcProcessor(resolver, 15165)
219 abbf2cd9 Michael Hanselmann
    http_proc = \
220 abbf2cd9 Michael Hanselmann
      _FakeRequestProcessor(compat.partial(self._GetHttpErrorResponse,
221 abbf2cd9 Michael Hanselmann
                                           httperrnodes, failnodes))
222 83e7af18 Michael Hanselmann
    result = proc(nodes, "vg_list", None, _req_process_fn=http_proc,
223 83e7af18 Michael Hanselmann
                  read_timeout=rpc._TMO_URGENT)
224 33231500 Michael Hanselmann
    self.assertEqual(sorted(result.keys()), sorted(nodes))
225 33231500 Michael Hanselmann
226 33231500 Michael Hanselmann
    for name in nodes:
227 33231500 Michael Hanselmann
      lhresp = result[name]
228 33231500 Michael Hanselmann
      self.assertFalse(lhresp.offline)
229 33231500 Michael Hanselmann
      self.assertEqual(lhresp.node, name)
230 33231500 Michael Hanselmann
      self.assertEqual(lhresp.call, "vg_list")
231 33231500 Michael Hanselmann
232 33231500 Michael Hanselmann
      if name in httperrnodes:
233 33231500 Michael Hanselmann
        self.assert_(lhresp.fail_msg)
234 33231500 Michael Hanselmann
        self.assertRaises(errors.OpExecError, lhresp.Raise, "failed")
235 33231500 Michael Hanselmann
      elif name in failnodes:
236 33231500 Michael Hanselmann
        self.assert_(lhresp.fail_msg)
237 33231500 Michael Hanselmann
        self.assertRaises(errors.OpPrereqError, lhresp.Raise, "failed",
238 33231500 Michael Hanselmann
                          prereq=True, ecode=errors.ECODE_INVAL)
239 33231500 Michael Hanselmann
      else:
240 33231500 Michael Hanselmann
        self.assertFalse(lhresp.fail_msg)
241 33231500 Michael Hanselmann
        self.assertEqual(lhresp.payload, hash(name))
242 33231500 Michael Hanselmann
        lhresp.Raise("should not raise")
243 33231500 Michael Hanselmann
244 abbf2cd9 Michael Hanselmann
    self.assertEqual(http_proc.reqcount, len(nodes))
245 33231500 Michael Hanselmann
246 33231500 Michael Hanselmann
  def _GetInvalidResponseA(self, req):
247 33231500 Michael Hanselmann
    self.assertEqual(req.path, "/version")
248 33231500 Michael Hanselmann
    req.success = True
249 33231500 Michael Hanselmann
    req.resp_status_code = http.HTTP_OK
250 33231500 Michael Hanselmann
    req.resp_body = serializer.DumpJson(("This", "is", "an", "invalid",
251 33231500 Michael Hanselmann
                                         "response", "!", 1, 2, 3))
252 33231500 Michael Hanselmann
253 33231500 Michael Hanselmann
  def _GetInvalidResponseB(self, req):
254 33231500 Michael Hanselmann
    self.assertEqual(req.path, "/version")
255 33231500 Michael Hanselmann
    req.success = True
256 33231500 Michael Hanselmann
    req.resp_status_code = http.HTTP_OK
257 33231500 Michael Hanselmann
    req.resp_body = serializer.DumpJson("invalid response")
258 33231500 Michael Hanselmann
259 33231500 Michael Hanselmann
  def testInvalidResponse(self):
260 00267bfe Michael Hanselmann
    resolver = rpc._StaticResolver(["oqo7lanhly.example.com"])
261 00267bfe Michael Hanselmann
    proc = rpc._RpcProcessor(resolver, 19978)
262 00267bfe Michael Hanselmann
263 33231500 Michael Hanselmann
    for fn in [self._GetInvalidResponseA, self._GetInvalidResponseB]:
264 abbf2cd9 Michael Hanselmann
      http_proc = _FakeRequestProcessor(fn)
265 abbf2cd9 Michael Hanselmann
      result = proc(["oqo7lanhly.example.com"], "version", None,
266 abbf2cd9 Michael Hanselmann
                    _req_process_fn=http_proc)
267 33231500 Michael Hanselmann
      self.assertEqual(result.keys(), ["oqo7lanhly.example.com"])
268 33231500 Michael Hanselmann
      lhresp = result["oqo7lanhly.example.com"]
269 33231500 Michael Hanselmann
      self.assertFalse(lhresp.offline)
270 33231500 Michael Hanselmann
      self.assertEqual(lhresp.node, "oqo7lanhly.example.com")
271 33231500 Michael Hanselmann
      self.assert_(lhresp.fail_msg)
272 33231500 Michael Hanselmann
      self.assertFalse(lhresp.payload)
273 33231500 Michael Hanselmann
      self.assertEqual(lhresp.call, "version")
274 33231500 Michael Hanselmann
      self.assertRaises(errors.OpExecError, lhresp.Raise, "failed")
275 abbf2cd9 Michael Hanselmann
      self.assertEqual(http_proc.reqcount, 1)
276 33231500 Michael Hanselmann
277 00267bfe Michael Hanselmann
  def _GetBodyTestResponse(self, test_data, req):
278 00267bfe Michael Hanselmann
    self.assertEqual(req.host, "192.0.2.84")
279 00267bfe Michael Hanselmann
    self.assertEqual(req.port, 18700)
280 00267bfe Michael Hanselmann
    self.assertEqual(req.path, "/upload_file")
281 00267bfe Michael Hanselmann
    self.assertEqual(serializer.LoadJson(req.post_data), test_data)
282 00267bfe Michael Hanselmann
    req.success = True
283 00267bfe Michael Hanselmann
    req.resp_status_code = http.HTTP_OK
284 00267bfe Michael Hanselmann
    req.resp_body = serializer.DumpJson((True, None))
285 00267bfe Michael Hanselmann
286 00267bfe Michael Hanselmann
  def testResponseBody(self):
287 00267bfe Michael Hanselmann
    test_data = {
288 00267bfe Michael Hanselmann
      "Hello": "World",
289 00267bfe Michael Hanselmann
      "xyz": range(10),
290 00267bfe Michael Hanselmann
      }
291 00267bfe Michael Hanselmann
    resolver = rpc._StaticResolver(["192.0.2.84"])
292 abbf2cd9 Michael Hanselmann
    http_proc = _FakeRequestProcessor(compat.partial(self._GetBodyTestResponse,
293 abbf2cd9 Michael Hanselmann
                                                     test_data))
294 00267bfe Michael Hanselmann
    proc = rpc._RpcProcessor(resolver, 18700)
295 00267bfe Michael Hanselmann
    body = serializer.DumpJson(test_data)
296 abbf2cd9 Michael Hanselmann
    result = proc(["node19759"], "upload_file", body, _req_process_fn=http_proc)
297 00267bfe Michael Hanselmann
    self.assertEqual(result.keys(), ["node19759"])
298 00267bfe Michael Hanselmann
    lhresp = result["node19759"]
299 00267bfe Michael Hanselmann
    self.assertFalse(lhresp.offline)
300 00267bfe Michael Hanselmann
    self.assertEqual(lhresp.node, "node19759")
301 00267bfe Michael Hanselmann
    self.assertFalse(lhresp.fail_msg)
302 00267bfe Michael Hanselmann
    self.assertEqual(lhresp.payload, None)
303 00267bfe Michael Hanselmann
    self.assertEqual(lhresp.call, "upload_file")
304 00267bfe Michael Hanselmann
    lhresp.Raise("should not raise")
305 abbf2cd9 Michael Hanselmann
    self.assertEqual(http_proc.reqcount, 1)
306 00267bfe Michael Hanselmann
307 00267bfe Michael Hanselmann
308 00267bfe Michael Hanselmann
class TestSsconfResolver(unittest.TestCase):
309 00267bfe Michael Hanselmann
  def testSsconfLookup(self):
310 eb202c13 Manuel Franceschini
    addr_list = ["192.0.2.%d" % n for n in range(0, 255, 13)]
311 eb202c13 Manuel Franceschini
    node_list = ["node%d.example.com" % n for n in range(0, 255, 13)]
312 00267bfe Michael Hanselmann
    node_addr_list = [" ".join(t) for t in zip(node_list, addr_list)]
313 b43dcc5a Manuel Franceschini
    ssc = GetFakeSimpleStoreClass(lambda _: node_addr_list)
314 00267bfe Michael Hanselmann
    result = rpc._SsconfResolver(node_list, ssc=ssc, nslookup_fn=NotImplemented)
315 00267bfe Michael Hanselmann
    self.assertEqual(result, zip(node_list, addr_list))
316 eb202c13 Manuel Franceschini
317 00267bfe Michael Hanselmann
  def testNsLookup(self):
318 eb202c13 Manuel Franceschini
    addr_list = ["192.0.2.%d" % n for n in range(0, 255, 13)]
319 eb202c13 Manuel Franceschini
    node_list = ["node%d.example.com" % n for n in range(0, 255, 13)]
320 b43dcc5a Manuel Franceschini
    ssc = GetFakeSimpleStoreClass(lambda _: [])
321 eb202c13 Manuel Franceschini
    node_addr_map = dict(zip(node_list, addr_list))
322 b43dcc5a Manuel Franceschini
    nslookup_fn = lambda name, family=None: node_addr_map.get(name)
323 00267bfe Michael Hanselmann
    result = rpc._SsconfResolver(node_list, ssc=ssc, nslookup_fn=nslookup_fn)
324 00267bfe Michael Hanselmann
    self.assertEqual(result, zip(node_list, addr_list))
325 eb202c13 Manuel Franceschini
326 00267bfe Michael Hanselmann
  def testBothLookups(self):
327 eb202c13 Manuel Franceschini
    addr_list = ["192.0.2.%d" % n for n in range(0, 255, 13)]
328 eb202c13 Manuel Franceschini
    node_list = ["node%d.example.com" % n for n in range(0, 255, 13)]
329 eb202c13 Manuel Franceschini
    n = len(addr_list) / 2
330 00267bfe Michael Hanselmann
    node_addr_list = [" ".join(t) for t in zip(node_list[n:], addr_list[n:])]
331 b43dcc5a Manuel Franceschini
    ssc = GetFakeSimpleStoreClass(lambda _: node_addr_list)
332 eb202c13 Manuel Franceschini
    node_addr_map = dict(zip(node_list[:n], addr_list[:n]))
333 b43dcc5a Manuel Franceschini
    nslookup_fn = lambda name, family=None: node_addr_map.get(name)
334 00267bfe Michael Hanselmann
    result = rpc._SsconfResolver(node_list, ssc=ssc, nslookup_fn=nslookup_fn)
335 00267bfe Michael Hanselmann
    self.assertEqual(result, zip(node_list, addr_list))
336 eb202c13 Manuel Franceschini
337 b43dcc5a Manuel Franceschini
  def testAddressLookupIPv6(self):
338 00267bfe Michael Hanselmann
    addr_list = ["2001:db8::%d" % n for n in range(0, 255, 11)]
339 00267bfe Michael Hanselmann
    node_list = ["node%d.example.com" % n for n in range(0, 255, 11)]
340 00267bfe Michael Hanselmann
    node_addr_list = [" ".join(t) for t in zip(node_list, addr_list)]
341 b43dcc5a Manuel Franceschini
    ssc = GetFakeSimpleStoreClass(lambda _: node_addr_list)
342 00267bfe Michael Hanselmann
    result = rpc._SsconfResolver(node_list, ssc=ssc, nslookup_fn=NotImplemented)
343 00267bfe Michael Hanselmann
    self.assertEqual(result, zip(node_list, addr_list))
344 00267bfe Michael Hanselmann
345 00267bfe Michael Hanselmann
346 00267bfe Michael Hanselmann
class TestStaticResolver(unittest.TestCase):
347 00267bfe Michael Hanselmann
  def test(self):
348 00267bfe Michael Hanselmann
    addresses = ["192.0.2.%d" % n for n in range(0, 123, 7)]
349 00267bfe Michael Hanselmann
    nodes = ["node%s.example.com" % n for n in range(0, 123, 7)]
350 00267bfe Michael Hanselmann
    res = rpc._StaticResolver(addresses)
351 00267bfe Michael Hanselmann
    self.assertEqual(res(nodes), zip(nodes, addresses))
352 00267bfe Michael Hanselmann
353 00267bfe Michael Hanselmann
  def testWrongLength(self):
354 00267bfe Michael Hanselmann
    res = rpc._StaticResolver([])
355 00267bfe Michael Hanselmann
    self.assertRaises(AssertionError, res, ["abc"])
356 00267bfe Michael Hanselmann
357 00267bfe Michael Hanselmann
358 00267bfe Michael Hanselmann
class TestNodeConfigResolver(unittest.TestCase):
359 00267bfe Michael Hanselmann
  @staticmethod
360 00267bfe Michael Hanselmann
  def _GetSingleOnlineNode(name):
361 00267bfe Michael Hanselmann
    assert name == "node90.example.com"
362 00267bfe Michael Hanselmann
    return objects.Node(name=name, offline=False, primary_ip="192.0.2.90")
363 00267bfe Michael Hanselmann
364 00267bfe Michael Hanselmann
  @staticmethod
365 00267bfe Michael Hanselmann
  def _GetSingleOfflineNode(name):
366 00267bfe Michael Hanselmann
    assert name == "node100.example.com"
367 00267bfe Michael Hanselmann
    return objects.Node(name=name, offline=True, primary_ip="192.0.2.100")
368 00267bfe Michael Hanselmann
369 00267bfe Michael Hanselmann
  def testSingleOnline(self):
370 00267bfe Michael Hanselmann
    self.assertEqual(rpc._NodeConfigResolver(self._GetSingleOnlineNode,
371 00267bfe Michael Hanselmann
                                             NotImplemented,
372 00267bfe Michael Hanselmann
                                             ["node90.example.com"]),
373 00267bfe Michael Hanselmann
                     [("node90.example.com", "192.0.2.90")])
374 00267bfe Michael Hanselmann
375 00267bfe Michael Hanselmann
  def testSingleOffline(self):
376 00267bfe Michael Hanselmann
    self.assertEqual(rpc._NodeConfigResolver(self._GetSingleOfflineNode,
377 00267bfe Michael Hanselmann
                                             NotImplemented,
378 00267bfe Michael Hanselmann
                                             ["node100.example.com"]),
379 00267bfe Michael Hanselmann
                     [("node100.example.com", rpc._OFFLINE)])
380 00267bfe Michael Hanselmann
381 00267bfe Michael Hanselmann
  def testUnknownSingleNode(self):
382 00267bfe Michael Hanselmann
    self.assertEqual(rpc._NodeConfigResolver(lambda _: None, NotImplemented,
383 00267bfe Michael Hanselmann
                                             ["node110.example.com"]),
384 00267bfe Michael Hanselmann
                     [("node110.example.com", "node110.example.com")])
385 00267bfe Michael Hanselmann
386 00267bfe Michael Hanselmann
  def testMultiEmpty(self):
387 00267bfe Michael Hanselmann
    self.assertEqual(rpc._NodeConfigResolver(NotImplemented,
388 00267bfe Michael Hanselmann
                                             lambda: {},
389 00267bfe Michael Hanselmann
                                             []),
390 00267bfe Michael Hanselmann
                     [])
391 00267bfe Michael Hanselmann
392 00267bfe Michael Hanselmann
  def testMultiSomeOffline(self):
393 00267bfe Michael Hanselmann
    nodes = dict(("node%s.example.com" % i,
394 00267bfe Michael Hanselmann
                  objects.Node(name="node%s.example.com" % i,
395 00267bfe Michael Hanselmann
                               offline=((i % 3) == 0),
396 00267bfe Michael Hanselmann
                               primary_ip="192.0.2.%s" % i))
397 00267bfe Michael Hanselmann
                  for i in range(1, 255))
398 00267bfe Michael Hanselmann
399 00267bfe Michael Hanselmann
    # Resolve no names
400 00267bfe Michael Hanselmann
    self.assertEqual(rpc._NodeConfigResolver(NotImplemented,
401 00267bfe Michael Hanselmann
                                             lambda: nodes,
402 00267bfe Michael Hanselmann
                                             []),
403 00267bfe Michael Hanselmann
                     [])
404 00267bfe Michael Hanselmann
405 00267bfe Michael Hanselmann
    # Offline, online and unknown hosts
406 00267bfe Michael Hanselmann
    self.assertEqual(rpc._NodeConfigResolver(NotImplemented,
407 00267bfe Michael Hanselmann
                                             lambda: nodes,
408 00267bfe Michael Hanselmann
                                             ["node3.example.com",
409 00267bfe Michael Hanselmann
                                              "node92.example.com",
410 00267bfe Michael Hanselmann
                                              "node54.example.com",
411 00267bfe Michael Hanselmann
                                              "unknown.example.com",]), [
412 00267bfe Michael Hanselmann
      ("node3.example.com", rpc._OFFLINE),
413 00267bfe Michael Hanselmann
      ("node92.example.com", "192.0.2.92"),
414 00267bfe Michael Hanselmann
      ("node54.example.com", rpc._OFFLINE),
415 00267bfe Michael Hanselmann
      ("unknown.example.com", "unknown.example.com"),
416 00267bfe Michael Hanselmann
      ])
417 b43dcc5a Manuel Franceschini
418 33231500 Michael Hanselmann
419 33231500 Michael Hanselmann
if __name__ == "__main__":
420 33231500 Michael Hanselmann
  testutils.GanetiTestProgram()