Statistics
| Branch: | Tag: | Revision:

root / test / ganeti.rpc_unittest.py @ 72bb6b4e

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