ganeti-os-interface(7) Ganeti | Version @GANETI_VERSION@
========================================================

Name
----

ganeti-os-interface - Specifications for guest OS types

DESCRIPTION
-----------

The method of supporting guest operating systems in Ganeti is to have,
for each guest OS type, a directory containing a number of required
files. This directory must be present across all nodes (Ganeti doesn't
replicate it) in order for the OS to be usable by Ganeti.


REFERENCE
---------

There are eight required files: *create*, *import*, *export*, *rename*,
*verify* (executables), *ganeti_api_version*, *variants.list* and
*parameters.list* (text files).

Common environment
~~~~~~~~~~~~~~~~~~

All commands will get their input via environment variables. A
common set of variables will be exported for all commands, and some
of them might have extra ones. Note that all counts are
zero-based.

Since Ganeti version 2.5, the environment will be cleaned up before
being passed to scripts, therefore they will not inherit the environment
in with which the ganeti node daemon was started. If you depend on any
environment variables (non-Ganeti), then you will need to define or
source them appropriately.

OS_API_VERSION
    The OS API version that the rest of the environment conforms to.

INSTANCE_NAME
    The instance name the script should operate on.

INSTANCE_OS, OS_NAME
    Both names point to the name of the instance's OS as Ganeti knows
    it. This can simplify the OS scripts by providing the same scripts
    under multiple names, and then the scripts can use this name to
    alter their behaviour.

    With OS API 15 changing the script behavior based on this variable
    is deprecated: OS_VARIANT should be used instead (see below).

OS_VARIANT
    The variant of the OS which should be installed. Each OS must
    support all variants listed under its variants.list file, and may
    support more. Any more supported variants should be properly
    documented in the per-OS documentation.

HYPERVISOR
    The hypervisor of this instance.

DISK_COUNT
    The number of disks the instance has. The actual disk definitions are
    in a set of additional variables. The instance's disk will be
    numbered from 0 to this value minus one.

DISK_%N_PATH
    The path to the storage for disk N of the instance. This might be
    either a block device or a regular file, in which case the OS
    scripts should use ``losetup`` (if they need to mount it). E.g. the
    first disk of the instance might be exported as
    ``DISK_0_PATH=/dev/drbd0``.

DISK_%N_ACCESS
    This is how the hypervisor will export the instance disks: either
    read-write (``rw``) or read-only (``ro``).

DISK_%N_UUID
    The uuid associated with the N-th disk of the instance.

DISK_%N_NAME
    (Optional) The name, if any, associated with the N-th disk of the instance.

DISK_%N_FRONTEND_TYPE
    (Optional) If applicable to the current hypervisor type: the type
    of the device exported by the hypervisor. For example, the Xen HVM
    hypervisor can export disks as either ``paravirtual`` or
    ``ioemu``.

DISK_%N_BACKEND_TYPE
    How files are visible on the node side. This can be either
    ``block`` (when using block devices) or ``file:type``, where
    ``type`` is either ``loop``, ``blktap`` or ``blktap2``, depending on how the
    hypervisor will be configured.  Note that not all backend types apply to all
    hypervisors.

NIC_COUNT
    Similar to the ``DISK_COUNT``, this represents the number of NICs
    of the instance.

NIC_%N_MAC
    The MAC address associated with this interface.

NIC_%N_UUID
    The uuid associated with the N-th NIC of the instance.

NIC_%N_NAME
    (Optional) The name, if any, associated with the N-th NIC of the instance.

NIC_%N_IP
    The IP address, if any, associated with the N-th NIC of the
    instance.

NIC_%N_MODE
    The NIC mode, routed, bridged or openvswitch

NIC_%N_BRIDGE
    The bridge to which this NIC will be attached. This variable is
    defined only when the NIC is in bridged mode.

NIC_%N_LINK
    In bridged or openvswitch mode, this is the interface to which the
    NIC will be attached (same as ``NIC_%N_BRIDGE`` for bridged). In
    routed mode it is the routing table which will be used by the
    hypervisor to insert the appropriate routes.

