# Copyright (C) 2014 Red Hat, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
#
#
#
# =========================================
# Nova Hypervisor Feature Capability Matrix
# =========================================
#
# This obsoletes the information previously at
#
#  https://wiki.openstack.org/wiki/HypervisorSupportMatrix
#
# This file contains a specification of what feature capabilities each
# hypervisor driver in Nova is able to support. Feature capabilities include
# what API operations are supported, what storage / networking features can be
# used and what aspects of the guest machine can be configured. The capabilities
# can be considered to be structured into nested groups, but in this file they
# have been flattened for ease of representation. The section names represent
# the group structure. At the top level there are the following groups defined
#
# - operation  - public API operations
# - storage    - host storage configuration options
# - networking - host networking configuration options
# - guest      - guest hardware configuration options
#
# When considering which capabilities should be marked as mandatory,
# consider the general guiding principles listed in the support-matrix.rst
# file
#
# The 'status' field takes possible values
#
#  - mandatory - unconditionally required to be implemented
#  - optional  - optional to support, nice to have
#  - choice(group) - at least one of the options within the named group
#                    must be implemented
#  - conditional(cond) - required, if the referenced condition is met.
#
# The value against each 'driver-impl-XXXX' entry refers to the level
# of the implementation of the feature in that driver
#
#  - complete - fully implemented, expected to work at all times
#  - partial - implemented, but with caveats about when it will work
#              eg some configurations or hardware or guest OS may not
#              support it
#  - missing - not implemented at all
#
# In the case of the driver being marked as 'partial', then
# 'driver-notes-XXX' entry should be used to explain the caveats
# around the implementation.
#
# The 'cli' field takes a list of nova client commands, separated by semicolon.
# These CLi commands are related to that feature.
# Example:
# cli=nova list;nova show <server>
#
[targets]
# List of driver impls we are going to record info for later
# This list only covers drivers that are in the Nova source
# tree. Out of tree drivers should maintain their own equivalent
# document, and merge it with this when their code merges into
# Nova core.
driver-impl-xenserver=XenServer
driver-impl-libvirt-kvm-x86=Libvirt KVM (x86)
driver-impl-libvirt-kvm-ppc64=Libvirt KVM (ppc64)
driver-impl-libvirt-kvm-s390x=Libvirt KVM (s390x)
driver-impl-libvirt-qemu-x86=Libvirt QEMU (x86)
driver-impl-libvirt-lxc=Libvirt LXC
driver-impl-libvirt-xen=Libvirt Xen
driver-impl-libvirt-vz-vm=Libvirt Virtuozzo VM
driver-impl-libvirt-vz-ct=Libvirt Virtuozzo CT
driver-impl-vmware=VMware vCenter
driver-impl-hyperv=Hyper-V
driver-impl-ironic=Ironic

[operation.attach-volume]
title=Attach block volume to instance
status=optional
notes=The attach volume operation provides a means to hotplug
  additional block storage to a running instance. This allows
  storage capabilities to be expanded without interruption of
  service. In a cloud model it would be more typical to just
  spin up a new instance with large storage, so the ability to
  hotplug extra storage is for those cases where the instance
  is considered to be more of a pet than cattle. Therefore
  this operation is not considered to be mandatory to support.
cli=
driver-impl-xenserver=complete
driver-impl-libvirt-kvm-x86=complete
driver-impl-libvirt-kvm-ppc64=complete
driver-impl-libvirt-kvm-s390x=complete
driver-impl-libvirt-qemu-x86=complete
driver-impl-libvirt-lxc=missing
driver-impl-libvirt-xen=complete
driver-impl-vmware=complete
driver-impl-hyperv=complete
driver-impl-ironic=missing
driver-impl-libvirt-vz-vm=complete
driver-impl-libvirt-vz-ct=missing

[operation.detach-volume]
title=Detach block volume from instance
status=optional
notes=See notes for attach volume operation.
cli=
driver-impl-xenserver=complete
driver-impl-libvirt-kvm-x86=complete
driver-impl-libvirt-kvm-ppc64=complete
driver-impl-libvirt-kvm-s390x=complete
driver-impl-libvirt-qemu-x86=complete
driver-impl-libvirt-lxc=missing
driver-impl-libvirt-xen=complete
driver-impl-vmware=complete
driver-impl-hyperv=complete
driver-impl-ironic=missing
driver-impl-libvirt-vz-vm=complete
driver-impl-libvirt-vz-ct=missing

[operation.maintenance-mode]
title=Set the host in a maintenance mode
status=optional
notes=This operation allows a host to be placed into maintenance
  mode, automatically triggering migration of any running
  instances to an alternative host and preventing new
  instances from being launched. This is not considered
  to be a mandatory operation to support.
  The CLI command is "nova host-update <host>".
  The driver methods to implement are "host_maintenance_mode" and
  "set_host_enabled".
