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>:
#    <shortcut>:
#       action: <ACTION TO PERFORM>
#       description: <DESCRIPTION USED IN TUI>
mode_keybindings:
  Home: {}
  # Block Storage views
  BlockStorageBackups:
    "y":
      action: DescribeApiResponse
      description: YAML
  BlockStorageSnapshots:
    "y":
      action: DescribeApiResponse
      description: YAML
  BlockStorageVolumes:
    "y":
      action: DescribeApiResponse
      description: YAML
    "ctrl-d":
      action: DeleteBlockStorageVolume
      description: Delete
  # Compute views
  ComputeAggregates:
    "y":
      action: DescribeApiResponse
      description: YAML
  ComputeServers:
    "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: DeleteComputeServer
      description: Delete
    "c":
      action: ShowServerConsoleOutput
      description: Console output
    "a":
      action: ShowComputeServerInstanceActions
      description: Instance actions
  ComputeServerInstanceActions:
    "y":
      action: DescribeApiResponse
      description: YAML
    "e":
      action: ShowComputeServerInstanceActionEvents
      description: Events
  ComputeFlavors:
    "y":
      action: DescribeApiResponse
      description: YAML
    "s":
      action: ShowComputeServersWithFlavor
      description: Servers
  ComputeHypervisors:
    "y":
      action: DescribeApiResponse
      description: YAML
  # DNS views
  DnsRecordsets:
    "y":
      action: DescribeApiResponse
      description: YAML
    "0":
      action:
        SetDnsRecordsetListFilters: {}
      description: Default filters
      type: Filter
  DnsZones:
    "y":
      action: DescribeApiResponse
      description: YAML
    "r":
      action: ShowDnsZoneRecordsets
      description: Recordsets
    "ctrl-d":
      action: DeleteDnsZone
      description: Delete
  # Identity views
  IdentityApplicationCredentials:
    "y":
      action: DescribeApiResponse
      description: YAML
  IdentityGroups:
    "y":
      action: DescribeApiResponse
      description: YAML
    "u":
      action: ShowIdentityGroupUsers
      description: Group users
    "d":
      action: IdentityGroupDelete
      description: Delete (todo!)
    "a":
      action: IdentityGroupCreate
      description: Create new group (todo!)
  IdentityGroupUsers:
    "y":
      action: DescribeApiResponse
      description: YAML
    "a":
      action: IdentityGroupUserAdd
      description: Add new user into group (todo!)
    "r":
      action: IdentityGroupUserRemove
      description: Remove user from group (todo!)
  IdentityProjects:
    "y":
      action: DescribeApiResponse
      description: YAML
    "s":
      action: SwitchToProject
      description: Switch to project
  IdentityUsers:
    "y":
      action: DescribeApiResponse
      description: YAML
    "e":
      action: IdentityUserFlipEnable
      description: Enable/Disable user
    "r":
      action: IdentityUserDelete
      description: Delete user (todo!)
    "a":
      action: IdentityUserCreate
      description: Create new user (todo!)
    "p":
      action: IdentityUserSetPassword
      description: Set user password (todo!)
    "c":
      action: ShowIdentityUserApplicationCredentials
      description: Application credentials
  # Image views
  ImageImages:
    "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: DeleteImage
      description: Delete
  # LoadBalancer views
  LoadBalancers:
    "y":
      action: DescribeApiResponse
      description: YAML
    "l":
      action: ShowLoadBalancerListeners
      description: Listeners
    "p":
      action: ShowLoadBalancerPools
      description: Pools
  LoadBalancerListeners:
    "y":
      action: DescribeApiResponse
      description: YAML
  LoadBalancerPools:
    "y":
      action: DescribeApiResponse
      description: YAML
    "<enter>":
      action: ShowLoadBalancerPoolMembers
      description: Members
    "h":
      action: ShowLoadBalancerPoolHealthMonitors
      description: HealthMonitors
  LoadBalancerPoolMembers:
    "y":
      action: DescribeApiResponse
      description: YAML
  LoadBalancerHealthMonitors:
    "y":
      action: DescribeApiResponse
      description: YAML
  # Network views
  NetworkNetworks:
    "y":
      action: DescribeApiResponse
      description: YAML
    "<enter>":
      action: ShowNetworkSubnets
      description: Subnets
  NetworkRouters:
    "y":
      action: DescribeApiResponse
      description: YAML
  NetworkSubnets:
    "y":
      action: DescribeApiResponse
      description: YAML
    "0":
      action:
        SetNetworkSubnetListFilters: {}
      description: All
      type: Filter
  NetworkSecurityGroups:
    "y":
      action: DescribeApiResponse
      description: YAML
    "l":
      action: ShowNetworkSecurityGroupRules
      description: Rules
  NetworkSecurityGroupRules:
    "y":
      action: DescribeApiResponse
      description: YAML
    "0":
      action:
        SetNetworkSecurityGroupRuleListFilters: {}
      description: All
      type: Filter
