Revision 890ea4ce
b/lib/rpc.py | ||
---|---|---|
285 | 285 |
return zip(hosts, self._addresses) |
286 | 286 |
|
287 | 287 |
|
288 |
def _CheckConfigNode(name, node): |
|
288 |
def _CheckConfigNode(name, node, accept_offline_node):
|
|
289 | 289 |
"""Checks if a node is online. |
290 | 290 |
|
291 | 291 |
@type name: string |
... | ... | |
297 | 297 |
if node is None: |
298 | 298 |
# Depend on DNS for name resolution |
299 | 299 |
ip = name |
300 |
elif node.offline: |
|
300 |
elif node.offline and not accept_offline_node:
|
|
301 | 301 |
ip = _OFFLINE |
302 | 302 |
else: |
303 | 303 |
ip = node.primary_ip |
304 | 304 |
return (name, ip) |
305 | 305 |
|
306 | 306 |
|
307 |
def _NodeConfigResolver(single_node_fn, all_nodes_fn, hosts, _):
|
|
307 |
def _NodeConfigResolver(single_node_fn, all_nodes_fn, hosts, opts):
|
|
308 | 308 |
"""Calculate node addresses using configuration. |
309 | 309 |
|
310 | 310 |
""" |
311 |
accept_offline_node = (opts is rpc_defs.ACCEPT_OFFLINE_NODE) |
|
312 |
|
|
313 |
assert accept_offline_node or opts is None, "Unknown option" |
|
314 |
|
|
311 | 315 |
# Special case for single-host lookups |
312 | 316 |
if len(hosts) == 1: |
313 | 317 |
(name, ) = hosts |
314 |
return [_CheckConfigNode(name, single_node_fn(name))] |
|
318 |
return [_CheckConfigNode(name, single_node_fn(name), accept_offline_node)]
|
|
315 | 319 |
else: |
316 | 320 |
all_nodes = all_nodes_fn() |
317 |
return [_CheckConfigNode(name, all_nodes.get(name, None)) |
|
321 |
return [_CheckConfigNode(name, all_nodes.get(name, None), |
|
322 |
accept_offline_node) |
|
318 | 323 |
for name in hosts] |
319 | 324 |
|
320 | 325 |
|
b/lib/rpc_defs.py | ||
---|---|---|
58 | 58 |
SINGLE = "single-node" |
59 | 59 |
MULTI = "multi-node" |
60 | 60 |
|
61 |
ACCEPT_OFFLINE_NODE = object() |
|
62 |
|
|
61 | 63 |
# Constants for encoding/decoding |
62 | 64 |
(ED_OBJECT_DICT, |
63 | 65 |
ED_OBJECT_DICT_LIST, |
b/test/ganeti.rpc_unittest.py | ||
---|---|---|
28 | 28 |
from ganeti import constants |
29 | 29 |
from ganeti import compat |
30 | 30 |
from ganeti import rpc |
31 |
from ganeti import rpc_defs |
|
31 | 32 |
from ganeti import http |
32 | 33 |
from ganeti import errors |
33 | 34 |
from ganeti import serializer |
... | ... | |
397 | 398 |
["node100.example.com"], None), |
398 | 399 |
[("node100.example.com", rpc._OFFLINE)]) |
399 | 400 |
|
401 |
def testSingleOfflineWithAcceptOffline(self): |
|
402 |
fn = self._GetSingleOfflineNode |
|
403 |
assert fn("node100.example.com").offline |
|
404 |
self.assertEqual(rpc._NodeConfigResolver(fn, NotImplemented, |
|
405 |
["node100.example.com"], |
|
406 |
rpc_defs.ACCEPT_OFFLINE_NODE), |
|
407 |
[("node100.example.com", "192.0.2.100")]) |
|
408 |
for i in [False, True, "", "Hello", 0, 1]: |
|
409 |
self.assertRaises(AssertionError, rpc._NodeConfigResolver, |
|
410 |
fn, NotImplemented, ["node100.example.com"], i) |
|
411 |
|
|
400 | 412 |
def testUnknownSingleNode(self): |
401 | 413 |
self.assertEqual(rpc._NodeConfigResolver(lambda _: None, NotImplemented, |
402 | 414 |
["node110.example.com"], None), |
Also available in: Unified diff