cli=
driver-impl-xenserver=complete
driver-impl-libvirt-kvm-x86=missing
driver-impl-libvirt-kvm-ppc64=missing
driver-impl-libvirt-kvm-s390x=missing
driver-impl-libvirt-qemu-x86=missing
driver-impl-libvirt-lxc=missing
driver-impl-libvirt-xen=missing
driver-impl-vmware=missing
driver-impl-hyperv=missing
driver-impl-ironic=missing
driver-impl-libvirt-vz-vm=missing
driver-impl-libvirt-vz-ct=missing

[operation.evacuate]
title=Evacuate instances from a host
status=optional
notes=A possible failure scenario in a cloud environment is the outage
  of one of the compute nodes. In such a case the instances of the down
  host can be evacuated to another host. It is assumed that the old host
  is unlikely ever to be powered back on, otherwise the evacuation
  attempt will be rejected. When the instances get moved to the new
  host, their volumes get re-attached and the locally stored data is
  dropped. That happens in the same way as a rebuild.
  This is not considered to be a mandatory operation to support.
cli=nova evacuate <server>;nova host-evacuate <host>
driver-impl-xenserver=unknown
driver-impl-libvirt-kvm-x86=complete
driver-impl-libvirt-kvm-ppc64=unknown
driver-impl-libvirt-kvm-s390x=complete
driver-impl-libvirt-qemu-x86=unknown
driver-impl-libvirt-lxc=unknown
driver-impl-libvirt-xen=unknown
driver-impl-vmware=unknown
driver-impl-hyperv=unknown
driver-impl-ironic=unknown
driver-impl-libvirt-vz-vm=missing
driver-impl-libvirt-vz-ct=missing

[operation.get-guest-info]
title=Guest instance status
status=mandatory
notes=Provides a quick report on information about the guest instance,
  including the power state, memory allocation, CPU allocation, number
  of vCPUs and cummulative CPU execution time. As well as being
  informational, the power state is used by the compute manager for
  tracking changes in guests. Therefore this operation is considered
  mandatory to support.
cli=
driver-impl-xenserver=complete
driver-impl-libvirt-kvm-x86=complete
driver-impl-libvirt-kvm-ppc64=complete
driver-impl-libvirt-kvm-s390x=complete
driver-impl-libvirt-qemu-x86=complete
driver-impl-libvirt-lxc=complete
driver-impl-libvirt-xen=complete
driver-impl-vmware=complete
driver-impl-hyperv=complete
driver-impl-ironic=complete
driver-impl-libvirt-vz-vm=complete
driver-impl-libvirt-vz-ct=complete

[operation.get-host-info]
title=Guest host status
status=optional
notes=Unclear what this refers to
cli=
driver-impl-xenserver=complete
driver-impl-libvirt-kvm-x86=complete
driver-impl-libvirt-kvm-ppc64=complete
driver-impl-libvirt-kvm-s390x=complete
driver-impl-libvirt-qemu-x86=complete
driver-impl-libvirt-lxc=complete
driver-impl-libvirt-xen=complete
driver-impl-vmware=complete
driver-impl-hyperv=complete
driver-impl-ironic=missing
driver-impl-libvirt-vz-vm=complete
driver-impl-libvirt-vz-ct=complete

[operation.live-migrate]
title=Live migrate instance across hosts
status=optional
notes=Live migration provides a way to move an instance off one
  compute host, to another compute host. Administrators may use
  this to evacuate instances from a host that needs to undergo
  maintenance tasks, though of course this may not help if the
  host is already suffering a failure. In general instances are
  considered cattle rather than pets, so it is expected that an
  instance is liable to be killed if host maintenance is required.
  It is technically challenging for some hypervisors to provide
  support for the live migration operation, particularly those
  built on the container based virtualization. Therefore this
  operation is not considered mandatory to support.
cli=
driver-impl-xenserver=complete
driver-impl-libvirt-kvm-x86=complete
driver-impl-libvirt-kvm-ppc64=complete
driver-impl-libvirt-kvm-s390x=complete
driver-impl-libvirt-qemu-x86=complete
driver-impl-libvirt-lxc=missing
driver-impl-libvirt-xen=complete
driver-impl-vmware=missing
driver-notes-vmware=https://bugs.launchpad.net/nova/+bug/1192192
driver-impl-hyperv=complete
driver-impl-ironic=missing
driver-impl-libvirt-vz-vm=missing
driver-impl-libvirt-vz-ct=missing

[operation.launch]
title=Launch instance
status=mandatory
notes=Importing pre-existing running virtual machines on a host is
  considered out of scope of the cloud paradigm. Therefore this
  operation is mandatory to support in drivers.
cli=
driver-impl-xenserver=complete
driver-impl-libvirt-kvm-x86=complete
driver-impl-libvirt-kvm-ppc64=complete
driver-impl-libvirt-kvm-s390x=complete
driver-impl-libvirt-qemu-x86=complete
driver-impl-libvirt-lxc=complete
driver-impl-libvirt-xen=complete
driver-impl-vmware=complete
driver-impl-hyperv=complete
driver-impl-ironic=complete
driver-impl-libvirt-vz-vm=complete
driver-impl-libvirt-vz-ct=complete

