Statistics
| Branch: | Tag: | Revision:

root / test / ganeti.rpc_unittest.py @ f863d7aa

History | View | Annotate | Download (15.9 kB)

1 33231500 Michael Hanselmann
#!/usr/bin/python
2 33231500 Michael Hanselmann
#
3 33231500 Michael Hanselmann
4 d9de612c Iustin Pop
# Copyright (C) 2010, 2011 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 f863d7aa Michael Hanselmann
    result = proc(["localhost"], "version", {"localhost": ""}, 60,
77 f863d7aa Michael Hanselmann
                  _req_process_fn=http_proc)
78 33231500 Michael Hanselmann
    self.assertEqual(result.keys(), ["localhost"])
79 33231500 Michael Hanselmann
    lhresp = result["localhost"]
80 33231500 Michael Hanselmann
    self.assertFalse(lhresp.offline)
81 33231500 Michael Hanselmann
    self.assertEqual(lhresp.node, "localhost")
82 33231500 Michael Hanselmann
    self.assertFalse(lhresp.fail_msg)
83 33231500 Michael Hanselmann
    self.assertEqual(lhresp.payload, 123)
84 33231500 Michael Hanselmann
    self.assertEqual(lhresp.call, "version")
85 33231500 Michael Hanselmann
    lhresp.Raise("should not raise")
86 abbf2cd9 Michael Hanselmann
    self.assertEqual(http_proc.reqcount, 1)
87 33231500 Michael Hanselmann
88 00267bfe Michael Hanselmann
  def _ReadTimeoutResponse(self, req):
89 00267bfe Michael Hanselmann
    self.assertEqual(req.host, "192.0.2.13")
90 00267bfe Michael Hanselmann
    self.assertEqual(req.port, 19176)
91 00267bfe Michael Hanselmann
    self.assertEqual(req.path, "/version")
92 00267bfe Michael Hanselmann
    self.assertEqual(req.read_timeout, 12356)
93 00267bfe Michael Hanselmann
    req.success = True
94 00267bfe Michael Hanselmann
    req.resp_status_code = http.HTTP_OK
95 00267bfe Michael Hanselmann
    req.resp_body = serializer.DumpJson((True, -1))
96 00267bfe Michael Hanselmann
97 00267bfe Michael Hanselmann
  def testReadTimeout(self):
98 00267bfe Michael Hanselmann
    resolver = rpc._StaticResolver(["192.0.2.13"])
99 abbf2cd9 Michael Hanselmann
    http_proc = _FakeRequestProcessor(self._ReadTimeoutResponse)
100 00267bfe Michael Hanselmann
    proc = rpc._RpcProcessor(resolver, 19176)
101 d9de612c Iustin Pop
    host = "node31856"
102 d9de612c Iustin Pop
    body = {host: ""}
103 f863d7aa Michael Hanselmann
    result = proc([host], "version", body, 12356, _req_process_fn=http_proc)
104 d9de612c Iustin Pop
    self.assertEqual(result.keys(), [host])
105 d9de612c Iustin Pop
    lhresp = result[host]
106 00267bfe Michael Hanselmann
    self.assertFalse(lhresp.offline)
107 d9de612c Iustin Pop
    self.assertEqual(lhresp.node, host)
108 00267bfe Michael Hanselmann
    self.assertFalse(lhresp.fail_msg)
109 00267bfe Michael Hanselmann
    self.assertEqual(lhresp.payload, -1)
110 00267bfe Michael Hanselmann
    self.assertEqual(lhresp.call, "version")
111 00267bfe Michael Hanselmann
    lhresp.Raise("should not raise")
112 abbf2cd9 Michael Hanselmann
    self.assertEqual(http_proc.reqcount, 1)
113 00267bfe Michael Hanselmann
114 00267bfe Michael Hanselmann
  def testOfflineNode(self):
115 00267bfe Michael Hanselmann
    resolver = rpc._StaticResolver([rpc._OFFLINE])
116 abbf2cd9 Michael Hanselmann
    http_proc = _FakeRequestProcessor(NotImplemented)
117 00267bfe Michael Hanselmann
    proc = rpc._RpcProcessor(resolver, 30668)
118 d9de612c Iustin Pop
    host = "n17296"
119 d9de612c Iustin Pop
    body = {host: ""}
120 f863d7aa Michael Hanselmann
    result = proc([host], "version", body, 60, _req_process_fn=http_proc)
