Preload the string-escape code in noded
[ganeti-local] / lib / opcodes.py
index b623f04..85ec445 100644 (file)
@@ -34,6 +34,7 @@ opcodes.
 # pylint: disable-msg=R0903
 
 import logging
 # pylint: disable-msg=R0903
 
 import logging
+import re
 
 from ganeti import constants
 from ganeti import errors
 
 from ganeti import constants
 from ganeti import errors
@@ -77,6 +78,30 @@ _PTagKind = ("kind", ht.NoDefault, ht.TElemOf(constants.VALID_TAG_TYPES))
 #: List of tag strings
 _PTags = ("tags", ht.NoDefault, ht.TListOf(ht.TNonEmptyString))
 
 #: List of tag strings
 _PTags = ("tags", ht.NoDefault, ht.TListOf(ht.TNonEmptyString))
 
+#: OP_ID conversion regular expression
+_OPID_RE = re.compile("([a-z])([A-Z])")
+
+
+def _NameToId(name):
+  """Convert an opcode class name to an OP_ID.
+
+  @type name: string
+  @param name: the class name, as OpXxxYyy
+  @rtype: string
+  @return: the name in the OP_XXXX_YYYY format
+
+  """
+  if not name.startswith("Op"):
+    return None
+  # Note: (?<=[a-z])(?=[A-Z]) would be ideal, since it wouldn't
+  # consume any input, and hence we would just have all the elements
+  # in the list, one by one; but it seems that split doesn't work on
+  # non-consuming input, hence we have to process the input string a
+  # bit
+  name = _OPID_RE.sub(r"\1,\2", name)
+  elems = name.split(",")
+  return "_".join(n.upper() for n in elems)
+
 
 def RequireFileStorage():
   """Checks that file storage is enabled.
 
 def RequireFileStorage():
   """Checks that file storage is enabled.
@@ -138,7 +163,9 @@ class _AutoOpParamSlots(type):
     """
     assert "__slots__" not in attrs, \
       "Class '%s' defines __slots__ when it should use OP_PARAMS" % name
     """
     assert "__slots__" not in attrs, \
       "Class '%s' defines __slots__ when it should use OP_PARAMS" % name
-    assert "OP_ID" in attrs, "Class '%s' is missing OP_ID attribute" % name
+    assert "OP_ID" not in attrs, "Class '%s' defining OP_ID" % name
+
+    attrs["OP_ID"] = _NameToId(name)
 
     # Always set OP_PARAMS to avoid duplicates in BaseOpCode.GetAllParams
     params = attrs.setdefault("OP_PARAMS", [])
 
     # Always set OP_PARAMS to avoid duplicates in BaseOpCode.GetAllParams
     params = attrs.setdefault("OP_PARAMS", [])
@@ -161,10 +188,10 @@ class BaseOpCode(object):
   field handling.
 
   """
   field handling.
 
   """
+  # pylint: disable-msg=E1101
+  # as OP_ID is dynamically defined
   __metaclass__ = _AutoOpParamSlots
 
   __metaclass__ = _AutoOpParamSlots
 
-  OP_ID = None
-
   def __init__(self, **kwargs):
     """Constructor for BaseOpCode.
 
   def __init__(self, **kwargs):
     """Constructor for BaseOpCode.
 
@@ -296,7 +323,8 @@ class OpCode(BaseOpCode):
   @ivar priority: Opcode priority for queue
 
   """
   @ivar priority: Opcode priority for queue
 
   """
-  OP_ID = "OP_ABSTRACT"
+  # pylint: disable-msg=E1101
+  # as OP_ID is dynamically defined
   WITH_LU = True
   OP_PARAMS = [
     ("dry_run", None, ht.TMaybeBool),
   WITH_LU = True
   OP_PARAMS = [
     ("dry_run", None, ht.TMaybeBool),
@@ -352,12 +380,14 @@ class OpCode(BaseOpCode):
   def Summary(self):
     """Generates a summary description of this opcode.
 
   def Summary(self):
     """Generates a summary description of this opcode.
 
-    The summary is the value of the OP_ID attribute (without the "OP_" prefix),
-    plus the value of the OP_DSC_FIELD attribute, if one was defined; this field
-    should allow to easily identify the operation (for an instance creation job,
-    e.g., it would be the instance name).
+    The summary is the value of the OP_ID attribute (without the "OP_"
+    prefix), plus the value of the OP_DSC_FIELD attribute, if one was
+    defined; this field should allow to easily identify the operation
+    (for an instance creation job, e.g., it would be the instance
+    name).
 
     """
 
     """
+    assert self.OP_ID is not None and len(self.OP_ID) > 3
     # all OP_ID start with OP_, we remove that
     txt = self.OP_ID[3:]
     field_name = getattr(self, "OP_DSC_FIELD", None)
     # all OP_ID start with OP_, we remove that
     txt = self.OP_ID[3:]
     field_name = getattr(self, "OP_DSC_FIELD", None)
@@ -371,32 +401,29 @@ class OpCode(BaseOpCode):
 
 # cluster opcodes
 
 
 # cluster opcodes
 
-class OpPostInitCluster(OpCode):
+class OpClusterPostInit(OpCode):
   """Post cluster initialization.
 
   This opcode does not touch the cluster at all. Its purpose is to run hooks
   after the cluster has been initialized.
 
   """
   """Post cluster initialization.
 
   This opcode does not touch the cluster at all. Its purpose is to run hooks
   after the cluster has been initialized.
 
   """
-  OP_ID = "OP_CLUSTER_POST_INIT"
 
 
 
 
-class OpDestroyCluster(OpCode):
+class OpClusterDestroy(OpCode):
   """Destroy the cluster.
 
   This opcode has no other parameters. All the state is irreversibly
   lost after the execution of this opcode.
 
   """
   """Destroy the cluster.
 
   This opcode has no other parameters. All the state is irreversibly
   lost after the execution of this opcode.
 
   """
-  OP_ID = "OP_CLUSTER_DESTROY"
 
 
 
 
-class OpQueryClusterInfo(OpCode):
+class OpClusterQuery(OpCode):
   """Query cluster information."""
   """Query cluster information."""
-  OP_ID = "OP_CLUSTER_QUERY"
 
 
 
 
-class OpVerifyCluster(OpCode):
+class OpClusterVerify(OpCode):
   """Verify the cluster state.
 
   @type skip_checks: C{list}
   """Verify the cluster state.
 
   @type skip_checks: C{list}
@@ -406,7 +433,6 @@ class OpVerifyCluster(OpCode):
                      only L{constants.VERIFY_NPLUSONE_MEM} can be passed
 
   """
                      only L{constants.VERIFY_NPLUSONE_MEM} can be passed
 
   """
-  OP_ID = "OP_CLUSTER_VERIFY"
   OP_PARAMS = [
     ("skip_checks", ht.EmptyList,
      ht.TListOf(ht.TElemOf(constants.VERIFY_OPTIONAL_CHECKS))),
   OP_PARAMS = [
     ("skip_checks", ht.EmptyList,
      ht.TListOf(ht.TElemOf(constants.VERIFY_OPTIONAL_CHECKS))),
@@ -416,7 +442,7 @@ class OpVerifyCluster(OpCode):
     ]
 
 
     ]
 
 
-class OpVerifyDisks(OpCode):
+class OpClusterVerifyDisks(OpCode):
   """Verify the cluster disks.
 
   Parameters: none
   """Verify the cluster disks.
 
   Parameters: none
@@ -437,10 +463,9 @@ class OpVerifyDisks(OpCode):
   consideration. This might need to be revisited in the future.
 
   """
   consideration. This might need to be revisited in the future.
 
   """
-  OP_ID = "OP_CLUSTER_VERIFY_DISKS"
 
 
 
 
-class OpRepairDiskSizes(OpCode):
+class OpClusterRepairDiskSizes(OpCode):
   """Verify the disk sizes of the instances and fixes configuration
   mimatches.
 
   """Verify the disk sizes of the instances and fixes configuration
   mimatches.
 
@@ -456,21 +481,19 @@ class OpRepairDiskSizes(OpCode):
   @ivar instances: the list of instances to check, or empty for all instances
 
   """
   @ivar instances: the list of instances to check, or empty for all instances
 
   """
-  OP_ID = "OP_CLUSTER_REPAIR_DISK_SIZES"
   OP_PARAMS = [
     ("instances", ht.EmptyList, ht.TListOf(ht.TNonEmptyString)),
     ]
 
 
   OP_PARAMS = [
     ("instances", ht.EmptyList, ht.TListOf(ht.TNonEmptyString)),
     ]
 
 
-class OpQueryConfigValues(OpCode):
+class OpClusterConfigQuery(OpCode):
   """Query cluster configuration values."""
   """Query cluster configuration values."""
-  OP_ID = "OP_CLUSTER_CONFIG_QUERY"
   OP_PARAMS = [
     _POutputFields
     ]
 
 
   OP_PARAMS = [
     _POutputFields
     ]
 
 
-class OpRenameCluster(OpCode):
+class OpClusterRename(OpCode):
   """Rename the cluster.
 
   @type name: C{str}
   """Rename the cluster.
 
   @type name: C{str}
@@ -479,21 +502,19 @@ class OpRenameCluster(OpCode):
               address.
 
   """
               address.
 
   """
-  OP_ID = "OP_CLUSTER_RENAME"
   OP_DSC_FIELD = "name"
   OP_PARAMS = [
     ("name", ht.NoDefault, ht.TNonEmptyString),
     ]
 
 
   OP_DSC_FIELD = "name"
   OP_PARAMS = [
     ("name", ht.NoDefault, ht.TNonEmptyString),
     ]
 
 
-class OpSetClusterParams(OpCode):
+class OpClusterSetParams(OpCode):
   """Change the parameters of the cluster.
 
   @type vg_name: C{str} or C{None}
   @ivar vg_name: The new volume group name or None to disable LVM usage.
 
   """
   """Change the parameters of the cluster.
 
   @type vg_name: C{str} or C{None}
   @ivar vg_name: The new volume group name or None to disable LVM usage.
 
   """
-  OP_ID = "OP_CLUSTER_SET_PARAMS"
   OP_PARAMS = [
     ("vg_name", None, ht.TMaybeString),
     ("enabled_hypervisors", None,
   OP_PARAMS = [
     ("vg_name", None, ht.TMaybeString),
     ("enabled_hypervisors", None,
@@ -512,8 +533,8 @@ class OpSetClusterParams(OpCode):
     ("remove_uids", None, ht.NoType),
     ("maintain_node_health", None, ht.TMaybeBool),
     ("prealloc_wipe_disks", None, ht.TMaybeBool),
     ("remove_uids", None, ht.NoType),
     ("maintain_node_health", None, ht.TMaybeBool),
     ("prealloc_wipe_disks", None, ht.TMaybeBool),
-    ("nicparams", None, ht.TOr(ht.TDict, ht.TNone)),
-    ("ndparams", None, ht.TOr(ht.TDict, ht.TNone)),
+    ("nicparams", None, ht.TMaybeDict),
+    ("ndparams", None, ht.TMaybeDict),
     ("drbd_helper", None, ht.TOr(ht.TString, ht.TNone)),
     ("default_iallocator", None, ht.TOr(ht.TString, ht.TNone)),
     ("master_netdev", None, ht.TOr(ht.TString, ht.TNone)),
     ("drbd_helper", None, ht.TOr(ht.TString, ht.TNone)),
     ("default_iallocator", None, ht.TOr(ht.TString, ht.TNone)),
     ("master_netdev", None, ht.TOr(ht.TString, ht.TNone)),
@@ -531,11 +552,10 @@ class OpSetClusterParams(OpCode):
     ]
 
 
     ]
 
 
-class OpRedistributeConfig(OpCode):
+class OpClusterRedistConf(OpCode):
   """Force a full push of the cluster configuration.
 
   """
   """Force a full push of the cluster configuration.
 
   """
-  OP_ID = "OP_CLUSTER_REDIST_CONF"
 
 
 class OpQuery(OpCode):
 
 
 class OpQuery(OpCode):
@@ -546,7 +566,6 @@ class OpQuery(OpCode):
   @ivar filter: Query filter
 
   """
   @ivar filter: Query filter
 
   """
-  OP_ID = "OP_QUERY"
   OP_PARAMS = [
     ("what", ht.NoDefault, ht.TElemOf(constants.QR_OP_QUERY)),
     ("fields", ht.NoDefault, ht.TListOf(ht.TNonEmptyString)),
   OP_PARAMS = [
     ("what", ht.NoDefault, ht.TElemOf(constants.QR_OP_QUERY)),
     ("fields", ht.NoDefault, ht.TListOf(ht.TNonEmptyString)),
@@ -562,7 +581,6 @@ class OpQueryFields(OpCode):
   @ivar fields: List of fields to retrieve
 
   """
   @ivar fields: List of fields to retrieve
 
   """
-  OP_ID = "OP_QUERY_FIELDS"
   OP_PARAMS = [
     ("what", ht.NoDefault, ht.TElemOf(constants.QR_OP_QUERY)),
     ("fields", None, ht.TOr(ht.TNone, ht.TListOf(ht.TNonEmptyString))),
   OP_PARAMS = [
     ("what", ht.NoDefault, ht.TElemOf(constants.QR_OP_QUERY)),
     ("fields", None, ht.TOr(ht.TNone, ht.TListOf(ht.TNonEmptyString))),
@@ -571,9 +589,8 @@ class OpQueryFields(OpCode):
 
 class OpOobCommand(OpCode):
   """Interact with OOB."""
 
 class OpOobCommand(OpCode):
   """Interact with OOB."""
-  OP_ID = "OP_OOB_COMMAND"
   OP_PARAMS = [
   OP_PARAMS = [
-    _PNodeName,
+    ("node_names", ht.EmptyList, ht.TListOf(ht.TNonEmptyString)),
     ("command", None, ht.TElemOf(constants.OOB_COMMANDS)),
     ("timeout", constants.OOB_TIMEOUT, ht.TInt),
     ]
     ("command", None, ht.TElemOf(constants.OOB_COMMANDS)),
     ("timeout", constants.OOB_TIMEOUT, ht.TInt),
     ]
@@ -581,7 +598,7 @@ class OpOobCommand(OpCode):
 
 # node opcodes
 
 
 # node opcodes
 
-class OpRemoveNode(OpCode):
+class OpNodeRemove(OpCode):
   """Remove a node.
 
   @type node_name: C{str}
   """Remove a node.
 
   @type node_name: C{str}
@@ -589,14 +606,13 @@ class OpRemoveNode(OpCode):
                    instances on it, the operation will fail.
 
   """
                    instances on it, the operation will fail.
 
   """
-  OP_ID = "OP_NODE_REMOVE"
   OP_DSC_FIELD = "node_name"
   OP_PARAMS = [
     _PNodeName,
     ]
 
 
   OP_DSC_FIELD = "node_name"
   OP_PARAMS = [
     _PNodeName,
     ]
 
 
-class OpAddNode(OpCode):
+class OpNodeAdd(OpCode):
   """Add a node to the cluster.
 
   @type node_name: C{str}
   """Add a node to the cluster.
 
   @type node_name: C{str}
@@ -624,7 +640,6 @@ class OpAddNode(OpCode):
   @ivar master_capable: The master_capable node attribute
 
   """
   @ivar master_capable: The master_capable node attribute
 
   """
-  OP_ID = "OP_NODE_ADD"
   OP_DSC_FIELD = "node_name"
   OP_PARAMS = [
     _PNodeName,
   OP_DSC_FIELD = "node_name"
   OP_PARAMS = [
     _PNodeName,
@@ -634,13 +649,12 @@ class OpAddNode(OpCode):
     ("group", None, ht.TMaybeString),
     ("master_capable", None, ht.TMaybeBool),
     ("vm_capable", None, ht.TMaybeBool),
     ("group", None, ht.TMaybeString),
     ("master_capable", None, ht.TMaybeBool),
     ("vm_capable", None, ht.TMaybeBool),
-    ("ndparams", None, ht.TOr(ht.TDict, ht.TNone)),
+    ("ndparams", None, ht.TMaybeDict),
     ]
 
 
     ]
 
 
-class OpQueryNodes(OpCode):
+class OpNodeQuery(OpCode):
   """Compute the list of nodes."""
   """Compute the list of nodes."""
-  OP_ID = "OP_NODE_QUERY"
   OP_PARAMS = [
     _POutputFields,
     ("names", ht.EmptyList, ht.TListOf(ht.TNonEmptyString)),
   OP_PARAMS = [
     _POutputFields,
     ("names", ht.EmptyList, ht.TListOf(ht.TNonEmptyString)),
@@ -648,18 +662,16 @@ class OpQueryNodes(OpCode):
     ]
 
 
     ]
 
 
-class OpQueryNodeVolumes(OpCode):
+class OpNodeQueryvols(OpCode):
   """Get list of volumes on node."""
   """Get list of volumes on node."""
-  OP_ID = "OP_NODE_QUERYVOLS"
   OP_PARAMS = [
     _POutputFields,
     ("nodes", ht.EmptyList, ht.TListOf(ht.TNonEmptyString)),
     ]
 
 
   OP_PARAMS = [
     _POutputFields,
     ("nodes", ht.EmptyList, ht.TListOf(ht.TNonEmptyString)),
     ]
 
 
-class OpQueryNodeStorage(OpCode):
+class OpNodeQueryStorage(OpCode):
   """Get information on storage for node(s)."""
   """Get information on storage for node(s)."""
-  OP_ID = "OP_NODE_QUERY_STORAGE"
   OP_PARAMS = [
     _POutputFields,
     _PStorageType,
   OP_PARAMS = [
     _POutputFields,
     _PStorageType,
@@ -668,9 +680,8 @@ class OpQueryNodeStorage(OpCode):
     ]
 
 
     ]
 
 
-class OpModifyNodeStorage(OpCode):
+class OpNodeModifyStorage(OpCode):
   """Modifies the properies of a storage unit"""
   """Modifies the properies of a storage unit"""
-  OP_ID = "OP_NODE_MODIFY_STORAGE"
   OP_PARAMS = [
     _PNodeName,
     _PStorageType,
   OP_PARAMS = [
     _PNodeName,
     _PStorageType,
@@ -681,7 +692,6 @@ class OpModifyNodeStorage(OpCode):
 
 class OpRepairNodeStorage(OpCode):
   """Repairs the volume group on a node."""
 
 class OpRepairNodeStorage(OpCode):
   """Repairs the volume group on a node."""
-  OP_ID = "OP_REPAIR_NODE_STORAGE"
   OP_DSC_FIELD = "node_name"
   OP_PARAMS = [
     _PNodeName,
   OP_DSC_FIELD = "node_name"
   OP_PARAMS = [
     _PNodeName,
@@ -691,9 +701,8 @@ class OpRepairNodeStorage(OpCode):
     ]
 
 
     ]
 
 
-class OpSetNodeParams(OpCode):
+class OpNodeSetParams(OpCode):
   """Change the parameters of a node."""
   """Change the parameters of a node."""
-  OP_ID = "OP_NODE_SET_PARAMS"
   OP_DSC_FIELD = "node_name"
   OP_PARAMS = [
     _PNodeName,
   OP_DSC_FIELD = "node_name"
   OP_PARAMS = [
     _PNodeName,
@@ -705,14 +714,13 @@ class OpSetNodeParams(OpCode):
     ("master_capable", None, ht.TMaybeBool),
     ("vm_capable", None, ht.TMaybeBool),
     ("secondary_ip", None, ht.TMaybeString),
     ("master_capable", None, ht.TMaybeBool),
     ("vm_capable", None, ht.TMaybeBool),
     ("secondary_ip", None, ht.TMaybeString),
-    ("ndparams", None, ht.TOr(ht.TDict, ht.TNone)),
+    ("ndparams", None, ht.TMaybeDict),
     ("powered", None, ht.TMaybeBool),
     ]
 
 
     ("powered", None, ht.TMaybeBool),
     ]
 
 
-class OpPowercycleNode(OpCode):
+class OpNodePowercycle(OpCode):
   """Tries to powercycle a node."""
   """Tries to powercycle a node."""
-  OP_ID = "OP_NODE_POWERCYCLE"
   OP_DSC_FIELD = "node_name"
   OP_PARAMS = [
     _PNodeName,
   OP_DSC_FIELD = "node_name"
   OP_PARAMS = [
     _PNodeName,
@@ -720,9 +728,8 @@ class OpPowercycleNode(OpCode):
     ]
 
 
     ]
 
 
-class OpMigrateNode(OpCode):
+class OpNodeMigrate(OpCode):
   """Migrate all instances from a node."""
   """Migrate all instances from a node."""
-  OP_ID = "OP_NODE_MIGRATE"
   OP_DSC_FIELD = "node_name"
   OP_PARAMS = [
     _PNodeName,
   OP_DSC_FIELD = "node_name"
   OP_PARAMS = [
     _PNodeName,
@@ -731,9 +738,8 @@ class OpMigrateNode(OpCode):
     ]
 
 
     ]
 
 
-class OpNodeEvacuationStrategy(OpCode):
+class OpNodeEvacStrategy(OpCode):
   """Compute the evacuation strategy for a list of nodes."""
   """Compute the evacuation strategy for a list of nodes."""
-  OP_ID = "OP_NODE_EVAC_STRATEGY"
   OP_DSC_FIELD = "nodes"
   OP_PARAMS = [
     ("nodes", ht.NoDefault, ht.TListOf(ht.TNonEmptyString)),
   OP_DSC_FIELD = "nodes"
   OP_PARAMS = [
     ("nodes", ht.NoDefault, ht.TListOf(ht.TNonEmptyString)),
@@ -744,7 +750,7 @@ class OpNodeEvacuationStrategy(OpCode):
 
 # instance opcodes
 
 
 # instance opcodes
 
-class OpCreateInstance(OpCode):
+class OpInstanceCreate(OpCode):
   """Create an instance.
 
   @ivar instance_name: Instance name
   """Create an instance.
 
   @ivar instance_name: Instance name
@@ -756,7 +762,6 @@ class OpCreateInstance(OpCode):
     (remote import only)
 
   """
     (remote import only)
 
   """
-  OP_ID = "OP_INSTANCE_CREATE"
   OP_DSC_FIELD = "instance_name"
   OP_PARAMS = [
     _PInstanceName,
   OP_DSC_FIELD = "instance_name"
   OP_PARAMS = [
     _PInstanceName,
@@ -791,21 +796,19 @@ class OpCreateInstance(OpCode):
     ]
 
 
     ]
 
 
-class OpReinstallInstance(OpCode):
+class OpInstanceReinstall(OpCode):
   """Reinstall an instance's OS."""
   """Reinstall an instance's OS."""
-  OP_ID = "OP_INSTANCE_REINSTALL"
   OP_DSC_FIELD = "instance_name"
   OP_PARAMS = [
     _PInstanceName,
     ("os_type", None, ht.TMaybeString),
     ("force_variant", False, ht.TBool),
   OP_DSC_FIELD = "instance_name"
   OP_PARAMS = [
     _PInstanceName,
     ("os_type", None, ht.TMaybeString),
     ("force_variant", False, ht.TBool),
-    ("osparams", None, ht.TOr(ht.TDict, ht.TNone)),
+    ("osparams", None, ht.TMaybeDict),
     ]
 
 
     ]
 
 
-class OpRemoveInstance(OpCode):
+class OpInstanceRemove(OpCode):
   """Remove an instance."""
   """Remove an instance."""
-  OP_ID = "OP_INSTANCE_REMOVE"
   OP_DSC_FIELD = "instance_name"
   OP_PARAMS = [
     _PInstanceName,
   OP_DSC_FIELD = "instance_name"
   OP_PARAMS = [
     _PInstanceName,
@@ -814,9 +817,8 @@ class OpRemoveInstance(OpCode):
     ]
 
 
     ]
 
 
-class OpRenameInstance(OpCode):
+class OpInstanceRename(OpCode):
   """Rename an instance."""
   """Rename an instance."""
-  OP_ID = "OP_INSTANCE_RENAME"
   OP_PARAMS = [
     _PInstanceName,
     ("new_name", ht.NoDefault, ht.TNonEmptyString),
   OP_PARAMS = [
     _PInstanceName,
     ("new_name", ht.NoDefault, ht.TNonEmptyString),
@@ -825,9 +827,8 @@ class OpRenameInstance(OpCode):
     ]
 
 
     ]
 
 
-class OpStartupInstance(OpCode):
+class OpInstanceStartup(OpCode):
   """Startup an instance."""
   """Startup an instance."""
-  OP_ID = "OP_INSTANCE_STARTUP"
   OP_DSC_FIELD = "instance_name"
   OP_PARAMS = [
     _PInstanceName,
   OP_DSC_FIELD = "instance_name"
   OP_PARAMS = [
     _PInstanceName,
@@ -838,9 +839,8 @@ class OpStartupInstance(OpCode):
     ]
 
 
     ]
 
 
-class OpShutdownInstance(OpCode):
+class OpInstanceShutdown(OpCode):
   """Shutdown an instance."""
   """Shutdown an instance."""
-  OP_ID = "OP_INSTANCE_SHUTDOWN"
   OP_DSC_FIELD = "instance_name"
   OP_PARAMS = [
     _PInstanceName,
   OP_DSC_FIELD = "instance_name"
   OP_PARAMS = [
     _PInstanceName,
@@ -849,9 +849,8 @@ class OpShutdownInstance(OpCode):
     ]
 
 
     ]
 
 
-class OpRebootInstance(OpCode):
+class OpInstanceReboot(OpCode):
   """Reboot an instance."""
   """Reboot an instance."""
-  OP_ID = "OP_INSTANCE_REBOOT"
   OP_DSC_FIELD = "instance_name"
   OP_PARAMS = [
     _PInstanceName,
   OP_DSC_FIELD = "instance_name"
   OP_PARAMS = [
     _PInstanceName,
@@ -861,9 +860,8 @@ class OpRebootInstance(OpCode):
     ]
 
 
     ]
 
 
-class OpReplaceDisks(OpCode):
+class OpInstanceReplaceDisks(OpCode):
   """Replace the disks of an instance."""
   """Replace the disks of an instance."""
-  OP_ID = "OP_INSTANCE_REPLACE_DISKS"
   OP_DSC_FIELD = "instance_name"
   OP_PARAMS = [
     _PInstanceName,
   OP_DSC_FIELD = "instance_name"
   OP_PARAMS = [
     _PInstanceName,
@@ -875,9 +873,8 @@ class OpReplaceDisks(OpCode):
     ]
 
 
     ]
 
 
-class OpFailoverInstance(OpCode):
+class OpInstanceFailover(OpCode):
   """Failover an instance."""
   """Failover an instance."""
-  OP_ID = "OP_INSTANCE_FAILOVER"
   OP_DSC_FIELD = "instance_name"
   OP_PARAMS = [
     _PInstanceName,
   OP_DSC_FIELD = "instance_name"
   OP_PARAMS = [
     _PInstanceName,
@@ -886,7 +883,7 @@ class OpFailoverInstance(OpCode):
     ]
 
 
     ]
 
 
-class OpMigrateInstance(OpCode):
+class OpInstanceMigrate(OpCode):
   """Migrate an instance.
 
   This migrates (without shutting down an instance) to its secondary
   """Migrate an instance.
 
   This migrates (without shutting down an instance) to its secondary
@@ -896,7 +893,6 @@ class OpMigrateInstance(OpCode):
   @ivar mode: the migration mode (live, non-live or None for auto)
 
   """
   @ivar mode: the migration mode (live, non-live or None for auto)
 
   """
-  OP_ID = "OP_INSTANCE_MIGRATE"
   OP_DSC_FIELD = "instance_name"
   OP_PARAMS = [
     _PInstanceName,
   OP_DSC_FIELD = "instance_name"
   OP_PARAMS = [
     _PInstanceName,
@@ -906,7 +902,7 @@ class OpMigrateInstance(OpCode):
     ]
 
 
     ]
 
 
-class OpMoveInstance(OpCode):
+class OpInstanceMove(OpCode):
   """Move an instance.
 
   This move (with shutting down an instance and data copying) to an
   """Move an instance.
 
   This move (with shutting down an instance and data copying) to an
@@ -916,7 +912,6 @@ class OpMoveInstance(OpCode):
   @ivar target_node: the destination node
 
   """
   @ivar target_node: the destination node
 
   """
-  OP_ID = "OP_INSTANCE_MOVE"
   OP_DSC_FIELD = "instance_name"
   OP_PARAMS = [
     _PInstanceName,
   OP_DSC_FIELD = "instance_name"
   OP_PARAMS = [
     _PInstanceName,
@@ -925,18 +920,16 @@ class OpMoveInstance(OpCode):
     ]
 
 
     ]
 
 
-class OpConnectConsole(OpCode):
+class OpInstanceConsole(OpCode):
   """Connect to an instance's console."""
   """Connect to an instance's console."""
-  OP_ID = "OP_INSTANCE_CONSOLE"
   OP_DSC_FIELD = "instance_name"
   OP_PARAMS = [
     _PInstanceName
     ]
 
 
   OP_DSC_FIELD = "instance_name"
   OP_PARAMS = [
     _PInstanceName
     ]
 
 
-class OpActivateInstanceDisks(OpCode):
+class OpInstanceActivateDisks(OpCode):
   """Activate an instance's disks."""
   """Activate an instance's disks."""
-  OP_ID = "OP_INSTANCE_ACTIVATE_DISKS"
   OP_DSC_FIELD = "instance_name"
   OP_PARAMS = [
     _PInstanceName,
   OP_DSC_FIELD = "instance_name"
   OP_PARAMS = [
     _PInstanceName,
@@ -944,28 +937,27 @@ class OpActivateInstanceDisks(OpCode):
     ]
 
 
     ]
 
 
-class OpDeactivateInstanceDisks(OpCode):
+class OpInstanceDeactivateDisks(OpCode):
   """Deactivate an instance's disks."""
   """Deactivate an instance's disks."""
-  OP_ID = "OP_INSTANCE_DEACTIVATE_DISKS"
   OP_DSC_FIELD = "instance_name"
   OP_PARAMS = [
   OP_DSC_FIELD = "instance_name"
   OP_PARAMS = [
-    _PInstanceName
+    _PInstanceName,
+    _PForce,
     ]
 
 
     ]
 
 
-class OpRecreateInstanceDisks(OpCode):
+class OpInstanceRecreateDisks(OpCode):
   """Deactivate an instance's disks."""
   """Deactivate an instance's disks."""
-  OP_ID = "OP_INSTANCE_RECREATE_DISKS"
   OP_DSC_FIELD = "instance_name"
   OP_PARAMS = [
     _PInstanceName,
     ("disks", ht.EmptyList, ht.TListOf(ht.TPositiveInt)),
   OP_DSC_FIELD = "instance_name"
   OP_PARAMS = [
     _PInstanceName,
     ("disks", ht.EmptyList, ht.TListOf(ht.TPositiveInt)),
+    ("nodes", ht.EmptyList, ht.TListOf(ht.TNonEmptyString)),
     ]
 
 
     ]
 
 
-class OpQueryInstances(OpCode):
+class OpInstanceQuery(OpCode):
   """Compute the list of instances."""
   """Compute the list of instances."""
-  OP_ID = "OP_INSTANCE_QUERY"
   OP_PARAMS = [
     _POutputFields,
     ("names", ht.EmptyList, ht.TListOf(ht.TNonEmptyString)),
   OP_PARAMS = [
     _POutputFields,
     ("names", ht.EmptyList, ht.TListOf(ht.TNonEmptyString)),
@@ -973,18 +965,17 @@ class OpQueryInstances(OpCode):
     ]
 
 
     ]
 
 
-class OpQueryInstanceData(OpCode):
+class OpInstanceQueryData(OpCode):
   """Compute the run-time status of instances."""
   """Compute the run-time status of instances."""
-  OP_ID = "OP_INSTANCE_QUERY_DATA"
   OP_PARAMS = [
     ("instances", ht.EmptyList, ht.TListOf(ht.TNonEmptyString)),
     ("static", False, ht.TBool),
   OP_PARAMS = [
     ("instances", ht.EmptyList, ht.TListOf(ht.TNonEmptyString)),
     ("static", False, ht.TBool),
+    ("use_locking", False, ht.TBool),
     ]
 
 
     ]
 
 
-class OpSetInstanceParams(OpCode):
+class OpInstanceSetParams(OpCode):
   """Change the parameters of an instance."""
   """Change the parameters of an instance."""
-  OP_ID = "OP_INSTANCE_SET_PARAMS"
   OP_DSC_FIELD = "instance_name"
   OP_PARAMS = [
     _PInstanceName,
   OP_DSC_FIELD = "instance_name"
   OP_PARAMS = [
     _PInstanceName,
@@ -997,13 +988,13 @@ class OpSetInstanceParams(OpCode):
     ("remote_node", None, ht.TMaybeString),
     ("os_name", None, ht.TMaybeString),
     ("force_variant", False, ht.TBool),
     ("remote_node", None, ht.TMaybeString),
     ("os_name", None, ht.TMaybeString),
     ("force_variant", False, ht.TBool),
-    ("osparams", None, ht.TOr(ht.TDict, ht.TNone)),
+    ("osparams", None, ht.TMaybeDict),
+    ("wait_for_sync", True, ht.TBool),
     ]
 
 
     ]
 
 
-class OpGrowDisk(OpCode):
+class OpInstanceGrowDisk(OpCode):
   """Grow a disk of an instance."""
   """Grow a disk of an instance."""
-  OP_ID = "OP_INSTANCE_GROW_DISK"
   OP_DSC_FIELD = "instance_name"
   OP_PARAMS = [
     _PInstanceName,
   OP_DSC_FIELD = "instance_name"
   OP_PARAMS = [
     _PInstanceName,
@@ -1015,21 +1006,19 @@ class OpGrowDisk(OpCode):
 
 # Node group opcodes
 
 
 # Node group opcodes
 
-class OpAddGroup(OpCode):
+class OpGroupAdd(OpCode):
   """Add a node group to the cluster."""
   """Add a node group to the cluster."""
-  OP_ID = "OP_GROUP_ADD"
   OP_DSC_FIELD = "group_name"
   OP_PARAMS = [
     _PGroupName,
   OP_DSC_FIELD = "group_name"
   OP_PARAMS = [
     _PGroupName,
-    ("ndparams", None, ht.TOr(ht.TDict, ht.TNone)),
+    ("ndparams", None, ht.TMaybeDict),
     ("alloc_policy", None,
      ht.TOr(ht.TNone, ht.TElemOf(constants.VALID_ALLOC_POLICIES))),
     ]
 
 
     ("alloc_policy", None,
      ht.TOr(ht.TNone, ht.TElemOf(constants.VALID_ALLOC_POLICIES))),
     ]
 
 
-class OpAssignGroupNodes(OpCode):
+class OpGroupAssignNodes(OpCode):
   """Assign nodes to a node group."""
   """Assign nodes to a node group."""
-  OP_ID = "OP_ASSIGN_NODES"
   OP_DSC_FIELD = "group_name"
   OP_PARAMS = [
     _PGroupName,
   OP_DSC_FIELD = "group_name"
   OP_PARAMS = [
     _PGroupName,
@@ -1038,39 +1027,35 @@ class OpAssignGroupNodes(OpCode):
     ]
 
 
     ]
 
 
-class OpQueryGroups(OpCode):
+class OpGroupQuery(OpCode):
   """Compute the list of node groups."""
   """Compute the list of node groups."""
-  OP_ID = "OP_GROUP_QUERY"
   OP_PARAMS = [
     _POutputFields,
     ("names", ht.EmptyList, ht.TListOf(ht.TNonEmptyString)),
     ]
 
 
   OP_PARAMS = [
     _POutputFields,
     ("names", ht.EmptyList, ht.TListOf(ht.TNonEmptyString)),
     ]
 
 
-class OpSetGroupParams(OpCode):
+class OpGroupSetParams(OpCode):
   """Change the parameters of a node group."""
   """Change the parameters of a node group."""
-  OP_ID = "OP_GROUP_SET_PARAMS"
   OP_DSC_FIELD = "group_name"
   OP_PARAMS = [
     _PGroupName,
   OP_DSC_FIELD = "group_name"
   OP_PARAMS = [
     _PGroupName,
-    ("ndparams", None, ht.TOr(ht.TDict, ht.TNone)),
+    ("ndparams", None, ht.TMaybeDict),
     ("alloc_policy", None, ht.TOr(ht.TNone,
                                   ht.TElemOf(constants.VALID_ALLOC_POLICIES))),
     ]
 
 
     ("alloc_policy", None, ht.TOr(ht.TNone,
                                   ht.TElemOf(constants.VALID_ALLOC_POLICIES))),
     ]
 
 
-class OpRemoveGroup(OpCode):
+class OpGroupRemove(OpCode):
   """Remove a node group from the cluster."""
   """Remove a node group from the cluster."""
-  OP_ID = "OP_GROUP_REMOVE"
   OP_DSC_FIELD = "group_name"
   OP_PARAMS = [
     _PGroupName,
     ]
 
 
   OP_DSC_FIELD = "group_name"
   OP_PARAMS = [
     _PGroupName,
     ]
 
 
-class OpRenameGroup(OpCode):
+class OpGroupRename(OpCode):
   """Rename a node group in the cluster."""
   """Rename a node group in the cluster."""
-  OP_ID = "OP_GROUP_RENAME"
   OP_DSC_FIELD = "old_name"
   OP_PARAMS = [
     ("old_name", ht.NoDefault, ht.TNonEmptyString),
   OP_DSC_FIELD = "old_name"
   OP_PARAMS = [
     ("old_name", ht.NoDefault, ht.TNonEmptyString),
@@ -1079,9 +1064,8 @@ class OpRenameGroup(OpCode):
 
 
 # OS opcodes
 
 
 # OS opcodes
-class OpDiagnoseOS(OpCode):
+class OpOsDiagnose(OpCode):
   """Compute the list of guest operating systems."""
   """Compute the list of guest operating systems."""
-  OP_ID = "OP_OS_DIAGNOSE"
   OP_PARAMS = [
     _POutputFields,
     ("names", ht.EmptyList, ht.TListOf(ht.TNonEmptyString)),
   OP_PARAMS = [
     _POutputFields,
     ("names", ht.EmptyList, ht.TListOf(ht.TNonEmptyString)),
@@ -1089,23 +1073,21 @@ class OpDiagnoseOS(OpCode):
 
 
 # Exports opcodes
 
 
 # Exports opcodes
-class OpQueryExports(OpCode):
+class OpBackupQuery(OpCode):
   """Compute the list of exported images."""
   """Compute the list of exported images."""
-  OP_ID = "OP_BACKUP_QUERY"
   OP_PARAMS = [
     ("nodes", ht.EmptyList, ht.TListOf(ht.TNonEmptyString)),
     ("use_locking", False, ht.TBool),
     ]
 
 
   OP_PARAMS = [
     ("nodes", ht.EmptyList, ht.TListOf(ht.TNonEmptyString)),
     ("use_locking", False, ht.TBool),
     ]
 
 
-class OpPrepareExport(OpCode):
+class OpBackupPrepare(OpCode):
   """Prepares an instance export.
 
   @ivar instance_name: Instance name
   @ivar mode: Export mode (one of L{constants.EXPORT_MODES})
 
   """
   """Prepares an instance export.
 
   @ivar instance_name: Instance name
   @ivar mode: Export mode (one of L{constants.EXPORT_MODES})
 
   """
-  OP_ID = "OP_BACKUP_PREPARE"
   OP_DSC_FIELD = "instance_name"
   OP_PARAMS = [
     _PInstanceName,
   OP_DSC_FIELD = "instance_name"
   OP_PARAMS = [
     _PInstanceName,
@@ -1113,7 +1095,7 @@ class OpPrepareExport(OpCode):
     ]
 
 
     ]
 
 
-class OpExportInstance(OpCode):
+class OpBackupExport(OpCode):
   """Export an instance.
 
   For local exports, the export destination is the node name. For remote
   """Export an instance.
 
   For local exports, the export destination is the node name. For remote
@@ -1129,7 +1111,6 @@ class OpExportInstance(OpCode):
                              only)
 
   """
                              only)
 
   """
-  OP_ID = "OP_BACKUP_EXPORT"
   OP_DSC_FIELD = "instance_name"
   OP_PARAMS = [
     _PInstanceName,
   OP_DSC_FIELD = "instance_name"
   OP_PARAMS = [
     _PInstanceName,
@@ -1146,9 +1127,8 @@ class OpExportInstance(OpCode):
     ]
 
 
     ]
 
 
-class OpRemoveExport(OpCode):
+class OpBackupRemove(OpCode):
   """Remove an instance's export."""
   """Remove an instance's export."""
-  OP_ID = "OP_BACKUP_REMOVE"
   OP_DSC_FIELD = "instance_name"
   OP_PARAMS = [
     _PInstanceName,
   OP_DSC_FIELD = "instance_name"
   OP_PARAMS = [
     _PInstanceName,
@@ -1156,9 +1136,8 @@ class OpRemoveExport(OpCode):
 
 
 # Tags opcodes
 
 
 # Tags opcodes
-class OpGetTags(OpCode):
+class OpTagsGet(OpCode):
   """Returns the tags of the given object."""
   """Returns the tags of the given object."""
-  OP_ID = "OP_TAGS_GET"
   OP_DSC_FIELD = "name"
   OP_PARAMS = [
     _PTagKind,
   OP_DSC_FIELD = "name"
   OP_PARAMS = [
     _PTagKind,
@@ -1167,18 +1146,16 @@ class OpGetTags(OpCode):
     ]
 
 
     ]
 
 
-class OpSearchTags(OpCode):
+class OpTagsSearch(OpCode):
   """Searches the tags in the cluster for a given pattern."""
   """Searches the tags in the cluster for a given pattern."""
-  OP_ID = "OP_TAGS_SEARCH"
   OP_DSC_FIELD = "pattern"
   OP_PARAMS = [
     ("pattern", ht.NoDefault, ht.TNonEmptyString),
     ]
 
 
   OP_DSC_FIELD = "pattern"
   OP_PARAMS = [
     ("pattern", ht.NoDefault, ht.TNonEmptyString),
     ]
 
 
-class OpAddTags(OpCode):
+class OpTagsSet(OpCode):
   """Add a list of tags on a given object."""
   """Add a list of tags on a given object."""
-  OP_ID = "OP_TAGS_SET"
   OP_PARAMS = [
     _PTagKind,
     _PTags,
   OP_PARAMS = [
     _PTagKind,
     _PTags,
@@ -1187,9 +1164,8 @@ class OpAddTags(OpCode):
     ]
 
 
     ]
 
 
-class OpDelTags(OpCode):
+class OpTagsDel(OpCode):
   """Remove a list of tags from a given object."""
   """Remove a list of tags from a given object."""
-  OP_ID = "OP_TAGS_DEL"
   OP_PARAMS = [
     _PTagKind,
     _PTags,
   OP_PARAMS = [
     _PTagKind,
     _PTags,
@@ -1219,7 +1195,6 @@ class OpTestDelay(OpCode):
   generator. The case of duration == 0 will not be treated specially.
 
   """
   generator. The case of duration == 0 will not be treated specially.
 
   """
-  OP_ID = "OP_TEST_DELAY"
   OP_DSC_FIELD = "duration"
   OP_PARAMS = [
     ("duration", ht.NoDefault, ht.TFloat),
   OP_DSC_FIELD = "duration"
   OP_PARAMS = [
     ("duration", ht.NoDefault, ht.TFloat),
@@ -1240,7 +1215,6 @@ class OpTestAllocator(OpCode):
       return the allocator output (direction 'out')
 
   """
       return the allocator output (direction 'out')
 
   """
-  OP_ID = "OP_TEST_ALLOCATOR"
   OP_DSC_FIELD = "allocator"
   OP_PARAMS = [
     ("direction", ht.NoDefault,
   OP_DSC_FIELD = "allocator"
   OP_PARAMS = [
     ("direction", ht.NoDefault,
@@ -1262,11 +1236,10 @@ class OpTestAllocator(OpCode):
     ]
 
 
     ]
 
 
-class OpTestJobqueue(OpCode):
+class OpTestJqueue(OpCode):
   """Utility opcode to test some aspects of the job queue.
 
   """
   """Utility opcode to test some aspects of the job queue.
 
   """
-  OP_ID = "OP_TEST_JQUEUE"
   OP_PARAMS = [
     ("notify_waitlock", False, ht.TBool),
     ("notify_exec", False, ht.TBool),
   OP_PARAMS = [
     ("notify_waitlock", False, ht.TBool),
     ("notify_exec", False, ht.TBool),
@@ -1279,7 +1252,6 @@ class OpTestDummy(OpCode):
   """Utility opcode used by unittests.
 
   """
   """Utility opcode used by unittests.
 
   """
-  OP_ID = "OP_TEST_DUMMY"
   OP_PARAMS = [
     ("result", ht.NoDefault, ht.NoType),
     ("messages", ht.NoDefault, ht.NoType),
   OP_PARAMS = [
     ("result", ht.NoDefault, ht.NoType),
     ("messages", ht.NoDefault, ht.NoType),