RAPI: Use FillOpCode for modifying node group
[ganeti-local] / lib / rapi / rlib2.py
index 0400d0d..e70044b 100644 (file)
@@ -47,6 +47,7 @@ from ganeti import constants
 from ganeti import cli
 from ganeti import utils
 from ganeti import rapi
+from ganeti import ht
 from ganeti.rapi import baserlib
 
 
@@ -160,7 +161,7 @@ class R_2_os(baserlib.R_Generic):
 
     """
     cl = baserlib.GetClient()
-    op = opcodes.OpDiagnoseOS(output_fields=["name", "variants"], names=[])
+    op = opcodes.OpOsDiagnose(output_fields=["name", "variants"], names=[])
     job_id = baserlib.SubmitJob([op], cl)
     # we use custom feedback function, instead of print we log the status
     result = cli.PollJob(job_id, cl, feedback_fn=baserlib.FeedbackFn)
@@ -395,7 +396,7 @@ class R_2_nodes_name_role(baserlib.R_Generic):
     else:
       raise http.HttpBadRequest("Can't set '%s' role" % role)
 
-    op = opcodes.OpSetNodeParams(node_name=node_name,
+    op = opcodes.OpNodeSetParams(node_name=node_name,
                                  master_candidate=candidate,
                                  offline=offline,
                                  drained=drained,
@@ -420,9 +421,9 @@ class R_2_nodes_name_evacuate(baserlib.R_Generic):
 
     cl = baserlib.GetClient()
 
-    op = opcodes.OpNodeEvacuationStrategy(nodes=[node_name],
-                                          iallocator=iallocator,
-                                          remote_node=remote_node)
+    op = opcodes.OpNodeEvacStrategy(nodes=[node_name],
+                                    iallocator=iallocator,
+                                    remote_node=remote_node)
 
     job_id = baserlib.SubmitJob([op], cl)
     # we use custom feedback function, instead of print we log the status
@@ -464,7 +465,7 @@ class R_2_nodes_name_migrate(baserlib.R_Generic):
     else:
       mode = self._checkStringVariable("mode", default=None)
 
-    op = opcodes.OpMigrateNode(node_name=node_name, mode=mode)
+    op = opcodes.OpNodeMigrate(node_name=node_name, mode=mode)
 
     return baserlib.SubmitJob([op])
 
@@ -473,7 +474,7 @@ class R_2_nodes_name_storage(baserlib.R_Generic):
   """/2/nodes/[node_name]/storage resource.
 
   """
-  # LUQueryNodeStorage acquires locks, hence restricting access to GET
+  # LUNodeQueryStorage acquires locks, hence restricting access to GET
   GET_ACCESS = [rapi.RAPI_ACCESS_WRITE]
 
   def GET(self):
@@ -489,7 +490,7 @@ class R_2_nodes_name_storage(baserlib.R_Generic):
       raise http.HttpBadRequest("Missing the required 'output_fields'"
                                 " parameter")
 
-    op = opcodes.OpQueryNodeStorage(nodes=[node_name],
+    op = opcodes.OpNodeQueryStorage(nodes=[node_name],
                                     storage_type=storage_type,
                                     output_fields=output_fields.split(","))
     return baserlib.SubmitJob([op])
@@ -518,7 +519,7 @@ class R_2_nodes_name_storage_modify(baserlib.R_Generic):
       changes[constants.SF_ALLOCATABLE] = \
         bool(self._checkIntVariable("allocatable", default=1))
 
-    op = opcodes.OpModifyNodeStorage(node_name=node_name,
+    op = opcodes.OpNodeModifyStorage(node_name=node_name,
                                      storage_type=storage_type,
                                      name=name,
                                      changes=changes)
@@ -627,8 +628,10 @@ def _ParseModifyGroupRequest(name, data):
   @return: Group modify opcode
 
   """
-  alloc_policy = baserlib.CheckParameter(data, "alloc_policy", default=None)
-  return opcodes.OpGroupSetParams(group_name=name, alloc_policy=alloc_policy)
+  return baserlib.FillOpcode(opcodes.OpGroupSetParams, data, {
+    "group_name": name,
+    })
+
 
 
 class R_2_groups_name_modify(baserlib.R_Generic):