121 d9de612c Iustin Pop
    self.assertEqual(result.keys(), [host])
122 d9de612c Iustin Pop
    lhresp = result[host]
123 00267bfe Michael Hanselmann
    self.assertTrue(lhresp.offline)
124 d9de612c Iustin Pop
    self.assertEqual(lhresp.node, host)
125 00267bfe Michael Hanselmann
    self.assertTrue(lhresp.fail_msg)
126 00267bfe Michael Hanselmann
    self.assertFalse(lhresp.payload)
127 00267bfe Michael Hanselmann
    self.assertEqual(lhresp.call, "version")
128 00267bfe Michael Hanselmann
129 00267bfe Michael Hanselmann
    # With a message
130 00267bfe Michael Hanselmann
    self.assertRaises(errors.OpExecError, lhresp.Raise, "should raise")
131 00267bfe Michael Hanselmann
132 00267bfe Michael Hanselmann
    # No message
133 00267bfe Michael Hanselmann
    self.assertRaises(errors.OpExecError, lhresp.Raise, None)
134 00267bfe Michael Hanselmann
135 abbf2cd9 Michael Hanselmann
    self.assertEqual(http_proc.reqcount, 0)
136 00267bfe Michael Hanselmann
137 33231500 Michael Hanselmann
  def _GetMultiVersionResponse(self, req):
138 33231500 Michael Hanselmann
    self.assert_(req.host.startswith("node"))
139 33231500 Michael Hanselmann
    self.assertEqual(req.port, 23245)
140 33231500 Michael Hanselmann
    self.assertEqual(req.path, "/version")
141 33231500 Michael Hanselmann
    req.success = True
142 33231500 Michael Hanselmann
    req.resp_status_code = http.HTTP_OK
143 33231500 Michael Hanselmann
    req.resp_body = serializer.DumpJson((True, 987))
144 33231500 Michael Hanselmann
145 33231500 Michael Hanselmann
  def testMultiVersionSuccess(self):
146 33231500 Michael Hanselmann
    nodes = ["node%s" % i for i in range(50)]
147 d9de612c Iustin Pop
    body = dict((n, "") for n in nodes)
148 00267bfe Michael Hanselmann
    resolver = rpc._StaticResolver(nodes)
149 abbf2cd9 Michael Hanselmann
    http_proc = _FakeRequestProcessor(self._GetMultiVersionResponse)
150 00267bfe Michael Hanselmann
    proc = rpc._RpcProcessor(resolver, 23245)
151 f863d7aa Michael Hanselmann
    result = proc(nodes, "version", body, 60, _req_process_fn=http_proc,)
152 33231500 Michael Hanselmann
    self.assertEqual(sorted(result.keys()), sorted(nodes))
153 33231500 Michael Hanselmann
154 33231500 Michael Hanselmann
    for name in nodes:
155 33231500 Michael Hanselmann
      lhresp = result[name]
156 33231500 Michael Hanselmann
      self.assertFalse(lhresp.offline)
157 33231500 Michael Hanselmann
      self.assertEqual(lhresp.node, name)
158 33231500 Michael Hanselmann
      self.assertFalse(lhresp.fail_msg)
159 33231500 Michael Hanselmann
      self.assertEqual(lhresp.payload, 987)
160 33231500 Michael Hanselmann
      self.assertEqual(lhresp.call, "version")
161 33231500 Michael Hanselmann
      lhresp.Raise("should not raise")
162 33231500 Michael Hanselmann
163 abbf2cd9 Michael Hanselmann
    self.assertEqual(http_proc.reqcount, len(nodes))
164 33231500 Michael Hanselmann
165 00267bfe Michael Hanselmann
  def _GetVersionResponseFail(self, errinfo, req):
166 33231500 Michael Hanselmann
    self.assertEqual(req.path, "/version")
167 33231500 Michael Hanselmann
    req.success = True
168 33231500 Michael Hanselmann
    req.resp_status_code = http.HTTP_OK
169 00267bfe Michael Hanselmann
    req.resp_body = serializer.DumpJson((False, errinfo))
170 33231500 Michael Hanselmann
171 33231500 Michael Hanselmann
  def testVersionFailure(self):
172 00267bfe Michael Hanselmann
    resolver = rpc._StaticResolver(["aef9ur4i.example.com"])
