ipolicy: Make the keys of the dict consistent
[ganeti-local] / lib / opcodes.py
index 14a132b..8823581 100644 (file)
@@ -31,7 +31,7 @@ opcodes.
 
 # this are practically structures, so disable the message about too
 # few public methods:
-# pylint: disable-msg=R0903
+# pylint: disable=R0903
 
 import logging
 import re
@@ -137,6 +137,29 @@ _PErrorCodes = ("error_codes", False, ht.TBool, "Error codes")
 _PSkipChecks = ("skip_checks", ht.EmptyList,
                 ht.TListOf(ht.TElemOf(constants.VERIFY_OPTIONAL_CHECKS)),
                 "Which checks to skip")
+_PIgnoreErrors = ("ignore_errors", ht.EmptyList,
+                  ht.TListOf(ht.TElemOf(constants.CV_ALL_ECODES_STRINGS)),
+                  "List of error codes that should be treated as warnings")
+
+# Disk parameters
+_PDiskParams = ("diskparams", None,
+                ht.TOr(
+                  ht.TDictOf(ht.TElemOf(constants.DISK_TEMPLATES), ht.TDict),
+                  ht.TNone),
+                "Disk templates' parameter defaults")
+
+# Parameters for node resource model
+_PHvState = ("hv_state", None, ht.TMaybeDict, "Set hypervisor states")
+_PDiskState = ("disk_state", None, ht.TMaybeDict, "Set disk states")
+
+
+_PIgnoreIpolicy = ("ignore_ipolicy", False, ht.TBool,
+                   "Whether to ignore ipolicy violations")
+
+# Allow runtime changes while migrating
+_PAllowRuntimeChgs = ("allow_runtime_changes", True, ht.TBool,
+                      "Allow runtime changes (eg. memory ballooning)")
+
 
 #: OP_ID conversion regular expression
 _OPID_RE = re.compile("([a-z])([A-Z])")
@@ -155,13 +178,18 @@ _TestNicDef = ht.TDictOf(ht.TElemOf(constants.INIC_PARAMS),
 
 _TSetParamsResultItemItems = [
   ht.Comment("name of changed parameter")(ht.TNonEmptyString),
-  ht.TAny,
+  ht.Comment("new value")(ht.TAny),
   ]
 
 _TSetParamsResult = \
   ht.TListOf(ht.TAnd(ht.TIsLength(len(_TSetParamsResultItemItems)),
                      ht.TItems(_TSetParamsResultItemItems)))
 
+# TODO: Generate check from constants.IDISK_PARAMS_TYPES (however, not all users
+# of this check support all parameters)
+_TDiskParams = ht.TDictOf(ht.TElemOf(constants.IDISK_PARAMS),
+                          ht.TOr(ht.TNonEmptyString, ht.TInt))
+
 _SUMMARY_PREFIX = {
   "CLUSTER_": "C_",
   "GROUP_": "G_",
@@ -311,7 +339,7 @@ class BaseOpCode(object):
   field handling.
 
   """
-  # pylint: disable-msg=E1101
+  # pylint: disable=E1101
   # as OP_ID is dynamically defined
   __metaclass__ = _AutoOpParamSlots
 
@@ -485,7 +513,7 @@ class OpCode(BaseOpCode):
   @ivar priority: Opcode priority for queue
 
   """
-  # pylint: disable-msg=E1101
+  # pylint: disable=E1101
   # as OP_ID is dynamically defined
   WITH_LU = True
   OP_PARAMS = [
@@ -495,7 +523,8 @@ class OpCode(BaseOpCode):
      ht.TElemOf(constants.OP_PRIO_SUBMIT_VALID), "Opcode priority"),
     (DEPEND_ATTR, None, _BuildJobDepCheck(True),
      "Job dependencies; if used through ``SubmitManyJobs`` relative (negative)"
-     " job IDs can be used"),
+     " job IDs can be used; see :doc:`design document <design-chained-jobs>`"
+     " for details"),
     (COMMENT_ATTR, None, ht.TMaybeString,
      "Comment describing the purpose of the opcode"),
     ]
@@ -613,6 +642,7 @@ class OpClusterVerify(OpCode):
     _PDebugSimulateErrors,
     _PErrorCodes,
     _PSkipChecks,
+    _PIgnoreErrors,
     _PVerbose,
     ("group_name", None, ht.TMaybeString, "Group to verify")
     ]
@@ -626,6 +656,7 @@ class OpClusterVerifyConfig(OpCode):
   OP_PARAMS = [
     _PDebugSimulateErrors,
     _PErrorCodes,
+    _PIgnoreErrors,
     _PVerbose,
     ]
   OP_RESULT = ht.TBool
@@ -647,6 +678,7 @@ class OpClusterVerifyGroup(OpCode):
     _PDebugSimulateErrors,
     _PErrorCodes,
     _PSkipChecks,
+    _PIgnoreErrors,
     _PVerbose,
     ]
   OP_RESULT = ht.TBool
@@ -685,7 +717,8 @@ class OpGroupVerifyDisks(OpCode):
     ht.TAnd(ht.TIsLength(3),
             ht.TItems([ht.TDictOf(ht.TString, ht.TString),
                        ht.TListOf(ht.TString),
-                       ht.TDictOf(ht.TString, ht.TListOf(ht.TString))]))
+                       ht.TDictOf(ht.TString,
+                                  ht.TListOf(ht.TListOf(ht.TString)))]))
 
 
 class OpClusterRepairDiskSizes(OpCode):
@@ -739,6 +772,8 @@ class OpClusterSetParams(OpCode):
 
   """
   OP_PARAMS = [
+    _PHvState,
+    _PDiskState,
     ("vg_name", None, ht.TMaybeString, "Volume group name"),
     ("enabled_hypervisors", None,
      ht.TOr(ht.TAnd(ht.TListOf(ht.TElemOf(constants.HYPER_TYPES)), ht.TTrue),
@@ -755,6 +790,7 @@ class OpClusterSetParams(OpCode):
     ("osparams", None, ht.TOr(ht.TDictOf(ht.TNonEmptyString, ht.TDict),
                               ht.TNone),
      "Cluster-wide OS parameter defaults"),
+    _PDiskParams,
     ("candidate_pool_size", None, ht.TOr(ht.TStrictPositiveInt, ht.TNone),
      "Master candidate pool size"),
     ("uid_pool", None, ht.NoType,
@@ -772,11 +808,15 @@ class OpClusterSetParams(OpCode):
      "Whether to wipe disks before allocating them to instances"),
     ("nicparams", None, ht.TMaybeDict, "Cluster-wide NIC parameter defaults"),
     ("ndparams", None, ht.TMaybeDict, "Cluster-wide node parameter defaults"),
+    ("ipolicy", None, ht.TMaybeDict,
+     "Cluster-wide :ref:`instance policy <rapi-ipolicy>` specs"),
     ("drbd_helper", None, ht.TOr(ht.TString, ht.TNone), "DRBD helper program"),
     ("default_iallocator", None, ht.TOr(ht.TString, ht.TNone),
      "Default iallocator for cluster"),
     ("master_netdev", None, ht.TOr(ht.TString, ht.TNone),
      "Master network device"),
+    ("master_netmask", None, ht.TOr(ht.TInt, ht.TNone),
+     "Netmask of the master IP"),
     ("reserved_lvs", None, ht.TOr(ht.TListOf(ht.TNonEmptyString), ht.TNone),
      "List of reserved LVs"),
     ("hidden_os", None, _TestClusterOsList,
@@ -787,6 +827,8 @@ class OpClusterSetParams(OpCode):
      "Modify list of blacklisted operating systems. Each modification must have"
      " two items, the operation and the OS name. The operation can be"
      " ``%s`` or ``%s``." % (constants.DDM_ADD, constants.DDM_REMOVE)),
+    ("use_external_mip_script", None, ht.TMaybeBool,
+     "Whether to use an external master IP address setup script"),
     ]
 
 
@@ -796,12 +838,24 @@ class OpClusterRedistConf(OpCode):
   """
 
 
+class OpClusterActivateMasterIp(OpCode):
+  """Activate the master IP on the master node.
+
+  """
+
+
+class OpClusterDeactivateMasterIp(OpCode):
+  """Deactivate the master IP on the master node.
+
+  """
+
+
 class OpQuery(OpCode):
   """Query for resources/items.
 
   @ivar what: Resources to query for, must be one of L{constants.QR_VIA_OP}
   @ivar fields: List of fields to retrieve
-  @ivar filter: Query filter
+  @ivar qfilter: Query filter
 
   """
   OP_DSC_FIELD = "what"