NIC_%N_FRONTEND_TYPE
    (Optional) If applicable, the type of the exported NIC to the
    instance, this can be one of: ``rtl8139``, ``ne2k_pci``,
    ``ne2k_isa``, ``paravirtual``.

NIC_%d_NETWORK_NAME
    (Optional) If a NIC network is specified, the network's name.

NIC_%d_NETWORK_UUID
    (Optional) If a NIC network is specified, the network's uuid.

NIC_%d_NETWORK_FAMILY
    (Optional) If a NIC network is specified, the network's family.

NIC_%d_NETWORK_SUBNET
    (Optional) If a NIC network is specified, the network's IPv4 subnet.

NIC_%d_NETWORK_GATEWAY
    (Optional) If a NIC network is specified, the network's IPv4
    gateway.

NIC_%d_NETWORK_SUBNET6
    (Optional) If a NIC network is specified, the network's IPv6 subnet.

NIC_%d_NETWORK_GATEWAY6
    (Optional) If a NIC network is specified, the network's IPv6
    gateway.

NIC_%d_NETWORK_MAC_PREFIX
    (Optional) If a NIC network is specified, the network's mac prefix.

NIC_%d_NETWORK_TAGS
    (Optional) If a NIC network is specified, the network's tags, space
    separated.

OSP_*name*
    Each OS parameter (see below) will be exported in its own
    variable, prefixed with ``OSP_``, and upper-cased. For example, a
    ``dhcp`` parameter will be exported as ``OSP_DHCP``.

DEBUG_LEVEL
    If non-zero, this should cause the OS script to generate verbose
    logs of its execution, for troubleshooting purposes. Currently
    only ``0`` and ``1`` are valid values.


EXECUTABLE SCRIPTS
------------------


create
~~~~~~

The **create** command is used for creating a new instance from
scratch. It has no additional environment variables bside the
common ones.

The ``INSTANCE_NAME`` variable denotes the name of the instance,
which is guaranteed to resolve to an IP address. The create script
should configure the instance according to this name. It can
configure the IP statically or not, depending on the deployment
environment.

The ``INSTANCE_REINSTALL`` variable is set to ``1`` when this create
request is reinstalling an existing instance, rather than creating
a new one. This can be used, for example, to preserve some data in the
old instance in an OS-specific way.

export
~~~~~~

This command is used in order to make a backup of a given disk of
the instance. The command should write to stdout a dump of the
given block device. The output of this program will be passed
during restore to the **import** command.

The specific disk to backup is denoted by two additional environment
variables: ``EXPORT_INDEX`` which denotes the index in the instance
disks structure (and could be used for example to skip the second disk
if not needed for backup) and ``EXPORT_DEVICE`` which has the same value
as ``DISK_N_PATH`` but is duplicated here for easier usage by shell
scripts (rather than parse the ``DISK_...`` variables).

To provide the user with an estimate on how long the export will take,
a predicted size can be written to the file descriptor passed in the
variable ``EXP_SIZE_FD``. The value is in bytes and must be terminated
by a newline character (``\n``). Older versions of Ganeti don't
support this feature, hence the variable should be checked before
use. Example::

    if test -n "$EXP_SIZE_FD"; then
      blockdev --getsize64 $blockdev >&$EXP_SIZE_FD
    fi

import
~~~~~~

The **import** command is used for restoring an instance from a
backup as done by **export**. The arguments are the similar to
those passed to **export**, whose output will be provided on
stdin.

The difference in variables is that the current disk is denoted by
``IMPORT_DEVICE`` and ``IMPORT_INDEX`` (instead of ``EXPORT_...``).

rename
~~~~~~

This command is used in order to perform a rename at the instance
OS level, after the instance has been renamed in Ganeti. The
command should do whatever steps are required to ensure that the
instance is updated to use the new name, if the operating system
supports it.

Note that it is acceptable for the rename script to do nothing at
all, however be warned that in this case, there will be a
desynchronization between what gnt-instance list shows you and the
actual hostname of the instance.

