724 lines
		
	
	
		
			27 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
			
		
		
	
	
			724 lines
		
	
	
		
			27 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
.. _hig:
 | 
						|
 | 
						|
=====================
 | 
						|
Human Interface Guide
 | 
						|
=====================
 | 
						|
 | 
						|
*Note: This page covers the OpenStackClient CLI only but looks familiar
 | 
						|
because it was derived from the Horizon HIG.*
 | 
						|
 | 
						|
Overview
 | 
						|
========
 | 
						|
 | 
						|
What is a HIG?
 | 
						|
The Human Interface Guidelines document was created for OpenStack developers
 | 
						|
in order to direct the creation of new OpenStackClient command interfaces.
 | 
						|
 | 
						|
Personas
 | 
						|
========
 | 
						|
 | 
						|
Personas are archetypal users of the system. Keep these types of users in
 | 
						|
mind when designing the interface.
 | 
						|
 | 
						|
Alice the admin
 | 
						|
---------------
 | 
						|
 | 
						|
Alice is an administrator who is responsible for maintaining the OpenStack
 | 
						|
cloud installation. She has many years of experience with Linux systems
 | 
						|
administration.
 | 
						|
 | 
						|
Darren the deployer
 | 
						|
-------------------
 | 
						|
 | 
						|
Darren is responsible for doing the initial OpenStack deployment on the
 | 
						|
host machines.
 | 
						|
 | 
						|
Emile the end-user
 | 
						|
------------------
 | 
						|
 | 
						|
Emile uses the cloud to do software development inside of the virtual
 | 
						|
machines. She uses the command-line tools because she finds it quicker
 | 
						|
than using the dashboard.
 | 
						|
 | 
						|
Principles
 | 
						|
==========
 | 
						|
 | 
						|
The principles established in this section define the high-level priorities
 | 
						|
to be used when designing and evaluating interactions for the OpenStack
 | 
						|
command line interface. Principles are broad in scope and can be considered
 | 
						|
the philosophical foundation for the OpenStack experience; while they may
 | 
						|
not describe the tactical implementation of design, they should be used
 | 
						|
when deciding between multiple courses of design.
 | 
						|
 | 
						|
A significant theme for designing for the OpenStack experience concerns
 | 
						|
focusing on common uses of the system rather than adding complexity to support
 | 
						|
functionality that is rarely used.
 | 
						|
 | 
						|
Consistency
 | 
						|
-----------
 | 
						|
 | 
						|
Consistency between OpenStack experiences will ensure that the command line
 | 
						|
interface feels like a single experience instead of a jumble of disparate
 | 
						|
products. Fractured experiences only serve to undermine user expectations
 | 
						|
about how they should interact with the system, creating an unreliable user
 | 
						|
experience. To avoid this, each interaction and visual representation within
 | 
						|
the system must be used uniformly and predictably. The architecture and elements
 | 
						|
detailed in this document will provide a strong foundation for establishing a
 | 
						|
consistent experience.
 | 
						|
 | 
						|
Example Review Criteria
 | 
						|
~~~~~~~~~~~~~~~~~~~~~~~
 | 
						|
 | 
						|
* Do the command actions adhere to a consistent application of actions?
 | 
						|
* Has a new type of command subject or output been introduced?
 | 
						|
* Does the design use command elements (options and arguments) as defined?
 | 
						|
  (See Core Elements.)
 | 
						|
* Can any newly proposed command elements (actions or subjects) be accomplished
 | 
						|
  with existing elements?
 | 
						|
 | 
						|
* Does the design adhere to the structural model of the core experience?
 | 
						|
  (See Core Architecture.)
 | 
						|
* Are any data objects displayed or manipulated in a way contradictory to how
 | 
						|
  they are handled elsewhere in the core experience?
 | 
						|
 | 
						|
Simplicity
 | 
						|
----------
 | 
						|
 | 
						|
To best support new users and create straight forward interactions, designs
 | 
						|
should be as simple as possible. When crafting new commands, designs should
 | 
						|
minimize the amount of noise present in output: large amounts of
 | 
						|
nonessential data, overabundance of possible actions and so on. Designs should
 | 
						|
focus on the intent of the command, requiring only the necessary components
 | 
						|
and either removing superfluous elements or making
 | 
						|
them accessible through optional arguments. An example of this principle occurs
 | 
						|
