Replace support matrix ext with common library

The code to generate a support matrix has been pulled into a common
library. Using this instead of duplicating code in various projects that
need it.

Change-Id: If01e440225fec2206e934ae7b0c6c2dce1266eab
Co-Authored-By: Stephen Finucane <stephenfin@redhat.com>
This commit is contained in:
Mike Perez
2018-01-25 11:01:57 +11:00
committed by Stephen Finucane
parent b0256a71b2
commit 124e52062a
5 changed files with 62 additions and 632 deletions

View File

View File

@@ -1,518 +0,0 @@
# 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.
"""
This provides a sphinx extension able to render the source/support-matrix.ini
file into the developer documentation.
It is used via a single directive in the .rst file
.. support_matrix::
"""
import re
import six
from six.moves import configparser
from docutils import nodes
from docutils.parsers import rst
class SupportMatrix(object):
"""Represents the entire support matrix for Nova virt drivers
"""
def __init__(self):
# List of SupportMatrixFeature instances, describing
# all the features present in Nova virt drivers
self.features = []
# Dict of (name, SupportMatrixTarget) enumerating
# all the hypervisor drivers that have data recorded
# for them in self.features. The 'name' dict key is
# the value from the SupportMatrixTarget.key attribute
self.targets = {}
class SupportMatrixFeature(object):
STATUS_MANDATORY = "mandatory"
STATUS_CHOICE = "choice"
STATUS_CONDITION = "condition"
STATUS_OPTIONAL = "optional"
STATUS_ALL = [STATUS_MANDATORY, STATUS_CHOICE,
STATUS_CONDITION, STATUS_OPTIONAL]
def __init__(self, key, title, status=STATUS_OPTIONAL,
group=None, notes=None, cli=[]):
# A unique key (eg 'foo.bar.wizz') to identify the feature
self.key = key
# A human friendly short title for the feature
self.title = title
# One of the status constants
self.status = status
# Detail string if status was choice/condition
self.group = group
# Arbitrarily long string describing the feature in detail
self.notes = notes
# Dict of (name, SupportMatrixImplementation) detailing
# the implementation for each hypervisor driver. The
# 'name' dict key is the value from SupportMatrixTarget.key
# for the hypervisor in question
self.implementations = {}
# A list of CLI commands which are related to that feature
self.cli = cli
class SupportMatrixImplementation(object):
STATUS_COMPLETE = "complete"
STATUS_PARTIAL = "partial"
STATUS_MISSING = "missing"
STATUS_UKNOWN = "unknown"
STATUS_ALL = [STATUS_COMPLETE, STATUS_PARTIAL, STATUS_MISSING,
STATUS_UKNOWN]
def __init__(self, status=STATUS_MISSING, notes=None):
# One of the status constants detailing the implementation
# level
self.status = status
# Arbitrary string describing any caveats of the implementation.
# Mandatory if status is 'partial', optional otherwise.
self.notes = notes
class SupportMatrixTarget(object):
def __init__(self, key, title, driver, hypervisor=None, architecture=None):
""":param key: Unique identifier for the hypervisor driver
:param title: Human friendly name of the hypervisor
:param driver: Name of the Nova driver
:param hypervisor: (optional) Name of the hypervisor, if many
:param architecture: (optional) Name of the architecture, if many
"""
self.key = key
self.title = title
self.driver = driver
self.hypervisor = hypervisor
self.architecture = architecture
class SupportMatrixDirective(rst.Directive):
# The argument is the filename, e.g. support-matrix.ini
required_arguments = 1
def run(self):
matrix = self._load_support_matrix()
return self._build_markup(matrix)
def _load_support_matrix(self):
"""Reads the support-matrix.ini file and populates an instance
of the SupportMatrix class with all the data.
:returns: SupportMatrix instance
"""
if six.PY3:
cfg = configparser.ConfigParser()
else:
cfg = configparser.SafeConfigParser()
env = self.state.document.settings.env
fname = self.arguments[0]
rel_fpath, fpath = env.relfn2path(fname)
with open(fpath) as fp:
cfg.readfp(fp)
# This ensures that the docs are rebuilt whenever the
# .ini file changes
env.note_dependency(rel_fpath)
matrix = SupportMatrix()
matrix.targets = self._get_targets(cfg)
matrix.features = self._get_features(cfg, matrix.targets)
return matrix
def _get_targets(self, cfg):
# The 'targets' section is special - it lists all the
# hypervisors that this file records data for
targets = {}
for item in cfg.options("targets"):
if not item.startswith("driver-impl-"):
continue
# The driver string will optionally contain
# a hypervisor and architecture qualifier
# so we expect between 1 and 3 components
# in the name
key = item[12:]
title = cfg.get("targets", item)
name = key.split("-")
if len(name) == 1:
target = SupportMatrixTarget(key,
title,
name[0])
elif len(name) == 2:
target = SupportMatrixTarget(key,
title,
name[0],
name[1])
elif len(name) == 3:
target = SupportMatrixTarget(key,
title,
name[0],
name[1],
name[2])
else:
raise Exception("'%s' field is malformed in '[%s]' section" %
(item, "DEFAULT"))
targets[key] = target
return targets
def _get_features(self, cfg, targets):
# All sections except 'targets' describe some feature of
# the Nova hypervisor driver implementation
features = []
for section in cfg.sections():
if section == "targets":
continue
if not cfg.has_option(section, "title"):
raise Exception(
"'title' field missing in '[%s]' section" % section)
title = cfg.get(section, "title")
status = SupportMatrixFeature.STATUS_OPTIONAL
if cfg.has_option(section, "status"):
# The value is a string "status(group)" where
# the 'group' part is optional
status = cfg.get(section, "status")
offset = status.find("(")
group = None
if offset != -1:
group = status[offset + 1:-1]
status = status[0:offset]
if status not in SupportMatrixFeature.STATUS_ALL:
raise Exception(
"'status' field value '%s' in ['%s']"
"section must be %s" %
(status, section,
",".join(SupportMatrixFeature.STATUS_ALL)))
notes = None
if cfg.has_option(section, "notes"):
notes = cfg.get(section, "notes")
cli = []
if cfg.has_option(section, "cli"):
cli = cfg.get(section, "cli")
feature = SupportMatrixFeature(section,
title,
status,
group,
notes,
cli)
# Now we've got the basic feature details, we must process
# the hypervisor driver implementation for each feature
for item in cfg.options(section):
if not item.startswith("driver-impl-"):
continue
key = item[12:]
if key not in targets:
raise Exception(
"Driver impl '%s' in '[%s]' not declared" %
(item, section))
status = cfg.get(section, item)
if status not in SupportMatrixImplementation.STATUS_ALL:
raise Exception(
"'%s' value '%s' in '[%s]' section must be %s" %
(item, status, section,
",".join(SupportMatrixImplementation.STATUS_ALL)))
noteskey = "driver-notes-" + item[12:]
notes = None
if cfg.has_option(section, noteskey):
notes = cfg.get(section, noteskey)
target = targets[key]
impl = SupportMatrixImplementation(status,
notes)
feature.implementations[target.key] = impl
for key in targets:
if key not in feature.implementations:
raise Exception("'%s' missing in '[%s]' section" %
(target.key, section))
features.append(feature)
return features
def _build_markup(self, matrix):
"""Constructs the docutils content for the support matrix
"""
content = []
self._build_summary(matrix, content)
self._build_details(matrix, content)
self._build_notes(content)
return content
def _build_summary(self, matrix, content):
"""Constructs the docutils content for the summary of
the support matrix.
The summary consists of a giant table, with one row
for each feature, and a column for each hypervisor
driver. It provides an 'at a glance' summary of the
status of each driver
"""
summarytitle = nodes.subtitle(text="Summary")
summary = nodes.table()
cols = len(matrix.targets.keys())
cols += 2
summarygroup = nodes.tgroup(cols=cols)
summarybody = nodes.tbody()
summaryhead = nodes.thead()
for i in range(cols):
summarygroup.append(nodes.colspec(colwidth=1))
summarygroup.append(summaryhead)
summarygroup.append(summarybody)
summary.append(summarygroup)
content.append(summarytitle)
content.append(summary)
# This sets up all the column headers - two fixed
# columns for feature name & status
header = nodes.row()
blank = nodes.entry()
blank.append(nodes.emphasis(text="Feature"))
header.append(blank)
blank = nodes.entry()
blank.append(nodes.emphasis(text="Status"))
header.append(blank)
summaryhead.append(header)
# then one column for each hypervisor driver
impls = matrix.targets.keys()
sorted(impls)
for key in impls:
target = matrix.targets[key]
implcol = nodes.entry()
header.append(implcol)
implcol.append(nodes.strong(text=target.title))
# We now produce the body of the table, one row for
# each feature to report on
for feature in matrix.features:
item = nodes.row()
# the hyperlink target name linking to details
id = re.sub("[^a-zA-Z0-9_]", "_",
feature.key)
# first the to fixed columns for title/status
keycol = nodes.entry()
item.append(keycol)
keyref = nodes.reference(refid=id)
keytxt = nodes.inline()
keycol.append(keytxt)
keytxt.append(keyref)
keyref.append(nodes.strong(text=feature.title))
statuscol = nodes.entry()
item.append(statuscol)
statuscol.append(nodes.inline(
text=feature.status,
classes=["sp_feature_" + feature.status]))
# and then one column for each hypervisor driver
impls = matrix.targets.keys()
sorted(impls)
for key in impls:
target = matrix.targets[key]
impl = feature.implementations[key]
implcol = nodes.entry()
item.append(implcol)
id = re.sub("[^a-zA-Z0-9_]", "_",
feature.key + "_" + key)
implref = nodes.reference(refid=id)
impltxt = nodes.inline()
implcol.append(impltxt)
impltxt.append(implref)
status = ""
if impl.status == SupportMatrixImplementation.STATUS_COMPLETE:
status = u"\u2714"
elif impl.status == SupportMatrixImplementation.STATUS_MISSING:
status = u"\u2716"
elif impl.status == SupportMatrixImplementation.STATUS_PARTIAL:
status = u"\u2714"
elif impl.status == SupportMatrixImplementation.STATUS_UKNOWN:
status = u"?"
implref.append(nodes.literal(
text=status,
classes=["sp_impl_summary", "sp_impl_" + impl.status]))
summarybody.append(item)
def _build_details(self, matrix, content):
"""Constructs the docutils content for the details of
the support matrix.
This is generated as a bullet list of features.
Against each feature we provide the description of
the feature and then the details of the hypervisor
impls, with any driver specific notes that exist
"""
detailstitle = nodes.subtitle(text="Details")
details = nodes.bullet_list()
content.append(detailstitle)
content.append(details)
# One list entry for each feature we're reporting on
for feature in matrix.features:
item = nodes.list_item()
status = feature.status
if feature.group is not None:
status += "(" + feature.group + ")"
# The hypervisor target name linked from summary table
id = re.sub("[^a-zA-Z0-9_]", "_",
feature.key)
# Highlight the feature title name
item.append(nodes.strong(text=feature.title,
ids=[id]))
para = nodes.paragraph()
para.append(nodes.strong(text="Status: " + status + ". "))
if feature.notes is not None:
para.append(nodes.inline(text=feature.notes))
item.append(para)
if feature.cli:
item.append(self._create_cli_paragraph(feature))
para_divers = nodes.paragraph()
para_divers.append(nodes.strong(text="drivers:"))
# A sub-list giving details of each hypervisor target
impls = nodes.bullet_list()
for key in feature.implementations:
target = matrix.targets[key]
impl = feature.implementations[key]
subitem = nodes.list_item()
id = re.sub("[^a-zA-Z0-9_]", "_",
feature.key + "_" + key)
subitem += [
nodes.strong(text=target.title + ": "),
nodes.literal(text=impl.status,
classes=["sp_impl_" + impl.status],
ids=[id]),
]
if impl.notes is not None:
subitem.append(self._create_notes_paragraph(impl.notes))
impls.append(subitem)
para_divers.append(impls)
item.append(para_divers)
details.append(item)
def _build_notes(self, content):
"""Constructs a list of notes content for the support matrix.
This is generated as a bullet list.
"""
notestitle = nodes.subtitle(text="Notes")
notes = nodes.bullet_list()
content.append(notestitle)
content.append(notes)
NOTES = [
"Virtuozzo was formerly named Parallels in this document"
]
for note in NOTES:
item = nodes.list_item()
item.append(nodes.strong(text=note))
notes.append(item)
def _create_cli_paragraph(self, feature):
''' Create a paragraph which represents the CLI commands of the feature
The paragraph will have a bullet list of CLI commands.
'''
para = nodes.paragraph()
para.append(nodes.strong(text="CLI commands:"))
commands = nodes.bullet_list()
for c in feature.cli.split(";"):
cli_command = nodes.list_item()
cli_command += nodes.literal(text=c, classes=["sp_cli"])
commands.append(cli_command)
para.append(commands)
return para
def _create_notes_paragraph(self, notes):
""" Constructs a paragraph which represents the implementation notes
The paragraph consists of text and clickable URL nodes if links were
given in the notes.
"""
para = nodes.paragraph()
# links could start with http:// or https://
link_idxs = [m.start() for m in re.finditer('https?://', notes)]
start_idx = 0
for link_idx in link_idxs:
# assume the notes start with text (could be empty)
para.append(nodes.inline(text=notes[start_idx:link_idx]))
# create a URL node until the next text or the end of the notes
link_end_idx = notes.find(" ", link_idx)
if link_end_idx == -1:
# In case the notes end with a link without a blank
link_end_idx = len(notes)
uri = notes[link_idx:link_end_idx + 1]
para.append(nodes.reference("", uri, refuri=uri))
start_idx = link_end_idx + 1
# get all text after the last link (could be empty) or all of the
# text if no link was given
para.append(nodes.inline(text=notes[start_idx:]))
return para
def setup(app):
app.add_directive('support_matrix', SupportMatrixDirective)
app.add_stylesheet('support-matrix.css')

