Statistics
| Branch: | Tag: | Revision:

root / test / ganeti.rpc_unittest.py @ fce5efd1

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