in OpenStack's use of tables: only the most often used columns are shown by
 | 
						|
default. Further data may be accessed through the output control options,
 | 
						|
allowing users to specify the types of data that they find useful in their
 | 
						|
day-to-day work.
 | 
						|
 | 
						|
Example Review Criteria
 | 
						|
~~~~~~~~~~~~~~~~~~~~~~~
 | 
						|
 | 
						|
* Can options be used to combine otherwise similar commands?
 | 
						|
 | 
						|
* How many of the displayed elements are relevant to the majority of users?
 | 
						|
* If multiple actions are required for the user to complete a task, is each
 | 
						|
  step required or can the process be more efficient?
 | 
						|
 | 
						|
User-Centered Design
 | 
						|
--------------------
 | 
						|
 | 
						|
Commands should be design based on how a user will interact with the system
 | 
						|
and not how the system's backend is organized. While database structures and
 | 
						|
APIs may define what is possible, they often do not define good user
 | 
						|
experience; consider user goals and the way in which users will want to
 | 
						|
interact with their data, then design for these work flows and mold the
 | 
						|
interface to the user, not the user to the interface.
 | 
						|
 | 
						|
Commands should be discoverable via the interface itself.
 | 
						|
 | 
						|
To determine a list of available commands, use the ``-h`` or
 | 
						|
``--help`` options:
 | 
						|
 | 
						|
.. code-block:: bash
 | 
						|
 | 
						|
    $ openstack --help
 | 
						|
 | 
						|
For help with an individual command, use the ``help`` command:
 | 
						|
 | 
						|
.. code-block:: bash
 | 
						|
 | 
						|
    $ openstack help server create
 | 
						|
 | 
						|
Example Review Criteria
 | 
						|
~~~~~~~~~~~~~~~~~~~~~~~
 | 
						|
 | 
						|
* How quickly can a user figure out how to accomplish a given task?
 | 
						|
* Has content been grouped and ordered according to usage relationships?
 | 
						|
* Do work flows support user goals or add complexity?
 | 
						|
 | 
						|
Transparency
 | 
						|
------------
 | 
						|
 | 
						|
Make sure users understand the current state of their infrastructure and
 | 
						|
interactions. For example, users should be able to access information about
 | 
						|
the state of each machine/virtual machine easily, without having to actively
 | 
						|
seek out this information. Whenever the user initiates an action, make sure
 | 
						|
a confirmation is displayed[1] to show that an input has been received. Upon
 | 
						|
completion of a process, make sure the user is informed. Ensure that the user
 | 
						|
never questions the state of their environment.
 | 
						|
 | 
						|
[1] This goes against the common UNIX philosophy of only reporting error
 | 
						|
conditions and output that is specifically requested.
 | 
						|
 | 
						|
Example Review Criteria
 | 
						|
~~~~~~~~~~~~~~~~~~~~~~~
 | 
						|
 | 
						|
* Does the user receive feedback when initiating a process?
 | 
						|
* When a process is completed?
 | 
						|
* Does the user have quick access to the state of their infrastructure?
 | 
						|
 | 
						|
 | 
						|
Architecture
 | 
						|
============
 | 
						|
 | 
						|
Command Structure
 | 
						|
-----------------
 | 
						|
 | 
						|
OpenStackClient has a consistent and predictable format for all of its commands.
 | 
						|
 | 
						|
* The top level command name is ``openstack``
 | 
						|
* Sub-commands take the form:
 | 
						|
 | 
						|
.. code-block:: bash
 | 
						|
 | 
						|
    openstack [<global-options>] <object-1> <action> [<object-2>] [<command-arguments>]
 | 
						|
 | 
						|
Subcommands shall have three distinct parts to its commands (in order that they appear):
 | 
						|
 | 
						|
* global options
 | 
						|
* command object(s) and action
 | 
						|
* command options and arguments
 | 
						|
 | 
						|
Output formats:
 | 
						|
 | 
						|
* user-friendly tables with headers, etc
 | 
						|
* machine-parsable delimited
 | 
						|
 | 
						|