@@ -810,7 +864,7 @@ class OpQuery(OpCode):
     _PUseLocking,
     ("fields", ht.NoDefault, ht.TListOf(ht.TNonEmptyString),
      "Requested fields"),
-    ("filter", None, ht.TOr(ht.TNone, ht.TListOf),
+    ("qfilter", None, ht.TOr(ht.TNone, ht.TListOf),
      "Query filter"),
     ]
 
@@ -893,6 +947,8 @@ class OpNodeAdd(OpCode):
   OP_DSC_FIELD = "node_name"
   OP_PARAMS = [
     _PNodeName,
+    _PHvState,
+    _PDiskState,
     ("primary_ip", None, ht.NoType, "Primary IP address"),
     ("secondary_ip", None, ht.TMaybeString, "Secondary IP address"),
     ("readd", False, ht.TBool, "Whether node is re-added to cluster"),
@@ -961,6 +1017,8 @@ class OpNodeSetParams(OpCode):
   OP_PARAMS = [
     _PNodeName,
     _PForce,
+    _PHvState,
+    _PDiskState,
     ("master_candidate", None, ht.TMaybeBool,
      "Whether the node should become a master candidate"),
     ("offline", None, ht.TMaybeBool,
@@ -999,9 +1057,12 @@ class OpNodeMigrate(OpCode):
     _PMigrationMode,
     _PMigrationLive,
     _PMigrationTargetNode,
+    _PAllowRuntimeChgs,
+    _PIgnoreIpolicy,
     ("iallocator", None, ht.TMaybeString,
      "Iallocator for deciding the target node for shared-storage instances"),
     ]
+  OP_RESULT = TJobIdListOnly
 
 
 class OpNodeEvacuate(OpCode):
@@ -1012,7 +1073,7 @@ class OpNodeEvacuate(OpCode):
     _PNodeName,
     ("remote_node", None, ht.TMaybeString, "New secondary node"),
     ("iallocator", None, ht.TMaybeString, "Iallocator for computing solution"),
-    ("mode", ht.NoDefault, ht.TElemOf(constants.IALLOCATOR_NEVAC_MODES),
+    ("mode", ht.NoDefault, ht.TElemOf(constants.NODE_EVAC_MODES),
      "Node evacuation mode"),
     ]
   OP_RESULT = TJobIdListOnly
@@ -1038,11 +1099,9 @@ class OpInstanceCreate(OpCode):
     _PForceVariant,
     _PWaitForSync,
     _PNameCheck,
+    _PIgnoreIpolicy,
     ("beparams", ht.EmptyDict, ht.TDict, "Backend parameters for instance"),
-    ("disks", ht.NoDefault,
-     # TODO: Generate check from constants.IDISK_PARAMS_TYPES
-     ht.TListOf(ht.TDictOf(ht.TElemOf(constants.IDISK_PARAMS),
-                           ht.TOr(ht.TNonEmptyString, ht.TInt))),
+    ("disks", ht.NoDefault, ht.TListOf(_TDiskParams),
      "Disk descriptions, for example ``[{\"%s\": 100}, {\"%s\": 5}]``;"
      " each disk definition must contain a ``%s`` value and"
      " can contain an optional ``%s`` value denoting the disk access mode"
@@ -1174,6 +1233,7 @@ class OpInstanceReplaceDisks(OpCode):
   OP_PARAMS = [
     _PInstanceName,
     _PEarlyRelease,
+    _PIgnoreIpolicy,
     ("mode", ht.NoDefault, ht.TElemOf(constants.REPLACE_MODES),
      "Replacement mode"),
     ("disks", ht.EmptyList, ht.TListOf(ht.TPositiveInt),
@@ -1192,6 +1252,7 @@ class OpInstanceFailover(OpCode):
     _PShutdownTimeout,
     _PIgnoreConsistency,
     _PMigrationTargetNode,
+    _PIgnoreIpolicy,
     ("iallocator", None, ht.TMaybeString,
      "Iallocator for deciding the target node for shared-storage instances"),
     ]
@@ -1213,6 +1274,8 @@ class OpInstanceMigrate(OpCode):
     _PMigrationMode,
     _PMigrationLive,
     _PMigrationTargetNode,
+    _PAllowRuntimeChgs,
+    _PIgnoreIpolicy,
     ("cleanup", False, ht.TBool,
      "Whether a previously failed migration should be cleaned up"),
     ("iallocator", None, ht.TMaybeString,
@@ -1236,6 +1299,7 @@ class OpInstanceMove(OpCode):
   OP_PARAMS = [
     _PInstanceName,
     _PShutdownTimeout,
+    _PIgnoreIpolicy,
     ("target_node", ht.NoDefault, ht.TNonEmptyString, "Target node"),
     _PIgnoreConsistency,
     ]
@@ -1268,12 +1332,19 @@ class OpInstanceDeactivateDisks(OpCode):
 
 
 class OpInstanceRecreateDisks(OpCode):
-  """Deactivate an instance's disks."""
+  """Recreate an instance's disks."""
+  _TDiskChanges = \
+    ht.TAnd(ht.TIsLength(2),
+            ht.TItems([ht.Comment("Disk index")(ht.TPositiveInt),
+                       ht.Comment("Parameters")(_TDiskParams)]))
+
   OP_DSC_FIELD = "instance_name"
   OP_PARAMS = [
     _PInstanceName,
-    ("disks", ht.EmptyList, ht.TListOf(ht.TPositiveInt),
-     "List of disk indexes"),
+    ("disks", ht.EmptyList,
+     ht.TOr(ht.TListOf(ht.TPositiveInt), ht.TListOf(_TDiskChanges)),
+     "List of disk indexes (deprecated) or a list of tuples containing a disk"
+     " index and a possibly empty dictionary with disk parameter changes"),
     ("nodes", ht.EmptyList, ht.TListOf(ht.TNonEmptyString),
      "New instance nodes, if relocation is desired"),
     ]
@@ -1308,6 +1379,7 @@ class OpInstanceSetParams(OpCode):
     _PInstanceName,
     _PForce,
     _PForceVariant,
+    _PIgnoreIpolicy,
     # TODO: Use _TestNicDef
     ("nics", ht.EmptyList, ht.TList,
      "List of NIC changes. Each item is of the form ``(op, settings)``."
@@ -1317,6 +1389,7 @@ class OpInstanceSetParams(OpCode):
      (constants.DDM_ADD, constants.DDM_REMOVE)),
     ("disks", ht.EmptyList, ht.TList, "List of disk changes. See ``nics``."),
     ("beparams", ht.EmptyDict, ht.TDict, "Per-instance backend parameters"),
+    ("runtime_mem", None, ht.TMaybeStrictPositiveInt, "New runtime memory"),
     ("hvparams", ht.EmptyDict, ht.TDict,
      "Per-instance hypervisor parameters, hypervisor-dependent"),
     ("disk_template", None, ht.TOr(ht.TNone, _BuildDiskTemplateCheck(False)),
@@ -1328,6 +1401,10 @@ class OpInstanceSetParams(OpCode):
     ("osparams", None, ht.TMaybeDict, "Per-instance OS parameters"),
     ("wait_for_sync", True, ht.TBool,
      "Whether to wait for the disk to synchronize, when changing template"),
+    ("offline_inst", False, ht.TBool,
+     "Whether to turn off the down instance completely"),
+    ("online_inst", False, ht.TBool,
+     "Whether to enable the offline instance"),
     ]
   OP_RESULT = _TSetParamsResult
 
@@ -1366,6 +1443,11 @@ class OpGroupAdd(OpCode):
     _PGroupName,
     _PNodeGroupAllocPolicy,
     _PGroupNodeParams,
+    _PDiskParams,
+    _PHvState,
+    _PDiskState,
+    ("ipolicy", None, ht.TMaybeDict,
+     "Group-wide :ref:`instance policy <rapi-ipolicy>` specs"),
     ]
 
 
@@ -1396,6 +1478,10 @@ class OpGroupSetParams(OpCode):
     _PGroupName,
     _PNodeGroupAllocPolicy,
     _PGroupNodeParams,
+    _PDiskParams,
+    _PHvState,
+    _PDiskState,
+    ("ipolicy", None, ht.TMaybeDict, "Group-wide instance policy specs"),
     ]
   OP_RESULT = _TSetParamsResult