From 403ee85345feecaf384be408f81ad68a983b740f Mon Sep 17 00:00:00 2001 From: Ryan Lucus Date: Mon, 20 Mar 2023 11:32:26 -0700 Subject: [PATCH 1/5] HLD for Save on Set --- doc/mgmt/gnmi/images/save_on_set.png | Bin 0 -> 33736 bytes doc/mgmt/gnmi/save_on_set.md | 220 +++++++++++++++++++++++++++ 2 files changed, 220 insertions(+) create mode 100644 doc/mgmt/gnmi/images/save_on_set.png create mode 100644 doc/mgmt/gnmi/save_on_set.md diff --git a/doc/mgmt/gnmi/images/save_on_set.png b/doc/mgmt/gnmi/images/save_on_set.png new file mode 100644 index 0000000000000000000000000000000000000000..4eee5d2ba1c044ef22b70d26c16bb3c350e764f8 GIT binary patch literal 33736 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 E2Srh8zyJUM literal 0 HcmV?d00001 diff --git a/doc/mgmt/gnmi/save_on_set.md b/doc/mgmt/gnmi/save_on_set.md new file mode 100644 index 00000000000..dd968ee8bd4 --- /dev/null +++ b/doc/mgmt/gnmi/save_on_set.md @@ -0,0 +1,220 @@ +# Save-On-Set HLD # + +_Rev v0.1_ + +## Table of Contents + +- [Save-On-Set HLD](#save-on-set-hld) + - [Table of Contents](#table-of-contents) + - [Revision](#revision) + - [Scope](#scope) + - [Definitions/Abbreviations](#definitionsabbreviations) + - [Overview](#overview) + - [Requirements](#requirements) + - [Architecture Design](#architecture-design) + - [High-Level Design](#high-level-design) + - [Required Changes](#required-changes) + - [Telemetry Executable](#telemetry-executable) + - [Call to Save ConfigDB](#call-to-save-configdb) + - [gNMI.Set() Handler](#gnmiset-handler) + - [SAI API](#sai-api) + - [Configuration and management](#configuration-and-management) + - [gNMI](#gnmi) + - [Manifest (if the feature is an Application Extension)](#manifest-if-the-feature-is-an-application-extension) + - [CLI/YANG model Enhancements](#cliyang-model-enhancements) + - [Config DB Enhancements](#config-db-enhancements) + - [Warmboot and Fastboot Design Impact](#warmboot-and-fastboot-design-impact) + - [Restrictions/Limitations](#restrictionslimitations) + - [Testing Requirements/Design](#testing-requirementsdesign) + - [Unit Test cases](#unit-test-cases) + - [System Test cases](#system-test-cases) + - [Open/Action items - if any](#openaction-items---if-any) + +### Revision + +| Rev | Rev Date | Author(s) | Change Description | +|------|------------|--------------------|--------------------| +| v0.1 | 02/22/2021 | Tomek Madejski (Google), Ryan Lucus (Google) | Initial version | + +### Scope + +Add the option for enabling the SONiC gNMI implementation to save its in-memory stored configuration to a file every time it changes. + +### Definitions/Abbreviations + +- [gNMI](https://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-specification.md) - Google Network Management Interface +- UMF - Unified Management Framework + + +### Overview + +Having configuration be persistant across switch reboot is a useful feature that is not currently implemented by UMF. + +The required behaviour is to save the configuration to a file that is used to populate the configuration database during the startup process every time the gNMI.Set() RPC call is performed. + +Due to SONiC architecture the UMF container cannot perform this action completely by itself and a dedicated support is needed on the ‘host’ side. + +Currently there are a number of devices that are ‘out in the wild’ that use the current implementation of the UMF and therefore do not persist configuration across reboots and their behavior cannot be changed without changing the configuration tools that interact with them. +For this reason and for more versatility the save-on-set behavior should be able to be toggled by a command-line parameter to the telemetry executable. + +### Requirements + +This feature should be off by default to avoid interfering with legacy switches. +### Architecture Design + +This feature does not change the SONiC Architecture + +### High-Level Design + +- Is it a built-in SONiC feature or a SONiC Application Extension? + - built-in SONiC feature +- What are the modules and sub-modules that are modified for this design? + - gNMI Server +- What are the repositories that would be changed? + - [sonic-gnmi](https://github.com/sonic-net/sonic-gnmi) + - [sonic-mgmt-common](https://github.com/sonic-net/sonic-mgmt-common) +- Module/sub-module interfaces and dependencies. + - Adds a flag to the gNMI module. +- SWSS and Syncd changes in detail + - N/A +- DB and Schema changes (APP_DB, ASIC_DB, COUNTERS_DB, LOGLEVEL_DB, CONFIG_DB, STATE_DB) + - Adds an entry to the CONFIG_DB to determine if the feature is enabled. +- Sequence diagram if required. +![Flow Char](images/save_on_set.png) +- Linux dependencies and interface + - N/A +- Warm reboot requirements/dependencies + - None +- Fastboot requirements/dependencies + - None +- Scalability and performance requirements/impact + - If the feature is enabled, there is performance hit that scales with the size of ConfigDB. +- Memory requirements + - Negligible, a couple function pointers. +- Docker dependency + - None +- Build dependency if any + - None +- Management interfaces - SNMP, CLI, RestAPI, etc., + - [Configuration and management](#configuration-and-management) +- Serviceability and Debug (logging, counters, trace etc) related design + - Logging of feature being enabled; +- Is this change specific to any platform? Are there dependencies for platforms to implement anything to make this feature work? If yes, explain in detail and inform community in advance. + - Any Platform +- SAI API requirements, CLI requirements, ConfigDB requirements. Design is covered in following sections. + +#### Required Changes + +##### Telemetry Executable +A new command-line parameter will be added to control the behavior of the save-on-set functionality. By default, i.e. when the option is not specified, the gNMI server will behave as it did before this change - the configuration will not be saved to a file without explicit action from the administrator for example by execution of a command via ssh connection. + +The new parameter will be: --with-save-on-set and when present it will configure a function pointer variable gnmi.SaveOnSet to point to a function that actually performs the save operation. + +```go +var ( + withSaveOnSet = flag.Bool("with-save-on-set", false, "Enables save-on-set.") +) + +// ... + +if *withSaveOnSet { + gnmi.SaveOnSet = gnmi.SaveOnSetEnabled +} +``` + +##### Call to Save ConfigDB +A function to initial the backup located in the sonic-mgmt-framework. + +```go +// SaveConfig initiates the operation of saving the current content of +// the ConfigDB to a file that is then used to populate the database during the +// startup. +func SaveConfig() error { + r := HostQuery("cfg_mgmt.save", []string{}) + if r.Err != nil{ + return errors.New("internal SONiC Hostservice failure: " + r.Err.Error()) + } + if len(r.Body) < 2 { + return errors.New( + "internal SONiC Hostservice failure: the response is too short.") + } + if _, ok := r.Body[0].(int32); !ok { + return errors.New( + "internal SONiC Hostservice failure: first element is not int32.") + } +if_, ok := r.Body[1].(string); !ok { + return errors.New( + "internal SONiC Hostservice failure: second element is not string.") + } + if r.Body[0].(int32) != 0 { + return errors.New(r.Body[1].(string)) + } + return nil +} +``` + +##### gNMI.Set() Handler + +The RPC will execute the save-on-set function at the end of each call. + +```go +// SaveOnSetEnabled saves configuration to a file +func SaveOnSetEnabled() { + transformer.SaveStartupConfig() +} +// SaveOnSetDisabeld does nothing. +func SaveOnSetDisabled() {} + +// SaveOnSet point to a function that is called to save changes of configuration +// to a file. By default it points to an empty function - the configuration is not +// saved to a file. +var SaveOnSet = SaveOnSetDisabled + +func (s *Server) Set(ctx context.Context, req *gnmipb.SetRequest) (*gnmipb.SetResponse, error) { + + // ... + + SaveOnSet() + return resp, err +} +``` + +### SAI API + +No change in SAI API. + +### Configuration and management + +#### gNMI + +Adds flag to enable feature in gNMI binary + +#### Manifest (if the feature is an Application Extension) + +Not an app extension. + +#### CLI/YANG model Enhancements + +No changes to CLI or YANG + +#### Config DB Enhancements + +Add an entry to Config DB for toggling the save-on-set feature. + +### Warmboot and Fastboot Design Impact + +No effect on warm/fast boot + +### Restrictions/Limitations + +### Testing Requirements/Design + +#### Unit Test cases + +- No behavior change if the feature is not enabled. +- A gNMI.Set() call should generate a signal to save ConfigDB. +#### System Test cases + +- A gNMI.Set() call should result in an update to the ConfigDB backup file. + +### Open/Action items - if any From 9e06354a577573dca41220d235dbaecd439cf13b Mon Sep 17 00:00:00 2001 From: Ryan Lucus Date: Fri, 2 Jun 2023 00:19:50 -0700 Subject: [PATCH 2/5] Update wording --- doc/mgmt/gnmi/save_on_set.md | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/doc/mgmt/gnmi/save_on_set.md b/doc/mgmt/gnmi/save_on_set.md index dd968ee8bd4..1073f8c7652 100644 --- a/doc/mgmt/gnmi/save_on_set.md +++ b/doc/mgmt/gnmi/save_on_set.md @@ -45,7 +45,6 @@ Add the option for enabling the SONiC gNMI implementation to save its in-memory - [gNMI](https://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-specification.md) - Google Network Management Interface - UMF - Unified Management Framework - ### Overview Having configuration be persistant across switch reboot is a useful feature that is not currently implemented by UMF. @@ -60,6 +59,7 @@ For this reason and for more versatility the save-on-set behavior should be able ### Requirements This feature should be off by default to avoid interfering with legacy switches. + ### Architecture Design This feature does not change the SONiC Architecture @@ -106,9 +106,12 @@ This feature does not change the SONiC Architecture #### Required Changes ##### Telemetry Executable + A new command-line parameter will be added to control the behavior of the save-on-set functionality. By default, i.e. when the option is not specified, the gNMI server will behave as it did before this change - the configuration will not be saved to a file without explicit action from the administrator for example by execution of a command via ssh connection. -The new parameter will be: --with-save-on-set and when present it will configure a function pointer variable gnmi.SaveOnSet to point to a function that actually performs the save operation. +The telemetry.sh startup script will be modified to read `TELEMETRY|gnmi|save_on_set` and pass the value along during startup. Any changes to this value will only take effect after restarting telemetry. + +The new parameter will be: --with-save-on-set and when present it will configure a function pointer variable gnmi.SaveOnSet to point to a function that initiates the save operation. ```go var ( @@ -123,7 +126,8 @@ if *withSaveOnSet { ``` ##### Call to Save ConfigDB -A function to initial the backup located in the sonic-mgmt-framework. + +A function to initialize the backup located in the sonic-mgmt-framework. ```go // SaveConfig initiates the operation of saving the current content of @@ -212,7 +216,8 @@ No effect on warm/fast boot #### Unit Test cases - No behavior change if the feature is not enabled. -- A gNMI.Set() call should generate a signal to save ConfigDB. +- A gNMI.Set() call should generate a message to save ConfigDB on the DBUS when enabled. + #### System Test cases - A gNMI.Set() call should result in an update to the ConfigDB backup file. From f04c927afbb5a6aa24e4ca0037d6b00df67e9a30 Mon Sep 17 00:00:00 2001 From: Ryan Lucus Date: Wed, 27 Mar 2024 05:47:16 +0000 Subject: [PATCH 3/5] Update design to use sonic-services-client --- doc/mgmt/gnmi/images/save_on_set.png | Bin 33736 -> 32103 bytes doc/mgmt/gnmi/save_on_set.md | 38 +++------------------------ 2 files changed, 3 insertions(+), 35 deletions(-) diff --git a/doc/mgmt/gnmi/images/save_on_set.png b/doc/mgmt/gnmi/images/save_on_set.png index 4eee5d2ba1c044ef22b70d26c16bb3c350e764f8..cffbf11365244368a7aa34a1d1140ebaf4098555 100644 GIT binary patch literal 32103 zcma&N2{@GD+deF*hziM4Bq3!tcFHyjGh-XZFe5a~SckFB7(yyrN@ZVDDk)p`J(ZL# zwAezTqU=k^{@qjk-uM50-~T<1?`WDC&ph{b-Pe6>=lR5#n;IV2e{??!3(End5zK;x zg*AzVWtSWKUU22@&kr`>W0#+Wp#e)#r|?e}7LJepa2tQmKxa1!nMG0=`uCe8MA4P% z=P#)YlY~G>zC^kkRnE=JpX}>Jq{zEasV)?Y#oGeAV{`Q?MpGqTT!@AqZ7vb$MkqaQQUa2y0?234wy| z6gLkt_%I|pc~F^6psv1DPjCgH1W}e(Wc~veEs4%VU$_6G3+8&r{zR9*Yf(kG*_e76 zx}%VeXgL$Am$5RP@plb0vag>T)$2b?mIo8~`-4BjoBa3cUr{lyD#L+rNp3_JUm_5h zqT4@7dAN9^@fd%s5kZlmj}Anm&DCgsJMkidnf{T#IS`hd(%(*0alRHFK1daWxgya> z-3qBsz#8Ga0-Tfy5Q4g^kC(q!0NLNw4M}&$SeikgzLF3iOoX)~1`f4Enj+D@6mu+0 zN!e51)yT};+1W$Y5NVF35Y-KBjI6zDK0540NrM{QB4U}XuWKQsVL*T6v89F9