.. note::
 | 
						|
 | 
						|
   A note on terminology. An **argument** is a positional parameter to the
 | 
						|
   command. As discussed later, these should be used sparingly in
 | 
						|
   OpenStackClient. An **option** - also known as a **flag** - is a named
 | 
						|
   parameter denoted with either a hyphen and a single-letter name (``-r``) or
 | 
						|
   a double hyphen and a multiple-letter name (``--recursive``). They may or
 | 
						|
   may not also include a user-specified value (``--file foo.txt`` or
 | 
						|
   ``--file=foo.txt``).
 | 
						|
 | 
						|
   For more information on this topic and CLIs in general, refer to the
 | 
						|
   excellent `Command Line Interface Guidelines website`__.
 | 
						|
 | 
						|
   .. __: https://clig.dev/#arguments-and-flags
 | 
						|
 | 
						|
Global Options
 | 
						|
~~~~~~~~~~~~~~
 | 
						|
 | 
						|
Global options are global in the sense that they apply to every command
 | 
						|
invocation regardless of action to be performed.  They include authentication
 | 
						|
credentials and API version selection.  Most global options have a corresponding
 | 
						|
environment variable that may also be used to set the value.  If both are present,
 | 
						|
the command-line option takes priority.  The environment variable names are derived
 | 
						|
from the option name by dropping the leading dashes (``--``), converting each embedded
 | 
						|
dash (``-``) to an underscore (``_``), and converting to upper case.
 | 
						|
 | 
						|
* Global options shall always have a long option name, certain common options may
 | 
						|
  also have short names.  Short names should be reserved for global options to limit
 | 
						|
  the potential for duplication and multiple meanings between commands given the
 | 
						|
  limited set of available short names.
 | 
						|
 | 
						|
* All long options names shall begin with two dashes (``--``) and use a single dash
 | 
						|
  (``-``) internally between words (``--like-this``).  Underscores (``_``) shall not
 | 
						|
  be used in option names.
 | 
						|
 | 
						|
* Authentication options conform to the common CLI authentication guidelines in
 | 
						|
  :ref:`authentication`.
 | 
						|
 | 
						|
For example, ``--os-username`` can be set from the environment via
 | 
						|
``OS_USERNAME``.
 | 
						|
 | 
						|
``--help``
 | 
						|
++++++++++
 | 
						|
 | 
						|
The standard ``--help`` global option displays the documentation for invoking
 | 
						|
the program and a list of the available commands on standard output.  All other
 | 
						|
options and commands are ignored when this is present.  The traditional short
 | 
						|
form help option (``-h``) is also available.
 | 
						|
 | 
						|
``--version``
 | 
						|
+++++++++++++
 | 
						|
 | 
						|
The standard ``--version`` option displays the name and version on standard
 | 
						|
output.  All other options and commands are ignored when this is present.
 | 
						|
 | 
						|
Objects and Actions
 | 
						|
~~~~~~~~~~~~~~~~~~~
 | 
						|
 | 
						|
Commands consist of an object, described by one or more words, followed by an
 | 
						|
action. ::
 | 
						|
 | 
						|
    <object> <action>
 | 
						|
 | 
						|
For example:
 | 
						|
 | 
						|
* ``group create``
 | 
						|
* ``server set``
 | 
						|
* ``volume type list``
 | 
						|
 | 
						|
(note that ``volume type`` is a two-word single object)
 | 
						|
 | 
						|
Some commands require two objects. These commands have the primary object ahead of the
 | 
						|
action and the secondary object after the action. In badly formed English it is
 | 
						|
expressed as "(Take) object-1 (and perform) action (using) object-2 (to it)." ::
 | 
						|
 | 
						|
    <object-1> <action> <object-2>
 | 
						|
 | 
						|
For example:
 | 
						|
 | 
						|
* ``group add user``
 | 
						|
* ``aggregate add host``
 | 
						|
* ``image remove project``
 | 
						|
 | 
						|
Object names are always specified in command in their singular form.  This is
 | 
						|
contrary to natural language use.
 | 
						|
 | 
						|
``help``
 | 
						|
++++++++
 | 
						|
 | 
						|
The ``help`` command is unique as it appears in front of a normal command
 | 
						|
and displays the help text for that command rather than execute it.
 | 
						|
 | 
						|
Arguments
 | 
						|
~~~~~~~~~
 | 
						|
 | 
						|
Commands that interact with a specific instance of an object should accept a
 | 
						|
single argument. This argument should be a name or identifier for the object.
 | 
						|
::
 | 
						|
 | 
						|
    <object> <action> [<name-or-id>]
 | 
						|
 | 
						|