[operation.pause]
title=Stop instance CPUs
status=optional
notes=Stopping an instances CPUs can be thought of as roughly
  equivalent to suspend-to-RAM. The instance is still present
  in memory, but execution has stopped. The problem, however,
  is that there is no mechanism to inform the guest OS that
  this takes place, so upon unpausing, its clocks will no
  longer report correct time. For this reason hypervisor vendors
  generally discourage use of this feature and some do not even
  implement it. Therefore this operation is considered optional
  to support in drivers.
cli=
driver-impl-xenserver=complete
driver-impl-libvirt-kvm-x86=complete
driver-impl-libvirt-kvm-ppc64=complete
driver-impl-libvirt-kvm-s390x=complete
driver-impl-libvirt-qemu-x86=complete
driver-impl-libvirt-lxc=complete
driver-impl-libvirt-xen=complete
driver-impl-vmware=missing
driver-impl-hyperv=complete
driver-impl-ironic=missing
driver-impl-libvirt-vz-vm=complete
driver-impl-libvirt-vz-ct=missing

[operation.reboot]
title=Reboot instance
status=optional
notes=It is reasonable for a guest OS administrator to trigger a
  graceful reboot from inside the instance. A host initiated
  graceful reboot requires guest co-operation and a non-graceful
  reboot can be achieved by a combination of stop+start. Therefore
  this operation is considered optional.
cli=
driver-impl-xenserver=complete
driver-impl-libvirt-kvm-x86=complete
driver-impl-libvirt-kvm-ppc64=complete
driver-impl-libvirt-kvm-s390x=complete
driver-impl-libvirt-qemu-x86=complete
driver-impl-libvirt-lxc=complete
driver-impl-libvirt-xen=complete
driver-impl-vmware=complete
driver-impl-hyperv=complete
driver-impl-ironic=complete
driver-impl-libvirt-vz-vm=complete
driver-impl-libvirt-vz-ct=complete

[operation.rescue]
title=Rescue instance
status=optional
notes=The rescue operation starts an instance in a special
  configuration whereby it is booted from an special root
  disk image. The goal is to allow an administrator to
  recover the state of a broken virtual machine. In general
  the cloud model considers instances to be cattle, so if
  an instance breaks the general expectation is that it be
  thrown away and a new instance created. Therefore this
  operation is considered optional to support in drivers.
cli=
driver-impl-xenserver=complete
driver-impl-libvirt-kvm-x86=complete
driver-impl-libvirt-kvm-ppc64=complete
driver-impl-libvirt-kvm-s390x=complete
driver-impl-libvirt-qemu-x86=complete
driver-impl-libvirt-lxc=missing
driver-impl-libvirt-xen=complete
driver-impl-vmware=complete
driver-impl-hyperv=missing
driver-impl-ironic=missing
driver-impl-libvirt-vz-vm=missing
driver-impl-libvirt-vz-ct=missing

[operation.resize]
title=Resize instance
status=optional
notes=The resize operation allows the user to change a running
  instance to match the size of a different flavor from the one
  it was initially launched with. There are many different
  flavor attributes that potentially need to be updated. In
  general it is technically challenging for a hypervisor to
  support the alteration of all relevant config settings for a
  running instance. Therefore this operation is considered
  optional to support in drivers.
cli=
driver-impl-xenserver=complete
driver-impl-libvirt-kvm-x86=complete
driver-impl-libvirt-kvm-ppc64=complete
driver-impl-libvirt-kvm-s390x=complete
driver-impl-libvirt-qemu-x86=complete
driver-impl-libvirt-lxc=missing
driver-impl-libvirt-xen=complete
driver-impl-vmware=complete
driver-impl-hyperv=complete
driver-impl-ironic=partial
driver-notes-ironic=Only certain ironic drivers support this
driver-impl-libvirt-vz-vm=missing
driver-impl-libvirt-vz-ct=missing

[operation.resume]
title=Restore instance
status=optional
notes=See notes for the suspend operation
cli=
driver-impl-xenserver=complete
driver-impl-libvirt-kvm-x86=complete
driver-impl-libvirt-kvm-ppc64=complete
driver-impl-libvirt-kvm-s390x=complete
driver-impl-libvirt-qemu-x86=complete
driver-impl-libvirt-lxc=missing
driver-impl-libvirt-xen=complete
driver-impl-vmware=complete
driver-impl-hyperv=complete
driver-impl-ironic=missing
driver-impl-libvirt-vz-vm=complete
driver-impl-libvirt-vz-ct=complete

[operation.service-control.wtf.com]
title=Service control
status=optional
notes=Something something, dark side, something something.
  Hard to claim this is mandatory when no one seems to know
  what "Service control" refers to in the context of virt
  drivers.
cli=
driver-impl-xenserver=complete
driver-impl-libvirt-kvm-x86=complete
driver-impl-libvirt-kvm-ppc64=complete
driver-impl-libvirt-kvm-s390x=complete
driver-impl-libvirt-qemu-x86=complete
driver-impl-libvirt-lxc=missing
driver-impl-libvirt-xen=missing
driver-impl-vmware=complete
driver-impl-hyperv=missing
driver-impl-ironic=missing
driver-impl-libvirt-vz-vm=missing
driver-impl-libvirt-vz-ct=missing

