Configuration
Certain aspects of the TUI can be configured using configuration file.
Config file can be in the yaml or json format and placed under
XDG_CONFIG_HOME/openstack_tui named as config.yaml or views.yaml.
It is possible to split configuration parts into dediated files (i.e.
views.yaml for configuring views). Files are merged in no particular order
(in difference to the clouds.yaml/secure.yaml) so it is not possible to
predict the behavior when configuration option is being set in different files
with different value.
Default config
---
# Mode keybindings in the following form
# <Mode> or "Resource(<service>.<resource>)" for migrated resource views:
# <shortcut>:
# action: <ACTION TO PERFORM>
# description: <DESCRIPTION USED IN TUI>
mode_keybindings:
Home: {}
# Block Storage views
"Resource(block_storage.backup)":
"y":
action: DescribeApiResponse
description: YAML
"Resource(block_storage.snapshot)":
"y":
action: DescribeApiResponse
description: YAML
"Resource(block_storage.volume)":
"y":
action: DescribeApiResponse
description: YAML
"ctrl-d":
action:
ResourceOp:
key: "block_storage.volume"
op: Delete
description: Delete
# Compute views
"Resource(compute.aggregate)":
"y":
action: DescribeApiResponse
description: YAML
"Resource(compute.server)":
"y":
action: DescribeApiResponse
description: YAML
"0":
action:
SetComputeServerListFilters: {}
description: Default filters
type: Filter
"1":
action:
SetComputeServerListFilters: {"all_tenants": "true"}
description: All tenants (admin)
type: Filter
"ctrl-d":
action:
ResourceOp:
key: "compute.server"
op: Delete
description: Delete
"c":
action: ShowServerConsoleOutput
description: Console output
"a":
action:
ShowResource: "compute.server/instance_action"
description: Instance actions
"Resource(compute.server/instance_action)":
"y":
action: DescribeApiResponse
description: YAML
"e":
action:
ShowResource: "compute.server/instance_action/event"
description: Events
"Resource(compute.flavor)":
"y":
action: DescribeApiResponse
description: YAML
"s":
action:
ShowResource: "compute.server"
description: Servers
"Resource(compute.hypervisor)":
"y":
action: DescribeApiResponse
description: YAML
# DNS views
"Resource(dns.recordset)":
"y":
action: DescribeApiResponse
description: YAML
"0":
action:
SetDnsRecordsetListFilters: {}
description: Default filters
type: Filter
"Resource(dns.zone)":
"y":
action: DescribeApiResponse
description: YAML
"<enter>":
action:
ShowResource: "dns.recordset"
description: Recordsets
"ctrl-d":
action:
ResourceOp:
key: "dns.zone"
op: Delete
description: Delete
# Identity views
"Resource(identity.user/application_credential)":
"y":
action: DescribeApiResponse
description: YAML
"Resource(identity.group)":
"y":
action: DescribeApiResponse
description: YAML
"u":
action:
ShowResource: "identity.group_user"
description: Group users
"d":
action:
ResourceOp:
key: "identity.group"
op: Delete
description: Delete
"a":
action: IdentityGroupCreate
description: Create new group (todo!)
"Resource(identity.group_user)":
"y":
action: DescribeApiResponse
description: YAML
"a":
action: IdentityGroupUserAdd
description: Add new user into group (todo!)
"r":
action: IdentityGroupUserRemove
description: Remove user from group (todo!)
"Resource(identity.project)":
"y":
action: DescribeApiResponse
description: YAML
"s":
action: SwitchToProject
description: Switch to project
"Resource(identity.user)":
"y":
action: DescribeApiResponse
description: YAML
"ctrl-d":
action:
IdentityUserOp:
key: "identity.user"
op: Delete
description: Delete
"e":
action:
IdentityUserOp:
key: "identity.user"
op: FlipEnable
description: Enable/Disable user
"a":
action: IdentityUserCreate
description: Create new user (todo!)
"p":
action: IdentityUserSetPassword
description: Set user password (todo!)
"c":
action:
ShowResource: "identity.user/application_credential"
description: Application credentials
# Image views
"Resource(image.image)":
"y":
action: DescribeApiResponse
description: YAML
"0":
action:
SetImageListFilters: {}
description: Default filters
type: Filter
"1":
action:
SetImageListFilters: {"visibility": "public"}
description: public
type: Filter
"2":
action:
SetImageListFilters: {"visibility": "shared"}
description: shared
type: Filter
"3":
action:
SetImageListFilters: {"visibility": "private"}
description: private
type: Filter
"ctrl-d":
action:
ResourceOp:
key: "image.image"
op: Delete
description: Delete
# LoadBalancer views
"Resource(load-balancer.loadbalancer)":
"y":
action: DescribeApiResponse
description: YAML
"l":
action:
ShowResource: "load-balancer.listener"
description: Listeners
"p":
action:
ShowResource: "load-balancer.pool"
description: Pools
"Resource(load-balancer.listener)":
"y":
action: DescribeApiResponse
description: YAML
"Resource(load-balancer.pool)":
"y":
action: DescribeApiResponse
description: YAML
"<enter>":
action:
ShowResource: "load-balancer.pool/member"
description: Members
"h":
action:
ShowResource: "load-balancer.healthmonitor"
description: HealthMonitors
"Resource(load-balancer.pool/member)":
"y":
action: DescribeApiResponse
description: YAML
"Resource(load-balancer.healthmonitor)":
"y":
action: DescribeApiResponse
description: YAML
# Network views
"Resource(network.network)":
"y":
action: DescribeApiResponse
description: YAML
"<enter>":
action:
ShowResource: "network.subnet"
description: Subnets
"Resource(network.router)":
"y":
action: DescribeApiResponse
description: YAML
"Resource(network.subnet)":
"y":
action: DescribeApiResponse
description: YAML
"0":
action:
SetNetworkSubnetListFilters: {}
description: All
type: Filter
"Resource(network.security_group)":
"y":
action: DescribeApiResponse
description: YAML
"<enter>":
action:
ShowResource: "network.security_group_rule"
description: Rules
"ctrl-n":
action:
ResourceOp:
key: "network.security_group"
op: Create
description: Create
"ctrl-e":
action:
ResourceOp:
key: "network.security_group"
op: Update
description: Edit
"ctrl-d":
action:
ResourceOp:
key: "network.security_group"
op: Delete
description: Delete
"Resource(network.security_group_rule)":
"y":
action: DescribeApiResponse
description: YAML
"0":
action:
SetNetworkSecurityGroupRuleListFilters: {}
description: All
type: Filter
"ctrl-n":
action:
ResourceOp:
key: "network.security_group_rule"
op: Create
description: Create
"ctrl-d":
action:
ResourceOp:
key: "network.security_group_rule"
op: Delete
description: Delete
# Global keybindings
# <KEYBINDING>:
# action: <ACTION>
# description: <TEXT>
global_keybindings:
"<q>":
action: Quit
description: Quit
"<Ctrl-c>":
action: Quit
description: Quit
"<Ctrl-z>":
action: Suspend
description: Suspend
"F1":
action:
Mode:
mode: Home
stack: false
description: Home
"F2":
action: CloudSelect
description: Select cloud
":":
action: ApiRequestSelect
description: Select resource
"<F4>":
action: SelectProject
description: Select project
"<F5>":
action: SelectRegion
description: Select region
"<ctrl-r>":
action: Refresh
description: Reload data
# Mode aliases
# <ALIAS>: <MODE>
mode_aliases:
"aggregates (compute)": "Resource(compute.aggregate)"
"application credentials (identity)": "Resource(identity.user/application_credential)"
"backups": "Resource(block_storage.backup)"
"flavors": "Resource(compute.flavor)"
"groups (identity)": "Resource(identity.group)"
"host-aggregates (compute)": "Resource(compute.aggregate)"
"hypervisors (compute)": "Resource(compute.hypervisor)"
"images": "Resource(image.image)"
"loadbalancers": "Resource(load-balancer.loadbalancer)"
"lb (loadbalancers)": "Resource(load-balancer.loadbalancer)"
"listeners (loadbalancer)": "Resource(load-balancer.listener)"
"lbl (loadbalancer listeners)": "Resource(load-balancer.listener)"
"pool (loadbalancer)": "Resource(load-balancer.pool)"
"lbp (loadbalancer pools)": "Resource(load-balancer.pool)"
"healthmonitors (loadbalancer)": "Resource(load-balancer.healthmonitor)"
"lbhm (loadbalancer health monitors)": "Resource(load-balancer.healthmonitor)"
"nets": "Resource(network.network)"
"networks": "Resource(network.network)"
"projects": "Resource(identity.project)"
"recordsets (dns)": "Resource(dns.recordset)"
"routers": "Resource(network.router)"
"security groups (network)": "Resource(network.security_group)"
"security group rules (network)": "Resource(network.security_group_rule)"
"servers": "Resource(compute.server)"
"sg": "Resource(network.security_group)"
"sgr": "Resource(network.security_group_rule)"
"snapshots": "Resource(block_storage.snapshot)"
"subnets (network)": "Resource(network.subnet)"
"volumes": "Resource(block_storage.volume)"
"users": "Resource(identity.user)"
"zones (dns)": "Resource(dns.zone)"
# View output
# <RESOURCE_KEY>:
# fields: <ARRAY OF COLUMNS TO SHOW>
views:
# Block Storage
block_storage.backup:
default_fields: [id, name, az, size, status, created_at]
block_storage.snapshot:
default_fields: [id, name, status, created_at]
block_storage.volume:
default_fields: [id, name, az, size, status, updated_at]
# compute
compute.aggregate:
default_fields: [name, uuid, az, updated_at]
compute.flavor:
default_fields: [id, name, vcpus, ram, disk, swap]
compute.hypervisor:
default_fields: [ip, hostname, status, state]
status_field: status
compute.server/instance_action/event:
default_fields: [event, result, start_time, finish_time, host]
compute.server/instance_action:
default_fields: [id, action, message, start_time, user_id]
compute.server:
default_fields: [id, name, flavor, status, created, updated]
status_field: status
fields:
- name: flavor
json_pointer: "/flavor/original_name"
# dns
dns.recordset:
default_fields: [name, status, type, created, updated]
dns.zone:
default_fields: [name, status, type, email, created, updated]
# identity
identity.group:
default_fields: [id, name, domain, description]
identity.project:
default_fields: [id, name, parent_id, enabled, domain_id]
identity.user/application_credential:
default_fields: [id, name, expires_at, unrestricted, description]
identity.user:
default_fields: [name, enabled, password_expires_at]
# image
image.image:
default_fields: [id, name, distro, version, visibility, min_disk, min_ram]
status_field: status
# load balancer
load-balancer.healthmonitor:
default_fields: [id, name, status, type]
status_field: operating_status
load-balancer.listener:
default_fields: [id, name, status, protocol, port]
status_field: operating_status
load-balancer.loadbalancer:
default_fields: [id, name, status, address]
status_field: operating_status
load-balancer.pool/member:
default_fields: [id, name, status, port]
status_field: operating_status
load-balancer.pool:
default_fields: [id, name, status, protocol]
status_field: operating_status
# network
network.network:
default_fields: [id, name, status, description, created_at, updated_at]
network.router:
default_fields: [id, name, status, description, created_at, updated_at]
network.subnet:
default_fields: [id, name, cidr, description, created_at]
network.security_group_rule:
default_fields: [id, ethertype, direction, protocol, port_range_min, port_range_max, description]
network.security_group:
default_fields: [id, name, description, created_at, updated_at]
Views configuration
Every resource view can be configured in a separate section of the config.
Resource key in a form fields is an array of field names to be
populated. All column names are forcibly converted to the UPPER CASE.
Resource view options
-
default_fields (list[str])
A list of fields to be displayed by default (in not wide mode). If not specified, only certain fields determined internally are displayed. Output columns are sorted in the order given in the list.
-
wide (bool)
If set to true, display all fields. If set to false, display only the default_fields.
-
fields (list[obj])
A list of column configuration. Consists of:
-
name (str) - field name (resource attribute name)
-
width (int) - column width in characters
-
min_width (int) - minimum column width in characters
-
max_width (int) - maximum column width in characters
-
json_pointer (str) - JSON pointer to the extract from the resource field. This is only applied in the list and not
widemode.
-