For example:
 | 
						|
 | 
						|
* ``group create <group>``
 | 
						|
* ``server set <server>``
 | 
						|
 | 
						|
(note that ``volume type`` is a two-word single object)
 | 
						|
 | 
						|
For commands that require two objects, the commands should accept two
 | 
						|
arguments when interacting with specific instances of the two objects. These
 | 
						|
arguments should appear in the same order as the objects. ::
 | 
						|
 | 
						|
    <object-1> <action> <object-2> [<object-1-name-or-id> <object-2-name-or-id>]
 | 
						|
 | 
						|
For example:
 | 
						|
 | 
						|
* ``group add user <group> <user>``
 | 
						|
* ``aggregate add host <aggregate> <host>``
 | 
						|
* ``image remove project <image> <project>``
 | 
						|
 | 
						|
Options
 | 
						|
~~~~~~~
 | 
						|
 | 
						|
Each command may have its own set of options distinct from the global options.
 | 
						|
They follow the same style as the global options and always appear between
 | 
						|
the command and any arguments the command requires.
 | 
						|
 | 
						|
Command options should only have long names. The small range of available short
 | 
						|
names makes it hard for a single short option name to have a consistent meaning
 | 
						|
across multiple commands.
 | 
						|
 | 
						|
Option Forms
 | 
						|
++++++++++++
 | 
						|
 | 
						|
* **datetime**: Datetime options shall accept a value in `ISO-8061`__ format.
 | 
						|
  For example, you can list servers last modified before a given date using
 | 
						|
  ``--changes-before``. ::
 | 
						|
 | 
						|
      server list --changes-before 2020-01-01T12:30:00+00:00
 | 
						|
 | 
						|
* **list**: List options shall be passed via multiple options rather than as
 | 
						|
  a single delimited option. For example, you can set multiple properties on a
 | 
						|
  compute flavor using multiple ``--property`` options. ::
 | 
						|
 | 
						|
      flavor set --property quota:read_bytes_sec=10240000 \
 | 
						|
          --property quota:write_bytes_sec=10240000 \
 | 
						|
          <flavor>
 | 
						|
 | 
						|
* **boolean**: Boolean options shall use a form of ``--<true>|--<false>``
 | 
						|
  (preferred) or ``--<option>|--no-<option>``. These must be mutually
 | 
						|
  exclusive and should be adjective rather than verbs. For example, the
 | 
						|
  ``enabled`` state of a project is set with ``--enable|--disable``. ::
 | 
						|
 | 
						|
      project set --enable <project>
 | 
						|
 | 
						|
.. __: https://en.wikipedia.org/wiki/ISO_8601
 | 
						|
 | 
						|
Command Output
 | 
						|
--------------
 | 
						|
 | 
						|
The default command output is pretty-printed using the Python
 | 
						|
``prettytable`` module.
 | 
						|
 | 
						|
Machine-parsable output format may be specified with the ``--format``
 | 
						|
option to ``list`` and ``show`` commands.  ``list`` commands
 | 
						|
have an option (``--format csv``) for CSV output and ``show`` commands
 | 
						|
have an option (``--format shell``) for the shell variable assignment
 | 
						|
syntax of ``var="value"``.  In both cases, all data fields are quoted with ``"``
 | 
						|
 | 
						|
Help Commands
 | 
						|
-------------
 | 
						|
 | 
						|
The help system is considered separately due to its special status
 | 
						|
among the commands.  Rather than performing tasks against a system, it
 | 
						|
provides information about the commands available to perform those
 | 
						|
tasks.  The format of the ``help`` command therefore varies from the
 | 
						|
form for other commands in that the ``help`` command appears in front
 | 
						|
of the first object in the command.
 | 
						|
 | 
						|
The options ``--help`` and ``-h`` display the global options and a
 | 
						|
list of the supported commands.  Note that the commands shown depend on the API
 | 
						|
versions that are in effect; i.e. if ``--os-identity-api-version=3`` is
 | 
						|
present Identity API v3 commands are shown.
 | 
						|
 | 
						|
 | 
						|
Common Actions
 | 
						|
==============
 | 
						|
 | 
						|
There are a number of common actions or patterns in use across OpenStackClient.
 | 
						|
When adding new commands, they should aim to match one of these action formats.
 | 
						|
 | 
						|
``create``
 | 
						|