[operation.set-admin-password]
title=Set instance admin password
status=optional
notes=Provides a mechanism to re(set) the password of the administrator
  account inside the instance operating system. This requires that the
  hypervisor has a way to communicate with the running guest operating
  system. Given the wide range of operating systems in existence it is
  unreasonable to expect this to be practical in the general case. The
  configdrive and metadata service both provide a mechanism for setting
  the administrator password at initial boot time. In the case where this
  operation were not available, the administrator would simply have to
  login to the guest and change the password in the normal manner, so
  this is just a convenient optimization. Therefore this operation is
  not considered mandatory for drivers to support.
cli=
driver-impl-xenserver=complete
driver-impl-libvirt-kvm-x86=missing
driver-impl-libvirt-kvm-ppc64=missing
driver-impl-libvirt-kvm-s390x=missing
driver-impl-libvirt-qemu-x86=missing
driver-impl-libvirt-lxc=missing
driver-impl-libvirt-xen=missing
driver-impl-vmware=missing
driver-impl-hyperv=missing
driver-impl-ironic=missing
driver-impl-libvirt-vz-vm=missing
driver-impl-libvirt-vz-ct=missing

[operation.snapshot]
title=Save snapshot of instance disk
status=optional
notes=The snapshot operation allows the current state of the
  instance root disk to be saved and uploaded back into the
  glance image repository. The instance can later be booted
  again using this saved image. This is in effect making
  the ephemeral instance root disk into a semi-persistent
  storage, in so much as it is preserved even though the guest
  is no longer running. In general though, the expectation is
  that the root disks are ephemeral so the ability to take a
  snapshot cannot be assumed. Therefore this operation is not
  considered mandatory to support.
cli=
driver-impl-xenserver=complete
driver-impl-libvirt-kvm-x86=complete
driver-impl-libvirt-kvm-ppc64=complete
driver-impl-libvirt-kvm-s390x=complete
driver-impl-libvirt-qemu-x86=complete
driver-impl-libvirt-lxc=missing
driver-impl-libvirt-xen=partial
driver-notes-libvirt-xen=Only cold snapshots (pause + snapshot) supported
driver-impl-vmware=complete
driver-impl-hyperv=complete
driver-impl-ironic=missing
driver-impl-libvirt-vz-vm=missing
driver-impl-libvirt-vz-ct=missing

[operation.suspend]
title=Suspend instance
status=optional
notes=Suspending an instance can be thought of as roughly
  equivalent to suspend-to-disk. The instance no longer
  consumes any RAM or CPUs, with its live running state
  having been preserved in a file on disk. It can later
  be restored, at which point it should continue execution
  where it left off. As with stopping instance CPUs, it suffers from the fact
  that the guest OS will typically be left with a clock that
  is no longer telling correct time. For container based
  virtualization solutions, this operation is particularly
  technically challenging to implement and is an area of
  active research. This operation tends to make more sense
  when thinking of instances as pets, rather than cattle,
  since with cattle it would be simpler to just terminate
  the instance instead of suspending. Therefore this operation
  is considered optional to support.
cli=
driver-impl-xenserver=complete
driver-impl-libvirt-kvm-x86=complete
driver-impl-libvirt-kvm-ppc64=complete
driver-impl-libvirt-kvm-s390x=complete
driver-impl-libvirt-qemu-x86=complete
driver-impl-libvirt-lxc=missing
driver-impl-libvirt-xen=complete
driver-impl-vmware=complete
driver-impl-hyperv=complete
driver-impl-ironic=missing
driver-impl-libvirt-vz-vm=complete
driver-impl-libvirt-vz-ct=complete

[operation.swap-volume]
title=Swap block volumes
status=optional
notes=The swap volume operation is a mechanism for changing running
  instance so that its attached volume(s) are backed by different
  storage in the host. An alternative to this would be to simply
  terminate the existing instance and spawn a new instance with the
  new storage. In other words this operation is primarily targeted towards
  the pet use case rather than cattle. Therefore this is considered
  optional to support.
cli=
driver-impl-xenserver=missing
driver-impl-libvirt-kvm-x86=complete
driver-impl-libvirt-kvm-ppc64=complete
driver-impl-libvirt-kvm-s390x=complete
driver-impl-libvirt-qemu-x86=complete
driver-impl-libvirt-lxc=complete
driver-impl-libvirt-xen=complete
driver-impl-vmware=missing
driver-impl-hyperv=missing
driver-impl-ironic=missing
driver-impl-libvirt-vz-vm=complete
driver-impl-libvirt-vz-ct=missing

[operation.terminate]
title=Shutdown instance
status=mandatory
notes=The ability to terminate a virtual machine is required in
  order for a cloud user to stop utilizing resources and thus
  avoid indefinitely ongoing billing. Therefore this operation
  is mandatory to support in drivers.
