DOCA Management Service — Tasks
Where to start: The order is configure → build → modify → run → test → debug. The ## test verb is an iterative loop, not a
one-shot pass — see the eval-loop overlay in ## test below. For DMS,
build and modify are about daemon configuration (SystemD unit,
flags, YANG-instance fragments), not about compiling source.
These verbs cover the in-scope DMS operational workflows for an
external operator deploying and using DMS. Every step assumes the
operator has consulted the live public DMS guide on docs.nvidia.com
and is using it as the authoritative reference; this file prescribes
the order and what to look up where, not a copy-paste runbook.
If the version-matched live guide is unavailable, inspect the
installed dmsd --help, SystemD unit, and installed documentation.
If none is available for the installed release, stop and report the
version/source gap; do not fall back to remembered flags or paths.
configure
Preparing the management endpoint and choosing a deployment shape.
- Confirm the env is healthy first. This skill expects DOCA to be
installed at the management endpoint (host, BlueField Arm, or pod
image base). If that has not been verified, run
doca-setup ## testfirst. If the user has no install yet, route todoca-setup ## no-installfor the public NGC DOCA container path. Do not return until thedoca-setup ## testinstall/version, capability, and smoke checks are green for the management endpoint; run that check once. If it errors or cannot complete under its documented timeout, abort the DMS workflow and route the captured result todoca-setup ## debug; do not retry from this skill. A package merely being present is not sufficient. - Identify the deployment shape. Read the public DMS guide's "Service Deployment" section and map the user's situation to one of the documented shapes (Host non-DPU / BlueField Arm / Kubernetes pod). Each shape has its own "Prerequisites" subsection — read it before any further step.
- Identify the management protocol scope. Confirm whether the
user needs gNMI (data configuration), gNOI (system operations), or
both. gNMI Subscribe streaming IS supported (
STREAMwithSAMPLE1s–60s andONCE; onlyPOLL/Aggregationare Unimplemented pergnxi/gnmi/server.go). For a turnkey, productized telemetry-aggregation surface separate from DMS's own gNMI Subscribe, route to the DOCA Telemetry Service (DTS) instead. - Plan the authentication mode. Choose one of the four
documented modes (localhost-only / PAM / credentials / mTLS) and
read the Security Best Practices subsection before committing.
Localhost-only is for development only and must not be exposed.
Record the bind scope, credential/certificate source, server trust
policy, client-auth requirement, and
-allowed_usersbehavior from the live guide; reject a plan that weakens any of those compared with the matching documented recipe. - Plan user authorization. Identify the human/service users who
will issue DMS commands over gRPC and ensure they are in the
-allowed_userslist (defaultroot; enforced byisUserAllowedingnxi/utils/credentials/credentials.go). ThedmsgroupUnix group is a separate,dmspe-only gate — add a user to it only if they also need to invoke thedmspeprivileged helper directly on the endpoint.
build
DMS is a service, not a library. There is no DMS application
artifact for the operator to build — the daemon (dmsd/dmspe) ships
with the DOCA install, and clients are standard gNMI/gNOI tooling that
the operator already has.
If the user is asking how to build a gNMI/gNOI client in their own language, the right routing is:
- C / C++ — generic gRPC + gNMI/gNOI client patterns. Outside DMS
scope. The DMS-specific contribution is the path inventory and the
operation list documented in
CAPABILITIES.md ## gNMI client surfaceand## gNOI client surface. - Other languages (Go / Python / Rust / …) — same answer. Use the standard gNMI/gNOI client libraries for that language; DMS does not author wrappers and does not maintain language-specific clients.
If the user is instead asking about building a DOCA application in
the general sense (linking against libdoca-*), that is not a DMS
question — route them to
doca-programming-guide ## build
and the matching libs/<library> skill.
modify
DMS does not have a "modify a sample" workflow analogous to DOCA libraries; there is no DMS sample program a user starts from. The DMS analog of "modify" is adapt the documented launch / auth / deployment recipe to the user's environment:
- Start from the documented recipe. Identify the public guide's recipe that matches the user's deployment shape and authentication mode. Quote it; do not author a new one.
- Diff against the user's environment. Note the specific
substitutions the user must make: hostnames, certificate paths,
allowed_userslists for PAM mode, port assignments, network-exposure decisions. - Apply minimum-change. Change only what the user's environment forces. Every additional deviation from the documented recipe widens the surface for an unintended exposure.
- Re-validate against the Security Best Practices subsection.
Each substitution is a chance to accidentally weaken the documented
posture. Re-check the five recorded controls from configure step 4:
bind scope, secret/certificate source, server trust, client auth,
and
-allowed_users. Any unapproved widening (for example binding localhost-only mode to0.0.0.0) is a stop condition.
run
Bringing up dmsd and exercising it.
- Decide SystemD vs manual launch. SystemD is the documented recommended path for production. Manual launch is appropriate for bring-up, debugging, and walking the documented advanced configurations.
- Apply the documented launch flags. Flag inventory lives under
"DMS Server Flags (
dmsd)" in the public guide, partitioned into General & Provisioning / Authentication & Security / Authentication Method / Security flag families. Quote flags from the live guide; do not infer flags from generic gRPC knowledge. - Verify the daemon is reachable. Use a documented gNMI
Getagainst a known-supported State path as a connectivity probe. "Documented" matters: aGetagainst an unsupported path returns an error fromdmsdregardless of whether the daemon is healthy. - Verify authorization works as expected. Confirm a user in the
-allowed_userslist can issue gRPC commands and a user outside it cannot. If the test fails, the failure is at the authorization layer, not the protocol layer — see## debugstep 2. - Issue the user's first real
Setagainst a documented path. ThenGetthe corresponding State path to confirm the change landed. TheSet/Getpattern across Configuration vs State branches is the documented validation idiom.
For gNOI operations: read the operation's documented sub-operation
list first, then issue. Operations like OS install, Reboot, and
Factory-reset change the managed device state in non-trivial ways —
the operator should know which sub-operation they are invoking and
why.
⚠️ Destructive and irreversible — confirm before issuing.
OS install,Reboot,Factory-reset, and managed-file deletion are service-impacting and cannot be undone: they can take a production BlueField or ConnectX offline or wipe its configuration. Before issuing any of them the agent MUST (1) verify the target device identity and (2) obtain authorization bound to that target and action: an explicit user reply in an interactive session or an approved-system authorization artifact in unattended execution. Otherwise stop withconfirmation_required. Never issue them speculatively or as an implicit side effect of another task.
test
DMS has no "compile and unit-test" workflow — testing is operational.
## test is a bounded iterative loop, not a one-shot pass. Every
configuration mutation (auth mode, listener, -allowed_users
membership, persistency setting) re-opens the smoke sweep. Skipping the re-run
after a mutation is the failure mode this loop replaces. Permit one
mutation-and-rerun cycle total per test invocation, regardless of which
back-edge or failure class consumes it. If the second sweep reveals any
failure, including a different failure class, do not take another
back-edge. Return a diagnostic bundle to the operator containing all
smoke results, collected debug-layer outputs, and the capability
snapshot when step 4 completed; otherwise state that the snapshot was
not reached. Mark the result requires_human_decision instead of
iterating again or invoking another skill automatically.
Green criteria: the daemon returns the expected shape for a
documented Get; the configured auth mode rejects the documented
negative request (or, for localhost-only mode, the listener is
loopback-only and unreachable remotely); the required isolated
persistency probe survives restart and
is rolled back; and the capability snapshot matches the selected
deployment shape.
The eval-loop overlay (rows apply to every DMS deployment, not just one topology):
| Step | Why this is a loop, not a step | Where the substance lives |
|---|---|---|
| 4 → ## modify → 1 | Capability-snapshot drift often reveals an as-deployed gap that needs a configuration change; apply the minimum documented recipe change in ## modify, then restart the test sweep at step 1 |
## test step 4 |
| 2 → ## debug | When the auth-mode smoke does NOT reject what it should, the deployment is unsafe — escalate to ## debug immediately, do not run later steps |
## debug |
| 3 → ## run step 2 → 1 | When persistency does not survive restart, re-check the documented persistency launch flag/state-file configuration in ## run step 2, then restart the test sweep at step 1 |
## run step 2 |
| 1..4 → ## run | Each loop iteration ends with a documented smoke; if all four pass, hand off to live ## run traffic |
## run |
The agent's rule: every mutation re-opens the sweep. A configuration change followed by "it probably still works" is exactly the failure mode the iterative loop is here to prevent.
The destructive-operation gate remains active inside both ## test
and ## debug: no OS install, reboot, factory reset, or managed-file
deletion may be used as a probe or recovery action without re-verifying the exact target and
obtaining confirmation for that specific operation.
- Smoke-test the daemon. After launch (
## runstep 3), confirm the daemon answers a documented gNMIGetand returns expected shape. - Smoke-test the auth mode. For credentialed modes, confirm the
chosen mode rejects unauthenticated/unauthorized requests as documented.
For mTLS, this means an explicit "request without cert is
rejected" check. For PAM, this means an "user not in
allowed_usersis rejected" check. Localhost-only has no authentication: its negative test is thatdmsdis bound only to loopback and cannot be reached through a non-loopback interface. - Smoke-test persistency only on an isolated test path. If the
deployment relies on persistency, have the operator select a
documented, reversible path on a test-only interface/instance,
snapshot its current value, set a distinct test value, restart
dmsd, verify the value survives, then restore and verify the snapshot. If no isolated reversible path exists, skip the mutation and mark persistencynot_tested; when persistency is required this keeps the sweep not-green and blocks completion. Never improvise a "benign" value on production state. - Capability snapshot. Save the as-deployed answer to: which
gNMI paths your environment supports, which gNOI operations your
environment supports, which auth mode is active, who is in the
-allowed_userslist. This snapshot is the artifact that lets future debug sessions skip rediscovery.
debug
Layered diagnosis. Walk the layers in this order; do not skip down without clearing the layer above.
- Transport layer. Is the gRPC channel even reaching
dmsd? Symptoms:UNAVAILABLE,DEADLINE_EXCEEDED, TLS handshake failures. Causes: wrong host/port, firewall, daemon not running, TLS material misconfigured. Resolution: confirmdmsdis running (SystemD status or process list), confirm the listener address matches the client's target, confirm TLS material if mTLS mode is in use. - Authentication / authorization layer. Symptoms:
UNAUTHENTICATED,PERMISSION_DENIED, "user not authorized". Causes: wrong credentials, user not in the-allowed_userslist (applies to ALL auth modes, enforced byisUserAllowed), certificate issuer not trusted bydmsd. Resolution: walk the documented authentication-mode troubleshooting in the public guide for the specific mode in use. - Path / operation layer. Symptoms:
INVALID_ARGUMENT, "path not found", "operation not supported". Causes: the path is not in the DMS-supported set, the operation is not in the documented gNOI list, or an unsupported gNMI Subscribe MODE was attempted (POLL/Aggregationare Unimplemented;STREAM/SAMPLE1s–60s andONCEARE supported). Resolution: re-read the supported-paths reference and the gNOI operation list inCAPABILITIES.md. If the path or operation is genuinely not in the public set, the answer is "not supported" — not "invent a workaround". - Backend / underlying-tool layer. Symptoms: the operation
reached
dmspeand the underlying tool (e.g.mlxconfig, OS installer, file system) returned an error. Resolution: extract the underlying-tool error from the response and consult that tool's own documentation. Preserve the raw gRPC status code, message, and documented details fields verbatim. If the selected release documents no nested error field, capture the complete sanitized response and stop rather than guessing which substring belongs to the backend. Return that response as the diagnostic artifact and mark the diagnosis blocked pending the underlying tool's documentation. DMS is the conduit, not the source of truth for the underlying tool's failures. - State persistency layer. Symptoms: a previously-set value does not survive a daemon restart. Resolution: confirm automatic recording is enabled (it can be disabled per the docs), confirm the configuration-persistency file is writable and not being overwritten by an external process, then consult the documented state restoration mechanism.
- Library-level errors. If DMS is acting as a thin wrapper over
a DOCA library call and that library returned
DOCA_ERROR_*, the relevant cross-library taxonomy lives indoca-programming-guide CAPABILITIES.md ## Error taxonomy. The library-specific overlay (e.g. for Flow) lives in the matchinglibs/<library>skill.
Command appendix
DMS-specific commands the verbs above reach for, grouped by purpose
so the agent picks the right family without searching prose. Every
row is a class — the agent must not invent flags beyond what the row
names; flag discovery is --help on the installed binary or the
SystemD unit file, not prose recall.
| Purpose | Command (class shape) | Owning step | Reads as healthy when … |
|---|---|---|---|
| Daemon lifecycle (SystemD) | systemctl status dmsd / start / stop / restart |
## run |
active (running) with no recent restart loops. |
| Daemon launch (manual) | dmsd --help first, then the documented flag set |
## run |
Daemon binds the documented listener and emits the expected startup banner. |
| Daemon logs (frontend) | journalctl -u dmsd --since "5 min ago" or the documented log file |
## debug layer Transport/Auth |
Lines present for the request window; no auth-rejection storm. |
| Daemon logs (backend) | The documented dmspe log destination |
## debug layer Backend |
Backend execution lines present; tool stderr captured. |
| Sanity gNMI Get | A gNMI Get on a path copied verbatim from the installed/public DMS guide for this release; do not substitute a generic OpenConfig example |
## test step 1 |
Returns the expected typed value. |
| Sanity gNMI Set | A gNMI Set on a documented, reversible path selected by the operator on a test-only interface/instance; snapshot first, then restore and verify as in test step 3 |
## test step 3 |
Returns success; subsequent Get reflects the test value, then the restored snapshot. |
| gNOI sanity (read-only) | A gNOI System.Time (or equivalent read-only op the guide lists) |
## test step 1 |
Returns the expected time / status. |
| Auth-mode negative test | Credentialed mode: request without credentials. Localhost-only: connection attempt through a non-loopback interface | ## test step 2 |
Credentialed mode rejects as documented; localhost-only is unreachable off loopback. |
| Persistency check | Set a value, restart dmsd, re-Get |
## test step 3 |
The previously set value survives the restart. |
| Capability snapshot | A documented gNMI Get enumerating supported paths / ops |
## test step 4 |
Output matches the deployment-shape capability matrix. |
| Cross-cutting health | ss -tlnp | grep dmsd (port listener), ps -ef | grep dmsd |
## debug layer Transport |
Daemon listens on the documented port; one dmsd process. |
Three cross-cutting rules for this appendix:
- Never invent a DMS flag. The public guide is the contract;
dmsd --helpagainst the installed binary is the only secondary source. Prose-derived flags are the most common hallucination failure for this skill. - Frontend logs before backend logs. When triaging, read
journalctl -u dmsd(or the documented frontend log) first; only drop todmspeonce the frontend confirms the request reached the backend. - Cross-link instead of duplicate. Cross-cutting commands (the
read-only triple,
dmesg,mlxconfig -d <pcie> q) live indoca-debug TASKS.md ## Command appendix; this appendix names only the DMS-specific ones.
Deferred task verbs
- Installing DOCA on the management endpoint — out of scope here.
Route to
doca-setup ## configurefor env preparation anddoca-setup ## testfor install health verification, ordoca-setup ## no-installfor the public NGC DOCA container Path 0 if there is no DOCA install yet. - Building a custom DOCA application — not a DMS question. Route
to
doca-programming-guide ## buildfor the canonical build pattern, plus the matchinglibs/<library>skill for the API surface. - Turnkey telemetry aggregation — out of scope for DMS. DMS's own
gNMI Subscribe DOES stream (
STREAM/SAMPLE1s–60s andONCE; onlyPOLL/Aggregationare Unimplemented); for a productized telemetry-aggregation surface, route to the DOCA Telemetry Service (DTS), discoverable throughdoca-public-knowledge-map. - Library-internal API questions (Flow pipe construction, RDMA
queue setup, …) — outside DMS. Route to the matching
libs/<library>skill.
Cross-cutting
- The public DMS guide is the single source of truth. Any flag, path, operation, or auth-mode detail the agent quotes must come from there, not from generic gNMI / gNOI / gRPC knowledge.
- DMS is currently beta with GA scoped to SPC-X use cases. Treat any "what is the long-term roadmap" question as out of scope and defer to the live public guide.
- Localhost-only auth is never safe to expose externally.
- All operational guidance must preserve the documented two-process
separation (
dmsdlow-priv frontend,dmspeprivileged backend). - For URL routing to the DMS guide and other public DOCA documentation, see doca-public-knowledge-map ## DOCA services.