Statistics
| Branch: | Tag: | Revision:

root / test / ganeti.rpc_unittest.py @ dce20078

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