cli=
driver-impl-xenserver=complete
driver-impl-libvirt-kvm-x86=complete
driver-impl-libvirt-kvm-ppc64=complete
driver-impl-libvirt-kvm-s390x=complete
driver-impl-libvirt-qemu-x86=complete
driver-impl-libvirt-lxc=complete
driver-impl-libvirt-xen=complete
driver-impl-vmware=complete
driver-impl-hyperv=complete
driver-impl-ironic=complete
driver-impl-libvirt-vz-vm=complete
driver-impl-libvirt-vz-ct=complete

[operation.unpause]
title=Resume instance CPUs
status=optional
notes=See notes for the "Stop instance CPUs" operation
cli=
driver-impl-xenserver=complete
driver-impl-libvirt-kvm-x86=complete
driver-impl-libvirt-kvm-ppc64=complete
driver-impl-libvirt-kvm-s390x=complete
driver-impl-libvirt-qemu-x86=complete
driver-impl-libvirt-lxc=complete
driver-impl-libvirt-xen=complete
driver-impl-vmware=missing
driver-impl-hyperv=complete
driver-impl-ironic=missing
driver-impl-libvirt-vz-vm=complete
driver-impl-libvirt-vz-ct=complete

[guest.disk.autoconfigure.wtf.com]
title=Auto configure disk
status=optional
notes=something something, dark side, something something.
  Unclear just what this is about.
cli=
driver-impl-xenserver=complete
driver-impl-libvirt-kvm-x86=missing
driver-impl-libvirt-kvm-ppc64=missing
driver-impl-libvirt-kvm-s390x=missing
driver-impl-libvirt-qemu-x86=missing
driver-impl-libvirt-lxc=missing
driver-impl-libvirt-xen=missing
driver-impl-vmware=missing
driver-impl-hyperv=complete
driver-impl-ironic=missing
driver-impl-libvirt-vz-vm=missing
driver-impl-libvirt-vz-ct=missing

[guest.disk.rate-limit]
title=Instance disk I/O limits
status=optional
notes=The ability to set rate limits on virtual disks allows for
  greater performance isolation between instances running on the
  same host storage. It is valid to delegate scheduling of I/O
  operations to the hypervisor with its default settings, instead
  of doing fine grained tuning. Therefore this is not considered
  to be an mandatory configuration to support.
cli=
driver-impl-xenserver=missing
driver-impl-libvirt-kvm-x86=complete
driver-impl-libvirt-kvm-ppc64=complete
driver-impl-libvirt-kvm-s390x=complete
driver-impl-libvirt-qemu-x86=complete
driver-impl-libvirt-lxc=missing
driver-impl-libvirt-xen=missing
driver-impl-vmware=missing
driver-impl-hyperv=missing
driver-impl-ironic=missing
driver-impl-libvirt-vz-vm=missing
driver-impl-libvirt-vz-ct=missing

[guest.setup.configdrive]
title=Config drive support
status=choice(guest.setup)
notes=The config drive provides an information channel into
  the guest operating system, to enable configuration of the
  administrator password, file injection, registration of
  SSH keys, etc. Since cloud images typically ship with all
  login methods locked, a mechanism to set the administrator
  password of keys is required to get login access. Alternatives
  include the metadata service and disk injection. At least one
  of the guest setup mechanisms is required to be supported by
  drivers, in order to enable login access.
cli=
driver-impl-xenserver=complete
driver-impl-libvirt-kvm-x86=complete
driver-impl-libvirt-kvm-ppc64=missing
driver-impl-libvirt-kvm-s390x=complete
driver-impl-libvirt-qemu-x86=complete
driver-impl-libvirt-lxc=complete
driver-impl-libvirt-xen=complete
driver-impl-vmware=complete
driver-impl-hyperv=complete
driver-impl-ironic=missing
driver-impl-libvirt-vz-vm=complete
driver-impl-libvirt-vz-ct=missing

[guest.setup.inject.file]
title=Inject files into disk image
status=optional
notes=This allows for the end user to provide data for multiple
  files to be injected into the root filesystem before an instance
  is booted. This requires that the compute node understand the
  format of the filesystem and any partitioning scheme it might
  use on the block device. This is a non-trivial problem considering
  the vast number of filesystems in existence. The problem of injecting
  files to a guest OS is better solved by obtaining via the metadata
  service or config drive. Therefore this operation is considered
  optional to support.
cli=
driver-impl-xenserver=complete
driver-impl-libvirt-kvm-x86=complete
driver-impl-libvirt-kvm-ppc64=missing
driver-impl-libvirt-kvm-s390x=missing
driver-impl-libvirt-qemu-x86=complete
driver-impl-libvirt-lxc=missing
driver-impl-libvirt-xen=missing
driver-impl-vmware=missing
driver-impl-hyperv=missing
driver-impl-ironic=missing
driver-impl-libvirt-vz-vm=missing
driver-impl-libvirt-vz-ct=missing

