Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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 .[/] as used by the codegenerator is a name of a view. 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 wide mode.