62 |
62 |
from ganeti import rapi
|
63 |
63 |
from ganeti import ht
|
64 |
64 |
from ganeti import compat
|
|
65 |
from ganeti import ssconf
|
65 |
66 |
from ganeti.rapi import baserlib
|
66 |
67 |
|
67 |
68 |
|
... | ... | |
179 |
180 |
"""/2/info resource.
|
180 |
181 |
|
181 |
182 |
"""
|
182 |
|
@staticmethod
|
183 |
|
def GET():
|
|
183 |
def GET(self):
|
184 |
184 |
"""Returns cluster information.
|
185 |
185 |
|
186 |
186 |
"""
|
187 |
|
client = baserlib.GetClient()
|
|
187 |
client = self.GetClient()
|
188 |
188 |
return client.QueryClusterInfo()
|
189 |
189 |
|
190 |
190 |
|
... | ... | |
204 |
204 |
"""/2/os resource.
|
205 |
205 |
|
206 |
206 |
"""
|
207 |
|
@staticmethod
|
208 |
|
def GET():
|
|
207 |
def GET(self):
|
209 |
208 |
"""Return a list of all OSes.
|
210 |
209 |
|
211 |
210 |
Can return error 500 in case of a problem.
|
... | ... | |
213 |
212 |
Example: ["debian-etch"]
|
214 |
213 |
|
215 |
214 |
"""
|
216 |
|
cl = baserlib.GetClient()
|
|
215 |
cl = self.GetClient()
|
217 |
216 |
op = opcodes.OpOsDiagnose(output_fields=["name", "variants"], names=[])
|
218 |
|
job_id = baserlib.SubmitJob([op], cl)
|
|
217 |
job_id = self.SubmitJob([op], cl=cl)
|
219 |
218 |
# we use custom feedback function, instead of print we log the status
|
220 |
219 |
result = cli.PollJob(job_id, cl, feedback_fn=baserlib.FeedbackFn)
|
221 |
220 |
diagnose_data = result[0]
|
... | ... | |
234 |
233 |
"""/2/redistribute-config resource.
|
235 |
234 |
|
236 |
235 |
"""
|
237 |
|
@staticmethod
|
238 |
|
def PUT():
|
|
236 |
def PUT(self):
|
239 |
237 |
"""Redistribute configuration to all nodes.
|
240 |
238 |
|
241 |
239 |
"""
|
242 |
|
return baserlib.SubmitJob([opcodes.OpClusterRedistConf()])
|
|
240 |
return self.SubmitJob([opcodes.OpClusterRedistConf()])
|
243 |
241 |
|
244 |
242 |
|
245 |
243 |
class R_2_cluster_modify(baserlib.R_Generic):
|
... | ... | |
255 |
253 |
op = baserlib.FillOpcode(opcodes.OpClusterSetParams, self.request_body,
|
256 |
254 |
None)
|
257 |
255 |
|
258 |
|
return baserlib.SubmitJob([op])
|
|
256 |
return self.SubmitJob([op])
|
259 |
257 |
|
260 |
258 |
|
261 |
259 |
class R_2_jobs(baserlib.R_Generic):
|
... | ... | |
268 |
266 |
@return: a dictionary with jobs id and uri.
|
269 |
267 |
|
270 |
268 |
"""
|
271 |
|
client = baserlib.GetClient()
|
|
269 |
client = self.GetClient()
|
272 |
270 |
|
273 |
271 |
if self.useBulk():
|
274 |
272 |
bulkdata = client.QueryJobs(None, J_FIELDS_BULK)
|
... | ... | |
297 |
295 |
|
298 |
296 |
"""
|
299 |
297 |
job_id = self.items[0]
|
300 |
|
result = baserlib.GetClient().QueryJobs([job_id, ], J_FIELDS)[0]
|
|
298 |
result = self.GetClient().QueryJobs([job_id, ], J_FIELDS)[0]
|
301 |
299 |
if result is None:
|
302 |
300 |
raise http.HttpNotFound()
|
303 |
301 |
return baserlib.MapFields(J_FIELDS, result)
|
... | ... | |
307 |
305 |
|
308 |
306 |
"""
|
309 |
307 |
job_id = self.items[0]
|
310 |
|
result = baserlib.GetClient().CancelJob(job_id)
|
|
308 |
result = self.GetClient().CancelJob(job_id)
|
311 |
309 |
return result
|
312 |
310 |
|
313 |
311 |
|
... | ... | |
341 |
339 |
raise http.HttpBadRequest("The 'previous_log_serial' parameter should"
|
342 |
340 |
" be a number")
|
343 |
341 |
|
344 |
|
client = baserlib.GetClient()
|
|
342 |
client = self.GetClient()
|
345 |
343 |
result = client.WaitForJobChangeOnce(job_id, fields,
|
346 |
344 |
prev_job_info, prev_log_serial,
|
347 |
345 |
timeout=_WFJC_TIMEOUT)
|
... | ... | |
368 |
366 |
"""Returns a list of all nodes.
|
369 |
367 |
|
370 |
368 |
"""
|
371 |
|
client = baserlib.GetClient()
|
|
369 |
client = self.GetClient()
|
372 |
370 |
|
373 |
371 |
if self.useBulk():
|
374 |
372 |
bulkdata = client.QueryNodes([], N_FIELDS, False)
|
... | ... | |
389 |
387 |
|
390 |
388 |
"""
|
391 |
389 |
node_name = self.items[0]
|
392 |
|
client = baserlib.GetClient()
|
|
390 |
client = self.GetClient()
|
393 |
391 |
|
394 |
392 |
result = baserlib.HandleItemQueryErrors(client.QueryNodes,
|
395 |
393 |
names=[node_name], fields=N_FIELDS,
|
... | ... | |
409 |
407 |
|
410 |
408 |
"""
|
411 |
409 |
node_name = self.items[0]
|
412 |
|
client = baserlib.GetClient()
|
|
410 |
client = self.GetClient()
|
413 |
411 |
result = client.QueryNodes(names=[node_name], fields=["role"],
|
414 |
412 |
use_locking=self.useLocking())
|
415 |
413 |
|
... | ... | |
453 |
451 |
drained=drained,
|
454 |
452 |
force=bool(self.useForce()))
|
455 |
453 |
|
456 |
|
return baserlib.SubmitJob([op])
|
|
454 |
return self.SubmitJob([op])
|
457 |
455 |
|
458 |
456 |
|
459 |
457 |
class R_2_nodes_name_evacuate(baserlib.R_Generic):
|
... | ... | |
469 |
467 |
"dry_run": self.dryRun(),
|
470 |
468 |
})
|
471 |
469 |
|
472 |
|
return baserlib.SubmitJob([op])
|
|
470 |
return self.SubmitJob([op])
|
473 |
471 |
|
474 |
472 |
|
475 |
473 |
class R_2_nodes_name_migrate(baserlib.R_Generic):
|
... | ... | |
506 |
504 |
"node_name": node_name,
|
507 |
505 |
})
|
508 |
506 |
|
509 |
|
return baserlib.SubmitJob([op])
|
|
507 |
return self.SubmitJob([op])
|
510 |
508 |
|
511 |
509 |
|
512 |
510 |
class R_2_nodes_name_storage(baserlib.R_Generic):
|
... | ... | |
532 |
530 |
op = opcodes.OpNodeQueryStorage(nodes=[node_name],
|
533 |
531 |
storage_type=storage_type,
|
534 |
532 |
output_fields=output_fields.split(","))
|
535 |
|
return baserlib.SubmitJob([op])
|
|
533 |
return self.SubmitJob([op])
|
536 |
534 |
|
537 |
535 |
|
538 |
536 |
class R_2_nodes_name_storage_modify(baserlib.R_Generic):
|
... | ... | |
562 |
560 |
storage_type=storage_type,
|
563 |
561 |
name=name,
|
564 |
562 |
changes=changes)
|
565 |
|
return baserlib.SubmitJob([op])
|
|
563 |
return self.SubmitJob([op])
|
566 |
564 |
|
567 |
565 |
|
568 |
566 |
class R_2_nodes_name_storage_repair(baserlib.R_Generic):
|
... | ... | |
585 |
583 |
op = opcodes.OpRepairNodeStorage(node_name=node_name,
|
586 |
584 |
storage_type=storage_type,
|
587 |
585 |
name=name)
|
588 |
|
return baserlib.SubmitJob([op])
|
|
586 |
return self.SubmitJob([op])
|
589 |
587 |
|
590 |
588 |
|
591 |
589 |
def _ParseCreateGroupRequest(data, dry_run):
|
... | ... | |
615 |
613 |
"""Returns a list of all node groups.
|
616 |
614 |
|
617 |
615 |
"""
|
618 |
|
client = baserlib.GetClient()
|
|
616 |
client = self.GetClient()
|
619 |
617 |
|
620 |
618 |
if self.useBulk():
|
621 |
619 |
bulkdata = client.QueryGroups([], G_FIELDS, False)
|
... | ... | |
634 |
632 |
"""
|
635 |
633 |
baserlib.CheckType(self.request_body, dict, "Body contents")
|
636 |
634 |
op = _ParseCreateGroupRequest(self.request_body, self.dryRun())
|
637 |
|
return baserlib.SubmitJob([op])
|
|
635 |
return self.SubmitJob([op])
|
638 |
636 |
|
639 |
637 |
|
640 |
638 |
class R_2_groups_name(baserlib.R_Generic):
|
... | ... | |
646 |
644 |
|
647 |
645 |
"""
|
648 |
646 |
group_name = self.items[0]
|
649 |
|
client = baserlib.GetClient()
|
|
647 |
client = self.GetClient()
|
650 |
648 |
|
651 |
649 |
result = baserlib.HandleItemQueryErrors(client.QueryGroups,
|
652 |
650 |
names=[group_name], fields=G_FIELDS,
|
... | ... | |
661 |
659 |
op = opcodes.OpGroupRemove(group_name=self.items[0],
|
662 |
660 |
dry_run=bool(self.dryRun()))
|
663 |
661 |
|
664 |
|
return baserlib.SubmitJob([op])
|
|
662 |
return self.SubmitJob([op])
|
665 |
663 |
|
666 |
664 |
|
667 |
665 |
def _ParseModifyGroupRequest(name, data):
|
... | ... | |
690 |
688 |
|
691 |
689 |
op = _ParseModifyGroupRequest(self.items[0], self.request_body)
|
692 |
690 |
|
693 |
|
return baserlib.SubmitJob([op])
|
|
691 |
return self.SubmitJob([op])
|
694 |
692 |
|
695 |
693 |
|
696 |
694 |
def _ParseRenameGroupRequest(name, data, dry_run):
|
... | ... | |
726 |
724 |
baserlib.CheckType(self.request_body, dict, "Body contents")
|
727 |
725 |
op = _ParseRenameGroupRequest(self.items[0], self.request_body,
|
728 |
726 |
self.dryRun())
|
729 |
|
return baserlib.SubmitJob([op])
|
|
727 |
return self.SubmitJob([op])
|
730 |
728 |
|
731 |
729 |
|
732 |
730 |
class R_2_groups_name_assign_nodes(baserlib.R_Generic):
|
... | ... | |
745 |
743 |
"force": self.useForce(),
|
746 |
744 |
})
|
747 |
745 |
|
748 |
|
return baserlib.SubmitJob([op])
|
|
746 |
return self.SubmitJob([op])
|
749 |
747 |
|
750 |
748 |
|
751 |
749 |
def _ParseInstanceCreateRequestVersion1(data, dry_run):
|
... | ... | |
776 |
774 |
"""Returns a list of all available instances.
|
777 |
775 |
|
778 |
776 |
"""
|
779 |
|
client = baserlib.GetClient()
|
|
777 |
client = self.GetClient()
|
780 |
778 |
|
781 |
779 |
use_locking = self.useLocking()
|
782 |
780 |
if self.useBulk():
|
... | ... | |
812 |
810 |
raise http.HttpBadRequest("Unsupported request data version %s" %
|
813 |
811 |
data_version)
|
814 |
812 |
|
815 |
|
return baserlib.SubmitJob([op])
|
|
813 |
return self.SubmitJob([op])
|
816 |
814 |
|
817 |
815 |
|
818 |
816 |
class R_2_instances_name(baserlib.R_Generic):
|
... | ... | |
823 |
821 |
"""Send information about an instance.
|
824 |
822 |
|
825 |
823 |
"""
|
826 |
|
client = baserlib.GetClient()
|
|
824 |
client = self.GetClient()
|
827 |
825 |
instance_name = self.items[0]
|
828 |
826 |
|
829 |
827 |
result = baserlib.HandleItemQueryErrors(client.QueryInstances,
|
... | ... | |
840 |
838 |
op = opcodes.OpInstanceRemove(instance_name=self.items[0],
|
841 |
839 |
ignore_failures=False,
|
842 |
840 |
dry_run=bool(self.dryRun()))
|
843 |
|
return baserlib.SubmitJob([op])
|
|
841 |
return self.SubmitJob([op])
|
844 |
842 |
|
845 |
843 |
|
846 |
844 |
class R_2_instances_name_info(baserlib.R_Generic):
|
... | ... | |
856 |
854 |
|
857 |
855 |
op = opcodes.OpInstanceQueryData(instances=[instance_name],
|
858 |
856 |
static=static)
|
859 |
|
return baserlib.SubmitJob([op])
|
|
857 |
return self.SubmitJob([op])
|
860 |
858 |
|
861 |
859 |
|
862 |
860 |
class R_2_instances_name_reboot(baserlib.R_Generic):
|
... | ... | |
881 |
879 |
ignore_secondaries=ignore_secondaries,
|
882 |
880 |
dry_run=bool(self.dryRun()))
|
883 |
881 |
|
884 |
|
return baserlib.SubmitJob([op])
|
|
882 |
return self.SubmitJob([op])
|
885 |
883 |
|
886 |
884 |
|
887 |
885 |
class R_2_instances_name_startup(baserlib.R_Generic):
|
... | ... | |
905 |
903 |
dry_run=bool(self.dryRun()),
|
906 |
904 |
no_remember=no_remember)
|
907 |
905 |
|
908 |
|
return baserlib.SubmitJob([op])
|
|
906 |
return self.SubmitJob([op])
|
909 |
907 |
|
910 |
908 |
|
911 |
909 |
def _ParseShutdownInstanceRequest(name, data, dry_run, no_remember):
|
... | ... | |
940 |
938 |
op = _ParseShutdownInstanceRequest(self.items[0], self.request_body,
|
941 |
939 |
bool(self.dryRun()), no_remember)
|
942 |
940 |
|
943 |
|
return baserlib.SubmitJob([op])
|
|
941 |
return self.SubmitJob([op])
|
944 |
942 |
|
945 |
943 |
|
946 |
944 |
def _ParseInstanceReinstallRequest(name, data):
|
... | ... | |
997 |
995 |
|
998 |
996 |
ops = _ParseInstanceReinstallRequest(self.items[0], body)
|
999 |
997 |
|
1000 |
|
return baserlib.SubmitJob(ops)
|
|
998 |
return self.SubmitJob(ops)
|
1001 |
999 |
|
1002 |
1000 |
|
1003 |
1001 |
def _ParseInstanceReplaceDisksRequest(name, data):
|
... | ... | |
1037 |
1035 |
"""
|
1038 |
1036 |
op = _ParseInstanceReplaceDisksRequest(self.items[0], self.request_body)
|
1039 |
1037 |
|
1040 |
|
return baserlib.SubmitJob([op])
|
|
1038 |
return self.SubmitJob([op])
|
1041 |
1039 |
|
1042 |
1040 |
|
1043 |
1041 |
class R_2_instances_name_activate_disks(baserlib.R_Generic):
|
... | ... | |
1056 |
1054 |
op = opcodes.OpInstanceActivateDisks(instance_name=instance_name,
|
1057 |
1055 |
ignore_size=ignore_size)
|
1058 |
1056 |
|
1059 |
|
return baserlib.SubmitJob([op])
|
|
1057 |
return self.SubmitJob([op])
|
1060 |
1058 |
|
1061 |
1059 |
|
1062 |
1060 |
class R_2_instances_name_deactivate_disks(baserlib.R_Generic):
|
... | ... | |
1071 |
1069 |
|
1072 |
1070 |
op = opcodes.OpInstanceDeactivateDisks(instance_name=instance_name)
|
1073 |
1071 |
|
1074 |
|
return baserlib.SubmitJob([op])
|
|
1072 |
return self.SubmitJob([op])
|
1075 |
1073 |
|
1076 |
1074 |
|
1077 |
1075 |
class R_2_instances_name_prepare_export(baserlib.R_Generic):
|
... | ... | |
1090 |
1088 |
op = opcodes.OpBackupPrepare(instance_name=instance_name,
|
1091 |
1089 |
mode=mode)
|
1092 |
1090 |
|
1093 |
|
return baserlib.SubmitJob([op])
|
|
1091 |
return self.SubmitJob([op])
|
1094 |
1092 |
|
1095 |
1093 |
|
1096 |
1094 |
def _ParseExportInstanceRequest(name, data):
|
... | ... | |
1126 |
1124 |
|
1127 |
1125 |
op = _ParseExportInstanceRequest(self.items[0], self.request_body)
|
1128 |
1126 |
|
1129 |
|
return baserlib.SubmitJob([op])
|
|
1127 |
return self.SubmitJob([op])
|
1130 |
1128 |
|
1131 |
1129 |
|
1132 |
1130 |
def _ParseMigrateInstanceRequest(name, data):
|
... | ... | |
1155 |
1153 |
|
1156 |
1154 |
op = _ParseMigrateInstanceRequest(self.items[0], self.request_body)
|
1157 |
1155 |
|
1158 |
|
return baserlib.SubmitJob([op])
|
|
1156 |
return self.SubmitJob([op])
|
1159 |
1157 |
|
1160 |
1158 |
|
1161 |
1159 |
class R_2_instances_name_failover(baserlib.R_Generic):
|
... | ... | |
1174 |
1172 |
"instance_name": self.items[0],
|
1175 |
1173 |
})
|
1176 |
1174 |
|
1177 |
|
return baserlib.SubmitJob([op])
|
|
1175 |
return self.SubmitJob([op])
|
1178 |
1176 |
|
1179 |
1177 |
|
1180 |
1178 |
def _ParseRenameInstanceRequest(name, data):
|
... | ... | |
1203 |
1201 |
|
1204 |
1202 |
op = _ParseRenameInstanceRequest(self.items[0], self.request_body)
|
1205 |
1203 |
|
1206 |
|
return baserlib.SubmitJob([op])
|
|
1204 |
return self.SubmitJob([op])
|
1207 |
1205 |
|
1208 |
1206 |
|
1209 |
1207 |
def _ParseModifyInstanceRequest(name, data):
|
... | ... | |
1232 |
1230 |
|
1233 |
1231 |
op = _ParseModifyInstanceRequest(self.items[0], self.request_body)
|
1234 |
1232 |
|
1235 |
|
return baserlib.SubmitJob([op])
|
|
1233 |
return self.SubmitJob([op])
|
1236 |
1234 |
|
1237 |
1235 |
|
1238 |
1236 |
class R_2_instances_name_disk_grow(baserlib.R_Generic):
|
... | ... | |
1250 |
1248 |
"disk": int(self.items[1]),
|
1251 |
1249 |
})
|
1252 |
1250 |
|
1253 |
|
return baserlib.SubmitJob([op])
|
|
1251 |
return self.SubmitJob([op])
|
1254 |
1252 |
|
1255 |
1253 |
|
1256 |
1254 |
class R_2_instances_name_console(baserlib.R_Generic):
|
... | ... | |
1266 |
1264 |
L{objects.InstanceConsole}
|
1267 |
1265 |
|
1268 |
1266 |
"""
|
1269 |
|
client = baserlib.GetClient()
|
|
1267 |
client = self.GetClient()
|
1270 |
1268 |
|
1271 |
1269 |
((console, ), ) = client.QueryInstances([self.items[0]], ["console"], False)
|
1272 |
1270 |
|
... | ... | |
1304 |
1302 |
GET_ACCESS = [rapi.RAPI_ACCESS_WRITE]
|
1305 |
1303 |
|
1306 |
1304 |
def _Query(self, fields, filter_):
|
1307 |
|
return baserlib.GetClient().Query(self.items[0], fields, filter_).ToDict()
|
|
1305 |
return self.GetClient().Query(self.items[0], fields, filter_).ToDict()
|
1308 |
1306 |
|
1309 |
1307 |
def GET(self):
|
1310 |
1308 |
"""Returns resource information.
|
... | ... | |
1349 |
1347 |
else:
|
1350 |
1348 |
fields = _SplitQueryFields(raw_fields[0])
|
1351 |
1349 |
|
1352 |
|
return baserlib.GetClient().QueryFields(self.items[0], fields).ToDict()
|
|
1350 |
return self.GetClient().QueryFields(self.items[0], fields).ToDict()
|
1353 |
1351 |
|
1354 |
1352 |
|
1355 |
1353 |
class _R_Tags(baserlib.R_Generic):
|
... | ... | |
1388 |
1386 |
if not self.name:
|
1389 |
1387 |
raise http.HttpBadRequest("Missing name on tag request")
|
1390 |
1388 |
|
1391 |
|
cl = baserlib.GetClient()
|
|
1389 |
cl = self.GetClient()
|
1392 |
1390 |
if kind == constants.TAG_INSTANCE:
|
1393 |
1391 |
fn = cl.QueryInstances
|
1394 |
1392 |
elif kind == constants.TAG_NODEGROUP:
|
... | ... | |
1421 |
1419 |
" the 'tag' parameter")
|
1422 |
1420 |
op = opcodes.OpTagsSet(kind=self.TAG_LEVEL, name=self.name,
|
1423 |
1421 |
tags=self.queryargs["tag"], dry_run=self.dryRun())
|
1424 |
|
return baserlib.SubmitJob([op])
|
|
1422 |
return self.SubmitJob([op])
|
1425 |
1423 |
|
1426 |
1424 |
def DELETE(self):
|
1427 |
1425 |
"""Delete a tag.
|
... | ... | |
1438 |
1436 |
" tag(s) using the 'tag' parameter")
|
1439 |
1437 |
op = opcodes.OpTagsDel(kind=self.TAG_LEVEL, name=self.name,
|
1440 |
1438 |
tags=self.queryargs["tag"], dry_run=self.dryRun())
|
1441 |
|
return baserlib.SubmitJob([op])
|
|
1439 |
return self.SubmitJob([op])
|
1442 |
1440 |
|
1443 |
1441 |
|
1444 |
1442 |
class R_2_instances_name_tags(_R_Tags):
|