Revision 3882937a
b/doc/rapi.rst | ||
---|---|---|
671 | 671 |
Whether to ensure instance's name is resolvable. |
672 | 672 |
|
673 | 673 |
|
674 |
``/2/instances/[instance_name]/modify`` |
|
675 |
++++++++++++++++++++++++++++++++++++++++ |
|
676 |
|
|
677 |
Modifies an instance. |
|
678 |
|
|
679 |
Supports the following commands: ``PUT``. |
|
680 |
|
|
681 |
``PUT`` |
|
682 |
~~~~~~~ |
|
683 |
|
|
684 |
Returns a job ID. |
|
685 |
|
|
686 |
Body parameters: |
|
687 |
|
|
688 |
``osparams`` (dict) |
|
689 |
Dictionary with OS parameters. |
|
690 |
``hvparams`` (dict) |
|
691 |
Hypervisor parameters, hypervisor-dependent. |
|
692 |
``beparams`` (dict) |
|
693 |
Backend parameters. |
|
694 |
``force`` (bool) |
|
695 |
Whether to force the operation. |
|
696 |
``nics`` (list) |
|
697 |
List of NIC changes. Each item is of the form ``(op, settings)``. |
|
698 |
``op`` can be ``add`` to add a new NIC with the specified settings, |
|
699 |
``remove`` to remove the last NIC or a number to modify the settings |
|
700 |
of the NIC with that index. |
|
701 |
``disks`` (list) |
|
702 |
List of disk changes. See ``nics``. |
|
703 |
``disk_template`` (string) |
|
704 |
Disk template for instance. |
|
705 |
``remote_node`` (string) |
|
706 |
Secondary node (used when changing disk template). |
|
707 |
``os_name`` (string) |
|
708 |
Change instance's OS name. Does not reinstall the instance. |
|
709 |
``force_variant`` (bool) |
|
710 |
Whether to force an unknown variant. |
|
711 |
|
|
712 |
|
|
674 | 713 |
``/2/instances/[instance_name]/tags`` |
675 | 714 |
+++++++++++++++++++++++++++++++++++++ |
676 | 715 |
|
b/lib/rapi/connector.py | ||
---|---|---|
217 | 217 |
rlib2.R_2_instances_name_migrate, |
218 | 218 |
re.compile(r'^/2/instances/(%s)/rename$' % instance_name_pattern): |
219 | 219 |
rlib2.R_2_instances_name_rename, |
220 |
re.compile(r'^/2/instances/(%s)/modify$' % instance_name_pattern): |
|
221 |
rlib2.R_2_instances_name_modify, |
|
220 | 222 |
|
221 | 223 |
"/2/jobs": rlib2.R_2_jobs, |
222 | 224 |
re.compile(r"^/2/jobs/(%s)$" % job_id_pattern): |
b/lib/rapi/rlib2.py | ||
---|---|---|
1055 | 1055 |
return baserlib.SubmitJob([op]) |
1056 | 1056 |
|
1057 | 1057 |
|
1058 |
def _ParseModifyInstanceRequest(name, data): |
|
1059 |
"""Parses a request for modifying an instance. |
|
1060 |
|
|
1061 |
@rtype: L{opcodes.OpSetInstanceParams} |
|
1062 |
@return: Instance modify opcode |
|
1063 |
|
|
1064 |
""" |
|
1065 |
osparams = baserlib.CheckParameter(data, "osparams", default={}) |
|
1066 |
force = baserlib.CheckParameter(data, "force", default=False) |
|
1067 |
nics = baserlib.CheckParameter(data, "nics", default=[]) |
|
1068 |
disks = baserlib.CheckParameter(data, "disks", default=[]) |
|
1069 |
disk_template = baserlib.CheckParameter(data, "disk_template", default=None) |
|
1070 |
remote_node = baserlib.CheckParameter(data, "remote_node", default=None) |
|
1071 |
os_name = baserlib.CheckParameter(data, "os_name", default=None) |
|
1072 |
force_variant = baserlib.CheckParameter(data, "force_variant", default=False) |
|
1073 |
|
|
1074 |
# HV/BE parameters |
|
1075 |
hvparams = baserlib.CheckParameter(data, "hvparams", default={}) |
|
1076 |
utils.ForceDictType(hvparams, constants.HVS_PARAMETER_TYPES, |
|
1077 |
allowed_values=[constants.VALUE_DEFAULT]) |
|
1078 |
|
|
1079 |
beparams = baserlib.CheckParameter(data, "beparams", default={}) |
|
1080 |
utils.ForceDictType(beparams, constants.BES_PARAMETER_TYPES, |
|
1081 |
allowed_values=[constants.VALUE_DEFAULT]) |
|
1082 |
|
|
1083 |
return opcodes.OpSetInstanceParams(instance_name=name, hvparams=hvparams, |
|
1084 |
beparams=beparams, osparams=osparams, |
|
1085 |
force=force, nics=nics, disks=disks, |
|
1086 |
disk_template=disk_template, |
|
1087 |
remote_node=remote_node, os_name=os_name, |
|
1088 |
force_variant=force_variant) |
|
1089 |
|
|
1090 |
|
|
1091 |
class R_2_instances_name_modify(baserlib.R_Generic): |
|
1092 |
"""/2/instances/[instance_name]/modify resource. |
|
1093 |
|
|
1094 |
""" |
|
1095 |
def PUT(self): |
|
1096 |
"""Changes some parameters of an instance. |
|
1097 |
|
|
1098 |
@return: a job id |
|
1099 |
|
|
1100 |
""" |
|
1101 |
baserlib.CheckType(self.request_body, dict, "Body contents") |
|
1102 |
|
|
1103 |
op = _ParseModifyInstanceRequest(self.items[0], self.request_body) |
|
1104 |
|
|
1105 |
return baserlib.SubmitJob([op]) |
|
1106 |
|
|
1107 |
|
|
1058 | 1108 |
class _R_Tags(baserlib.R_Generic): |
1059 | 1109 |
""" Quasiclass for tagging resources |
1060 | 1110 |
|
b/test/ganeti.rapi.rlib2_unittest.py | ||
---|---|---|
295 | 295 |
self.assert_(op.name_check) |
296 | 296 |
|
297 | 297 |
|
298 |
class TestParseModifyInstanceRequest(testutils.GanetiTestCase): |
|
299 |
def setUp(self): |
|
300 |
testutils.GanetiTestCase.setUp(self) |
|
301 |
|
|
302 |
self.Parse = rlib2._ParseModifyInstanceRequest |
|
303 |
|
|
304 |
def test(self): |
|
305 |
name = "instush8gah" |
|
306 |
|
|
307 |
test_disks = [ |
|
308 |
[], |
|
309 |
[(1, { constants.IDISK_MODE: constants.DISK_RDWR, })], |
|
310 |
] |
|
311 |
|
|
312 |
for osparams in [{}, { "some": "value", "other": "Hello World", }]: |
|
313 |
for hvparams in [{}, { constants.HV_KERNEL_PATH: "/some/kernel", }]: |
|
314 |
for beparams in [{}, { constants.BE_MEMORY: 128, }]: |
|
315 |
for force in [False, True]: |
|
316 |
for nics in [[], [(0, { constants.INIC_IP: "192.0.2.1", })]]: |
|
317 |
for disks in test_disks: |
|
318 |
for disk_template in constants.DISK_TEMPLATES: |
|
319 |
data = { |
|
320 |
"osparams": osparams, |
|
321 |
"hvparams": hvparams, |
|
322 |
"beparams": beparams, |
|
323 |
"nics": nics, |
|
324 |
"disks": disks, |
|
325 |
"force": force, |
|
326 |
"disk_template": disk_template, |
|
327 |
} |
|
328 |
|
|
329 |
op = self.Parse(name, data) |
|
330 |
self.assert_(isinstance(op, opcodes.OpSetInstanceParams)) |
|
331 |
self.assertEqual(op.instance_name, name) |
|
332 |
self.assertEqual(op.hvparams, hvparams) |
|
333 |
self.assertEqual(op.beparams, beparams) |
|
334 |
self.assertEqual(op.osparams, osparams) |
|
335 |
self.assertEqual(op.force, force) |
|
336 |
self.assertEqual(op.nics, nics) |
|
337 |
self.assertEqual(op.disks, disks) |
|
338 |
self.assertEqual(op.disk_template, disk_template) |
|
339 |
self.assert_(op.remote_node is None) |
|
340 |
self.assert_(op.os_name is None) |
|
341 |
self.assertFalse(op.force_variant) |
|
342 |
|
|
343 |
def testDefaults(self): |
|
344 |
name = "instir8aish31" |
|
345 |
|
|
346 |
op = self.Parse(name, {}) |
|
347 |
self.assert_(isinstance(op, opcodes.OpSetInstanceParams)) |
|
348 |
self.assertEqual(op.instance_name, name) |
|
349 |
self.assertEqual(op.hvparams, {}) |
|
350 |
self.assertEqual(op.beparams, {}) |
|
351 |
self.assertEqual(op.osparams, {}) |
|
352 |
self.assertFalse(op.force) |
|
353 |
self.assertEqual(op.nics, []) |
|
354 |
self.assertEqual(op.disks, []) |
|
355 |
self.assert_(op.disk_template is None) |
|
356 |
self.assert_(op.remote_node is None) |
|
357 |
self.assert_(op.os_name is None) |
|
358 |
self.assertFalse(op.force_variant) |
|
359 |
|
|
360 |
|
|
298 | 361 |
if __name__ == '__main__': |
299 | 362 |
testutils.GanetiTestProgram() |
Also available in: Unified diff