_>OP1AR2GGJv=TQccW*Xbgs@xrYJVTp4QR<7x;~ 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 literal 33736 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 E2Srh8zyJUM diff --git a/doc/mgmt/gnmi/save_on_set.md b/doc/mgmt/gnmi/save_on_set.md index 1073f8c7652..f3324c71e9a 100644 --- a/doc/mgmt/gnmi/save_on_set.md +++ b/doc/mgmt/gnmi/save_on_set.md @@ -35,6 +35,7 @@ _Rev v0.1_ | Rev | Rev Date | Author(s) | Change Description | |------|------------|--------------------|--------------------| | v0.1 | 02/22/2021 | Tomek Madejski (Google), Ryan Lucus (Google) | Initial version | +| v0.2 | 03/26/2024 | Ryan Lucus (Google) | Update to use Sonic Service Client | ### Scope @@ -51,7 +52,7 @@ Having configuration be persistant across switch reboot is a useful feature that The required behaviour is to save the configuration to a file that is used to populate the configuration database during the startup process every time the gNMI.Set() RPC call is performed. -Due to SONiC architecture the UMF container cannot perform this action completely by itself and a dedicated support is needed on the ‘host’ side. +Due to SONiC architecture the UMF container cannot perform this action completely by itself and a dedicated support is needed on the ‘host’ side. This is accomplished by sending a call through DBUS to a sonic host service module. Currently there are a number of devices that are ‘out in the wild’ that use the current implementation of the UMF and therefore do not persist configuration across reboots and their behavior cannot be changed without changing the configuration tools that interact with them. For this reason and for more versatility the save-on-set behavior should be able to be toggled by a command-line parameter to the telemetry executable. @@ -72,13 +73,12 @@ This feature does not change the SONiC Architecture - gNMI Server - What are the repositories that would be changed? - [sonic-gnmi](https://github.com/sonic-net/sonic-gnmi) - - [sonic-mgmt-common](https://github.com/sonic-net/sonic-mgmt-common) - Module/sub-module interfaces and dependencies. - Adds a flag to the gNMI module. - SWSS and Syncd changes in detail - N/A - DB and Schema changes (APP_DB, ASIC_DB, COUNTERS_DB, LOGLEVEL_DB, CONFIG_DB, STATE_DB) - - Adds an entry to the CONFIG_DB to determine if the feature is enabled. + - N/A - Sequence diagram if required. ![Flow Char](images/save_on_set.png) - Linux dependencies and interface @@ -125,38 +125,6 @@ if *withSaveOnSet { } ``` -##### Call to Save ConfigDB - -A function to initialize the backup located in the sonic-mgmt-framework. - -```go -// SaveConfig initiates the operation of saving the current content of -// the ConfigDB to a file that is then used to populate the database during the -// startup. -func SaveConfig() error { - r := HostQuery("cfg_mgmt.save", []string{}) - if r.Err != nil{ - return errors.New("internal SONiC Hostservice failure: " + r.Err.Error()) - } - if len(r.Body) < 2 { - return errors.New( - "internal SONiC Hostservice failure: the response is too short.") - } - if _, ok := r.Body[0].(int32); !ok { - return errors.New( - "internal SONiC Hostservice failure: first element is not int32.") - } -if_, ok := r.Body[1].(string); !ok { - return errors.New( - "internal SONiC Hostservice failure: second element is not string.") - } - if r.Body[0].(int32) != 0 { - return errors.New(r.Body[1].(string)) - } - return nil -} -``` - ##### gNMI.Set() Handler The RPC will execute the save-on-set function at the end of each call. From 80d630e9e97d660e5c87901da15c01bd5903e7e1 Mon Sep 17 00:00:00 2001 From: Ryan Lucus Date: Fri, 14 Jun 2024 03:20:10 +0000 Subject: [PATCH 4/5] add nil error check to save on set call --- doc/mgmt/gnmi/save_on_set.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/doc/mgmt/gnmi/save_on_set.md b/doc/mgmt/gnmi/save_on_set.md index f3324c71e9a..35f0593e039 100644 --- a/doc/mgmt/gnmi/save_on_set.md +++ b/doc/mgmt/gnmi/save_on_set.md @@ -36,6 +36,7 @@ _Rev v0.1_ |------|------------|--------------------|--------------------| | v0.1 | 02/22/2021 | Tomek Madejski (Google), Ryan Lucus (Google) | Initial version | | v0.2 | 03/26/2024 | Ryan Lucus (Google) | Update to use Sonic Service Client | +| v0.3 | 06/13/2024 | Ryan Lucus (Google) | Add error check to call | ### Scope @@ -146,7 +147,9 @@ func (s *Server) Set(ctx context.Context, req *gnmipb.SetRequest) (*gnmipb.SetRe // ... - SaveOnSet() + if err == nil { + SaveOnSet() + } return resp, err } ``` From 4ed9f9bae36abb312076e644f388fefb176190a2 Mon Sep 17 00:00:00 2001 From: Ryan Lucus Date: Fri, 14 Jun 2024 03:26:30 +0000 Subject: [PATCH 5/5] change UMF to sonic telemetry --- doc/mgmt/gnmi/save_on_set.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/doc/mgmt/gnmi/save_on_set.md b/doc/mgmt/gnmi/save_on_set.md index 35f0593e039..2651767a5b0 100644 --- a/doc/mgmt/gnmi/save_on_set.md +++ b/doc/mgmt/gnmi/save_on_set.md @@ -45,17 +45,16 @@ Add the option for enabling the SONiC gNMI implementation to save its in-memory ### Definitions/Abbreviations - [gNMI](https://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-specification.md) - Google Network Management Interface -- UMF - Unified Management Framework ### Overview -Having configuration be persistant across switch reboot is a useful feature that is not currently implemented by UMF. +Having configuration be persistant across switch reboot is a useful feature that is not currently implemented by Sonic-Telemetry. The required behaviour is to save the configuration to a file that is used to populate the configuration database during the startup process every time the gNMI.Set() RPC call is performed. -Due to SONiC architecture the UMF container cannot perform this action completely by itself and a dedicated support is needed on the ‘host’ side. This is accomplished by sending a call through DBUS to a sonic host service module. +Due to SONiC architecture the Sonic-Telemetry container cannot perform this action completely by itself and a dedicated support is needed on the ‘host’ side. This is accomplished by sending a call through DBUS to a sonic host service module. -Currently there are a number of devices that are ‘out in the wild’ that use the current implementation of the UMF and therefore do not persist configuration across reboots and their behavior cannot be changed without changing the configuration tools that interact with them. +Currently there are a number of devices that are ‘out in the wild’ that use the current implementation of Sonic-Telemetry and therefore do not persist configuration across reboots and their behavior cannot be changed without changing the configuration tools that interact with them. For this reason and for more versatility the save-on-set behavior should be able to be toggled by a command-line parameter to the telemetry executable. ### Requirements