Repository navigation
[yang] Add BMC gNOI client certificate path model - #30103
Open
william8545 wants to merge 2 commits into
Open
william8545 wants to merge 2 commits into
william8545 wants to merge 2 commits into
Conversation
william8545
requested review from
dgsudharsan,
praveen-li,
qiluo-msft and
venkatmahalingam
as code owners
October 12, 2026 04:03
|
Azure Pipelines: There may be pipelines that require an authorized user to comment /azp run to run. |
Collaborator
|
/azp run Azure.sonic-buildimage |
|
Azure Pipelines: Successfully started running 1 pipeline(s). |
This was referenced Oct 12, 2026
Closed
Yakiv-Huryk
approved these changes
Oct 14, 2026
This was referenced Oct 15, 2026
william8545
added a commit
to william8545/sonic-platform-daemons
that referenced
this pull request
Oct 15, 2026
#### Description Implement BMC-side graceful shutdown and restart for the switch host. - Send authenticated gNOI HALT and match RebootStatus to the running request before power removal. - Serialize power actions: an identical action joins the in-flight request before any priority comparison, a higher-priority conflicting action preempts it, and other conflicting requests get BUSY responses. - Record confirmed outcomes without replaying interrupted operations. A repeated shutdown is skipped only after a recorded power-off, an operation cancelled by daemon stop is recorded as ABANDONED, and the startup power-on is dropped when a power-removing request was admitted first. - Read optional CA, client-certificate and private-key paths from CONFIG_DB `BMC_GNOI|certs`. - Default the graceful timeout to 120 seconds while preserving configured values, including 0 for forced-only operation. STATE_DB `HOST_STATE|switch-host` gains `op_request_id`, `op_trigger`, `op_result` and `op_reason`. Rack-manager command rows gain `request_id` for correlation. #### Motivation and Context Allow the host to stop services before BMC power removal while keeping critical-event handling and forced power operations available. #### How Has This Been Tested? - `git diff --check` passed. - Added or updated unit coverage for gNOI failures, request correlation, timeouts, certificate paths, preemption, duplicate actions, power failures and daemon cleanup. - The unit suite runs in Azure CI on this PR. A live-patch run of this daemon on a BMC and switch-host pair exercised graceful shutdown end to end, a critical event joining an in-flight graceful shutdown, startup with a pending power-off command and daemon stop during the handshake. No image build was run. #### Additional Information (Optional) This PR contains only the daemon-side changes. End-to-end graceful completion also needs [the switch-host `reboot -p` changes](sonic-net/sonic-utilities#4906), [the host-services HALT changes](sonic-net/sonic-host-services#449) and deployment-provisioned mTLS credentials. The YANG model for the optional `BMC_GNOI|certs` table is in [sonic-buildimage#30103](sonic-net/sonic-buildimage#30103). Each operation runs on its own worker thread, with at most one worker alive at a time, so the daemon keeps processing events and critical actions during the graceful wait; daemon stop joins the worker for at most 5 seconds. Each thread uses its own database connections. The rack-manager telemetry handler added in sonic-net#880 runs on the event thread's subscription list. A request that conflicts with the in-flight operation is refused as BUSY and is not queued or retried. The refusal is reported in the rack-manager command row and the event log, while `HOST_STATE|switch-host` keeps the record of the in-flight operation. CLI admin-status writes are deduplicated per value, so an `admin_status=up` written while a shutdown is in flight is not acted on: it is a no-op while the host is still online and is refused as BUSY once it is off. To power on afterwards, run `config chassis modules shutdown SWITCH-HOST` and then `startup` again. Signed-off-by: William Tsai <willtsai@nvidia.com>
#### Why I did it The BMC daemon in [sonic-platform-daemons#923](sonic-net/sonic-platform-daemons#923) performs BMC-controlled graceful shutdown and restart of the switch host ([HLD](sonic-net/SONiC#2500)). It reaches the host over gNOI with mTLS and reads its client credential paths from the table `BMC_GNOI|certs` in the BMC's CONFIG_DB. That table has no YANG model yet, so it cannot be validated like the existing `GNMI|certs` server paths. ##### Work item tracking - Microsoft ADO **(number only)**: N/A #### How I did it - Add `sonic-bmc-gnoi.yang`: one optional singleton row `BMC_GNOI|certs` with the leaves `ca_crt`, `client_crt` and `client_key`. Each is an absolute path, visible inside the BMC's PMON container. The model defines no defaults, so an absent field does not materialize a row; the daemon falls back to `/etc/sonic/bmc-link/{ca.crt,client.crt,client.key}` for absent fields only. - Register the model in `setup.py` and add a `BMC_GNOI` entry to `sample_config_db.json` so the model is covered by the existing sample-config validation. - Add `yang_model_pytests/test_bmc_gnoi.py`: accepted path combinations, rejection of empty, bare-root, relative, templated and whitespace-containing paths, rejection of unknown rows or fields, and no leaf default. - Document the table in `Configuration.md`. The image does not seed this table. Deployment installs the files and configures any non-default paths. #### How to verify it ``` cd src/sonic-yang-models pytest tests/yang_model_pytests/test_bmc_gnoi.py tests/yang_model_pytests/test_configdb_layout.py ``` The pytests need the `python3-libyang` this repository builds (libyang-python 3.1.0 with the `src/libyang3-py3` patches), for example inside the sonic-slave container. The sonic-yang-mgmt validation test (`test_validate_yang_models`) loads every model together with `sample_config_db.json` and runs as part of the sonic-yang-mgmt build. #### Which release branch to backport (provide reason below if selected) - [ ] 202305 - [ ] 202311 - [ ] 202405 - [ ] 202411 - [ ] 202505 - [ ] 202511 - [ ] 202512 - [ ] 202605 - [ ] 202608 Tracking issue/work item for backport/cherry-pick request (GitHub issue or Microsoft ADO): N/A Failure type: other (feature) #### Tested branch - [x] master - [ ] 202305 - [ ] 202311 - [ ] 202405 - [ ] 202411 - [ ] 202505 - [ ] 202511 - [ ] 202512 - [ ] 202605 - [ ] 202608 - [ ] N/A #### Test result - master: `tests/yang_model_pytests/` passed (1015 tests) and the sonic-yang-mgmt `test_validate_yang_models` and `test_xlate_rev_xlate` passed with this branch's models and sample config, run in a Debian bookworm container with libyang 3.12.2 and the libyang-python 3.1.0 built from `src/libyang3-py3`. `setup.py build_py` YANG completeness validation passed and `pyang -Vf tree` over all models reports nothing for the new model. No image build or hardware test was run for this YANG-only change; Azure CI runs the model tests in the sonic-yang-models and sonic-yang-mgmt builds. #### Description for the changelog Add the `BMC_GNOI` YANG model for the BMC daemon's gNOI client certificate paths. #### Link to config_db schema for YANG module changes https://github.com/william8545/sonic-buildimage/blob/bmc-graceful-shutdown-restart/src/sonic-yang-models/doc/Configuration.md#bmc_gnoi Signed-off-by: William Tsai <willtsai@nvidia.com>
william8545
force-pushed
the
bmc-graceful-shutdown-restart
branch
from
October 15, 2026 22:37
7f7ea85 to
b86aa5b
Compare
william8545
added a commit
to william8545/SONiC
that referenced
this pull request
Oct 15, 2026
## Summary Align the BMC graceful shutdown/restart HLD merged in sonic-net#2500 with the implementation. Only the existing HLD is changed; its section structure and main flows are retained. ## Differences from the merged HLD | Area | Updated design | | --- | --- | | Eligibility | Use existing BMC/switch-host identity. Remove the `bmc_pairing` opt-in and old/mixed-image compatibility promise. | | Provisioning | Deployment owns credentials, gNMI authorization and CACL. BMC client paths use optional `BMC_GNOI\|certs`; host server paths use existing `GNMI\|certs`. No image-side DB seeding. | | Timing | Default BMC timeout 120 s, explicit 0 preserved, no CLI upper bound. Host timeout defaults to 60 s without DPU fallback; watchdog 180 s; restart pause 10 s. | | Host safeguards | Document watchdog readback, the skipped platform pre-reboot hook and firmware auto-update handler, the checked host-partition flush, and immediate propagation of pre-check failures, including the narrow shared-path fixes. | | Operation handling | Align same-action JOIN ahead of priority displacement, preemption ownership, the startup power-on yielding to an admitted power removal, the repeated-shutdown skip after a recorded power-off, ABANDONED on daemon stop and no automatic power-call retry. Distinguish platform `ONLINE` from OS/management readiness. | The tagged HALT/RebootStatus protocol, vendor teardown branches and deployment qualification requirements remain. This PR does not claim production security approval or introduce runtime changes. ## Validation - Compared with the implementation proposed in sonic-net/sonic-platform-daemons#923, sonic-net/sonic-host-services#449, sonic-net/sonic-utilities#4906 and sonic-net/sonic-buildimage#30103. - Checked document structure, link targets and whitespace. - Documentation only: no build or device test. Signed-off-by: William Tsai <willtsai@nvidia.com>
Collaborator
|
/azp run Azure.sonic-buildimage |
|
Azure Pipelines: Successfully started running 1 pipeline(s). |
Contributor
Author
|
/azpw retry |
|
You are not authorized to retry Azure Pipelines jobs for this repository. |
Contributor
Author
|
/azpw run |
|
You are not authorized to retry Azure Pipelines jobs for this repository. |
Empty commit. The previous run of this unchanged YANG-only change failed in one kvmtest leg (t1-lag-vpp) while the builds and the other kvmtest legs passed; the author cannot re-run the pipeline on this repository. Signed-off-by: William Tsai <willtsai@nvidia.com>
Collaborator
|
/azp run Azure.sonic-buildimage |
|
Azure Pipelines: Successfully started running 1 pipeline(s). |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why I did it
The BMC daemon in sonic-platform-daemons#923 performs BMC-controlled graceful shutdown and restart of the switch host (HLD). It reaches the host over gNOI with mTLS and reads its client credential paths from the table
BMC_GNOI|certsin the BMC's CONFIG_DB. That table has no YANG model yet, so it cannot be validated like the existingGNMI|certsserver paths.Work item tracking
How I did it
sonic-bmc-gnoi.yang: one optional singleton rowBMC_GNOI|certswith the leavesca_crt,client_crtandclient_key. Each is an absolute path, visible inside the BMC's PMON container. The model defines no defaults, so an absent field does not materialize a row; the daemon falls back to/etc/sonic/bmc-link/{ca.crt,client.crt,client.key}for absent fields only.setup.pyand add aBMC_GNOIentry tosample_config_db.jsonso the model is covered by the existing sample-config validation.yang_model_pytests/test_bmc_gnoi.py: accepted path combinations, rejection of empty, bare-root, relative, templated and whitespace-containing paths, rejection of unknown rows or fields, and no leaf default.Configuration.md.The image does not seed this table. Deployment installs the files and configures any non-default paths.
How to verify it
The pytests need the
python3-libyangthis repository builds (libyang-python 3.1.0 with thesrc/libyang3-py3patches), for example inside the sonic-slave container. The sonic-yang-mgmt validation test (test_validate_yang_models) loads every model together withsample_config_db.jsonand runs as part of the sonic-yang-mgmt build.Which release branch to backport (provide reason below if selected)
Tracking issue/work item for backport/cherry-pick request (GitHub issue or Microsoft ADO): N/A
Failure type: other (feature)
Tested branch
Test result
tests/yang_model_pytests/passed (1015 tests) and the sonic-yang-mgmttest_validate_yang_modelsandtest_xlate_rev_xlatepassed with this branch's models and sample config, run in a Debian bookworm container with libyang 3.12.2 and the libyang-python 3.1.0 built fromsrc/libyang3-py3.setup.py build_pyYANG completeness validation passed andpyang -Vf treeover all models reports nothing for the new model. No image build or hardware test was run for this YANG-only change; Azure CI runs the model tests in the sonic-yang-models and sonic-yang-mgmt builds.Description for the changelog
Add the
BMC_GNOIYANG model for the BMC daemon's gNOI client certificate paths.Link to config_db schema for YANG module changes
https://github.com/william8545/sonic-buildimage/blob/bmc-graceful-shutdown-restart/src/sonic-yang-models/doc/Configuration.md#bmc_gnoi