----------
 | 
						|
 | 
						|
``create`` will create a new instance of ``<object>``. Only a name should be
 | 
						|
accepted as an argument. All other required and optional information
 | 
						|
should be provided as options. If a name is not required, it can be marked as
 | 
						|
optional. If it is not possible to specify a name when creating a new instance,
 | 
						|
no arguments should be accepted. ::
 | 
						|
 | 
						|
    <object> create <name>
 | 
						|
 | 
						|
For example:
 | 
						|
 | 
						|
* ``flavor create <name>`` (compute flavors require a name)
 | 
						|
* ``volume create [<name>] ...`` (block storage volumes don't *need* names)
 | 
						|
* ``consumer create ...`` (identity consumers don't have names)
 | 
						|
* ``container create --public <name>`` (additional information should be
 | 
						|
  provided as options)
 | 
						|
 | 
						|
``show``
 | 
						|
--------
 | 
						|
 | 
						|
``show`` will fetch a single instance of ``object``. Only a name or identifier
 | 
						|
should be accepted as a argument. Any filters or additional information should
 | 
						|
be provided as options. Where names are not unique or an instance is not found,
 | 
						|
an error must be shown so the user can try again using a unique or valid ID,
 | 
						|
respectively. ::
 | 
						|
 | 
						|
    <object> show <name-or-id>
 | 
						|
 | 
						|
For example:
 | 
						|
 | 
						|
* ``server show <name-or-id>`` (compute servers have names or IDs and can be
 | 
						|
  referenced by both)
 | 
						|
* ``consumer show <id>``  (identity consumers only have IDs, not names)
 | 
						|
* ``server show --topology <name-or-id>`` (additional information should be
 | 
						|
  provided as options)
 | 
						|
 | 
						|
``list``
 | 
						|
--------
 | 
						|
 | 
						|
``list`` will list multiple instances of ``object``. No arguments should be
 | 
						|
accepted. Any filters or pagination requests should be requested via option
 | 
						|
arguments. ::
 | 
						|
 | 
						|
    <object> list
 | 
						|
 | 
						|
For example:
 | 
						|
 | 
						|
* ``image list`` (no arguments should be accepted)
 | 
						|
* ``server list --status ACTIVE`` (filters should be provided as option
 | 
						|
  arguments)
 | 
						|
 | 
						|
``delete``
 | 
						|
----------
 | 
						|
 | 
						|
``delete`` will delete one or more instances of ``object``. Where possible,
 | 
						|
this command should handle deleting instances of ``object`` by either name or
 | 
						|
ID. Where names are not unique or an instance is not found, the command should
 | 
						|
continue deleting any other instances requested before returning an error
 | 
						|
indicating the instances that failed to delete. ::
 | 
						|
 | 
						|
    <object> delete <name-or-id> [<name-or-id> ...]
 | 
						|
 | 
						|
For example:
 | 
						|
 | 
						|
* ``network delete <name-or-id>``
 | 
						|
* ``region delete <name-or-id>``
 | 
						|
 | 
						|
``set``, ``unset``
 | 
						|
------------------
 | 
						|
 | 
						|
``set`` and ``unset`` will add or remove one or more attributes of an instance
 | 
						|
of ``object``, respectively. Only a name or identifier should be accepted as a
 | 
						|
argument. All other information should be provided as option
 | 
						|
arguments. Where names are not unique or an instance is not found, an error
 | 
						|
must be shown so the user can try again using a unique or valid ID,
 | 
						|
respectively. This command may result in multiple API calls but it must not
 | 
						|
result in the creation or modification of child object. ::
 | 
						|
 | 
						|
    <object> set <name-or-id>
 | 
						|
 | 
						|
For example:
 | 
						|
 | 
						|
* ``network set <name-or-id>``
 | 
						|
* ``floating ip unset --port <port> <name-or-id>`` (additional information
 | 
						|
  should be provided as options)
 | 
						|
 | 
						|
``add``, ``remove``
 | 
						|
-------------------
 | 
						|
 | 
						|
``add`` and ``remove`` will associate or disassociate a child object with a
 | 
						|
parent object. Only a name or identifier for both parent and child objects
 | 
						|
should be accepted as arguments. All other information should be provided as
 | 
						|
options. Where names are not unique or an instance is not found, an error must
 | 
						|
be shown so the user can try again using a unique or valid ID, respectively. ::
 | 
						|
 | 
						|
    <parent-object> add <child-object> <parent-name-or-id> <child-name-or-id>
 | 
						|
    <parent-object> remove <child-object> <parent-name-or-id> <child-name-or-id>
 | 
						|
 | 
						|
For example:
 | 
						|
 | 
						|
* ``aggregate add host <aggregate-name-or-id> <host>``
 | 
						|
* ``consistency group add volume <consistency-group-name-or-id> <volume-name-or-id>``
 | 
						|
 | 
						|
Other actions
 | 
						|
-------------
 | 
						|
 | 
						|
There are other actions that do not fit neatly into any of the above actions.
 | 
						|
Typically, these are used where an action would create a child object but that
 | 
						|
child object is only exposed as part of the parent object. They are also used
 | 
						|
where fitting the action into one of the above actions, particularly ``set``,
 | 
						|
would be deemed to be confusing or otherwise inappropriate. These are permitted
 | 
						|
once this has been discussed among reviewers and context provided in either the
 | 
						|
commit message or via comments in the code.
 | 
						|
 | 
						|
For example:
 | 
						|
 | 
						|
* ``server ssh`` (this would not naturally fit into any of the other actions)
 | 
						|
* ``server migrate`` (this results in the creation of a server migration record
 | 
						|
  and could be implemented as ``server migration create`` but this feels
 | 
						|
  unnatural)
 | 
						|
* ``server migration confirm`` (this could be implemented as ``server migration
 | 
						|
  set --confirm`` but this feels unnatural)
 | 
						|
* ``volume backup record export`` (this could be implemented as ``volume backup
 | 
						|
  record show --exportable`` but this feels unnatural)
 | 
						|
 | 
						|
.. note::
 | 
						|
 | 
						|
    The guidelines below are best practices but exceptions do exist in
 | 
						|
    OpenStackClient and in various plugins. Where possible, these exceptions
 | 
						|
    should be addressed over time.
 | 
						|
 | 
						|
 | 
						|
API versioning
 | 
						|
==============
 | 
						|
 | 
						|
OpenStackClient will strive to behave sensibly for services that version their
 | 
						|
API. The API versioning schemes in use vary between services and have evolved
 | 
						|
since the early days of OpenStack. There are two types of API versioning to
 | 
						|
consider: the major version and the minor version. Today, most OpenStack
 | 
						|
services have settled on a single major API version and have chosen to evolve
 | 
						|
the API without bumping the major API version any further. There are three API
 | 
						|
"minor" versioning schemes in common use.
 | 
						|
 | 
						|
.. rubric:: Per-release versions
 | 
						|
 | 
						|
This is used by the Image service (glance). All changes to the API during a
 | 
						|
given release cycle are gathered into a single new API version. As such, the
 | 
						|
API version will increase at most once per release. You can continue to request
 | 
						|
older versions.
 | 
						|
 | 
						|
Example:
 | 
						|
 | 
						|
.. list-table:: Image (glance) API versions per release
 | 
						|
 | 
						|
   * - Release
 | 
						|
     - Supported 2.x API versions
 | 
						|
 | 
						|
   * - Grizzly
 | 
						|
     - 2.0 - 2.1
 | 
						|
 | 
						|
   * - Havana
 | 
						|
     - 2.0 - 2.2
 | 
						|
 | 
						|
   * - Kilo
 | 
						|
     - 2.0 - 2.3
 | 
						|
 | 
						|
   * - ...
 | 
						|
     - ...
 | 
						|
 | 
						|
.. rubric:: Microversions
 | 
						|
 | 
						|
This is used by multiple services including the Compute service (nova), Block
 | 
						|
Storage service (cinder), and Shared Filesystem service (manila). Each change
 | 
						|
to the API will result in a new API version. As such, the API version can
 | 
						|
increase multiple times per release. You can continue to request older
 | 
						|
versions.
 | 
						|
 | 
						|
Example:
 | 
						|
 | 
						|
.. list-table:: Compute (nova) API versions per release
 | 
						|
 | 
						|
   * - Release
 | 
						|
     - Supported 2.x API versions
 | 
						|
 | 
						|
   * - Kilo
 | 
						|
     - 2.1 - 2.3
 | 
						|
 | 
						|
   * - Liberty
 | 
						|
     - 2.1 - 2.12
 | 
						|
 | 
						|
   * - Mitaka
 | 
						|
     - 2.1 - 2.25
 | 
						|
 | 
						|
   * - ...
 | 
						|
     - ...
 | 
						|
 | 
						|
.. rubric:: Extensions
 | 
						|
 | 
						|
This is used by the Networking service (neutron). It's a versioning scheme that
 | 
						|
doesn't use API versions. Instead, it exposes a list of available extensions.
 | 
						|
An extension can add, remove or modify features and vendor-specific
 | 
						|
functionality to the API. This can include API resources/routes as well as new
 | 
						|
fields in API requests and responses. If you want to depend on a feature added
 | 
						|
by an extension, you should check if the extension is present.
 | 
						|
 | 
						|
Major API version support
 | 
						|
-------------------------
 | 
						|
 | 
						|
Major API version support has become less important over time as the various
 | 
						|
OpenStack services have chosen to focus on the "minor" versioning mechanisms
 | 
						|
described above. However, OpenStackClient aims to support **all** OpenStack
 | 
						|
clouds, not just those running the most recent OpenStack release. This means it
 | 
						|
must aim to support older major API versions that have since been removed from
 | 
						|
the services in question. For example, the Volume service's (cinder) v2 API was
 | 
						|
deprecated in cinder 11.0.0 (Pike) and was removed in cinder 19.0.0 (Xena),
 | 
						|
however, OpenStackClient continues to support this API since not all OpenStack
 | 
						|
deployments have updated or will update to Xena or later. This should remain
 | 
						|
the case for as long as this support is technically feasible.
 | 
						|
 | 
						|
.. note::
 | 
						|
 | 
						|
    While OpenStackClient will continue to support existing command
 | 
						|
    implementations for older APIs, there is no requirement to add **new**
 | 
						|
    commands that implement support for deprecated or removed APIs.
 | 
						|
 | 
						|
OpenStackClient provides different command implementations depending on the API
 | 
						|
version used. On startup, OpenStackClient will attempt to identify the API
 | 
						|
version using the service catalog. Where a service provides multiple API major
 | 
						|
versions, OpenStackClient defaults to the latest one. This can be configured by
 | 
						|
the user using options (``--os-{service}-api-version``), environment variables
 | 
						|
(``OS_{service}_API_VERSION``) or configuration in the ``clouds.yaml`` file.
 | 
						|
 | 
						|
Minor API version and extension support
 | 
						|
---------------------------------------
 | 
						|
 | 
						|
As most services implement some form of versioning and use this to both add new
 | 
						|
functionality and to modify or remove existing functionality, it is imperative
 | 
						|
that OpenStackClient provides a mechanism to configure the API version used.
 | 
						|
Unlike major API versions, support for API microversions or API extensions is
 | 
						|
implemented via logic in the command itself. OpenStackClient commands should
 | 
						|
indicate the minimum or maximum API microversion or the API extension required
 | 
						|
for given actions and options in the help string for same. Where a user
 | 
						|
attempts to use a feature that requires a particular microversion or extension
 | 
						|
that the service does not support, OpenStackClient should fail with an error
 | 
						|
message describing these requirements. Like API versions, the requested can be
 | 
						|
configured by the user using options (``--os-{service}-api-version``),
 | 
						|
environment variables (``OS_{service}_API_VERSION``) or configuration in
 | 
						|
``clouds.yaml`` file.
 | 
						|
 | 
						|
.. important::
 | 
						|
 | 
						|
   Historically, OpenStackClient has defaulted to the lowest supported
 | 
						|
   microversion for each service. This was not by design but rather a side
 | 
						|
   effect of relying on legacy clients who implement this behavior.
 | 
						|
   openstacksdk does not implement this behavior and instead auto-negotiates a
 | 
						|
   version based on the versions that SDK knows about. For now, this means we
 | 
						|
   have some commands that require explicit microversion configuration to get
 | 
						|
   the latest and greatest behavior, while others will handle this
 | 
						|
   transparently. For humans, this should not matter. For scripts, which are
 | 
						|
   more fragile, it is recommended that an explicit microversion is always
 | 
						|
   requested.
 | 
						|
 | 
						|
 | 
						|
Examples
 | 
						|
========
 | 
						|
 | 
						|
The following examples depict common command and output formats expected to be
 | 
						|
produces by the OpenStackClient.
 | 
						|
 | 
						|
Authentication
 | 
						|
--------------
 | 
						|
 | 
						|
Using global options:
 | 
						|
 | 
						|
.. code-block:: bash
 | 
						|
 | 
						|
    $ openstack --os-tenant-name ExampleCo --os-username demo --os-password secret --os-auth-url http://localhost:5000:/v2.0 server show appweb01
 | 
						|
    +------------------------+-----------------------------------------------------+
 | 
						|
    |        Property        |                Value                                |
 | 
						|
    +------------------------+-----------------------------------------------------+
 | 
						|
    | OS-DCF:diskConfig      | MANUAL                                              |
 | 
						|
    | OS-EXT-STS:power_state | 1                                                   |
 | 
						|
    | flavor                 | m1.small                                            |
 | 
						|
    | id                     | dcbc2185-ba17-4f81-95a9-c3fae9b2b042                |
 | 
						|
    | image                  | Ubuntu 12.04 (754c231e-ade2-458c-9f91-c8df107ff7ef) |
 | 
						|
    | keyname                | demo-key                                            |
 | 
						|
    | name                   | appweb01                                            |
 | 
						|
    | private_address        | 10.4.128.13                                         |
 | 
						|
    | status                 | ACTIVE                                              |
 | 
						|
    | user                   | demo                                                |
 | 
						|
    +------------------------+-----------------------------------------------------+
 | 
						|
 | 
						|
Using environment variables:
 | 
						|
 | 
						|
.. code-block:: bash
 | 
						|
 | 
						|
    $ export OS_TENANT_NAME=ExampleCo
 | 
						|
    $ export OS_USERNAME=demo
 | 
						|
    $ export OS_PASSWORD=secret
 | 
						|
    $ export OS_AUTH_URL=http://localhost:5000:/v2.0
 | 
						|
    $ openstack server show appweb01
 | 
						|
    +------------------------+-----------------------------------------------------+
 | 
						|
    |        Property        |                Value                                |
 | 
						|
    +------------------------+-----------------------------------------------------+
 | 
						|
    | OS-DCF:diskConfig      | MANUAL                                              |
 | 
						|
    | OS-EXT-STS:power_state | 1                                                   |
 | 
						|
    | flavor                 | m1.small                                            |
 | 
						|
    | id                     | dcbc2185-ba17-4f81-95a9-c3fae9b2b042                |
 | 
						|
    | image                  | Ubuntu 12.04 (754c231e-ade2-458c-9f91-c8df107ff7ef) |
 | 
						|
    | keyname                | demo-key                                            |
 | 
						|
    | name                   | appweb01                                            |
 | 
						|
    | private_address        | 10.4.128.13                                         |
 | 
						|
    | status                 | ACTIVE                                              |
 | 
						|
    | user                   | demo                                                |
 | 
						|
    +------------------------+-----------------------------------------------------+
 | 
						|
 | 
						|
Machine Output Format
 | 
						|
---------------------
 | 
						|
 | 
						|
Using the CSV output format with a list command:
 | 
						|
 | 
						|
.. code-block:: bash
 | 
						|
 | 
						|
    $ openstack server list --format csv
 | 
						|
    "ID","Name","Status","Private_Address"
 | 
						|
    "ead97d84-6988-47fc-9637-3564fc36bc4b","appweb01","ACTIVE","10.4.128.13"
 | 
						|
 | 
						|
Using the show command options of  shell output format and adding a prefix of
 | 
						|
``my_`` to avoid collisions with existing environment variables:
 | 
						|
 | 
						|
.. code-block:: bash
 | 
						|
 | 
						|
    $ openstack server show --format shell --prefix my_ appweb01
 | 
						|
    my_OS-DCF:diskConfig="MANUAL"
 | 
						|
    my_OS-EXT-STS:power_state="1"
 | 
						|
    my_flavor="m1.small"
 | 
						|
    my_id="dcbc2185-ba17-4f81-95a9-c3fae9b2b042"
 | 
						|
    my_image="Ubuntu 12.04 (754c231e-ade2-458c-9f91-c8df107ff7ef)"
 | 
						|
    my_keyname="demo-key"
 | 
						|
    my_name="appweb01"
 | 
						|
    my_private_address="10.4.128.13"
 | 
						|
    my_status="ACTIVE"
 | 
						|
    my_user="demo"
 |