YAML

The NOS-T Tools library requires a Yet Another Markup Language (YAML) configuration file. This file adopts a format similar to AsyncAPI to define the connection configuration for the RabbitMQ broker and Keycloak authentication servers.

Configuration Overview

The YAML files is composed of the following sections:

  1. Info: Contains metadata about the YAML configuration file.

  2. Servers: Contains the connection configuration for the RabbitMQ broker and Keycloak authentication servers.

  3. Execution: Contains the execution configuration for the NOS-T Tools library.

  4. Channels: Contains the channel configuration for the NOS-T Tools library.

Each section is explained in detail below.

Info Section

Contains metadata about the configuration file. This does not influence the operation of the NOS-T Tools library, it is merely for documentation and informational purposes.

pydantic model InfoConfig

Show JSON schema
{
   "title": "InfoConfig",
   "type": "object",
   "properties": {
      "title": {
         "anyOf": [
            {
               "type": "string"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "description": "Title of the simulation.",
         "title": "Title"
      },
      "version": {
         "anyOf": [
            {
               "type": "string"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "description": "Version of the simulation.",
         "title": "Version"
      },
      "description": {
         "anyOf": [
            {
               "type": "string"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "description": "Description of the simulation.",
         "title": "Description"
      }
   }
}

Fields:
field description: str | None = None

Description of the simulation.

field title: str | None = None

Title of the simulation.

field version: str | None = None

Version of the simulation.

Example:

info:
  title: Novel Observing Strategies Testbed (NOS-T) YAML Configuration
  version: '1.0.0'
  description: Version-controlled configuration file for Snow Observing Systems (SOS) project

Servers Section

Defines connection parameters for the RabbitMQ message broker and Keycloak authentication server.

RabbitMQ Configuration

pydantic model RabbitMQConfig

Show JSON schema
{
   "title": "RabbitMQConfig",
   "type": "object",
   "properties": {
      "keycloak_authentication": {
         "default": false,
         "description": "Keycloak authentication for RabbitMQ.",
         "title": "Keycloak Authentication",
         "type": "boolean"
      },
      "tls": {
         "default": false,
         "description": "RabbitMQ TLS/SSL.",
         "title": "Tls",
         "type": "boolean"
      },
      "reconnect_delay": {
         "default": 10,
         "description": "Reconnection delay, in seconds.",
         "title": "Reconnect Delay",
         "type": "integer"
      },
      "queue_max_size": {
         "default": 5000,
         "description": "Maximum size of the RabbitMQ queue.",
         "title": "Queue Max Size",
         "type": "integer"
      },
      "content_type": {
         "default": null,
         "description": "RabbitMQ MIME content type (application/json, text/plain, etc.).",
         "title": "Content Type",
         "type": "string"
      },
      "content_encoding": {
         "default": null,
         "description": "RabbitMQ MIME content encoding (gzip, deflate, etc.).",
         "title": "Content Encoding",
         "type": "string"
      },
      "headers": {
         "additionalProperties": {
            "type": "string"
         },
         "default": null,
         "description": "RabbitMQ message headers (key-value pairs).",
         "title": "Headers",
         "type": "object"
      },
      "delivery_mode": {
         "default": null,
         "description": "RabbitMQ delivery mode (1: non-persistent, 2: durable).",
         "title": "Delivery Mode",
         "type": "integer"
      },
      "priority": {
         "default": null,
         "description": "RabbitMQ message priority (0-255).",
         "title": "Priority",
         "type": "integer"
      },
      "correlation_id": {
         "default": null,
         "description": "RabbitMQ correlation ID for message tracking.",
         "title": "Correlation Id",
         "type": "string"
      },
      "reply_to": {
         "default": null,
         "description": "RabbitMQ reply-to queue for response messages.",
         "title": "Reply To",
         "type": "string"
      },
      "message_expiration": {
         "default": null,
         "description": "RabbitMQ expiration, in milliseconds.",
         "title": "Message Expiration",
         "type": "string"
      },
      "message_id": {
         "default": null,
         "description": "RabbitMQ message ID for tracking.",
         "title": "Message Id",
         "type": "string"
      },
      "timestamp": {
         "default": null,
         "description": "RabbitMQ message timestamp.",
         "format": "date-time",
         "title": "Timestamp",
         "type": "string"
      },
      "type": {
         "default": null,
         "description": "RabbitMQ message type (e.g., 'text', 'json').",
         "title": "Type",
         "type": "string"
      },
      "user_id": {
         "default": null,
         "description": "RabbitMQ user ID for authentication.",
         "title": "User Id",
         "type": "string"
      },
      "app_id": {
         "default": null,
         "description": "RabbitMQ application ID for tracking.",
         "title": "App Id",
         "type": "string"
      },
      "cluster_id": {
         "default": null,
         "description": "RabbitMQ cluster ID for tracking.",
         "title": "Cluster Id",
         "type": "string"
      },
      "host": {
         "default": "localhost",
         "description": "RabbitMQ host.",
         "title": "Host",
         "type": "string"
      },
      "port": {
         "default": 5672,
         "description": "RabbitMQ port.",
         "title": "Port",
         "type": "integer"
      },
      "virtual_host": {
         "default": "/",
         "description": "RabbitMQ virtual host.",
         "title": "Virtual Host",
         "type": "string"
      },
      "channel_max": {
         "default": 65535,
         "description": "RabbitMQ maximum number of channels per connection.",
         "title": "Channel Max",
         "type": "integer"
      },
      "frame_max": {
         "default": 131072,
         "description": "RabbitMQ maximum frame size in bytes.",
         "title": "Frame Max",
         "type": "integer"
      },
      "heartbeat": {
         "default": null,
         "description": "RabbitMQ heartbeat interval, in seconds.",
         "title": "Heartbeat",
         "type": "integer"
      },
      "connection_attempts": {
         "default": 1,
         "description": "RabbitMQ connection attempts before giving up.",
         "title": "Connection Attempts",
         "type": "integer"
      },
      "retry_delay": {
         "default": 2,
         "description": "RabbitMQ retry delay, in seconds.",
         "title": "Retry Delay",
         "type": "integer"
      },
      "socket_timeout": {
         "default": 10,
         "description": "RabbitMQ socket timeout, in seconds.",
         "title": "Socket Timeout",
         "type": "integer"
      },
      "stack_timeout": {
         "default": 15,
         "description": "RabbitMQ stack timeout, in seconds.",
         "title": "Stack Timeout",
         "type": "integer"
      },
      "locale": {
         "default": "en_US",
         "description": "RabbitMQ locale.",
         "title": "Locale",
         "type": "string"
      },
      "blocked_connection_timeout": {
         "default": null,
         "description": "Timeout for blocked connections.",
         "title": "Blocked Connection Timeout",
         "type": "integer"
      }
   }
}

Fields:
field app_id: str = None

RabbitMQ application ID for tracking.

field blocked_connection_timeout: int = None

Timeout for blocked connections.

field channel_max: int = 65535

RabbitMQ maximum number of channels per connection.

field cluster_id: str = None

RabbitMQ cluster ID for tracking.

field connection_attempts: int = 1

RabbitMQ connection attempts before giving up.

field content_encoding: str = None

RabbitMQ MIME content encoding (gzip, deflate, etc.).

field content_type: str = None

RabbitMQ MIME content type (application/json, text/plain, etc.).

field correlation_id: str = None

RabbitMQ correlation ID for message tracking.

field delivery_mode: int = None

RabbitMQ delivery mode (1: non-persistent, 2: durable).

field frame_max: int = 131072

RabbitMQ maximum frame size in bytes.

field headers: Dict[str, str] = None

RabbitMQ message headers (key-value pairs).

field heartbeat: int = None

RabbitMQ heartbeat interval, in seconds.

field host: str = 'localhost'

RabbitMQ host.

field keycloak_authentication: bool = False

Keycloak authentication for RabbitMQ.

field locale: str = 'en_US'

RabbitMQ locale.

field message_expiration: str = None

RabbitMQ expiration, in milliseconds.

field message_id: str = None

RabbitMQ message ID for tracking.

field port: int = 5672

RabbitMQ port.

field priority: int = None

RabbitMQ message priority (0-255).

field queue_max_size: int = 5000

Maximum size of the RabbitMQ queue.

field reconnect_delay: int = 10

Reconnection delay, in seconds.

field reply_to: str = None

RabbitMQ reply-to queue for response messages.

field retry_delay: int = 2

RabbitMQ retry delay, in seconds.

field socket_timeout: int = 10

RabbitMQ socket timeout, in seconds.

field stack_timeout: int = 15

RabbitMQ stack timeout, in seconds.

field timestamp: datetime = None

RabbitMQ message timestamp.

field tls: bool = False

RabbitMQ TLS/SSL.

field type: str = None

RabbitMQ message type (e.g., ‘text’, ‘json’).

field user_id: str = None

RabbitMQ user ID for authentication.

field virtual_host: str = '/'

RabbitMQ virtual host.

Example:

servers:
  rabbitmq:
    keycloak_authentication: False
    host: "localhost"
    port: 5672
    tls: False
    virtual_host: "/"
    message_expiration: "60000"
    delivery_mode: 2
    content_type: "text/plain"
    heartbeat: 600
    connection_attempts: 3
    retry_delay: 5
    reconnect_delay: 10
    blocked_connection_timeout: 300
    queue_max_size: 1000
    frame_max: 131072
    socket_timeout: 10.0
    stack_timeout: 15.0

Keycloak Configuration

pydantic model KeycloakConfig

Show JSON schema
{
   "title": "KeycloakConfig",
   "type": "object",
   "properties": {
      "host": {
         "default": "localhost",
         "description": "Keycloak host.",
         "title": "Host",
         "type": "string"
      },
      "port": {
         "default": 8080,
         "description": "Keycloak port.",
         "title": "Port",
         "type": "integer"
      },
      "realm": {
         "default": "master",
         "description": "Keycloak realm.",
         "title": "Realm",
         "type": "string"
      },
      "tls": {
         "default": false,
         "description": "Keycloak TLS/SSL.",
         "title": "Tls",
         "type": "boolean"
      },
      "token_refresh_interval": {
         "default": 240,
         "description": "Keycloak token refresh interval, in seconds.",
         "title": "Token Refresh Interval",
         "type": "integer"
      }
   }
}

Fields:
field host: str = 'localhost'

Keycloak host.

field port: int = 8080

Keycloak port.

field realm: str = 'master'

Keycloak realm.

field tls: bool = False

Keycloak TLS/SSL.

field token_refresh_interval: int = 240

Keycloak token refresh interval, in seconds.

Example:

  keycloak:
    host: "nost.smce.nasa.gov"
    port: 8443
    tls: True
    token_refresh_interval: 240
    realm: "NOS-T"

Execution Section

Defines parameters controlling simulation execution and time management.

General Configuration

pydantic model GeneralConfig

Show JSON schema
{
   "title": "GeneralConfig",
   "type": "object",
   "properties": {
      "prefix": {
         "anyOf": [
            {
               "type": "string"
            },
            {
               "type": "null"
            }
         ],
         "default": "nost",
         "description": "Execution prefix.",
         "title": "Prefix"
      },
      "wallclock_offset_refresh_interval": {
         "anyOf": [
            {
               "type": "integer"
            },
            {
               "type": "null"
            }
         ],
         "default": 10800,
         "description": "Wallclock offset refresh interval, in seconds.",
         "title": "Wallclock Offset Refresh Interval"
      },
      "ntp_host": {
         "anyOf": [
            {
               "type": "string"
            },
            {
               "type": "null"
            }
         ],
         "default": "pool.ntp.org",
         "description": "NTP host for wallclock offset synchronization.",
         "title": "Ntp Host"
      },
      "resume_tolerance": {
         "anyOf": [
            {
               "format": "duration",
               "type": "string"
            },
            {
               "type": "null"
            }
         ],
         "default": "PT12H",
         "description": "Default time tolerance for resume requests (HH:MM:SS format in YAML).",
         "title": "Resume Tolerance"
      }
   }
}

Fields:
field ntp_host: str | None = 'pool.ntp.org'

NTP host for wallclock offset synchronization.

field prefix: str | None = 'nost'

Execution prefix.

field resume_tolerance: timedelta | None = datetime.timedelta(seconds=43200)

Default time tolerance for resume requests (HH:MM:SS format in YAML).

field wallclock_offset_refresh_interval: int | None = 10800

Wallclock offset refresh interval, in seconds.

Example:

execution:
  general:
    prefix: sos
    wallclock_offset_refresh_interval: 10800
    ntp_host: "pool.ntp.org"
    resume_tolerance: "12:00:00"

Logging Configuration

File logging can be enabled per-application through the YAML configuration. Logging parameters are inherited by ApplicationConfig, ManagerConfig, and ManagedApplicationConfig. When enable_file_logging is set to True, the configure_file_logging() method is automatically called during start_up().

pydantic model LoggingConfig

Configuration for logging.

Show JSON schema
{
   "title": "LoggingConfig",
   "description": "Configuration for logging.",
   "type": "object",
   "properties": {
      "enable_file_logging": {
         "anyOf": [
            {
               "type": "boolean"
            },
            {
               "type": "null"
            }
         ],
         "default": false,
         "description": "Enable file logging.",
         "title": "Enable File Logging"
      },
      "log_dir": {
         "anyOf": [
            {
               "type": "string"
            },
            {
               "type": "null"
            }
         ],
         "default": "logs",
         "description": "Directory path for log files.",
         "title": "Log Dir"
      },
      "log_filename": {
         "anyOf": [
            {
               "type": "string"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "description": "Path to the log file.",
         "title": "Log Filename"
      },
      "log_level": {
         "anyOf": [
            {
               "type": "string"
            },
            {
               "type": "null"
            }
         ],
         "default": "INFO",
         "description": "Logging level (DEBUG, INFO, WARNING, ERROR, CRITICAL).",
         "title": "Log Level"
      },
      "max_bytes": {
         "anyOf": [
            {
               "type": "integer"
            },
            {
               "type": "null"
            }
         ],
         "default": 10485760,
         "description": "Maximum size of the log file in bytes. Default is 10MB.",
         "title": "Max Bytes"
      },
      "backup_count": {
         "anyOf": [
            {
               "type": "integer"
            },
            {
               "type": "null"
            }
         ],
         "default": 5,
         "description": "Number of backup log files to keep.",
         "title": "Backup Count"
      },
      "log_format": {
         "anyOf": [
            {
               "type": "string"
            },
            {
               "type": "null"
            }
         ],
         "default": "%(asctime)s [%(levelname)s] %(name)s: %(message)s",
         "description": "Format of the log messages.",
         "title": "Log Format"
      }
   }
}

Fields:
field backup_count: int | None = 5

Number of backup log files to keep.

field enable_file_logging: bool | None = False

Enable file logging.

field log_dir: str | None = 'logs'

Directory path for log files.

field log_filename: str | None = None

Path to the log file.

field log_format: str | None = '%(asctime)s [%(levelname)s] %(name)s: %(message)s'

Format of the log messages.

field log_level: str | None = 'INFO'

Logging level (DEBUG, INFO, WARNING, ERROR, CRITICAL).

field max_bytes: int | None = 10485760

Maximum size of the log file in bytes. Default is 10MB.

Unmanaged application logging example:

  applications:
    dashboard:
      enable_file_logging: True
      log_dir: "logs"
      log_level: "INFO"

Manager logging example:

  manager:
    enable_file_logging: True
    log_dir: "logs"
    log_level: "DEBUG"
    max_bytes: 10485760
    backup_count: 5

Managed application logging example:

  managed_applications:
    planner:
      enable_file_logging: True
      log_dir: "logs"
      log_level: "INFO"
      max_bytes: 5242880
      backup_count: 3

Application Configuration

Configures unmanaged applications (those that do not receive commands from a Manager). Each application is identified by name under the execution.applications dictionary. Application-specific parameters can be defined under configuration_parameters.

pydantic model ApplicationConfig

Show JSON schema
{
   "title": "ApplicationConfig",
   "type": "object",
   "properties": {
      "enable_file_logging": {
         "anyOf": [
            {
               "type": "boolean"
            },
            {
               "type": "null"
            }
         ],
         "default": false,
         "description": "Enable file logging.",
         "title": "Enable File Logging"
      },
      "log_dir": {
         "anyOf": [
            {
               "type": "string"
            },
            {
               "type": "null"
            }
         ],
         "default": "logs",
         "description": "Directory path for log files.",
         "title": "Log Dir"
      },
      "log_filename": {
         "anyOf": [
            {
               "type": "string"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "description": "Path to the log file.",
         "title": "Log Filename"
      },
      "log_level": {
         "anyOf": [
            {
               "type": "string"
            },
            {
               "type": "null"
            }
         ],
         "default": "INFO",
         "description": "Logging level (DEBUG, INFO, WARNING, ERROR, CRITICAL).",
         "title": "Log Level"
      },
      "max_bytes": {
         "anyOf": [
            {
               "type": "integer"
            },
            {
               "type": "null"
            }
         ],
         "default": 10485760,
         "description": "Maximum size of the log file in bytes. Default is 10MB.",
         "title": "Max Bytes"
      },
      "backup_count": {
         "anyOf": [
            {
               "type": "integer"
            },
            {
               "type": "null"
            }
         ],
         "default": 5,
         "description": "Number of backup log files to keep.",
         "title": "Backup Count"
      },
      "log_format": {
         "anyOf": [
            {
               "type": "string"
            },
            {
               "type": "null"
            }
         ],
         "default": "%(asctime)s [%(levelname)s] %(name)s: %(message)s",
         "description": "Format of the log messages.",
         "title": "Log Format"
      },
      "set_offset": {
         "anyOf": [
            {
               "type": "boolean"
            },
            {
               "type": "null"
            }
         ],
         "default": true,
         "description": "Set offset.",
         "title": "Set Offset"
      },
      "time_scale_factor": {
         "anyOf": [
            {
               "type": "number"
            },
            {
               "type": "null"
            }
         ],
         "default": 1.0,
         "description": "Time scale factor.",
         "title": "Time Scale Factor"
      },
      "time_step": {
         "anyOf": [
            {
               "format": "duration",
               "type": "string"
            },
            {
               "type": "null"
            }
         ],
         "default": "PT1S",
         "description": "Time step for swe_change.",
         "title": "Time Step"
      },
      "time_status_step": {
         "anyOf": [
            {
               "format": "duration",
               "type": "string"
            },
            {
               "type": "null"
            }
         ],
         "default": "PT10S",
         "description": "Time status step.",
         "title": "Time Status Step"
      },
      "time_status_init": {
         "anyOf": [
            {
               "format": "date-time",
               "type": "string"
            },
            {
               "type": "null"
            }
         ],
         "default": "2026-04-15T19:20:10.926833",
         "description": "Time status init.",
         "title": "Time Status Init"
      },
      "shut_down_when_terminated": {
         "anyOf": [
            {
               "type": "boolean"
            },
            {
               "type": "null"
            }
         ],
         "default": false,
         "description": "Shut down when terminated.",
         "title": "Shut Down When Terminated"
      },
      "manager_app_name": {
         "anyOf": [
            {
               "type": "string"
            },
            {
               "type": "null"
            }
         ],
         "default": "manager",
         "description": "Manager application name.",
         "title": "Manager App Name"
      },
      "configuration_parameters": {
         "anyOf": [
            {
               "additionalProperties": true,
               "type": "object"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "description": "Application-specific configuration parameters.",
         "title": "Configuration Parameters"
      }
   }
}

Fields:
field backup_count: int | None = 5

Number of backup log files to keep.

field configuration_parameters: Dict | None = None

Application-specific configuration parameters.

field enable_file_logging: bool | None = False

Enable file logging.

field log_dir: str | None = 'logs'

Directory path for log files.

field log_filename: str | None = None

Path to the log file.

field log_format: str | None = '%(asctime)s [%(levelname)s] %(name)s: %(message)s'

Format of the log messages.

field log_level: str | None = 'INFO'

Logging level (DEBUG, INFO, WARNING, ERROR, CRITICAL).

field manager_app_name: str | None = 'manager'

Manager application name.

field max_bytes: int | None = 10485760

Maximum size of the log file in bytes. Default is 10MB.

field set_offset: bool | None = True

Set offset.

field shut_down_when_terminated: bool | None = False

Shut down when terminated.

field time_scale_factor: float | None = 1.0

Time scale factor.

field time_status_init: datetime | None = datetime.datetime(2026, 4, 15, 19, 20, 10, 926833)

Time status init.

field time_status_step: timedelta | None = datetime.timedelta(seconds=10)

Time status step.

field time_step: timedelta | None = datetime.timedelta(seconds=1)

Time step for swe_change.

Example:

  applications:
    dashboard:
      set_offset: False
      shut_down_when_terminated: True
      enable_file_logging: True
      log_dir: "logs"
      log_level: "INFO"
      configuration_parameters:
        refresh_rate: 5

Manager Configuration

pydantic model ManagerConfig

Show JSON schema
{
   "title": "ManagerConfig",
   "type": "object",
   "properties": {
      "enable_file_logging": {
         "anyOf": [
            {
               "type": "boolean"
            },
            {
               "type": "null"
            }
         ],
         "default": false,
         "description": "Enable file logging.",
         "title": "Enable File Logging"
      },
      "log_dir": {
         "anyOf": [
            {
               "type": "string"
            },
            {
               "type": "null"
            }
         ],
         "default": "logs",
         "description": "Directory path for log files.",
         "title": "Log Dir"
      },
      "log_filename": {
         "anyOf": [
            {
               "type": "string"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "description": "Path to the log file.",
         "title": "Log Filename"
      },
      "log_level": {
         "anyOf": [
            {
               "type": "string"
            },
            {
               "type": "null"
            }
         ],
         "default": "INFO",
         "description": "Logging level (DEBUG, INFO, WARNING, ERROR, CRITICAL).",
         "title": "Log Level"
      },
      "max_bytes": {
         "anyOf": [
            {
               "type": "integer"
            },
            {
               "type": "null"
            }
         ],
         "default": 10485760,
         "description": "Maximum size of the log file in bytes. Default is 10MB.",
         "title": "Max Bytes"
      },
      "backup_count": {
         "anyOf": [
            {
               "type": "integer"
            },
            {
               "type": "null"
            }
         ],
         "default": 5,
         "description": "Number of backup log files to keep.",
         "title": "Backup Count"
      },
      "log_format": {
         "anyOf": [
            {
               "type": "string"
            },
            {
               "type": "null"
            }
         ],
         "default": "%(asctime)s [%(levelname)s] %(name)s: %(message)s",
         "description": "Format of the log messages.",
         "title": "Log Format"
      },
      "sim_start_time": {
         "anyOf": [
            {
               "format": "date-time",
               "type": "string"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "description": "Simulation start time.",
         "title": "Sim Start Time"
      },
      "sim_stop_time": {
         "anyOf": [
            {
               "format": "date-time",
               "type": "string"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "description": "Simulation stop time.",
         "title": "Sim Stop Time"
      },
      "start_time": {
         "anyOf": [
            {
               "format": "date-time",
               "type": "string"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "description": "Execution start time.",
         "title": "Start Time"
      },
      "time_step": {
         "default": "PT1S",
         "description": "Time step for the simulation.",
         "format": "duration",
         "title": "Time Step",
         "type": "string"
      },
      "time_scale_factor": {
         "default": 1.0,
         "description": "Time scale factor.",
         "title": "Time Scale Factor",
         "type": "number"
      },
      "time_status_step": {
         "anyOf": [
            {
               "format": "duration",
               "type": "string"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "description": "Time status step.",
         "title": "Time Status Step"
      },
      "time_status_init": {
         "anyOf": [
            {
               "format": "date-time",
               "type": "string"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "description": "Time status init.",
         "title": "Time Status Init"
      },
      "command_lead": {
         "default": "PT0S",
         "description": "Command lead time.",
         "format": "duration",
         "title": "Command Lead",
         "type": "string"
      },
      "required_apps": {
         "description": "List of required applications.",
         "items": {
            "type": "string"
         },
         "title": "Required Apps",
         "type": "array"
      },
      "init_retry_delay_s": {
         "default": 5,
         "description": "Initial retry delay in seconds.",
         "title": "Init Retry Delay S",
         "type": "integer"
      },
      "init_max_retry": {
         "default": 5,
         "description": "Initial maximum retry attempts.",
         "title": "Init Max Retry",
         "type": "integer"
      },
      "set_offset": {
         "default": true,
         "description": "Set offset.",
         "title": "Set Offset",
         "type": "boolean"
      },
      "shut_down_when_terminated": {
         "default": false,
         "description": "Shut down when terminated.",
         "title": "Shut Down When Terminated",
         "type": "boolean"
      },
      "is_scenario_time_step": {
         "default": true,
         "description": "If True, time_step is in scenario time and won't be scaled. If False, time_step is in wallclock time and will be scaled by the time scale factor.",
         "title": "Is Scenario Time Step",
         "type": "boolean"
      },
      "is_scenario_time_status_step": {
         "default": true,
         "description": "If True, time_status_step is in scenario time and won't be scaled. If False, time_status_step is in wallclock time and will be scaled by the time scale factor.",
         "title": "Is Scenario Time Status Step",
         "type": "boolean"
      }
   }
}

Fields:
Validators:
field backup_count: int | None = 5

Number of backup log files to keep.

Validated by:
field command_lead: timedelta = datetime.timedelta(0)

Command lead time.

Validated by:
field enable_file_logging: bool | None = False

Enable file logging.

Validated by:
field init_max_retry: int = 5

Initial maximum retry attempts.

Validated by:
field init_retry_delay_s: int = 5

Initial retry delay in seconds.

Validated by:
field is_scenario_time_status_step: bool = True

If True, time_status_step is in scenario time and won’t be scaled. If False, time_status_step is in wallclock time and will be scaled by the time scale factor.

Validated by:
field is_scenario_time_step: bool = True

If True, time_step is in scenario time and won’t be scaled. If False, time_step is in wallclock time and will be scaled by the time scale factor.

Validated by:
field log_dir: str | None = 'logs'

Directory path for log files.

Validated by:
field log_filename: str | None = None

Path to the log file.

Validated by:
field log_format: str | None = '%(asctime)s [%(levelname)s] %(name)s: %(message)s'

Format of the log messages.

Validated by:
field log_level: str | None = 'INFO'

Logging level (DEBUG, INFO, WARNING, ERROR, CRITICAL).

Validated by:
field max_bytes: int | None = 10485760

Maximum size of the log file in bytes. Default is 10MB.

Validated by:
field required_apps: List[str] [Optional]

List of required applications.

Validated by:
field set_offset: bool = True

Set offset.

Validated by:
field shut_down_when_terminated: bool = False

Shut down when terminated.

Validated by:
field sim_start_time: datetime | None = None

Simulation start time.

Validated by:
field sim_stop_time: datetime | None = None

Simulation stop time.

Validated by:
field start_time: datetime | None = None

Execution start time.

Validated by:
field time_scale_factor: float = 1.0

Time scale factor.

Validated by:
field time_status_init: datetime | None = None

Time status init.

Validated by:
field time_status_step: timedelta | None = None

Time status step.

Validated by:
field time_step: timedelta = datetime.timedelta(seconds=1)

Time step for the simulation.

Validated by:
validator scale_time  »  all fields

Example:

  manager:
    sim_start_time: "2019-03-01T23:59:59+00:00"
    sim_stop_time: "2019-03-10T23:59:59+00:00"
    start_time:
    time_step: "0:00:01"
    time_scale_factor: 288
    time_status_step: "0:00:01"
    is_scenario_time_status_step: False
    time_status_init: "2019-03-01T23:59:59+00:00"
    command_lead: "0:00:05"
    required_apps:
      - manager
      - planner
      - appender
      - simulator
    init_retry_delay_s: 5
    init_max_retry: 5
    set_offset: True
    shut_down_when_terminated: False
    enable_file_logging: True
    log_dir: "logs"
    log_level: "DEBUG"
    max_bytes: 10485760
    backup_count: 5

Managed Application Configuration

Each managed application is identified by name under the execution.managed_applications dictionary. If a field is not provided, default values are used. Application-specific parameters can be defined under configuration_parameters.

pydantic model ManagedApplicationConfig

Show JSON schema
{
   "title": "ManagedApplicationConfig",
   "type": "object",
   "properties": {
      "enable_file_logging": {
         "anyOf": [
            {
               "type": "boolean"
            },
            {
               "type": "null"
            }
         ],
         "default": false,
         "description": "Enable file logging.",
         "title": "Enable File Logging"
      },
      "log_dir": {
         "anyOf": [
            {
               "type": "string"
            },
            {
               "type": "null"
            }
         ],
         "default": "logs",
         "description": "Directory path for log files.",
         "title": "Log Dir"
      },
      "log_filename": {
         "anyOf": [
            {
               "type": "string"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "description": "Path to the log file.",
         "title": "Log Filename"
      },
      "log_level": {
         "anyOf": [
            {
               "type": "string"
            },
            {
               "type": "null"
            }
         ],
         "default": "INFO",
         "description": "Logging level (DEBUG, INFO, WARNING, ERROR, CRITICAL).",
         "title": "Log Level"
      },
      "max_bytes": {
         "anyOf": [
            {
               "type": "integer"
            },
            {
               "type": "null"
            }
         ],
         "default": 10485760,
         "description": "Maximum size of the log file in bytes. Default is 10MB.",
         "title": "Max Bytes"
      },
      "backup_count": {
         "anyOf": [
            {
               "type": "integer"
            },
            {
               "type": "null"
            }
         ],
         "default": 5,
         "description": "Number of backup log files to keep.",
         "title": "Backup Count"
      },
      "log_format": {
         "anyOf": [
            {
               "type": "string"
            },
            {
               "type": "null"
            }
         ],
         "default": "%(asctime)s [%(levelname)s] %(name)s: %(message)s",
         "description": "Format of the log messages.",
         "title": "Log Format"
      },
      "time_scale_factor": {
         "default": 1.0,
         "description": "Time scale factor.",
         "title": "Time Scale Factor",
         "type": "number"
      },
      "time_step": {
         "default": "PT1S",
         "description": "Time step for swe_change.",
         "format": "duration",
         "title": "Time Step",
         "type": "string"
      },
      "set_offset": {
         "default": true,
         "description": "Set offset.",
         "title": "Set Offset",
         "type": "boolean"
      },
      "time_status_step": {
         "default": null,
         "description": "Time status step.",
         "format": "duration",
         "title": "Time Status Step",
         "type": "string"
      },
      "time_status_init": {
         "default": null,
         "description": "Time status init.",
         "format": "date-time",
         "title": "Time Status Init",
         "type": "string"
      },
      "shut_down_when_terminated": {
         "default": false,
         "description": "Shut down when terminated.",
         "title": "Shut Down When Terminated",
         "type": "boolean"
      },
      "manager_app_name": {
         "default": "manager",
         "description": "Manager application name.",
         "title": "Manager App Name",
         "type": "string"
      },
      "is_scenario_time_step": {
         "default": true,
         "description": "If True, time_step is in scenario time and won't be scaled. If False, time_step is in wallclock time and will be scaled by the time scale factor.",
         "title": "Is Scenario Time Step",
         "type": "boolean"
      },
      "is_scenario_time_status_step": {
         "default": true,
         "description": "If True, time_status_step is in scenario time and won't be scaled. If False, time_status_step is in wallclock time and will be scaled by the time scale factor.",
         "title": "Is Scenario Time Status Step",
         "type": "boolean"
      }
   }
}

Fields:
Validators:
field backup_count: int | None = 5

Number of backup log files to keep.

Validated by:
field enable_file_logging: bool | None = False

Enable file logging.

Validated by:
field is_scenario_time_status_step: bool = True

If True, time_status_step is in scenario time and won’t be scaled. If False, time_status_step is in wallclock time and will be scaled by the time scale factor.

Validated by:
field is_scenario_time_step: bool = True

If True, time_step is in scenario time and won’t be scaled. If False, time_step is in wallclock time and will be scaled by the time scale factor.

Validated by:
field log_dir: str | None = 'logs'

Directory path for log files.

Validated by:
field log_filename: str | None = None

Path to the log file.

Validated by:
field log_format: str | None = '%(asctime)s [%(levelname)s] %(name)s: %(message)s'

Format of the log messages.

Validated by:
field log_level: str | None = 'INFO'

Logging level (DEBUG, INFO, WARNING, ERROR, CRITICAL).

Validated by:
field manager_app_name: str = 'manager'

Manager application name.

Validated by:
field max_bytes: int | None = 10485760

Maximum size of the log file in bytes. Default is 10MB.

Validated by:
field set_offset: bool = True

Set offset.

Validated by:
field shut_down_when_terminated: bool = False

Shut down when terminated.

Validated by:
field time_scale_factor: float = 1.0

Time scale factor.

Validated by:
field time_status_init: datetime = None

Time status init.

Validated by:
field time_status_step: timedelta = None

Time status step.

Validated by:
field time_step: timedelta = datetime.timedelta(seconds=1)

Time step for swe_change.

Validated by:
validator scale_time  »  all fields

Example:

  managed_applications:
    planner:
      time_scale_factor: 288
      time_step: "0:00:01"
      is_scenario_time_step: False
      set_offset: True
      time_status_step: "0:00:10"
      is_scenario_time_status_step: False
      shut_down_when_terminated: False
      manager_app_name: "manager"
      enable_file_logging: True
      log_dir: "logs"
      log_level: "INFO"
      max_bytes: 5242880
      backup_count: 3
      configuration_parameters:
        planning_horizon: 3600
    simulator:
      time_scale_factor: 288
      time_step: "0:00:01"
      is_scenario_time_step: False
      set_offset: True
      time_status_step: "0:00:10"
      is_scenario_time_status_step: False
      shut_down_when_terminated: False
      manager_app_name: "manager"

Channels Section

Defines the messaging channels used for communication between components. This entire section is optional. If a user wants to define each channel and queue for organizational purposes, they can do so here. Otherwise, the NOS-T Tools library will create default channels and queues.

Channels follow this structure:

channels:
  <component>:
    <message_type>:
      address: '<prefix>.<component>.<message_type>'
      bindings:
        amqp:
          is: routingKey
          exchange:
            name: <prefix>
            type: topic
            durable: false
            autoDelete: true
            vhost: /
          bindingVersion: 0.3.0

Example:

channels:
  satellite:
    location:
      address: 'sos.constellation.location'
      bindings:
        amqp:
          is: routingKey
          exchange:
            name: sos
            type: topic
            durable: false
            autoDelete: true
            vhost: /
          bindingVersion: 0.3.0
    status.mode:
      address: 'sos.constellation.status.mode'
      bindings:
        amqp:
          is: routingKey
          exchange:
            name: sos
            type: topic
            durable: false
            autoDelete: true
            vhost: /
          bindingVersion: 0.3.0
    status.ready:
      address: 'sos.constellation.status.ready'
      bindings:
        amqp:
          is: routingKey
          exchange:
            name: sos
            type: topic
            durable: false
            autoDelete: true
            vhost: /
          bindingVersion: 0.3.0
    status.time:
      address: 'sos.constellation.status.time'
      bindings:
        amqp:
          is: routingKey
          exchange:
            name: sos
            type: topic
            durable: false
            autoDelete: true
            vhost: /
          bindingVersion: 0.3.0
  manager:
    init:
      address: 'sos.manager.init'
      bindings:
        amqp:
          is: routingKey
          exchange:
            name: sos
            type: topic
            durable: false
            autoDelete: true
            vhost: /
          bindingVersion: 0.3.0
    start:
      address: 'sos.manager.start'
      bindings:
        amqp:
          is: routingKey
          exchange:
            name: sos
            type: topic
            durable: false
            autoDelete: true
            vhost: /
          bindingVersion: 0.3.0
    stop:
      address: 'sos.manager.stop'
      bindings:
        amqp:
          is: routingKey
          exchange:
            name: sos
            type: topic
            durable: false
            autoDelete: true
            vhost: /
          bindingVersion: 0.3.0
    status.mode:
      address: 'sos.manager.status.mode'
      bindings:
        amqp:
          is: routingKey
          exchange:
            name: sos
            type: topic
            durable: false
            autoDelete: true
            vhost: /
          bindingVersion: 0.3.0
    status.time:
      address: 'sos.manager.status.time'
      bindings:
        amqp:
          is: routingKey
          exchange:
            name: sos
            type: topic
            durable: false
            autoDelete: true
            vhost: /
          bindingVersion: 0.3.0

In this example YAML file, the configuration includes predefined channels for:

  1. Satellite components (location, status.mode, status.ready, status.time)

  2. Manager components (init, start, stop, status.mode, status.time)

Each channel specifies:

  • An address pattern used as the routing key

  • AMQP binding configuration including exchange properties

Using the Configuration File

Applications using the NOS-T Tools library specify the path to the YAML configuration file when initializing. The library reads this file to establish connections to the RabbitMQ broker and Keycloak authentication server and to configure the execution parameters. Refer to Creating a NOS-T Publisher-Consumer Example for an example of how the configuration file is used within the NOS-T Tools library.

Complete Configuration Example

Below is a complete example of a YAML configuration file that can be used with NOS-T Tools:

info:
  title: Novel Observing Strategies Testbed (NOS-T) YAML Configuration
  version: '1.0.0'
  description: Version-controlled configuration file for Snow Observing Systems (SOS) project
servers:
  rabbitmq:
    keycloak_authentication: False
    host: "localhost"
    port: 5672
    tls: False
    virtual_host: "/"
    message_expiration: "60000"
    delivery_mode: 2
    content_type: "text/plain"
    heartbeat: 600
    connection_attempts: 3
    retry_delay: 5
    reconnect_delay: 10
    blocked_connection_timeout: 300
    queue_max_size: 1000
    frame_max: 131072
    socket_timeout: 10.0
    stack_timeout: 15.0
  keycloak:
    host: "nost.smce.nasa.gov"
    port: 8443
    tls: True
    token_refresh_interval: 240
    realm: "NOS-T"
execution:
  general:
    prefix: sos
    wallclock_offset_refresh_interval: 10800
    ntp_host: "pool.ntp.org"
    resume_tolerance: "12:00:00"
  applications:
    dashboard:
      set_offset: False
      shut_down_when_terminated: True
      enable_file_logging: True
      log_dir: "logs"
      log_level: "INFO"
      configuration_parameters:
        refresh_rate: 5
  manager:
    sim_start_time: "2019-03-01T23:59:59+00:00"
    sim_stop_time: "2019-03-10T23:59:59+00:00"
    start_time:
    time_step: "0:00:01"
    time_scale_factor: 288
    time_status_step: "0:00:01"
    is_scenario_time_status_step: False
    time_status_init: "2019-03-01T23:59:59+00:00"
    command_lead: "0:00:05"
    required_apps:
      - manager
      - planner
      - appender
      - simulator
    init_retry_delay_s: 5
    init_max_retry: 5
    set_offset: True
    shut_down_when_terminated: False
    enable_file_logging: True
    log_dir: "logs"
    log_level: "DEBUG"
    max_bytes: 10485760
    backup_count: 5
  managed_applications:
    planner:
      time_scale_factor: 288
      time_step: "0:00:01"
      is_scenario_time_step: False
      set_offset: True
      time_status_step: "0:00:10"
      is_scenario_time_status_step: False
      shut_down_when_terminated: False
      manager_app_name: "manager"
      enable_file_logging: True
      log_dir: "logs"
      log_level: "INFO"
      max_bytes: 5242880
      backup_count: 3
      configuration_parameters:
        planning_horizon: 3600
    simulator:
      time_scale_factor: 288
      time_step: "0:00:01"
      is_scenario_time_step: False
      set_offset: True
      time_status_step: "0:00:10"
      is_scenario_time_status_step: False
      shut_down_when_terminated: False
      manager_app_name: "manager"
channels:
  satellite:
    location:
      address: 'sos.constellation.location'
      bindings:
        amqp:
          is: routingKey
          exchange:
            name: sos
            type: topic
            durable: false
            autoDelete: true
            vhost: /
          bindingVersion: 0.3.0
    status.mode:
      address: 'sos.constellation.status.mode'
      bindings:
        amqp:
          is: routingKey
          exchange:
            name: sos
            type: topic
            durable: false
            autoDelete: true
            vhost: /
          bindingVersion: 0.3.0
    status.ready:
      address: 'sos.constellation.status.ready'
      bindings:
        amqp:
          is: routingKey
          exchange:
            name: sos
            type: topic
            durable: false
            autoDelete: true
            vhost: /
          bindingVersion: 0.3.0
    status.time:
      address: 'sos.constellation.status.time'
      bindings:
        amqp:
          is: routingKey
          exchange:
            name: sos
            type: topic
            durable: false
            autoDelete: true
            vhost: /
          bindingVersion: 0.3.0
  manager:
    init:
      address: 'sos.manager.init'
      bindings:
        amqp:
          is: routingKey
          exchange:
            name: sos
            type: topic
            durable: false
            autoDelete: true
            vhost: /
          bindingVersion: 0.3.0
    start:
      address: 'sos.manager.start'
      bindings:
        amqp:
          is: routingKey
          exchange:
            name: sos
            type: topic
            durable: false
            autoDelete: true
            vhost: /
          bindingVersion: 0.3.0
    stop:
      address: 'sos.manager.stop'
      bindings:
        amqp:
          is: routingKey
          exchange:
            name: sos
            type: topic
            durable: false
            autoDelete: true
            vhost: /
          bindingVersion: 0.3.0
    status.mode:
      address: 'sos.manager.status.mode'
      bindings:
        amqp:
          is: routingKey
          exchange:
            name: sos
            type: topic
            durable: false
            autoDelete: true
            vhost: /
          bindingVersion: 0.3.0
    status.time:
      address: 'sos.manager.status.time'
      bindings:
        amqp:
          is: routingKey
          exchange:
            name: sos
            type: topic
            durable: false
            autoDelete: true
            vhost: /
          bindingVersion: 0.3.0