View File

@@ -1,2 +1,3 @@
sphinx!=1.6.6,!=1.6.7,>=1.6.5 # BSD sphinx!=1.6.6,!=1.6.7,>=1.6.5 # BSD
openstackdocstheme>=1.19.0 # Apache-2.0 openstackdocstheme>=1.19.0 # Apache-2.0
sphinx-feature-classification>=0.2.0 # Apache-2.0

View File

@@ -25,7 +25,7 @@ sys.path.insert(0, os.path.abspath('../'))
extensions = [ extensions = [
'sphinx.ext.autodoc', 'sphinx.ext.autodoc',
'openstackdocstheme', 'openstackdocstheme',
'ext.support_matrix' 'sphinx_feature_classification.support_matrix'
] ]
# The suffix of source filenames. # The suffix of source filenames.

View File

@@ -11,65 +11,12 @@
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
#
# # For information about the format of this file, refer to the documentation
# # for sphinx-feature-classification:
# =========================================
# Nova Hypervisor Feature Capability Matrix [driver.powervm]
# ========================================= title=PowerVM
#
# 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 the PowerVM driver. Please see the equivalent
# document in the Nova tree for information on in-tree hypervisors.
driver-impl-powervm=PowerVM
[operation.attach-volume] [operation.attach-volume]
title=Attach block volume to instance title=Attach block volume to instance
@@ -83,7 +30,7 @@ notes=The attach volume operation provides a means to hotplug
is considered to be more of a pet than cattle. Therefore is considered to be more of a pet than cattle. Therefore
this operation is not considered to be mandatory to support. this operation is not considered to be mandatory to support.
cli=nova volume-attach <server> <volume> cli=nova volume-attach <server> <volume>
driver-impl-powervm=complete driver.powervm=complete
[operation.attach-tagged-volume] [operation.attach-tagged-volume]
title=Attach tagged block device to instance title=Attach tagged block device to instance
@@ -91,14 +38,14 @@ status=optional
notes=Attach a block device with a tag to an existing server instance. See notes=Attach a block device with a tag to an existing server instance. See
"Device tags" for more information. "Device tags" for more information.
cli=nova volume-attach <server> <volume> [--tag <tag>] cli=nova volume-attach <server> <volume> [--tag <tag>]
driver-impl-powervm=missing driver.powervm=missing
[operation.detach-volume] [operation.detach-volume]
title=Detach block volume from instance title=Detach block volume from instance
status=optional status=optional
notes=See notes for attach volume operation. notes=See notes for attach volume operation.
cli=nova volume-detach <server> <volume> cli=nova volume-detach <server> <volume>
driver-impl-powervm=complete driver.powervm=complete
[operation.extend-volume] [operation.extend-volume]
title=Extend block volume attached to instance title=Extend block volume attached to instance
@@ -112,8 +59,8 @@ notes=The extend volume operation provides a means to extend
where the instance is considered to be more of a pet than cattle. where the instance is considered to be more of a pet than cattle.
Therefore this operation is not considered to be mandatory to support. Therefore this operation is not considered to be mandatory to support.
cli=cinder extend <volume> <new_size> cli=cinder extend <volume> <new_size>
driver-impl-powervm=partial driver.powervm=partial
driver-notes-powervm=Not supported for rbd volumes. driver-notes.powervm=Not supported for rbd volumes.
[operation.attach-interface] [operation.attach-interface]
title=Attach virtual network interface to instance title=Attach virtual network interface to instance
@@ -126,7 +73,7 @@ notes=The attach interface operation provides a means to hotplug
In a cloud model it would be more typical to just spin up a In a cloud model it would be more typical to just spin up a
new instance with more interfaces. new instance with more interfaces.
cli=nova interface-attach <server> cli=nova interface-attach <server>
driver-impl-powervm=complete driver.powervm=complete
[operation.attach-tagged-interface] [operation.attach-tagged-interface]
title=Attach tagged virtual network interface to instance title=Attach tagged virtual network interface to instance
@@ -134,14 +81,14 @@ status=optional
notes=Attach a virtual network interface with a tag to an existing notes=Attach a virtual network interface with a tag to an existing
server instance. See "Device tags" for more information. server instance. See "Device tags" for more information.
cli=nova interface-attach <server> [--tag <tag>] cli=nova interface-attach <server> [--tag <tag>]
driver-impl-powervm=missing driver.powervm=missing
[operation.detach-interface] [operation.detach-interface]
title=Detach virtual network interface from instance title=Detach virtual network interface from instance
status=optional status=optional
notes=See notes for attach-interface operation. notes=See notes for attach-interface operation.
cli=nova interface-detach <server> <port_id> cli=nova interface-detach <server> <port_id>
driver-impl-powervm=complete driver.powervm=complete
[operation.maintenance-mode] [operation.maintenance-mode]
title=Set the host in a maintenance mode title=Set the host in a maintenance mode
@@ -154,7 +101,7 @@ notes=This operation allows a host to be placed into maintenance
The driver methods to implement are "host_maintenance_mode" and The driver methods to implement are "host_maintenance_mode" and
"set_host_enabled". "set_host_enabled".
cli=nova host-update <host> cli=nova host-update <host>
driver-impl-powervm=complete driver.powervm=complete
[operation.evacuate] [operation.evacuate]
title=Evacuate instances from a host title=Evacuate instances from a host
@@ -168,7 +115,7 @@ notes=A possible failure scenario in a cloud environment is the outage
dropped. That happens in the same way as a rebuild. dropped. That happens in the same way as a rebuild.
This is not considered to be a mandatory operation to support. This is not considered to be a mandatory operation to support.
cli=nova evacuate <server>;nova host-evacuate <host> cli=nova evacuate <server>;nova host-evacuate <host>
driver-impl-powervm=complete driver.powervm=complete
[operation.rebuild] [operation.rebuild]
title=Rebuild instance title=Rebuild instance
@@ -179,7 +126,7 @@ notes=A possible use case is additional attributes need to be set
'personalities'. Though this is not considered to be a mandatory 'personalities'. Though this is not considered to be a mandatory
operation to support. operation to support.
cli=nova rebuild <server> <image> cli=nova rebuild <server> <image>
driver-impl-powervm=complete driver.powervm=complete
[operation.get-guest-info] [operation.get-guest-info]
title=Guest instance status title=Guest instance status
@@ -189,7 +136,7 @@ notes=Provides realtime information about the power state of the guest
tracking changes in guests, this operation is considered mandatory to tracking changes in guests, this operation is considered mandatory to
support. support.
cli= cli=
driver-impl-powervm=complete driver.powervm=complete
[operation.get-host-uptime] [operation.get-host-uptime]
title=Guest host uptime title=Guest host uptime
@@ -197,7 +144,7 @@ status=optional
notes=Returns the result of host uptime since power on, notes=Returns the result of host uptime since power on,
it's used to report hypervisor status. it's used to report hypervisor status.
cli= cli=
driver-impl-powervm=complete driver.powervm=complete
[operation.get-host-ip] [operation.get-host-ip]
title=Guest host ip title=Guest host ip
@@ -205,7 +152,7 @@ status=optional
notes=Returns the ip of this host, it's used when doing notes=Returns the ip of this host, it's used when doing
resize and migration. resize and migration.
cli= cli=
driver-impl-powervm=complete driver.powervm=complete
[operation.live-migrate] [operation.live-migrate]
title=Live migrate instance across hosts title=Live migrate instance across hosts
@@ -222,7 +169,7 @@ notes=Live migration provides a way to move an instance off one
built on the container based virtualization. Therefore this built on the container based virtualization. Therefore this
operation is not considered mandatory to support. operation is not considered mandatory to support.
cli=nova live-migration <server>;nova host-evacuate-live <host> cli=nova live-migration <server>;nova host-evacuate-live <host>
driver-impl-powervm=complete driver.powervm=complete
[operation.force-live-migration-to-complete] [operation.force-live-migration-to-complete]
title=Force live migration to complete title=Force live migration to complete
@@ -238,7 +185,7 @@ notes=Live migration provides a way to move a running instance to another
a switch to post-copy mode. Otherwise the instance will be suspended a switch to post-copy mode. Otherwise the instance will be suspended
until the migration is completed or aborted. until the migration is completed or aborted.
cli=nova live-migration-force-complete <server> <migration> cli=nova live-migration-force-complete <server> <migration>
driver-impl-powervm=missing driver.powervm=missing
[operation.launch] [operation.launch]
title=Launch instance title=Launch instance
@@ -247,7 +194,7 @@ notes=Importing pre-existing running virtual machines on a host is
considered out of scope of the cloud paradigm. Therefore this considered out of scope of the cloud paradigm. Therefore this
operation is mandatory to support in drivers. operation is mandatory to support in drivers.
cli= cli=
driver-impl-powervm=complete driver.powervm=complete
[operation.pause] [operation.pause]
title=Stop instance CPUs (pause) title=Stop instance CPUs (pause)
@@ -262,7 +209,7 @@ notes=Stopping an instances CPUs can be thought of as roughly
implement it. Therefore this operation is considered optional implement it. Therefore this operation is considered optional
to support in drivers. to support in drivers.
cli=nova pause <server> cli=nova pause <server>
driver-impl-powervm=missing driver.powervm=missing
[operation.reboot] [operation.reboot]
title=Reboot instance title=Reboot instance
@@ -273,7 +220,7 @@ notes=It is reasonable for a guest OS administrator to trigger a
reboot can be achieved by a combination of stop+start. Therefore reboot can be achieved by a combination of stop+start. Therefore
this operation is considered optional. this operation is considered optional.
cli=nova reboot <server> cli=nova reboot <server>
driver-impl-powervm=complete driver.powervm=complete
[operation.rescue] [operation.rescue]
title=Rescue instance title=Rescue instance
@@ -287,7 +234,7 @@ notes=The rescue operation starts an instance in a special
thrown away and a new instance created. Therefore this thrown away and a new instance created. Therefore this
operation is considered optional to support in drivers. operation is considered optional to support in drivers.
cli=nova rescue <server> cli=nova rescue <server>
driver-impl-powervm=complete driver.powervm=complete
[operation.resize] [operation.resize]
title=Resize instance title=Resize instance
@@ -301,14 +248,14 @@ notes=The resize operation allows the user to change a running
running instance. Therefore this operation is considered running instance. Therefore this operation is considered
optional to support in drivers. optional to support in drivers.
cli=nova resize <server> <flavor> cli=nova resize <server> <flavor>
driver-impl-powervm=complete driver.powervm=complete
[operation.resume] [operation.resume]
title=Restore instance title=Restore instance
status=optional status=optional
notes=See notes for the suspend operation notes=See notes for the suspend operation
cli=nova resume <server> cli=nova resume <server>
driver-impl-powervm=missing driver.powervm=missing
[operation.set-admin-password] [operation.set-admin-password]
title=Set instance admin password title=Set instance admin password
@@ -325,7 +272,7 @@ notes=Provides a mechanism to (re)set the password of the administrator
this is just a convenient optimization. Therefore this operation is this is just a convenient optimization. Therefore this operation is
not considered mandatory for drivers to support. not considered mandatory for drivers to support.
cli=nova set-password <server> cli=nova set-password <server>
driver-impl-powervm=missing driver.powervm=missing
[operation.snapshot] [operation.snapshot]
title=Save snapshot of instance disk title=Save snapshot of instance disk
@@ -341,7 +288,7 @@ notes=The snapshot operation allows the current state of the
snapshot cannot be assumed. Therefore this operation is not snapshot cannot be assumed. Therefore this operation is not
considered mandatory to support. considered mandatory to support.
cli=nova image-create <server> <name> cli=nova image-create <server> <name>
driver-impl-powervm=complete driver.powervm=complete
[operation.suspend] [operation.suspend]
title=Suspend instance title=Suspend instance
@@ -362,7 +309,7 @@ notes=Suspending an instance can be thought of as roughly
the instance instead of suspending. Therefore this operation the instance instead of suspending. Therefore this operation
is considered optional to support. is considered optional to support.
cli=nova suspend <server> cli=nova suspend <server>
driver-impl-powervm=missing driver.powervm=missing
[operation.swap-volume] [operation.swap-volume]
title=Swap block volumes title=Swap block volumes
@@ -376,7 +323,7 @@ notes=The swap volume operation is a mechanism for changing a running
migration to work in the volume service. This is considered optional to migration to work in the volume service. This is considered optional to
support. support.
cli=nova volume-update <server> <attachment> <volume> cli=nova volume-update <server> <attachment> <volume>
driver-impl-powervm=missing driver.powervm=missing
[operation.terminate] [operation.terminate]
title=Shutdown instance title=Shutdown instance
@@ -386,7 +333,7 @@ notes=The ability to terminate a virtual machine is required in
avoid indefinitely ongoing billing. Therefore this operation avoid indefinitely ongoing billing. Therefore this operation
is mandatory to support in drivers. is mandatory to support in drivers.
cli=nova delete <server> cli=nova delete <server>
driver-impl-powervm=complete driver.powervm=complete
[operation.trigger-crash-dump] [operation.trigger-crash-dump]
title=Trigger crash dump title=Trigger crash dump
@@ -397,14 +344,14 @@ notes=The trigger crash dump operation is a mechanism for triggering
a means to dump the production memory image as a dump file which is useful a means to dump the production memory image as a dump file which is useful
for users. Therefore this operation is considered optional to support. for users. Therefore this operation is considered optional to support.
cli=nova trigger-crash-dump <server> cli=nova trigger-crash-dump <server>
driver-impl-powervm=missing driver.powervm=missing
[operation.unpause] [operation.unpause]
title=Resume instance CPUs (unpause) title=Resume instance CPUs (unpause)
status=optional status=optional
notes=See notes for the "Stop instance CPUs" operation notes=See notes for the "Stop instance CPUs" operation
cli=nova unpause <server> cli=nova unpause <server>
driver-impl-powervm=missing driver.powervm=missing
[guest.disk.autoconfig] [guest.disk.autoconfig]
title=Auto configure disk title=Auto configure disk
@@ -413,7 +360,7 @@ notes=Partition and resize FS to match the size specified by
flavors.root_gb, As this is hypervisor specific feature. flavors.root_gb, As this is hypervisor specific feature.
Therefore this operation is considered optional to support. Therefore this operation is considered optional to support.
cli= cli=
driver-impl-powervm=missing driver.powervm=missing
[guest.disk.rate-limit] [guest.disk.rate-limit]
title=Instance disk I/O limits title=Instance disk I/O limits
@@ -425,7 +372,7 @@ notes=The ability to set rate limits on virtual disks allows for
of doing fine grained tuning. Therefore this is not considered of doing fine grained tuning. Therefore this is not considered
to be an mandatory configuration to support. to be an mandatory configuration to support.
cli=nova limits cli=nova limits
driver-impl-powervm=missing driver.powervm=missing
[guest.setup.configdrive] [guest.setup.configdrive]
title=Config drive support title=Config drive support
@@ -440,7 +387,7 @@ notes=The config drive provides an information channel into
of the guest setup mechanisms is required to be supported by of the guest setup mechanisms is required to be supported by
drivers, in order to enable login access. drivers, in order to enable login access.
cli= cli=
driver-impl-powervm=complete driver.powervm=complete
[guest.setup.inject.file] [guest.setup.inject.file]
title=Inject files into disk image title=Inject files into disk image
@@ -455,7 +402,7 @@ notes=This allows for the end user to provide data for multiple
service or config drive. Therefore this operation is considered service or config drive. Therefore this operation is considered
optional to support. optional to support.
cli= cli=
driver-impl-powervm=missing driver.powervm=missing
[guest.setup.inject.networking] [guest.setup.inject.networking]
title=Inject guest networking config title=Inject guest networking config
@@ -471,7 +418,7 @@ notes=This allows for static networking configuration (IP
config drive. Therefore this operation is considered optional config drive. Therefore this operation is considered optional
to support. to support.
cli= cli=
driver-impl-powervm=missing driver.powervm=missing
[console.rdp] [console.rdp]
title=Remote desktop over RDP title=Remote desktop over RDP
@@ -485,7 +432,7 @@ notes=This allows the administrator to interact with the graphical
mandatory, however, a driver is required to support at least one mandatory, however, a driver is required to support at least one
of the listed console access operations. of the listed console access operations.
cli=nova get-rdp-console <server> <console-type> cli=nova get-rdp-console <server> <console-type>
driver-impl-powervm=missing driver.powervm=missing
[console.serial.log] [console.serial.log]
title=View serial console logs title=View serial console logs
@@ -500,7 +447,7 @@ notes=This allows the administrator to query the logs of data
operation is not mandatory, however, a driver is required to operation is not mandatory, however, a driver is required to
support at least one of the listed console access operations. support at least one of the listed console access operations.
cli=nova console-log <server> cli=nova console-log <server>
driver-impl-powervm=missing driver.powervm=missing
[console.serial.interactive] [console.serial.interactive]
title=Remote interactive serial console title=Remote interactive serial console
@@ -516,7 +463,7 @@ notes=This allows the administrator to interact with the serial
This feature was introduced in the Juno release with blueprint This feature was introduced in the Juno release with blueprint
https://blueprints.launchpad.net/nova/+spec/serial-ports https://blueprints.launchpad.net/nova/+spec/serial-ports
cli=nova get-serial-console <server> cli=nova get-serial-console <server>
driver-impl-powervm=missing driver.powervm=missing
[console.spice] [console.spice]
title=Remote desktop over SPICE title=Remote desktop over SPICE
@@ -530,7 +477,7 @@ notes=This allows the administrator to interact with the graphical
mandatory, however, a driver is required to support at least one mandatory, however, a driver is required to support at least one
of the listed console access operations. of the listed console access operations.
cli=nova get-spice-console <server> <console-type> cli=nova get-spice-console <server> <console-type>
driver-impl-powervm=missing driver.powervm=missing
[console.vnc] [console.vnc]
title=Remote desktop over VNC title=Remote desktop over VNC
@@ -544,7 +491,7 @@ notes=This allows the administrator to interact with the graphical
mandatory, however, a driver is required to support at least one mandatory, however, a driver is required to support at least one
of the listed console access operations. of the listed console access operations.
cli=nova get-vnc-console <server> <console-type> cli=nova get-vnc-console <server> <console-type>
driver-impl-powervm=complete driver.powervm=complete
[storage.block] [storage.block]
title=Block storage support title=Block storage support
@@ -560,7 +507,7 @@ notes=Block storage provides instances with direct attached
the network. Therefore support for this configuration is not the network. Therefore support for this configuration is not
considered mandatory for drivers to support. considered mandatory for drivers to support.
cli= cli=
driver-impl-powervm=complete driver.powervm=complete
[storage.block.backend.fibrechannel] [storage.block.backend.fibrechannel]
title=Block storage over fibre channel title=Block storage over fibre channel
@@ -570,7 +517,7 @@ notes=To maximise performance of the block storage, it may be desirable
technology on the compute hosts. Since this is just a performance technology on the compute hosts. Since this is just a performance
optimization of the I/O path it is not considered mandatory to support. optimization of the I/O path it is not considered mandatory to support.
cli= cli=
driver-impl-powervm=complete driver.powervm=complete
[storage.block.backend.iscsi] [storage.block.backend.iscsi]
title=Block storage over iSCSI title=Block storage over iSCSI
@@ -583,7 +530,7 @@ notes=If the driver wishes to support block storage, it is common to
block storage, then this is considered mandatory to support, otherwise block storage, then this is considered mandatory to support, otherwise
it is considered optional. it is considered optional.
cli= cli=
driver-impl-powervm=complete driver.powervm=complete
[storage.block.backend.iscsi.auth.chap] [storage.block.backend.iscsi.auth.chap]
title=CHAP authentication for iSCSI title=CHAP authentication for iSCSI
@@ -593,7 +540,7 @@ notes=If accessing the cinder iSCSI service over an untrusted LAN it
protocol. CHAP is the commonly used authentication protocol for protocol. CHAP is the commonly used authentication protocol for
iSCSI. This is not considered mandatory to support. (?) iSCSI. This is not considered mandatory to support. (?)
cli= cli=
driver-impl-powervm=complete driver.powervm=complete
[storage.image] [storage.image]
title=Image storage support title=Image storage support
@@ -605,21 +552,21 @@ notes=This refers to the ability to boot an instance from an image
on external PXE servers is out of scope. Therefore this is considered on external PXE servers is out of scope. Therefore this is considered
a mandatory storage feature to support. a mandatory storage feature to support.
cli=nova boot --image <image> <name> cli=nova boot --image <image> <name>
driver-impl-powervm=complete driver.powervm=complete
[networking.firewallrules] [networking.firewallrules]
title=Network firewall rules title=Network firewall rules
status=optional status=optional
notes=Unclear how this is different from security groups notes=Unclear how this is different from security groups
cli= cli=
driver-impl-powervm=missing driver.powervm=missing
[networking.routing] [networking.routing]
title=Network routing title=Network routing
status=optional status=optional
notes=Unclear what this refers to notes=Unclear what this refers to
cli= cli=
driver-impl-powervm=complete driver.powervm=complete
[networking.securitygroups] [networking.securitygroups]
title=Network security groups title=Network security groups
@@ -632,7 +579,7 @@ notes=The security groups feature provides a way to define rules
superfluous requirement. Therefore this is considered to be an superfluous requirement. Therefore this is considered to be an
optional configuration to support. optional configuration to support.
cli= cli=
driver-impl-powervm=missing driver.powervm=missing
[networking.topology.flat] [networking.topology.flat]
title=Flat networking title=Flat networking
@@ -642,7 +589,7 @@ notes=Provide network connectivity to guests using a
of the networking configurations is mandatory to of the networking configurations is mandatory to
support in the drivers. support in the drivers.
cli= cli=
driver-impl-powervm=complete driver.powervm=complete
[networking.topology.vlan] [networking.topology.vlan]
title=VLAN networking title=VLAN networking
@@ -651,14 +598,14 @@ notes=Provide network connectivity to guests using VLANs to define the
topology when using nova-network. At least one of the networking topology when using nova-network. At least one of the networking
configurations is mandatory to support in the drivers. configurations is mandatory to support in the drivers.
cli= cli=
driver-impl-powervm=complete driver.powervm=complete
[operation.uefi-boot] [operation.uefi-boot]
title=uefi boot title=uefi boot
status=optional status=optional
notes=This allows users to boot a guest with uefi firmware. notes=This allows users to boot a guest with uefi firmware.
cli= cli=
driver-impl-powervm=missing driver.powervm=missing
[operation.device-tags] [operation.device-tags]
title=Device tags title=Device tags
@@ -676,7 +623,7 @@ notes=This allows users to set tags on virtual devices when creating a
Instead, device role tags should be used. Device tags can be Instead, device role tags should be used. Device tags can be
applied to virtual network interfaces and block devices. applied to virtual network interfaces and block devices.
cli=nova boot cli=nova boot
driver-impl-powervm=missing driver.powervm=missing
[operation.quiesce] [operation.quiesce]
title=quiesce title=quiesce
@@ -685,14 +632,14 @@ notes=Quiesce the specified instance to prepare for snapshots.
For libvirt, guest filesystems will be frozen through qemu For libvirt, guest filesystems will be frozen through qemu
agent. agent.
cli= cli=
driver-impl-powervm=missing driver.powervm=missing
[operation.unquiesce] [operation.unquiesce]
title=unquiesce title=unquiesce
status=optional status=optional
notes=See notes for the quiesce operation notes=See notes for the quiesce operation
cli= cli=
driver-impl-powervm=missing driver.powervm=missing
[operation.multiattach-volume] [operation.multiattach-volume]
title=Attach block volume to multiple instances title=Attach block volume to multiple instances
@@ -704,4 +651,4 @@ notes=The multiattach volume operation is an extension to
Note that for the libvirt driver, this is only supported Note that for the libvirt driver, this is only supported
if qemu<2.10 or libvirt>=3.10. if qemu<2.10 or libvirt>=3.10.
cli=nova volume-attach <server> <volume> cli=nova volume-attach <server> <volume>
driver-impl-powervm=missing driver.powervm=missing