Revision 42d4d8b9

b/doc/rapi.rst
1241 1241

  
1242 1242
Returned fields: :pyeval:`utils.CommaJoin(sorted(rlib2.N_FIELDS))`
1243 1243

  
1244
``/2/nodes/[node_name]/powercycle``
1245
+++++++++++++++++++++++++++++++++++
1246

  
1247
Powercycles a node. Supports the following commands: ``POST``.
1248

  
1249
``POST``
1250
~~~~~~~~
1251

  
1252
Returns a job ID.
1253

  
1254

  
1244 1255
``/2/nodes/[node_name]/evacuate``
1245 1256
+++++++++++++++++++++++++++++++++
1246 1257

  
b/lib/rapi/client.py
1474 1474
                             ("/%s/nodes/%s/role" %
1475 1475
                              (GANETI_RAPI_VERSION, node)), query, role)
1476 1476

  
1477
  def PowercycleNode(self, node, force=False):
1478
    """Powercycles a node.
1479

  
1480
    @type node: string
1481
    @param node: Node name
1482
    @type force: bool
1483
    @param force: Whether to force the operation
1484

  
1485
    @rtype: string
1486
    @return: job id
1487

  
1488
    """
1489
    query = [
1490
      ("force", force),
1491
      ]
1492

  
1493
    return self._SendRequest(HTTP_POST,
1494
                             ("/%s/nodes/%s/powercycle" %
1495
                              (GANETI_RAPI_VERSION, node)), query, None)
1496

  
1477 1497
  def GetNodeStorageUnits(self, node, storage_type, output_fields):
1478 1498
    """Gets the storage units for a node.
1479 1499

  
b/lib/rapi/connector.py
107 107
    "/2/nodes": rlib2.R_2_nodes,
108 108
    re.compile(r"^/2/nodes/(%s)$" % node_name_pattern):
109 109
      rlib2.R_2_nodes_name,
110
    re.compile(r"^/2/nodes/(%s)/powercycle$" % node_name_pattern):
111
      rlib2.R_2_nodes_name_powercycle,
110 112
    re.compile(r"^/2/nodes/(%s)/tags$" % node_name_pattern):
111 113
      rlib2.R_2_nodes_name_tags,
112 114
    re.compile(r"^/2/nodes/(%s)/role$" % node_name_pattern):
b/lib/rapi/rlib2.py
397 397
    return baserlib.MapFields(N_FIELDS, result[0])
398 398

  
399 399

  
400
class R_2_nodes_name_powercycle(baserlib.OpcodeResource):
401
  """/2/nodes/[node_name]/powercycle resource.
402

  
403
  """
404
  POST_OPCODE = opcodes.OpNodePowercycle
405

  
406
  def GetPostOpInput(self):
407
    """Tries to powercycle a node.
408

  
409
    """
410
    return (self.request_body, {
411
      "node_name": self.items[0],
412
      "force": self.useForce(),
413
      })
414

  
415

  
400 416
class R_2_nodes_name_role(baserlib.OpcodeResource):
401 417
  """/2/nodes/[node_name]/role resource.
402 418

  
b/test/docs_unittest.py
53 53
  opcodes.OpClusterVerifyDisks,
54 54
  opcodes.OpInstanceChangeGroup,
55 55
  opcodes.OpInstanceMove,
56
  opcodes.OpNodePowercycle,
57 56
  opcodes.OpNodeQueryvols,
58 57
  opcodes.OpOobCommand,
59 58
  opcodes.OpTagsSearch,
b/test/ganeti.rapi.client_unittest.py
973 973
    self.assertQuery("force", ["1"])
974 974
    self.assertEqual("\"master-candidate\"", self.rapi.GetLastRequestData())
975 975

  
976
  def testPowercycleNode(self):
977
    self.rapi.AddResponse("23051")
978
    self.assertEqual(23051,
979
        self.client.PowercycleNode("node5468", force=True))
980
    self.assertHandler(rlib2.R_2_nodes_name_powercycle)
981
    self.assertItems(["node5468"])
982
    self.assertQuery("force", ["1"])
983
    self.assertFalse(self.rapi.GetLastRequestData())
984
    self.assertEqual(self.rapi.CountPending(), 0)
985

  
976 986
  def testGetNodeStorageUnits(self):
977 987
    self.rapi.AddResponse("42")
978 988
    self.assertEqual(42,
b/test/ganeti.rapi.rlib2_unittest.py
272 272
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
273 273

  
274 274

  
275
class TestNodePowercycle(unittest.TestCase):
276
  def test(self):
277
    clfactory = _FakeClientFactory(_FakeClient)
278
    handler = _CreateHandler(rlib2.R_2_nodes_name_powercycle, ["node20744"], {
279
      "force": ["1"],
280
      }, None, clfactory)
281
    job_id = handler.POST()
282

  
283
    cl = clfactory.GetNextClient()
284
    self.assertRaises(IndexError, clfactory.GetNextClient)
285

  
286
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
287
    self.assertEqual(job_id, exp_job_id)
288
    self.assertTrue(isinstance(op, opcodes.OpNodePowercycle))
289
    self.assertEqual(op.node_name, "node20744")
290
    self.assertTrue(op.force)
291

  
292
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
293

  
294

  
275 295
class TestGroupAssignNodes(unittest.TestCase):
276 296
  def test(self):
277 297
    clfactory = _FakeClientFactory(_FakeClient)

Also available in: Unified diff