@@ -995,7 +998,7 @@ class R_2_instances_name_startup(baserlib.R_Generic):
     """
     instance_name = self.items[0]
     force_startup = bool(self._checkIntVariable('force'))
-    op = opcodes.OpStartupInstance(instance_name=instance_name,
+    op = opcodes.OpInstanceStartup(instance_name=instance_name,
                                    force=force_startup,
                                    dry_run=bool(self.dryRun()))
 
@@ -1013,7 +1016,7 @@ class R_2_instances_name_shutdown(baserlib.R_Generic):
 
     """
     instance_name = self.items[0]
-    op = opcodes.OpShutdownInstance(instance_name=instance_name,
+    op = opcodes.OpInstanceShutdown(instance_name=instance_name,
                                     dry_run=bool(self.dryRun()))
 
     return baserlib.SubmitJob([op])
@@ -1032,13 +1035,13 @@ def _ParseInstanceReinstallRequest(name, data):
   osparams = baserlib.CheckParameter(data, "osparams", default=None)
 
   ops = [
-    opcodes.OpShutdownInstance(instance_name=name),
+    opcodes.OpInstanceShutdown(instance_name=name),
     opcodes.OpInstanceReinstall(instance_name=name, os_type=ostype,
                                 osparams=osparams),
     ]
 
   if start:
-    ops.append(opcodes.OpStartupInstance(instance_name=name, force=False))
+    ops.append(opcodes.OpInstanceStartup(instance_name=name, force=False))
 
   return ops
 
@@ -1076,6 +1079,33 @@ class R_2_instances_name_reinstall(baserlib.R_Generic):
     return baserlib.SubmitJob(ops)
 
 
+def _ParseInstanceReplaceDisksRequest(name, data):
+  """Parses a request for an instance export.
+
+  @rtype: L{opcodes.OpInstanceReplaceDisks}
+  @return: Instance export opcode
+
+  """
+  override = {
+    "instance_name": name,
+    }
+
+  # Parse disks
+  try:
+    raw_disks = data["disks"]
+  except KeyError:
+    pass
+  else:
+    if not ht.TListOf(ht.TInt)(raw_disks): # pylint: disable-msg=E1102
+      # Backwards compatibility for strings of the format "1, 2, 3"
+      try:
+        data["disks"] = [int(part) for part in raw_disks.split(",")]
+      except (TypeError, ValueError), err:
+        raise http.HttpBadRequest("Invalid disk index passed: %s" % str(err))
+
+  return baserlib.FillOpcode(opcodes.OpInstanceReplaceDisks, data, override)
+
+
 class R_2_instances_name_replace_disks(baserlib.R_Generic):
   """/2/instances/[instance_name]/replace-disks resource.
 
@@ -1084,25 +1114,7 @@ class R_2_instances_name_replace_disks(baserlib.R_Generic):
     """Replaces disks on an instance.
 
     """
-    instance_name = self.items[0]
-    remote_node = self._checkStringVariable("remote_node", default=None)
-    mode = self._checkStringVariable("mode", default=None)
-    raw_disks = self._checkStringVariable("disks", default=None)
-    iallocator = self._checkStringVariable("iallocator", default=None)
-
-    if raw_disks:
-      try:
-        disks = [int(part) for part in raw_disks.split(",")]
-      except ValueError, err:
-        raise http.HttpBadRequest("Invalid disk index passed: %s" % str(err))
-    else:
-      disks = []
-
-    op = opcodes.OpInstanceReplaceDisks(instance_name=instance_name,
-                                        remote_node=remote_node,
-                                        mode=mode,
-                                        disks=disks,
-                                        iallocator=iallocator)
+    op = _ParseInstanceReplaceDisksRequest(self.items[0], self.request_body)
 
     return baserlib.SubmitJob([op])
 
@@ -1167,23 +1179,15 @@ def _ParseExportInstanceRequest(name, data):
   @return: Instance export opcode
 
   """
-  mode = baserlib.CheckParameter(data, "mode",
-                                 default=constants.EXPORT_MODE_LOCAL)
-  target_node = baserlib.CheckParameter(data, "destination")
-  shutdown = baserlib.CheckParameter(data, "shutdown", exptype=bool)
-  remove_instance = baserlib.CheckParameter(data, "remove_instance",
-                                            exptype=bool, default=False)
-  x509_key_name = baserlib.CheckParameter(data, "x509_key_name", default=None)
-  destination_x509_ca = baserlib.CheckParameter(data, "destination_x509_ca",
-                                                default=None)
-
-  return opcodes.OpBackupExport(instance_name=name,
-                                mode=mode,
-                                target_node=target_node,
-                                shutdown=shutdown,
-                                remove_instance=remove_instance,
-                                x509_key_name=x509_key_name,
-                                destination_x509_ca=destination_x509_ca)
+  # Rename "destination" to "target_node"
+  try:
+    data["target_node"] = data.pop("destination")
+  except KeyError:
+    pass
+
+  return baserlib.FillOpcode(opcodes.OpBackupExport, data, {
+    "instance_name": name,
+    })
 
 
 class R_2_instances_name_export(baserlib.R_Generic):
@@ -1211,12 +1215,9 @@ def _ParseMigrateInstanceRequest(name, data):
   @return: Instance migration opcode
 
   """
-  mode = baserlib.CheckParameter(data, "mode", default=None)
-  cleanup = baserlib.CheckParameter(data, "cleanup", exptype=bool,
-                                    default=False)
-
-  return opcodes.OpInstanceMigrate(instance_name=name, mode=mode,
-                                   cleanup=cleanup)
+  return baserlib.FillOpcode(opcodes.OpInstanceMigrate, data, {
+    "instance_name": name,
+    })
 
 
 class R_2_instances_name_migrate(baserlib.R_Generic):
@@ -1243,12 +1244,9 @@ def _ParseRenameInstanceRequest(name, data):
   @return: Instance rename opcode
 
   """
-  new_name = baserlib.CheckParameter(data, "new_name")
-  ip_check = baserlib.CheckParameter(data, "ip_check", default=True)
-  name_check = baserlib.CheckParameter(data, "name_check", default=True)
-
-  return opcodes.OpInstanceRename(instance_name=name, new_name=new_name,
-                                  name_check=name_check, ip_check=ip_check)
+  return baserlib.FillOpcode(opcodes.OpInstanceRename, data, {
+    "instance_name": name,
+    })
 
 
 class R_2_instances_name_rename(baserlib.R_Generic):
@@ -1271,34 +1269,13 @@ class R_2_instances_name_rename(baserlib.R_Generic):
 def _ParseModifyInstanceRequest(name, data):
   """Parses a request for modifying an instance.
 
-  @rtype: L{opcodes.OpSetInstanceParams}
+  @rtype: L{opcodes.OpInstanceSetParams}
   @return: Instance modify opcode
 
   """
-  osparams = baserlib.CheckParameter(data, "osparams", default={})
-  force = baserlib.CheckParameter(data, "force", default=False)
-  nics = baserlib.CheckParameter(data, "nics", default=[])
-  disks = baserlib.CheckParameter(data, "disks", default=[])
-  disk_template = baserlib.CheckParameter(data, "disk_template", default=None)
-  remote_node = baserlib.CheckParameter(data, "remote_node", default=None)
-  os_name = baserlib.CheckParameter(data, "os_name", default=None)
-  force_variant = baserlib.CheckParameter(data, "force_variant", default=False)
-
-  # HV/BE parameters
-  hvparams = baserlib.CheckParameter(data, "hvparams", default={})
-  utils.ForceDictType(hvparams, constants.HVS_PARAMETER_TYPES,
-                      allowed_values=[constants.VALUE_DEFAULT])
-
-  beparams = baserlib.CheckParameter(data, "beparams", default={})
-  utils.ForceDictType(beparams, constants.BES_PARAMETER_TYPES,
-                      allowed_values=[constants.VALUE_DEFAULT])
-
-  return opcodes.OpSetInstanceParams(instance_name=name, hvparams=hvparams,
-                                     beparams=beparams, osparams=osparams,
-                                     force=force, nics=nics, disks=disks,
-                                     disk_template=disk_template,
-                                     remote_node=remote_node, os_name=os_name,
-                                     force_variant=force_variant)
+  return baserlib.FillOpcode(opcodes.OpInstanceSetParams, data, {
+    "instance_name": name,
+    })
 
 
 class R_2_instances_name_modify(baserlib.R_Generic):