SaharaClient CLI as an OpenstackClient plugin¶
https://blueprints.launchpad.net/python-saharaclient/+spec/cli-as-openstackclient-plugin
This specification proposes to create SaharaClient CLI as an OpenstackClient plugin.
Problem description¶
Currently SaharaClient CLI has a lot of problems and is not so attractive as wanted to be. It should be refactored or recreated from the start.
Proposed change¶
New SaharaClient CLI will be based on OpenstackClient that brings the command set for different projects APIs together in a single shell with a uniform command structure.
OpenStackClient provides first class support for the several services. The other ones (including Data Processing service) may create an OpenStackClient plugin.
Proposed Objects:
plugin
image
data source
job template
job
job binary
node group template
cluster template
cluster
Proposed Commands:
All commands will have a prefix dataprocessing
.
Arguments in []
are optional, in <>
are positional.
For Plugins:
plugin list [--long]
plugin show <plugin>
plugin configs get <plugin> <version> [--file <filepath>] # default name of
# the file is <plugin>
Detailed description of a plugin contains too much information to display it on the screen. It will be saved in file instead. If provided file exists, data will not be rewritten.
Columns for plugin list
: name, versions.
Columns for plugin list --long
: name, versions, title, description.
Rows for plugin show
: name, versions, title, description.
For Images:
image list [--tags <tag(s)>] [--long]
image show <image>
image register <image> <username> [--description <description>]
image unregister <image(s)>
image tags set <image> <tag(s)>
image tags add <image> <tag(s)>
image tags remove <image> <tag(s)>
tags set
will replace current image tags with provided ones.
tags remove
will support passing all
to tags
argument to remove all
tags.
Columns for image list
: name, id, username, tags.
Columns for image list --long
: name, id, username, tags, status,
description.
Rows for plugin show
: name, id, username, tags, status, description.
For Data Sources:
data source create <name> <type> <url> [--password <password>]
[--username <user>] [--description <description>]
data source list [--type <type>] [--long]
data source show <datasource>
data source delete <datasource(s)>
data source update <datasource> [--name <name>] [--type <type>]
[--url <url>] [--password <password>] [--username <user>]
[--description <description>]
Columns for data source list
: name, id, type.
Columns for data source list --long
: name, id, type, url, description.
Rows for data source show
: name, id, type, url, description.
New CLI behavior in case of Node Group Templates, Cluster Templates and Clusters creation will be pretty much the same as in Horizon, but additionally will allow to create them from json. It doesn’t let to mark some arguments as required for successful creation, but it could be done in help strings.
For Job Binaries: Job Binaries and Job Binary Internals will be combined
job binary create <name> [--data <filepath>] [--description <description>]
[--url <url>] [--username <username>] [--password <password>]
job binary list [--name <name-regex>]
job binary show <job-binary>
job binary update <job-binary> [--description <description>] [--url <url>]
[--username <username>] [--password <password>]
job binary delete <job-binary(ies)>
job binary download <job-binary> [--file <filepath>]
Columns for job binary list
: name, id.
Columns for job binary list --long
: name, id, url, description.
Rows for job binary show
: name, id, url, description.
For Node Group Templates:
node group template create [--name <name>] [--plugin <plugin>]
[--version <version>] [--flavor <flavor>] [--autoconfigs]
[--node-processes <node-processes>] [--floating-ip-pool <pool>]
[--proxy-gateway] [--configs <filepath>] [--json <filepath>]
# and other arguments except of "image-id"
node group template list [--plugin <plugin>] [--version <version>]
[--name <name-regex>] [--long]
node group template show <node-group-template>
node group template configs get <node-group-template> [--file <filepath>]
# default name of the file is <node-group-template>
node group template update <node-group-template> ... [--json <filepath>]
# and other arguments the same as in create command
node group template delete <node-group-template(s)>
Columns for node group template list
: name, id, plugin, version.
Columns for node group template list --long
: name, id, plugin, version,
node-processes, description.
Rows for node group template show
: name, id, plugin, version,
node-processes, availability zone, flavor, is default, is proxy gateway,
security groups or auto security group, if node group template contains
volumes following rows will appear: volumes per node,
volumes local to instance, volumes mount prefix, volumes type,
volumes availability zone, volumes size, description.
For Cluster Templates:
cluster template create [--name <name>] [--description <description>]
[--node-groups <ng1:1,ng2:2>] [--anti-affinity <node-processes>]
[--autoconfigs] [--configs <filepath>] [--json <filepath>]
cluster template list [--plugin <plugin>] [--version <version>]
[--name <name-regex>] [--long]
cluster template configs get <cluster-template> [--file <filepath>]
# default name of the file is <cluster-template>
cluster template show <cluster-template>
cluster template update <cluster-template> ... [--json <filepath>]
# and other arguments the same as in create command
cluster template delete <cluster-template(s)>
Plugin and its version will be taken from node group templates.
Columns for cluster template list
: name, id, plugin, version.
Columns for cluster template list --long
: name, id, plugin, version,
node groups (in format name:count), description.
Rows for cluster template show
: name, id, plugin, version,
node groups, anti affinity, description.
For Clusters:
cluster create [--name <name>] [--cluster-template <cluster-template>]
[--description <description>][--user-keypair <keypair>]
[--image <image>] [--management-network <network>] [--json <filepath>]
[--wait]
cluster scale [] [--wait]
cluster list [--plugin <plugin>] [--version <version>]
[--name <name-regex>] [--long]
cluster show <cluster>
cluster delete <cluster(s)> [--wait]
If [--wait]
attribute is set, CLI will wait for command completion.
Plugin and its version will be taken from cluster template.
Columns for cluster list
: name, id, status.
Columns for cluster list --long
: name, id, url, description.
Rows for cluster show
: name, id, anti affinity, image id, plugin, version,
is transient, status, status_description, user keypair id, description.
For Job Templates (Jobs):
job template create [--name <name>] [--type <type>]
[--main-binary(ies) <mains>] [--libs <libs>] [--description <descr>]
[--interface <filepath>] [--json <filepath>]
job template list [--type <type>] [--name <name-regex>] [--long]
job template show <job-template>
job template delete <job-template>
job template configs get <type> [--file <file>] # default file name <type>
job types list [--plugin <plugin>] [--version <version>] [--type <type>]
[--hints] [--file <filepath>] # default file name depends on provided
# args
job types list
and job template configs get
outputs will be saved in
file just like plugin configs get
.
Columns for job template list
: name, id, type.
Columns for job template list --long
: name, id, type, libs(ids),
mains(ids), description.
Rows for job template show
: name, id, type, libs(ids),
mains(ids), description.
For Jobs (Job Executions):
job execute [--job-template <job-template>] [--cluster <cluster>]
[--input <data-source>] [--output <data-source>] [--args <arg(s)>]
[--params <name1:value1,name2:value2>]
[--configs <name1:value1,name2:value2>]
[--interface <filepath>] [--json <filepath>] [--wait]
job list [--long]
job show <job>
job delete <job(s)> [--wait]
Columns for job list
: id, cluster id, job id, status.
Columns for job list --long
: id, cluster id, job id, status, start time,
end time
Rows for job show
: id, cluster id, job id, status, start time,
end time, input id, output id
If [--wait]
attribute is set, CLI will wait for command completion.
Besides this, there are a bunch of arguments provided by OpenstackClient, that
depends on chosen command plugin.
For example, there is a help output for plugin list
command:
(openstack) help dataprocessing plugin list
usage: dataprocessing plugin list [-h] [-f {csv,html,json,table,value,
yaml}]
[-c COLUMN] [--max-width <integer>]
[--quote {all,minimal,none,nonnumeric}]
[--long]
Lists plugins
optional arguments:
-h, --help show this help message and exit
--long List additional fields in output
output formatters:
output formatter options
-f {csv,html,json,table,value,yaml}, --format {csv,html,json,table,value,
yaml}
the output format, defaults to table
-c COLUMN, --column COLUMN
specify the column(s) to include, can be repeated
table formatter:
--max-width <integer>
Maximum display width, 0 to disable
CSV Formatter:
--quote {all,minimal,none,nonnumeric}
when to include quotes, defaults to nonnumeric
Alternatives¶
Current CLI code can be refactored.
Data model impact¶
None
REST API impact¶
None
Other end user impact¶
None
Deployer impact¶
None
Developer impact¶
None
Sahara-image-elements impact¶
None
Sahara-dashboard / Horizon impact¶
None
Implementation¶
Assignee(s)¶
- Primary assignee:
apavlov-n
Work Items¶
Creating OpenstackClient plugin for SaharaClient
Commands implementation for each object, described in “Proposed change” section
Updating documentation with corresponding changes
Old CLI will be deprecated and removed after some time
Dependencies¶
None
Testing¶
Every command will be provided with unit tests.
Documentation Impact¶
Documentation about new CLI usage will be written.
References¶
OpenstackClient documentation about using Plugins OpenstackClient documentation about Objects and Actions naming