News
====


Version 2.10.7
--------------

*(Released Thu, 7 Aug 2014)*

Important security release. In 2.10.0, the
'gnt-cluster upgrade' command was introduced. Before
performing an upgrade, the configuration directory of
the cluster is backed up. Unfortunately, the archive was
written with permissions that make it possible for
non-privileged users to read the archive and thus have
access to cluster and RAPI keys. After this release,
the archive will be created with privileged access only.

We strongly advise you to restrict the permissions of
previously created archives. The archives are found in
/var/lib/ganeti*.tar (unless otherwise configured with
--localstatedir or --with-backup-dir).

If you suspect that non-privileged users have accessed
your archives already, we advise you to renew the
cluster's crypto keys using 'gnt-cluster renew-crypto'
and to reset the RAPI credentials by editing
/var/lib/ganeti/rapi_users (respectively under a
different path if configured differently with
--localstatedir).

Other changes included in this release:

- Fix handling of Xen instance states.
- Fix NIC configuration with absent NIC VLAN
- Adapt relative path expansion in PATH to new environment
- Exclude archived jobs from configuration backups
- Fix RAPI for split query setup
- Allow disk hot-remove even with chroot or SM

Inherited from the 2.9 branch:

- Make htools tolerate missing 'spfree' on luxi


Version 2.10.6
--------------

*(Released Mon, 30 Jun 2014)*

- Make Ganeti tolerant towards differnt openssl library
  version on different nodes (issue 853).
- Allow hspace to make useful predictions in multi-group
  clusters with one group overfull (isse 861).
- Various gnt-network related fixes.
- Fix disk hotplug with userspace access.
- Various documentation errors fixed.


Version 2.10.5
--------------

*(Released Mon, 2 Jun 2014)*

- Two new options have been added to gnt-group evacuate.
  The 'sequential' option forces all the evacuation steps to
  be carried out sequentially, thus avoiding congestion on a
  slow link between node groups. The 'force-failover' option
  disallows migrations and forces failovers to be used instead.
  In this way evacuation to a group with vastly differnet
  hypervisor is possible.
- In tiered allocation, when looking for ways on how to shrink
  an instance, the canoncial path is tried first, i.e., in each
  step reduce on the resource most placements are blocked on. Only
  if no smaller fitting instance can be found shrinking a single
  resource till fit is tried.
- For finding the placement of an instance, the duplicate computations
  in the computation of the various cluster scores are computed only
  once. This significantly improves the performance of hspace for DRBD
  on large clusters; for other clusters, a slight performance decrease
  might occur. Moreover, due to the changed order, floating point
  number inaccuracies accumulate differently, thus resulting in different
  cluster scores. It has been verified that the effect of these different
  roundings is less than 1e-12.
- network queries fixed with respect to instances
- relax too strict prerequisite in LUClusterSetParams for DRBD helpers
- VArious improvements to QA and build-time tests


Version 2.10.4
--------------

*(Released Thu, 15 May 2014)*

- Support restricted migration in hbal
- Fix for the --shared-file-storage-dir of gnt-cluster modify (issue 811)
- Fail in replace-disks if attaching disks fails (issue 814)
- Set IFF_ONE_QUEUE on created tap interfaces for KVM
- Small fixes and enhancements in the build system
- Various documentation fixes (e.g. issue 810)


Version 2.10.3
--------------

*(Released Wed, 16 Apr 2014)*

- Fix filtering of pending jobs with -o id (issue 778)
- Make RAPI API calls more symmetric (issue 770)
- Make parsing of old cluster configuration more robust (issue 783)
- Fix wrong output of gnt-instance info after migrations
- Fix reserved PCI slots for KVM hotplugging
- Use runtime hypervisor parameters to calculate bockdevice options for KVM
- Fix high node daemon load during disk sync if the sync is paused manually
  (issue 792)
- Improve opportunistic locking during instance creation (issue 791)

Inherited from the 2.9 branch:

- Make watcher submit queries low priority (issue 772)
- Add reason parameter to RAPI client functions (issue 776)
- Fix failing gnt-node list-drbd command (issue 777)
- Properly display fake job locks in gnt-debug.
- small fixes in documentation


Version 2.10.2
--------------

*(Released Mon, 24 Mar 2014)*

- Fix conflict between virtio + spice or soundhw (issue 757)
- accept relative paths in gnt-cluster copyfile (issue 754)
- Introduce shutdown timeout for 'xm shutdown' command
- Improve RAPI detection of the watcher (issue 752)


Version 2.10.1
--------------

*(Released Wed, 5 Mar 2014)*

- Fix incorrect invocation of hooks on offline nodes (issue 742)
- Fix incorrect exit code of gnt-cluster verify in certain circumstances
  (issue 744)

Inherited from the 2.9 branch:

- Fix overflow problem in hbal that caused it to break when waiting for
  jobs for more than 10 minutes (issue 717)
- Make hbal properly handle non-LVM storage
- Properly export and import NIC parameters, and do so in a backwards
  compatible way (issue 716)
- Fix net-common script in case of routed mode (issue 728)
- Improve documentation (issues 724, 730)


Version 2.10.0
--------------

*(Released Thu, 20 Feb 2014)*

Incompatible/important changes
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

- Adding disks with 'gnt-instance modify' now waits for the disks to sync per
  default. Specify --no-wait-for-sync to override this behavior.
- The Ganeti python code now adheres to a private-module layout. In particular,
  the module 'ganeti' is no longer in the python search path.
- On instance allocation, the iallocator now considers non-LVM storage
  properly. In particular, actual file storage space information is used
  when allocating space for a file/sharedfile instance.
- When disabling disk templates cluster-wide, the cluster now first
  checks whether there are instances still using those templates.
- 'gnt-node list-storage' now also reports storage information about
  file-based storage types.
- In case of non drbd instances, export \*_SECONDARY environment variables
  as empty strings (and not "None") during 'instance-migrate' related hooks.

New features
~~~~~~~~~~~~

- KVM hypervisors can now access RBD storage directly without having to
  go through a block device.
- A new command 'gnt-cluster upgrade' was added that automates the upgrade
  procedure between two Ganeti versions that are both 2.10 or higher.
- The move-instance command can now change disk templates when moving
  instances, and does not require any node placement options to be
  specified if the destination cluster has a default iallocator.
- Users can now change the soundhw and cpuid settings for XEN hypervisors.
- Hail and hbal now have the (optional) capability of accessing average CPU
  load information through the monitoring deamon, and to use it to dynamically
  adapt the allocation of instances.
- Hotplug support. Introduce new option '--hotplug' to ``gnt-instance modify``
  so that disk and NIC modifications take effect without the need of actual
  reboot. There are a couple of constrains currently for this feature:

   - only KVM hypervisor (versions >= 1.0) supports it,
   - one can not (yet) hotplug a disk using userspace access mode for RBD
   - in case of a downgrade instances should suffer a reboot in order to
     be migratable (due to core change of runtime files)
   - ``python-fdsend`` is required for NIC hotplugging.

Misc changes
~~~~~~~~~~~~

- A new test framework for logical units was introduced and the test
  coverage for logical units was improved significantly.
- Opcodes are entirely generated from Haskell using the tool 'hs2py' and
  the module 'src/Ganeti/OpCodes.hs'.
- Constants are also generated from Haskell using the tool
  'hs2py-constants' and the module 'src/Ganeti/Constants.hs', with the
  exception of socket related constants, which require changing the
  cluster configuration file, and HVS related constants, because they
  are part of a port of instance queries to Haskell.  As a result, these
  changes will be part of the next release of Ganeti.

New dependencies
~~~~~~~~~~~~~~~~

The following new dependencies have been added/updated.

Python

- The version requirements for ``python-mock`` have increased to at least
  version 1.0.1. It is still used for testing only.
