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