OCS Site Configuration

Overview

This page describes the OCS configuration file. This file describes all the Agents running in an observatory across all hosts.

OCS Site Config File

The OCS Site Config File (SCF) is a single YAML file that defines connection parameters for the crossbar server, as well as the Agents that will run on each host, whether on the host system, or in a Docker container. The SCF may be shared between multiple hosts, providing distinct configurations for each one.

Example Config

Here is an example of an SCF for a site with two hosts, and 4 agent instances (running two different classes of agent):

hub:

  wamp_server: ws://10.10.10.3:8001/ws
  wamp_http: http://10.10.10.3:8001/call
  wamp_realm: test_realm
  address_root: observatory

hosts:

  host-1: {

    # Directory for logs.
    'log-dir': '/simonsobs/log/ocs/',

    # List of additional paths to Agent plugin modules.
    'agent-paths': [
      '/simonsobs/ocs/agents/',
    ],

    # Description of host-1's Agents.
    # We have two readout devices; they are both Lakeshore 240. But they can
    # be distinguished, on startup, by a device serial number.

    'agent-instances': [
      {'agent-class': 'Lakeshore240Agent',
       'instance-id': 'thermo1',
       'arguments': [['--serial-number', 'LSA11AA'],
                     ['--mode', 'idle']]},
      {'agent-class': 'Lakeshore240Agent',
       'instance-id': 'thermo2',
       'arguments': [['--serial-number', 'LSA22BB'],
                     ['--mode', 'acq']]},
    ]
  }

  host-1-docker: {

    # Address of crossbar within Docker (based on service name)
    'wamp_server': 'ws://crossbar:8001/ws',
    'wamp_http': 'http://crossbar:8001/call',

    # Description of host-1's Agents running with Docker containers.
    # We have one readout device; a Lakeshore 372.

    'agent-instances': [
      {'agent-class': 'Lakeshore372Agent',
       'instance-id': 'LSARR00',
       'arguments': [['--serial-number', 'LSARR00'],
                     ['--ip-address', '10.10.10.55']]},
    ]
  }

  host-2: {

    # Crossbar start-up instructions (optional).
    'crossbar': {'config-dir': '/simonsobs/ocs/dot_crossbar/'},

    # Directory for logs.
    'log-dir': '/simonsobs/log/ocs/',

    # List of additional paths to Agent plugin modules.
    'agent-paths': [
      '/simonsobs/ocs/agents/',
    ],

    # Description of host-2's Agents.
    # We have two devices; another Lakeshore 240, and the OCS g3 file
    # Aggregator.

    'agent-instances': [
      {'agent-class': 'Lakeshore240Agent',
       'instance-id': 'thermo3',
       'arguments': [['--serial-number', 'LSA33CC'],
                     ['--mode', 'init']]},
      {'agent-class': 'AggregatorAgent',
       'instance-id': 'aggregator',
       'arguments': [['--initial-state', 'record'],
                     ['--time-per-file', '3600'],
                     ['--data-dir', '/data/']]},
    ]
  }

The hub section defines the connection parameters for the crossbar server. This entire section will likely remain unchanged, except for the wamp_server and wamp_http IP addresses.

The address_root setting determines the leading token in all agent and feed addresses on the crossbar network. While “observatory” is the default, it can be changed as long as the crossbar configuration is also updated to permit operations on the {address_root}. uri.

Warning

The hub settings must match the crossbar configuration. If you change wamp_realm or address_root, especially, be sure to update your crossbar configuration accordingly. (If using the ocs-crossbar docker image, this can be done through environment variables in the docker-compose.yaml file.)

Under hosts we have defined a three hosts, host-1, host-1-docker, and host-2. This configuration example shows a mix of Agents running directly on hosts and running within Docker containers.

Note

The hostname within a Docker container is configurable in the docker-compose.yaml file. While you could configure it to be identical to the host system, we recommend naming the docker hosts with the convention “hostname”-“docker” to distinguish which Agents are running in Docker containers in the SCF.

Note

To determine your host name, open a terminal and enter hostname.

Each item under a given host describes the OCS Agents which can be run. For example look at the first 372 Agent:

{'agent-class': 'Lakeshore372Agent',
 'instance-id': 'LSARR00',
 'arguments': [['--serial-number', 'LSARR00'],
               ['--ip-address', '10.10.10.55']]},

The agent-class is given by the actual Agent which will be running. This must match the name defined in the Agent’s code. The instance-id is a unique name given to this agent instance. Here we use the Lakeshore 372 serial number, LSARR00. Finally the arguments are used to pass default arguments to the Agent at startup, which contains the serial number again as well as the IP address of the 372.

Environment Setup

By default the system will look for site files in the path pointed to by environment variable OCS_CONFIG_DIR. To define this, add the following to your .bashrc file:

export OCS_CONFIG_DIR='/path/to/ocs-site-configs/<your-institution-directory>/'

The default site filename is default.yaml. In practice, it is recommended to name the configuration file after a given site, i.e. yale.yaml, and symlink to default.yaml:

$ ln -s yale.yaml default.yaml

During development, multiple YAML files may be in active use; then users will identify their config file through command line arguments when launching Agents and Control Clients (see below).

Note

If you’re proceeding in the same terminal don’t forget to source your .bashrc file.

Crossbar Connection Timeout

If an Agent loses connection to the crossbar server it will be unable to publish any values to its Feeds. By default, the Agent stays online for 10 seconds, waiting to remake the connection to crossbar. If it fails to do so, it will stop all running processes and shutdown.

There may be instances where you would like the Agent to continue running its Processes, even if the connection to crossbar is lost for some amount of time or indefinitely. For these cases there is the crossbar-timeout argument. This can be set at the Host level, at the individual Agent level, passed on the commandline, or set via an environment variable. Setting the timeout to 0 disabled the timeout, allowing the Agent to run indefinitely without a crossbar connection.

Note

A crossbar connection is still required for initial startup of the Agent.

To set at the host level:

hosts:
  host-1: {

    # Set timeout to 20 seconds for all Agents on this host
    'crossbar-timeout': 20,

    'agent-instances': [
      # crossbar timeout set to 30 seconds
      {'agent-class': 'Lakeshore240Agent',
       'instance-id': 'thermo1',
       'arguments': [['--serial-number', 'LSA11AA'],
                     ['--mode', 'idle'],
                     ['--crossbar-timeout', 30]]},
      # crossbar timeout disabled
      {'agent-class': 'Lakeshore240Agent',
       'instance-id': 'thermo2',
       'arguments': [['--serial-number', 'LSA22BB'],
                     ['--mode', 'acq'],
                     ['--crossbar-timeout', 0]]},
    ]
  }

Commandline Arguments

There are several built in commandline arguments that can be passed to Agents when running. Agent Developers can also add custom arguments to their Agents. If running an Agent directly on a host these can be thrown when running the Agent manually, or configured in the ‘arguments’ section of your SCF. The built in arguments for all Agents are listed here, followed by some examples.

Note

OCS users deploying Agents within Docker containers should be aware that commandline options may be thrown by default within the Docker container. These can be overridden by a user within their docker-compose.yaml file using the CMD instruction.

usage:  [-h] [--site SITE] [--site-file SITE_FILE] [--site-host SITE_HOST]
        [--site-hub SITE_HUB] [--site-http SITE_HTTP]
        [--site-realm SITE_REALM] [--instance-id INSTANCE_ID]
        [--address-root ADDRESS_ROOT] [--registry-address REGISTRY_ADDRESS]
        [--log-dir LOG_DIR] [--working-dir WORKING_DIR]
        [--crossbar-timeout CROSSBAR_TIMEOUT]

Site Config Options

--site

Instead of the default site, use the configuration for the specified site. The configuration is loaded from $OCS_CONFIG_DIR/{site}.yaml. If --site=none, the site_config facility will not be used at all.

--site-file

Instead of the default site config, use the specified file. Full path must be specified.

--site-host

Override the OCS determination of what host this instance is running on, and instead use the configuration for the indicated host.

--site-hub

Override the ocs hub url (wamp_server).

--site-http

Override the ocs hub http url (wamp_http).

--site-realm

Override the ocs hub realm (wamp_realm).

--instance-id

Look in the SCF for Agent-instance specific configuration options, and use those to launch the Agent.

--address-root

Override the site default address root.

--registry-address

Deprecated.

--log-dir

Set the logging directory.

--working-dir

Propagate the working directory.

--crossbar-timeout

Length of time in seconds that the Agent will try to reconnect to the crossbar server before shutting down. Note this is set per Agent in an instance’s arguments list.

Examples

In the following examples, consider the “LS240_agent.py”, which implements an Agent for talking to Lakeshore240 devices. Suppose these are being run on a host called “host-1”. Refer to the example site configuration listed above. (Note that to run these in the example tree you will usually need to add the options that select the example SCF and host, namely: --site-file telescope.yaml --site-host host-1 . One exception to this is when using --site=none. )

  1. Because there are two instances of “Lakeshore240Agent” registered in the SCF, we must somehow pick one when running the agent:

    $ python LS240_agent.py --instance-id=thermo1
    I am in charge of device with serial number: LSA11AA
    
  2. We can ask our agent to connect to a different WAMP realm, for testing purposes (note this realm would need to be enabled in crossbar, probably):

    $ python LS240_agent.py --instance-id=thermo1 --site-realm=my_other_realm
    I am in charge of device with serial number: LSA11AA
    
  3. Run an instance of an Agent, but force all configuration matching to occur as though the Agent were running on a host called “host-2”:

    $ python LS240_agent.py --site-host=host-2
    I am in charge of device with serial number: LSA33CC
    

    Note that we do not need to specify an --instance-id, because the SCF only lists one Lakeshore240Agent instance.

  4. To avoid referring to a SCF at all, pass --site=none. Then specify enough information for the agent to connect and run:

    $ python LS240_agent.py --site=none \
    --site-hub ws://localhost:8001/ws --site-realm debug_realm \
    --address-root=observatory --instance-id=thermo1 \
    --serial-number=LSA11AA --mode=testing
    I am in charge of device with serial number: LSA11AA