Statistics
| Branch: | Tag: | Revision:

root / test / ganeti.rpc_unittest.py @ 5c3ee7b2

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