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