diff options
author | Zuul <zuul@review.opendev.org> | 2022-12-05 12:29:58 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2022-12-05 12:29:58 +0000 |
commit | 65484b5a284db5e535ce447923c59fbc443bad32 (patch) | |
tree | 44f583ad9affd9434571bebfd8f14e05660accb0 | |
parent | 10453e085f050c497c37b95e0c67d71df8633a2f (diff) | |
parent | bb5b2904780835f6b7bdbf1affa2238c8ab7d51d (diff) | |
download | python-openstackclient-65484b5a284db5e535ce447923c59fbc443bad32.tar.gz |
Merge "docs: Describe common actions found in OSC"
-rw-r--r-- | doc/source/contributor/humaninterfaceguide.rst | 263 |
1 files changed, 240 insertions, 23 deletions
diff --git a/doc/source/contributor/humaninterfaceguide.rst b/doc/source/contributor/humaninterfaceguide.rst index 0f2624d7..48070e52 100644 --- a/doc/source/contributor/humaninterfaceguide.rst +++ b/doc/source/contributor/humaninterfaceguide.rst @@ -185,6 +185,21 @@ 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 ~~~~~~~~~~~~~~ @@ -225,46 +240,107 @@ form help option (``-h``) is also available. The standard ``--version`` option displays the name and version on standard output. All other options and commands are ignored when this is present. -Command Object(s) and Action -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Objects and Actions +~~~~~~~~~~~~~~~~~~~ -Commands consist of an object described by one or more words followed by an -action. Commands that require two objects have the primary object ahead of the -action and the secondary object after the action. Any positional arguments -identifying the objects shall appear in the same order as the objects. In -badly formed English it is expressed as "(Take) object-1 (and perform) action -(using) object-2 (to it).":: +Commands consist of an object, described by one or more words, followed by an +action. :: - <object-1> <action> [<object-2>] + <object> <action> [<name-or-id>] -Examples: +For example: -* ``group add user <group> <user>`` -* ``volume type list`` (note that ``volume type`` is a two-word single object) +* ``group create`` +* ``server set`` +* ``volume type list`` -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. +(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. -Command Arguments and Options -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +``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 positional arguments the command requires. +the command and any arguments the command requires. -Command options shall 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. +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 ++++++++++++ -* **boolean**: boolean options shall use a form of ``--<true>|--<false>`` - (preferred) or ``--<option>|--no-<option>``. For example, the - ``enabled`` state of a project is set with ``--enable|--disable``. +* **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 -------------- @@ -293,6 +369,147 @@ 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 --toplogy <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. + + Examples ======== |