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