The script will be passed one additional environment variable
called ``OLD_INSTANCE_NAME`` which holds the old instance name. The
``INSTANCE_NAME`` variable holds the new instance name.

A very simple rename script should at least change the hostname and
IP address of the instance, leaving the administrator to update the
other services.

verify
~~~~~~

The *verify* script is used to verify consistency of the OS parameters
(see below). The command should take one or more arguments denoting
what checks should be performed, and return a proper exit code
depending on whether the validation failed or succeeded.

Currently (API version 20), only one parameter is supported:
``parameters``. This should validate the ``OSP_`` variables from the
environment, and output diagnostic messages in case the validation
fails.

For the ``dhcp`` parameter given as example above, a verification
script could be:

.. code-block:: bash

    #!/bin/sh

    case $OSP_DHCP in
      ""|yes|no)
          ;;
      *)
        echo "Invalid value '$OSP_DHCP' for the dhcp parameter" 1>&2
        exit 1;
        ;;
    esac

    exit 0


TEXT FILES
----------


ganeti_api_version
~~~~~~~~~~~~~~~~~~

The ganeti_api_version file is a plain text file containing the
version(s) of the guest OS API that this OS definition complies
with, one per line. The version documented by this man page is 20,
so this file must contain the number 20 followed by a newline if
only this version is supported. A script compatible with more than
one Ganeti version should contain the most recent version first
(i.e. 20), followed by the old version(s) (in this case 15 and/or
10).

variants.list
~~~~~~~~~~~~~

variants.list is a plain text file containing all the declared supported
variants for this OS, one per line. If this file is missing or empty,
then the OS won't be considered to support variants.

Empty lines and lines starting with a hash (``#``) are ignored.

parameters.list
~~~~~~~~~~~~~~~

This file declares the parameters supported by the OS, one parameter
per line, with name and description (space and/or tab separated). For
example::

    dhcp Whether to enable (yes) or disable (no) dhcp
    root_size The size of the root partition, in GiB

The parameters can then be used in instance add or modification, as
follows::

    # gnt-instance add -O dhcp=no,root_size=8 ...


NOTES
-----

Backwards compatibility
~~~~~~~~~~~~~~~~~~~~~~~

Ganeti 2.3 and up is compatible with API versions 10, 15 and 20. The OS
parameters and related scripts (verify) are only supported in
version 20. The variants functionality (variants.list, and OS_VARIANT
env. var) are supported/present only in version 15 and up.

Common behaviour
~~~~~~~~~~~~~~~~

All the scripts should display an usage message when called with a
wrong number of arguments or when the first argument is ``-h`` or
``--help``.

Upgrading from old versions
~~~~~~~~~~~~~~~~~~~~~~~~~~~

Version 15 to 20
^^^^^^^^^^^^^^^^

The ``parameters.list`` file and ``verify`` script have been
added. For no parameters, an empty parameters file and an empty verify
script which returns success can be used.

Version 10 to 15
^^^^^^^^^^^^^^^^

The ``variants.list`` file has been added, so OSes should support at
least one variant, declaring it in that file and must be prepared to
parse the OS_VARIANT environment variable. OSes are free to support more
variants than just the declared ones. Note that this file is optional;
without it, the variants functionality is disabled.

Version 5 to 10
^^^^^^^^^^^^^^^

The method for passing data has changed from command line options
to environment variables, so scripts should be modified to use
these. For an example of how this can be done in a way compatible
with both versions, feel free to look at the debootstrap instance's
common.sh auxiliary script.

Also, instances can have now a variable number of disks, not only
two, and a variable number of NICs (instead of fixed one), so the
scripts should deal with this. The biggest change is in the
import/export, which are called once per disk, instead of once per
instance.

Version 4 to 5
^^^^^^^^^^^^^^

The rename script has been added. If you don't want to do any
changes on the instances after a rename, you can migrate the OS
definition to version 5 by creating the rename script simply as:

.. code-block:: bash

    #!/bin/sh

    exit 0

Note that the script must be executable.

.. vim: set textwidth=72 :
.. Local Variables:
.. mode: rst
.. fill-column: 72
.. End:
