Config Server

The config server is a simple web service that runs either on a local machine or a remote server.

The configuration is a key/value system where the keys and values must be serializable as valid yaml (or json). Configuration can be initially defined in an external yaml file and any values saved to the active server will by default be saved back to a copy of the yaml file.

The module will install the panoptes-config-server for command line usage, which defines a number of subcommands for interacting with (and starting) the server.

$ panoptes-config-server --help                                                                                                                                                                                                    ─╯
Usage: panoptes-config-server [OPTIONS] COMMAND [ARGS]...

Options:
  --verbose / --no-verbose  Turn on panoptes logger for utils, default False
  --help                    Show this message and exit.

Commands:
  get  Get an item from the config server.
  run  Runs the config server with command line options.
  set  Set an item in the config server.

Each subcommand has its own --help command. See below for specific usage.

Starting the config server

Command line

To start the service from the command-line, use panoptes-config-server run:

$ panoptes-config-server run --help                                                                                                                                                                                                ─╯
Usage: panoptes-config-server run [OPTIONS] CONFIG_FILE

  Runs the config server with command line options.

  This function is installed as an entry_point for the module, accessible at
  `panoptes-config-server`.

Options:
  --host TEXT                     The config server IP address or host name,
                                  default 0.0.0.0
  --port TEXT                     The config server port, default 6563
  --save / --no-save              If the set values should be saved
                                  permanently, default True
  --ignore-local / --no-ignore-local
                                  Ignore the local config files, default
                                  False. Mostly for testing.
  --debug / --no-debug
  --help                          Show this message and exit.

Python

From python, for instance when running in a jupyter notebook, you can use:

>>> from panoptes.utils.config.server import config_server

>>> server_process = config_server()
...
>>> server_process.terminate()  # Or just exit notebook/console

Options

ignore_local

By default, local versions of the config files are parsed and replace any default values. For instance, the default config file is $PANDIR/conf_files/pocs.yaml but the config server will also look for and parse $PANDIR/conf_files/pocs_local.yaml.

This allows for overriding of default entries while still maintaing the originals.

This option can be disabled with the ignore_local setting.

Note

Automatic tests run via pytest will always ignore local config files unless they are being run with the --hardware options.

Using the config server

Python

The server can be queried/set in python:

>>> from panoptes.utils.config import client

# Show the entire config item.
>>> client.get_config('location')
{'elevation': 3400.0,
 'flat_horizon': -6.0,
 'focus_horizon': -12.0,
 'gmt_offset': -600.0,
 'horizon': 30,
 'latitude': 19.54,
 'longitude': -155.58,
 'name': 'Mauna Loa Observatory',
 'observe_horizon': -18.0,
 'timezone': 'US/Hawaii'}

# Get just a specific value.
>>> client.get_config('location.horizon')
30.0

# Set to a new value.
>>> client.set_config('location.horizon', 45)
{'location.horizon': 45.0}

# Retrieve new value.
>>> client.get_config('location.horizon')
45.0

# Work with units.
>>> from astropy import units as u
>>> client.set_config('location.horizon', 45 * u.deg)
{'location.horizon': <Quantity 45. deg>}

>>> client.get_config('location.horizon')
<Quantity 45. deg>

>>> client.get_config('location')
{'elevation': 3400.0,
 'flat_horizon': -6.0,
 'focus_horizon': -12.0,
 'gmt_offset': -600.0,
 'horizon': <Quantity 45. deg>,
 'latitude': 19.54,
 'longitude': -155.58,
 'name': 'Mauna Loa Observatory',
 'observe_horizon': -18.0,
 'timezone': 'US/Hawaii'}

# Get the second camera model
>>> client.get_config('cameras.devices[1].model')
'canon_gphoto2'

Command-line

The panoptes-config-server get command will fetch the requested key (or the entire config if no is provided) and print it out to the console as JSON string.

The panoptes-config-server set command will set the value for the given key.

$ panoptes-config-server get --key location
{
  "elevation": 3400,
  "flat_horizon": -6,
  "focus_horizon": -12,
  "gmt_offset": -600,
  "horizon": "45.0 deg",
  "latitude": 19.54,
  "longitude": -155.58,
  "name": "Mauna Loa Observatory",
  "observe_horizon": -18,
  "timezone": "US/Hawaii"
}
$ panoptes-config-server set 'location.horizon' '37 deg'
{'location.horizon': <Quantity 37. deg>}

See panoptes-config-server get --help and panoptes-config-server set --help for more details.