# 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
  "<ctrl-r>":
    action: Refresh
    description: Reload data
# Mode aliases
# <ALIAS>: <MODE>
mode_aliases:
  "aggregates (compute)": "ComputeAggregates"
  "application credentials (identity)": "IdentityApplicationCredentials"
  "backups": "BlockStorageBackups"
  "flavors": "ComputeFlavors"
  "groups (identity)": "IdentityGroups"
  "host-aggregates (compute)": "ComputeAggregates"
  "hypervisors (compute)": "ComputeHypervisors"
  "images": "ImageImages"
  "loadbalancers": "LoadBalancers"
  "lb (loadbalancers)": "LoadBalancers"
  "listeners (loadbalancer)": "LoadBalancerListeners"
  "lbl (loadbalancer listeners)": "LoadBalancerListeners"
  "pool (loadbalancer)": "LoadBalancerPools"
  "lbp (loadbalancer pools)": "LoadBalancerPools"
  "healthmonitors (loadbalancer)": "LoadBalancerHealthMonitors"
  "lbhm (loadbalancer health monitors)": "LoadBalancerHealthMonitors"
  "nets": "NetworkNetworks"
  "networks": "NetworkNetworks"
  "projects": "IdentityProjects"
  "recordsets (dns)": "DnsRecordsets"
  "routers": "NetworkRouters"
  "security groups (network)": "NetworkSecurityGroups"
  "security group rules (network)": "NetworkSecurityGroupRules"
  "servers": "ComputeServers"
  "sg": "NetworkSecurityGroups"
  "sgr": "NetworkSecurityGroupRules"
  "snapshots": "BlockStorageSnapshots"
  "subnets (network)": "NetworkSubnets"
  "volumes": "BlockStorageVolumes"
  "users": "IdentityUsers"
  "zones (dns)": "DnsZones"
# View output
# <RESOURCE_KEY>:
#   fields: <ARRAY OF COLUMNS TO SHOW>
#   wide: true
views:
  # Block Storage
  block_storage.backup:
    fields: [Id, Name, AZ, Size, Status, Created]
  block_storage.snapshots:
    fields: [Id, Name, Status, Created]
  block_storage.volume:
    fields: [Id, Name, AZ, Size, Status, Updated]
  # Compute
  compute.aggregate:
    fields: [Name, UUID, AZ, Updated]
  compute.flavor:
    fields: [Id, Name, vCPU, ram, disk, disabled]
  compute.hypervisor:
    fields: [IP, Hostname,Status, State]
  compute.server/instance_action/event:
    fields: [Event, Result, Started, Finished, Host]
  compute.server/instance_action:
    fields: [Id, Action, Message, Started, User, "Server ID"]
  compute.server:
    fields: [Id, Name, Status, Created, Updated]
  # DNS
  dns.recordset:
    fields: [Id, Name, Status, Created, Updated]
  dns.zone:
    fields: [Id, Name, Status, Created, Updated]
  # Identity
  identity.group:
    fields: [Id, Name, Domain, Description]
  identity.project:
    fields: [Id, Name, "Parent ID", Enabled, "Domain ID"]
  identity.user/application_credential:
    fields: [Id, Name, "Expires at", "Unrestricted"]
  identity.user:
    fields: [Name, Domain, Enabled, Email, "Pwd expiry"]
  # Image
  image.image:
    fields: [Id, Name, Distro, Version, Arch, Visibility]
  # Load Balancer
  load-balancer.healthmonitor:
    fields: [Id, Name, Status, Type]
  load-balancer.listener:
    fields: [Id, Name, Status, Protocol, Port]
  load-balancer.loadbalancer:
    fields: [Id, Name, Status, Address]
  load-balancer.pool/member:
    fields: [Id, Name, Status, Port]
  load-balancer.pool:
    fields: [Id, Name, Status, Protocol]
  # Network
  network.network:
    fields: [Id, Name, Status, Created, Updated]
  network.router:
    fields: [Id, Name, Status, Created, Updated]
  network.subnet:
    fields: [Id, Name, Cidr, Description, Created]
  network.security_group_rule:
    fields: [Id, Ethertype, Direction, Protocol, "Range Min", "Range Max"]
  network.security_group:
    fields: [Id, Name, Created, Updated]

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.

NOTE: This a work in progress to pre-generate resource structures and column names.