Merge branch 'stable-2.8' into master
[ganeti-local] / doc / iallocator.rst
index dfdcd69..15254cc 100644 (file)
@@ -1,7 +1,7 @@
 Ganeti automatic instance allocation
 ====================================
 
-Documents Ganeti version 2.1
+Documents Ganeti version 2.9
 
 .. contents::
 
@@ -41,7 +41,7 @@ using the first one whose filename matches the one given by the user.
 Command line interface changes
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-The node selection options in instanece add and instance replace disks
+The node selection options in instance add and instance replace disks
 can be replace by the new ``--iallocator=NAME`` option (shortened to
 ``-I``), which will cause the auto-assignement of nodes with the
 passed iallocator. The selected node(s) will be show as part of the
@@ -90,6 +90,10 @@ cluster_tags
 enabled_hypervisors
   the list of enabled hypervisors
 
+ipolicy
+  the cluster-wide instance policy (for information; the per-node group
+  values take precedence and should be used instead)
+
 request
   a dictionary containing the details of the request; the keys vary
   depending on the type of operation that's being requested, as
@@ -105,13 +109,19 @@ nodegroups
   alloc_policy
     the allocation policy of the node group (consult the semantics of
     this attribute in the :manpage:`gnt-group(8)` manpage)
+  networks
+    the list of network UUID's this node group is connected to
+  ipolicy
+    the instance policy of the node group
+  tags
+    the list of node group tags
 
 instances
   a dictionary with the data for the current existing instance on the
   cluster, indexed by instance name; the contents are similar to the
   instance definitions for the allocate mode, with the addition of:
 
-  admin_up
+  admin_state
     if this instance is set to run (but not the actual status of the
     instance)
 
@@ -189,13 +199,27 @@ follows.
 In all cases, it includes:
 
   type