173 00267bfe Michael Hanselmann
    proc = rpc._RpcProcessor(resolver, 5903)
174 00267bfe Michael Hanselmann
    for errinfo in [None, "Unknown error"]:
175 abbf2cd9 Michael Hanselmann
      http_proc = \
176 abbf2cd9 Michael Hanselmann
        _FakeRequestProcessor(compat.partial(self._GetVersionResponseFail,
177 abbf2cd9 Michael Hanselmann
                                             errinfo))
178 d9de612c Iustin Pop
      host = "aef9ur4i.example.com"
179 d9de612c Iustin Pop
      body = {host: ""}
180 f863d7aa Michael Hanselmann
      result = proc(body.keys(), "version", body, 60,
181 f863d7aa Michael Hanselmann
                    _req_process_fn=http_proc)
182 d9de612c Iustin Pop
      self.assertEqual(result.keys(), [host])
183 d9de612c Iustin Pop
      lhresp = result[host]
184 00267bfe Michael Hanselmann
      self.assertFalse(lhresp.offline)
185 d9de612c Iustin Pop
      self.assertEqual(lhresp.node, host)
186 00267bfe Michael Hanselmann
      self.assert_(lhresp.fail_msg)
187 00267bfe Michael Hanselmann
      self.assertFalse(lhresp.payload)
188 00267bfe Michael Hanselmann
      self.assertEqual(lhresp.call, "version")
189 00267bfe Michael Hanselmann
      self.assertRaises(errors.OpExecError, lhresp.Raise, "failed")
190 abbf2cd9 Michael Hanselmann
      self.assertEqual(http_proc.reqcount, 1)
191 33231500 Michael Hanselmann
192 33231500 Michael Hanselmann
  def _GetHttpErrorResponse(self, httperrnodes, failnodes, req):
193 33231500 Michael Hanselmann
    self.assertEqual(req.path, "/vg_list")
194 33231500 Michael Hanselmann
    self.assertEqual(req.port, 15165)
195 33231500 Michael Hanselmann
196 33231500 Michael Hanselmann
    if req.host in httperrnodes:
197 33231500 Michael Hanselmann
      req.success = False
198 33231500 Michael Hanselmann
      req.error = "Node set up for HTTP errors"
199 33231500 Michael Hanselmann
200 33231500 Michael Hanselmann
    elif req.host in failnodes:
201 33231500 Michael Hanselmann
      req.success = True
202 33231500 Michael Hanselmann
      req.resp_status_code = 404
203 33231500 Michael Hanselmann
      req.resp_body = serializer.DumpJson({
204 33231500 Michael Hanselmann
        "code": 404,
205 33231500 Michael Hanselmann
        "message": "Method not found",
206 33231500 Michael Hanselmann
        "explain": "Explanation goes here",
207 33231500 Michael Hanselmann
        })
208 33231500 Michael Hanselmann
    else:
209 33231500 Michael Hanselmann
      req.success = True
210 33231500 Michael Hanselmann
      req.resp_status_code = http.HTTP_OK
211 33231500 Michael Hanselmann
      req.resp_body = serializer.DumpJson((True, hash(req.host)))
212 33231500 Michael Hanselmann
213 33231500 Michael Hanselmann
  def testHttpError(self):
214 33231500 Michael Hanselmann
    nodes = ["uaf6pbbv%s" % i for i in range(50)]
215 d9de612c Iustin Pop
    body = dict((n, "") for n in nodes)
216 00267bfe Michael Hanselmann
    resolver = rpc._StaticResolver(nodes)
217 33231500 Michael Hanselmann
218 33231500 Michael Hanselmann
    httperrnodes = set(nodes[1::7])
219 33231500 Michael Hanselmann
    self.assertEqual(len(httperrnodes), 7)
220 33231500 Michael Hanselmann
221 33231500 Michael Hanselmann
    failnodes = set(nodes[2::3]) - httperrnodes
222 33231500 Michael Hanselmann
    self.assertEqual(len(failnodes), 14)
223 33231500 Michael Hanselmann
224 33231500 Michael Hanselmann
    self.assertEqual(len(set(nodes) - failnodes - httperrnodes), 29)
225 33231500 Michael Hanselmann
226 00267bfe Michael Hanselmann
    proc = rpc._RpcProcessor(resolver, 15165)
227 abbf2cd9 Michael Hanselmann
    http_proc = \
228 abbf2cd9 Michael Hanselmann
      _FakeRequestProcessor(compat.partial(self._GetHttpErrorResponse,
229 abbf2cd9 Michael Hanselmann
                                           httperrnodes, failnodes))
230 f863d7aa Michael Hanselmann
    result = proc(nodes, "vg_list", body, rpc._TMO_URGENT,
231 f863d7aa Michael Hanselmann
                  _req_process_fn=http_proc)
232 33231500 Michael Hanselmann
    self.assertEqual(sorted(result.keys()), sorted(nodes))
233 33231500 Michael Hanselmann
234 33231500 Michael Hanselmann
    for name in nodes:
235 33231500 Michael Hanselmann
      lhresp = result[name]
236 33231500 Michael Hanselmann
      self.assertFalse(lhresp.offline)
237 33231500 Michael Hanselmann
      self.assertEqual(lhresp.node, name)
238 33231500 Michael Hanselmann
      self.assertEqual(lhresp.call, "vg_list")
239 33231500 Michael Hanselmann
240 33231500 Michael Hanselmann
      if name in httperrnodes:
241 33231500 Michael Hanselmann
        self.assert_(lhresp.fail_msg)
242 33231500 Michael Hanselmann
        self.assertRaises(errors.OpExecError, lhresp.Raise, "failed")
243 33231500 Michael Hanselmann
      elif name in failnodes:
244 33231500 Michael Hanselmann
        self.assert_(lhresp.fail_msg)
245 33231500 Michael Hanselmann
        self.assertRaises(errors.OpPrereqError, lhresp.Raise, "failed",
246 33231500 Michael Hanselmann
                          prereq=True, ecode=errors.ECODE_INVAL)
247 33231500 Michael Hanselmann
      else:
248 33231500 Michael Hanselmann
        self.assertFalse(lhresp.fail_msg)
249 33231500 Michael Hanselmann
        self.assertEqual(lhresp.payload, hash(name))
250 33231500 Michael Hanselmann
        lhresp.Raise("should not raise")
251 33231500 Michael Hanselmann
252 abbf2cd9 Michael Hanselmann
    self.assertEqual(http_proc.reqcount, len(nodes))
253 33231500 Michael Hanselmann
254 33231500 Michael Hanselmann
  def _GetInvalidResponseA(self, req):
255 33231500 Michael Hanselmann
    self.assertEqual(req.path, "/version")
256 33231500 Michael Hanselmann
    req.success = True
257 33231500 Michael Hanselmann
    req.resp_status_code = http.HTTP_OK
258 33231500 Michael Hanselmann
    req.resp_body = serializer.DumpJson(("This", "is", "an", "invalid",
259 33231500 Michael Hanselmann
                                         "response", "!", 1, 2, 3))
260 33231500 Michael Hanselmann
261 33231500 Michael Hanselmann
  def _GetInvalidResponseB(self, req):
262 33231500 Michael Hanselmann
    self.assertEqual(req.path, "/version")
263 33231500 Michael Hanselmann
    req.success = True
264 33231500 Michael Hanselmann
    req.resp_status_code = http.HTTP_OK
265 33231500 Michael Hanselmann
    req.resp_body = serializer.DumpJson("invalid response")
266 33231500 Michael Hanselmann
267 33231500 Michael Hanselmann
  def testInvalidResponse(self):
268 00267bfe Michael Hanselmann
    resolver = rpc._StaticResolver(["oqo7lanhly.example.com"])
269 00267bfe Michael Hanselmann
    proc = rpc._RpcProcessor(resolver, 19978)
270 00267bfe Michael Hanselmann
271 33231500 Michael Hanselmann
    for fn in [self._GetInvalidResponseA, self._GetInvalidResponseB]:
272 abbf2cd9 Michael Hanselmann
      http_proc = _FakeRequestProcessor(fn)
273 d9de612c Iustin Pop
      host = "oqo7lanhly.example.com"
274 d9de612c Iustin Pop
      body = {host: ""}
275 f863d7aa Michael Hanselmann
      result = proc([host], "version", body, 60,
276 f863d7aa Michael Hanselmann
                    _req_process_fn=http_proc)
277 d9de612c Iustin Pop
      self.assertEqual(result.keys(), [host])
278 d9de612c Iustin Pop
      lhresp = result[host]
279 33231500 Michael Hanselmann
      self.assertFalse(lhresp.offline)
