You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
-[Quality of Service (QoS)](#quality-of-service-qos)
@@ -139,6 +137,12 @@ The RTI MedTech Reference Architecture demonstrates use cases and capabilities o
139
137
140
138
Use the module-specific READMEs when you want to run a demo. They describe what each workflow launches, why it exists, and the exact `launch.py` commands to use from the repository root.
141
139
140
+
`launch.py` accepts either a single module (`python3 launch.py <module> [apps ...] [-s]`) or a **predefined scenario** that launches a curated set of applications across modules in one command (`python3 launch.py --scenario <name> [-s]`). Scenarios are declared in [`resource/config/scenarios.json`](./resource/config/scenarios.json) and cover common multi-component workflows (e.g. `record`, `replay`, `teleop-or-side`, `security-threat`). List them with:
141
+
142
+
```bash
143
+
python3 launch.py --list-scenarios
144
+
```
145
+
142
146
### [Module 01: Digital Operating Room](./modules/01-operating-room/)
143
147
144
148
### [Module 02: RTI Recording Service & RTI Replay Service](./modules/02-record-playback/)
@@ -220,10 +224,12 @@ This reference architecture defines the following QoS Profiles in [Qos.xml](./sy
220
224
| Qos Library | Qos Profile | Intended Use
221
225
| ----------- | --------- | -----------
222
226
| System | DefaultParticipant | Common, or base, *system configuration* (e.g. transport, network interfaces, discovery, thread priorities, etc.)
227
+
| System | WanConfig | WAN transport (UDPv4_WAN) configuration, used by Module 03: Remote Teleoperation
223
228
| DataFlow | Streaming | Periodic data that is published at a high frequency (i.e. frequencies <1 second)
224
229
| DataFlow | Status | "Current status"-like data, sent once at the beginning of operation and again only upon change to the status
225
230
| DataFlow | Command | Data that represents commands or trigger some action in the system
226
231
| DataFlow | Heartbeat | Assert and detect the presence of system devices
232
+
| DataFlow | SecureLog | Reliable, transient-local delivery for the DDS Security builtin secure-log topic
227
233
228
234
### Domains & Topics
229
235
@@ -242,11 +248,12 @@ Legend:
242
248
243
249
This reference architecture defines the following Domains in [DomainLibrary.xml](./system_arch/xml_app_creation/DomainLibrary.xml):
244
250
245
-
| Domain | Intended Use
246
-
| ------ | -----------
247
-
| OperationalDataDomain | Real-time operational medical device data
251
+
| Domain | Domain ID | Intended Use
252
+
| ------ | --------- | -----------
253
+
| OperationalDataDomain | 0 | Real-time operational medical device data
254
+
| SecureLogDomain | 0 | DDS Security builtin secure logging (consumed by the SecureLogReader participant)
248
255
249
-
*Note, this reference architecture defines just a single Domain. As a Connext system design scales over time, additional domains could be defined for monitoring, logging, etc. Those additional domains should not affect the performance of our operational data, and therefore should belong to a different domain.*
256
+
*Note, both domains are defined with the same Domain ID (`0`), so they currently resolve to the **same** DDS domain. `SecureLogDomain` is defined separately to keep the secure-logging configuration distinct, so that as a Connext system design scales over time, logging (and other concerns such as monitoring) can be moved to a different Domain ID without touching the operational data configuration. Isolating such data on a separate domain ensures it does not affect the performance of operational data.*
250
257
251
258
This reference architecture defines the following Topics in [DomainLibrary.xml](./system_arch/xml_app_creation/DomainLibrary.xml):
252
259
@@ -257,6 +264,7 @@ This reference architecture defines the following Topics in [DomainLibrary.xml](
257
264
| OperationalDataDomain | `t/DeviceHeartbeat` | Assert that a unique system component is alive
258
265
| OperationalDataDomain | `t/DeviceCommand` | Command initiating a status (e.g. `START`, `SHUTDOWN`) to a unique system component
259
266
| OperationalDataDomain | `t/Vitals` | Data representative of a unique patient's collected vital signs
267
+
| SecureLogDomain | `DDS:Security:LogTopicV2` | DDS Security builtin logging topic, carrying the `DDSSecurity::BuiltinLoggingTypeV2` type
260
268
261
269
*Note, this reference architecture defines a unique Topic for each Data Type defined. While a Topic may only reference a single Data Type, a multi-purpose Data Type can be associated with multiple Topics. It is a **best practice** to limit the number of defined Topics, but in doing so, it may be feasible to reuse a Data Type for several Topics.*
262
270
@@ -302,6 +310,7 @@ This reference architecture defines the following DomainParticipants in [Partici
302
310
| OperationalDataDomain | Orchestrator | `t/DeviceStatus`, `t/DeviceHeartbeat` | `t/DeviceCommand` | Administer device-level commands and monitor presence and status of all devices.
| OperationalDataDomain | PatientMonitor | `t/DeviceCommand`, `t/Vitals` | `t/DeviceStatus`, `t/DeviceHeartbeat` | Process and display patient vitals.
313
+
| SecureLogDomain | SecureLogReader | `DDS:Security:LogTopicV2` | -- | Subscribe to the DDS Security builtin secure-log topic.
305
314
306
315
*Note, this reference architecture utilizes one DomainParticipant for each device application. It is a **best practice** to define one DomainParticipant per application. However, in more complex systems, an application may be required to operate on multiple Domains. This requires defining multiple DomainParticipants for those applications that run in parallel.*
307
316
@@ -315,8 +324,8 @@ The reference architecture configures security in [SecureAppsQos.xml](./system_a
CI uses a pinned Ruff version (see [Upgrading Ruff](#upgrading-ruff)). If
140
-
pre-commit and CI share the same pin, a clean local commit will not produce
141
-
lint failures in CI.
141
+
|`lint` (Lint & Format) | Runs **all** pre-commit hooks across the repo (`pre-commit/action` with `--all-files`) — the same ruff, ruff-format, codespell, clang-format, rumdl, and hygiene hooks you run locally. |
142
+
|`test` (Build & Test) | Installs Connext (apt) and Python deps, builds all C++ modules with `python build.py`, generates the system and Module 04 security artifacts, starts Xvfb, then runs the full suite from the repo root with `python -m pytest -v -m "not build_pipeline"` and uploads `results.xml`. |
143
+
144
+
Because the `lint` job runs `pre-commit` itself, CI and your local hooks execute
145
+
the **exact same** hook versions (pinned in `.pre-commit-config.yaml`). A clean
146
+
local commit will therefore not produce lint failures in CI. See
147
+
[Upgrading Ruff](#upgrading-ruff) for how the Ruff pin is managed.
142
148
143
149
## Testing CI Locally with act (Optional)
144
150
@@ -191,8 +197,9 @@ docker compose -f tests/docker/docker-compose.yml run --rm --build test \
191
197
modules/01-operating-room/tests/test_types.py -v
192
198
```
193
199
194
-
> **Note:** The Docker default command runs `pytest -v` via the
195
-
> test entrypoint. It executes functional/behavioral tests. It does **not** run Ruff lint,
200
+
> **Note:** With no arguments, the Docker test entrypoint runs `pytest` over the
201
+
> whole repo (it passes any arguments you supply straight through to pytest).
202
+
> It executes functional/behavioral tests. It does **not** run Ruff lint,
196
203
> rumdl markdown lint, or clang-format; those are enforced by pre-commit
197
204
> (locally) and the CI lint job (on push/PR).
198
205
@@ -228,37 +235,37 @@ Before opening a PR, verify:
228
235
229
236
## Upgrading Ruff
230
237
231
-
Ruff is pinned in two places so that local pre-commit hooks and CI produce
232
-
identical results. When upgrading, update **both together**:
238
+
The CI `lint` job runs `pre-commit`, so there is a **single** Ruff pin that
239
+
governs both local hooks and CI: the `astral-sh/ruff-pre-commit` revision in
240
+
`.pre-commit-config.yaml`. Bump that one pin to upgrade Ruff everywhere.
Copy file name to clipboardExpand all lines: modules/02-record-playback/README.md
+2Lines changed: 2 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -48,6 +48,8 @@ Module-specific notes:
48
48
## Run the Demo
49
49
50
50
> Important: Run the commands below from the repository root. `launch.py` lives at the project root and is the single runtime entrypoint for this project.
51
+
>
52
+
> Tip: the predefined `record` and `replay` scenarios bundle the operating room apps and the corresponding service into a single command (e.g. `python3 launch.py --scenario record`). The step-by-step flow below instead runs them in separate terminals so you can start and stop the service independently of the OR apps. Run `python3 launch.py --list-scenarios` to see all scenarios.
Copy file name to clipboardExpand all lines: modules/04-security-threat/README.md
+2Lines changed: 2 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -87,6 +87,8 @@ Ensure the RTI Security Plugins are installed on every machine that will run a s
87
87
## Run the Demo
88
88
89
89
> Important: Run the commands below from the repository root. `launch.py` lives at the project root and is the single runtime entrypoint for this project.
90
+
>
91
+
> Tip: the predefined `security-threat`, `threat-inject`, and `threat-exfiltrate` scenarios bundle the operating room apps with the threat application(s) in a single command (e.g. `python3 launch.py --scenario threat-inject`). The step-by-step flow below runs them in separate terminals so you can switch the OR between unsecured and secured modes independently. Run `python3 launch.py --list-scenarios` to see all scenarios.
This QoS profile acts as a common base configuration for all DomainParticipants in the system to provide a level of consistency. It inherits from a builtin profile called *BuiltinQosLib::Generic.Common* through the `base_name` XML attribute.
85
88
89
+
#### ***SystemLibrary::WanConfig* profile**
90
+
91
+
This QoS profile configures the DomainParticipant for communication over the Wide Area Network (WAN). It inherits from *BuiltinQosLib::Generic.Common* and additionally:
92
+
93
+
- Enables the **UDPv4_WAN** builtin transport (via the `transport_builtin` mask), which provides the RTI Real-Time WAN Transport's NAT-traversal capabilities.
94
+
- Shortens the participant liveliness assert period to speed up discovery over the WAN.
95
+
96
+
It is used by Module 03: Remote Teleoperation. See the [Module 03 README](../../modules/03-remote-teleoperation/README.md) for the WAN scenarios that rely on it.
97
+
86
98
### ***DataFlowLibrary***
87
99
88
100
*DataFlowLibrary* contains the following QoS profiles (`<qos_profile>`):
@@ -93,6 +105,7 @@ This QoS profile acts as a common base configuration for all DomainParticipants
93
105
| [*Status*](#dataflowlibrarystatus-profile) | *RELIABLE* | *KEEP_LAST 1* | *TRANSIENT_LOCAL* | -- | "Current status"-like Topics, sent once at the beginning of operation and again only upon change to the status.
94
106
| [*Command*](#dataflowlibrarycommand-profile) | *RELIABLE* | *KEEP_LAST 1* | *VOLATILE* | -- | Topics that transmit commands or trigger some action in the system.
95
107
| [*Heartbeat*](#dataflowlibraryheartbeat-profile) | *BEST_EFFORT* | *KEEP_LAST 1* | *VOLATILE* | *200 ms* | To assert and detect the presence of system components.
108
+
| [*SecureLog*](#dataflowlibrarysecurelog-profile) | *RELIABLE* | *KEEP_LAST 64* | *TRANSIENT_LOCAL* | -- | Delivery of the DDS Security builtin secure-log Topic.
96
109
97
110
#### ***DataFlowLibrary::Streaming* profile**
98
111
@@ -141,6 +154,16 @@ Since this QoS profile uses *BEST_EFFORT* Reliability QoS, a minimal amount of s
141
154
142
155
>**Best Practice:** Publish samples on Topics for which the DataWriter QoS defines a finite Deadline QoS period, at a rate that is 2x-4x that of the configured Deadline period. This ensures an infrequent drop in sample does not falsely trigger the `REQUESTED_DEADLINE_MISSED` status for DataReaders.
143
156
157
+
#### ***DataFlowLibrary::SecureLog* profile**
158
+
159
+
This QoS profile is used by the *dr/SecureLog* DataReader (under the *dp/SecureLogReader* DomainParticipant) to consume the RTI Security Plugins builtin secure-logging Topic.
160
+
161
+
It inherits from *BuiltinQosLib::Generic.KeepLastReliable.TransientLocal* and applies:
162
+
163
+
-*RELIABLE* Reliability QoS and *TRANSIENT_LOCAL* Durability QoS, matching the QoS the Security Plugins use for their builtin secure-logging writers.
164
+
-*KEEP_LAST, depth=64* History QoS (with a matching `max_samples` resource limit), the default history depth used by the secure-logging writers.
165
+
- Dynamic memory allocation for the DataReader cache, since the secure-logging type is unbounded.
166
+
144
167
## Application-specific QoS: [NonSecureAppsQos.xml](NonSecureAppsQos.xml) and [SecureAppsQos.xml](SecureAppsQos.xml)
145
168
146
169
In addition to the [Qos.xml](#qosxml) file, this reference architecture describes *per-application* QoS in 2 additional XML files:
0 commit comments