- ``python-fdsend`` (https://gitorious.org/python-fdsend) is optional
  but required for KVM NIC hotplugging to work.

Since 2.10.0 rc3
~~~~~~~~~~~~~~~~

- Fix integer overflow problem in hbal


Version 2.10.0 rc3
------------------

*(Released Wed, 12 Feb 2014)*

This was the third RC release of the 2.10 series. Since 2.10.0 rc2:

- Improved hotplug robustness
- Start Ganeti daemons after ensure-dirs during upgrade
- Documentation improvements

Inherited from the 2.9 branch:

- Fix the RAPI instances-multi-alloc call
- assign unique filenames to file-based disks
- gracefully handle degraded non-diskless instances with 0 disks (issue 697)
- noded now runs with its specified group, which is the default group,
  defaulting to root (issue 707)
- make using UUIDs to identify nodes in gnt-node consistently possible
  (issue 703)


Version 2.10.0 rc2
------------------

*(Released Fri, 31 Jan 2014)*

This was the second RC release of the 2.10 series. Since 2.10.0 rc1:

- Documentation improvements
- Run drbdsetup syncer only on network attach
- Include target node in hooks nodes for migration
- Fix configure dirs
- Support post-upgrade hooks during cluster upgrades

Inherited from the 2.9 branch:

- Ensure that all the hypervisors exist in the config file (Issue 640)
- Correctly recognise the role as master node (Issue 687)
- configure: allow detection of Sphinx 1.2+ (Issue 502)
- gnt-instance now honors the KVM path correctly (Issue 691)

Inherited from the 2.8 branch:

- Change the list separator for the usb_devices parameter from comma to space.
  Commas could not work because they are already the hypervisor option
  separator (Issue 649)
- Add support for blktap2 file-driver (Issue 638)
- Add network tag definitions to the haskell codebase (Issue 641)
- Fix RAPI network tag handling
- Add the network tags to the tags searched by gnt-cluster search-tags
- Fix caching bug preventing jobs from being cancelled
- Start-master/stop-master was always failing if ConfD was disabled. (Issue 685)


Version 2.10.0 rc1
------------------

*(Released Tue, 17 Dec 2013)*

This was the first RC release of the 2.10 series. Since 2.10.0 beta1:

- All known issues in 2.10.0 beta1 have been resolved (see changes from
  the 2.8 branch).
- Improve handling of KVM runtime files from earlier Ganeti versions
- Documentation fixes

Inherited from the 2.9 branch:

- use custom KVM path if set for version checking
- SingleNotifyPipeCondition: don't share pollers

Inherited from the 2.8 branch:

- Fixed Luxi daemon socket permissions after master-failover
- Improve IP version detection code directly checking for colons rather than
  passing the family from the cluster object
- Fix NODE/NODE_RES locking in LUInstanceCreate by not acquiring NODE_RES locks
  opportunistically anymore (Issue 622)
- Allow link local IPv6 gateways (Issue 624)
- Fix error printing (Issue 616)
- Fix a bug in InstanceSetParams concerning names: in case no name is passed in
  disk modifications, keep the old one. If name=none then set disk name to
  None.
- Update build_chroot script to work with the latest hackage packages
- Add a packet number limit to "fping" in master-ip-setup (Issue 630)
- Fix evacuation out of drained node (Issue 615)
- Add default file_driver if missing (Issue 571)
- Fix job error message after unclean master shutdown (Issue 618)
- Lock group(s) when creating instances (Issue 621)
- SetDiskID() before accepting an instance (Issue 633)
- Allow the ext template disks to receive arbitrary parameters, both at creation
  time and while being modified
- Xen handle domain shutdown (future proofing cherry-pick)
- Refactor reading live data in htools (future proofing cherry-pick)


Version 2.10.0 beta1
--------------------

*(Released Wed, 27 Nov 2013)*

This was the first beta release of the 2.10 series. All important changes
are listed in the latest 2.10 entry.

Known issues
~~~~~~~~~~~~

The following issues are known to be present in the beta and will be fixed
before rc1.

- Issue 477: Wrong permissions for confd LUXI socket
- Issue 621: Instance related opcodes do not aquire network/group locks
- Issue 622: Assertion Error: Node locks differ from node resource locks
- Issue 623: IPv6 Masterd <-> Luxid communication error


Version 2.9.7
-------------

*(Released Fri, 11 Dec 2015)*

Important changes and security notes
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Security release.

CVE-2015-7944

Ganeti provides a RESTful control interface called the RAPI. Its HTTPS
implementation is vulnerable to DoS attacks via client-initiated SSL
parameter renegotiation. While the interface is not meant to be exposed
publicly, due to the fact that it binds to all interfaces, we believe
some users might be exposing it unintentionally and are vulnerable. A
DoS attack can consume resources meant for Ganeti daemons and instances
running on the master node, making both perform badly.

Fixes are not feasible due to the OpenSSL Python library not exposing
functionality needed to disable client-side renegotiation. Instead, we
offer instructions on how to control RAPI's exposure, along with info
on how RAPI can be setup alongside an HTTPS proxy in case users still
want or need to expose the RAPI interface. The instructions are
outlined in Ganeti's security document: doc/html/security.html

CVE-2015-7945

Ganeti leaks the DRBD secret through the RAPI interface. Examining job
results after an instance information job reveals the secret. With the
DRBD secret, access to the local cluster network, and ARP poisoning,
an attacker can impersonate a Ganeti node and clone the disks of a
DRBD-based instance. While an attacker with access to the cluster
network is already capable of accessing any data written as DRBD
traffic is unencrypted, having the secret expedites the process and
allows access to the entire disk.

Fixes contained in this release prevent the secret from being exposed
via the RAPI. The DRBD secret can be changed by converting an instance
to plain and back to DRBD, generating a new secret, but redundancy will
be lost until the process completes.
Since attackers with node access are capable of accessing some and
potentially all data even without the secret, we do not recommend that
the secret be changed for existing instances.

Minor changes
~~~~~~~~~~~~~

- gnt-instance replace-disks no longer crashes when --ignore-policy is
  passed to it
- Stop MonD when removing a node from a cluster
- Fix file descriptor leak in Confd client
- Always install SIGHUP handler for Haskell daemons (Issue 755)
- Make ganeti-cleaner switch to a safe working directory (Issue 880)
- Make htools tolerate missing "spfree" on Luxi
- DRBD parser: consume initial empty resource lines (Issue 869)
- KVM: set IFF_ONE_QUEUE on created tap interfaces
- Set exclusion tags correctly in requested instance


Version 2.9.6
-------------

*(Released Mon, 7 Apr 2014)*

- Improve RAPI detection of the watcher (Issue 752)
- gnt-cluster copyfile: accept relative paths (Issue 754)
- Make watcher submit queries low priority (Issue 772)
- Add reason parameter to RAPI client functions (Issue 776)
- Fix failing gnt-node list-drbd command (Issue 777)
- Properly display fake job locks in gnt-debug.
- Enable timeout for instance shutdown
- small fixes in documentation


Version 2.9.5
-------------

*(Released Tue, 25 Feb 2014)*

- Fix overflow problem in hbal that caused it to break when waiting for
  jobs for more than 10 minutes (issue 717)
- Make hbal properly handle non-LVM storage
- Properly export and import NIC parameters, and do so in a backwards
  compatible way (issue 716)
- Fix net-common script in case of routed mode (issue 728)
- Improve documentation (issues 724, 730)


Version 2.9.4
-------------

*(Released Mon, 10 Feb 2014)*

- Fix the RAPI instances-multi-alloc call
- assign unique filenames to file-based disks
- gracefully handle degraded non-diskless instances with 0 disks (issue 697)
- noded now runs with its specified group, which is the default group,
  defaulting to root (issue 707)
- make using UUIDs to identify nodes in gnt-node consistently possible
  (issue 703)


Version 2.9.3
-------------

*(Released Mon, 27 Jan 2014)*

- Ensure that all the hypervisors exist in the config file (Issue 640)
- Correctly recognise the role as master node (Issue 687)
- configure: allow detection of Sphinx 1.2+ (Issue 502)
- gnt-instance now honors the KVM path correctly (Issue 691)

Inherited from the 2.8 branch:

- Change the list separator for the usb_devices parameter from comma to space.
  Commas could not work because they are already the hypervisor option
  separator (Issue 649)
- Add support for blktap2 file-driver (Issue 638)
- Add network tag definitions to the haskell codebase (Issue 641)
- Fix RAPI network tag handling
- Add the network tags to the tags searched by gnt-cluster search-tags
- Fix caching bug preventing jobs from being cancelled
- Start-master/stop-master was always failing if ConfD was disabled. (Issue 685)


Version 2.9.2
-------------

*(Released Fri, 13 Dec 2013)*

- use custom KVM path if set for version checking
- SingleNotifyPipeCondition: don't share pollers

Inherited from the 2.8 branch:

- Fixed Luxi daemon socket permissions after master-failover
- Improve IP version detection code directly checking for colons rather than
  passing the family from the cluster object
- Fix NODE/NODE_RES locking in LUInstanceCreate by not acquiring NODE_RES locks
  opportunistically anymore (Issue 622)
- Allow link local IPv6 gateways (Issue 624)
- Fix error printing (Issue 616)
- Fix a bug in InstanceSetParams concerning names: in case no name is passed in
  disk modifications, keep the old one. If name=none then set disk name to
  None.
- Update build_chroot script to work with the latest hackage packages
- Add a packet number limit to "fping" in master-ip-setup (Issue 630)
- Fix evacuation out of drained node (Issue 615)
- Add default file_driver if missing (Issue 571)
- Fix job error message after unclean master shutdown (Issue 618)
- Lock group(s) when creating instances (Issue 621)
- SetDiskID() before accepting an instance (Issue 633)
- Allow the ext template disks to receive arbitrary parameters, both at creation
  time and while being modified
- Xen handle domain shutdown (future proofing cherry-pick)
- Refactor reading live data in htools (future proofing cherry-pick)


Version 2.9.1
-------------

*(Released Wed, 13 Nov 2013)*

- fix bug, that kept nodes offline when readding
- when verifying DRBD versions, ignore unavailable nodes
- fix bug that made the console unavailable on kvm in split-user
  setup (issue 608)
- DRBD: ensure peers are UpToDate for dual-primary (inherited 2.8.2)


Version 2.9.0
-------------

*(Released Tue, 5 Nov 2013)*

Incompatible/important changes
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

- hroller now also plans for capacity to move non-redundant instances off
  any node to be rebooted; the old behavior of completely ignoring any
  non-redundant instances can be restored by adding the --ignore-non-redundant
  option.
- The cluster option '--no-lvm-storage' was removed in favor of the new option
  '--enabled-disk-templates'.
- On instance creation, disk templates no longer need to be specified
  with '-t'. The default disk template will be taken from the list of
  enabled disk templates.
- The monitoring daemon is now running as root, in order to be able to collect
  information only available to root (such as the state of Xen instances).
- The ConfD client is now IPv6 compatible.
- File and shared file storage is no longer dis/enabled at configure time,
  but using the option '--enabled-disk-templates' at cluster initialization and
  modification.
- The default directories for file and shared file storage are not anymore
  specified at configure time, but taken from the cluster's configuration.
  They can be set at cluster initialization and modification with
  '--file-storage-dir' and '--shared-file-storage-dir'.
- Cluster verification now includes stricter checks regarding the
  default file and shared file storage directories. It now checks that
  the directories are explicitely allowed in the 'file-storage-paths' file and
  that the directories exist on all nodes.
- The list of allowed disk templates in the instance policy and the list
  of cluster-wide enabled disk templates is now checked for consistency
  on cluster or group modification. On cluster initialization, the ipolicy
  disk templates are ensured to be a subset of the cluster-wide enabled
  disk templates.

New features
~~~~~~~~~~~~

- DRBD 8.4 support. Depending on the installed DRBD version, Ganeti now uses
  the correct command syntax. It is possible to use different DRBD versions
  on different nodes as long as they are compatible to each other. This
  enables rolling upgrades of DRBD with no downtime. As permanent operation
  of different DRBD versions within a node group is discouraged,
  ``gnt-cluster verify`` will emit a warning if it detects such a situation.
- New "inst-status-xen" data collector for the monitoring daemon, providing
  information about the state of the xen instances on the nodes.
- New "lv" data collector for the monitoring daemon, collecting data about the
  logical volumes on the nodes, and pairing them with the name of the instances
  they belong to.
- New "diskstats" data collector, collecting the data from /proc/diskstats and
  presenting them over the monitoring daemon interface.
- The ConfD client is now IPv6 compatible.

New dependencies
~~~~~~~~~~~~~~~~
The following new dependencies have been added.

Python

- ``python-mock`` (http://www.voidspace.org.uk/python/mock/) is now a required
  for the unit tests (and only used for testing).

Haskell

- ``hslogger`` (http://software.complete.org/hslogger) is now always
  required, even if confd is not enabled.

Since 2.9.0 rc3
~~~~~~~~~~~~~~~

- Correctly start/stop luxid during gnt-cluster master-failover (inherited
  from stable-2.8)
- Improved error messsages (inherited from stable-2.8)


Version 2.9.0 rc3
-----------------

*(Released Tue, 15 Oct 2013)*

The third release candidate in the 2.9 series. Since 2.9.0 rc2:

- in implicit configuration upgrade, match ipolicy with enabled disk templates
- improved harep documentation (inherited from stable-2.8)


Version 2.9.0 rc2
-----------------

*(Released Wed, 9 Oct 2013)*

The second release candidate in the 2.9 series. Since 2.9.0 rc1:

- Fix bug in cfgupgrade that led to failure when upgrading from 2.8 with
  at least one DRBD instance.
- Fix bug in cfgupgrade that led to an invalid 2.8 configuration after
  downgrading.


Version 2.9.0 rc1
-----------------

*(Released Tue, 1 Oct 2013)*

The first release candidate in the 2.9 series. Since 2.9.0 beta1:

- various bug fixes
- update of the documentation, in particular installation instructions
- merging of LD_* constants into DT_* constants
- python style changes to be compatible with newer versions of pylint


Version 2.9.0 beta1
-------------------

*(Released Thu, 29 Aug 2013)*

This was the first beta release of the 2.9 series. All important changes
are listed in the latest 2.9 entry.


Version 2.8.4
-------------

*(Released Thu, 23 Jan 2014)*

- Change the list separator for the usb_devices parameter from comma to space.
  Commas could not work because they are already the hypervisor option
  separator (Issue 649)
- Add support for blktap2 file-driver (Issue 638)
- Add network tag definitions to the haskell codebase (Issue 641)
- Fix RAPI network tag handling
- Add the network tags to the tags searched by gnt-cluster search-tags
- Fix caching bug preventing jobs from being cancelled
- Start-master/stop-master was always failing if ConfD was disabled. (Issue 685)


Version 2.8.3
-------------

*(Released Thu, 12 Dec 2013)*

- Fixed Luxi daemon socket permissions after master-failover
- Improve IP version detection code directly checking for colons rather than
  passing the family from the cluster object
- Fix NODE/NODE_RES locking in LUInstanceCreate by not acquiring NODE_RES locks
  opportunistically anymore (Issue 622)
- Allow link local IPv6 gateways (Issue 624)
- Fix error printing (Issue 616)
- Fix a bug in InstanceSetParams concerning names: in case no name is passed in
  disk modifications, keep the old one. If name=none then set disk name to
  None.
- Update build_chroot script to work with the latest hackage packages
- Add a packet number limit to "fping" in master-ip-setup (Issue 630)
- Fix evacuation out of drained node (Issue 615)
- Add default file_driver if missing (Issue 571)
- Fix job error message after unclean master shutdown (Issue 618)
- Lock group(s) when creating instances (Issue 621)
- SetDiskID() before accepting an instance (Issue 633)
- Allow the ext template disks to receive arbitrary parameters, both at creation
  time and while being modified
- Xen handle domain shutdown (future proofing cherry-pick)
- Refactor reading live data in htools (future proofing cherry-pick)


Version 2.8.2
-------------

*(Released Thu, 07 Nov 2013)*

- DRBD: ensure peers are UpToDate for dual-primary
- Improve error message for replace-disks
- More dependency checks at configure time
- Placate warnings on ganeti.outils_unittest.py


Version 2.8.1
-------------

*(Released Thu, 17 Oct 2013)*

- Correctly start/stop luxid during gnt-cluster master-failover
- Don't attempt IPv6 ssh in case of IPv4 cluster (Issue 595)
- Fix path for the job queue serial file
- Improved harep man page
- Minor documentation improvements


Version 2.8.0
-------------

*(Released Mon, 30 Sep 2013)*

Incompatible/important changes
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

- Instance policy can contain multiple instance specs, as described in
  the “Constrained instance sizes” section of :doc:`Partitioned Ganeti
  <design-partitioned>`. As a consequence, it's not possible to partially change
  or override instance specs. Bounding specs (min and max) can be specified as a
  whole using the new option ``--ipolicy-bounds-specs``, while standard
  specs use the new option ``--ipolicy-std-specs``.
- The output of the info command of gnt-cluster, gnt-group, gnt-node,
  gnt-instance is a valid YAML object.
- hail now honors network restrictions when allocating nodes. This led to an
  update of the IAllocator protocol. See the IAllocator documentation for
  details.
- confd now only answers static configuration request over the network. luxid
  was extracted, listens on the local LUXI socket and responds to live queries.
  This allows finer grained permissions if using separate users.

New features
~~~~~~~~~~~~

- The :doc:`Remote API <rapi>` daemon now supports a command line flag
  to always require authentication, ``--require-authentication``. It can
  be specified in ``$sysconfdir/default/ganeti``.
- A new cluster attribute 'enabled_disk_templates' is introduced. It will
  be used to manage the disk templates to be used by instances in the cluster.
  Initially, it will be set to a list that includes plain, drbd, if they were
  enabled by specifying a volume group name, and file and sharedfile, if those
  were enabled at configure time. Additionally, it will include all disk
  templates that are currently used by instances. The order of disk templates
  will be based on Ganeti's history of supporting them. In the future, the
  first entry of the list will be used as a default disk template on instance
  creation.
- ``cfgupgrade`` now supports a ``--downgrade`` option to bring the
  configuration back to the previous stable version.
- Disk templates in group ipolicy can be restored to the default value.
- Initial support for diskless instances and virtual clusters in QA.
- More QA and unit tests for instance policies.
- Every opcode now contains a reason trail (visible through ``gnt-job info``)
  describing why the opcode itself was executed.
- The monitoring daemon is now available. It allows users to query the cluster
  for obtaining information about the status of the system. The daemon is only
  responsible for providing the information over the network: the actual data
  gathering is performed by data collectors (currently, only the DRBD status
  collector is available).
- In order to help developers work on Ganeti, a new script
  (``devel/build_chroot``) is provided, for building a chroot that contains all
  the required development libraries and tools for compiling Ganeti on a Debian
  Squeeze system.
- A new tool, ``harep``, for performing self-repair and recreation of instances
  in Ganeti has been added.
- Split queries are enabled for tags, network, exports, cluster info, groups,
  jobs, nodes.
- New command ``show-ispecs-cmd`` for ``gnt-cluster`` and ``gnt-group``.
  It prints the command line to set the current policies, to ease
  changing them.
- Add the ``vnet_hdr`` HV parameter for KVM, to control whether the tap
  devices for KVM virtio-net interfaces will get created with VNET_HDR
  (IFF_VNET_HDR) support. If set to false, it disables offloading on the
  virtio-net interfaces, which prevents host kernel tainting and log
  flooding, when dealing with broken or malicious virtio-net drivers.
  It's set to true by default.
- Instance failover now supports a ``--cleanup`` parameter for fixing previous
  failures.
- Support 'viridian' parameter in Xen HVM
- Support DSA SSH keys in bootstrap
- To simplify the work of packaging frameworks that want to add the needed users
  and groups in a split-user setup themselves, at build time three files in
  ``doc/users`` will be generated. The ``groups`` files contains, one per line,
  the groups to be generated, the ``users`` file contains, one per line, the
  users to be generated, optionally followed by their primary group, where
  important. The ``groupmemberships`` file contains, one per line, additional
  user-group membership relations that need to be established. The syntax of
  these files will remain stable in all future versions.


New dependencies
~~~~~~~~~~~~~~~~
The following new dependencies have been added:

For Haskell:
- The ``curl`` library is not optional anymore for compiling the Haskell code.
- ``snap-server`` library (if monitoring is enabled).

For Python:
- The minimum Python version needed to run Ganeti is now 2.6.
- ``yaml`` library (only for running the QA).

Since 2.8.0 rc3
~~~~~~~~~~~~~~~
- Perform proper cleanup on termination of Haskell daemons
- Fix corner-case in handling of remaining retry time


Version 2.8.0 rc3
-----------------

*(Released Tue, 17 Sep 2013)*

- To simplify the work of packaging frameworks that want to add the needed users
  and groups in a split-user setup themselves, at build time three files in
  ``doc/users`` will be generated. The ``groups`` files contains, one per line,
  the groups to be generated, the ``users`` file contains, one per line, the
  users to be generated, optionally followed by their primary group, where
  important. The ``groupmemberships`` file contains, one per line, additional
  user-group membership relations that need to be established. The syntax of
  these files will remain stable in all future versions.
- Add a default to file-driver when unspecified over RAPI (Issue 571)
- Mark the DSA host pubkey as optional, and remove it during config downgrade
  (Issue 560)
- Some documentation fixes


Version 2.8.0 rc2
-----------------

*(Released Tue, 27 Aug 2013)*

The second release candidate of the 2.8 series. Since 2.8.0. rc1:

- Support 'viridian' parameter in Xen HVM (Issue 233)
- Include VCS version in ``gnt-cluster version``
- Support DSA SSH keys in bootstrap (Issue 338)
- Fix batch creation of instances
- Use FQDN to check master node status (Issue 551)
- Make the DRBD collector more failure-resilient


Version 2.8.0 rc1
-----------------

*(Released Fri, 2 Aug 2013)*

The first release candidate of the 2.8 series. Since 2.8.0 beta1:

- Fix upgrading/downgrading from 2.7
- Increase maximum RAPI message size
- Documentation updates
- Split ``confd`` between ``luxid`` and ``confd``
- Merge 2.7 series up to the 2.7.1 release
- Allow the ``modify_etc_hosts`` option to be changed
- Add better debugging for ``luxid`` queries
- Expose bulk parameter for GetJobs in RAPI client
- Expose missing ``network`` fields in RAPI
- Add some ``cluster verify`` tests
- Some unittest fixes
- Fix a malfunction in ``hspace``'s tiered allocation
- Fix query compatibility between haskell and python implementations
- Add the ``vnet_hdr`` HV parameter for KVM
- Add ``--cleanup`` to instance failover
- Change the connected groups format in ``gnt-network info`` output; it
  was previously displayed as a raw list by mistake. (Merged from 2.7)


Version 2.8.0 beta1
-------------------

*(Released Mon, 24 Jun 2013)*

This was the first beta release of the 2.8 series. All important changes
are listed in the latest 2.8 entry.


Version 2.7.2
-------------

*(Released Thu, 26 Sep 2013)*

- Change the connected groups format in ``gnt-network info`` output; it
  was previously displayed as a raw list by mistake
- Check disk template in right dict when copying
- Support multi-instance allocs without iallocator
- Fix some errors in the documentation
- Fix formatting of tuple in an error message


Version 2.7.1
-------------

*(Released Thu, 25 Jul 2013)*

- Add logrotate functionality in daemon-util
- Add logrotate example file
- Add missing fields to network queries over rapi
- Fix network object timestamps
- Add support for querying network timestamps
- Fix a typo in the example crontab
- Fix a documentation typo


Version 2.7.0
-------------

*(Released Thu, 04 Jul 2013)*

Incompatible/important changes
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

- Instance policies for disk size were documented to be on a per-disk
  basis, but hail applied them to the sum of all disks. This has been
  fixed.
- ``hbal`` will now exit with status 0 if, during job execution over
  LUXI, early exit has been requested and all jobs are successful;
  before, exit status 1 was used, which cannot be differentiated from
  "job error" case
- Compatibility with newer versions of rbd has been fixed
- ``gnt-instance batch-create`` has been changed to use the bulk create
  opcode from Ganeti. This lead to incompatible changes in the format of
  the JSON file. It's now not a custom dict anymore but a dict
  compatible with the ``OpInstanceCreate`` opcode.
- Parent directories for file storage need to be listed in
  ``$sysconfdir/ganeti/file-storage-paths`` now. ``cfgupgrade`` will
  write the file automatically based on old configuration values, but it
  can not distribute it across all nodes and the file contents should be
  verified. Use ``gnt-cluster copyfile
  $sysconfdir/ganeti/file-storage-paths`` once the cluster has been
  upgraded. The reason for requiring this list of paths now is that
  before it would have been possible to inject new paths via RPC,
  allowing files to be created in arbitrary locations. The RPC protocol
  is protected using SSL/X.509 certificates, but as a design principle
  Ganeti does not permit arbitrary paths to be passed.
- The parsing of the variants file for OSes (see
  :manpage:`ganeti-os-interface(7)`) has been slightly changed: now empty
  lines and comment lines (starting with ``#``) are ignored for better
  readability.
- The ``setup-ssh`` tool added in Ganeti 2.2 has been replaced and is no
  longer available. ``gnt-node add`` now invokes a new tool on the
  destination node, named ``prepare-node-join``, to configure the SSH
  daemon. Paramiko is no longer necessary to configure nodes' SSH
  daemons via ``gnt-node add``.
- Draining (``gnt-cluster queue drain``) and un-draining the job queue
  (``gnt-cluster queue undrain``) now affects all nodes in a cluster and
  the flag is not reset after a master failover.
- Python 2.4 has *not* been tested with this release. Using 2.6 or above
  is recommended. 2.6 will be mandatory from the 2.8 series.


New features
~~~~~~~~~~~~

- New network management functionality to support automatic allocation
  of IP addresses and managing of network parameters. See
  :manpage:`gnt-network(8)` for more details.
- New external storage backend, to allow managing arbitrary storage
  systems external to the cluster. See
  :manpage:`ganeti-extstorage-interface(7)`.
- New ``exclusive-storage`` node parameter added, restricted to
  nodegroup level. When it's set to true, physical disks are assigned in
  an exclusive fashion to instances, as documented in :doc:`Partitioned
  Ganeti <design-partitioned>`.  Currently, only instances using the
  ``plain`` disk template are supported.
- The KVM hypervisor has been updated with many new hypervisor
  parameters, including a generic one for passing arbitrary command line
  values. See a complete list in :manpage:`gnt-instance(8)`. It is now
  compatible up to qemu 1.4.
- A new tool, called ``mon-collector``, is the stand-alone executor of
  the data collectors for a monitoring system. As of this version, it
  just includes the DRBD data collector, that can be executed by calling
  ``mon-collector`` using the ``drbd`` parameter. See
  :manpage:`mon-collector(7)`.
- A new user option, :pyeval:`rapi.RAPI_ACCESS_READ`, has been added
  for RAPI users. It allows granting permissions to query for
  information to a specific user without giving
  :pyeval:`rapi.RAPI_ACCESS_WRITE` permissions.
- A new tool named ``node-cleanup`` has been added. It cleans remains of
  a cluster from a machine by stopping all daemons, removing
  certificates and ssconf files. Unless the ``--no-backup`` option is
  given, copies of the certificates are made.
- Instance creations now support the use of opportunistic locking,
  potentially speeding up the (parallel) creation of multiple instances.
  This feature is currently only available via the :doc:`RAPI
  <rapi>` interface and when an instance allocator is used. If the
  ``opportunistic_locking`` parameter is set the opcode will try to
  acquire as many locks as possible, but will not wait for any locks
  held by other opcodes. If not enough resources can be found to
  allocate the instance, the temporary error code
  :pyeval:`errors.ECODE_TEMP_NORES` is returned. The operation can be
  retried thereafter, with or without opportunistic locking.
- New experimental linux-ha resource scripts.
- Restricted-commands support: ganeti can now be asked (via command line
  or rapi) to perform commands on a node. These are passed via ganeti
  RPC rather than ssh. This functionality is restricted to commands
  specified on the ``$sysconfdir/ganeti/restricted-commands`` for security
  reasons. The file is not copied automatically.


Misc changes
~~~~~~~~~~~~

- Diskless instances are now externally mirrored (Issue 237). This for
  now has only been tested in conjunction with explicit target nodes for
  migration/failover.
- Queries not needing locks or RPC access to the node can now be
  performed by the confd daemon, making them independent from jobs, and
  thus faster to execute. This is selectable at configure time.
- The functionality for allocating multiple instances at once has been
  overhauled and is now also available through :doc:`RAPI <rapi>`.

There are no significant changes from version 2.7.0~rc3.


Version 2.7.0 rc3
-----------------

*(Released Tue, 25 Jun 2013)*

- Fix permissions on the confd query socket (Issue 477)
- Fix permissions on the job archive dir (Issue 498)
- Fix handling of an internal exception in replace-disks (Issue 472)
- Fix gnt-node info handling of shortened names (Issue 497)
- Fix gnt-instance grow-disk when wiping is enabled
- Documentation improvements, and support for newer pandoc
- Fix hspace honoring ipolicy for disks (Issue 484)
- Improve handling of the ``kvm_extra`` HV parameter


Version 2.7.0 rc2
-----------------

*(Released Fri, 24 May 2013)*

- ``devel/upload`` now works when ``/var/run`` on the target nodes is a
  symlink.
- Disks added through ``gnt-instance modify`` or created through
  ``gnt-instance recreate-disks`` are wiped, if the
  ``prealloc_wipe_disks`` flag is set.
- If wiping newly created disks fails, the disks are removed. Also,
  partial failures in creating disks through ``gnt-instance modify``
  triggers a cleanup of the partially-created disks.
- Removing the master IP address doesn't fail if the address has been
  already removed.
- Fix ownership of the OS log dir
- Workaround missing SO_PEERCRED constant (Issue 191)


Version 2.7.0 rc1
-----------------

*(Released Fri, 3 May 2013)*

This was the first release candidate of the 2.7 series. Since beta3:

- Fix kvm compatibility with qemu 1.4 (Issue 389)
- Documentation updates (admin guide, upgrade notes, install
  instructions) (Issue 372)
- Fix gnt-group list nodes and instances count (Issue 436)
- Fix compilation without non-mandatory libraries (Issue 441)
- Fix xen-hvm hypervisor forcing nics to type 'ioemu' (Issue 247)
- Make confd logging more verbose at INFO level (Issue 435)
- Improve "networks" documentation in :manpage:`gnt-instance(8)`
- Fix failure path for instance storage type conversion (Issue 229)
- Update htools text backend documentation
- Improve the renew-crypto section of :manpage:`gnt-cluster(8)`
- Disable inter-cluster instance move for file-based instances, because
  it is dependant on instance export, which is not supported for
  file-based instances. (Issue 414)
- Fix gnt-job crashes on non-ascii characters (Issue 427)
- Fix volume group checks on non-vm-capable nodes (Issue 432)


Version 2.7.0 beta3
-------------------

*(Released Mon, 22 Apr 2013)*

This was the third beta release of the 2.7 series. Since beta2:

- Fix hail to verify disk instance policies on a per-disk basis (Issue 418).
- Fix data loss on wrong usage of ``gnt-instance move``
- Properly export errors in confd-based job queries
- Add ``users-setup`` tool
- Fix iallocator protocol to report 0 as a disk size for diskless
  instances. This avoids hail breaking when a diskless instance is
  present.
- Fix job queue directory permission problem that made confd job queries
  fail. This requires running an ``ensure-dirs --full-run`` on upgrade
  for access to archived jobs (Issue 406).
- Limit the sizes of networks supported by ``gnt-network`` to something
  between a ``/16`` and a ``/30`` to prevent memory bloat and crashes.
- Fix bugs in instance disk template conversion
- Fix GHC 7 compatibility
- Fix ``burnin`` install path (Issue 426).
- Allow very small disk grows (Issue 347).
- Fix a ``ganeti-noded`` memory bloat introduced in 2.5, by making sure
  that noded doesn't import masterd code (Issue 419).
- Make sure the default metavg at cluster init is the same as the vg, if
  unspecified (Issue 358).
- Fix cleanup of partially created disks (part of Issue 416)


Version 2.7.0 beta2
-------------------

*(Released Tue, 2 Apr 2013)*

This was the second beta release of the 2.7 series. Since beta1:

- Networks no longer have a "type" slot, since this information was
  unused in Ganeti: instead of it tags should be used.
- The rapi client now has a ``target_node`` option to MigrateInstance.
- Fix early exit return code for hbal (Issue 386).
- Fix ``gnt-instance migrate/failover -n`` (Issue 396).
- Fix ``rbd showmapped`` output parsing (Issue 312).
- Networks are now referenced indexed by UUID, rather than name. This
  will require running cfgupgrade, from 2.7.0beta1, if networks are in
  use.
- The OS environment now includes network information.
- Deleting of a network is now disallowed if any instance nic is using
  it, to prevent dangling references.
- External storage is now documented in man pages.
- The exclusive_storage flag can now only be set at nodegroup level.
- Hbal can now submit an explicit priority with its jobs.
- Many network related locking fixes.
- Bump up the required pylint version to 0.25.1.
- Fix the ``no_remember`` option in RAPI client.
- Many ipolicy related tests, qa, and fixes.
- Many documentation improvements and fixes.
- Fix building with ``--disable-file-storage``.
- Fix ``-q`` option in htools, which was broken if passed more than
  once.
- Some haskell/python interaction improvements and fixes.
- Fix iallocator in case of missing LVM storage.
- Fix confd config load in case of ``--no-lvm-storage``.
- The confd/query functionality is now mentioned in the security
  documentation.


Version 2.7.0 beta1
-------------------

*(Released Wed, 6 Feb 2013)*

This was the first beta release of the 2.7 series. All important changes
are listed in the latest 2.7 entry.


Version 2.6.2
-------------

*(Released Fri, 21 Dec 2012)*

Important behaviour change: hbal won't rebalance anymore instances which
have the ``auto_balance`` attribute set to false. This was the intention
all along, but until now it only skipped those from the N+1 memory
reservation (DRBD-specific).

A significant number of bug fixes in this release:

- Fixed disk adoption interaction with ipolicy checks.
- Fixed networking issues when instances are started, stopped or
  migrated, by forcing the tap device's MAC prefix to "fe" (issue 217).
- Fixed the warning in cluster verify for shared storage instances not
  being redundant.
- Fixed removal of storage directory on shared file storage (issue 262).
- Fixed validation of LVM volume group name in OpClusterSetParams
  (``gnt-cluster modify``) (issue 285).
- Fixed runtime memory increases (``gnt-instance modify -m``).
- Fixed live migration under Xen's ``xl`` mode.
- Fixed ``gnt-instance console`` with ``xl``.
- Fixed building with newer Haskell compiler/libraries.
- Fixed PID file writing in Haskell daemons (confd); this prevents
  restart issues if confd was launched manually (outside of
  ``daemon-util``) while another copy of it was running
- Fixed a type error when doing live migrations with KVM (issue 297) and
  the error messages for failing migrations have been improved.
- Fixed opcode validation for the out-of-band commands (``gnt-node
  power``).
- Fixed a type error when unsetting OS hypervisor parameters (issue
  311); now it's possible to unset all OS-specific hypervisor
  parameters.
- Fixed the ``dry-run`` mode for many operations: verification of
  results was over-zealous but didn't take into account the ``dry-run``
  operation, resulting in "wrong" failures.
- Fixed bash completion in ``gnt-job list`` when the job queue has
  hundreds of entries; especially with older ``bash`` versions, this
  results in significant CPU usage.

And lastly, a few other improvements have been made:

- Added option to force master-failover without voting (issue 282).
- Clarified error message on lock conflict (issue 287).
- Logging of newly submitted jobs has been improved (issue 290).
- Hostname checks have been made uniform between instance rename and
  create (issue 291).
- The ``--submit`` option is now supported by ``gnt-debug delay``.
- Shutting down the master daemon by sending SIGTERM now stops it from
  processing jobs waiting for locks; instead, those jobs will be started
  once again after the master daemon is started the next time (issue
  296).
- Support for Xen's ``xl`` program has been improved (besides the fixes
  above).
- Reduced logging noise in the Haskell confd daemon (only show one log
  entry for each config reload, instead of two).
- Several man page updates and typo fixes.


Version 2.6.1
-------------

*(Released Fri, 12 Oct 2012)*

A small bugfix release. Among the bugs fixed:

- Fixed double use of ``PRIORITY_OPT`` in ``gnt-node migrate``, that
  made the command unusable.
- Commands that issue many jobs don't fail anymore just because some jobs
  take so long that other jobs are archived.
- Failures during ``gnt-instance reinstall`` are reflected by the exit
  status.
- Issue 190 fixed. Check for DRBD in cluster verify is enabled only when
  DRBD is enabled.
- When ``always_failover`` is set, ``--allow-failover`` is not required
  in migrate commands anymore.
- ``bash_completion`` works even if extglob is disabled.
- Fixed bug with locks that made failover for RDB-based instances fail.
- Fixed bug in non-mirrored instance allocation that made Ganeti choose
  a random node instead of one based on the allocator metric.
- Support for newer versions of pylint and pep8.
- Hail doesn't fail anymore when trying to add an instance of type
  ``file``, ``sharedfile`` or ``rbd``.
- Added new Makefile target to rebuild the whole distribution, so that
  all files are included.


Version 2.6.0
-------------

*(Released Fri, 27 Jul 2012)*


.. attention:: The ``LUXI`` protocol has been made more consistent
   regarding its handling of command arguments. This, however, leads to
   incompatibility issues with previous versions. Please ensure that you
   restart Ganeti daemons soon after the upgrade, otherwise most
   ``LUXI`` calls (job submission, setting/resetting the drain flag,
   pausing/resuming the watcher, cancelling and archiving jobs, querying
   the cluster configuration) will fail.


New features
~~~~~~~~~~~~

Instance run status
+++++++++++++++++++

The current ``admin_up`` field, which used to denote whether an instance
should be running or not, has been removed. Instead, ``admin_state`` is
introduced, with 3 possible values -- ``up``, ``down`` and ``offline``.

The rational behind this is that an instance being “down” can have
different meanings:

- it could be down during a reboot
- it could be temporarily be down for a reinstall
- or it could be down because it is deprecated and kept just for its
  disk

The previous Boolean state was making it difficult to do capacity
calculations: should Ganeti reserve memory for a down instance? Now, the
tri-state field makes it clear:

- in ``up`` and ``down`` state, all resources are reserved for the
  instance, and it can be at any time brought up if it is down
- in ``offline`` state, only disk space is reserved for it, but not
  memory or CPUs

The field can have an extra use: since the transition between ``up`` and
``down`` and vice-versus is done via ``gnt-instance start/stop``, but
transition between ``offline`` and ``down`` is done via ``gnt-instance
modify``, it is possible to given different rights to users. For
example, owners of an instance could be allowed to start/stop it, but
not transition it out of the offline state.

Instance policies and specs
+++++++++++++++++++++++++++

In previous Ganeti versions, an instance creation request was not
limited on the minimum size and on the maximum size just by the cluster
resources. As such, any policy could be implemented only in third-party
clients (RAPI clients, or shell wrappers over ``gnt-*``
tools). Furthermore, calculating cluster capacity via ``hspace`` again
required external input with regards to instance sizes.

In order to improve these workflows and to allow for example better
per-node group differentiation, we introduced instance specs, which
allow declaring:

- minimum instance disk size, disk count, memory size, cpu count
- maximum values for the above metrics
- and “standard” values (used in ``hspace`` to calculate the standard
  sized instances)

The minimum/maximum values can be also customised at node-group level,
for example allowing more powerful hardware to support bigger instance
memory sizes.

Beside the instance specs, there are a few other settings belonging to
the instance policy framework. It is possible now to customise, per
cluster and node-group:

- the list of allowed disk templates
- the maximum ratio of VCPUs per PCPUs (to control CPU oversubscription)
- the maximum ratio of instance to spindles (see below for more
  information) for local storage

All these together should allow all tools that talk to Ganeti to know
what are the ranges of allowed values for instances and the
over-subscription that is allowed.

For the VCPU/PCPU ratio, we already have the VCPU configuration from the
instance configuration, and the physical CPU configuration from the
node. For the spindle ratios however, we didn't track before these
values, so new parameters have been added:

- a new node parameter ``spindle_count``, defaults to 1, customisable at
  node group or node level
- at new backend parameter (for instances), ``spindle_use`` defaults to 1

Note that spindles in this context doesn't need to mean actual
mechanical hard-drives; it's just a relative number for both the node
I/O capacity and instance I/O consumption.

Instance migration behaviour
++++++++++++++++++++++++++++

While live-migration is in general desirable over failover, it is
possible that for some workloads it is actually worse, due to the
variable time of the “suspend” phase during live migration.

To allow the tools to work consistently over such instances (without
having to hard-code instance names), a new backend parameter
``always_failover`` has been added to control the migration/failover
behaviour. When set to True, all migration requests for an instance will
instead fall-back to failover.

Instance memory ballooning
++++++++++++++++++++++++++

Initial support for memory ballooning has been added. The memory for an
instance is no longer fixed (backend parameter ``memory``), but instead
can vary between minimum and maximum values (backend parameters
``minmem`` and ``maxmem``). Currently we only change an instance's
memory when:

- live migrating or failing over and instance and the target node
  doesn't have enough memory
- user requests changing the memory via ``gnt-instance modify
  --runtime-memory``

Instance CPU pinning
++++++++++++++++++++

In order to control the use of specific CPUs by instance, support for
controlling CPU pinning has been added for the Xen, HVM and LXC
hypervisors. This is controlled by a new hypervisor parameter
``cpu_mask``; details about possible values for this are in the
:manpage:`gnt-instance(8)`. Note that use of the most specific (precise
VCPU-to-CPU mapping) form will work well only when all nodes in your
cluster have the same amount of CPUs.

Disk parameters
+++++++++++++++

Another area in which Ganeti was not customisable were the parameters
used for storage configuration, e.g. how many stripes to use for LVM,
DRBD resync configuration, etc.

To improve this area, we've added disks parameters, which are
customisable at cluster and node group level, and which allow to
specify various parameters for disks (DRBD has the most parameters
currently), for example:

- DRBD resync algorithm and parameters (e.g. speed)
- the default VG for meta-data volumes for DRBD
- number of stripes for LVM (plain disk template)
- the RBD pool

These parameters can be modified via ``gnt-cluster modify -D …`` and
``gnt-group modify -D …``, and are used at either instance creation (in
case of LVM stripes, for example) or at disk “activation” time
(e.g. resync speed).

Rados block device support
++++++++++++++++++++++++++

A Rados (http://ceph.com/wiki/Rbd) storage backend has been added,
denoted by the ``rbd`` disk template type. This is considered
experimental, feedback is welcome. For details on configuring it, see
the :doc:`install` document and the :manpage:`gnt-cluster(8)` man page.

Master IP setup
+++++++++++++++

The existing master IP functionality works well only in simple setups (a
single network shared by all nodes); however, if nodes belong to
different networks, then the ``/32`` setup and lack of routing
information is not enough.

To allow the master IP to function well in more complex cases, the
system was reworked as follows:

- a master IP netmask setting has been added
- the master IP activation/turn-down code was moved from the node daemon
  to a separate script
- whether to run the Ganeti-supplied master IP script or a user-supplied
  on is a ``gnt-cluster init`` setting

Details about the location of the standard and custom setup scripts are
in the man page :manpage:`gnt-cluster(8)`; for information about the
setup script protocol, look at the Ganeti-supplied script.

SPICE support
+++++++++++++

The `SPICE <http://www.linux-kvm.org/page/SPICE>`_ support has been
improved.

It is now possible to use TLS-protected connections, and when renewing
or changing the cluster certificates (via ``gnt-cluster renew-crypto``,
it is now possible to specify spice or spice CA certificates. Also, it
is possible to configure a password for SPICE sessions via the
hypervisor parameter ``spice_password_file``.

There are also new parameters to control the compression and streaming
options (e.g. ``spice_image_compression``, ``spice_streaming_video``,
etc.). For details, see the man page :manpage:`gnt-instance(8)` and look
for the spice parameters.

Lastly, it is now possible to see the SPICE connection information via
``gnt-instance console``.

OVF converter
+++++++++++++

A new tool (``tools/ovfconverter``) has been added that supports
conversion between Ganeti and the `Open Virtualization Format
<http://en.wikipedia.org/wiki/Open_Virtualization_Format>`_ (both to and
from).

This relies on the ``qemu-img`` tool to convert the disk formats, so the
actual compatibility with other virtualization solutions depends on it.

Confd daemon changes
++++++++++++++++++++

The configuration query daemon (``ganeti-confd``) is now optional, and
has been rewritten in Haskell; whether to use the daemon at all, use the
Python (default) or the Haskell version is selectable at configure time
via the ``--enable-confd`` parameter, which can take one of the
``haskell``, ``python`` or ``no`` values. If not used, disabling the
daemon will result in a smaller footprint; for larger systems, we
welcome feedback on the Haskell version which might become the default
in future versions.

If you want to use ``gnt-node list-drbd`` you need to have the Haskell
daemon running. The Python version doesn't implement the new call.


User interface changes
~~~~~~~~~~~~~~~~~~~~~~

We have replaced the ``--disks`` option of ``gnt-instance
replace-disks`` with a more flexible ``--disk`` option, which allows
adding and removing disks at arbitrary indices (Issue 188). Furthermore,
disk size and mode can be changed upon recreation (via ``gnt-instance
recreate-disks``, which accepts the same ``--disk`` option).

As many people are used to a ``show`` command, we have added that as an
alias to ``info`` on all ``gnt-*`` commands.

The ``gnt-instance grow-disk`` command has a new mode in which it can
accept the target size of the disk, instead of the delta; this can be
more safe since two runs in absolute mode will be idempotent, and
sometimes it's also easier to specify the desired size directly.

Also the handling of instances with regard to offline secondaries has
been improved. Instance operations should not fail because one of it's
secondary nodes is offline, even though it's safe to proceed.

A new command ``list-drbd`` has been added to the ``gnt-node`` script to
support debugging of DRBD issues on nodes. It provides a mapping of DRBD
minors to instance name.

API changes
~~~~~~~~~~~

RAPI coverage has improved, with (for example) new resources for
recreate-disks, node power-cycle, etc.

Compatibility
~~~~~~~~~~~~~

There is partial support for ``xl`` in the Xen hypervisor; feedback is
welcome.

Python 2.7 is better supported, and after Ganeti 2.6 we will investigate
whether to still support Python 2.4 or move to Python 2.6 as minimum
required version.

Support for Fedora has been slightly improved; the provided example
init.d script should work better on it and the INSTALL file should
document the needed dependencies.

Internal changes
~~~~~~~~~~~~~~~~

The deprecated ``QueryLocks`` LUXI request has been removed. Use
``Query(what=QR_LOCK, ...)`` instead.

The LUXI requests :pyeval:`luxi.REQ_QUERY_JOBS`,
:pyeval:`luxi.REQ_QUERY_INSTANCES`, :pyeval:`luxi.REQ_QUERY_NODES`,
:pyeval:`luxi.REQ_QUERY_GROUPS`, :pyeval:`luxi.REQ_QUERY_EXPORTS` and
:pyeval:`luxi.REQ_QUERY_TAGS` are deprecated and will be removed in a
future version. :pyeval:`luxi.REQ_QUERY` should be used instead.

RAPI client: ``CertificateError`` now derives from
``GanetiApiError``. This should make it more easy to handle Ganeti
errors.

Deprecation warnings due to PyCrypto/paramiko import in
``tools/setup-ssh`` have been silenced, as usually they are safe; please
make sure to run an up-to-date paramiko version, if you use this tool.

The QA scripts now depend on Python 2.5 or above (the main code base
still works with Python 2.4).

The configuration file (``config.data``) is now written without
indentation for performance reasons; if you want to edit it, it can be
re-formatted via ``tools/fmtjson``.

A number of bugs has been fixed in the cluster merge tool.

``x509`` certification verification (used in import-export) has been
changed to allow the same clock skew as permitted by the cluster
verification. This will remove some rare but hard to diagnose errors in
import-export.


Version 2.6.0 rc4
-----------------

*(Released Thu, 19 Jul 2012)*

Very few changes from rc4 to the final release, only bugfixes:

- integrated fixes from release 2.5.2 (fix general boot flag for KVM
  instance, fix CDROM booting for KVM instances)
- fixed node group modification of node parameters
- fixed issue in LUClusterVerifyGroup with multi-group clusters
- fixed generation of bash completion to ensure a stable ordering
- fixed a few typos


Version 2.6.0 rc3
-----------------

*(Released Fri, 13 Jul 2012)*

Third release candidate for 2.6. The following changes were done from
rc3 to rc4:

- Fixed ``UpgradeConfig`` w.r.t. to disk parameters on disk objects.
- Fixed an inconsistency in the LUXI protocol with the provided
  arguments (NOT backwards compatible)
- Fixed a bug with node groups ipolicy where ``min`` was greater than
  the cluster ``std`` value
- Implemented a new ``gnt-node list-drbd`` call to list DRBD minors for
  easier instance debugging on nodes (requires ``hconfd`` to work)


Version 2.6.0 rc2
-----------------

*(Released Tue, 03 Jul 2012)*

Second release candidate for 2.6. The following changes were done from
rc2 to rc3:

- Fixed ``gnt-cluster verify`` regarding ``master-ip-script`` on non
  master candidates
- Fixed a RAPI regression on missing beparams/memory
- Fixed redistribution of files on offline nodes
- Added possibility to run activate-disks even though secondaries are
  offline. With this change it relaxes also the strictness on some other
  commands which use activate disks internally:
  * ``gnt-instance start|reboot|rename|backup|export``
- Made it possible to remove safely an instance if its secondaries are
  offline
- Made it possible to reinstall even though secondaries are offline


Version 2.6.0 rc1
-----------------

*(Released Mon, 25 Jun 2012)*

First release candidate for 2.6. The following changes were done from
rc1 to rc2:

- Fixed bugs with disk parameters and ``rbd`` templates as well as
  ``instance_os_add``
- Made ``gnt-instance modify`` more consistent regarding new NIC/Disk
  behaviour. It supports now the modify operation
- ``hcheck`` implemented to analyze cluster health and possibility of
  improving health by rebalance
- ``hbal`` has been improved in dealing with split instances


Version 2.6.0 beta2
-------------------

*(Released Mon, 11 Jun 2012)*

Second beta release of 2.6. The following changes were done from beta2
to rc1:

- Fixed ``daemon-util`` with non-root user models
- Fixed creation of plain instances with ``--no-wait-for-sync``
- Fix wrong iv_names when running ``cfgupgrade``
- Export more information in RAPI group queries
- Fixed bug when changing instance network interfaces
- Extended burnin to do NIC changes
- query: Added ``<``, ``>``, ``<=``, ``>=`` comparison operators
- Changed default for DRBD barriers
- Fixed DRBD error reporting for syncer rate
- Verify the options on disk parameters

And of course various fixes to documentation and improved unittests and
QA.


Version 2.6.0 beta1
-------------------

*(Released Wed, 23 May 2012)*

First beta release of 2.6. The following changes were done from beta1 to
beta2:

- integrated patch for distributions without ``start-stop-daemon``
- adapted example init.d script to work on Fedora
- fixed log handling in Haskell daemons
- adapted checks in the watcher for pycurl linked against libnss
- add partial support for ``xl`` instead of ``xm`` for Xen
- fixed a type issue in cluster verification
- fixed ssconf handling in the Haskell code (was breaking confd in IPv6
  clusters)

Plus integrated fixes from the 2.5 branch:

- fixed ``kvm-ifup`` to use ``/bin/bash``
- fixed parallel build failures
- KVM live migration when using a custom keymap


Version 2.5.2
-------------

*(Released Tue, 24 Jul 2012)*

A small bugfix release, with no new features:

- fixed bash-isms in kvm-ifup, for compatibility with systems which use a
  different default shell (e.g. Debian, Ubuntu)
- fixed KVM startup and live migration with a custom keymap (fixes Issue
  243 and Debian bug #650664)
- fixed compatibility with KVM versions that don't support multiple boot
  devices (fixes Issue 230 and Debian bug #624256)

Additionally, a few fixes were done to the build system (fixed parallel
build failures) and to the unittests (fixed race condition in test for
FileID functions, and the default enable/disable mode for QA test is now
customisable).


Version 2.5.1
-------------

*(Released Fri, 11 May 2012)*

A small bugfix release.

The main issues solved are on the topic of compatibility with newer LVM
releases:

- fixed parsing of ``lv_attr`` field
- adapted to new ``vgreduce --removemissing`` behaviour where sometimes
  the ``--force`` flag is needed

Also on the topic of compatibility, ``tools/lvmstrap`` has been changed
to accept kernel 3.x too (was hardcoded to 2.6.*).

A regression present in 2.5.0 that broke handling (in the gnt-* scripts)
of hook results and that also made display of other errors suboptimal
was fixed; the code behaves now like 2.4 and earlier.

Another change in 2.5, the cleanup of the OS scripts environment, is too
aggressive: it removed even the ``PATH`` variable, which requires the OS
scripts to *always* need to export it. Since this is a bit too strict,
we now export a minimal PATH, the same that we export for hooks.

The fix for issue 201 (Preserve bridge MTU in KVM ifup script) was
integrated into this release.

Finally, a few other miscellaneous changes were done (no new features,
just small improvements):

- Fix ``gnt-group --help`` display
- Fix hardcoded Xen kernel path
- Fix grow-disk handling of invalid units
- Update synopsis for ``gnt-cluster repair-disk-sizes``
- Accept both PUT and POST in noded (makes future upgrade to 2.6 easier)


Version 2.5.0
-------------

*(Released Thu, 12 Apr 2012)*

Incompatible/important changes and bugfixes
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

- The default of the ``/2/instances/[instance_name]/rename`` RAPI
  resource's ``ip_check`` parameter changed from ``True`` to ``False``
  to match the underlying LUXI interface.
- The ``/2/nodes/[node_name]/evacuate`` RAPI resource was changed to use
  body parameters, see :doc:`RAPI documentation <rapi>`. The server does
  not maintain backwards-compatibility as the underlying operation
  changed in an incompatible way. The RAPI client can talk to old
  servers, but it needs to be told so as the return value changed.
- When creating file-based instances via RAPI, the ``file_driver``
  parameter no longer defaults to ``loop`` and must be specified.
- The deprecated ``bridge`` NIC parameter is no longer supported. Use
  ``link`` instead.
- Support for the undocumented and deprecated RAPI instance creation
  request format version 0 has been dropped. Use version 1, supported
  since Ganeti 2.1.3 and :doc:`documented <rapi>`, instead.
- Pyparsing 1.4.6 or above is required, see :doc:`installation
  documentation <install>`.
- The "cluster-verify" hooks are now executed per group by the
  ``OP_CLUSTER_VERIFY_GROUP`` opcode. This maintains the same behavior
  if you just run ``gnt-cluster verify``, which generates one opcode per
  group.
- The environment as passed to the OS scripts is cleared, and thus no
  environment variables defined in the node daemon's environment will be
  inherited by the scripts.
- The :doc:`iallocator <iallocator>` mode ``multi-evacuate`` has been
  deprecated.
- :doc:`New iallocator modes <design-multi-reloc>` have been added to
  support operations involving multiple node groups.
- Offline nodes are ignored when failing over an instance.
- Support for KVM version 1.0, which changed the version reporting format
  from 3 to 2 digits.
- TCP/IP ports used by DRBD disks are returned to a pool upon instance
  removal.
- ``Makefile`` is now compatible with Automake 1.11.2
- Includes all bugfixes made in the 2.4 series

New features
~~~~~~~~~~~~

- The ganeti-htools project has been merged into the ganeti-core source
  tree and will be built as part of Ganeti (see :doc:`install-quick`).
- Implemented support for :doc:`shared storage <design-shared-storage>`.
- Add support for disks larger than 2 TB in ``lvmstrap`` by supporting
  GPT-style partition tables (requires `parted
  <http://www.gnu.org/s/parted/>`_).
- Added support for floppy drive and 2nd CD-ROM drive in KVM hypervisor.
- Allowed adding tags on instance creation.
- Export instance tags to hooks (``INSTANCE_TAGS``, see :doc:`hooks`)
- Allow instances to be started in a paused state, enabling the user to
  see the complete console output on boot using the console.
- Added new hypervisor flag to control default reboot behaviour
  (``reboot_behavior``).
- Added support for KVM keymaps (hypervisor parameter ``keymap``).
- Improved out-of-band management support:

  - Added ``gnt-node health`` command reporting the health status of
    nodes.
  - Added ``gnt-node power`` command to manage power status of nodes.
  - Added command for emergency power-off (EPO), ``gnt-cluster epo``.

- Instance migration can fall back to failover if instance is not
  running.
- Filters can be used when listing nodes, instances, groups and locks;
  see :manpage:`ganeti(7)` manpage.
- Added post-execution status as variables to :doc:`hooks <hooks>`
  environment.
- Instance tags are exported/imported together with the instance.
- When given an explicit job ID, ``gnt-job info`` will work for archived
  jobs.
- Jobs can define dependencies on other jobs (not yet supported via
  RAPI or command line, but used by internal commands and usable via
  LUXI).

  - Lock monitor (``gnt-debug locks``) shows jobs waiting for
    dependencies.

- Instance failover is now available as a RAPI resource
  (``/2/instances/[instance_name]/failover``).
- ``gnt-instance info`` defaults to static information if primary node
  is offline.
- Opcodes have a new ``comment`` attribute.
- Added basic SPICE support to KVM hypervisor.
- ``tools/ganeti-listrunner`` allows passing of arguments to executable.

Node group improvements
~~~~~~~~~~~~~~~~~~~~~~~

- ``gnt-cluster verify`` has been modified to check groups separately,
  thereby improving performance.
- Node group support has been added to ``gnt-cluster verify-disks``,
  which now operates per node group.
- Watcher has been changed to work better with node groups.

  - One process and state file per node group.
  - Slow watcher in one group doesn't block other group's watcher.

- Added new command, ``gnt-group evacuate``, to move all instances in a
  node group to other groups.
- Added ``gnt-instance change-group`` to move an instance to another
  node group.
- ``gnt-cluster command`` and ``gnt-cluster copyfile`` now support
  per-group operations.
- Node groups can be tagged.
- Some operations switch from an exclusive to a shared lock as soon as
  possible.
- Instance's primary and secondary nodes' groups are now available as
  query fields (``pnode.group``, ``pnode.group.uuid``, ``snodes.group``
  and ``snodes.group.uuid``).

Misc
~~~~

- Numerous updates to documentation and manpages.

  - :doc:`RAPI <rapi>` documentation now has detailed parameter
    descriptions.
  - Some opcode/job results are now also documented, see :doc:`RAPI
    <rapi>`.

- A lockset's internal lock is now also visible in lock monitor.
- Log messages from job queue workers now contain information about the
  opcode they're processing.
- ``gnt-instance console`` no longer requires the instance lock.
- A short delay when waiting for job changes reduces the number of LUXI
  requests significantly.
- DRBD metadata volumes are overwritten with zeros during disk creation.
- Out-of-band commands no longer acquire the cluster lock in exclusive
  mode.
- ``devel/upload`` now uses correct permissions for directories.


Version 2.5.0 rc6
-----------------

*(Released Fri, 23 Mar 2012)*

This was the sixth release candidate of the 2.5 series.


Version 2.5.0 rc5
-----------------

*(Released Mon, 9 Jan 2012)*

This was the fifth release candidate of the 2.5 series.


Version 2.5.0 rc4
-----------------

*(Released Thu, 27 Oct 2011)*

This was the fourth release candidate of the 2.5 series.


Version 2.5.0 rc3
-----------------

*(Released Wed, 26 Oct 2011)*

This was the third release candidate of the 2.5 series.


Version 2.5.0 rc2
-----------------

*(Released Tue, 18 Oct 2011)*

This was the second release candidate of the 2.5 series.


Version 2.5.0 rc1
-----------------

*(Released Tue, 4 Oct 2011)*

This was the first release candidate of the 2.5 series.


Version 2.5.0 beta3
-------------------

*(Released Wed, 31 Aug 2011)*

This was the third beta release of the 2.5 series.


Version 2.5.0 beta2
-------------------

*(Released Mon, 22 Aug 2011)*

This was the second beta release of the 2.5 series.


Version 2.5.0 beta1
-------------------

*(Released Fri, 12 Aug 2011)*

This was the first beta release of the 2.5 series.


Version 2.4.5
-------------

*(Released Thu, 27 Oct 2011)*

- Fixed bug when parsing command line parameter values ending in
  backslash
- Fixed assertion error after unclean master shutdown
- Disable HTTP client pool for RPC, significantly reducing memory usage
  of master daemon
- Fixed queue archive creation with wrong permissions


Version 2.4.4
-------------

*(Released Tue, 23 Aug 2011)*

Small bug-fixes:

- Fixed documentation for importing with ``--src-dir`` option
- Fixed a bug in ``ensure-dirs`` with queue/archive permissions
- Fixed a parsing issue with DRBD 8.3.11 in the Linux kernel


Version 2.4.3
-------------

*(Released Fri, 5 Aug 2011)*

Many bug-fixes and a few small features:

- Fixed argument order in ``ReserveLV`` and ``ReserveMAC`` which caused
  issues when you tried to add an instance with two MAC addresses in one
  request
- KVM: fixed per-instance stored UID value
- KVM: configure bridged NICs at migration start
- KVM: Fix a bug where instance will not start with never KVM versions
  (>= 0.14)
- Added OS search path to ``gnt-cluster info``
- Fixed an issue with ``file_storage_dir`` where you were forced to
  provide an absolute path, but the documentation states it is a
  relative path, the documentation was right
- Added a new parameter to instance stop/start called ``--no-remember``
  that will make the state change to not be remembered
- Implemented ``no_remember`` at RAPI level
- Improved the documentation
- Node evacuation: don't call IAllocator if node is already empty
- Fixed bug in DRBD8 replace disks on current nodes
- Fixed bug in recreate-disks for DRBD instances
- Moved assertion checking locks in ``gnt-instance replace-disks``
  causing it to abort with not owning the right locks for some situation
- Job queue: Fixed potential race condition when cancelling queued jobs
- Fixed off-by-one bug in job serial generation
- ``gnt-node volumes``: Fix instance names
- Fixed aliases in bash completion
- Fixed a bug in reopening log files after being sent a SIGHUP
- Added a flag to burnin to allow specifying VCPU count
- Bugfixes to non-root Ganeti configuration


Version 2.4.2
-------------

*(Released Thu, 12 May 2011)*

Many bug-fixes and a few new small features:

- Fixed a bug related to log opening failures
- Fixed a bug in instance listing with orphan instances
- Fixed a bug which prevented resetting the cluster-level node parameter
  ``oob_program`` to the default
- Many fixes related to the ``cluster-merge`` tool
- Fixed a race condition in the lock monitor, which caused failures
  during (at least) creation of many instances in parallel
- Improved output for gnt-job info
- Removed the quiet flag on some ssh calls which prevented debugging
  failures
- Improved the N+1 failure messages in cluster verify by actually
  showing the memory values (needed and available)
- Increased lock attempt timeouts so that when executing long operations
  (e.g. DRBD replace-disks) other jobs do not enter 'blocking acquire'
  too early and thus prevent the use of the 'fair' mechanism
- Changed instance query data (``gnt-instance info``) to not acquire
  locks unless needed, thus allowing its use on locked instance if only
  static information is asked for
- Improved behaviour with filesystems that do not support rename on an
  opened file
- Fixed the behaviour of ``prealloc_wipe_disks`` cluster parameter which
  kept locks on all nodes during the wipe, which is unneeded
- Fixed ``gnt-watcher`` handling of errors during hooks execution
- Fixed bug in ``prealloc_wipe_disks`` with small disk sizes (less than
  10GiB) which caused the wipe to fail right at the end in some cases
- Fixed master IP activation when doing master failover with no-voting
- Fixed bug in ``gnt-node add --readd`` which allowed the re-adding of
  the master node itself
- Fixed potential data-loss in under disk full conditions, where Ganeti
  wouldn't check correctly the return code and would consider
  partially-written files 'correct'
- Fixed bug related to multiple VGs and DRBD disk replacing
- Added new disk parameter ``metavg`` that allows placement of the meta
  device for DRBD in a different volume group
- Fixed error handling in the node daemon when the system libc doesn't
  have major number 6 (i.e. if ``libc.so.6`` is not the actual libc)
- Fixed lock release during replace-disks, which kept cluster-wide locks
  when doing disk replaces with an iallocator script
- Added check for missing bridges in cluster verify
- Handle EPIPE errors while writing to the terminal better, so that
  piping the output to e.g. ``less`` doesn't cause a backtrace
- Fixed rare case where a ^C during Luxi calls could have been
  interpreted as server errors, instead of simply terminating
- Fixed a race condition in LUGroupAssignNodes (``gnt-group
  assign-nodes``)
- Added a few more parameters to the KVM hypervisor, allowing a second
  CDROM, custom disk type for CDROMs and a floppy image
- Removed redundant message in instance rename when the name is given
  already as a FQDN
- Added option to ``gnt-instance recreate-disks`` to allow creating the
  disks on new nodes, allowing recreation when the original instance
  nodes are completely gone
- Added option when converting disk templates to DRBD to skip waiting
  for the resync, in order to make the instance available sooner
- Added two new variables to the OS scripts environment (containing the
  instance's nodes)
- Made the root_path and optional parameter for the xen-pvm hypervisor,
  to allow use of ``pvgrub`` as bootloader
- Changed the instance memory modifications to only check out-of-memory
  conditions on memory increases, and turned the secondary node warnings
  into errors (they can still be overridden via ``--force``)
- Fixed the handling of a corner case when the Python installation gets
  corrupted (e.g. a bad disk) while ganeti-noded is running and we try
  to execute a command that doesn't exist
- Fixed a bug in ``gnt-instance move`` (LUInstanceMove) when the primary
  node of the instance returned failures during instance shutdown; this
  adds the option ``--ignore-consistency`` to gnt-instance move

And as usual, various improvements to the error messages, documentation
and man pages.


Version 2.4.1
-------------

*(Released Wed, 09 Mar 2011)*

Emergency bug-fix release. ``tools/cfgupgrade`` was broken and overwrote
the RAPI users file if run twice (even with ``--dry-run``).

The release fixes that bug (nothing else changed).


Version 2.4.0
-------------

*(Released Mon, 07 Mar 2011)*

Final 2.4.0 release. Just a few small fixes:

- Fixed RAPI node evacuate
- Fixed the kvm-ifup script
- Fixed internal error handling for special job cases
- Updated man page to specify the escaping feature for options


Version 2.4.0 rc3
-----------------

*(Released Mon, 28 Feb 2011)*

A critical fix for the ``prealloc_wipe_disks`` feature: it is possible
that this feature wiped the disks of the wrong instance, leading to loss
of data.

Other changes:

- Fixed title of query field containing instance name
- Expanded the glossary in the documentation
- Fixed one unittest (internal issue)


Version 2.4.0 rc2
-----------------

*(Released Mon, 21 Feb 2011)*

A number of bug fixes plus just a couple functionality changes.

On the user-visible side, the ``gnt-* list`` command output has changed
with respect to "special" field states. The current rc1 style of display
can be re-enabled by passing a new ``--verbose`` (``-v``) flag, but in
the default output mode special fields states are displayed as follows:

- Offline resource: ``*``
- Unavailable/not applicable: ``-``
- Data missing (RPC failure): ``?``
- Unknown field: ``??``

Another user-visible change is the addition of ``--force-join`` to
``gnt-node add``.

As for bug fixes:

- ``tools/cluster-merge`` has seen many fixes and is now enabled again
- Fixed regression in RAPI/instance reinstall where all parameters were
  required (instead of optional)
- Fixed ``gnt-cluster repair-disk-sizes``, was broken since Ganeti 2.2
- Fixed iallocator usage (offline nodes were not considered offline)
- Fixed ``gnt-node list`` with respect to non-vm_capable nodes
- Fixed hypervisor and OS parameter validation with respect to
  non-vm_capable nodes
- Fixed ``gnt-cluster verify`` with respect to offline nodes (mostly
  cosmetic)
- Fixed ``tools/listrunner`` with respect to agent-based usage


Version 2.4.0 rc1
-----------------

*(Released Fri,  4 Feb 2011)*

Many changes and fixes since the beta1 release. While there were some
internal changes, the code has been mostly stabilised for the RC
release.

Note: the dumb allocator was removed in this release, as it was not kept
up-to-date with the IAllocator protocol changes. It is recommended to
use the ``hail`` command from the ganeti-htools package.

Note: the 2.4 and up versions of Ganeti are not compatible with the
0.2.x branch of ganeti-htools. You need to upgrade to
ganeti-htools-0.3.0 (or later).

Regressions fixed from 2.3
~~~~~~~~~~~~~~~~~~~~~~~~~~

- Fixed the ``gnt-cluster verify-disks`` command
- Made ``gnt-cluster verify-disks`` work in parallel (as opposed to
  serially on nodes)
- Fixed disk adoption breakage
- Fixed wrong headers in instance listing for field aliases

Other bugs fixed
~~~~~~~~~~~~~~~~

- Fixed corner case in KVM handling of NICs
- Fixed many cases of wrong handling of non-vm_capable nodes
- Fixed a bug where a missing instance symlink was not possible to
  recreate with any ``gnt-*`` command (now ``gnt-instance
  activate-disks`` does it)
- Fixed the volume group name as reported by ``gnt-cluster
  verify-disks``
- Increased timeouts for the import-export code, hopefully leading to
  fewer aborts due network or instance timeouts
- Fixed bug in ``gnt-node list-storage``
- Fixed bug where not all daemons were started on cluster
  initialisation, but only at the first watcher run
- Fixed many bugs in the OOB implementation
- Fixed watcher behaviour in presence of instances with offline
  secondaries
- Fixed instance list output for instances running on the wrong node
- a few fixes to the cluster-merge tool, but it still cannot merge
  multi-node groups (currently it is not recommended to use this tool)


Improvements
~~~~~~~~~~~~

- Improved network configuration for the KVM hypervisor
- Added e1000 as a supported NIC for Xen-HVM
- Improved the lvmstrap tool to also be able to use partitions, as
  opposed to full disks
- Improved speed of disk wiping (the cluster parameter
  ``prealloc_wipe_disks``, so that it has a low impact on the total time
  of instance creations
- Added documentation for the OS parameters
- Changed ``gnt-instance deactivate-disks`` so that it can work if the
  hypervisor is not responding
- Added display of blacklisted and hidden OS information in
  ``gnt-cluster info``
- Extended ``gnt-cluster verify`` to also validate hypervisor, backend,
  NIC and node parameters, which might create problems with currently
  invalid (but undetected) configuration files, but prevents validation
  failures when unrelated parameters are modified
- Changed cluster initialisation to wait for the master daemon to become
  available
- Expanded the RAPI interface:

  - Added config redistribution resource
  - Added activation/deactivation of instance disks
  - Added export of console information

- Implemented log file reopening on SIGHUP, which allows using
  logrotate(8) for the Ganeti log files
- Added a basic OOB helper script as an example


Version 2.4.0 beta1
-------------------

*(Released Fri, 14 Jan 2011)*

User-visible
~~~~~~~~~~~~

- Fixed timezone issues when formatting timestamps
- Added support for node groups, available via ``gnt-group`` and other
  commands
- Added out-of-band framework and management, see :doc:`design
  document <design-oob>`
- Removed support for roman numbers from ``gnt-node list`` and
  ``gnt-instance list``.
- Allowed modification of master network interface via ``gnt-cluster
  modify --master-netdev``
- Accept offline secondaries while shutting down instance disks
- Added ``blockdev_prefix`` parameter to Xen PVM and HVM hypervisors
- Added support for multiple LVM volume groups
- Avoid sorting nodes for ``gnt-node list`` if specific nodes are
  requested
- Added commands to list available fields:

  - ``gnt-node list-fields``
  - ``gnt-group list-fields``
  - ``gnt-instance list-fields``

- Updated documentation and man pages

Integration
~~~~~~~~~~~

- Moved ``rapi_users`` file into separate directory, now named
  ``.../ganeti/rapi/users``, ``cfgupgrade`` moves the file and creates a
  symlink
- Added new tool for running commands on many machines,
  ``tools/ganeti-listrunner``
- Implemented more verbose result in ``OpInstanceConsole`` opcode, also
  improving the ``gnt-instance console`` output
- Allowed customisation of disk index separator at ``configure`` time
- Export node group allocation policy to :doc:`iallocator <iallocator>`
- Added support for non-partitioned md disks in ``lvmstrap``
- Added script to gracefully power off KVM instances
- Split ``utils`` module into smaller parts
- Changed query operations to return more detailed information, e.g.
  whether an information is unavailable due to an offline node. To use
  this new functionality, the LUXI call ``Query`` must be used. Field
  information is now stored by the master daemon and can be retrieved
  using ``QueryFields``. Instances, nodes and groups can also be queried
  using the new opcodes ``OpQuery`` and ``OpQueryFields`` (not yet
  exposed via RAPI). The following commands make use of this
  infrastructure change:

  - ``gnt-group list``
  - ``gnt-group list-fields``
  - ``gnt-node list``
  - ``gnt-node list-fields``
  - ``gnt-instance list``
  - ``gnt-instance list-fields``
  - ``gnt-debug locks``

Remote API
~~~~~~~~~~

- New RAPI resources (see :doc:`rapi`):

  - ``/2/modify``
  - ``/2/groups``
  - ``/2/groups/[group_name]``
  - ``/2/groups/[group_name]/assign-nodes``
  - ``/2/groups/[group_name]/modify``
  - ``/2/groups/[group_name]/rename``
  - ``/2/instances/[instance_name]/disk/[disk_index]/grow``

- RAPI changes:

  - Implemented ``no_install`` for instance creation
  - Implemented OS parameters for instance reinstallation, allowing
    use of special settings on reinstallation (e.g. for preserving data)

Misc
~~~~

- Added IPv6 support in import/export
- Pause DRBD synchronization while wiping disks on instance creation
- Updated unittests and QA scripts
- Improved network parameters passed to KVM
- Converted man pages from docbook to reStructuredText


Version 2.3.1
-------------

*(Released Mon, 20 Dec 2010)*

Released version 2.3.1~rc1 without any changes.


Version 2.3.1 rc1
-----------------

*(Released Wed, 1 Dec 2010)*

- impexpd: Disable OpenSSL compression in socat if possible (backport
  from master, commit e90739d625b, see :doc:`installation guide
  <install-quick>` for details)
- Changed unittest coverage report to exclude test scripts
- Added script to check version format


Version 2.3.0
-------------

*(Released Wed, 1 Dec 2010)*

Released version 2.3.0~rc1 without any changes.


Version 2.3.0 rc1
-----------------

*(Released Fri, 19 Nov 2010)*

A number of bugfixes and documentation updates:

- Update ganeti-os-interface documentation
- Fixed a bug related to duplicate MACs or similar items which should be
  unique
- Fix breakage in OS state modify
- Reinstall instance: disallow offline secondaries (fixes bug related to
  OS changing but reinstall failing)
- plus all the other fixes between 2.2.1 and 2.2.2


Version 2.3.0 rc0
-----------------

*(Released Tue, 2 Nov 2010)*

- Fixed clearing of the default iallocator using ``gnt-cluster modify``
- Fixed master failover race with watcher
- Fixed a bug in ``gnt-node modify`` which could lead to an inconsistent
  configuration
- Accept previously stopped instance for export with instance removal
- Simplify and extend the environment variables for instance OS scripts
- Added new node flags, ``master_capable`` and ``vm_capable``
- Added optional instance disk wiping prior during allocation. This is a
  cluster-wide option and can be set/modified using
  ``gnt-cluster {init,modify} --prealloc-wipe-disks``.
- Added IPv6 support, see :doc:`design document <design-2.3>` and
  :doc:`install-quick`
- Added a new watcher option (``--ignore-pause``)
- Added option to ignore offline node on instance start/stop
  (``--ignore-offline``)
- Allow overriding OS parameters with ``gnt-instance reinstall``
- Added ability to change node's secondary IP address using ``gnt-node
  modify``
- Implemented privilege separation for all daemons except
  ``ganeti-noded``, see ``configure`` options
- Complain if an instance's disk is marked faulty in ``gnt-cluster
  verify``
- Implemented job priorities (see ``ganeti(7)`` manpage)
- Ignore failures while shutting down instances during failover from
  offline node
- Exit daemon's bootstrap process only once daemon is ready
- Export more information via ``LUInstanceQuery``/remote API
- Improved documentation, QA and unittests
- RAPI daemon now watches ``rapi_users`` all the time and doesn't need a
  restart if the file was created or changed
- Added LUXI protocol version sent with each request and response,
  allowing detection of server/client mismatches
- Moved the Python scripts among gnt-* and ganeti-* into modules
- Moved all code related to setting up SSH to an external script,
  ``setup-ssh``
- Infrastructure changes for node group support in future versions


Version 2.2.2
-------------

*(Released Fri, 19 Nov 2010)*

A few small bugs fixed, and some improvements to the build system:

- Fix documentation regarding conversion to drbd
- Fix validation of parameters in cluster modify (``gnt-cluster modify
  -B``)
- Fix error handling in node modify with multiple changes
- Allow remote imports without checked names


Version 2.2.1
-------------

*(Released Tue, 19 Oct 2010)*

- Disable SSL session ID cache in RPC client


Version 2.2.1 rc1
-----------------

*(Released Thu, 14 Oct 2010)*

- Fix interaction between Curl/GnuTLS and the Python's HTTP server
  (thanks Apollon Oikonomopoulos!), finally allowing the use of Curl
  with GnuTLS
- Fix problems with interaction between Curl and Python's HTTP server,
  resulting in increased speed in many RPC calls
- Improve our release script to prevent breakage with older aclocal and
  Python 2.6


Version 2.2.1 rc0
-----------------

*(Released Thu, 7 Oct 2010)*

- Fixed issue 125, replace hardcoded "xenvg" in ``gnt-cluster`` with
  value retrieved from master
- Added support for blacklisted or hidden OS definitions
- Added simple lock monitor (accessible via (``gnt-debug locks``)
- Added support for -mem-path in KVM hypervisor abstraction layer
- Allow overriding instance parameters in tool for inter-cluster
  instance moves (``tools/move-instance``)
- Improved opcode summaries (e.g. in ``gnt-job list``)
- Improve consistency of OS listing by sorting it
- Documentation updates


Version 2.2.0.1
---------------

*(Released Fri, 8 Oct 2010)*

- Rebuild with a newer autotools version, to fix python 2.6 compatibility


Version 2.2.0
-------------

*(Released Mon, 4 Oct 2010)*

- Fixed regression in ``gnt-instance rename``


Version 2.2.0 rc2
-----------------

*(Released Wed, 22 Sep 2010)*

- Fixed OS_VARIANT variable for OS scripts
- Fixed cluster tag operations via RAPI
- Made ``setup-ssh`` exit with non-zero code if an error occurred
- Disabled RAPI CA checks in watcher


Version 2.2.0 rc1
-----------------

*(Released Mon, 23 Aug 2010)*

- Support DRBD versions of the format "a.b.c.d"
- Updated manpages
- Re-introduce support for usage from multiple threads in RAPI client
- Instance renames and modify via RAPI
- Work around race condition between processing and archival in job
  queue
- Mark opcodes following failed one as failed, too
- Job field ``lock_status`` was removed due to difficulties making it
  work with the changed job queue in Ganeti 2.2; a better way to monitor
  locks is expected for a later 2.2.x release
- Fixed dry-run behaviour with many commands
- Support ``ssh-agent`` again when adding nodes
- Many additional bugfixes


Version 2.2.0 rc0
-----------------

*(Released Fri, 30 Jul 2010)*

Important change: the internal RPC mechanism between Ganeti nodes has
changed from using a home-grown http library (based on the Python base
libraries) to use the PycURL library. This requires that PycURL is
installed on nodes. Please note that on Debian/Ubuntu, PycURL is linked
against GnuTLS by default. cURL's support for GnuTLS had known issues
before cURL 7.21.0 and we recommend using the latest cURL release or
linking against OpenSSL. Most other distributions already link PycURL
and cURL against OpenSSL. The command::

  python -c 'import pycurl; print pycurl.version'

can be used to determine the libraries PycURL and cURL are linked
against.

Other significant changes:

- Rewrote much of the internals of the job queue, in order to achieve
  better parallelism; this decouples job query operations from the job
  processing, and it should allow much nicer behaviour of the master
  daemon under load, and it also has uncovered some long-standing bugs
  related to the job serialisation (now fixed)
- Added a default iallocator setting to the cluster parameters,
  eliminating the need to always pass nodes or an iallocator for
  operations that require selection of new node(s)
- Added experimental support for the LXC virtualization method
- Added support for OS parameters, which allows the installation of
  instances to pass parameter to OS scripts in order to customise the
  instance
- Added a hypervisor parameter controlling the migration type (live or
  non-live), since hypervisors have various levels of reliability; this
  has renamed the 'live' parameter to 'mode'
- Added a cluster parameter ``reserved_lvs`` that denotes reserved
  logical volumes, meaning that cluster verify will ignore them and not
  flag their presence as errors
- The watcher will now reset the error count for failed instances after
  8 hours, thus allowing self-healing if the problem that caused the
  instances to be down/fail to start has cleared in the meantime
- Added a cluster parameter ``drbd_usermode_helper`` that makes Ganeti
  check for, and warn, if the drbd module parameter ``usermode_helper``
  is not consistent with the cluster-wide setting; this is needed to
  make diagnose easier of failed drbd creations
- Started adding base IPv6 support, but this is not yet
  enabled/available for use
- Rename operations (cluster, instance) will now return the new name,
  which is especially useful if a short name was passed in
- Added support for instance migration in RAPI
- Added a tool to pre-configure nodes for the SSH setup, before joining
  them to the cluster; this will allow in the future a simplified model
  for node joining (but not yet fully enabled in 2.2); this needs the
  paramiko python library
- Fixed handling of name-resolving errors
- Fixed consistency of job results on the error path
- Fixed master-failover race condition when executed multiple times in
  sequence
- Fixed many bugs related to the job queue (mostly introduced during the
  2.2 development cycle, so not all are impacting 2.1)
- Fixed instance migration with missing disk symlinks
- Fixed handling of unknown jobs in ``gnt-job archive``
- And many other small fixes/improvements

Internal changes:

- Enhanced both the unittest and the QA coverage
- Switched the opcode validation to a generic model, and extended the
  validation to all opcode parameters
- Changed more parts of the code that write shell scripts to use the
  same class for this
- Switched the master daemon to use the asyncore library for the Luxi
  server endpoint


Version 2.2.0 beta0
-------------------

*(Released Thu, 17 Jun 2010)*

- Added tool (``move-instance``) and infrastructure to move instances
  between separate clusters (see :doc:`separate documentation
  <move-instance>` and :doc:`design document <design-2.2>`)
- Added per-request RPC timeout
- RAPI now requires a Content-Type header for requests with a body (e.g.
  ``PUT`` or ``POST``) which must be set to ``application/json`` (see
  :rfc:`2616` (HTTP/1.1), section 7.2.1)
- ``ganeti-watcher`` attempts to restart ``ganeti-rapi`` if RAPI is not
  reachable
- Implemented initial support for running Ganeti daemons as separate
  users, see configure-time flags ``--with-user-prefix`` and
  ``--with-group-prefix`` (only ``ganeti-rapi`` is supported at this
  time)
- Instances can be removed after export (``gnt-backup export
  --remove-instance``)
- Self-signed certificates generated by Ganeti now use a 2048 bit RSA
  key (instead of 1024 bit)
- Added new cluster configuration file for cluster domain secret
- Import/export now use SSL instead of SSH
- Added support for showing estimated time when exporting an instance,
  see the ``ganeti-os-interface(7)`` manpage and look for
  ``EXP_SIZE_FD``


Version 2.1.8
-------------

*(Released Tue, 16 Nov 2010)*

Some more bugfixes. Unless critical bugs occur, this will be the last
2.1 release:

- Fix case of MAC special-values
- Fix mac checker regex
- backend: Fix typo causing "out of range" error
- Add missing --units in gnt-instance list man page


Version 2.1.7
-------------

*(Released Tue, 24 Aug 2010)*

Bugfixes only:
  - Don't ignore secondary node silently on non-mirrored disk templates
    (issue 113)
  - Fix --master-netdev arg name in gnt-cluster(8) (issue 114)
  - Fix usb_mouse parameter breaking with vnc_console (issue 109)
  - Properly document the usb_mouse parameter
  - Fix path in ganeti-rapi(8) (issue 116)
  - Adjust error message when the ganeti user's .ssh directory is
    missing
  - Add same-node-check when changing the disk template to drbd


Version 2.1.6
-------------

*(Released Fri, 16 Jul 2010)*

Bugfixes only:
  - Add an option to only select some reboot types during qa/burnin.
    (on some hypervisors consequent reboots are not supported)
  - Fix infrequent race condition in master failover. Sometimes the old
    master ip address would be still detected as up for a short time
    after it was removed, causing failover to fail.
  - Decrease mlockall warnings when the ctypes module is missing. On
    Python 2.4 we support running even if no ctypes module is installed,
    but we were too verbose about this issue.
  - Fix building on old distributions, on which man doesn't have a
    --warnings option.
  - Fix RAPI not to ignore the MAC address on instance creation
  - Implement the old instance creation format in the RAPI client.


Version 2.1.5
-------------

*(Released Thu, 01 Jul 2010)*

A small bugfix release:
  - Fix disk adoption: broken by strict --disk option checking in 2.1.4
  - Fix batch-create: broken in the whole 2.1 series due to a lookup on
    a non-existing option
  - Fix instance create: the --force-variant option was ignored
  - Improve pylint 0.21 compatibility and warnings with Python 2.6
  - Fix modify node storage with non-FQDN arguments
  - Fix RAPI client to authenticate under Python 2.6 when used
    for more than 5 requests needing authentication
  - Fix gnt-instance modify -t (storage) giving a wrong error message
    when converting a non-shutdown drbd instance to plain


Version 2.1.4
-------------

*(Released Fri, 18 Jun 2010)*

A small bugfix release:

  - Fix live migration of KVM instances started with older Ganeti
    versions which had fewer hypervisor parameters
  - Fix gnt-instance grow-disk on down instances
  - Fix an error-reporting bug during instance migration
  - Better checking of the ``--net`` and ``--disk`` values, to avoid
    silently ignoring broken ones
  - Fix an RPC error reporting bug affecting, for example, RAPI client
    users
  - Fix bug triggered by different API version os-es on different nodes
  - Fix a bug in instance startup with custom hvparams: OS level
    parameters would fail to be applied.
  - Fix the RAPI client under Python 2.6 (but more work is needed to
    make it work completely well with OpenSSL)
  - Fix handling of errors when resolving names from DNS


Version 2.1.3
-------------

*(Released Thu, 3 Jun 2010)*

A medium sized development cycle. Some new features, and some
fixes/small improvements/cleanups.

Significant features
~~~~~~~~~~~~~~~~~~~~

The node deamon now tries to mlock itself into memory, unless the
``--no-mlock`` flag is passed. It also doesn't fail if it can't write
its logs, and falls back to console logging. This allows emergency
features such as ``gnt-node powercycle`` to work even in the event of a
broken node disk (tested offlining the disk hosting the node's
filesystem and dropping its memory caches; don't try this at home)

KVM: add vhost-net acceleration support. It can be tested with a new
enough version of the kernel and of qemu-kvm.

KVM: Add instance chrooting feature. If you use privilege dropping for
your VMs you can also now force them to chroot to an empty directory,
before starting the emulated guest.

KVM: Add maximum migration bandwith and maximum downtime tweaking
support (requires a new-enough version of qemu-kvm).

Cluster verify will now warn if the master node doesn't have the master
ip configured on it.

Add a new (incompatible) instance creation request format to RAPI which
supports all parameters (previously only a subset was supported, and it
wasn't possible to extend the old format to accomodate all the new
features. The old format is still supported, and a client can check for
this feature, before using it, by checking for its presence in the
``features`` RAPI resource.

Now with ancient latin support. Try it passing the ``--roman`` option to
``gnt-instance info``, ``gnt-cluster info`` or ``gnt-node list``
(requires the python-roman module to be installed, in order to work).

Other changes
~~~~~~~~~~~~~

As usual many internal code refactorings, documentation updates, and
such. Among others:

  - Lots of improvements and cleanups to the experimental Remote API
    (RAPI) client library.
  - A new unit test suite for the core daemon libraries.
  - A fix to creating missing directories makes sure the umask is not
    applied anymore. This enforces the same directory permissions
    everywhere.
  - Better handling terminating daemons with ctrl+c (used when running
    them in debugging mode).
  - Fix a race condition in live migrating a KVM instance, when stat()
    on the old proc status file returned EINVAL, which is an unexpected
    value.
  - Fixed manpage checking with newer man and utf-8 charachters. But now
    you need the en_US.UTF-8 locale enabled to build Ganeti from git.


Version 2.1.2.1
---------------

*(Released Fri, 7 May 2010)*

Fix a bug which prevented untagged KVM instances from starting.


Version 2.1.2
-------------

*(Released Fri, 7 May 2010)*

Another release with a long development cycle, during which many
different features were added.

Significant features
~~~~~~~~~~~~~~~~~~~~

The KVM hypervisor now can run the individual instances as non-root, to
reduce the impact of a VM being hijacked due to bugs in the
hypervisor. It is possible to run all instances as a single (non-root)
user, to manually specify a user for each instance, or to dynamically
allocate a user out of a cluster-wide pool to each instance, with the
guarantee that no two instances will run under the same user ID on any
given node.

An experimental RAPI client library, that can be used standalone
(without the other Ganeti libraries), is provided in the source tree as
``lib/rapi/client.py``. Note this client might change its interface in
the future, as we iterate on its capabilities.

A new command, ``gnt-cluster renew-crypto`` has been added to easily
replace the cluster's certificates and crypto keys. This might help in
case they have been compromised, or have simply expired.

A new disk option for instance creation has been added that allows one
to "adopt" currently existing logical volumes, with data
preservation. This should allow easier migration to Ganeti from
unmanaged (or managed via other software) instances.

Another disk improvement is the possibility to convert between redundant
(DRBD) and plain (LVM) disk configuration for an instance. This should
allow better scalability (starting with one node and growing the
cluster, or shrinking a two-node cluster to one node).

A new feature that could help with automated node failovers has been
implemented: if a node sees itself as offline (by querying the master
candidates), it will try to shutdown (hard) all instances and any active
DRBD devices. This reduces the risk of duplicate instances if an
external script automatically failovers the instances on such nodes. To
enable this, the cluster parameter ``maintain_node_health`` should be
enabled; in the future this option (per the name) will enable other
automatic maintenance features.

Instance export/import now will reuse the original instance
specifications for all parameters; that means exporting an instance,
deleting it and the importing it back should give an almost identical
instance. Note that the default import behaviour has changed from
before, where it created only one NIC; now it recreates the original
number of NICs.

Cluster verify has added a few new checks: SSL certificates validity,
/etc/hosts consistency across the cluster, etc.

Other changes
~~~~~~~~~~~~~

As usual, many internal changes were done, documentation fixes,
etc. Among others:

- Fixed cluster initialization with disabled cluster storage (regression
  introduced in 2.1.1)
- File-based storage supports growing the disks
- Fixed behaviour of node role changes
- Fixed cluster verify for some corner cases, plus a general rewrite of
  cluster verify to allow future extension with more checks
- Fixed log spamming by watcher and node daemon (regression introduced
  in 2.1.1)
- Fixed possible validation issues when changing the list of enabled
  hypervisors
- Fixed cleanup of /etc/hosts during node removal
- Fixed RAPI response for invalid methods
- Fixed bug with hashed passwords in ``ganeti-rapi`` daemon
- Multiple small improvements to the KVM hypervisor (VNC usage, booting
  from ide disks, etc.)
- Allow OS changes without re-installation (to record a changed OS
  outside of Ganeti, or to allow OS renames)
- Allow instance creation without OS installation (useful for example if
  the OS will be installed manually, or restored from a backup not in
  Ganeti format)
- Implemented option to make cluster ``copyfile`` use the replication
  network
- Added list of enabled hypervisors to ssconf (possibly useful for
  external scripts)
- Added a new tool (``tools/cfgupgrade12``) that allows upgrading from
  1.2 clusters
- A partial form of node re-IP is possible via node readd, which now
  allows changed node primary IP
- Command line utilities now show an informational message if the job is
  waiting for a lock
- The logs of the master daemon now show the PID/UID/GID of the
  connected client


Version 2.1.1
-------------

*(Released Fri, 12 Mar 2010)*

During the 2.1.0 long release candidate cycle, a lot of improvements and
changes have accumulated with were released later as 2.1.1.

Major changes
~~~~~~~~~~~~~

The node evacuate command (``gnt-node evacuate``) was significantly
rewritten, and as such the IAllocator protocol was changed - a new
request type has been added. This unfortunate change during a stable
series is designed to improve performance of node evacuations; on
clusters with more than about five nodes and which are well-balanced,
evacuation should proceed in parallel for all instances of the node
being evacuated. As such, any existing IAllocator scripts need to be
updated, otherwise the above command will fail due to the unknown
request. The provided "dumb" allocator has not been updated; but the
ganeti-htools package supports the new protocol since version 0.2.4.

Another important change is increased validation of node and instance
names. This might create problems in special cases, if invalid host
names are being used.

Also, a new layer of hypervisor parameters has been added, that sits at
OS level between the cluster defaults and the instance ones. This allows
customisation of virtualization parameters depending on the installed
OS. For example instances with OS 'X' may have a different KVM kernel
(or any other parameter) than the cluster defaults. This is intended to
help managing a multiple OSes on the same cluster, without manual
modification of each instance's parameters.

A tool for merging clusters, ``cluster-merge``, has been added in the
tools sub-directory.

Bug fixes
~~~~~~~~~

- Improved the int/float conversions that should make the code more
  robust in face of errors from the node daemons
- Fixed the remove node code in case of internal configuration errors
- Fixed the node daemon behaviour in face of inconsistent queue
  directory (e.g. read-only file-system where we can't open the files
  read-write, etc.)
- Fixed the behaviour of gnt-node modify for master candidate demotion;
  now it either aborts cleanly or, if given the new "auto_promote"
  parameter, will automatically promote other nodes as needed
- Fixed compatibility with (unreleased yet) Python 2.6.5 that would
  completely prevent Ganeti from working
- Fixed bug for instance export when not all disks were successfully
  exported
- Fixed behaviour of node add when the new node is slow in starting up
  the node daemon
- Fixed handling of signals in the LUXI client, which should improve
  behaviour of command-line scripts
- Added checks for invalid node/instance names in the configuration (now
  flagged during cluster verify)
- Fixed watcher behaviour for disk activation errors
- Fixed two potentially endless loops in http library, which led to the
  RAPI daemon hanging and consuming 100% CPU in some cases
- Fixed bug in RAPI daemon related to hashed passwords
- Fixed bug for unintended qemu-level bridging of multi-NIC KVM
  instances
- Enhanced compatibility with non-Debian OSes, but not using absolute
  path in some commands and allowing customisation of the ssh
  configuration directory
- Fixed possible future issue with new Python versions by abiding to the
  proper use of ``__slots__`` attribute on classes
- Added checks that should prevent directory traversal attacks
- Many documentation fixes based on feedback from users

New features
~~~~~~~~~~~~

- Added an "early_release" more for instance replace disks and node
  evacuate, where we release locks earlier and thus allow higher
  parallelism within the cluster
- Added watcher hooks, intended to allow the watcher to restart other
  daemons (e.g. from the ganeti-nbma project), but they can be used of
  course for any other purpose
- Added a compile-time disable for DRBD barriers, to increase
  performance if the administrator trusts the power supply or the
  storage system to not lose writes
- Added the option of using syslog for logging instead of, or in
  addition to, Ganeti's own log files
- Removed boot restriction for paravirtual NICs for KVM, recent versions
  can indeed boot from a paravirtual NIC
- Added a generic debug level for many operations; while this is not
  used widely yet, it allows one to pass the debug value all the way to
  the OS scripts
- Enhanced the hooks environment for instance moves (failovers,
  migrations) where the primary/secondary nodes changed during the
  operation, by adding {NEW,OLD}_{PRIMARY,SECONDARY} vars
- Enhanced data validations for many user-supplied values; one important
  item is the restrictions imposed on instance and node names, which
  might reject some (invalid) host names
- Add a configure-time option to disable file-based storage, if it's not
  needed; this allows greater security separation between the master
  node and the other nodes from the point of view of the inter-node RPC
  protocol
- Added user notification in interactive tools if job is waiting in the
  job queue or trying to acquire locks
- Added log messages when a job is waiting for locks
- Added filtering by node tags in instance operations which admit
  multiple instances (start, stop, reboot, reinstall)
- Added a new tool for cluster mergers, ``cluster-merge``
- Parameters from command line which are of the form ``a=b,c=d`` can now
  use backslash escapes to pass in values which contain commas,
  e.g. ``a=b\\c,d=e`` where the 'a' parameter would get the value
  ``b,c``
- For KVM, the instance name is the first parameter passed to KVM, so
  that it's more visible in the process list


Version 2.1.0
-------------

*(Released Tue, 2 Mar 2010)*

Ganeti 2.1 brings many improvements with it. Major changes:

- Added infrastructure to ease automated disk repairs
- Added new daemon to export configuration data in a cheaper way than
  using the remote API
- Instance NICs can now be routed instead of being associated with a
  networking bridge
- Improved job locking logic to reduce impact of jobs acquiring multiple
  locks waiting for other long-running jobs

In-depth implementation details can be found in the Ganeti 2.1 design
document.

Details
~~~~~~~

- Added chroot hypervisor
- Added more options to xen-hvm hypervisor (``kernel_path`` and
  ``device_model``)
- Added more options to xen-pvm hypervisor (``use_bootloader``,
  ``bootloader_path`` and ``bootloader_args``)
- Added the ``use_localtime`` option for the xen-hvm and kvm
  hypervisors, and the default value for this has changed to false (in
  2.0 xen-hvm always enabled it)
- Added luxi call to submit multiple jobs in one go
- Added cluster initialization option to not modify ``/etc/hosts``
  file on nodes
- Added network interface parameters
- Added dry run mode to some LUs
- Added RAPI resources:

  - ``/2/instances/[instance_name]/info``
  - ``/2/instances/[instance_name]/replace-disks``
  - ``/2/nodes/[node_name]/evacuate``
  - ``/2/nodes/[node_name]/migrate``
  - ``/2/nodes/[node_name]/role``
  - ``/2/nodes/[node_name]/storage``
  - ``/2/nodes/[node_name]/storage/modify``
  - ``/2/nodes/[node_name]/storage/repair``

- Added OpCodes to evacuate or migrate all instances on a node
- Added new command to list storage elements on nodes (``gnt-node
  list-storage``) and modify them (``gnt-node modify-storage``)
- Added new ssconf files with master candidate IP address
  (``ssconf_master_candidates_ips``), node primary IP address
  (``ssconf_node_primary_ips``) and node secondary IP address
  (``ssconf_node_secondary_ips``)
- Added ``ganeti-confd`` and a client library to query the Ganeti
  configuration via UDP
- Added ability to run hooks after cluster initialization and before
  cluster destruction
- Added automatic mode for disk replace (``gnt-instance replace-disks
  --auto``)
- Added ``gnt-instance recreate-disks`` to re-create (empty) disks
  after catastrophic data-loss
- Added ``gnt-node repair-storage`` command to repair damaged LVM volume
  groups
- Added ``gnt-instance move`` command to move instances
- Added ``gnt-cluster watcher`` command to control watcher
- Added ``gnt-node powercycle`` command to powercycle nodes
- Added new job status field ``lock_status``
- Added parseable error codes to cluster verification (``gnt-cluster
  verify --error-codes``) and made output less verbose (use
  ``--verbose`` to restore previous behaviour)
- Added UUIDs to the main config entities (cluster, nodes, instances)
- Added support for OS variants
- Added support for hashed passwords in the Ganeti remote API users file
  (``rapi_users``)
- Added option to specify maximum timeout on instance shutdown
- Added ``--no-ssh-init`` option to ``gnt-cluster init``
- Added new helper script to start and stop Ganeti daemons
  (``daemon-util``), with the intent to reduce the work necessary to
  adjust Ganeti for non-Debian distributions and to start/stop daemons
  from one place
- Added more unittests
- Fixed critical bug in ganeti-masterd startup
- Removed the configure-time ``kvm-migration-port`` parameter, this is
  now customisable at the cluster level for both the KVM and Xen
  hypervisors using the new ``migration_port`` parameter
- Pass ``INSTANCE_REINSTALL`` variable to OS installation script when
  reinstalling an instance
- Allowed ``@`` in tag names
- Migrated to Sphinx (http://sphinx.pocoo.org/) for documentation
- Many documentation updates
- Distribute hypervisor files on ``gnt-cluster redist-conf``
- ``gnt-instance reinstall`` can now reinstall multiple instances
- Updated many command line parameters
- Introduced new OS API version 15
- No longer support a default hypervisor
- Treat virtual LVs as inexistent
- Improved job locking logic to reduce lock contention
- Match instance and node names case insensitively
- Reimplemented bash completion script to be more complete
- Improved burnin


Version 2.0.6
-------------

*(Released Thu, 4 Feb 2010)*

- Fix cleaner behaviour on nodes not in a cluster (Debian bug 568105)
- Fix a string formatting bug
- Improve safety of the code in some error paths
- Improve data validation in the master of values returned from nodes


Version 2.0.5
-------------

*(Released Thu, 17 Dec 2009)*

- Fix security issue due to missing validation of iallocator names; this
  allows local and remote execution of arbitrary executables
- Fix failure of gnt-node list during instance removal
- Ship the RAPI documentation in the archive


Version 2.0.4
-------------

*(Released Wed, 30 Sep 2009)*

- Fixed many wrong messages
- Fixed a few bugs related to the locking library
- Fixed MAC checking at instance creation time
- Fixed a DRBD parsing bug related to gaps in /proc/drbd
- Fixed a few issues related to signal handling in both daemons and
  scripts
- Fixed the example startup script provided
- Fixed insserv dependencies in the example startup script (patch from
  Debian)
- Fixed handling of drained nodes in the iallocator framework
- Fixed handling of KERNEL_PATH parameter for xen-hvm (Debian bug
  #528618)
- Fixed error related to invalid job IDs in job polling
- Fixed job/opcode persistence on unclean master shutdown
- Fixed handling of partial job processing after unclean master
  shutdown
- Fixed error reporting from LUs, previously all errors were converted
  into execution errors
- Fixed error reporting from burnin
- Decreased significantly the memory usage of the job queue
- Optimised slightly multi-job submission
- Optimised slightly opcode loading
- Backported the multi-job submit framework from the development
  branch; multi-instance start and stop should be faster
- Added script to clean archived jobs after 21 days; this will reduce
  the size of the queue directory
- Added some extra checks in disk size tracking
- Added an example ethers hook script
- Added a cluster parameter that prevents Ganeti from modifying of
  /etc/hosts
- Added more node information to RAPI responses
- Added a ``gnt-job watch`` command that allows following the ouput of a
  job
- Added a bind-address option to ganeti-rapi
- Added more checks to the configuration verify
- Enhanced the burnin script such that some operations can be retried
  automatically
- Converted instance reinstall to multi-instance model


Version 2.0.3
-------------

*(Released Fri, 7 Aug 2009)*

- Added ``--ignore-size`` to the ``gnt-instance activate-disks`` command
  to allow using the pre-2.0.2 behaviour in activation, if any existing
  instances have mismatched disk sizes in the configuration
- Added ``gnt-cluster repair-disk-sizes`` command to check and update
  any configuration mismatches for disk sizes
- Added ``gnt-master cluste-failover --no-voting`` to allow master
  failover to work on two-node clusters
- Fixed the ``--net`` option of ``gnt-backup import``, which was
  unusable
- Fixed detection of OS script errors in ``gnt-backup export``
- Fixed exit code of ``gnt-backup export``


Version 2.0.2
-------------

*(Released Fri, 17 Jul 2009)*

- Added experimental support for stripped logical volumes; this should
  enhance performance but comes with a higher complexity in the block
  device handling; stripping is only enabled when passing
  ``--with-lvm-stripecount=N`` to ``configure``, but codepaths are
  affected even in the non-stripped mode
- Improved resiliency against transient failures at the end of DRBD
  resyncs, and in general of DRBD resync checks
- Fixed a couple of issues with exports and snapshot errors
- Fixed a couple of issues in instance listing
- Added display of the disk size in ``gnt-instance info``
- Fixed checking for valid OSes in instance creation
- Fixed handling of the "vcpus" parameter in instance listing and in
  general of invalid parameters
- Fixed http server library, and thus RAPI, to handle invalid
  username/password combinations correctly; this means that now they
  report unauthorized for queries too, not only for modifications,
  allowing earlier detect of configuration problems
- Added a new "role" node list field, equivalent to the master/master
  candidate/drained/offline flags combinations
- Fixed cluster modify and changes of candidate pool size
- Fixed cluster verify error messages for wrong files on regular nodes
- Fixed a couple of issues with node demotion from master candidate role
- Fixed node readd issues
- Added non-interactive mode for ``ganeti-masterd --no-voting`` startup
- Added a new ``--no-voting`` option for masterfailover to fix failover
  on two-nodes clusters when the former master node is unreachable
- Added instance reinstall over RAPI


Version 2.0.1
-------------

*(Released Tue, 16 Jun 2009)*

- added ``-H``/``-B`` startup parameters to ``gnt-instance``, which will
  allow re-adding the start in single-user option (regression from 1.2)
- the watcher writes the instance status to a file, to allow monitoring
  to report the instance status (from the master) based on cached
  results of the watcher's queries; while this can get stale if the
  watcher is being locked due to other work on the cluster, this is
  still an improvement
- the watcher now also restarts the node daemon and the rapi daemon if
  they died
- fixed the watcher to handle full and drained queue cases
- hooks export more instance data in the environment, which helps if
  hook scripts need to take action based on the instance's properties
  (no longer need to query back into ganeti)
- instance failovers when the instance is stopped do not check for free
  RAM, so that failing over a stopped instance is possible in low memory
  situations
- rapi uses queries for tags instead of jobs (for less job traffic), and
  for cluster tags it won't talk to masterd at all but read them from
  ssconf
- a couple of error handling fixes in RAPI
- drbd handling: improved the error handling of inconsistent disks after
  resync to reduce the frequency of "there are some degraded disks for
  this instance" messages
- fixed a bug in live migration when DRBD doesn't want to reconnect (the
  error handling path called a wrong function name)


Version 2.0.0
-------------

*(Released Wed, 27 May 2009)*

- no changes from rc5


Version 2.0 rc5
---------------

*(Released Wed, 20 May 2009)*

- fix a couple of bugs (validation, argument checks)
- fix ``gnt-cluster getmaster`` on non-master nodes (regression)
- some small improvements to RAPI and IAllocator
- make watcher automatically start the master daemon if down


Version 2.0 rc4
---------------

*(Released Mon, 27 Apr 2009)*

- change the OS list to not require locks; this helps with big clusters
- fix ``gnt-cluster verify`` and ``gnt-cluster verify-disks`` when the
  volume group is broken
- ``gnt-instance info``, without any arguments, doesn't run for all
  instances anymore; either pass ``--all`` or pass the desired
  instances; this helps against mistakes on big clusters where listing
  the information for all instances takes a long time
- miscellaneous doc and man pages fixes


Version 2.0 rc3
---------------

*(Released Wed, 8 Apr 2009)*

- Change the internal locking model of some ``gnt-node`` commands, in
  order to reduce contention (and blocking of master daemon) when
  batching many creation/reinstall jobs
- Fixes to Xen soft reboot
- No longer build documentation at build time, instead distribute it in
  the archive, in order to reduce the need for the whole docbook/rst
  toolchains


Version 2.0 rc2
---------------

*(Released Fri, 27 Mar 2009)*

- Now the cfgupgrade scripts works and can upgrade 1.2.7 clusters to 2.0
- Fix watcher startup sequence, improves the behaviour of busy clusters
- Some other fixes in ``gnt-cluster verify``, ``gnt-instance
  replace-disks``, ``gnt-instance add``, ``gnt-cluster queue``, KVM VNC
  bind address and other places
- Some documentation fixes and updates


Version 2.0 rc1
---------------

*(Released Mon, 2 Mar 2009)*

- More documentation updates, now all docs should be more-or-less
  up-to-date
- A couple of small fixes (mixed hypervisor clusters, offline nodes,
  etc.)
- Added a customizable HV_KERNEL_ARGS hypervisor parameter (for Xen PVM
  and KVM)
- Fix an issue related to $libdir/run/ganeti and cluster creation


Version 2.0 beta2
-----------------

*(Released Thu, 19 Feb 2009)*

- Xen PVM and KVM have switched the default value for the instance root
  disk to the first partition on the first drive, instead of the whole
  drive; this means that the OS installation scripts must be changed
  accordingly
- Man pages have been updated
- RAPI has been switched by default to HTTPS, and the exported functions
  should all work correctly
- RAPI v1 has been removed
- Many improvements to the KVM hypervisor
- Block device errors are now better reported
- Many other bugfixes and small improvements


Version 2.0 beta1
-----------------

*(Released Mon, 26 Jan 2009)*

- Version 2 is a general rewrite of the code and therefore the
  differences are too many to list, see the design document for 2.0 in
  the ``doc/`` subdirectory for more details
- In this beta version there is not yet a migration path from 1.2 (there
  will be one in the final 2.0 release)
- A few significant changes are:

  - all commands are executed by a daemon (``ganeti-masterd``) and the
    various ``gnt-*`` commands are just front-ends to it
  - all the commands are entered into, and executed from a job queue,
    see the ``gnt-job(8)`` manpage
  - the RAPI daemon supports read-write operations, secured by basic
    HTTP authentication on top of HTTPS
  - DRBD version 0.7 support has been removed, DRBD 8 is the only
    supported version (when migrating from Ganeti 1.2 to 2.0, you need
    to migrate to DRBD 8 first while still running Ganeti 1.2)
  - DRBD devices are using statically allocated minor numbers, which
    will be assigned to existing instances during the migration process
  - there is support for both Xen PVM and Xen HVM instances running on
    the same cluster
  - KVM virtualization is supported too
  - file-based storage has been implemented, which means that it is
    possible to run the cluster without LVM and DRBD storage, for
    example using a shared filesystem exported from shared storage (and
    still have live migration)


Version 1.2.7
-------------

*(Released Tue, 13 Jan 2009)*

- Change the default reboot type in ``gnt-instance reboot`` to "hard"
- Reuse the old instance mac address by default on instance import, if
  the instance name is the same.
- Handle situations in which the node info rpc returns incomplete
  results (issue 46)
- Add checks for tcp/udp ports collisions in ``gnt-cluster verify``
- Improved version of batcher:

  - state file support
  - instance mac address support
  - support for HVM clusters/instances

- Add an option to show the number of cpu sockets and nodes in
  ``gnt-node list``
- Support OSes that handle more than one version of the OS api (but do
  not change the current API in any other way)
- Fix ``gnt-node migrate``
- ``gnt-debug`` man page
- Fixes various more typos and small issues
- Increase disk resync maximum speed to 60MB/s (from 30MB/s)


Version 1.2.6
-------------

*(Released Wed, 24 Sep 2008)*

- new ``--hvm-nic-type`` and ``--hvm-disk-type`` flags to control the
  type of disk exported to fully virtualized instances.
- provide access to the serial console of HVM instances
- instance auto_balance flag, set by default. If turned off it will
  avoid warnings on cluster verify if there is not enough memory to fail
  over an instance. in the future it will prevent automatically failing
  it over when we will support that.
- batcher tool for instance creation, see ``tools/README.batcher``
- ``gnt-instance reinstall --select-os`` to interactively select a new
  operating system when reinstalling an instance.
- when changing the memory amount on instance modify a check has been
  added that the instance will be able to start. also warnings are
  emitted if the instance will not be able to fail over, if auto_balance
  is true.
- documentation fixes
- sync fields between ``gnt-instance list/modify/add/import``
- fix a race condition in drbd when the sync speed was set after giving
  the device a remote peer.


Version 1.2.5
-------------

*(Released Tue, 22 Jul 2008)*

- note: the allowed size and number of tags per object were reduced
- fix a bug in ``gnt-cluster verify`` with inconsistent volume groups
- fixed twisted 8.x compatibility
- fixed ``gnt-instance replace-disks`` with iallocator
- add TCP keepalives on twisted connections to detect restarted nodes
- disk increase support, see ``gnt-instance grow-disk``
- implement bulk node/instance query for RAPI
- add tags in node/instance listing (optional)
- experimental migration (and live migration) support, read the man page
  for ``gnt-instance migrate``
- the ``ganeti-watcher`` logs are now timestamped, and the watcher also
  has some small improvements in handling its state file


Version 1.2.4
-------------

*(Released Fri, 13 Jun 2008)*

- Experimental readonly, REST-based remote API implementation;
  automatically started on master node, TCP port 5080, if enabled by
  ``--enable-rapi`` parameter to configure script.
- Instance allocator support. Add and import instance accept a
  ``--iallocator`` parameter, and call that instance allocator to decide
  which node to use for the instance. The iallocator document describes
  what's expected from an allocator script.
- ``gnt-cluster verify`` N+1 memory redundancy checks: Unless passed the
  ``--no-nplus1-mem`` option ``gnt-cluster verify`` now checks that if a
  node is lost there is still enough memory to fail over the instances
  that reside on it.
- ``gnt-cluster verify`` hooks: it is now possible to add post-hooks to
  ``gnt-cluster verify``, to check for site-specific compliance. All the
  hooks will run, and their output, if any, will be displayed. Any
  failing hook will make the verification return an error value.
- ``gnt-cluster verify`` now checks that its peers are reachable on the
  primary and secondary interfaces
- ``gnt-node add`` now supports the ``--readd`` option, to readd a node
  that is still declared as part of the cluster and has failed.
- ``gnt-* list`` commands now accept a new ``-o +field`` way of
  specifying output fields, that just adds the chosen fields to the
  default ones.
- ``gnt-backup`` now has a new ``remove`` command to delete an existing
  export from the filesystem.
- New per-instance parameters hvm_acpi, hvm_pae and hvm_cdrom_image_path
  have been added. Using them you can enable/disable acpi and pae
  support, and specify a path for a cd image to be exported to the
  instance. These parameters as the name suggest only work on HVM
  clusters.
- When upgrading an HVM cluster to Ganeti 1.2.4, the values for ACPI and
  PAE support will be set to the previously hardcoded values, but the
  (previously hardcoded) path to the CDROM ISO image will be unset and
  if required, needs to be set manually with ``gnt-instance modify``
  after the upgrade.
- The address to which an instance's VNC console is bound is now
  selectable per-instance, rather than being cluster wide. Of course
  this only applies to instances controlled via VNC, so currently just
  applies to HVM clusters.


Version 1.2.3
-------------

*(Released Mon, 18 Feb 2008)*

- more tweaks to the disk activation code (especially helpful for DRBD)
- change the default ``gnt-instance list`` output format, now there is
  one combined status field (see the manpage for the exact values this
  field will have)
- some more fixes for the mac export to hooks change
- make Ganeti not break with DRBD 8.2.x (which changed the version
  format in ``/proc/drbd``) (issue 24)
- add an upgrade tool from "remote_raid1" disk template to "drbd" disk
  template, allowing migration from DRBD0.7+MD to DRBD8


Version 1.2.2
-------------

*(Released Wed, 30 Jan 2008)*

- fix ``gnt-instance modify`` breakage introduced in 1.2.1 with the HVM
  support (issue 23)
- add command aliases infrastructure and a few aliases
- allow listing of VCPUs in the ``gnt-instance list`` and improve the
  man pages and the ``--help`` option of ``gnt-node
  list``/``gnt-instance list``
- fix ``gnt-backup list`` with down nodes (issue 21)
- change the tools location (move from $pkgdatadir to $pkglibdir/tools)
- fix the dist archive and add a check for including svn/git files in
  the future
- some developer-related changes: improve the burnin and the QA suite,
  add an upload script for testing during development


Version 1.2.1
-------------

*(Released Wed, 16 Jan 2008)*

- experimental HVM support, read the install document, section
  "Initializing the cluster"
- allow for the PVM hypervisor per-instance kernel and initrd paths
- add a new command ``gnt-cluster verify-disks`` which uses a new
  algorithm to improve the reconnection of the DRBD pairs if the device
  on the secondary node has gone away
- make logical volume code auto-activate LVs at disk activation time
- slightly improve the speed of activating disks
- allow specification of the MAC address at instance creation time, and
  changing it later via ``gnt-instance modify``
- fix handling of external commands that generate lots of output on
  stderr
- update documentation with regard to minimum version of DRBD8 supported


Version 1.2.0
-------------

*(Released Tue, 4 Dec 2007)*

- Log the ``xm create`` output to the node daemon log on failure (to
  help diagnosing the error)
- In debug mode, log all external commands output if failed to the logs
- Change parsing of lvm commands to ignore stderr


Version 1.2 beta3
-----------------

*(Released Wed, 28 Nov 2007)*

- Another round of updates to the DRBD 8 code to deal with more failures
  in the replace secondary node operation
- Some more logging of failures in disk operations (lvm, drbd)
- A few documentation updates
- QA updates


Version 1.2 beta2
-----------------

*(Released Tue, 13 Nov 2007)*

- Change configuration file format from Python's Pickle to JSON.
  Upgrading is possible using the cfgupgrade utility.
- Add support for DRBD 8.0 (new disk template ``drbd``) which allows for
  faster replace disks and is more stable (DRBD 8 has many improvements
  compared to DRBD 0.7)
- Added command line tags support (see man pages for ``gnt-instance``,
  ``gnt-node``, ``gnt-cluster``)
- Added instance rename support
- Added multi-instance startup/shutdown
- Added cluster rename support
- Added ``gnt-node evacuate`` to simplify some node operations
- Added instance reboot operation that can speedup reboot as compared to
  stop and start
- Soften the requirement that hostnames are in FQDN format
- The ``ganeti-watcher`` now activates drbd pairs after secondary node
  reboots
- Removed dependency on debian's patched fping that uses the
  non-standard ``-S`` option
- Now the OS definitions are searched for in multiple, configurable
  paths (easier for distros to package)
- Some changes to the hooks infrastructure (especially the new
  post-configuration update hook)
- Other small bugfixes

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