280 d9de612c Iustin Pop
      self.assertEqual(lhresp.node, host)
281 33231500 Michael Hanselmann
      self.assert_(lhresp.fail_msg)
282 33231500 Michael Hanselmann
      self.assertFalse(lhresp.payload)
283 33231500 Michael Hanselmann
      self.assertEqual(lhresp.call, "version")
284 33231500 Michael Hanselmann
      self.assertRaises(errors.OpExecError, lhresp.Raise, "failed")
285 abbf2cd9 Michael Hanselmann
      self.assertEqual(http_proc.reqcount, 1)
286 33231500 Michael Hanselmann
287 00267bfe Michael Hanselmann
  def _GetBodyTestResponse(self, test_data, req):
288 00267bfe Michael Hanselmann
    self.assertEqual(req.host, "192.0.2.84")
289 00267bfe Michael Hanselmann
    self.assertEqual(req.port, 18700)
290 00267bfe Michael Hanselmann
    self.assertEqual(req.path, "/upload_file")
291 00267bfe Michael Hanselmann
    self.assertEqual(serializer.LoadJson(req.post_data), test_data)
292 00267bfe Michael Hanselmann
    req.success = True
293 00267bfe Michael Hanselmann
    req.resp_status_code = http.HTTP_OK
294 00267bfe Michael Hanselmann
    req.resp_body = serializer.DumpJson((True, None))
295 00267bfe Michael Hanselmann
296 00267bfe Michael Hanselmann
  def testResponseBody(self):
297 00267bfe Michael Hanselmann
    test_data = {
298 00267bfe Michael Hanselmann
      "Hello": "World",
299 00267bfe Michael Hanselmann
      "xyz": range(10),
300 00267bfe Michael Hanselmann
      }
301 00267bfe Michael Hanselmann
    resolver = rpc._StaticResolver(["192.0.2.84"])
302 abbf2cd9 Michael Hanselmann
    http_proc = _FakeRequestProcessor(compat.partial(self._GetBodyTestResponse,
303 abbf2cd9 Michael Hanselmann
                                                     test_data))
304 00267bfe Michael Hanselmann
    proc = rpc._RpcProcessor(resolver, 18700)
305 d9de612c Iustin Pop
    host = "node19759"
306 d9de612c Iustin Pop
    body = {host: serializer.DumpJson(test_data)}
307 f863d7aa Michael Hanselmann
    result = proc([host], "upload_file", body, 30, _req_process_fn=http_proc)
308 d9de612c Iustin Pop
    self.assertEqual(result.keys(), [host])
309 d9de612c Iustin Pop
    lhresp = result[host]
310 00267bfe Michael Hanselmann
    self.assertFalse(lhresp.offline)
311 d9de612c Iustin Pop
    self.assertEqual(lhresp.node, host)
312 00267bfe Michael Hanselmann
    self.assertFalse(lhresp.fail_msg)
313 00267bfe Michael Hanselmann
    self.assertEqual(lhresp.payload, None)
314 00267bfe Michael Hanselmann
    self.assertEqual(lhresp.call, "upload_file")
315 00267bfe Michael Hanselmann
    lhresp.Raise("should not raise")
316 abbf2cd9 Michael Hanselmann
    self.assertEqual(http_proc.reqcount, 1)
317 00267bfe Michael Hanselmann
318 00267bfe Michael Hanselmann
319 00267bfe Michael Hanselmann
class TestSsconfResolver(unittest.TestCase):
320 00267bfe Michael Hanselmann
  def testSsconfLookup(self):
321 eb202c13 Manuel Franceschini
    addr_list = ["192.0.2.%d" % n for n in range(0, 255, 13)]
322 eb202c13 Manuel Franceschini
    node_list = ["node%d.example.com" % n for n in range(0, 255, 13)]
323 00267bfe Michael Hanselmann
    node_addr_list = [" ".join(t) for t in zip(node_list, addr_list)]
324 b43dcc5a Manuel Franceschini
    ssc = GetFakeSimpleStoreClass(lambda _: node_addr_list)
325 00267bfe Michael Hanselmann
    result = rpc._SsconfResolver(node_list, ssc=ssc, nslookup_fn=NotImplemented)
326 00267bfe Michael Hanselmann
    self.assertEqual(result, zip(node_list, addr_list))
327 eb202c13 Manuel Franceschini
328 00267bfe Michael Hanselmann
  def testNsLookup(self):
329 eb202c13 Manuel Franceschini
    addr_list = ["192.0.2.%d" % n for n in range(0, 255, 13)]
330 eb202c13 Manuel Franceschini
    node_list = ["node%d.example.com" % n for n in range(0, 255, 13)]
331 b43dcc5a Manuel Franceschini
    ssc = GetFakeSimpleStoreClass(lambda _: [])
332 eb202c13 Manuel Franceschini
    node_addr_map = dict(zip(node_list, addr_list))
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 00267bfe Michael Hanselmann
  def testBothLookups(self):
338 eb202c13 Manuel Franceschini
    addr_list = ["192.0.2.%d" % n for n in range(0, 255, 13)]
339 eb202c13 Manuel Franceschini
    node_list = ["node%d.example.com" % n for n in range(0, 255, 13)]
340 eb202c13 Manuel Franceschini
    n = len(addr_list) / 2
341 00267bfe Michael Hanselmann
    node_addr_list = [" ".join(t) for t in zip(node_list[n:], addr_list[n:])]
342 b43dcc5a Manuel Franceschini
    ssc = GetFakeSimpleStoreClass(lambda _: node_addr_list)
343 eb202c13 Manuel Franceschini
    node_addr_map = dict(zip(node_list[:n], addr_list[:n]))
344 b43dcc5a Manuel Franceschini
    nslookup_fn = lambda name, family=None: node_addr_map.get(name)
345 00267bfe Michael Hanselmann
    result = rpc._SsconfResolver(node_list, ssc=ssc, nslookup_fn=nslookup_fn)
346 00267bfe Michael Hanselmann
    self.assertEqual(result, zip(node_list, addr_list))
347 eb202c13 Manuel Franceschini
348 b43dcc5a Manuel Franceschini
  def testAddressLookupIPv6(self):
349 00267bfe Michael Hanselmann
    addr_list = ["2001:db8::%d" % n for n in range(0, 255, 11)]
350 00267bfe Michael Hanselmann
    node_list = ["node%d.example.com" % n for n in range(0, 255, 11)]
351 00267bfe Michael Hanselmann
    node_addr_list = [" ".join(t) for t in zip(node_list, addr_list)]
352 b43dcc5a Manuel Franceschini
    ssc = GetFakeSimpleStoreClass(lambda _: node_addr_list)
353 00267bfe Michael Hanselmann
    result = rpc._SsconfResolver(node_list, ssc=ssc, nslookup_fn=NotImplemented)
354 00267bfe Michael Hanselmann
    self.assertEqual(result, zip(node_list, addr_list))
355 00267bfe Michael Hanselmann
356 00267bfe Michael Hanselmann
357 00267bfe Michael Hanselmann
class TestStaticResolver(unittest.TestCase):
358 00267bfe Michael Hanselmann
  def test(self):
359 00267bfe Michael Hanselmann
    addresses = ["192.0.2.%d" % n for n in range(0, 123, 7)]
360 00267bfe Michael Hanselmann
    nodes = ["node%s.example.com" % n for n in range(0, 123, 7)]
361 00267bfe Michael Hanselmann
    res = rpc._StaticResolver(addresses)
362 00267bfe Michael Hanselmann
    self.assertEqual(res(nodes), zip(nodes, addresses))
363 00267bfe Michael Hanselmann
364 00267bfe Michael Hanselmann
  def testWrongLength(self):
365 00267bfe Michael Hanselmann
    res = rpc._StaticResolver([])
366 00267bfe Michael Hanselmann
    self.assertRaises(AssertionError, res, ["abc"])
367 00267bfe Michael Hanselmann
368 00267bfe Michael Hanselmann
369 00267bfe Michael Hanselmann
class TestNodeConfigResolver(unittest.TestCase):
370 00267bfe Michael Hanselmann
  @staticmethod
371 00267bfe Michael Hanselmann
  def _GetSingleOnlineNode(name):
372 00267bfe Michael Hanselmann
    assert name == "node90.example.com"
373 00267bfe Michael Hanselmann
    return objects.Node(name=name, offline=False, primary_ip="192.0.2.90")
374 00267bfe Michael Hanselmann
375 00267bfe Michael Hanselmann
  @staticmethod
376 00267bfe Michael Hanselmann
  def _GetSingleOfflineNode(name):
377 00267bfe Michael Hanselmann
    assert name == "node100.example.com"
378 00267bfe Michael Hanselmann
    return objects.Node(name=name, offline=True, primary_ip="192.0.2.100")
379 00267bfe Michael Hanselmann
380 00267bfe Michael Hanselmann
  def testSingleOnline(self):
381 00267bfe Michael Hanselmann
    self.assertEqual(rpc._NodeConfigResolver(self._GetSingleOnlineNode,
382 00267bfe Michael Hanselmann
                                             NotImplemented,
383 00267bfe Michael Hanselmann
                                             ["node90.example.com"]),
384 00267bfe Michael Hanselmann
                     [("node90.example.com", "192.0.2.90")])
385 00267bfe Michael Hanselmann
386 00267bfe Michael Hanselmann
  def testSingleOffline(self):
387 00267bfe Michael Hanselmann
    self.assertEqual(rpc._NodeConfigResolver(self._GetSingleOfflineNode,
388 00267bfe Michael Hanselmann
                                             NotImplemented,
389 00267bfe Michael Hanselmann
                                             ["node100.example.com"]),
390 00267bfe Michael Hanselmann
                     [("node100.example.com", rpc._OFFLINE)])
391 00267bfe Michael Hanselmann
392 00267bfe Michael Hanselmann
  def testUnknownSingleNode(self):
393 00267bfe Michael Hanselmann
    self.assertEqual(rpc._NodeConfigResolver(lambda _: None, NotImplemented,
394 00267bfe Michael Hanselmann
                                             ["node110.example.com"]),
395 00267bfe Michael Hanselmann
                     [("node110.example.com", "node110.example.com")])
396 00267bfe Michael Hanselmann
397 00267bfe Michael Hanselmann
  def testMultiEmpty(self):
398 00267bfe Michael Hanselmann
    self.assertEqual(rpc._NodeConfigResolver(NotImplemented,
399 00267bfe Michael Hanselmann
                                             lambda: {},
400 00267bfe Michael Hanselmann
                                             []),
401 00267bfe Michael Hanselmann
                     [])
402 00267bfe Michael Hanselmann
403 00267bfe Michael Hanselmann
  def testMultiSomeOffline(self):
404 00267bfe Michael Hanselmann
    nodes = dict(("node%s.example.com" % i,
405 00267bfe Michael Hanselmann
                  objects.Node(name="node%s.example.com" % i,
406 00267bfe Michael Hanselmann
                               offline=((i % 3) == 0),
407 00267bfe Michael Hanselmann
                               primary_ip="192.0.2.%s" % i))
408 00267bfe Michael Hanselmann
                  for i in range(1, 255))
409 00267bfe Michael Hanselmann
410 00267bfe Michael Hanselmann
    # Resolve no names
411 00267bfe Michael Hanselmann
    self.assertEqual(rpc._NodeConfigResolver(NotImplemented,
412 00267bfe Michael Hanselmann
                                             lambda: nodes,
413 00267bfe Michael Hanselmann
                                             []),
414 00267bfe Michael Hanselmann
                     [])
415 00267bfe Michael Hanselmann
416 00267bfe Michael Hanselmann
    # Offline, online and unknown hosts
417 00267bfe Michael Hanselmann
    self.assertEqual(rpc._NodeConfigResolver(NotImplemented,
418 00267bfe Michael Hanselmann
                                             lambda: nodes,
419 00267bfe Michael Hanselmann
                                             ["node3.example.com",
420 00267bfe Michael Hanselmann
                                              "node92.example.com",
421 00267bfe Michael Hanselmann
                                              "node54.example.com",
422 00267bfe Michael Hanselmann
                                              "unknown.example.com",]), [
423 00267bfe Michael Hanselmann
      ("node3.example.com", rpc._OFFLINE),
424 00267bfe Michael Hanselmann
      ("node92.example.com", "192.0.2.92"),
425 00267bfe Michael Hanselmann
      ("node54.example.com", rpc._OFFLINE),
426 00267bfe Michael Hanselmann
      ("unknown.example.com", "unknown.example.com"),
427 00267bfe Michael Hanselmann
      ])
428 b43dcc5a Manuel Franceschini
429 33231500 Michael Hanselmann
430 33231500 Michael Hanselmann
if __name__ == "__main__":
431 33231500 Michael Hanselmann
  testutils.GanetiTestProgram()