diff --git a/doc/design-multi-reloc.rst b/doc/design-multi-reloc.rst index f4b581c9ef9b6962545d88e0e375471ec9a6928c..4f8efe0916147b20a2871d13ede1fb2efb382987 100644 --- a/doc/design-multi-reloc.rst +++ b/doc/design-multi-reloc.rst @@ -23,38 +23,39 @@ groups so that, for example, it is possible to move a set of instances to another group for policy reasons, or completely empty a given group to perform maintenance operations. -To implement this, we propose a new ``multi-relocate`` IAllocator call -that will be able to compute inter-group instance moves, taking into -account mobility domains as appropriate. The interface proposed below -should be enough to cover the use cases mentioned above. +To implement this, we propose the addition of new IAllocator calls to +compute inter-group instance moves and group-aware node evacuation, +taking into account mobility domains as appropriate. The interface +proposed below should be enough to cover the use cases mentioned above. + +With the implementation of this design proposal, the previous +``multi-evacuate`` mode will be deprecated. .. _multi-reloc-detailed-design: Detailed design =============== -We introduce a new ``multi-relocate`` IAllocator call whose input will -be a list of instances to move, and a "mode of operation" that will -determine what groups will be candidates to receive the new instances. - -The mode of operation will be one of: +All requests honor the groups' ``alloc_policy`` attribute. -- *Stay in group*: the instances will be moved off their current nodes, - but will stay in the same group; this is what the ``relocate`` call - does, but here it can act on multiple instances. (Typically, the - source nodes will be marked as drained, to avoid just exchanging - instances among them.) +Changing instance's groups +-------------------------- -- *Change group*: this mode accepts one extra parameter, a list of node - group UUIDs; the instances will be moved away from their current - group, to any of the groups in this list. If the list is empty, the - request is, simply, "change group": the instances are placed in any - group but their original one. +Takes a list of instances and a list of node group UUIDs; the instances +will be moved away from their current group, to any of the groups in the +target list. All instances need to have their primary node in the same +group, which may not be a target group. If the target group list is +empty, the request is simply "change group" and the instances are placed +in any group but their original one. -- *Any*: for each instance, any group is valid, including its current - one. +Node evacuation +--------------- -In all modes, the groups' ``alloc_policy`` attribute will be honored. +Evacuates instances off their primary nodes. The evacuation mode +can be given as ``primary-only``, ``secondary-only`` or +``all``. The call is given a list of instances whose primary nodes need +to be in the same node group. The returned nodes need to be in the same +group as the original primary node. .. _multi-reloc-result: @@ -66,8 +67,17 @@ of **replace secondary**, **migration** and **failover** operations (when shared storage is used, they will all be failover or migration operations within the corresponding mobility domain). -The result is expected to be a list of jobsets. Each jobset contains -lists of serialized opcodes. Example:: +The result of the operations described above must contain two lists of +instances and a list of jobsets. + +The two lists of instances describe which instances could be +moved/migrated and which couldn't for some reason ("unsuccessful"). The +union of the two lists must be equal to the set of instances given in +the original request. + +The list of jobsets contained in the result describe how to actually +execute the operation. Each jobset contains lists of serialized opcodes. +Example:: [ [ @@ -101,8 +111,8 @@ Accepted opcodes: Starting with the first set, Ganeti will submit all jobs of a set at the same time, enabling execution in parallel. Upon completion of all jobs in a set, the process is repeated for the next one. Ganeti is at liberty -to abort the execution of the relocation after any jobset. In such a -case the user is notified and can restart the relocation. +to abort the execution after any jobset. In such a case the user is +notified and can restart the operation. .. vim: set textwidth=72 : .. Local Variables: diff --git a/doc/iallocator.rst b/doc/iallocator.rst index 6ecd62696d617e704a8cc44bc7a90ae52c6dc664..e8c371604b5ee6802368ca2dde67d8665a0ba5e7 100644 --- a/doc/iallocator.rst +++ b/doc/iallocator.rst @@ -1,7 +1,7 @@ Ganeti automatic instance allocation ==================================== -Documents Ganeti version 2.1 +Documents Ganeti version 2.4 .. contents:: @@ -193,11 +193,17 @@ In all cases, it includes: ``multi-relocate`` or ``multi-evacuate``. The ``allocate`` request is used when a new instance needs to be placed on the cluster. The ``relocate`` request is used when an existing instance needs to be - moved within its node group, while the ``multi-relocate`` one is - able to relocate multiple instances across multiple node groups. The - ``multi-evacuate`` protocol requests that the script computes the - optimal relocate solution for all secondary instances of the given - nodes. + moved within its node group. + + The ``multi-evacuate`` protocol used to request that the script + computes the optimal relocate solution for all secondary instances + of the given nodes. It is now deprecated and should no longer be + used. + + The ``change-group`` request is used to relocate multiple instances + across multiple node groups. ``node-evacuate`` evacuates instances + off their node(s). These are described in a separate :ref:`design + document <multi-reloc-detailed-design>`. For both allocate and relocate mode, the following extra keys are needed in the ``request`` dictionary: @@ -276,23 +282,26 @@ Relocation: Ganeti 2.0, this list will always contain a single node, the current secondary of the instance); type *list of strings* -As for ``multi-relocate``, it needs the three following request -arguments: +As for ``node-evacuate``, it needs the following request arguments: instances - a list of instance names to relocate; type *list of strings* + a list of instance names to evacuate; type *list of strings* + + evac_mode + specify which instances to evacuate; one of ``primary-only``, + ``secondary-only``, ``all``, type *string* - reloc_mode - a string indicating the relocation mode; there are three possible - values for this string: *keep_group*, *change_group*, and - *any_group*, the semantics or which are explained in :ref:`the - design document <multi-reloc-detailed-design>` + +``change-group`` needs the following request arguments: + + instances + a list of instance names whose group to change; type + *list of strings* target_groups - this argument is only accepted when ``reloc_mode``, as explained - above, is *change_group*; if present, it must either be the empty - list, or contain a list of group UUIDs that should be considered for - relocating instances to; type *list of strings* + must either be the empty list, or contain a list of group UUIDs that + should be considered for relocating instances to; type + *list of strings* Finally, in the case of multi-evacuate, there's one single request argument (in addition to ``type``):