-    the request type; this can be either ``allocate``, ``relocate`` or
-    ``multi-evacuate``; the ``allocate`` request is used when a new
-    instance needs to be placed on the cluster, while the ``relocate``
-    request is used when an existing instance needs to be moved within
-    the cluster; the ``multi-evacuate`` protocol requests that the
-    script computes the optimal relocate solution for all secondary
-    instances of the given nodes
+    the request type; this can be either ``allocate``, ``relocate``,
+    ``change-group`` or ``node-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.
+
+    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 needs only be
+    implemented if backwards compatibility with Ganeti 2.4 and lower is
+    needed.
+
+    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>`.
+
+    The ``multi-allocate`` request is used to allocate multiple
+    instances on the cluster. The request is beside of that very
+    similiar to the ``allocate`` one. For more details look at
+    :doc:`Ganeti bulk create <design-bulk-create>`.
 
 For both allocate and relocate mode, the following extra keys are needed
 in the ``request`` dictionary:
@@ -203,19 +227,24 @@ in the ``request`` dictionary:
   name
     the name of the instance; if the request is a realocation, then this
     name will be found in the list of instances (see below), otherwise
-    is the FQDN of the new instance
+    is the FQDN of the new instance; type *string*
 
   required_nodes
     how many nodes should the algorithm return; while this information
     can be deduced from the instace's disk template, it's better if
     this computation is left to Ganeti as then allocator scripts are
-    less sensitive to changes to the disk templates
+    less sensitive to changes to the disk templates; type *integer*
 
   disk_space_total
     the total disk space that will be used by this instance on the
     (new) nodes; again, this information can be computed from the list
     of instance disks and its template type, but Ganeti is better
-    suited to compute it
+    suited to compute it; type *integer*
+
+.. pyassert::
+
+   constants.DISK_ACCESS_SET == set([constants.DISK_RDONLY,
+     constants.DISK_RDWR])
 
 Allocation needs, in addition:
 
@@ -224,7 +253,8 @@ Allocation needs, in addition:
     instance (in the order they are exported to the hypervisor):
 
     mode
-      either ``r`` or ``w`` denoting if the disk is read-only or
+      either :pyeval:`constants.DISK_RDONLY` or
+      :pyeval:`constants.DISK_RDWR` denoting if the disk is read-only or
       writable
 
     size
@@ -264,15 +294,36 @@ Allocation needs, in addition:
 Relocation:
 
   relocate_from
-     a list of nodes to move the instance away from (note that with
-     Ganeti 2.0, this list will always contain a single node, the
-     current secondary of the instance)
+     a list of nodes to move the instance away from; for DRBD-based
+     instances, this will contain a single node, the current secondary
+     of the instance, whereas for shared-storage instance, this will
+     contain also a single node, the current primary of the instance;
+     type *list of strings*
+
+As for ``node-evacuate``, it needs the following request arguments:
+
+  instances
+    a list of instance names to evacuate; type *list of strings*
 
-In the case of multi-evacuate, there's one single request argument (in
-addition to ``type``):
+  evac_mode
+    specify which instances to evacuate; one of ``primary-only``,
+    ``secondary-only``, ``all``, type *string*
 
-  evac_nodes
-    the names of the nodes to be evacuated
+``change-group`` needs the following request arguments:
+
+  instances
+    a list of instance names whose group to change; type
+    *list of strings*
+
+  target_groups
+    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*
+
+``multi-allocate`` needs the following request arguments:
+
+  instances
+    a list of request dicts
 
 Response message
 ~~~~~~~~~~~~~~~~
@@ -296,8 +347,16 @@ result
   entry in the input message, otherwise Ganeti will consider the result
   as failed
 
-  for multi-evacuation mode, this is a list of lists; each element of
-  the list is a list of instance name and the new secondary node
+  for the ``node-evacuate`` and ``change-group`` modes, this is a
+  dictionary containing, among other information, a list of lists of
+  serialized opcodes; see the :ref:`design document
+  <multi-reloc-result>` for a detailed description
+
+  for the ``multi-allocate`` mode this is a tuple of 2 lists, the first
+  being element of the tuple is a list of succeeded allocation, with the
+  instance name as first element of each entry and the node placement in
+  the second. The second element of the tuple is the instance list of
+  failed allocations.
 
 .. note:: Current Ganeti version accepts either ``result`` or ``nodes``
    as a backwards-compatibility measure (older versions only supported
@@ -322,7 +381,42 @@ time, but not included in further examples below)::
     "nodegroups": {
       "f4e06e0d-528a-4963-a5ad-10f3e114232d": {
         "name": "default",
-        "alloc_policy": "preferred"
+        "alloc_policy": "preferred",
+        "networks": ["net-uuid-1", "net-uuid-2"],
+        "ipolicy": {
+          "disk-templates": ["drbd", "plain"],
+          "minmax": [
+            {
+              "max": {
+                "cpu-count": 2,
+                "disk-count": 8,
+                "disk-size": 2048,
+                "memory-size": 12800,
+                "nic-count": 8,
+                "spindle-use": 8
+              },
+              "min": {
+                "cpu-count": 1,
+                "disk-count": 1,
+                "disk-size": 1024,
+                "memory-size": 128,
+                "nic-count": 1,
+                "spindle-use": 1
+              }
+            }
+          ],
+          "spindle-ratio": 32.0,
+          "std": {
+            "cpu-count": 1,
+            "disk-count": 1,
+            "disk-size": 1024,
+            "memory-size": 128,
+            "nic-count": 1,
+            "spindle-use": 1
+          },
+          "vcpu-ratio": 4.0
+        },
+        "tags": ["ng-tag-1", "ng-tag-2"]
       }
     },
     "instances": {
@@ -466,19 +560,6 @@ Input message, reallocation::
     }
   }
 
-Input message, node evacuation::
-
-  {
-    "version": 2,
-    ...
-    "request": {
-      "type": "multi-evacuate",
-      "evac_nodes": [
-        "node2"
-      ],
-    }
-  }
-
 
 Response messages
 ~~~~~~~~~~~~~~~~~
@@ -539,10 +620,9 @@ Command line messages
 Reference implementation
 ~~~~~~~~~~~~~~~~~~~~~~~~
 
-Ganeti's default iallocator is "hail" which is part of the separate
-ganeti-htools project. In order to see its source code please clone
-``git://git.ganeti.org/htools.git``. Note that htools is implemented
-using the Haskell programming language.
+Ganeti's default iallocator is "hail" which is available when "htools"
+components have been enabled at build time (see :doc:`install-quick` for
+more details).
 
 .. vim: set textwidth=72 :
 .. Local Variables: