X-Git-Url: https://code.grnet.gr/git/ganeti-local/blobdiff_plain/1ce03fb1f2453e8a55941bcc95ab9c934a631fd1..bc5d0215:/lib/opcodes.py?ds=sidebyside diff --git a/lib/opcodes.py b/lib/opcodes.py index e00d651..73c9564 100644 --- a/lib/opcodes.py +++ b/lib/opcodes.py @@ -31,12 +31,12 @@ 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 -import operator +from ganeti import compat from ganeti import constants from ganeti import errors from ganeti import ht @@ -128,6 +128,25 @@ _PMigrationTargetNode = ("target_node", None, ht.TMaybeString, _PStartupPaused = ("startup_paused", False, ht.TBool, "Pause instance at startup") +_PVerbose = ("verbose", False, ht.TBool, "Verbose mode") + +# Parameters for cluster verification +_PDebugSimulateErrors = ("debug_simulate_errors", False, ht.TBool, + "Whether to simulate errors (useful for debugging)") +_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") #: OP_ID conversion regular expression _OPID_RE = re.compile("([a-z])([A-Z])") @@ -135,7 +154,7 @@ _OPID_RE = re.compile("([a-z])([A-Z])") #: Utility function for L{OpClusterSetParams} _TestClusterOsList = ht.TOr(ht.TNone, ht.TListOf(ht.TAnd(ht.TList, ht.TIsLength(2), - ht.TMap(ht.WithDesc("GetFirstItem")(operator.itemgetter(0)), + ht.TMap(ht.WithDesc("GetFirstItem")(compat.fst), ht.TElemOf(constants.DDMS_VALUES))))) @@ -144,6 +163,15 @@ _TestClusterOsList = ht.TOr(ht.TNone, _TestNicDef = ht.TDictOf(ht.TElemOf(constants.INIC_PARAMS), ht.TOr(ht.TNone, ht.TNonEmptyString)) +_TSetParamsResultItemItems = [ + ht.Comment("name of changed parameter")(ht.TNonEmptyString), + ht.Comment("new value")(ht.TAny), + ] + +_TSetParamsResult = \ + ht.TListOf(ht.TAnd(ht.TIsLength(len(_TSetParamsResultItemItems)), + ht.TItems(_TSetParamsResultItemItems))) + _SUMMARY_PREFIX = { "CLUSTER_": "C_", "GROUP_": "G_", @@ -219,8 +247,20 @@ def _CheckFileStorage(value): return True -_CheckDiskTemplate = ht.TAnd(ht.TElemOf(constants.DISK_TEMPLATES), - _CheckFileStorage) +def _BuildDiskTemplateCheck(accept_none): + """Builds check for disk template. + + @type accept_none: bool + @param accept_none: whether to accept None as a correct value + @rtype: callable + + """ + template_check = ht.TElemOf(constants.DISK_TEMPLATES) + + if accept_none: + template_check = ht.TOr(template_check, ht.TNone) + + return ht.TAnd(template_check, _CheckFileStorage) def _CheckStorageType(storage_type): @@ -281,7 +321,7 @@ class BaseOpCode(object): field handling. """ - # pylint: disable-msg=E1101 + # pylint: disable=E1101 # as OP_ID is dynamically defined __metaclass__ = _AutoOpParamSlots @@ -420,7 +460,18 @@ def _BuildJobDepCheck(relative): TNoRelativeJobDependencies = _BuildJobDepCheck(False) #: List of submission status and job ID as returned by C{SubmitManyJobs} -TJobIdList = ht.TListOf(ht.TItems([ht.TBool, ht.TOr(ht.TString, ht.TJobId)])) +_TJobIdListItem = \ + ht.TAnd(ht.TIsLength(2), + ht.TItems([ht.Comment("success")(ht.TBool), + ht.Comment("Job ID if successful, error message" + " otherwise")(ht.TOr(ht.TString, + ht.TJobId))])) +TJobIdList = ht.TListOf(_TJobIdListItem) + +#: Result containing only list of submitted jobs +TJobIdListOnly = ht.TStrictDict(True, True, { + constants.JOB_IDS_KEY: ht.Comment("List of submitted jobs")(TJobIdList), + }) class OpCode(BaseOpCode): @@ -444,7 +495,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 = [ @@ -564,15 +615,32 @@ class OpClusterQuery(OpCode): """Query cluster information.""" +class OpClusterVerify(OpCode): + """Submits all jobs necessary to verify the cluster. + + """ + OP_PARAMS = [ + _PDebugSimulateErrors, + _PErrorCodes, + _PSkipChecks, + _PIgnoreErrors, + _PVerbose, + ("group_name", None, ht.TMaybeString, "Group to verify") + ] + OP_RESULT = TJobIdListOnly + + class OpClusterVerifyConfig(OpCode): """Verify the cluster config. """ OP_PARAMS = [ - ("verbose", False, ht.TBool, None), - ("error_codes", False, ht.TBool, None), - ("debug_simulate_errors", False, ht.TBool, None), + _PDebugSimulateErrors, + _PErrorCodes, + _PIgnoreErrors, + _PVerbose, ] + OP_RESULT = ht.TBool class OpClusterVerifyGroup(OpCode): @@ -587,22 +655,21 @@ class OpClusterVerifyGroup(OpCode): """ OP_DSC_FIELD = "group_name" OP_PARAMS = [ - ("group_name", ht.NoDefault, ht.TNonEmptyString, None), - ("skip_checks", ht.EmptyList, - ht.TListOf(ht.TElemOf(constants.VERIFY_OPTIONAL_CHECKS)), None), - ("verbose", False, ht.TBool, None), - ("error_codes", False, ht.TBool, None), - ("debug_simulate_errors", False, ht.TBool, None), + _PGroupName, + _PDebugSimulateErrors, + _PErrorCodes, + _PSkipChecks, + _PIgnoreErrors, + _PVerbose, ] + OP_RESULT = ht.TBool class OpClusterVerifyDisks(OpCode): """Verify the cluster disks. """ - OP_RESULT = ht.TStrictDict(True, True, { - constants.JOB_IDS_KEY: TJobIdList, - }) + OP_RESULT = TJobIdListOnly class OpGroupVerifyDisks(OpCode): @@ -631,7 +698,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): @@ -701,6 +769,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, @@ -723,6 +792,8 @@ class OpClusterSetParams(OpCode): "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, @@ -733,6 +804,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"), ] @@ -742,19 +815,33 @@ 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" OP_PARAMS = [ _PQueryWhat, + _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"), ] @@ -766,6 +853,7 @@ class OpQueryFields(OpCode): @ivar fields: List of fields to retrieve """ + OP_DSC_FIELD = "what" OP_PARAMS = [ _PQueryWhat, ("fields", None, ht.TOr(ht.TNone, ht.TListOf(ht.TNonEmptyString)), @@ -922,6 +1010,7 @@ class OpNodeSetParams(OpCode): ("powered", None, ht.TMaybeBool, "Whether the node should be marked as powered"), ] + OP_RESULT = _TSetParamsResult class OpNodePowercycle(OpCode): @@ -944,6 +1033,7 @@ class OpNodeMigrate(OpCode): ("iallocator", None, ht.TMaybeString, "Iallocator for deciding the target node for shared-storage instances"), ] + OP_RESULT = TJobIdListOnly class OpNodeEvacuate(OpCode): @@ -954,9 +1044,10 @@ 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 # instance opcodes @@ -991,7 +1082,8 @@ class OpInstanceCreate(OpCode): (constants.IDISK_SIZE, constants.IDISK_SIZE, constants.IDISK_SIZE, constants.IDISK_MODE, " or ".join("``%s``" % i for i in sorted(constants.DISK_ACCESS_SET)))), - ("disk_template", ht.NoDefault, _CheckDiskTemplate, "Disk template"), + ("disk_template", ht.NoDefault, _BuildDiskTemplateCheck(True), + "Disk template"), ("file_driver", None, ht.TOr(ht.TNone, ht.TElemOf(constants.FILE_DRIVER)), "Driver for file-backed disks"), ("file_storage_dir", None, ht.TMaybeString, @@ -1032,6 +1124,7 @@ class OpInstanceCreate(OpCode): ("start", True, ht.TBool, "Whether to start instance after creation"), ("tags", ht.EmptyList, ht.TListOf(ht.TNonEmptyString), "Instance tags"), ] + OP_RESULT = ht.Comment("instance nodes")(ht.TListOf(ht.TNonEmptyString)) class OpInstanceReinstall(OpCode): @@ -1064,6 +1157,7 @@ class OpInstanceRename(OpCode): ("new_name", ht.NoDefault, ht.TNonEmptyString, "New instance name"), ("ip_check", False, ht.TBool, _PIpCheckDoc), ] + OP_RESULT = ht.Comment("New instance name")(ht.TNonEmptyString) class OpInstanceStartup(OpCode): @@ -1206,7 +1300,7 @@ class OpInstanceDeactivateDisks(OpCode): class OpInstanceRecreateDisks(OpCode): - """Deactivate an instance's disks.""" + """Recreate an instance's disks.""" OP_DSC_FIELD = "instance_name" OP_PARAMS = [ _PInstanceName, @@ -1257,7 +1351,7 @@ class OpInstanceSetParams(OpCode): ("beparams", ht.EmptyDict, ht.TDict, "Per-instance backend parameters"), ("hvparams", ht.EmptyDict, ht.TDict, "Per-instance hypervisor parameters, hypervisor-dependent"), - ("disk_template", None, ht.TOr(ht.TNone, _CheckDiskTemplate), + ("disk_template", None, ht.TOr(ht.TNone, _BuildDiskTemplateCheck(False)), "Disk template for instance"), ("remote_node", None, ht.TMaybeString, "Secondary node (used when changing disk template)"), @@ -1266,7 +1360,12 @@ 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 class OpInstanceGrowDisk(OpCode): @@ -1281,6 +1380,19 @@ class OpInstanceGrowDisk(OpCode): ] +class OpInstanceChangeGroup(OpCode): + """Moves an instance to another node group.""" + OP_DSC_FIELD = "instance_name" + OP_PARAMS = [ + _PInstanceName, + _PEarlyRelease, + ("iallocator", None, ht.TMaybeString, "Iallocator for computing solution"), + ("target_groups", None, ht.TOr(ht.TNone, ht.TListOf(ht.TNonEmptyString)), + "Destination group names or UUIDs (defaults to \"all but current group\""), + ] + OP_RESULT = TJobIdListOnly + + # Node group opcodes class OpGroupAdd(OpCode): @@ -1290,6 +1402,7 @@ class OpGroupAdd(OpCode): _PGroupName, _PNodeGroupAllocPolicy, _PGroupNodeParams, + _PDiskParams, ] @@ -1320,7 +1433,9 @@ class OpGroupSetParams(OpCode): _PGroupName, _PNodeGroupAllocPolicy, _PGroupNodeParams, + _PDiskParams, ] + OP_RESULT = _TSetParamsResult class OpGroupRemove(OpCode): @@ -1337,6 +1452,7 @@ class OpGroupRename(OpCode): _PGroupName, ("new_name", ht.NoDefault, ht.TNonEmptyString, "New group name"), ] + OP_RESULT = ht.Comment("New group name")(ht.TNonEmptyString) class OpGroupEvacuate(OpCode): @@ -1349,6 +1465,7 @@ class OpGroupEvacuate(OpCode): ("target_groups", None, ht.TOr(ht.TNone, ht.TListOf(ht.TNonEmptyString)), "Destination group names or UUIDs"), ] + OP_RESULT = TJobIdListOnly # OS opcodes @@ -1470,6 +1587,7 @@ class OpTagsDel(OpCode): ("name", ht.NoDefault, ht.TMaybeString, None), ] + # Test opcodes class OpTestDelay(OpCode): """Sleeps for a configured amount of time. @@ -1529,8 +1647,6 @@ class OpTestAllocator(OpCode): ("vcpus", None, ht.TOr(ht.TNone, ht.TPositiveInt), None), ("os", None, ht.TMaybeString, None), ("disk_template", None, ht.TMaybeString, None), - ("evac_nodes", None, ht.TOr(ht.TNone, ht.TListOf(ht.TNonEmptyString)), - None), ("instances", None, ht.TOr(ht.TNone, ht.TListOf(ht.TNonEmptyString)), None), ("evac_mode", None,