[guest.setup.inject.networking]
title=Inject guest networking config
status=optional
notes=This allows for static networking configuration (IP
  address, netmask, gateway and routes) to be injected directly
  into the root filesystem before an instance is booted. This
  requires that the compute node understand how networking is
  configured in the guest OS which is a non-trivial problem
  considering the vast number of operating system types. The
  problem of configuring networking is better solved by DHCP
  or by obtaining static config via the metadata service or
  config drive. Therefore this operation is considered optional
  to support.
cli=
driver-impl-xenserver=partial
driver-notes-xenserver=Only for Debian derived guests
driver-impl-libvirt-kvm-x86=partial
driver-notes-libvirt-kvm-x86=Only for Debian derived guests
driver-impl-libvirt-kvm-ppc64=missing
driver-impl-libvirt-kvm-s390x=missing
driver-impl-libvirt-qemu-x86=partial
driver-notes-libvirt-qemu-x86=Only for Debian derived guests
driver-impl-libvirt-lxc=missing
driver-impl-libvirt-xen=missing
driver-impl-vmware=partial
driver-notes-vmware=requires vmware tools installed
driver-impl-hyperv=missing
driver-impl-ironic=missing
driver-impl-libvirt-vz-vm=missing
driver-impl-libvirt-vz-ct=missing

[console.rdp]
title=Remote desktop over RDP
status=choice(console)
notes=This allows the administrator to interact with the graphical
  console of the guest OS via RDP. This provides a way to see boot
  up messages and login to the instance when networking configuration
  has failed, thus preventing a network based login. Some operating
  systems may prefer to emit messages via the serial console for
  easier consumption. Therefore support for this operation is not
  mandatory, however, a driver is required to support at least one
  of the listed console access operations.
cli=
driver-impl-xenserver=missing
driver-impl-libvirt-kvm-x86=missing
driver-impl-libvirt-kvm-ppc64=missing
driver-impl-libvirt-kvm-s390x=missing
driver-impl-libvirt-qemu-x86=missing
driver-impl-libvirt-lxc=missing
driver-impl-libvirt-xen=missing
driver-impl-vmware=missing
driver-impl-hyperv=complete
driver-impl-ironic=missing
driver-impl-libvirt-vz-vm=missing
driver-impl-libvirt-vz-ct=missing

[console.serial.log]
title=View serial console logs
status=choice(console)
notes=This allows the administrator to query the logs of data
  emitted by the guest OS on its virtualized serial port. For
  UNIX guests this typically includes all boot up messages and
  so is useful for diagnosing problems when an instance fails
  to successfully boot. Not all guest operating systems will be
  able to emit boot information on a serial console, others may
  only support graphical consoles. Therefore support for this
  operation is not mandatory, however, a driver is required to
  support at least one of the listed console access operations.
cli=
driver-impl-xenserver=complete
driver-impl-libvirt-kvm-x86=complete
driver-impl-libvirt-kvm-ppc64=missing
driver-impl-libvirt-kvm-s390x=complete
driver-impl-libvirt-qemu-x86=complete
driver-impl-libvirt-lxc=missing
driver-impl-libvirt-xen=complete
driver-impl-vmware=complete
driver-impl-hyperv=complete
driver-impl-ironic=missing
driver-impl-libvirt-vz-vm=missing
driver-impl-libvirt-vz-ct=missing

[console.serial.interactive]
title=Remote interactive serial console
status=choice(console)
notes=This allows the administrator to interact with the serial
  console of the guest OS. This provides a way to see boot
  up messages and login to the instance when networking configuration
  has failed, thus preventing a network based login. Not all guest
  operating systems will be able to emit boot information on a serial
  console, others may only support graphical consoles. Therefore support
  for this operation is not mandatory, however, a driver is required to
  support at least one of the listed console access operations.
  This feature was introduced in the Juno release with blueprint
  https://blueprints.launchpad.net/nova/+spec/serial-ports
cli=nova get-serial-console <server>
driver-impl-xenserver=missing
driver-impl-libvirt-kvm-x86=complete
driver-impl-libvirt-kvm-ppc64=unknown
driver-impl-libvirt-kvm-s390x=complete
driver-impl-libvirt-qemu-x86=unknown
driver-impl-libvirt-lxc=unknown
driver-impl-libvirt-xen=unknown
driver-impl-vmware=missing
driver-impl-hyperv=missing
driver-notes-hyperv=Will be complete when this review is merged:
  https://review.openstack.org/#/c/145004/
driver-impl-ironic=unknown
driver-impl-libvirt-vz-vm=missing
driver-impl-libvirt-vz-ct=missing

[console.spice]
title=Remote desktop over SPICE
status=choice(console)
notes=This allows the administrator to interact with the graphical
  console of the guest OS via SPICE. This provides a way to see boot
  up messages and login to the instance when networking configuration
  has failed, thus preventing a network based login. Some operating
  systems may prefer to emit messages via the serial console for
  easier consumption. Therefore support for this operation is not
  mandatory, however, a driver is required to support at least one
  of the listed console access operations.
