-
Notifications
You must be signed in to change notification settings - Fork 1
Configuration Reference
This page is for whoever writes s9terpsync.yaml — the single file that describes your institution, your Slate source, your Ethos connection, and how S9TerpSync behaves at runtime. It walks the shipped example, config/s9terpsync.example.yaml, top to bottom, and documents the three config subcommands you use to create, check, and inspect that file.
It doesn't cover what your Ethos application needs to expose, or what Banner grants your integration user needs — that's Ethos & Banner Prerequisites. It doesn't cover the separate diagnose command either — that's a top-level CLI command, not part of config, and it's covered on Diagnostics & Troubleshooting.
Before walking the fields: three of them (sources.sftp.passwordSecretRef, sources.slateApi.authenticationSecretRef, ethos.apiKeySecretRef) hold a reference to a secret, never the secret itself. A secret reference is one of two forms:
-
file:/absolute/path— read the trimmed contents of the file at that absolute path. -
env:NAME— read the environment variableNAME.
No raw password, token, or API key is ever written directly into the YAML file. This is enforced by the config schema (any key ending in SecretRef must match one of those two patterns) and by config show (see below), which redacts every *SecretRef value regardless of which form it uses.
The full annotated example ships at config/s9terpsync.example.yaml. What follows walks it top to bottom.
schemaVersion: 1
institutionId: example-university
environment: development
stateDirectory: /var/lib/s9terpsync-
schemaVersion— always1. This is the only value the current schema accepts; it exists so a future breaking change to the configuration shape has somewhere to hang a version bump. -
institutionId— a non-empty string identifying your institution. It's the valueconfig validateechoes back on success and has no other runtime meaning beyond identification. -
environment— eitherdevelopmentorproduction. This isn't cosmetic:productiontightens validation elsewhere in the file (for example, it requires an SFTP host key pin and an HTTPS Slate API URL — see the notes undersourcesbelow). -
stateDirectory— an absolute path (must start with/) where S9TerpSync keeps its file-based state: run manifests, locks, and audit records. There's no database to provision; this directory is where that data lives instead.
http:
host: 127.0.0.1
port: 4010The bind address and port for S9TerpSync's local HTTP surface. Both fields default to the values shown (127.0.0.1 and 4010) if omitted.
schedule:
enabled: false
cron: '0 2 * * *'
timeZone: America/Chicago
mode: DRY_RUN
source: auto-
enabled— whether the service runs on a schedule at all. Whenfalse, the rest of this block is still validated but has no effect until you flip it on. -
cron— a standard cron expression for when scheduled runs fire. -
timeZone— the IANA time zone the cron expression is interpreted in (for exampleAmerica/Chicago). -
mode—DRY_RUNorLIVE. This is required wheneverenabledistrue— an enabled schedule with no mode fails validation.DRY_RUNexercises the full pipeline (source read, matching, crosswalks, target planning) without writing to Ethos;LIVEactually mutates Banner data through Ethos. -
source— which configured source a scheduled run reads from:auto(pick whichever ofsftp/slateApiis enabled — see thesourcesblock; exactly one is expected to be enabled in practice),sftp, orslate-api.
sources:
sftp:
enabled: true
host: sftp.example.edu
port: 22
operationTimeoutMs: 5000
username: s9terpsync
passwordSecretRef: file:/etc/s9terpsync/secrets/sftp-password
hostKeySha256: sha256:aaaa...
claimPath: /claim
inboundPath: /inbound
processedPath: /processed
reportsPath: /reports
fileNamePattern: '^slate.*'
delimiter: '|'-
enabled— whether the SFTP source is active. At least one ofsources.sftporsources.slateApimust be enabled; the config is invalid if neither is. -
host,port— the SFTP server address.portdefaults to22. -
operationTimeoutMs— timeout, in milliseconds, applied to individual SFTP operations. Defaults to5000. -
username— the SFTP login user. -
passwordSecretRef— a secret reference (see above) to the SFTP password. At least one ofpasswordSecretReforprivateKeySecretRef(not shown in the example, but accepted) is required for authentication. -
hostKeySha256— the pinned SFTP host key, formattedsha256:<64 lowercase hex characters>. This is required in production, and also required in development unless the host is a loopback address (127.0.0.1,localhost,::1) — pinning a real remote host key is expected even in development. -
claimPath,inboundPath,processedPath,reportsPath— absolute, normalized remote directory paths S9TerpSync uses to claim, read, and archive files, and to write run reports.claimPathmust differ from each of the other three. -
fileNamePattern— a regular expression (JavaScript syntax) matched case-insensitively against filenames ininboundPathto select which files this source picks up. -
delimiter— the single-character field delimiter for the fixed-format Slate export files read from SFTP. Defaults to|.
sources:
slateApi:
enabled: false
baseUrl: http://localhost:4001/slate/applicants
authenticationSecretRef: file:/etc/s9terpsync/secrets/slate-api-token
requestMethod: GET
responseFormat: flat-json
timeoutMs: 5000
retry:
maxAttempts: 3
retryableStatusCodes: [429, 500, 502, 503, 504]
maxDelayMs: 1000
pagination:
strategy: none
pageSize: 500
pageParameter: page
offsetParameter: offset
limitParameter: limit
cursorParameter: cursor
recordsJsonPath: records
nextCursorJsonPath: nextCursor
maxPages: 100
csv:
delimiter: ','-
enabled— whether the Slate API source is active (same at-least-one-source rule assftpabove). -
baseUrl— the Slate API endpoint. Outside development-loopback addresses, this must be HTTPS; inproductionit must always be HTTPS. It must not embed credentials (nouser:pass@userinfo). -
authenticationSecretRef— a secret reference to the Slate API auth token. -
requestMethod—GETorPOST. -
responseFormat—flat-jsonorcsv. -
timeoutMs— request timeout in milliseconds. Defaults to5000.
retry — how failed Slate API requests are retried:
-
maxAttempts— up to5. Defaults to3. -
retryableStatusCodes— HTTP status codes that trigger a retry. Defaults to[429, 500, 502, 503, 504]. -
maxDelayMs— the retry backoff ceiling, in milliseconds. Defaults to1000.
pagination — how multi-page Slate API responses are walked:
-
strategy—none,page,offset, orcursor. Defaults tonone.csvresponses only supportnone— pairingresponseFormat: csvwith any other pagination strategy fails validation. -
pageSize— records requested per page. Defaults to500. -
pageParameter,offsetParameter,limitParameter,cursorParameter— the query parameter names used forpage,offset/limit, andcursorpagination respectively, so this can be adapted to whatever parameter names your Slate API instance expects. -
recordsJsonPath,nextCursorJsonPath— dot-separated JSON paths (into the response body) for locating the records array and, for cursor pagination, the next cursor value. -
maxPages— an upper bound on pages fetched per run, as a safety limit. Defaults to100.
csv — only meaningful when responseFormat: csv:
-
delimiter— the single-character CSV field delimiter. Defaults to,.
ethos:
baseUrl: https://integrate.elluciancloud.com
apiKeySecretRef: file:/etc/s9terpsync/secrets/ethos-api-key
timeoutMs: 30000
retry:
maxAttempts: 3
initialDelayMs: 250
retryableStatusCodes: [500, 502, 503, 504]
maxDelayMs: 1000
multiplier: 2
resourceVersions:
race: '6'
addressType: '6'
alternativeCredentialType: '1'
ethnicity: '6'
interest: '6'
relationshipType: '1.0.0'
personCredential: '11'
personLookup:
credentialContractVerified: false
slateCredentialTypeId: null-
baseUrl— your Ethos environment's base URL (for example,https://integrate.elluciancloud.com). -
apiKeySecretRef— a secret reference to the Ethos API key. What that key needs to be authorized for — which authoritative sources it's connected to, and which Ethos resources are granted — is covered on Ethos & Banner Prerequisites, not here. -
timeoutMs— request timeout in milliseconds for Ethos calls.
retry — Ethos request retry behavior:
-
maxAttempts— up to5. Defaults to3. -
initialDelayMs— the first retry delay, in milliseconds. Defaults to250. Must not exceedmaxDelayMs. -
retryableStatusCodes— defaults to[500, 502, 503, 504]. -
maxDelayMs— the backoff ceiling. Defaults to1000. -
multiplier— the backoff growth factor between attempts (1–10). Defaults to2.
resourceVersions — pins the exact version of each version-sensitive Ethos resource this config expects the Ethos application to expose: race ('6'), addressType ('6'), alternativeCredentialType ('1'), ethnicity ('6'), interest ('6'), relationshipType ('1.0.0'), personCredential ('11'). These are the shipped defaults and, for this version of S9TerpSync, the only values the schema currently accepts. Which Ethos resources these keys correspond to, and why a version mismatch fails at runtime rather than at config-validate time, is covered on Ethos & Banner Prerequisites — that page also lists the other Ethos resources this version uses that aren't version-pinned in config at all.
personLookup — tuning for how S9TerpSync looks up an existing person record in Ethos before creating one:
-
credentialContractVerified— boolean, defaults tofalse. -
slateCredentialTypeId— a UUID identifying the Slate-ID credential type in Ethos, ornullif not set.
referenceData:
enabledDomains: []
pageSize: 100-
enabledDomains— which reference-data domains to pull and cache from Ethos: any ofrace,addressType,alternativeCredentialType,ethnicity,interest,relationshipType, with no duplicates. Defaults to an empty list. -
pageSize— how many reference-data records to request per page when populating the cache. Defaults to100.
crosswalks:
- domain: gender
sourceValue: Female
targetCode: F
enabled: trueEach entry maps one source-side value to a target-side code (and/or ID) within a named domain:
-
domain— a non-blank string naming the crosswalk domain (for examplegender). -
sourceValue— the value as it appears in the Slate-side data. -
targetCode— the code to map it to on the Ethos/Banner side. (A crosswalk entry may instead — or additionally — supplytargetId; at least one oftargetCode/targetIdis required, though onlytargetCodeappears in the shipped example.) -
enabled— whether this crosswalk entry is active.
Defaults to an empty list if omitted.
retention:
runs:
action: retain
reports:
action: retain
referenceCache:
action: retain
archives:
action: retainFour independent retention policies, one each for run manifests, run reports, the reference-data cache, and archived files. Each accepts an action of retain, archive, or delete (defaulting to retain), with one exception: archives cannot itself use archive as its action (only retain or delete) — archiving the archive location doesn't mean anything. Choosing archive or delete for any policy also requires an afterDays value (a positive integer) stating how many days to wait before that action applies; that key isn't shown in the example because every policy here is retain, which doesn't need one. See Retention, Replay & Recovery for how these policies are applied.
Three config subcommands cover the full lifecycle of s9terpsync.yaml: generating a starting point, checking it's valid, and inspecting the effective configuration without exposing secrets.
s9terpsync config init --source <source> --institution-id <id> --environment <environment> [--out <path>]
-
--source(required) —sftp,slate-api, orboth. Determines whichsources.*block(s) the generated file includes. -
--institution-id(required) — becomesinstitutionIdin the generated file. -
--environment(required) —developmentorproduction. Also affects the generatedsources.slateApi.baseUrl(a loopback URL fordevelopment, an HTTPS placeholder forproduction). -
--out(optional) — write the generated YAML to this path instead of printing it to stdout. The file is written with mode0640and fails if the target already exists (it will not silently overwrite an existing config).
Example:
s9terpsync config init --source both --institution-id example-university --environment development --out ./s9terpsync.yamls9terpsync config validate --file <path>
-
--file(required) — path to the YAML file to validate.
Loads and validates the file against the full configuration schema (all the field rules described above — required-secret combinations, production-only checks, cross-field constraints, and so on). On success it prints configuration valid for <institutionId>. On failure it prints one <location>: <problem> line per validation failure to stderr and exits non-zero, so a config with several unrelated issues (say, a bad hostKeySha256 and a duplicate crosswalk domain) reports all of them in one pass rather than stopping at the first.
s9terpsync config show --file <path> --redacted
-
--file(required) — path to the YAML file to load. -
--redacted(required) — there is no unredacted show mode. Omitting--redactedfails the command outright (config showthrows before it does anything else) rather than printing secrets. When present, it loads and validates the file the same wayconfig validatedoes, then prints the effective configuration as YAML with every*SecretRefvalue replaced by<redacted>— this includes values defaulted in by the schema, not just the ones you wrote explicitly. The output carries a header noting it's for display only and shouldn't be used as runtime input.
Example:
s9terpsync config show --file ./s9terpsync.yaml --redacted-
Ethos & Banner Prerequisites — what your Ethos application and Banner integration user need before
ethos.apiKeySecretRefandethos.resourceVersionsmean anything at runtime. -
Diagnostics & Troubleshooting — the separate, top-level
diagnose --file <path>command, which checks a config file against your live environment (connectivity, credentials, and so on) rather than just its shape. - Running S9TerpSync — using a validated config file to actually run a sync.