cli=
driver-impl-xenserver=missing
driver-impl-libvirt-kvm-x86=complete
driver-impl-libvirt-kvm-ppc64=missing
driver-impl-libvirt-kvm-s390x=missing
driver-impl-libvirt-qemu-x86=complete
driver-impl-libvirt-lxc=missing
driver-impl-libvirt-xen=missing
driver-impl-vmware=missing
driver-impl-hyperv=missing
driver-impl-ironic=missing
driver-impl-libvirt-vz-vm=missing
driver-impl-libvirt-vz-ct=missing

[console.vnc]
title=Remote desktop over VNC
status=choice(console)
notes=This allows the administrator to interact with the graphical
  console of the guest OS via VNC. This provides a way to see boot
  up messages and login to the instance when networking configuration
  has failed, thus preventing a network based login. Some operating
  systems may prefer to emit messages via the serial console for
  easier consumption. Therefore support for this operation is not
  mandatory, however, a driver is required to support at least one
  of the listed console access operations.
cli=
driver-impl-xenserver=complete
driver-impl-libvirt-kvm-x86=complete
driver-impl-libvirt-kvm-ppc64=missing
driver-impl-libvirt-kvm-s390x=missing
driver-impl-libvirt-qemu-x86=complete
driver-impl-libvirt-lxc=missing
driver-impl-libvirt-xen=complete
driver-impl-vmware=complete
driver-impl-hyperv=missing
driver-impl-ironic=missing
driver-impl-libvirt-vz-vm=complete
driver-impl-libvirt-vz-ct=complete

[storage.block]
title=Block storage support
status=optional
notes=Block storage provides instances with direct attached
  virtual disks that can be used for persistent storage of data.
  As an alternative to direct attached disks, an instance may
  choose to use network based persistent storage. OpenStack provides
  object storage via the Swift service, or a traditional filesystem
  such as as NFS/GlusterFS may be used. Some types of instances may
  not require persistent storage at all, being simple transaction
  processing systems reading requests & sending results to and from
  the network. Therefore support for this configuration is not
  considered mandatory for drivers to support.
cli=
driver-impl-xenserver=complete
driver-impl-libvirt-kvm-x86=complete
driver-impl-libvirt-kvm-ppc64=complete
driver-impl-libvirt-kvm-s390x=complete
driver-impl-libvirt-qemu-x86=complete
driver-impl-libvirt-lxc=complete
driver-impl-libvirt-xen=complete
driver-impl-vmware=complete
driver-impl-hyperv=complete
driver-impl-ironic=missing
driver-impl-libvirt-vz-vm=partial
driver-impl-libvirt-vz-ct=missing

[storage.block.backend.fibrechannel]
title=Block storage over fibre channel
status=optional
notes=To maximise performance of the block storage, it may be desirable
  to directly access fibre channel LUNs from the underlying storage
  technology on the compute hosts. Since this is just a performance
  optimization of the I/O path it is not considered mandatory to support.
cli=
driver-impl-xenserver=missing
driver-impl-libvirt-kvm-x86=complete
driver-impl-libvirt-kvm-ppc64=missing
driver-impl-libvirt-kvm-s390x=complete
driver-impl-libvirt-qemu-x86=complete
driver-impl-libvirt-lxc=complete
driver-impl-libvirt-xen=complete
driver-impl-vmware=missing
driver-impl-hyperv=missing
driver-impl-ironic=missing
driver-impl-libvirt-vz-vm=complete
driver-impl-libvirt-vz-ct=missing

[storage.block.backend.iscsi]
title=Block storage over iSCSI
status=condition(storage.block==complete)
notes=If the driver wishes to support block storage, it is common to
  provide an iSCSI based backend to access the storage from cinder.
  This isolates the compute layer for knowledge of the specific storage
  technology used by Cinder, albeit at a potential performance cost due
  to the longer I/O path involved. If the driver chooses to support
  block storage, then this is considered mandatory to support, otherwise
  it is considered optional.
cli=
driver-impl-xenserver=complete
driver-impl-libvirt-kvm-x86=complete
driver-impl-libvirt-kvm-ppc64=complete
driver-impl-libvirt-kvm-s390x=complete
driver-impl-libvirt-qemu-x86=complete
driver-impl-libvirt-lxc=complete
driver-impl-libvirt-xen=complete
driver-impl-vmware=complete
driver-impl-hyperv=complete
driver-impl-ironic=missing
driver-impl-libvirt-vz-vm=complete
driver-impl-libvirt-vz-ct=missing

[storage.block.backend.iscsi.auth.chap]
title=CHAP authentication for iSCSI
status=optional
notes=If accessing the cinder iSCSI service over an untrusted LAN it
  is desirable to be able to enable authentication for the iSCSI
  protocol. CHAP is the commonly used authentication protocol for
  iSCSI. This is not considered mandatory to support. (?)
cli=
driver-impl-xenserver=complete
driver-impl-libvirt-kvm-x86=complete
driver-impl-libvirt-kvm-ppc64=complete
driver-impl-libvirt-kvm-s390x=complete
driver-impl-libvirt-qemu-x86=complete
driver-impl-libvirt-lxc=complete
driver-impl-libvirt-xen=complete
driver-impl-vmware=complete
driver-impl-hyperv=complete
driver-impl-ironic=missing
driver-impl-libvirt-vz-vm=complete
driver-impl-libvirt-vz-ct=missing

[storage.image]
title=Image storage support
status=mandatory
notes=This refers to the ability to boot an instance from an image
  stored in the glance image repository. Without this feature it
  would not be possible to bootstrap from a clean environment, since
  there would be no way to get block volumes populated and reliance
  on external PXE servers is out of scope. Therefore this is considered
  a mandatory storage feature to support.
cli=
driver-impl-xenserver=complete
driver-impl-libvirt-kvm-x86=complete
driver-impl-libvirt-kvm-ppc64=complete
driver-impl-libvirt-kvm-s390x=complete
driver-impl-libvirt-qemu-x86=complete
driver-impl-libvirt-lxc=complete
driver-impl-libvirt-xen=complete
driver-impl-vmware=complete
driver-impl-hyperv=complete
driver-impl-ironic=complete
driver-impl-libvirt-vz-vm=complete
driver-impl-libvirt-vz-ct=complete

[networking.firewallrules]
title=Network firewall rules
status=optional
notes=Unclear how this is different from security groups
cli=
driver-impl-xenserver=complete
driver-impl-libvirt-kvm-x86=complete
driver-impl-libvirt-kvm-ppc64=complete
driver-impl-libvirt-kvm-s390x=complete
driver-impl-libvirt-qemu-x86=complete
driver-impl-libvirt-lxc=complete
driver-impl-libvirt-xen=complete
driver-impl-vmware=missing
driver-impl-hyperv=missing
driver-impl-ironic=missing
driver-impl-libvirt-vz-vm=complete
driver-impl-libvirt-vz-ct=complete

[networking.routing]
title=Network routing
status=optional
notes=Unclear what this refers to
cli=
driver-impl-xenserver=complete
driver-impl-libvirt-kvm-x86=complete
driver-impl-libvirt-kvm-ppc64=missing
driver-impl-libvirt-kvm-s390x=complete
driver-impl-libvirt-qemu-x86=complete
driver-impl-libvirt-lxc=complete
driver-impl-libvirt-xen=complete
driver-impl-vmware=complete
driver-impl-hyperv=missing
driver-impl-ironic=complete
driver-impl-libvirt-vz-vm=complete
driver-impl-libvirt-vz-ct=complete

[networking.securitygroups]
title=Network security groups
status=optional
notes=The security groups feature provides a way to define rules
  to isolate the network traffic of different instances running
  on a compute host. This would prevent actions such as MAC and
  IP address spoofing, or the ability to setup rogue DHCP servers.
  In a private cloud environment this may be considered to be a
  superfluous requirement. Thereforce this is considered to be
  an optional configuration to support.
cli=
driver-impl-xenserver=complete
driver-impl-libvirt-kvm-x86=complete
driver-impl-libvirt-kvm-ppc64=complete
driver-impl-libvirt-kvm-s390x=complete
driver-impl-libvirt-qemu-x86=complete
driver-impl-libvirt-lxc=complete
driver-impl-libvirt-xen=complete
driver-impl-vmware=partial
driver-notes-vmware=This is supported by the Neutron NSX plugins
driver-impl-hyperv=missing
driver-impl-ironic=missing
driver-impl-libvirt-vz-vm=complete
driver-impl-libvirt-vz-ct=complete

[networking.topology.flat]
title=Flat networking
status=choice(networking.topology)
notes=Provide network conenctivity to guests using a
  flat topology across all compute nodes. At least one
  of the networking configurations is mandatory to
  support in the drivers.
cli=
driver-impl-xenserver=complete
driver-impl-libvirt-kvm-x86=complete
driver-impl-libvirt-kvm-ppc64=complete
driver-impl-libvirt-kvm-s390x=complete
driver-impl-libvirt-qemu-x86=complete
driver-impl-libvirt-lxc=complete
driver-impl-libvirt-xen=complete
driver-impl-vmware=complete
driver-impl-hyperv=complete
driver-impl-ironic=complete
driver-impl-libvirt-vz-vm=complete
driver-impl-libvirt-vz-ct=complete

[networking.topology.vlan]
title=VLAN networking
status=choice(networking.topology)
notes=Provide network connectivity to guests using VLANs
  to define the topology. At least one of the networking
  configurations is mandatory to support in the drivers.
cli=
driver-impl-xenserver=complete
driver-impl-libvirt-kvm-x86=complete
driver-impl-libvirt-kvm-ppc64=complete
driver-impl-libvirt-kvm-s390x=complete
driver-impl-libvirt-qemu-x86=complete
driver-impl-libvirt-lxc=complete
driver-impl-libvirt-xen=complete
driver-impl-vmware=complete
driver-impl-hyperv=missing
driver-impl-ironic=missing
driver-impl-libvirt-vz-vm=complete
driver-impl-libvirt-vz-ct=complete
