From 7f49649f84cb08118e8a54a06eca8b7bfb58c9de Mon Sep 17 00:00:00 2001 From: Ram Date: Fri, 17 Jan 2025 10:16:30 +0530 Subject: [PATCH 1/9] fix collateral from PR3658 (#3696) * fixing collateral from PR3658 which was failing for Arista * fixing collateral from PR3658 which was failing for Arista --- .../isis_interface_hello_padding_enable_test.go | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/feature/isis/otg_tests/isis_interface_hello_padding_enable_test/isis_interface_hello_padding_enable_test.go b/feature/isis/otg_tests/isis_interface_hello_padding_enable_test/isis_interface_hello_padding_enable_test.go index 7e21ac55d6a..3cdf361d287 100644 --- a/feature/isis/otg_tests/isis_interface_hello_padding_enable_test/isis_interface_hello_padding_enable_test.go +++ b/feature/isis/otg_tests/isis_interface_hello_padding_enable_test/isis_interface_hello_padding_enable_test.go @@ -74,7 +74,6 @@ func configureISIS(t *testing.T, ts *isissession.TestSession) { // Level configs. level := isis.GetOrCreateLevel(2) level.LevelNumber = ygot.Uint8(2) - level.MetricStyle = oc.Isis_MetricStyle_WIDE_METRIC // Authentication configs. auth := level.GetOrCreateAuthentication() @@ -89,6 +88,7 @@ func configureISIS(t *testing.T, ts *isissession.TestSession) { intfName += ".0" } intf := isis.GetOrCreateInterface(intfName) + intf.HelloPadding = oc.Isis_HelloPaddingType_ADAPTIVE // Interface timers. isisIntfTimers := intf.GetOrCreateTimers() @@ -112,14 +112,16 @@ func configureISIS(t *testing.T, ts *isissession.TestSession) { isisIntfLevelTimers.HelloInterval = ygot.Uint32(5) isisIntfLevelTimers.HelloMultiplier = ygot.Uint8(3) - isisIntfLevel.GetOrCreateAf(oc.IsisTypes_AFI_TYPE_IPV4, oc.IsisTypes_SAFI_TYPE_UNICAST).Enabled = ygot.Bool(true) - isisIntfLevel.GetOrCreateAf(oc.IsisTypes_AFI_TYPE_IPV4, oc.IsisTypes_SAFI_TYPE_UNICAST).Metric = ygot.Uint32(v4Metric) - isisIntfLevel.GetOrCreateAf(oc.IsisTypes_AFI_TYPE_IPV6, oc.IsisTypes_SAFI_TYPE_UNICAST).Enabled = ygot.Bool(true) - isisIntfLevel.GetOrCreateAf(oc.IsisTypes_AFI_TYPE_IPV6, oc.IsisTypes_SAFI_TYPE_UNICAST).Metric = ygot.Uint32(v6Metric) if deviations.MissingIsisInterfaceAfiSafiEnable(ts.DUT) { isisIntfLevel.GetOrCreateAf(oc.IsisTypes_AFI_TYPE_IPV4, oc.IsisTypes_SAFI_TYPE_UNICAST).Enabled = nil isisIntfLevel.GetOrCreateAf(oc.IsisTypes_AFI_TYPE_IPV6, oc.IsisTypes_SAFI_TYPE_UNICAST).Enabled = nil } + if !deviations.ISISInterfaceAfiUnsupported(ts.DUT) { + isisIntfLevel.GetOrCreateAf(oc.IsisTypes_AFI_TYPE_IPV4, oc.IsisTypes_SAFI_TYPE_UNICAST).Enabled = ygot.Bool(true) + isisIntfLevel.GetOrCreateAf(oc.IsisTypes_AFI_TYPE_IPV6, oc.IsisTypes_SAFI_TYPE_UNICAST).Enabled = ygot.Bool(true) + } + isisIntfLevel.GetOrCreateAf(oc.IsisTypes_AFI_TYPE_IPV4, oc.IsisTypes_SAFI_TYPE_UNICAST).Metric = ygot.Uint32(v4Metric) + isisIntfLevel.GetOrCreateAf(oc.IsisTypes_AFI_TYPE_IPV6, oc.IsisTypes_SAFI_TYPE_UNICAST).Metric = ygot.Uint32(v6Metric) } // configureOTG configures isis and traffic on OTG. From d89ec5bd41d75009680d6b4fcb791f6df7040119 Mon Sep 17 00:00:00 2001 From: jianchen-g Date: Fri, 17 Jan 2025 13:16:16 -0800 Subject: [PATCH 2/9] Adding README files for a new type of optics PMD 400G ZR plus (#3680) * bug fixes: 1) in zr_laser_bias_current_test file, the time.Duration function returns value in nanosecond by default, needs to convert it to second; 2) in zr_low_power_mode_test file, to use the transceiver disable OC path, the input needs to be transceiver name instead of interface name. * Adding README files for the testing of a new type of optics 400G ZR++ * add README file for zrp_input_output_power_test * restructed the test folder for two optics PMDs of 400G ZR and ZR++. Each test item has its own folder, under which 400G ZR and ZR++ test scripts are separated. * make sure test paths follow feature/////_test.go * rename folder name to resovle the feature root errors * rename folder name to test_item_tests to resovle the feature root errors * adding tests folder to resolve folder root errors for cd tests * adding folder named tests to resolve folder root errors * rename folder chromatic_dispersion * rename folder performance_metrics --------- Co-authored-by: anksaiki --- .../tests/zr_cd_test/README.md | 0 .../tests/zr_cd_test/metadata.textproto | 0 .../tests/zr_cd_test/zr_cd_test.go | 0 .../tests/zrp_cd_test/README.md | 89 +++++++++ .../README.md | 0 .../metadata.textproto | 0 .../zr_fec_uncorrectable_frames_test.go | 0 .../README.md | 48 +++++ .../tests/zr_firmware_version_test/README.md | 0 .../metadata.textproto | 0 .../zr_firmware_version_test.go | 0 .../tests/zrp_firmware_version_test/README.md | 39 ++++ .../zr_input_output_power_test/README.md | 0 .../metadata.textproto | 0 .../zr_input_output_power_test.go | 0 .../zrp_input_output_power_test/README.md | 138 +++++++++++++ .../tests/zr_inventory_test/README.md | 0 .../zr_inventory_test/metadata.textproto | 0 .../zr_inventory_test/zr_inventory_test.go | 0 .../tests/zrp_inventory_test/README.md | 95 +++++++++ .../zr_laser_bias_current_test/README.md | 0 .../metadata.textproto | 0 .../zr_laser_bias_current_test.go | 0 .../zrp_laser_bias_current_test/README.md | 112 +++++++++++ .../tests/zr_logical_channels_test/README.md | 0 .../metadata.textproto | 0 .../zr_logical_channels_test.go | 0 .../tests/zrp_logical_channels_test/README.md | 142 ++++++++++++++ .../tests/zr_low_power_mode_test/README.md | 0 .../zr_low_power_mode_test/metadata.textproto | 0 .../zr_low_power_mode_test.go | 0 .../tests/zrp_low_power_mode_test/README.md | 134 +++++++++++++ .../tests/zr_pm_test/README.md | 0 .../tests/zr_pm_test/metadata.textproto | 0 .../tests/zr_pm_test/zr_pm_test.go | 0 .../tests/zrp_pm_test/README.md | 100 ++++++++++ .../tests/zr_supply_voltage_test/README.md | 0 .../zr_supply_voltage_test/metadata.textproto | 0 .../zr_supply_voltage_test.go | 0 .../tests/zrp_supply_voltage_test/README.md | 64 ++++++ .../tests/zr_temperature_test/README.md | 0 .../zr_temperature_test/metadata.textproto | 0 .../zr_temperature_test.go | 0 .../tests/zrp_temperature_test/README.md | 79 ++++++++ .../zr_tunable_parameters_test/README.md | 0 .../metadata.textproto | 0 .../zr_tunable_parameters_test.go | 0 .../zrp_tunable_parameters_test/README.md | 184 ++++++++++++++++++ 48 files changed, 1224 insertions(+) rename feature/platform/transceiver/{ => chromatic_dispersion}/tests/zr_cd_test/README.md (100%) rename feature/platform/transceiver/{ => chromatic_dispersion}/tests/zr_cd_test/metadata.textproto (100%) rename feature/platform/transceiver/{ => chromatic_dispersion}/tests/zr_cd_test/zr_cd_test.go (100%) create mode 100644 feature/platform/transceiver/chromatic_dispersion/tests/zrp_cd_test/README.md rename feature/platform/transceiver/{ => fec_uncorrectable_frames}/tests/zr_fec_uncorrectable_frames_test/README.md (100%) rename feature/platform/transceiver/{ => fec_uncorrectable_frames}/tests/zr_fec_uncorrectable_frames_test/metadata.textproto (100%) rename feature/platform/transceiver/{ => fec_uncorrectable_frames}/tests/zr_fec_uncorrectable_frames_test/zr_fec_uncorrectable_frames_test.go (100%) create mode 100644 feature/platform/transceiver/fec_uncorrectable_frames/tests/zrp_fec_uncorrectable_frames_test/README.md rename feature/platform/transceiver/{ => firmware_version}/tests/zr_firmware_version_test/README.md (100%) rename feature/platform/transceiver/{ => firmware_version}/tests/zr_firmware_version_test/metadata.textproto (100%) rename feature/platform/transceiver/{ => firmware_version}/tests/zr_firmware_version_test/zr_firmware_version_test.go (100%) create mode 100644 feature/platform/transceiver/firmware_version/tests/zrp_firmware_version_test/README.md rename feature/platform/transceiver/{ => input_output_power}/tests/zr_input_output_power_test/README.md (100%) rename feature/platform/transceiver/{ => input_output_power}/tests/zr_input_output_power_test/metadata.textproto (100%) rename feature/platform/transceiver/{ => input_output_power}/tests/zr_input_output_power_test/zr_input_output_power_test.go (100%) create mode 100644 feature/platform/transceiver/input_output_power/tests/zrp_input_output_power_test/README.md rename feature/platform/transceiver/{ => inventory}/tests/zr_inventory_test/README.md (100%) rename feature/platform/transceiver/{ => inventory}/tests/zr_inventory_test/metadata.textproto (100%) rename feature/platform/transceiver/{ => inventory}/tests/zr_inventory_test/zr_inventory_test.go (100%) create mode 100644 feature/platform/transceiver/inventory/tests/zrp_inventory_test/README.md rename feature/platform/transceiver/{ => laser_bias_current}/tests/zr_laser_bias_current_test/README.md (100%) rename feature/platform/transceiver/{ => laser_bias_current}/tests/zr_laser_bias_current_test/metadata.textproto (100%) rename feature/platform/transceiver/{ => laser_bias_current}/tests/zr_laser_bias_current_test/zr_laser_bias_current_test.go (100%) create mode 100644 feature/platform/transceiver/laser_bias_current/tests/zrp_laser_bias_current_test/README.md rename feature/platform/transceiver/{ => logical_channels}/tests/zr_logical_channels_test/README.md (100%) rename feature/platform/transceiver/{ => logical_channels}/tests/zr_logical_channels_test/metadata.textproto (100%) rename feature/platform/transceiver/{ => logical_channels}/tests/zr_logical_channels_test/zr_logical_channels_test.go (100%) create mode 100644 feature/platform/transceiver/logical_channels/tests/zrp_logical_channels_test/README.md rename feature/platform/transceiver/{ => low_power_mode}/tests/zr_low_power_mode_test/README.md (100%) rename feature/platform/transceiver/{ => low_power_mode}/tests/zr_low_power_mode_test/metadata.textproto (100%) rename feature/platform/transceiver/{ => low_power_mode}/tests/zr_low_power_mode_test/zr_low_power_mode_test.go (100%) create mode 100644 feature/platform/transceiver/low_power_mode/tests/zrp_low_power_mode_test/README.md rename feature/platform/transceiver/{ => performance_metrics}/tests/zr_pm_test/README.md (100%) rename feature/platform/transceiver/{ => performance_metrics}/tests/zr_pm_test/metadata.textproto (100%) rename feature/platform/transceiver/{ => performance_metrics}/tests/zr_pm_test/zr_pm_test.go (100%) create mode 100644 feature/platform/transceiver/performance_metrics/tests/zrp_pm_test/README.md rename feature/platform/transceiver/{ => supply_voltage}/tests/zr_supply_voltage_test/README.md (100%) rename feature/platform/transceiver/{ => supply_voltage}/tests/zr_supply_voltage_test/metadata.textproto (100%) rename feature/platform/transceiver/{ => supply_voltage}/tests/zr_supply_voltage_test/zr_supply_voltage_test.go (100%) create mode 100644 feature/platform/transceiver/supply_voltage/tests/zrp_supply_voltage_test/README.md rename feature/platform/transceiver/{ => temperature}/tests/zr_temperature_test/README.md (100%) rename feature/platform/transceiver/{ => temperature}/tests/zr_temperature_test/metadata.textproto (100%) rename feature/platform/transceiver/{ => temperature}/tests/zr_temperature_test/zr_temperature_test.go (100%) create mode 100644 feature/platform/transceiver/temperature/tests/zrp_temperature_test/README.md rename feature/platform/transceiver/{ => tunable_parameters}/tests/zr_tunable_parameters_test/README.md (100%) rename feature/platform/transceiver/{ => tunable_parameters}/tests/zr_tunable_parameters_test/metadata.textproto (100%) rename feature/platform/transceiver/{ => tunable_parameters}/tests/zr_tunable_parameters_test/zr_tunable_parameters_test.go (100%) create mode 100644 feature/platform/transceiver/tunable_parameters/tests/zrp_tunable_parameters_test/README.md diff --git a/feature/platform/transceiver/tests/zr_cd_test/README.md b/feature/platform/transceiver/chromatic_dispersion/tests/zr_cd_test/README.md similarity index 100% rename from feature/platform/transceiver/tests/zr_cd_test/README.md rename to feature/platform/transceiver/chromatic_dispersion/tests/zr_cd_test/README.md diff --git a/feature/platform/transceiver/tests/zr_cd_test/metadata.textproto b/feature/platform/transceiver/chromatic_dispersion/tests/zr_cd_test/metadata.textproto similarity index 100% rename from feature/platform/transceiver/tests/zr_cd_test/metadata.textproto rename to feature/platform/transceiver/chromatic_dispersion/tests/zr_cd_test/metadata.textproto diff --git a/feature/platform/transceiver/tests/zr_cd_test/zr_cd_test.go b/feature/platform/transceiver/chromatic_dispersion/tests/zr_cd_test/zr_cd_test.go similarity index 100% rename from feature/platform/transceiver/tests/zr_cd_test/zr_cd_test.go rename to feature/platform/transceiver/chromatic_dispersion/tests/zr_cd_test/zr_cd_test.go diff --git a/feature/platform/transceiver/chromatic_dispersion/tests/zrp_cd_test/README.md b/feature/platform/transceiver/chromatic_dispersion/tests/zrp_cd_test/README.md new file mode 100644 index 00000000000..38d2a7baa9c --- /dev/null +++ b/feature/platform/transceiver/chromatic_dispersion/tests/zrp_cd_test/README.md @@ -0,0 +1,89 @@ +# TRANSCEIVER-1: Telemetry: 400ZR_PLUS Chromatic Dispersion(CD) telemetry values streaming + +## Summary + +Validate 400ZR_PLUS optics module reports accurate CD telemetry values. + +Chromatic Dispersion is frequency dependent change in signal phase velocity due +to fiber measured in ps/nm + +The test must be repeated for each supported operational-mode or as agreed between the vendor and customer. + +## Procedure + +* Connect two ZR_PLUS interfaces using a duplex LC fiber jumper such that TX + output power of one is the RX input power of the other module. Connection + between the modules should pass through an optical switch that can be + controlled through automation to simulate a fiber cut. +* To establish a point to point ZR_PLUS link ensure the following: + * Both transceivers states are enabled + * Both transceivers are set to a valid target TX output power + example -3 dBm + * Both transceivers are tuned to a valid centre frequency + example 193.1 THz +* With the ZR_PLUS link is established as explained above, verify that the + following ZR_PLUS transceiver telemetry paths exist and are streamed for both + the ZR_PLUS optics + * /platform/components/component/optical-channel/state/chromatic-dispersion/instant + * /platform/components/component/optical-channel/state/chromatic-dispersion/avg + * /platform/components/component/optical-channel/state/chromatic-dispersion/min + * /platform/components/component/optical-channel/state/chromatic-dispersion/max + +* When the modules or the devices are still in a boot stage, they must not + stream any invalid string values like "nil" or "-inf" until valid values + are available for streaming. + +* CD streamed values must always be of type Decimal64. + When link interfaces are in down state 0 must be reported as a valid + value. + +**Note:** For min, max, and avg values, 10 second sampling is preferred. If + 10 seconds is not supported, the sampling interval used must be + communicated. + + +* Verify that the optics CD is updated after the interface flaps. + + * Enable a pair of ZR_PLUS interfaces on the DUT as explained above. + * Verify the ZR_PLUS optics CD telemetry values are in the normal range. + * Disable or shut down the interface on the DUT. + * Verify with interfaces in down state both optics are streaming Decimal64 0 + value for CD. + * Re-enable the interfaces on the DUT. + * Verify the ZR_PLUS optics CD telemetry values are updated to the + value in the normal range again. + * Typical CD expected value range is 0 to 2400 ps/nm. + +* Verify that the optics CD is updated after a fiber cut. + + * Enable a pair of ZR_PLUS interfaces on the DUT as explained above. + * Verify the ZR_PLUS optics CD telemetry values are in the normal + range. + * Simulate a fiber cut using the optical switch that sits in-between the + DUT ports. + * Verify with link in down state due to fiber cut both optics are streaming + Decimal64 0 value for CD. + * Re-enable the optical switch connection to clear the fiber cut fault. + * Verify the ZR_PLUS optics CD telemetry values are updated to the value in the normal + range again. + * Typical CD expected value range is 0 to 2400 ps/nm. + +## Config Parameter coverage + +* /components/component/transceiver/config/enabled + +## Telemetry Parameter coverage + +* /platform/components/component/optical-channel/state/chromatic-dispersion/instant +* /platform/components/component/optical-channel/state/chromatic-dispersion/avg +* /platform/components/component/optical-channel/state/chromatic-dispersion/min +* /platform/components/component/optical-channel/state/chromatic-dispersion/max + +## OpenConfig Path and RPC Coverage +```yaml +rpcs: + gnmi: + gNMI.Get: + gNMI.Set: + gNMI.Subscribe: +``` diff --git a/feature/platform/transceiver/tests/zr_fec_uncorrectable_frames_test/README.md b/feature/platform/transceiver/fec_uncorrectable_frames/tests/zr_fec_uncorrectable_frames_test/README.md similarity index 100% rename from feature/platform/transceiver/tests/zr_fec_uncorrectable_frames_test/README.md rename to feature/platform/transceiver/fec_uncorrectable_frames/tests/zr_fec_uncorrectable_frames_test/README.md diff --git a/feature/platform/transceiver/tests/zr_fec_uncorrectable_frames_test/metadata.textproto b/feature/platform/transceiver/fec_uncorrectable_frames/tests/zr_fec_uncorrectable_frames_test/metadata.textproto similarity index 100% rename from feature/platform/transceiver/tests/zr_fec_uncorrectable_frames_test/metadata.textproto rename to feature/platform/transceiver/fec_uncorrectable_frames/tests/zr_fec_uncorrectable_frames_test/metadata.textproto diff --git a/feature/platform/transceiver/tests/zr_fec_uncorrectable_frames_test/zr_fec_uncorrectable_frames_test.go b/feature/platform/transceiver/fec_uncorrectable_frames/tests/zr_fec_uncorrectable_frames_test/zr_fec_uncorrectable_frames_test.go similarity index 100% rename from feature/platform/transceiver/tests/zr_fec_uncorrectable_frames_test/zr_fec_uncorrectable_frames_test.go rename to feature/platform/transceiver/fec_uncorrectable_frames/tests/zr_fec_uncorrectable_frames_test/zr_fec_uncorrectable_frames_test.go diff --git a/feature/platform/transceiver/fec_uncorrectable_frames/tests/zrp_fec_uncorrectable_frames_test/README.md b/feature/platform/transceiver/fec_uncorrectable_frames/tests/zrp_fec_uncorrectable_frames_test/README.md new file mode 100644 index 00000000000..9a36062a6b1 --- /dev/null +++ b/feature/platform/transceiver/fec_uncorrectable_frames/tests/zrp_fec_uncorrectable_frames_test/README.md @@ -0,0 +1,48 @@ +# TRANSCEIVER-10: Telemetry: 400ZR_PLUS Optics FEC(Forward Error Correction) Uncorrectable Frames Streaming. + +## Summary + +Validate 400ZR_PLUS optics module reports uncorrectable FEC frames count. + +This observable represents the number of uncorrectable FEC frames, +measured as RS(544,514) equivalent frames, in a short interval. +This is a post-FEC decoder error metric. + +## Procedure + +* Connect two ZR_PLUS interfaces using a duplex LC fiber jumper such that TX + output power of one is the RX input power of the other module. +* To establish a point to point ZR_PLUS link ensure the following: + * Both transceivers state is enabled + * Both transceivers are set to a valid target TX output power + example -3 dBm + * Both transceivers are tuned to a valid centre frequency + example 193.1 THz +* With the ZR_PLUS link established as explained above, verify that the + following ZR_PLUS transceiver telemetry path exist and is streamed for both + the ZR_PLUS optics. + * /terminal-device/logical-channels/channel/otn/state/fec-uncorrectable-blocks +* Verify that the reported data should be of type yang:counter64. +* When the modules or the devices are still in a boot stage, they must not + stream any invalid string values like "nil" or "-inf". +* Toggle the interface state using /interfaces/interface/config/enabled and + verify relevant FEC uncorrectable frame count is streamed. If there are no + errors a value of 0 should be streamed for no FEC uncorrectable frames. + +## OpenConfig Path and RPC Coverage + +```yaml +paths: + # Config Parameter coverage + /interfaces/interface/config/enabled: + /components/component/transceiver/config/enabled: + platform_type: ["OPTICAL_CHANNEL"] + # Telemetry Parameter coverage + /terminal-device/logical-channels/channel/otn/state/fec-uncorrectable-blocks: + +rpcs: + gnmi: + gNMI.Get: + gNMI.Set: + gNMI.Subscribe: +``` \ No newline at end of file diff --git a/feature/platform/transceiver/tests/zr_firmware_version_test/README.md b/feature/platform/transceiver/firmware_version/tests/zr_firmware_version_test/README.md similarity index 100% rename from feature/platform/transceiver/tests/zr_firmware_version_test/README.md rename to feature/platform/transceiver/firmware_version/tests/zr_firmware_version_test/README.md diff --git a/feature/platform/transceiver/tests/zr_firmware_version_test/metadata.textproto b/feature/platform/transceiver/firmware_version/tests/zr_firmware_version_test/metadata.textproto similarity index 100% rename from feature/platform/transceiver/tests/zr_firmware_version_test/metadata.textproto rename to feature/platform/transceiver/firmware_version/tests/zr_firmware_version_test/metadata.textproto diff --git a/feature/platform/transceiver/tests/zr_firmware_version_test/zr_firmware_version_test.go b/feature/platform/transceiver/firmware_version/tests/zr_firmware_version_test/zr_firmware_version_test.go similarity index 100% rename from feature/platform/transceiver/tests/zr_firmware_version_test/zr_firmware_version_test.go rename to feature/platform/transceiver/firmware_version/tests/zr_firmware_version_test/zr_firmware_version_test.go diff --git a/feature/platform/transceiver/firmware_version/tests/zrp_firmware_version_test/README.md b/feature/platform/transceiver/firmware_version/tests/zrp_firmware_version_test/README.md new file mode 100644 index 00000000000..a33fc2b72a7 --- /dev/null +++ b/feature/platform/transceiver/firmware_version/tests/zrp_firmware_version_test/README.md @@ -0,0 +1,39 @@ +# TRANSCEIVER-3: Telemetry: 400ZR_PLUS Optics firmware version streaming + +## Summary + +Validate 400ZR_PLUS optics module reports correct firmware version. + +## Procedure + +* Plug in the ZR_PLUS module in the host port and make sure the transceiver + state is enabled and host is able to detect the module. +* With the module correctly recognized verify it reports correct firmware + version through the following telemetry path + * /platform/components/component/state/firmware-version + +* Verify that the modules firmware version is reported correctly after a + optic software reset. + + * With ZR_PLUS module plugged in the host and properly recognized + * Verify the ZR_PLUS optics firmware version is correctly reported via the + streaming telemetry path above. + * Reset the optic through software + * Verify the ZR_PLUS optics still reports correct firmware version. + +## Config Parameter coverage + +* /components/component/oc-transceiver:transceiver/oc-transceiver/config/enabled + +## Telemetry Parameter coverage + + * /platform/components/component/state/firmware-version + +## OpenConfig Path and RPC Coverage +```yaml +rpcs: + gnmi: + gNMI.Get: + gNMI.Set: + gNMI.Subscribe: +``` diff --git a/feature/platform/transceiver/tests/zr_input_output_power_test/README.md b/feature/platform/transceiver/input_output_power/tests/zr_input_output_power_test/README.md similarity index 100% rename from feature/platform/transceiver/tests/zr_input_output_power_test/README.md rename to feature/platform/transceiver/input_output_power/tests/zr_input_output_power_test/README.md diff --git a/feature/platform/transceiver/tests/zr_input_output_power_test/metadata.textproto b/feature/platform/transceiver/input_output_power/tests/zr_input_output_power_test/metadata.textproto similarity index 100% rename from feature/platform/transceiver/tests/zr_input_output_power_test/metadata.textproto rename to feature/platform/transceiver/input_output_power/tests/zr_input_output_power_test/metadata.textproto diff --git a/feature/platform/transceiver/tests/zr_input_output_power_test/zr_input_output_power_test.go b/feature/platform/transceiver/input_output_power/tests/zr_input_output_power_test/zr_input_output_power_test.go similarity index 100% rename from feature/platform/transceiver/tests/zr_input_output_power_test/zr_input_output_power_test.go rename to feature/platform/transceiver/input_output_power/tests/zr_input_output_power_test/zr_input_output_power_test.go diff --git a/feature/platform/transceiver/input_output_power/tests/zrp_input_output_power_test/README.md b/feature/platform/transceiver/input_output_power/tests/zrp_input_output_power_test/README.md new file mode 100644 index 00000000000..44cdff7f15b --- /dev/null +++ b/feature/platform/transceiver/input_output_power/tests/zrp_input_output_power_test/README.md @@ -0,0 +1,138 @@ +# TRANSCEIVER-4: Telemetry: 400ZR_PLUS RX input and TX output power telemetry values streaming. + +## Summary + +Validate 400ZR_PLUS optics modules report accurate RX input and TX output power +telemetry values. + +As per CMIS ZR_PLUS modules report two types of RX input power and one TX output +power. +* RX Signal Power + * Reports the actual signal power after filtering out any extra noise. + * Is mapped to /component/optical-channel/ full path shown below +* RX Total Power + * Reports RX Signal Power plus noise without any filtering. + * Is mapped to /component/transceiver/physical-channel full path shown below +* TX Output Power + * This is the total TX output power + * Is mapped to component/optical-channel/ full path shown below + +The test must be repeated for each supported operational-mode or as agreed between the vendor and customer. + +## TRANSCEIVER-4.1 + +* Connect two ZR_PLUS interfaces using a duplex LC fiber jumper such that TX + output power of one is the RX input power of the other module. Connection + between the modules should pass through an optical switch that can be + controlled through automation to simulate a fiber cut. +* To establish a point to point ZR_PLUS link ensure the following: + * Both transceivers states are enabled + * Both transceivers are set to a valid target TX output power + example -3 dBm + * Both transceivers are tuned to a valid centre frequency + example 193.1 THz +* With the ZR_PLUS link is established as explained above, verify that the + following ZR_PLUS transceiver telemetry paths exist and are streamed for both + the ZR_PLUS optics + * /components/component/optical-channel/state/input-power/instant + * /components/component/optical-channel/state/input-power/avg + * /components/component/optical-channel/state/input-power/min + * /components/component/optical-channel/state/input-power/max + * /components/component/optical-channel/state/output-power/instant + * /components/component/optical-channel/state/output-power/avg + * /components/component/optical-channel/state/output-power/min + * /components/component/optical-channel/state/output-power/max + * /components/component/transceiver/physical-channel/channel/state/input-power/instant + * /components/component/transceiver/physical-channel/channel/state/input-power/min + * /components/component/transceiver/physical-channel/channel/state/input-power/max + * /components/component/transceiver/physical-channel/channel/state/input-power/avg + +## TRANSCEIVER-4.2 + +* When the modules or the devices are still in a boot stage, they must not + stream any invalid string values like "nil" or "-inf" until valid values + are available for streaming. + +* RX Input and TX output power values must always be of type decimal64. + When link interfaces are in down state RX Input power of -40 dbm must be + reported as a valid value. + +**Note:** For min, max, and avg values, 10 second sampling is preferred. If + 10 seconds is not supported, the sampling interval used must be + communicated. + +## TRANSCEIVER-4.3 + +* Verify that the optics RX input and TX output power is updated after the + interface flaps. + + * Enable a pair of ZR_PLUS interfaces on the DUT as explained above. + * Verify the ZR_PLUS optics RX input and TX output power telemetry values are + in the normal range. + * Verify that RX Signal Power is less than the RX Total Power. + * Disable or shut down the interface on the DUT. + * Verify with interfaces in down state both optics are streaming decimal64 0 + value for both RX input and TX output power. + * Re-enable the interfaces on the DUT. + * Verify the ZR_PLUS optics RX input and TX output power telemetry values are + updated to the value in the normal range again. + * Typical min/max value range for RX Signal Power -10 to -5 dbm. + * Typical min/max value range for TX Output Power -7 to 0 dbm. + +## TRANSCEIVER-4.4 + +* Verify that the optics RX input and TX output power is updated after a + fiber cut. + + * Enable a pair of ZR_PLUS interfaces on the DUT as explained above. + * Verify the ZR_PLUS optics RX input and TX output power telemetry values are + in the normal range. + * Verify that RX Signal Power is less than the RX Total Power. + * Simulate a fiber cut using the optical switch that sits in-between the + DUT ports. + * Verify with link in down state due to fiber cut both optics are streaming + decimal64 0 value for both RX input and TX output power. + * Re-enable the optical switch connection to clear the fiber cut fault. + * Verify the ZR_PLUS optics RX input and TX output power telemetry values are + updated to the value in the normal range again. + * Typical min/max value range for RX Signal Power -10 to -5 dbm. + * Typical min/max value range for TX Output Power -7 to 0 dbm. + +## OpenConfig Path and RPC Coverage + +```yaml +paths: + # Config Parameter coverage + /interfaces/interface/config/enabled: + # Telemetry Parameter coverage + /components/component/optical-channel/state/input-power/instant: + platform_type: ["OPTICAL_CHANNEL"] + /components/component/optical-channel/state/input-power/avg: + platform_type: ["OPTICAL_CHANNEL"] + /components/component/optical-channel/state/input-power/min: + platform_type: ["OPTICAL_CHANNEL"] + /components/component/optical-channel/state/input-power/max: + platform_type: ["OPTICAL_CHANNEL"] + /components/component/optical-channel/state/output-power/instant: + platform_type: ["OPTICAL_CHANNEL"] + /components/component/optical-channel/state/output-power/avg: + platform_type: ["OPTICAL_CHANNEL"] + /components/component/optical-channel/state/output-power/min: + platform_type: ["OPTICAL_CHANNEL"] + /components/component/optical-channel/state/output-power/max: + platform_type: ["OPTICAL_CHANNEL"] + /components/component/transceiver/physical-channels/channel/state/input-power/instant: + platform_type: [ "TRANSCEIVER" ] + /components/component/transceiver/physical-channels/channel/state/input-power/min: + platform_type: [ "TRANSCEIVER" ] + /components/component/transceiver/physical-channels/channel/state/input-power/max: + platform_type: [ "TRANSCEIVER" ] + /components/component/transceiver/physical-channels/channel/state/input-power/avg: + platform_type: [ "TRANSCEIVER" ] + +rpcs: + gnmi: + gNMI.Get: + gNMI.Set: + gNMI.Subscribe: +``` \ No newline at end of file diff --git a/feature/platform/transceiver/tests/zr_inventory_test/README.md b/feature/platform/transceiver/inventory/tests/zr_inventory_test/README.md similarity index 100% rename from feature/platform/transceiver/tests/zr_inventory_test/README.md rename to feature/platform/transceiver/inventory/tests/zr_inventory_test/README.md diff --git a/feature/platform/transceiver/tests/zr_inventory_test/metadata.textproto b/feature/platform/transceiver/inventory/tests/zr_inventory_test/metadata.textproto similarity index 100% rename from feature/platform/transceiver/tests/zr_inventory_test/metadata.textproto rename to feature/platform/transceiver/inventory/tests/zr_inventory_test/metadata.textproto diff --git a/feature/platform/transceiver/tests/zr_inventory_test/zr_inventory_test.go b/feature/platform/transceiver/inventory/tests/zr_inventory_test/zr_inventory_test.go similarity index 100% rename from feature/platform/transceiver/tests/zr_inventory_test/zr_inventory_test.go rename to feature/platform/transceiver/inventory/tests/zr_inventory_test/zr_inventory_test.go diff --git a/feature/platform/transceiver/inventory/tests/zrp_inventory_test/README.md b/feature/platform/transceiver/inventory/tests/zrp_inventory_test/README.md new file mode 100644 index 00000000000..d7b3ca287c7 --- /dev/null +++ b/feature/platform/transceiver/inventory/tests/zrp_inventory_test/README.md @@ -0,0 +1,95 @@ +# TRANSCEIVER-7: Telemetry: 400ZR_PLUS Optics inventory info streaming + +## Summary + +Validate 400ZR_PLUS modules report correct inventory information. + +## Procedure + +* Plug in the ZR_PLUS module in the host port and make sure the transceiver + state is enabled and host is able to detect the module. +* With the module recognized verify it reports correct inventory + information by subscribing ON_CHANGE to the following telemetry paths. + + * /platform/components/component/state/serial-no + * /platform/components/component/state/part-no + * /platform/components/component/state/type + * /platform/components/component/state/description + * /platform/components/component/state/mfg-name + * /platform/components/component/state/mfg-date + * /platform/components/component/state/hardware-version + * /platform/components/component/state/firmware-version + +* Validate the streamed inventory information data is of type String. + +* Verify that the modules inventory information is reported correctly after + an optic software reset. + + * With ZR_PLUS module plugged in the host and properly recognized + * Verify the ZR_PLUS optics inventory is correctly reported via the + streaming telemetry paths above. + * Reset the optic by enabling and disabling the transceiver state + through /components/component/transceiver/config/enabled. + * Wait at least 20 seconds in between toggling transceiver state. + * Verify the ZR_PLUS optics still reports correct inventory information. + * Telemetry subscription should be ON_CHANGE and streamed data should + be of type String. + +* Verify that the modules inventory information is reported correctly when + interface state is disabled. + + * With ZR_PLUS module plugged in the host and properly recognized + * Use /interfaces/interface/config/enabled to disable the module + interface state, wait 20 seconds. + * Verify the ZR_PLUS optics inventory information is correctly reported via + the streaming telemetry paths above in this state. + * Telemetry subscription should be ON_CHANGE and streamed data should + be of type String. + +* Verify the module behaviour and related inventory information when + transceiver state is set to disabled. + + * With ZR_PLUS module plugged in the host and properly recognized. + * Use /components/component/transceiver/config/enabled to disable the + module transceiver state, wait 20 seconds. + * Verify the ZR_PLUS module is powered off and no inventory information + reported via the streaming telemetry paths above in this state. + * When a component is powered off and is dropped from the inventory list + explicit deletes for the relevant entity leaves should be streamed + to clear any stale data. + * Telemetry subscription should be ON_CHANGE and there should be no + streamed inventory data in this state. + +* Verify the module inventory information updates when transceiver under test + is swapped with a different one. + * Make sure ZR_PLUS module plugged in the host and properly recognized. + * Verify module is reporting valid inventory information. + * Swap the module with a different one and validate that the new + inventory information is correctly streamed now. + * Telemetry subscription should be ON_CHANGE and streamed data should + be of type String. + +## Config Parameter coverage + +* /components/component/transceiver/config/enabled +* /interfaces/interface/config/enabled + +## Telemetry Parameter coverage + +* /platform/components/component/state/serial-no +* /platform/components/component/state/part-no +* /platform/components/component/state/type +* /platform/components/component/state/description +* /platform/components/component/state/mfg-name +* /platform/components/component/state/mfg-date +* /platform/components/component/state/hardware-version +* /platform/components/component/state/firmware-version + +## OpenConfig Path and RPC Coverage +```yaml +rpcs: + gnmi: + gNMI.Get: + gNMI.Set: + gNMI.Subscribe: +``` diff --git a/feature/platform/transceiver/tests/zr_laser_bias_current_test/README.md b/feature/platform/transceiver/laser_bias_current/tests/zr_laser_bias_current_test/README.md similarity index 100% rename from feature/platform/transceiver/tests/zr_laser_bias_current_test/README.md rename to feature/platform/transceiver/laser_bias_current/tests/zr_laser_bias_current_test/README.md diff --git a/feature/platform/transceiver/tests/zr_laser_bias_current_test/metadata.textproto b/feature/platform/transceiver/laser_bias_current/tests/zr_laser_bias_current_test/metadata.textproto similarity index 100% rename from feature/platform/transceiver/tests/zr_laser_bias_current_test/metadata.textproto rename to feature/platform/transceiver/laser_bias_current/tests/zr_laser_bias_current_test/metadata.textproto diff --git a/feature/platform/transceiver/tests/zr_laser_bias_current_test/zr_laser_bias_current_test.go b/feature/platform/transceiver/laser_bias_current/tests/zr_laser_bias_current_test/zr_laser_bias_current_test.go similarity index 100% rename from feature/platform/transceiver/tests/zr_laser_bias_current_test/zr_laser_bias_current_test.go rename to feature/platform/transceiver/laser_bias_current/tests/zr_laser_bias_current_test/zr_laser_bias_current_test.go diff --git a/feature/platform/transceiver/laser_bias_current/tests/zrp_laser_bias_current_test/README.md b/feature/platform/transceiver/laser_bias_current/tests/zrp_laser_bias_current_test/README.md new file mode 100644 index 00000000000..76d5c520f02 --- /dev/null +++ b/feature/platform/transceiver/laser_bias_current/tests/zrp_laser_bias_current_test/README.md @@ -0,0 +1,112 @@ +# TRANSCEIVER-9: Telemetry: 400ZR_PLUS TX laser bias current telemetry values streaming. + +## Summary + +Validate 400ZR_PLUS optics modules report accurate laser bias current telemetry +values. + +As per [CMIS](https://www.oiforum.com/wp-content/uploads/CMIS3p0_Third_Party_Spec.pdf): + +Measured Tx laser bias current is represented as a 16-bit unsigned integer with +the current defined as the 12 full 16-bit value (0 to 65535) with LSB equal to +2 uA times the multiplier from Byte 01h:160. For a multiplier of 13 1, +this yields a total measurement range of 0 to 131 mA. + +Accuracy must be better than +/-10% of the manufacturer's nominal value over +specified operating temperature and voltage. + + +## TRANSCEIVER-9.1 + +* Connect two ZR_PLUS interfaces using a duplex LC fiber jumper such that TX + output power of one is the RX input power of the other module. Connection + between the modules should pass through an optical switch that can be + controlled through automation to simulate a fiber cut as needed. +* To establish a point to point ZR_PLUS link ensure the following: + * Both transceivers states are enabled + * Both transceivers are set to a valid target TX output power + example -3 dBm + * Both transceivers are tuned to a valid centre frequency + example 193.1 THz +* With the ZR_PLUS link is established as explained above, verify that the + following ZR_PLUS transceiver telemetry paths exist and are streamed for both + the ZR_PLUS optics + + * /components/component/optical-channel/state/laser-bias-current/instant + * /components/component/optical-channel/state/laser-bias-current/avg + * /components/component/optical-channel/state/laser-bias-current/min + * /components/component/optical-channel/state/laser-bias-current/max + + +## TRANSCEIVER-9.2 + +* When the modules or the devices are still in a boot stage, they must not + stream any invalid string values like "nil" or "-inf". + +* Laser bias current values must always be of type decimal64. + When laser is in off state 0 must be reported as a valid value. + +**Note:** For min, max, and avg values, 10 second sampling is preferred. If the + min, max average values or the 10 seconds sampling is not supported, + the sampling interval used must be specified and this must be + captured by adding a deviation to the test. + +## TRANSCEIVER-9.3 + +* Verify that the TX laser bias current is updated after an interface + enable / disable state change. + + * Enable a pair of ZR_PLUS interfaces on the DUT as explained above. + * Verify the ZR_PLUS optics TX laser bias current telemetry values are + in the normal range. + * Use /interfaces/interface/config/enabled to disable the interfaces so + that the TX laser is squelched / turned off. + * Verify with interface state disabled and link down, decimal64 0 value + is streamed for both optics TX laser bias current. + * Re-enable the optics using /interfaces/interface/config/enabled. + * Verify the ZR_PLUS optics TX laser bias current telemetry values are + updated to the value in the normal range again. + * Typical measurement range 0 to 131 mA. + +## TRANSCEIVER-9.4 + +* Verify that the TX laser bias current is updated after transceiver power + ON / OFF state change. + + * Enable a pair of ZR_PLUS interfaces on the DUT as explained above. + * Verify the ZR_PLUS optics TX laser bias current telemetry values are + in the normal range. + * Use /components/component/transceiver/config/enabled to power off the + transceiver so that the TX laser is squelched / turned off. + * Verify with transceiver state disabled and link down, no value + is streamed for both optics TX laser bias current. + * Re-enable the optics using + /components/component/transceiver/config/enabled. + * Verify the ZR_PLUS optics TX laser bias current telemetry values are + updated to the value in the normal range again. + * Typical measurement range 0 to 131 mA. + +## OpenConfig Path and RPC Coverage + +The below yaml defines the OC paths intended to be covered by this test. OC paths used for test setup are not listed here. + +```yaml +paths: + ## Config Paths ## + /components/component/transceiver/config/enabled: + platform_type: [ "OPTICAL_CHANNEL" ] + /interfaces/interface/config/enabled: + ## State Paths ## + /components/component/optical-channel/state/laser-bias-current/instant: + platform_type: [ "OPTICAL_CHANNEL" ] + /components/component/optical-channel/state/laser-bias-current/avg: + platform_type: [ "OPTICAL_CHANNEL" ] + /components/component/optical-channel/state/laser-bias-current/min: + platform_type: [ "OPTICAL_CHANNEL" ] + /components/component/optical-channel/state/laser-bias-current/max: + platform_type: [ "OPTICAL_CHANNEL" ] + +rpcs: + gnmi: + gNMI.Subscribe: +``` diff --git a/feature/platform/transceiver/tests/zr_logical_channels_test/README.md b/feature/platform/transceiver/logical_channels/tests/zr_logical_channels_test/README.md similarity index 100% rename from feature/platform/transceiver/tests/zr_logical_channels_test/README.md rename to feature/platform/transceiver/logical_channels/tests/zr_logical_channels_test/README.md diff --git a/feature/platform/transceiver/tests/zr_logical_channels_test/metadata.textproto b/feature/platform/transceiver/logical_channels/tests/zr_logical_channels_test/metadata.textproto similarity index 100% rename from feature/platform/transceiver/tests/zr_logical_channels_test/metadata.textproto rename to feature/platform/transceiver/logical_channels/tests/zr_logical_channels_test/metadata.textproto diff --git a/feature/platform/transceiver/tests/zr_logical_channels_test/zr_logical_channels_test.go b/feature/platform/transceiver/logical_channels/tests/zr_logical_channels_test/zr_logical_channels_test.go similarity index 100% rename from feature/platform/transceiver/tests/zr_logical_channels_test/zr_logical_channels_test.go rename to feature/platform/transceiver/logical_channels/tests/zr_logical_channels_test/zr_logical_channels_test.go diff --git a/feature/platform/transceiver/logical_channels/tests/zrp_logical_channels_test/README.md b/feature/platform/transceiver/logical_channels/tests/zrp_logical_channels_test/README.md new file mode 100644 index 00000000000..d79558ddcb4 --- /dev/null +++ b/feature/platform/transceiver/logical_channels/tests/zrp_logical_channels_test/README.md @@ -0,0 +1,142 @@ +# TRANSCEIVER-11: Telemetry: 400ZR_PLUS Optics logical channels provisioning and related telemetry. + +## Summary + +Routing devices that support transceivers with built-in DSPs like 400ZR_PLUS consume +the [OC-terminal-device model](https://openconfig.net/projects/models/schemadocs/jstree/openconfig-terminal-device.html) +model. +The ZR_PLUS signal in these transceivers traverses through a series of +terminal-device/logical-channels. The series of logical-channel utilizes the +assignment/optical-channel leaf to create the relationship to +OPTICAL_CHANNEL. For 400ZR_PLUS 1x400GE mode this heirarchy looks like: +400GE Eth. Logical Channel => 400G Coherent Logical Channel => OPTICAL_CHANNEL +Purpose of this test is to verify the logical channel provisioning and related +telemetry. + +## Procedure + +* Connect two ZR_PLUS interfaces using a duplex LC fiber jumper such that TX + output power of one is the RX input power of the other module. Optics can be + connected through passive patch panels or an optical switch as needed, as + long as the overall link loss budget is kept under 2 - 3 dB. There is no + requirement to deploy a separate line system for the functional tests. + +## Testbed Type +* Typical test setup for this test is a DUT1 with 2 ports to 2 ATE ports or 2 + ports to a second DUT2. For most tests this setup should be sufficient. + Ref: [Typical ATE<>DUT Test bed](https://github.com/openconfig/featureprofiles/blob/main/topologies/atedut_2.testbed) +* A and Z ends of the link should have same 400ZR_PLUS PMD. For this test a + single DUT ZR_PLUS port connected to a single ZR_PLUS ATE port is also sufficient. + +Once the ZR_PLUS link is estabished proceed to configure the following entities: + +### TRANSCEIVER 11.1 - Test Optical Channel and Tunable Parameters +* Ensure optical channel related tunable parameters are set through the + following OC paths such that + * Both transceivers state is enabled + * Both transceivers related optical channel tunable parameters are set + to a valid target TX output power example -3 dBm + * Both transceivers are tuned to a valid centre frequency + example 193.1 THz + * /components/component/transceiver/config/enabled + * /components/component/optical-channel/config/frequency + * /components/component/optical-channel/config/target-output-power + * /components/component/optical-channel/config/operational-mode + +### TRANSCEIVER 11.2 - Test Ethernet Logical Channels +* Ensure terminal-device ethernet-logical-channels are set through the + following OC paths + * /terminal-device/logical-channels/channel/config/admin-state + * /terminal-device/logical-channels/channel/config/description + * /terminal-device/logical-channels/channel/config/index + * /terminal-device/logical-channels/channel/config/logical-channel-type + * /terminal-device/logical-channels/channel/config/rate-class + * /terminal-device/logical-channels/channel/config/trib-protocol + * /terminal-device/logical-channels/channel/logical-channel-assignments/assignment/config/allocation + * /terminal-device/logical-channels/channel/logical-channel-assignments/assignment/config/assignment-type + * /terminal-device/logical-channels/channel/logical-channel-assignments/assignment/config/description + * /terminal-device/logical-channels/channel/logical-channel-assignments/assignment/config/index + * /terminal-device/logical-channels/channel/logical-channel-assignments/assignment/config/logical-channel + * /terminal-device/logical-channels/channel/logical-channel-assignments/assignment/config/optical-channel +* Typical Settings for an Ethernet Logical Channel are shown below: + * logical-channel-type: PROT_ETHERNET + * trib-protocol: PROT_400GE + * rate-class: TRIB_RATE_400G + * admin-state: ENABLED + * description: ETH Logical Channel + * index: 40000 (unique integer value) +* Not that each logical-channel created above must be assigned an integer value that + is unique across the system. + +### TRANSCEIVER 11.3 - Test Coherent Logical Channels +* Ensure terminal-device coherent-logical-channels are set through the + following OC paths + * /terminal-device/logical-channels/channel/config/admin-state + * /terminal-device/logical-channels/channel/config/description + * /terminal-device/logical-channels/channel/config/index + * /terminal-device/logical-channels/channel/config/logical-channel-type + * /terminal-device/logical-channels/channel/config/rate-class + * /terminal-device/logical-channels/channel/config/trib-protocol + * /terminal-device/logical-channels/channel/logical-channel-assignments/assignment/config/allocation + * /terminal-device/logical-channels/channel/logical-channel-assignments/assignment/config/assignment-type + * /terminal-device/logical-channels/channel/logical-channel-assignments/assignment/config/description + * /terminal-device/logical-channels/channel/logical-channel-assignments/assignment/config/index + * /terminal-device/logical-channels/channel/logical-channel-assignments/assignment/config/logical-channel + * /terminal-device/logical-channels/channel/logical-channel-assignments/assignment/config/optical-channel +* Typical setting for a coherent logical channel are shown below: + * logical-channel-type: PROT_OTN + * admin-state: ENABLED + * description: Coherent Logical Channel + * index: 40004 (unique integer value) + +* With above optical and logical channels configured verify DUT is able to + stream corresponding telemetry leaves under these logical and optical + channels. List of such telemetry leaves covered under this test is documented + below under Telemetry Parameter coverage heading. + +**Note**: There are other telemetry and config leaves related to optical and + logical channels that are covered under separately published tests + under platforms/transceiver. + +## Config Parameter coverage + +* /components/component/transceiver/config/enabled +* /interfaces/interface/config/enabled +* /terminal-device/logical-channels/channel/config/admin-state +* /terminal-device/logical-channels/channel/config/description +* /terminal-device/logical-channels/channel/config/index +* /terminal-device/logical-channels/channel/config/logical-channel-type +* /terminal-device/logical-channels/channel/config/rate-class +* /terminal-device/logical-channels/channel/config/trib-protocol +* /terminal-device/logical-channels/channel/logical-channel-assignments/assignment/config/allocation +* /terminal-device/logical-channels/channel/logical-channel-assignments/assignment/config/assignment-type +* /terminal-device/logical-channels/channel/logical-channel-assignments/assignment/config/description +* /terminal-device/logical-channels/channel/logical-channel-assignments/assignment/config/index +* /terminal-device/logical-channels/channel/logical-channel-assignments/assignment/config/logical-channel +* /terminal-device/logical-channels/channel/logical-channel-assignments/assignment/config/optical-channel + +## Telemetry Parameter coverage + +* /components/component/transceiver/config/enabled +* /interfaces/interface/config/enabled +* /terminal-device/logical-channels/channel/state/admin-state +* /terminal-device/logical-channels/channel/state/description +* /terminal-device/logical-channels/channel/state/index +* /terminal-device/logical-channels/channel/state/logical-channel-type +* /terminal-device/logical-channels/channel/state/rate-class +* /terminal-device/logical-channels/channel/state/trib-protocol +* /terminal-device/logical-channels/channel/logical-channel-assignments/assignment/state/allocation +* /terminal-device/logical-channels/channel/logical-channel-assignments/assignment/state/assignment-type +* /terminal-device/logical-channels/channel/logical-channel-assignments/assignment/state/description +* /terminal-device/logical-channels/channel/logical-channel-assignments/assignment/state/index +* /terminal-device/logical-channels/channel/logical-channel-assignments/assignment/state/logical-channel +* /terminal-device/logical-channels/channel/logical-channel-assignments/assignment/state/optical-channel + +## OpenConfig Path and RPC Coverage +```yaml +rpcs: + gnmi: + gNMI.Get: + gNMI.Set: + gNMI.Subscribe: +``` diff --git a/feature/platform/transceiver/tests/zr_low_power_mode_test/README.md b/feature/platform/transceiver/low_power_mode/tests/zr_low_power_mode_test/README.md similarity index 100% rename from feature/platform/transceiver/tests/zr_low_power_mode_test/README.md rename to feature/platform/transceiver/low_power_mode/tests/zr_low_power_mode_test/README.md diff --git a/feature/platform/transceiver/tests/zr_low_power_mode_test/metadata.textproto b/feature/platform/transceiver/low_power_mode/tests/zr_low_power_mode_test/metadata.textproto similarity index 100% rename from feature/platform/transceiver/tests/zr_low_power_mode_test/metadata.textproto rename to feature/platform/transceiver/low_power_mode/tests/zr_low_power_mode_test/metadata.textproto diff --git a/feature/platform/transceiver/tests/zr_low_power_mode_test/zr_low_power_mode_test.go b/feature/platform/transceiver/low_power_mode/tests/zr_low_power_mode_test/zr_low_power_mode_test.go similarity index 100% rename from feature/platform/transceiver/tests/zr_low_power_mode_test/zr_low_power_mode_test.go rename to feature/platform/transceiver/low_power_mode/tests/zr_low_power_mode_test/zr_low_power_mode_test.go diff --git a/feature/platform/transceiver/low_power_mode/tests/zrp_low_power_mode_test/README.md b/feature/platform/transceiver/low_power_mode/tests/zrp_low_power_mode_test/README.md new file mode 100644 index 00000000000..012277f8223 --- /dev/null +++ b/feature/platform/transceiver/low_power_mode/tests/zrp_low_power_mode_test/README.md @@ -0,0 +1,134 @@ +# TRANSCEIVER-13: Configuration: 400ZR_PLUS Transceiver Low Power Mode Setting. + +## Summary + +Validate 400ZR_PLUS transceiver is able to move to low power consumption mode when +the interface/config/enabled state is set to "False" + +**NOTE:** The Module Power Mode dictates the maximum electrical power that the +module is permitted to consume while operating in that Module Power Mode. +The Module Power Mode is a function of the state of the Module State Machine. +Two Module Power Modes are defined: + * In Low Power Mode (characteristic of all MSM steady states except + ModuleReady) the maximum module power consumption is defined in the form + factor-specific hardware specification. + * In High Power Mode (characteristic of the MSM state ModuleReady) the + implementation dependent maximum module power consumption is advertised in + the MaxPower Byte 00h:201. More details in the CMIS link below. + +Link to CMIS: +https://www.oiforum.com/wp-content/uploads/CMIS5p0_Third_Party_Spec.pdf + +## Procedure + +* Connect two ZR_PLUS optics using a duplex LC fiber jumper such that TX + output power of one is the RX input power of the other module. +* To establish a point to point ZR_PLUS link ensure the following: + * Both transceivers state is enabled. + * Both transceivers are set to a valid target TX output power + example -3 dBm. + * Both transceivers are tuned to a valid centre frequency + example 193.1 THz. +## Testbed Type +* Typical test setup for this test is a DUT1 with 2 ports to 2 ATE ports or 2 + ports to a second DUT2. For most tests this setup should be sufficient. + Ref: [Typical ATE<>DUT Test bed](https://github.com/openconfig/featureprofiles/blob/main/topologies/atedut_2.testbed) +* A and Z ends of the link should have same 400ZR_PLUS PMD. For this test a + single DUT ZR_PLUS port connected to a single ZR_PLUS ATE port is also sufficient. + +Once the ZR_PLUS link is estabished proceed with the following: +* Verify that the following ZR_PLUS transceiver OC path when set to False is able + to move to the low power mode as defined in the CMIS. + + * /interfaces/interface/config/enabled + +* In low power mode the module's Management interface should be available, + entire paged management memory should be accessible. During this state, + the host may configure the module using the management interface to read + from and write to the management Memory Map. + +* The Data Path State of all lanes is still DPDeactivated in the ModuleLowPwr + state. + +* With module in low power mode verify that the module is still able to + report inventory information through the following OC paths. + + * /platform/components/component/state/serial-no + * /platform/components/component/state/part-no + * /platform/components/component/state/type + * /platform/components/component/state/description + * /platform/components/component/state/mfg-name + * /platform/components/component/state/mfg-date + * /platform/components/component/state/hardware-version + * /platform/components/component/state/firmware-version + +* With module in low power mode verify that the module laser is squelched + and it is no longer able to report output-power under the following OC + paths. + * /components/component/optical-channel/state/output-power/instant + * /components/component/optical-channel/state/output-power/avg + * /components/component/optical-channel/state/output-power/min + * /components/component/optical-channel/state/output-power/max + +* Set the interface/config/enabled state to True + + * Verify module is able to transition into High Power Mode. + * In this state module is still able to report all the inventory + information as verified above. + * In this state verify module is able to report a valid output power + through the following OC paths as provisioned earlier. + + * /components/component/optical-channel/state/output-power/instant + * /components/component/optical-channel/state/output-power/avg + * /components/component/optical-channel/state/output-power/min + * /components/component/optical-channel/state/output-power/max + + * Verify the ZR_PLUS optics TX output power telemetry values are updated to + the value in the normal range again. + * Typical min/max value range for TX Output Power -7 to 0 dbm. + * values must always be of type decimal64. + * When link interfaces are in down state 0 must be reported as a valid + value. + + * When the modules or the devices are still in a boot stage, they must not + stream any invalid string values like "nil" or "-inf" until valid values + are available for streaming. + +## OpenConfig Path and RPC Coverage + +```yaml +paths: + # Configure parameter + /interfaces/interface/config/enabled: + # Telemetry Parameter coverage + /components/component/state/serial-no: + platform_type: ["OPTICAL_CHANNEL"] + /components/component/state/part-no: + platform_type: ["OPTICAL_CHANNEL"] + /components/component/state/type: + platform_type: ["OPTICAL_CHANNEL"] + /components/component/state/description: + platform_type: ["OPTICAL_CHANNEL"] + /components/component/state/mfg-name: + platform_type: ["OPTICAL_CHANNEL"] + /components/component/state/mfg-date: + platform_type: ["OPTICAL_CHANNEL"] + /components/component/state/hardware-version: + platform_type: ["OPTICAL_CHANNEL"] + /components/component/state/firmware-version: + platform_type: ["OPTICAL_CHANNEL"] + /components/component/optical-channel/state/output-power/instant: + platform_type: ["OPTICAL_CHANNEL"] + /components/component/optical-channel/state/output-power/avg: + platform_type: ["OPTICAL_CHANNEL"] + /components/component/optical-channel/state/output-power/min: + platform_type: ["OPTICAL_CHANNEL"] + /components/component/optical-channel/state/output-power/max: + platform_type: ["OPTICAL_CHANNEL"] + +rpcs: + gnmi: + gNMI.Get: + gNMI.Set: + gNMI.Subscribe: +``` \ No newline at end of file diff --git a/feature/platform/transceiver/tests/zr_pm_test/README.md b/feature/platform/transceiver/performance_metrics/tests/zr_pm_test/README.md similarity index 100% rename from feature/platform/transceiver/tests/zr_pm_test/README.md rename to feature/platform/transceiver/performance_metrics/tests/zr_pm_test/README.md diff --git a/feature/platform/transceiver/tests/zr_pm_test/metadata.textproto b/feature/platform/transceiver/performance_metrics/tests/zr_pm_test/metadata.textproto similarity index 100% rename from feature/platform/transceiver/tests/zr_pm_test/metadata.textproto rename to feature/platform/transceiver/performance_metrics/tests/zr_pm_test/metadata.textproto diff --git a/feature/platform/transceiver/tests/zr_pm_test/zr_pm_test.go b/feature/platform/transceiver/performance_metrics/tests/zr_pm_test/zr_pm_test.go similarity index 100% rename from feature/platform/transceiver/tests/zr_pm_test/zr_pm_test.go rename to feature/platform/transceiver/performance_metrics/tests/zr_pm_test/zr_pm_test.go diff --git a/feature/platform/transceiver/performance_metrics/tests/zrp_pm_test/README.md b/feature/platform/transceiver/performance_metrics/tests/zrp_pm_test/README.md new file mode 100644 index 00000000000..51c9e59e4e5 --- /dev/null +++ b/feature/platform/transceiver/performance_metrics/tests/zrp_pm_test/README.md @@ -0,0 +1,100 @@ +# TRANSCEIVER-6: Telemetry: 400ZR_PLUS Optics performance metrics (pm) streaming. + +## Summary + +Validate 400ZR_PLUS optics module reports performance metric (PM) data as defined in +module CMIS VDM(Versatile Diagnostics Monitor): +* eSNR is defined as the electrical Signal to Noise ratio at the decision sampling point in dB +* Q-value is the decibel (dB) value representing signal BER. +* pre-FEC BER bit error rate. + +## Procedure + +* Connect two ZR_PLUS interfaces using a duplex LC fiber jumper such that TX + output power of one is the RX input power of the other module. + +* To establish a point to point ZR_PLUS link ensure the following: + * Both transceivers state is enabled + * Both transceivers are set to a valid target TX output power + example -7 and 0 dBm. + * Both transceivers are tuned to a valid centre frequency + example 191.4 and 196.1 THz. + +* With the link ZR_PLUS link established as explained above, verify that the + following ZR_PLUS transceiver telemetry paths exist and are streamed for both + the ZR_PLUS optics. + * /terminal-device/logical-channels/channel/otn/state/esnr/instant + * /terminal-device/logical-channels/channel/otn/state/esnr/avg + * /terminal-device/logical-channels/channel/otn/state/esnr/min + * /terminal-device/logical-channels/channel/otn/state/esnr/max + * /terminal-device/logical-channels/channel/otn/state/q-value/instant + * /terminal-device/logical-channels/channel/otn/state/q-value/avg + * /terminal-device/logical-channels/channel/otn/state/q-value/min + * /terminal-device/logical-channels/channel/otn/state/q-value/max + * /terminal-device/logical-channels/channel/otn/state/pre-fec-ber/instant + * /terminal-device/logical-channels/channel/otn/state/pre-fec-ber/avg + * /terminal-device/logical-channels/channel/otn/state/pre-fec-ber/min + * /terminal-device/logical-channels/channel/otn/state/pre-fec-ber/max + + +* For reported data check for validity min <= avg/instant <= max + +* When the modules or the devices are still in a boot stage, they must not + stream any invalid string values like "nil" or "-inf" until valid values + are available for streaming. + +* Q-value, eSNR and pre-Fec BER must always be of type decimal64. When link + interfaces are in down state 0.0 must be reported as a valid default value. + * Typical expected value range for eSNR is 13.5 to 18 dB +/-0.1 dB. + * Typical expected value for Pre-FEC BER should be less than 1.2E-2. + * Typical expected Q-value should be greater than 7 dB. + + +**Note:** For min, max, and avg values, 10 second sampling is preferred. If + 10 seconds is not supported, the sampling interval used must be + specified by adding a deviation to the test. + + +* Verify that the optics PM data is updated after the interface flaps. + + * Enable a pair of ZR_PLUS interfaces on the DUT as explained above. + * Subscribe SAMPLE to the above PM leafs with a sample rate of 10 + seconds. + * Verify the ZR_PLUS optics PMs are in the normal range. + * Use /interfaces/interface/config/enabled to disable the + interface, wait 10 seconds and then re-enable the interface. + * Verify that the PM leafs report '0' during the reboot and no value + of nil or -inf is reported. + * Re-enable the interfaces on the DUT. + * Verify the ZR_PLUS optics pre FEC PM is updated to the value in the normal + range again. + +## OpenConfig Path and RPC Coverage + +```yaml +paths: + # Config Parameter coverage + /interfaces/interface/config/enabled: + /components/component/transceiver/config/enabled: + platform_type: ["OPTICAL_CHANNEL"] + # Telemetry Parameter coverage + /terminal-device/logical-channels/channel/otn/state/fec-uncorrectable-blocks: + /terminal-device/logical-channels/channel/otn/state/esnr/instant: + /terminal-device/logical-channels/channel/otn/state/esnr/avg: + /terminal-device/logical-channels/channel/otn/state/esnr/min: + /terminal-device/logical-channels/channel/otn/state/esnr/max: + /terminal-device/logical-channels/channel/otn/state/q-value/instant: + /terminal-device/logical-channels/channel/otn/state/q-value/avg: + /terminal-device/logical-channels/channel/otn/state/q-value/min: + /terminal-device/logical-channels/channel/otn/state/q-value/max: + /terminal-device/logical-channels/channel/otn/state/pre-fec-ber/instant: + /terminal-device/logical-channels/channel/otn/state/pre-fec-ber/avg: + /terminal-device/logical-channels/channel/otn/state/pre-fec-ber/min: + /terminal-device/logical-channels/channel/otn/state/pre-fec-ber/max: + +rpcs: + gnmi: + gNMI.Get: + gNMI.Set: + gNMI.Subscribe: +``` \ No newline at end of file diff --git a/feature/platform/transceiver/tests/zr_supply_voltage_test/README.md b/feature/platform/transceiver/supply_voltage/tests/zr_supply_voltage_test/README.md similarity index 100% rename from feature/platform/transceiver/tests/zr_supply_voltage_test/README.md rename to feature/platform/transceiver/supply_voltage/tests/zr_supply_voltage_test/README.md diff --git a/feature/platform/transceiver/tests/zr_supply_voltage_test/metadata.textproto b/feature/platform/transceiver/supply_voltage/tests/zr_supply_voltage_test/metadata.textproto similarity index 100% rename from feature/platform/transceiver/tests/zr_supply_voltage_test/metadata.textproto rename to feature/platform/transceiver/supply_voltage/tests/zr_supply_voltage_test/metadata.textproto diff --git a/feature/platform/transceiver/tests/zr_supply_voltage_test/zr_supply_voltage_test.go b/feature/platform/transceiver/supply_voltage/tests/zr_supply_voltage_test/zr_supply_voltage_test.go similarity index 100% rename from feature/platform/transceiver/tests/zr_supply_voltage_test/zr_supply_voltage_test.go rename to feature/platform/transceiver/supply_voltage/tests/zr_supply_voltage_test/zr_supply_voltage_test.go diff --git a/feature/platform/transceiver/supply_voltage/tests/zrp_supply_voltage_test/README.md b/feature/platform/transceiver/supply_voltage/tests/zrp_supply_voltage_test/README.md new file mode 100644 index 00000000000..a2c9241920f --- /dev/null +++ b/feature/platform/transceiver/supply_voltage/tests/zrp_supply_voltage_test/README.md @@ -0,0 +1,64 @@ +# TRANSCEIVER-12: Telemetry: 400ZR_PLUS Transceiver Supply Voltage streaming. + +## Summary + +Validate 400ZR_PLUS transceivers report module level internally measured input supply +voltage in 100 µV increments as defined in the CMIS. + +Link to CMIS: +https://www.oiforum.com/wp-content/uploads/CMIS5p0_Third_Party_Spec.pdf + +## Procedure + +* Connect two ZR_PLUS optics using a duplex LC fiber jumper such that TX + output power of one is the RX input power of the other module. +* To establish a point to point ZR_PLUS link ensure the following: + * Both transceivers state is enabled. + * Both transceivers are set to a valid target TX output power + example -3 dBm. + * Both transceivers are tuned to a valid centre frequency + example 193.1 THz. + +## Testbed Type +* Typical test setup for this test is a DUT1 with 2 ports to 2 ATE ports or 2 + ports to a second DUT2. For most tests this setup should be sufficient. + Ref: [Typical ATE<>DUT Test bed](https://github.com/openconfig/featureprofiles/blob/main/topologies/atedut_2.testbed) +* A and Z ends of the link should have same 400ZR_PLUS PMD. For this test a + single DUT ZR_PLUS port connected to a single ZR_PLUS ATE port is also sufficient. + +Once the ZR_PLUS link is estabished proceed with the following: +* verify that the following ZR_PLUS transceiver telemetry paths exist and are + streamed for both the ZR_PLUS optics. + * /components/component/transceiver/state/supply-voltage/instant + +* If the modules or the devices are in a boot stage, they must not stream + any invalid string values like "nil" or "-inf". +* Reported supply voltage value must always be of type decimal64. +* Verify the module supply voltage is reported correctly with optics + interface in disabled state. + + * Use /interfaces/interface/config/enabled to disable the interfaces and + wait 120 seconds before taking the supply voltage reading again. + * Verify the module is able to stream the supply voltage data in this + state. + * For reported data check for validity min <= avg/instant <= max + * If the modules or the devices are in a boot stage, they must not stream + any invalid string values like "nil" or "-inf". + * Reported supply voltage value must always be of type decimal64. + +## OpenConfig Path and RPC Coverage + +```yaml +paths: + # Config Parameter coverage + /interfaces/interface/config/enabled: + # Telemetry Parameter coverage + /components/component/transceiver/state/supply-voltage/instant: + platform_type: ["OPTICAL_CHANNEL"] + +rpcs: + gnmi: + gNMI.Get: + gNMI.Set: + gNMI.Subscribe: +``` \ No newline at end of file diff --git a/feature/platform/transceiver/tests/zr_temperature_test/README.md b/feature/platform/transceiver/temperature/tests/zr_temperature_test/README.md similarity index 100% rename from feature/platform/transceiver/tests/zr_temperature_test/README.md rename to feature/platform/transceiver/temperature/tests/zr_temperature_test/README.md diff --git a/feature/platform/transceiver/tests/zr_temperature_test/metadata.textproto b/feature/platform/transceiver/temperature/tests/zr_temperature_test/metadata.textproto similarity index 100% rename from feature/platform/transceiver/tests/zr_temperature_test/metadata.textproto rename to feature/platform/transceiver/temperature/tests/zr_temperature_test/metadata.textproto diff --git a/feature/platform/transceiver/tests/zr_temperature_test/zr_temperature_test.go b/feature/platform/transceiver/temperature/tests/zr_temperature_test/zr_temperature_test.go similarity index 100% rename from feature/platform/transceiver/tests/zr_temperature_test/zr_temperature_test.go rename to feature/platform/transceiver/temperature/tests/zr_temperature_test/zr_temperature_test.go diff --git a/feature/platform/transceiver/temperature/tests/zrp_temperature_test/README.md b/feature/platform/transceiver/temperature/tests/zrp_temperature_test/README.md new file mode 100644 index 00000000000..fb3c44445cf --- /dev/null +++ b/feature/platform/transceiver/temperature/tests/zrp_temperature_test/README.md @@ -0,0 +1,79 @@ +# TRANSCEIVER-8: Telemetry: 400ZR_PLUS Optics module temperature streaming. + +## Summary + +Validate 400ZR_PLUS optics report module level internally measured temperature +in 1/256 degree Celsius increments as defined in the CMIS. + +Link to CMIS: +https://www.oiforum.com/wp-content/uploads/CMIS5p0_Third_Party_Spec.pdf + +## Procedure + +* Connect two ZR_PLUS optics using a duplex LC fiber jumper such that TX + output power of one is the RX input power of the other module. +* To establish a point to point ZR_PLUS link ensure the following: + * Both transceivers state is enabled. + * Both transceivers are set to a valid target TX output power + example -3 dBm. + * Both transceivers are tuned to a valid centre frequency + example 193.1 THz. +* With the ZR_PLUS link established as explained above, verify that the + following ZR_PLUS transceiver telemetry paths exist and are streamed for both + the ZR_PLUS optics. + * /platform/components/component/state/temperature/instant + * /platform/components/component/state/temperature/min + * /platform/components/component/state/temperature/max + * /platform/components/component/state/temperature/avg +* For reported data check for validity min <= avg/instant <= max + +* If the modules or the devices are in a boot stage, they must not stream + any invalid string values like "nil" or "-inf". +* Reported temperature value must always be of type decimal64. + + +**Note:** For min, max, and avg values, 10 second sampling is preferred. If the + min, max average values or the 10 seconds sampling is not supported, + the sampling interval used must be specified and this must be + captured by adding a deviation to the test. + + +* Verify the module temperature is reported correctly with optics interface + in disabled state. + + * Use /interfaces/interface/config/enabled to disable the interfaces and + wait 120 seconds(cooling off period) before taking the temperature + reading again. + * Verify the module is able to stream the temperature data in this state. + * Verify the module reported temperature in this state is always less + than the module temperature captured during steady state operation with + interface state enabled. + * For reported data check for validity min <= avg/instant <= max + + * If the modules or the devices are in a boot stage, they must not stream + any invalid string values like "nil" or "-inf". + * Reported temperature value must always be of type decimal64. + +## OpenConfig Path and RPC Coverage + +The below yaml defines the OC paths intended to be covered by this test. OC paths used for test setup are not listed here. + +```yaml +paths: + ## Config Paths ## + /interfaces/interface/config/enabled: + ## State Paths ## + /components/component/state/temperature/instant: + platform_type: [ "TRANSCEIVER" ] + /components/component/state/temperature/min: + platform_type: [ "TRANSCEIVER" ] + /components/component/state/temperature/max: + platform_type: [ "TRANSCEIVER" ] + /components/component/state/temperature/avg: + platform_type: [ "TRANSCEIVER" ] + +rpcs: + gnmi: + gNMI.Subscribe: +``` + diff --git a/feature/platform/transceiver/tests/zr_tunable_parameters_test/README.md b/feature/platform/transceiver/tunable_parameters/tests/zr_tunable_parameters_test/README.md similarity index 100% rename from feature/platform/transceiver/tests/zr_tunable_parameters_test/README.md rename to feature/platform/transceiver/tunable_parameters/tests/zr_tunable_parameters_test/README.md diff --git a/feature/platform/transceiver/tests/zr_tunable_parameters_test/metadata.textproto b/feature/platform/transceiver/tunable_parameters/tests/zr_tunable_parameters_test/metadata.textproto similarity index 100% rename from feature/platform/transceiver/tests/zr_tunable_parameters_test/metadata.textproto rename to feature/platform/transceiver/tunable_parameters/tests/zr_tunable_parameters_test/metadata.textproto diff --git a/feature/platform/transceiver/tests/zr_tunable_parameters_test/zr_tunable_parameters_test.go b/feature/platform/transceiver/tunable_parameters/tests/zr_tunable_parameters_test/zr_tunable_parameters_test.go similarity index 100% rename from feature/platform/transceiver/tests/zr_tunable_parameters_test/zr_tunable_parameters_test.go rename to feature/platform/transceiver/tunable_parameters/tests/zr_tunable_parameters_test/zr_tunable_parameters_test.go diff --git a/feature/platform/transceiver/tunable_parameters/tests/zrp_tunable_parameters_test/README.md b/feature/platform/transceiver/tunable_parameters/tests/zrp_tunable_parameters_test/README.md new file mode 100644 index 00000000000..567a834ff8d --- /dev/null +++ b/feature/platform/transceiver/tunable_parameters/tests/zrp_tunable_parameters_test/README.md @@ -0,0 +1,184 @@ +# TRANSCEIVER-5: Configuration: 400ZR_PLUS channel frequency, output TX launch power and operational mode setting. + +## Summary + +Validate setting 400ZR_PLUS tunable parameters channel frequency, output TX launch +power and operational mode and verify corresponding telemetry values. + +### Goals + +* Verify full C band frequency tunability for 100GHz line system grid. +* Verify full C band frequency tunability for 75GHz line system grid. +* Verify adjustable range of transmit output power across -7 to 0 dBm in + steps of 1 dB. +* Verify that the ZR_PLUS module Host Interface ID and Media Interface ID + combination to ZR_PLUS module AppSel mapping can be configured through the OC + `operational-mode`. `operational-mode` is a construct in OpenConfig that + masks features related to line port transmission. OC operational modes + provides a platform-defined summary of information such as symbol rate, + modulation, pulse shaping, etc. + +**Note** For standard ZR, OIF 400ZR with C-FEC is the default mode however as we +move to 400ZR_PLUS and 800ZR, optic AppSel code would need to be configured +explicitly through OC operational mode. + +## TRANSCEIVER-5.1 + +* Connect two ZR_PLUS interfaces using a duplex LC fiber jumper such that TX output + power of one is the RX input power of the other module. Connection between + the modules should pass through an optical switch that can be controlled + through automation to simulate a fiber cut. +* To establish a point to point ZR_PLUS link ensure the following: + + * Both transceivers states are enabled. + * Validate setting 400ZR_PLUS optics module tunable laser center frequency + across frequency range 196.100 - 191.400 THz for 100GHz grid. + * Validate setting 400ZR_PLUS optics module tunable laser center frequency + across frequency range 196.100 - 191.375 THz for 75GHz grid. + * Specific frequency details can be found in 400ZR_PLUS implementation + agreement under sections 15.1 and 15.2 Operating frequency channel + definitions. Link to IA below, + * https://www.oiforum.com/wp-content/uploads/OIF-400ZR-01.0_reduced2.pdf + * Validate adjustable range of transmit output power across -7 to 0 dBm + range in steps of 1dB. So the module’s output power will be set to -7, + -6, -5, -4, -3, -2, -1, 0 dBm in each step. As an example this can be validated + for the module's default frequency of 193.1 THz. + +* With the ZR_PLUS link established as explained above, for each configured + frequency and TX output power value verify that the following ZR_PLUS transceiver + telemetry paths exist and are streamed for both the ZR_PLUS optics. + + * Frequency + * /components/component/optical-channel/state/frequency + * /components/component/optical-channel/state/carrier-frequency-offset/instant + * /components/component/optical-channel/state/carrier-frequency-offset/avg + * /components/component/optical-channel/state/carrier-frequency-offset/min + * /components/component/optical-channel/state/carrier-frequency-offset/max + * TX Output Power + * /components/component/optical-channel/state/output-power/instant + * /components/component/optical-channel/state/output-power/avg + * /components/component/optical-channel/state/output-power/min + * /components/component/optical-channel/state/output-power/max + * Operational Mode + * /components/component/optical-channel/state/operational-mode + +* With above streamed data verify + + * For each center frequency, laser frequency offset should not be more + than +/- 1.8 GHz max. + * For each center frequency, streamed value should be in Mhz units. Test + should fail if the streamed value is in Hz or THz units. As an example + 193.1 THz would be 193100000 in MHz. + * When set to a specific target output power, transmit power control + absolute accuracy should be within +/- 1 dBm of the target value. + * For reported data check for validity: min <= avg/instant <= max + +## TRANSCEIVER-5.2 + +* When the modules or the devices are still in a boot stage, they must not + stream any invalid string values like "nil" or "-inf". + +* Frequency must be specified as uint64 in MHz. Streamed values for frequency + offset must be of type decimal64. + +* TX Output power must be of type decimal64. + +## TRANSCEIVER-5.3 + +* Verify that the optics Tunable Frequency and TX output power tunes back to + the correct value as per configuration after the interface flaps. + + * Enable a pair of ZR_PLUS interfaces on the DUT as explained above. + * Verify the ZR_PLUS optics frequency and TX output power telemetry values are + set in the normal range. + * Disable or shut down the interface on the DUT. + * Verify with interfaces in down state both optics are still streaming + configured value for frequency. + * Verify for the TX output power with interface in down state a decimal64 + value of -40 dB is streamed. + * Re-enable the interfaces on the DUT. + * Verify the ZR_PLUS optics tune back to the correct frequency and TX output + power as per the configuration and related telemetry values are updated + to the value in the normal range again. + +* With above test also verify + + * Laser frequency offset should not be more than +/- 1.8 GHz max from the + configured centre frequency. + * When set to a specific target output power, transmit power control + absolute accuracy should be within +/- 1 dBm of the target configured + output power. + * For reported data check for validity: min <= avg/instant <= max + +## TRANSCEIVER-5.4 + +* Verify that the optics Tunable Frequency and TX output power tunes back to + the correct value as per configuration after a fiber cut. + + * Enable a pair of ZR_PLUS interfaces on the DUT as explained above. + * Verify the ZR_PLUS optics Frequency and TX output power telemetry values are + in the normal range. + * Simulate a fiber cut using the optical switch that sits in-between the + DUT ports. + * Verify with link in down state due to fiber cut both optics are + streaming uint64 for frequency and decimal64 for TX output power. + * Re-enable the optical switch connection to clear the fiber cut fault. + * Verify the ZR_PLUS optics is able to stay tuned to the correct frequency and + TX output power as per the configuration. + +* With above test also verify + + * Laser frequency offset should not be more than +/- 1.8 GHz max from the + configured centre frequency. + * When set to a specific target output power, transmit power control + absolute accuracy should be within +/- 1 dBm of the target configured + output power. + * For reported data check for validity: min <= avg/instant <= max + +**Note:** For min, max, and avg values, 10 second sampling is preferred. If 10 +seconds is not supported, the sampling interval used must be communicated. + +## OpenConfig Path and RPC Coverage + +```yaml +paths: + /components/component/transceiver/config/enabled: + platform_type: ["TRANSCEIVER"] + /components/component/optical-channel/config/frequency: + platform_type: ["OPTICAL_CHANNEL"] + /components/component/optical-channel/config/target-output-power: + platform_type: ["OPTICAL_CHANNEL"] + /components/component/optical-channel/config/operational-mode: + platform_type: ["OPTICAL_CHANNEL"] + /components/component/optical-channel/state/frequency: + platform_type: ["OPTICAL_CHANNEL"] + /components/component/optical-channel/state/carrier-frequency-offset/instant: + platform_type: ["OPTICAL_CHANNEL"] + /components/component/optical-channel/state/carrier-frequency-offset/avg: + platform_type: ["OPTICAL_CHANNEL"] + /components/component/optical-channel/state/carrier-frequency-offset/min: + platform_type: ["OPTICAL_CHANNEL"] + /components/component/optical-channel/state/carrier-frequency-offset/max: + platform_type: ["OPTICAL_CHANNEL"] + /components/component/optical-channel/state/output-power/instant: + platform_type: ["OPTICAL_CHANNEL"] + /components/component/optical-channel/state/output-power/avg: + platform_type: ["OPTICAL_CHANNEL"] + /components/component/optical-channel/state/output-power/min: + platform_type: ["OPTICAL_CHANNEL"] + /components/component/optical-channel/state/output-power/max: + platform_type: ["OPTICAL_CHANNEL"] + /components/component/optical-channel/state/operational-mode: + platform_type: ["OPTICAL_CHANNEL"] + +rpcs: + gnmi: + gNMI.Set: + replace: true + gNMI.Subscribe: + on_change: true +``` + +## Required DUT platform + +FFF From f05d77596a85954c26b29ff368108b31bfc7b71a Mon Sep 17 00:00:00 2001 From: Ali Al-Shabibi Date: Mon, 20 Jan 2025 10:03:35 +0100 Subject: [PATCH 3/9] fixing containerz breakage because of plugins (#3697) --- .../container_lifecycle/containerz_test.go | 2 +- .../weighted_ecmp_test/weighted_ecmp_test.go | 4 +- ...rface_based_ipv6_gre_encapsulation_test.go | 2 +- go.mod | 60 ++++----- go.sum | 121 ++++++++++-------- internal/security/gen/generate.go | 2 +- 6 files changed, 101 insertions(+), 90 deletions(-) diff --git a/feature/container/containerz/tests/container_lifecycle/containerz_test.go b/feature/container/containerz/tests/container_lifecycle/containerz_test.go index 696c9a9c0fa..071b091da0c 100644 --- a/feature/container/containerz/tests/container_lifecycle/containerz_test.go +++ b/feature/container/containerz/tests/container_lifecycle/containerz_test.go @@ -29,7 +29,7 @@ func TestDeployAndStartContainer(t *testing.T) { t.Fatalf("unable to dial containerz: %v", err) } - progCh, err := cli.PushImage(ctx, "cntrsrv", "latest", *containerTar) + progCh, err := cli.PushImage(ctx, "cntrsrv", "latest", *containerTar, false) if err != nil { t.Fatalf("unable to push image: %v", err) } diff --git a/feature/isis/otg_tests/weighted_ecmp_test/weighted_ecmp_test.go b/feature/isis/otg_tests/weighted_ecmp_test/weighted_ecmp_test.go index 64d778f03a5..79a84fd71a2 100644 --- a/feature/isis/otg_tests/weighted_ecmp_test/weighted_ecmp_test.go +++ b/feature/isis/otg_tests/weighted_ecmp_test/weighted_ecmp_test.go @@ -742,8 +742,8 @@ func VerifyISISTelemetry(t *testing.T, dut *ondatra.DUTDevice, dutIntfs []string batch := gnmi.OCBatch() statePath := gnmi.OC().NetworkInstance(deviations.DefaultNetworkInstance(dut)) id := formatID(loopBack.ateISISSysID) - iPv4Query := statePath.Protocol(oc.PolicyTypes_INSTALL_PROTOCOL_TYPE_ISIS, isisInstance).Isis().Level(uint8(isisLevel)).Lsp(id).Tlv(oc.IsisLsdbTypes_ISIS_TLV_TYPE_EXTENDED_IPV4_REACHABILITY).ExtendedIpv4Reachability().Prefix(fmt.Sprintf(loopBack.ateLoopbackV4 + "/32")) - iPv6Query := statePath.Protocol(oc.PolicyTypes_INSTALL_PROTOCOL_TYPE_ISIS, isisInstance).Isis().Level(uint8(isisLevel)).Lsp(id).Tlv(oc.IsisLsdbTypes_ISIS_TLV_TYPE_IPV6_REACHABILITY).ExtendedIpv4Reachability().Prefix(fmt.Sprintf(loopBack.ateLoopbackV6 + "/128")) + iPv4Query := statePath.Protocol(oc.PolicyTypes_INSTALL_PROTOCOL_TYPE_ISIS, isisInstance).Isis().Level(uint8(isisLevel)).Lsp(id).Tlv(oc.IsisLsdbTypes_ISIS_TLV_TYPE_EXTENDED_IPV4_REACHABILITY).ExtendedIpv4Reachability().Prefix(loopBack.ateLoopbackV4 + "/32") + iPv6Query := statePath.Protocol(oc.PolicyTypes_INSTALL_PROTOCOL_TYPE_ISIS, isisInstance).Isis().Level(uint8(isisLevel)).Lsp(id).Tlv(oc.IsisLsdbTypes_ISIS_TLV_TYPE_IPV6_REACHABILITY).ExtendedIpv4Reachability().Prefix(loopBack.ateLoopbackV6 + "/128") batch.AddPaths(iPv4Query, iPv6Query) _, ok := gnmi.Watch(t, dut, batch.State(), 5*time.Minute, func(val *ygnmi.Value[*oc.Root]) bool { _, present := val.Val() diff --git a/feature/tunnel/otg_tests/tunnel_interface_based_ipv6_gre_encapsulation_test/tunnel_interface_based_ipv6_gre_encapsulation_test.go b/feature/tunnel/otg_tests/tunnel_interface_based_ipv6_gre_encapsulation_test/tunnel_interface_based_ipv6_gre_encapsulation_test.go index 7f926f52c5a..ff60dfc1989 100644 --- a/feature/tunnel/otg_tests/tunnel_interface_based_ipv6_gre_encapsulation_test/tunnel_interface_based_ipv6_gre_encapsulation_test.go +++ b/feature/tunnel/otg_tests/tunnel_interface_based_ipv6_gre_encapsulation_test/tunnel_interface_based_ipv6_gre_encapsulation_test.go @@ -160,7 +160,7 @@ func TestTunnelEncapsulationByGREOverIPv6WithLoadBalance(t *testing.T) { time.Sleep(30 * time.Second) t.Logf("Start Traffic flow configuraturation in OTG") configureTrafficFlowsToEncasulation(t, top, ateport1, ateport2, ateport3, &otgIntf1, dutIntf1.MAC) - t.Logf(top.Marshal().ToJson()) + t.Log(top.Marshal().ToJson()) ate.OTG().PushConfig(t, top) ate.OTG().StartProtocols(t) time.Sleep(30 * time.Second) diff --git a/go.mod b/go.mod index d4f361a0c74..269c599baa8 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/openconfig/featureprofiles -go 1.21 +go 1.22.0 require ( cloud.google.com/go/pubsub v1.36.1 @@ -8,7 +8,7 @@ require ( github.com/cisco-open/go-p4 v0.1.2 github.com/go-git/go-billy/v5 v5.6.0 github.com/go-git/go-git/v5 v5.13.0 - github.com/golang/glog v1.2.1 + github.com/golang/glog v1.2.2 github.com/google/go-cmp v0.6.0 github.com/google/go-github/v50 v50.1.0 github.com/google/gopacket v1.1.19 @@ -16,12 +16,12 @@ require ( github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 github.com/kr/pretty v0.3.1 github.com/open-traffic-generator/snappi/gosnappi v1.3.0 - github.com/openconfig/containerz v0.0.0-20240620162940-e0bf23af17d6 + github.com/openconfig/containerz v0.0.0-20250119143156-ea1f112cd31c github.com/openconfig/entity-naming v0.0.0-20230912181021-7ac806551a31 github.com/openconfig/gnmi v0.11.0 - github.com/openconfig/gnoi v0.4.1 + github.com/openconfig/gnoi v0.6.0 github.com/openconfig/gnoigo v0.0.0-20240320202954-ebd033e3542c - github.com/openconfig/gnsi v1.6.0 + github.com/openconfig/gnsi v1.7.0 github.com/openconfig/gocloser v0.0.0-20220310182203-c6c950ed3b0b github.com/openconfig/goyang v1.4.5 github.com/openconfig/gribi v1.0.0 @@ -36,33 +36,33 @@ require ( github.com/p4lang/p4runtime v1.4.0-rc.5.0.20220728214547-13f0d02a521e github.com/pborman/uuid v1.2.1 github.com/protocolbuffers/txtpbfmt v0.0.0-20220608084003-fc78c767cd6a - github.com/spf13/cobra v1.8.0 - github.com/spf13/pflag v1.0.5 + github.com/spf13/cobra v1.8.1 + github.com/spf13/pflag v1.0.6-0.20201009195203-85dd5c8bc61c github.com/spf13/viper v1.19.0 github.com/yoheimuta/go-protoparser/v4 v4.9.0 github.com/yuin/goldmark v1.4.13 - golang.org/x/crypto v0.31.0 + golang.org/x/crypto v0.32.0 golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 golang.org/x/text v0.21.0 google.golang.org/api v0.171.0 - google.golang.org/grpc v1.66.2 - google.golang.org/protobuf v1.34.2 + google.golang.org/grpc v1.69.4 + google.golang.org/protobuf v1.36.3 gopkg.in/yaml.v2 v2.4.0 gopkg.in/yaml.v3 v3.0.1 - k8s.io/klog/v2 v2.120.1 + k8s.io/klog/v2 v2.130.1 ) require ( github.com/Masterminds/semver/v3 v3.2.1 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect - golang.org/x/oauth2 v0.21.0 + golang.org/x/oauth2 v0.23.0 ) require ( bitbucket.org/creachadair/stringset v0.0.14 // indirect - cel.dev/expr v0.15.0 // indirect + cel.dev/expr v0.16.2 // indirect cloud.google.com/go v0.112.1 // indirect - cloud.google.com/go/compute/metadata v0.3.0 // indirect + cloud.google.com/go/compute/metadata v0.5.2 // indirect cloud.google.com/go/iam v1.1.6 // indirect dario.cat/mergo v1.0.0 // indirect github.com/ProtonMail/go-crypto v1.1.3 // indirect @@ -72,21 +72,21 @@ require ( github.com/census-instrumentation/opencensus-proto v0.4.1 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/cloudflare/circl v1.3.7 // indirect - github.com/cncf/xds/go v0.0.0-20240423153145-555b57ec207b // indirect + github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78 // indirect github.com/creack/pty v1.1.18 // indirect github.com/cyphar/filepath-securejoin v0.2.5 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/drivenets/cdnos-controller v1.7.4 // indirect github.com/emicklei/go-restful/v3 v3.10.2 // indirect github.com/emirpasic/gods v1.18.1 // indirect - github.com/envoyproxy/go-control-plane v0.12.1-0.20240621013728-1eb8caab5155 // indirect - github.com/envoyproxy/protoc-gen-validate v1.0.4 // indirect + github.com/envoyproxy/go-control-plane v0.13.1 // indirect + github.com/envoyproxy/protoc-gen-validate v1.1.0 // indirect github.com/evanphx/json-patch/v5 v5.6.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/ghodss/yaml v1.0.0 // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-openapi/jsonpointer v0.19.6 // indirect github.com/go-openapi/jsonreference v0.20.2 // indirect @@ -121,6 +121,7 @@ require ( github.com/networkop/meshnet-cni v0.3.1-0.20230525201116-d7c306c635cf // indirect github.com/open-traffic-generator/keng-operator v0.3.28 // indirect github.com/openconfig/attestz v0.2.0 // indirect + github.com/openconfig/bootz v0.3.1 // indirect github.com/openconfig/gnpsi v0.3.2 // indirect github.com/openconfig/grpctunnel v0.0.0-20220819142823-6f5422b8ca70 // indirect github.com/openconfig/lemming/operator v0.2.0 // indirect @@ -129,7 +130,7 @@ require ( github.com/pjbgf/sha1cd v0.3.0 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect - github.com/rogpeppe/go-internal v1.11.0 // indirect + github.com/rogpeppe/go-internal v1.13.1 // indirect github.com/sagikazarmark/locafero v0.6.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect github.com/scrapli/scrapligo v1.1.11 // indirect @@ -145,23 +146,24 @@ require ( github.com/subosito/gotenv v1.6.0 // indirect github.com/xanzy/ssh-agent v0.3.3 // indirect go.opencensus.io v0.24.0 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect - go.opentelemetry.io/otel v1.24.0 // indirect - go.opentelemetry.io/otel/metric v1.24.0 // indirect - go.opentelemetry.io/otel/trace v1.24.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 // indirect + go.opentelemetry.io/otel v1.34.0 // indirect + go.opentelemetry.io/otel/metric v1.34.0 // indirect + go.opentelemetry.io/otel/trace v1.34.0 // indirect go.uber.org/atomic v1.11.0 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/mod v0.19.0 // indirect - golang.org/x/net v0.33.0 // indirect + golang.org/x/net v0.34.0 // indirect golang.org/x/sync v0.10.0 // indirect - golang.org/x/sys v0.28.0 // indirect - golang.org/x/term v0.27.0 // indirect - golang.org/x/time v0.5.0 // indirect + golang.org/x/sys v0.29.0 // indirect + golang.org/x/term v0.28.0 // indirect + golang.org/x/time v0.9.0 // indirect golang.org/x/tools v0.23.0 // indirect google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240604185151-ef581f913117 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20241015192408-796eee8c2d53 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect diff --git a/go.sum b/go.sum index 4dab81848e5..09c4333466f 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,7 @@ bitbucket.org/creachadair/stringset v0.0.14 h1:t1ejQyf8utS4GZV/4fM+1gvYucggZkfhb+tMobDxYOE= bitbucket.org/creachadair/stringset v0.0.14/go.mod h1:Ej8fsr6rQvmeMDf6CCWMWGb14H9mz8kmDgPPTdiVT0w= -cel.dev/expr v0.15.0 h1:O1jzfJCQBfL5BFoYktaxwIhuttaQPsVWerH9/EEKx0w= -cel.dev/expr v0.15.0/go.mod h1:TRSuuV7DlVCE/uwv5QbAiW/v8l5O8C4eEPHeu7gf7Sg= +cel.dev/expr v0.16.2 h1:RwRhoH17VhAu9U5CMvMhH1PDVgf0tuz9FT+24AfMLfU= +cel.dev/expr v0.16.2/go.mod h1:gXngZQMkWJoSbE8mOzehJlXQyubn/Vg0vR9/F3W7iw8= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= @@ -326,8 +326,8 @@ cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZ cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= -cloud.google.com/go/compute/metadata v0.3.0 h1:Tz+eQXMEqDIKRsmY3cHTL6FVaynIjX2QxYC4trgAKZc= -cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= +cloud.google.com/go/compute/metadata v0.5.2 h1:UxK4uu/Tn+I3p2dYWTfiX4wva7aYlKixAHn3fyqngqo= +cloud.google.com/go/compute/metadata v0.5.2/go.mod h1:C66sj2AluDcIqakBq/M8lw8/ybHgOZqin2obFxa/E5k= cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY= cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w= @@ -1279,9 +1279,9 @@ github.com/cncf/xds/go v0.0.0-20230310173818-32f1caf87195/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20230428030218-4003588d1b74/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa/go.mod h1:x/1Gn8zydmfq8dk6e9PdstVsDgu9RuyIIJqAaF//0IM= -github.com/cncf/xds/go v0.0.0-20240423153145-555b57ec207b h1:ga8SEFjZ60pxLcmhnThWgvH2wg8376yUJmPhEH4H3kw= -github.com/cncf/xds/go v0.0.0-20240423153145-555b57ec207b/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= -github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78 h1:QVw89YDxXxEe+l8gU8ETbOasdwEV+avkR75ZzsVV9WI= +github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= +github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= @@ -1322,8 +1322,8 @@ github.com/envoyproxy/go-control-plane v0.11.0/go.mod h1:VnHyVMpzcLvCFt9yUz1UnCw github.com/envoyproxy/go-control-plane v0.11.1-0.20230524094728-9239064ad72f/go.mod h1:sfYdkwUW4BA3PbKjySwjJy+O4Pu0h62rlqCMHNk+K+Q= github.com/envoyproxy/go-control-plane v0.11.1/go.mod h1:uhMcXKCQMEJHiAb0w+YGefQLaTEw+YhGluxZkrTmD0g= github.com/envoyproxy/go-control-plane v0.12.0/go.mod h1:ZBTaoJ23lqITozF0M6G4/IragXCQKCnYbmlmtHvwRG0= -github.com/envoyproxy/go-control-plane v0.12.1-0.20240621013728-1eb8caab5155 h1:IgJPqnrlY2Mr4pYB6oaMKvFvwJ9H+X6CCY5x1vCTcpc= -github.com/envoyproxy/go-control-plane v0.12.1-0.20240621013728-1eb8caab5155/go.mod h1:5Wkq+JduFtdAXihLmeTJf+tRYIT4KBc2vPXDhwVo1pA= +github.com/envoyproxy/go-control-plane v0.13.1 h1:vPfJZCkob6yTMEgS+0TwfTUfbHjfy/6vOJ8hUWX/uXE= +github.com/envoyproxy/go-control-plane v0.13.1/go.mod h1:X45hY0mufo6Fd0KW3rqsGvQMw58jvjymeCzBU3mWyHw= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo= github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w= @@ -1331,8 +1331,9 @@ github.com/envoyproxy/protoc-gen-validate v0.10.0/go.mod h1:DRjgyB0I43LtJapqN6Ni github.com/envoyproxy/protoc-gen-validate v0.10.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= github.com/envoyproxy/protoc-gen-validate v1.0.1/go.mod h1:0vj8bNkYbSTNS2PIyH87KZaeN4x9zpL9Qt8fQC7d+vs= github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= -github.com/envoyproxy/protoc-gen-validate v1.0.4 h1:gVPz/FMfvh57HdSJQyvBtF00j8JU4zdyUgIUNhlgg0A= github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= +github.com/envoyproxy/protoc-gen-validate v1.1.0 h1:tntQDh69XqOCOZsDz0lVJQez/2L6Uu2PdjCQwWCJ3bM= +github.com/envoyproxy/protoc-gen-validate v1.1.0/go.mod h1:sXRDRVmzEbkM7CVcM06s9shE/m23dg3wzjl0UWqJ2q4= github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww= @@ -1373,8 +1374,8 @@ github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-logr/zapr v1.2.3 h1:a9vnzlIBPQBBkeaR9IuMUfmVOrQlkoC4YfPoFkX3T7A= @@ -1399,8 +1400,8 @@ github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0L github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ= github.com/golang/glog v1.2.0/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= -github.com/golang/glog v1.2.1 h1:OptwRhECazUx5ix5TTWC3EZhsZEHWcYWY4FQHTIubm4= -github.com/golang/glog v1.2.1/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= +github.com/golang/glog v1.2.2 h1:1+mZ9upx1Dh6FmUTFR1naJ77miKiXgALjWOZ3NVFPmY= +github.com/golang/glog v1.2.2/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -1651,8 +1652,10 @@ github.com/open-traffic-generator/snappi/gosnappi v1.3.0 h1:6SFSuZLTuncLW1xMcBG5 github.com/open-traffic-generator/snappi/gosnappi v1.3.0/go.mod h1:CaE4nisXftNXdXWvTSqb4eiW2WMFIXkJsH5rqPoipcg= github.com/openconfig/attestz v0.2.0 h1:VuksFIG1OlGnRuUpdTFAkMyAY59ITvyLbp4AtiTXV64= github.com/openconfig/attestz v0.2.0/go.mod h1:byY6H68zm3VXmQHEb4O4OZtRtFyHEjkmzrvIljYc79Y= -github.com/openconfig/containerz v0.0.0-20240620162940-e0bf23af17d6 h1:4SPV//llewH/1v5l3+ogzUubksBGSeI+hHLXTAw2T1A= -github.com/openconfig/containerz v0.0.0-20240620162940-e0bf23af17d6/go.mod h1:Byu9uT5Yyz8XEKv9eUBcWqAoUADVvfmN8m+BGqTQPoc= +github.com/openconfig/bootz v0.3.1 h1:Q0mThGmZiX/kht+crar6FtLVxqdjUS/deMnpcNX+F7c= +github.com/openconfig/bootz v0.3.1/go.mod h1:IhVtV9zS/2i8rKXHkRW9eD2UV6zGeIXYtLcEzAeyc6A= +github.com/openconfig/containerz v0.0.0-20250119143156-ea1f112cd31c h1:4WtTr8Iv2szea/InhymgT5ebeqny6KLB55YBrk2q8Lg= +github.com/openconfig/containerz v0.0.0-20250119143156-ea1f112cd31c/go.mod h1:VcT2W5ddds98x7CS2r7q1tnUICgflBQ3Wv9rmRkb5TQ= github.com/openconfig/entity-naming v0.0.0-20230912181021-7ac806551a31 h1:K/9O+J20+liIof8WjquMydnebD0N1U9ItjhJYF6H4hg= github.com/openconfig/entity-naming v0.0.0-20230912181021-7ac806551a31/go.mod h1:ZRUrfwYYY+pLaOoWPad3p/8J4LLQcSqtXhBCkD2pXJc= github.com/openconfig/gnmi v0.0.0-20200414194230-1597cc0f2600/go.mod h1:M/EcuapNQgvzxo1DDXHK4tx3QpYM/uG4l591v33jG2A= @@ -1660,14 +1663,14 @@ github.com/openconfig/gnmi v0.0.0-20200508230933-d19cebf5e7be/go.mod h1:M/EcuapN github.com/openconfig/gnmi v0.10.0/go.mod h1:Y9os75GmSkhHw2wX8sMsxfI7qRGAEcDh8NTa5a8vj6E= github.com/openconfig/gnmi v0.11.0 h1:H7pLIb/o3xObu3+x0Fv9DCK7TH3FUh7mNwbYe+34hFw= github.com/openconfig/gnmi v0.11.0/go.mod h1:9oJSQPPCpNvfMRj8e4ZoLVAw4wL8HyxXbiDlyuexCGU= -github.com/openconfig/gnoi v0.4.1 h1:sONbBqRBKjPT6voRAFqhTkUIatAajBp+YRLCWgyS4Dk= -github.com/openconfig/gnoi v0.4.1/go.mod h1:KDWxp9YvfRNR5BbiLy6uQSzHUpGhAtO8C80XXKLqNqU= +github.com/openconfig/gnoi v0.6.0 h1:jyfNAkGC7exKOXbZPMLz2RNr5WlE63h1rGmF/THz43c= +github.com/openconfig/gnoi v0.6.0/go.mod h1:aKDXOZdxrpLh4AMKRiYvfqAvckcf5tqpc8OsOKAtaIs= github.com/openconfig/gnoigo v0.0.0-20240320202954-ebd033e3542c h1:egPgBUBDn0XEtbz0CvE+Bh/I/3iTzwzMq5/rmtPJdQs= github.com/openconfig/gnoigo v0.0.0-20240320202954-ebd033e3542c/go.mod h1:Se/HklUcFVcCGB66khgYouiesLRPoa4UL1ovvmE/68k= github.com/openconfig/gnpsi v0.3.2 h1:+bl1bXMOTrWOcGydWB+8wGgvxlgvL8Y6joAiWFU5sog= github.com/openconfig/gnpsi v0.3.2/go.mod h1:+Qj2PwadJ/jvGkH6H/A3XO9ZRKQRVtl3A30ubwz0M18= -github.com/openconfig/gnsi v1.6.0 h1:PfQa9Gy0lH1sHqA2L3Gj2fEh2zPMbWxMmIRQv2Nk1T8= -github.com/openconfig/gnsi v1.6.0/go.mod h1:RiHTEIb2ruIeWOOamms6vqbZtgmajDx+g5YJlF2hZ0k= +github.com/openconfig/gnsi v1.7.0 h1:Enn5i3m6KsnHeUI+kalB9OH8fADf0oeymd/3Ze0BzME= +github.com/openconfig/gnsi v1.7.0/go.mod h1:RiHTEIb2ruIeWOOamms6vqbZtgmajDx+g5YJlF2hZ0k= github.com/openconfig/gocloser v0.0.0-20220310182203-c6c950ed3b0b h1:NSYuxdlOWLldNpid1dThR6Dci96juXioUguMho6aliI= github.com/openconfig/gocloser v0.0.0-20220310182203-c6c950ed3b0b/go.mod h1:uhC/ybmPapgeyAL2b9ZrUQ+DZE+DB+J+/7377PX+lek= github.com/openconfig/goyang v0.0.0-20200115183954-d0a48929f0ea/go.mod h1:dhXaV0JgHJzdrHi2l+w0fZrwArtXL7jEFoiqLEdmkvU= @@ -1754,8 +1757,8 @@ github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6L github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= -github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= @@ -1790,10 +1793,11 @@ github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= -github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= -github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= +github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.6-0.20201009195203-85dd5c8bc61c h1:zqmyTlQyufRC65JnImJ6H1Sf7BDj8bG31EV919NVEQc= +github.com/spf13/pflag v1.0.6-0.20201009195203-85dd5c8bc61c/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg= github.com/srl-labs/srl-controller v0.6.1 h1:hHduqG41wglpeVPD85RALTwWWcS+NqvU8V1pHJMQIZo= @@ -1855,28 +1859,32 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1/go.mod h1:4UoMYEZOC0yN/sPGH76KPkkU7zgiEWYWL9vwmbnTJPE= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 h1:4Pp6oUg3+e/6M4C0A/3kJ2VYa++dsWVTtGgLVj5xtHg= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0/go.mod h1:Mjt1i1INqiaoZOMGR1RIUJN+i3ChKoFRqzrRQhlkbs0= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1/go.mod h1:sEGXWArGqc3tVa+ekntsN65DmVbVeW+7lTKTjZF3/Fo= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 h1:CV7UdSGJt/Ao6Gp4CXckLxVRRsRgDHoI8XjbL3PDl8s= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0/go.mod h1:FRmFuRJfag1IZ2dPkHnEoSFVgTVPUd2qf5Vi69hLb8I= go.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY= go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo= -go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= -go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= +go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY= +go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI= go.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8= go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM= -go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= -go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= +go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ= +go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE= go.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A= go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E= -go.opentelemetry.io/otel/sdk v1.22.0 h1:6coWHw9xw7EfClIC/+O31R8IY3/+EiRFHevmHafB2Gw= -go.opentelemetry.io/otel/sdk v1.22.0/go.mod h1:iu7luyVGYovrRpe2fmj3CVKouQNdTOkxtLzPvPz1DOc= +go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A= +go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU= +go.opentelemetry.io/otel/sdk/metric v1.31.0 h1:i9hxxLJF/9kkvfHppyLL55aW7iIJz4JjxTeYusH7zMc= +go.opentelemetry.io/otel/sdk/metric v1.31.0/go.mod h1:CRInTMVvNhUKgSAMbKyTMxqOBC0zgyxzW55lZzX43Y8= go.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo= go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ= -go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= -go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= +go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k= +go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= @@ -1918,8 +1926,8 @@ golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72 golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= -golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= -golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= +golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc= +golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -2055,8 +2063,8 @@ golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= -golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= -golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= +golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0= +golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -2092,8 +2100,8 @@ golang.org/x/oauth2 v0.11.0/go.mod h1:LdF7O/8bLR/qWK9DrpXmbHLTouvRHK0SgJl0GmDBch golang.org/x/oauth2 v0.13.0/go.mod h1:/JMhi4ZRXAf4HG9LiNmxvk+45+96RUlVThiH8FzNBn0= golang.org/x/oauth2 v0.15.0/go.mod h1:q48ptWNTY5XWf+JNten23lcvHpLJ0ZSxF5ttTHKVCAM= golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o= -golang.org/x/oauth2 v0.21.0 h1:tsimM75w1tF/uws5rbeHzIWxEqElMehnc+iW793zsZs= -golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs= +golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -2211,8 +2219,8 @@ golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= -golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= +golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -2231,8 +2239,8 @@ golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= golang.org/x/term v0.14.0/go.mod h1:TySc+nGkYR6qt8km8wUhuFRTVSMIX3XPR58y2lC8vww= golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= -golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= -golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= +golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg= +golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -2262,8 +2270,9 @@ golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/time v0.9.0 h1:EsRrnYcQiGH+5FfbgvV4AP7qEZstoyrHB0DzarOQ4ZY= +golang.org/x/time v0.9.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -2617,8 +2626,8 @@ google.golang.org/genproto/googleapis/api v0.0.0-20231212172506-995d672761c0/go. google.golang.org/genproto/googleapis/api v0.0.0-20240102182953-50ed04b92917/go.mod h1:CmlNWB9lSezaYELKS5Ym1r44VrrbPUa7JTvw+6MbpJ0= google.golang.org/genproto/googleapis/api v0.0.0-20240116215550-a9fa1716bcac/go.mod h1:B5xPO//w8qmBDjGReYLpR6UJPnkldGkCSMoH/2vxJeg= google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80/go.mod h1:4jWUdICTdgc3Ibxmr8nAJiiLHwQBY0UI0XZcEMaFKaA= -google.golang.org/genproto/googleapis/api v0.0.0-20240604185151-ef581f913117 h1:+rdxYoE3E5htTEWIe15GlN6IfvbURM//Jt0mmkmm6ZU= -google.golang.org/genproto/googleapis/api v0.0.0-20240604185151-ef581f913117/go.mod h1:OimBR/bc1wPO9iV4NC2bpyjy3VnAwZh5EBPQdtaE5oo= +google.golang.org/genproto/googleapis/api v0.0.0-20241015192408-796eee8c2d53 h1:fVoAXEKA4+yufmbdVYv+SE73+cPZbbbe8paLsHfkK+U= +google.golang.org/genproto/googleapis/api v0.0.0-20241015192408-796eee8c2d53/go.mod h1:riSXTwQ4+nqmPGtobMFyW5FqVAmIs0St6VPp4Ug7CE4= google.golang.org/genproto/googleapis/bytestream v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:ylj+BE99M198VPbBh6A8d9n3w8fChvyLK3wwBOjXBFA= google.golang.org/genproto/googleapis/bytestream v0.0.0-20230807174057-1744710a1577/go.mod h1:NjCQG/D8JandXxM57PZbAJL1DCNL6EypA0vPPwfsc7c= google.golang.org/genproto/googleapis/bytestream v0.0.0-20231030173426-d783a09b4405/go.mod h1:GRUCuLdzVqZte8+Dl/D4N25yLzcGqqWaYkeVOwulFqw= @@ -2646,8 +2655,8 @@ google.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0/go. google.golang.org/genproto/googleapis/rpc v0.0.0-20240102182953-50ed04b92917/go.mod h1:xtjpI3tXFPP051KaWnhvxkiubL/6dJ18vLVf7q2pTOU= google.golang.org/genproto/googleapis/rpc v0.0.0-20240116215550-a9fa1716bcac/go.mod h1:daQN87bsDqDoe316QbbvX60nMoJQa4r6Ds0ZuoAe5yA= google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80/go.mod h1:PAREbraiVEVGVdTZsVWjSbbTtSyGbAgIIvni8a8CD5s= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f h1:OxYkA3wjPsZyBylwymxSHa7ViiW1Sml4ToBrncvFehI= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f/go.mod h1:+2Yz8+CLJbIfL9z73EW45avw8Lmge3xVElCP9zEKi50= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -2700,8 +2709,8 @@ google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9Y google.golang.org/grpc v1.60.0/go.mod h1:OlCHIeLYqSSsLi6i49B5QGdzaMZK9+M7LXN2FKz4eGM= google.golang.org/grpc v1.60.1/go.mod h1:OlCHIeLYqSSsLi6i49B5QGdzaMZK9+M7LXN2FKz4eGM= google.golang.org/grpc v1.62.1/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE= -google.golang.org/grpc v1.66.2 h1:3QdXkuq3Bkh7w+ywLdLvM56cmGvQHUMZpiCzt6Rqaoo= -google.golang.org/grpc v1.66.2/go.mod h1:s3/l6xSSCURdVfAnL+TqCNMyTDAGN6+lZeVxnZR128Y= +google.golang.org/grpc v1.69.4 h1:MF5TftSMkd8GLw/m0KM6V8CMOCY6NZ1NQDPGFgbTt4A= +google.golang.org/grpc v1.69.4/go.mod h1:vyjdE6jLBI76dgpDojsFGNaHlxdjXN9ghpnd2o7JGZ4= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= @@ -2723,8 +2732,8 @@ google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqw google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= -google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= -google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= +google.golang.org/protobuf v1.36.3 h1:82DV7MYdb8anAVi3qge1wSnMDrnKK7ebr+I0hHRN1BU= +google.golang.org/protobuf v1.36.3/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -2764,8 +2773,8 @@ k8s.io/apimachinery v0.26.3 h1:dQx6PNETJ7nODU3XPtrwkfuubs6w7sX0M8n61zHIV/k= k8s.io/apimachinery v0.26.3/go.mod h1:ats7nN1LExKHvJ9TmwootT00Yz05MuYqPXEXaVeOy5I= k8s.io/client-go v0.26.3 h1:k1UY+KXfkxV2ScEL3gilKcF7761xkYsSD6BC9szIu8s= k8s.io/client-go v0.26.3/go.mod h1:ZPNu9lm8/dbRIPAgteN30RSXea6vrCpFvq+MateTUuQ= -k8s.io/klog/v2 v2.120.1 h1:QXU6cPEOIslTGvZaXvFWiP9VKyeet3sawzTOvdXb4Vw= -k8s.io/klog/v2 v2.120.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= +k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= +k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= k8s.io/kube-openapi v0.0.0-20230308215209-15aac26d736a h1:gmovKNur38vgoWfGtP5QOGNOA7ki4n6qNYoFAgMlNvg= k8s.io/kube-openapi v0.0.0-20230308215209-15aac26d736a/go.mod h1:y5VtZWM9sHHc2ZodIH/6SHzXj+TPU5USoA8lcIeKEKY= k8s.io/utils v0.0.0-20230313181309-38a27ef9d749 h1:xMMXJlJbsU8w3V5N2FLDQ8YgU8s1EoULdbQBcAeNJkY= diff --git a/internal/security/gen/generate.go b/internal/security/gen/generate.go index 5797703d400..53ce783b02e 100644 --- a/internal/security/gen/generate.go +++ b/internal/security/gen/generate.go @@ -75,7 +75,7 @@ var ( "gnoi.healthz": hpb.File_healthz_healthz_proto.Services(), "gnoi.layer2": lpb.File_layer2_layer2_proto.Services(), "gnoi.mppls": mpb.File_mpls_mpls_proto.Services(), - "gnoi.os": ospb.File_os_os_proto.Services(), + "gnoi.os": ospb.File_github_com_openconfig_gnoi_os_os_proto.Services(), "gnoi.otdr": otpb.File_otdr_otdr_proto.Services(), "gnoi.link_qualification": plqpb.File_packet_link_qualification_packet_link_qualification_proto.Services(), "gnoi.system": spb.File_system_system_proto.Services(), From 09e20e24b636c32a084941725a2b809481554cbe Mon Sep 17 00:00:00 2001 From: Ali Al-Shabibi Date: Tue, 21 Jan 2025 17:33:01 +0100 Subject: [PATCH 4/9] ignore deprecated warning in static-check (#3704) --- staticcheck.conf | 1 + 1 file changed, 1 insertion(+) create mode 100644 staticcheck.conf diff --git a/staticcheck.conf b/staticcheck.conf new file mode 100644 index 00000000000..2e9a224ab9b --- /dev/null +++ b/staticcheck.conf @@ -0,0 +1 @@ +checks = ["inherit", "-SA1019"] From 3104ca88142cb8eba2eaa2dc7fd00045e7feaa61 Mon Sep 17 00:00:00 2001 From: Ram Date: Tue, 21 Jan 2025 22:43:04 +0530 Subject: [PATCH 5/9] fix isis_interface_level_passive (#3706) --- .../isis_interface_level_passive_test/metadata.textproto | 1 + 1 file changed, 1 insertion(+) diff --git a/feature/isis/otg_tests/isis_interface_level_passive_test/metadata.textproto b/feature/isis/otg_tests/isis_interface_level_passive_test/metadata.textproto index d0a0a9cc54f..c73452f374f 100644 --- a/feature/isis/otg_tests/isis_interface_level_passive_test/metadata.textproto +++ b/feature/isis/otg_tests/isis_interface_level_passive_test/metadata.textproto @@ -25,6 +25,7 @@ platform_exceptions: { deviations: { ipv4_missing_enabled: true isis_interface_level1_disable_required: true + isis_interface_level_passive_unsupported: true isis_dis_sysid_unsupported: true isis_database_overloads_unsupported: true } From ebde24742038ddd4bd7ad0a9128c3d4b82514366 Mon Sep 17 00:00:00 2001 From: Liubov <1306017+gggsmith@users.noreply.github.com> Date: Tue, 21 Jan 2025 22:08:12 +0000 Subject: [PATCH 6/9] Update testregistry.textproto (#3699) Fix broken README.md links for "Aggregate Forwarding Viable" / "Aggregate Not Viable All" Co-authored-by: Darren Loher --- testregistry.textproto | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/testregistry.textproto b/testregistry.textproto index 16eac380e5e..5364f42a0b2 100644 --- a/testregistry.textproto +++ b/testregistry.textproto @@ -873,7 +873,7 @@ test: { test: { id: "RT-5.4" description: "Aggregate Forwarding Viable" - readme: "https://github.com/openconfig/featureprofiles/blob/main/feature/interface/aggregate/ate_tests/aggregate_forwarding_viable_test/README.md" + readme: "https://github.com/openconfig/featureprofiles/blob/main/feature/interface/aggregate/otg_tests/aggregate_forwarding_viable_test/README.md" exec: " " } test: { @@ -890,7 +890,7 @@ test: { test: { id: "RT-5.7" description: "Aggregate Not Viable All" - readme: "https://github.com/openconfig/featureprofiles/blob/main/feature/interface/aggregate/ate_tests/aggregate_all_not_viable_test/README.md" + readme: "https://github.com/openconfig/featureprofiles/blob/main/feature/interface/aggregate/otg_tests/aggregate_all_not_viable_test/README.md" exec: " " } test: { @@ -1829,4 +1829,4 @@ test: { description: "AFT Streaming" readme: "https://github.com/openconfig/featureprofiles/blob/main/feature/aft/aft_base/otg_tests/aft_prefixcounters/README.md" exec: " " -} \ No newline at end of file +} From a77004e60ebfb8c58de560e19ae1c6889345d839 Mon Sep 17 00:00:00 2001 From: vishnureddybadveli <112267356+vishnureddybadveli@users.noreply.github.com> Date: Wed, 22 Jan 2025 09:46:40 -0800 Subject: [PATCH 7/9] Moved decap sub test cases from TE-18.1 README to a seperate directory (#3673) Move policy forwarding sub tests from TE-18.1 to PF-1.7. --- feature/gribi/otg_tests/mpls_in_udp/README.md | 80 +-------- .../mpls_gre_udp_decap_test/README.md | 158 ++++++++++++++++++ testregistry.textproto | 6 + 3 files changed, 166 insertions(+), 78 deletions(-) create mode 100644 feature/policy_forwarding/otg_tests/mpls_gre_udp_decap_test/README.md diff --git a/feature/gribi/otg_tests/mpls_in_udp/README.md b/feature/gribi/otg_tests/mpls_in_udp/README.md index b2f8fc44704..75be987625c 100644 --- a/feature/gribi/otg_tests/mpls_in_udp/README.md +++ b/feature/gribi/otg_tests/mpls_in_udp/README.md @@ -1,11 +1,7 @@ -# TE-18.1 gRIBI MPLS in UDP Encapsulation and Decapsulation +# TE-18.1 gRIBI MPLS in UDP Encapsulation Create AFT entries using gRIBI to match on next hop group in a -network-instance and encapsulate the matching packets in MPLS in UDP. - -Create a policy routing configuration using gNMI to decapsulate MPLS -in UDP packets which are sent to a loopback address and apply to -the DUT. +network-instance and encapsulate the matching packets in MPLS in UDP with outer header as IPv6 Header. The MPLS in UDP encapsulation is expected to follow [rfc7510](https://datatracker.ietf.org/doc/html/rfc7510#section-3), @@ -186,72 +182,6 @@ encapsulate in GRE. * Generate traffic from ATE port 1 to ATE port 2 * Validate ATE port 2 receives GRE traffic with correct inner and outer IPs -### TE-18.1.3 - MPLS in GRE decapsulation set by gNMI - -Canonical OpenConfig for policy forwarding, matching IP prefix with action -decapsulate in GRE. # TODO: Move to dedicated README - -```yaml -openconfig-network-instance: - network-instances: - - network-instance: "DEFAULT" - afts: - policy-forwarding: - policies: - policy: "default decap rule" - config: - policy-id: "default decap rule" - type: PBR_POLICY - rules: - rule: 1 - config: - sequence-id: 1 - ipv6: - config: - destination-address: "decap_loopback_ipv6" - action: - decapsulate-mpls-in-gre: TRUE # TODO: add to OC model/PR in progress -``` - -* Push the gNMI the policy forwarding configuration -* Push the configuration to DUT using gnmi.Set with REPLACE option -* Configure ATE port 1 with traffic flow which matches the decap loopback IP address -* Generate traffic from ATE port 1 -* Validate ATE port 2 receives packets with correct VLAN and the inner inner_decap_ipv6 - -### TE-18.1.4 - MPLS in UDP decapsulation set by gNMI - -Canonical OpenConfig for policy forwarding, matching IP prefix with action -decapsulate MPLS in UDP. # TODO: Move to dedicated README - -```yaml -openconfig-network-instance: - network-instances: - - network-instance: "DEFAULT" - afts: - policy-forwarding: - policies: - policy: "default decap rule" - config: - policy-id: "default decap rule" - type: PBR_POLICY - rules: - rule: 1 - config: - sequence-id: 1 - ipv6: - config: - destination-address: "decap_loopback_ipv6" - action: - decapsulate-mpls-in-udp: TRUE -``` - -* Push the gNMI the policy forwarding configuration -* Push the configuration to DUT using gnmi.Set with REPLACE option -* Configure ATE port 1 with traffic flow - * Flow should have a packet encap format : outer_decap_udp_ipv6 <- MPLS label <- inner_decap_ipv6 -* Generate traffic from ATE port 1 -* Validate ATE port 2 receives the innermost IPv4 traffic with correct VLAN and inner_decap_ipv6 ## OpenConfig Path and RPC Coverage @@ -294,12 +224,6 @@ paths: #/network-instances/network-instance/policy-forwarding/policies/policy/rules/rule/action/encap-headers/encap-header/gre/config/ip-ttl: #/network-instances/network-instance/policy-forwarding/policies/policy/rules/rule/action/encap-headers/encap-header/gre/config/source-ip: - # Paths added for TE-18.1.3 - MPLS in GRE decapsulation set by gNMI - /network-instances/network-instance/policy-forwarding/policies/policy/rules/rule/ipv6/config/destination-address: - # TODO: /network-instances/network-instance/policy-forwarding/policies/policy/rules/rule/action/config/decapsulate-mpls-in-gre: - - # Paths added for TE-18.1.4 - MPLS in UDP decapsulation set by gNMI - /network-instances/network-instance/policy-forwarding/policies/policy/rules/rule/action/config/decapsulate-mpls-in-udp: rpcs: gnmi: diff --git a/feature/policy_forwarding/otg_tests/mpls_gre_udp_decap_test/README.md b/feature/policy_forwarding/otg_tests/mpls_gre_udp_decap_test/README.md new file mode 100644 index 00000000000..ebc79da1ce2 --- /dev/null +++ b/feature/policy_forwarding/otg_tests/mpls_gre_udp_decap_test/README.md @@ -0,0 +1,158 @@ +# PF-1.7 Decapsulate MPLS in GRE and UDP + +Create a policy-forwarding configuration using gNMI to decapsulate MPLS +in GRE and UDP packets which are sent to a IP from a decap pool or loopback address and apply to +the DUT. + +## Topology + +* [`featureprofiles/topologies/atedut_2.testbed`](https://github.com/openconfig/featureprofiles/blob/main/topologies/atedut_2.testbed) + +## Test setup + +TODO: Complete test environment setup steps + +inner_ipv6_dst_A = "2001:aa:bb::1/128" +inner_ipv6_dst_B = "2001:aa:bb::2/128" +inner_ipv6_default = "::/0" + +ipv4_inner_dst_A = "10.5.1.1/32" +ipv4_inner_dst_B = "10.5.1.2/32" +ipv4_inner_default = "0.0.0.0/0" + +outer_ipv6_src = "2001:f:a:1::0" +outer_ipv6_dst_A = "2001:f:c:e::1" +outer_ipv6_dst_B = "2001:f:c:e::2" +outer_ipv6_dst_def = "2001:1:1:1::0" +outer_dst_udp_port = "6635" +outer_dscp = "26" +outer_ip-ttl = "64" + +## Procedure + +### PF-1.7.1 - MPLS in GRE decapsulation set by gNMI + +Canonical OpenConfig for policy forwarding, matching IP prefix with action +decapsulate in GRE. + +```json +{ + "openconfig-network-instance": { + "network-instances": [ + { + "afts": { + "policy-forwarding": { + "policies": [ + { + "config": { + "policy-id": "default decap rule", + "type": "PBR_POLICY" + }, + "policy": "default decap rule", + "rules": [ + { + "config": { + "sequence-id": 1, + }, + "ipv6": { + "config": { + "destination-address": "decap_ipv6" + } + }, + "action": { + "decapsulate-mpls-in-gre": TRUE + } + } + ] + } + ] + } + } + } + ] + } +} +``` +* Push the gNMI the policy forwarding configuration +* Push the configuration to DUT using gnmi.Set with REPLACE option +* Configure ATE port 1 with traffic flow + * Flow should have a packet encap format : outer_decap_gre_ipv6 <- MPLS label <- inner_decap_ipv6 +* Generate traffic from ATE port 1 +* Validate ATE port 2 receives the innermost IPv4 traffic with correct VLAN and inner_decap_ipv6 + +### PF-1.7.2 - MPLS in UDP decapsulation set by gNMI + +Canonical OpenConfig for policy forwarding, matching IP prefix with action +decapsulate MPLS in UDP. + +```json +{ + "openconfig-network-instance": { + "network-instances": [ + { + "afts": { + "policy-forwarding": { + "policies": [ + { + "config": { + "policy-id": "default decap rule", + "type": "PBR_POLICY" + }, + "policy": "default decap rule", + "rules": [ + { + "config": { + "sequence-id": 1, + }, + "ipv6": { + "config": { + "destination-address": "decap_ipv6" + } + }, + "action": { + "decapsulate-mpls-in-udp": TRUE + } + } + ] + } + ] + } + } + } + ] + } +} +``` +* Push the gNMI the policy forwarding configuration +* Push the configuration to DUT using gnmi.Set with REPLACE option +* Configure ATE port 1 with traffic flow + * Flow should have a packet encap format : outer_decap_udp_ipv6 <- MPLS label <- inner_decap_ipv6 +* Generate traffic from ATE port 1 +* Validate ATE port 2 receives the innermost IPv4 traffic with correct VLAN and inner_decap_ipv6 + +## OpenConfig Path and RPC Coverage + +```yaml +paths: + + # Paths added for PF-1.7.1 - MPLS in GRE decapsulation set by gNMI + /network-instances/network-instance/policy-forwarding/policies/policy/rules/rule/ipv6/config/destination-address: + # TODO: /network-instances/network-instance/policy-forwarding/policies/policy/rules/rule/action/config/decapsulate-mpls-in-gre: + + # Paths added for PF-1.7.2 - MPLS in UDP decapsulation set by gNMI + /network-instances/network-instance/policy-forwarding/policies/policy/rules/rule/action/config/decapsulate-mpls-in-udp: + + +rpcs: + gnmi: + gNMI.Set: + union_replace: true + replace: true + gNMI.Subscribe: + on_change: true + +``` + +## Required DUT platform + +* FFF diff --git a/testregistry.textproto b/testregistry.textproto index 5364f42a0b2..e40c1f31a9b 100644 --- a/testregistry.textproto +++ b/testregistry.textproto @@ -434,6 +434,12 @@ test: { readme: "" exec: " " } +test: { + id: "PF-1.7" + description: "Decapsulate MPLS in GRE and UDP" + readme: "https://github.com/openconfig/featureprofiles/blob/main/feature/policy_forwarding/otg_tests/mpls_gre_udp_decap_test/README.md" + exec: " " +} test: { id: "PLT-1.1" description: "Interface breakout Test" From 3947e680f0be10fa8db4f19a55442090f1f3656c Mon Sep 17 00:00:00 2001 From: vishnureddybadveli <112267356+vishnureddybadveli@users.noreply.github.com> Date: Wed, 22 Jan 2025 10:17:58 -0800 Subject: [PATCH 8/9] Add DP-2.4 test code (#3654) * Add files via upload * Update metadata.textproto * Update ingress_police_default_test.go with github paths * Update ingress_police_default_test.go * Update deviations.go to include gRIBI encap header unsupported * Update metadata.proto to include gRIBI encap header unsupported * Update metadata.textproto with proto-file comment * Update metadata.textproto * Update metadata.textproto * Update metadata.pb.go with gribi encap header unsupported * Added Cisco platform deviations * Update deviations.go after resolving merge conflicts with GribiEncapHeaderUnsupported * Update ingress_police_default_test.go with gofmt changes * Update ingress_police_default_test.go * Update ingress_police_default_test.go with queue name "DEFAULT" instead of "default" Some how queue name is misinterpreted as network instance and check style is cribbing about it. * Added the missing files. * Update README.md missing colon at description. * Update metadata.textproto Use unique UUID * Update ingress_police_default_test.go Using QosSchedulerIngressPolicer deviation. * Update metadata.textproto Using QosSchedulerIngressPolicer deviation. * Update deviations.go Using QosSchedulerIngressPolicer deviation. * Update metadata.proto Using deviation QosSchedulerIngressPolicer * Update metadata.pb.go * Update metadata.pb.go * Add TODO for OC * Fix indent. * Fix indent. * Fix indent. --------- Co-authored-by: sezhang2 --- .../ingress_police_default/README.md | 2 +- .../ingress_police_default_test.go | 287 ++++++++++++++++++ .../ingress_police_default/metadata.textproto | 31 ++ internal/deviations/deviations.go | 5 + proto/metadata.proto | 5 + proto/metadata_go_proto/metadata.pb.go | 226 ++++++-------- 6 files changed, 419 insertions(+), 137 deletions(-) create mode 100644 feature/qos/otg_tests/ingress_police_default/ingress_police_default_test.go create mode 100644 feature/qos/otg_tests/ingress_police_default/metadata.textproto diff --git a/feature/qos/otg_tests/ingress_police_default/README.md b/feature/qos/otg_tests/ingress_police_default/README.md index df47044e638..370fe4b097b 100644 --- a/feature/qos/otg_tests/ingress_police_default/README.md +++ b/feature/qos/otg_tests/ingress_police_default/README.md @@ -1,4 +1,4 @@ -# DP-2.4 Police traffic on input matching all packets using 1 rate, 2 color marker +# DP-2.4: Police traffic on input matching all packets using 1 rate, 2 color marker ## Summary diff --git a/feature/qos/otg_tests/ingress_police_default/ingress_police_default_test.go b/feature/qos/otg_tests/ingress_police_default/ingress_police_default_test.go new file mode 100644 index 00000000000..1eac3a2fa1d --- /dev/null +++ b/feature/qos/otg_tests/ingress_police_default/ingress_police_default_test.go @@ -0,0 +1,287 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package ingress_police_default_test + +import ( + "fmt" + "testing" + "time" + + "github.com/open-traffic-generator/snappi/gosnappi" + "github.com/openconfig/featureprofiles/internal/attrs" + "github.com/openconfig/featureprofiles/internal/deviations" + "github.com/openconfig/featureprofiles/internal/fptest" + "github.com/openconfig/featureprofiles/internal/helpers" + "github.com/openconfig/featureprofiles/internal/otgutils" + "github.com/openconfig/ondatra" + "github.com/openconfig/ondatra/gnmi" + "github.com/openconfig/ondatra/gnmi/oc" + "github.com/openconfig/ygnmi/ygnmi" + "github.com/openconfig/ygot/ygot" +) + +var ( + intf1 = attrs.Attributes{ + Name: "ate1", + MAC: "02:00:01:01:01:01", + IPv4: "198.51.100.1", + IPv4Len: 31, + } + + intf2 = attrs.Attributes{ + Name: "ate2", + MAC: "02:00:01:02:01:01", + IPv4: "198.51.100.3", + IPv4Len: 31, + } + + dutPort1 = attrs.Attributes{ + IPv4: "198.51.100.0", + } + dutPort2 = attrs.Attributes{ + IPv4: "198.51.100.2", + } +) + +type trafficData struct { + expectedThroughputPct float32 + gbpsRate uint32 + queue string + inputIntf attrs.Attributes +} + +func TestMain(m *testing.M) { + fptest.RunTests(m) +} + +// configureIntertfaceIngressPolicerCLI is used to configure vendor specific config statements. +func configureIntertfaceIngressPolicerCLI(t *testing.T, dut *ondatra.DUTDevice) { + switch dut.Vendor() { + case ondatra.ARISTA: + var defaultPolicyCLI string + defaultPolicyCLI = fmt.Sprintf("policing \n profile %s rate %d mbps burst-size %d kbytes \n", "DP24", 1000, 1000) + helpers.GnmiCLIConfig(t, dut, defaultPolicyCLI) + defaultPolicyCLI = fmt.Sprintf("interface %s \n policer profile dp24 input \n", dut.Port(t, "port1").Name()) + helpers.GnmiCLIConfig(t, dut, defaultPolicyCLI) + case ondatra.CISCO: + var defaultPolicyCLI string + helpers.GnmiCLIConfig(t, dut, "policy-map dp24 \n class class-default \n police 1 gbps \n") + defaultPolicyCLI = fmt.Sprintf("interface %s \n service-policy input dp24 \n", dut.Port(t, "port1").Name()) + helpers.GnmiCLIConfig(t, dut, defaultPolicyCLI) + default: + t.Fatalf("Unsupported vendor %s for native command support for deviation 'GribiEncapHeaderUnsupported'", dut.Vendor()) + } +} + +// Test cases: +// 1. Validate that flow experiences 0 packet loss at 0.7Gbps. +// 2. Validate that flow experiences ~50% packet loss (+/- 1%) +func TestInterfaceIngressPolicer(t *testing.T) { + + dut := ondatra.DUT(t, "dut") + dp1 := dut.Port(t, "port1") + dp2 := dut.Port(t, "port2") + + // Configure DUT interfaces and QoS. + ConfigureDUTIntf(t, dut) + if deviations.QosSchedulerIngressPolicer(dut) { + configureIntertfaceIngressPolicerCLI(t, dut) + } else { + // TODO: Generate openconfig for ingress policier and use gNMI to set it. + } + // Configure ATE interfaces. + ate := ondatra.ATE(t, "ate") + ap1 := ate.Port(t, "port1") + ap2 := ate.Port(t, "port2") + top := gosnappi.NewConfig() + + intf1.AddToOTG(top, ap1, &dutPort1) + intf2.AddToOTG(top, ap2, &dutPort2) + ate.OTG().PushConfig(t, top) + + var tolerance float32 = 3.0 + + // Validate that flow experiences 0 packet loss at 0.7Gbps. + TrafficFlows10 := map[string]*trafficData{ + "intf1-be0": { + gbpsRate: 1, + expectedThroughputPct: 100.0, + queue: "DEFAULT", + inputIntf: intf1, + }, + } + + // Validate that flow experiences ~50% packet loss. + oversubscribedTrafficFlows11 := map[string]*trafficData{ + "intf1-be0": { + gbpsRate: 2, + expectedThroughputPct: 100.0, + queue: "DEFAULT", + inputIntf: intf1, + }, + } + + type test struct { + desc string + trafficFlows map[string]*trafficData + trafficDuration time.Duration + } + + cases := []test{ + { + desc: "Validate that flow experiences 0 packet loss at 0.7Gbps", + trafficFlows: TrafficFlows10, + trafficDuration: 60 * time.Second, + }, + { + desc: "Validate that flow experiences ~50% packet loss at 2Gbps", + trafficFlows: oversubscribedTrafficFlows11, + trafficDuration: 60 * time.Second, + }, + } + for _, tc := range cases { + t.Run(tc.desc, func(t *testing.T) { + trafficFlows := tc.trafficFlows + top.Flows().Clear() + + for trafficID, data := range trafficFlows { + t.Logf("Configuring flow %s", trafficID) + flow := top.Flows().Add().SetName(trafficID) + flow.Metrics().SetEnable(true) + flow.TxRx().Device().SetTxNames([]string{data.inputIntf.Name + ".IPv4"}).SetRxNames([]string{intf2.Name + ".IPv4"}) + ethHeader := flow.Packet().Add().Ethernet() + ethHeader.Src().SetValue(data.inputIntf.MAC) + + ipHeader := flow.Packet().Add().Ipv4() + ipHeader.Src().SetValue(data.inputIntf.IPv4) + ipHeader.Dst().SetValue(intf2.IPv4) + flow.Rate().SetGbps(data.gbpsRate) + } + + ate.OTG().PushConfig(t, top) + ate.OTG().StartProtocols(t) + otgutils.WaitForARP(t, ate.OTG(), top, "IPv4") + + ateOutPkts := make(map[string]uint64) + ateInPkts := make(map[string]uint64) + dutQosPktsBeforeTraffic := make(map[string]uint64) + dutQosPktsAfterTraffic := make(map[string]uint64) + dutQosDroppedPktsBeforeTraffic := make(map[string]uint64) + dutQosDroppedPktsAfterTraffic := make(map[string]uint64) + + // Set the initial counters to 0. + for _, data := range trafficFlows { + ateOutPkts[data.queue] = 0 + ateInPkts[data.queue] = 0 + dutQosPktsBeforeTraffic[data.queue] = 0 + dutQosPktsAfterTraffic[data.queue] = 0 + dutQosDroppedPktsBeforeTraffic[data.queue] = 0 + dutQosDroppedPktsAfterTraffic[data.queue] = 0 + } + + // Get QoS egress packet counters before the traffic. + const timeout = time.Minute + isPresent := func(val *ygnmi.Value[uint64]) bool { return val.IsPresent() } + for _, data := range trafficFlows { + count, ok := gnmi.Watch(t, dut, gnmi.OC().Qos().Interface(dp2.Name()).Output().Queue(data.queue).TransmitPkts().State(), timeout, isPresent).Await(t) + if !ok { + t.Logf("TransmitPkts count for queue %q on interface %q not available within %v", dp2.Name(), data.queue, timeout) + } + dutQosPktsBeforeTraffic[data.queue], _ = count.Val() + + count, ok = gnmi.Watch(t, dut, gnmi.OC().Qos().Interface(dp2.Name()).Output().Queue(data.queue).DroppedPkts().State(), timeout, isPresent).Await(t) + if !ok { + t.Logf("DroppedPkts count for queue %q on interface %q not available within %v", dp2.Name(), data.queue, timeout) + } + dutQosDroppedPktsBeforeTraffic[data.queue], _ = count.Val() + } + + t.Logf("Running traffic 1 on DUT interfaces: %s => %s ", dp1.Name(), dp2.Name()) + t.Logf("Sending traffic flows: \n%v\n\n", trafficFlows) + ate.OTG().StartTraffic(t) + time.Sleep(tc.trafficDuration) + ate.OTG().StopTraffic(t) + time.Sleep(10 * time.Second) + + otgutils.LogFlowMetrics(t, ate.OTG(), top) + for trafficID, data := range trafficFlows { + ateTxPkts := gnmi.Get(t, ate.OTG(), gnmi.OTG().Flow(trafficID).Counters().OutPkts().State()) + ateRxPkts := gnmi.Get(t, ate.OTG(), gnmi.OTG().Flow(trafficID).Counters().InPkts().State()) + ateOutPkts[data.queue] += ateTxPkts + ateInPkts[data.queue] += ateRxPkts + t.Logf("ateInPkts: %v, txPkts %v, Queue: %v", ateInPkts[data.queue], dutQosPktsAfterTraffic[data.queue], data.queue) + if ateTxPkts == 0 { + t.Fatalf("TxPkts == 0, want >0.") + } + lossPct := (float32)((float64(ateTxPkts-ateRxPkts) * 100.0) / float64(ateTxPkts)) + t.Logf("Get flow %q: lossPct: %.2f%% or rxPct: %.2f%%, want: %.2f%%\n\n", data.queue, lossPct, 100.0-lossPct, data.expectedThroughputPct) + if got, want := 100.0-lossPct, data.expectedThroughputPct; got < want-tolerance || got > want+tolerance { + t.Errorf("Get(throughput for queue %q): got %.2f%%, want within [%.2f%%, %.2f%%]", data.queue, got, want-tolerance, want+tolerance) + } + } + }) + } +} + +func ConfigureDUTIntf(t *testing.T, dut *ondatra.DUTDevice) { + t.Helper() + dp1 := dut.Port(t, "port1") + dp2 := dut.Port(t, "port2") + dp3 := dut.Port(t, "port3") + + dutIntfs := []struct { + desc string + intfName string + ipAddr string + prefixLen uint8 + }{{ + desc: "Input interface port1", + intfName: dp1.Name(), + ipAddr: dutPort1.IPv4, + prefixLen: 31, + }, { + desc: "Input interface port2", + intfName: dp2.Name(), + ipAddr: dutPort2.IPv4, + prefixLen: 31, + }} + + // Configure the interfaces. + for _, intf := range dutIntfs { + t.Logf("Configure DUT interface %s with attributes %v", intf.intfName, intf) + i := &oc.Interface{ + Name: ygot.String(intf.intfName), + Description: ygot.String(intf.desc), + Type: oc.IETFInterfaces_InterfaceType_ethernetCsmacd, + Enabled: ygot.Bool(true), + } + i.GetOrCreateEthernet() + s := i.GetOrCreateSubinterface(0).GetOrCreateIpv4() + if deviations.InterfaceEnabled(dut) && !deviations.IPv4MissingEnabled(dut) { + s.Enabled = ygot.Bool(true) + } + a := s.GetOrCreateAddress(intf.ipAddr) + a.PrefixLength = ygot.Uint8(intf.prefixLen) + gnmi.Replace(t, dut, gnmi.OC().Interface(intf.intfName).Config(), i) + if deviations.ExplicitInterfaceInDefaultVRF(dut) { + fptest.AssignToNetworkInstance(t, dut, intf.intfName, deviations.DefaultNetworkInstance(dut), 0) + } + } + if deviations.ExplicitPortSpeed(dut) { + fptest.SetPortSpeed(t, dp1) + fptest.SetPortSpeed(t, dp2) + fptest.SetPortSpeed(t, dp3) + } +} diff --git a/feature/qos/otg_tests/ingress_police_default/metadata.textproto b/feature/qos/otg_tests/ingress_police_default/metadata.textproto new file mode 100644 index 00000000000..023a2563573 --- /dev/null +++ b/feature/qos/otg_tests/ingress_police_default/metadata.textproto @@ -0,0 +1,31 @@ +# proto-file: github.com/openconfig/featureprofiles/proto/metadata.proto +# proto-message: Metadata + +uuid: "36cc79b5-3766-4cb4-b83b-1baea1464db8" +plan_id: "DP-2.4" +description: "Police traffic on input matching all packets using 1 rate, 2 color marker" +testbed: TESTBED_DUT_ATE_4LINKS +platform_exceptions: { + platform: { + vendor: ARISTA + } + deviations: { + static_protocol_name: "STATIC" + qos_scheduler_ingress_policer_unsupported: true + gribi_mac_override_static_arp_static_route: true + interface_enabled: true + default_network_instance: "default" + } +} +platform_exceptions: { + platform: { + vendor: CISCO + } + deviations: { + static_protocol_name: "STATIC" + qos_scheduler_ingress_policer_unsupported: true + gribi_mac_override_static_arp_static_route: true + interface_enabled: true + default_network_instance: "default" + } +} diff --git a/internal/deviations/deviations.go b/internal/deviations/deviations.go index 07dc0d51adc..5545ad3a1ba 100644 --- a/internal/deviations/deviations.go +++ b/internal/deviations/deviations.go @@ -1297,3 +1297,8 @@ func DefaultBgpInstanceName(dut *ondatra.DUTDevice) string { func ChannelRateClassParametersUnsupported(dut *ondatra.DUTDevice) bool { return lookupDUTDeviations(dut).GetChannelAssignmentRateClassParametersUnsupported() } + +// QosSchedulerIngressPolicer returns true if qos ingress policing is unsupported +func QosSchedulerIngressPolicer(dut *ondatra.DUTDevice) bool { + return lookupDUTDeviations(dut).GetQosSchedulerIngressPolicerUnsupported() +} diff --git a/proto/metadata.proto b/proto/metadata.proto index b9dafbe0075..17b7e664d65 100644 --- a/proto/metadata.proto +++ b/proto/metadata.proto @@ -687,8 +687,13 @@ message Metadata { // Cisco: b/388983709 // default bgp instance name is used to set bgp instance name value other than DEFAULT string default_bgp_instance_name = 246; + // Arista does not support ETHChannel rate-class bool channel_assignment_rate_class_parameters_unsupported = 247; + + // Arista: b/346557012 + // Devices that do not support qos scheduler ingress policer. + bool qos_scheduler_ingress_policer_unsupported = 248; // Reserved field numbers and identifiers. reserved 84, 9, 28, 20, 90, 97, 55, 89, 19, 36, 35, 40, 173; diff --git a/proto/metadata_go_proto/metadata.pb.go b/proto/metadata_go_proto/metadata.pb.go index 7c856ab6450..9f7809dfdcd 100644 --- a/proto/metadata_go_proto/metadata.pb.go +++ b/proto/metadata_go_proto/metadata.pb.go @@ -14,8 +14,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.33.0 -// protoc v3.21.12 +// protoc-gen-go v1.36.1 +// protoc v5.29.2 // source: metadata.proto package metadata_go_proto @@ -164,10 +164,7 @@ func (Metadata_Tags) EnumDescriptor() ([]byte, []int) { // Metadata about a Feature Profiles test. type Metadata struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // UUID of the test. Uuid string `protobuf:"bytes,1,opt,name=uuid,proto3" json:"uuid,omitempty"` // ID of the test in the test plan. @@ -185,15 +182,15 @@ type Metadata struct { // Whether this test only checks paths for presence rather than semantic // checks. PathPresenceTest bool `protobuf:"varint,7,opt,name=path_presence_test,json=pathPresenceTest,proto3" json:"path_presence_test,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Metadata) Reset() { *x = Metadata{} - if protoimpl.UnsafeEnabled { - mi := &file_metadata_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_metadata_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Metadata) String() string { @@ -204,7 +201,7 @@ func (*Metadata) ProtoMessage() {} func (x *Metadata) ProtoReflect() protoreflect.Message { mi := &file_metadata_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -269,10 +266,7 @@ func (x *Metadata) GetPathPresenceTest() bool { } type Metadata_Platform struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Vendor of the device. Vendor proto.Device_Vendor `protobuf:"varint,1,opt,name=vendor,proto3,enum=ondatra.Device_Vendor" json:"vendor,omitempty"` // Regex for hardware model of the device. @@ -281,15 +275,15 @@ type Metadata_Platform struct { // Regex for software version of the device. // The empty string will match any software version. SoftwareVersionRegex string `protobuf:"bytes,4,opt,name=software_version_regex,json=softwareVersionRegex,proto3" json:"software_version_regex,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Metadata_Platform) Reset() { *x = Metadata_Platform{} - if protoimpl.UnsafeEnabled { - mi := &file_metadata_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_metadata_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Metadata_Platform) String() string { @@ -300,7 +294,7 @@ func (*Metadata_Platform) ProtoMessage() {} func (x *Metadata_Platform) ProtoReflect() protoreflect.Message { mi := &file_metadata_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -337,10 +331,7 @@ func (x *Metadata_Platform) GetSoftwareVersionRegex() string { } type Metadata_Deviations struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Device does not support interface/ipv4/enabled, // so suppress configuring this leaf. Ipv4MissingEnabled bool `protobuf:"varint,1,opt,name=ipv4_missing_enabled,json=ipv4MissingEnabled,proto3" json:"ipv4_missing_enabled,omitempty"` @@ -973,15 +964,18 @@ type Metadata_Deviations struct { DefaultBgpInstanceName string `protobuf:"bytes,246,opt,name=default_bgp_instance_name,json=defaultBgpInstanceName,proto3" json:"default_bgp_instance_name,omitempty"` // Arista does not support ETHChannel rate-class ChannelAssignmentRateClassParametersUnsupported bool `protobuf:"varint,247,opt,name=channel_assignment_rate_class_parameters_unsupported,json=channelAssignmentRateClassParametersUnsupported,proto3" json:"channel_assignment_rate_class_parameters_unsupported,omitempty"` + // Arista: b/346557012 + // Devices that do not support qos scheduler ingress policer. + QosSchedulerIngressPolicerUnsupported bool `protobuf:"varint,248,opt,name=qos_scheduler_ingress_policer_unsupported,json=qosSchedulerIngressPolicerUnsupported,proto3" json:"qos_scheduler_ingress_policer_unsupported,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Metadata_Deviations) Reset() { *x = Metadata_Deviations{} - if protoimpl.UnsafeEnabled { - mi := &file_metadata_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_metadata_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Metadata_Deviations) String() string { @@ -992,7 +986,7 @@ func (*Metadata_Deviations) ProtoMessage() {} func (x *Metadata_Deviations) ProtoReflect() protoreflect.Message { mi := &file_metadata_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2589,22 +2583,26 @@ func (x *Metadata_Deviations) GetChannelAssignmentRateClassParametersUnsupported return false } +func (x *Metadata_Deviations) GetQosSchedulerIngressPolicerUnsupported() bool { + if x != nil { + return x.QosSchedulerIngressPolicerUnsupported + } + return false +} + type Metadata_PlatformExceptions struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Platform *Metadata_Platform `protobuf:"bytes,1,opt,name=platform,proto3" json:"platform,omitempty"` + Deviations *Metadata_Deviations `protobuf:"bytes,2,opt,name=deviations,proto3" json:"deviations,omitempty"` unknownFields protoimpl.UnknownFields - - Platform *Metadata_Platform `protobuf:"bytes,1,opt,name=platform,proto3" json:"platform,omitempty"` - Deviations *Metadata_Deviations `protobuf:"bytes,2,opt,name=deviations,proto3" json:"deviations,omitempty"` + sizeCache protoimpl.SizeCache } func (x *Metadata_PlatformExceptions) Reset() { *x = Metadata_PlatformExceptions{} - if protoimpl.UnsafeEnabled { - mi := &file_metadata_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_metadata_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Metadata_PlatformExceptions) String() string { @@ -2615,7 +2613,7 @@ func (*Metadata_PlatformExceptions) ProtoMessage() {} func (x *Metadata_PlatformExceptions) ProtoReflect() protoreflect.Message { mi := &file_metadata_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2652,7 +2650,7 @@ var file_metadata_proto_rawDesc = []byte{ 0x74, 0x69, 0x6e, 0x67, 0x1a, 0x31, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x6f, 0x6e, 0x64, 0x61, 0x74, 0x72, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x62, 0x65, - 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x93, 0x8c, 0x01, 0x0a, 0x08, 0x4d, 0x65, 0x74, + 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xee, 0x8c, 0x01, 0x0a, 0x08, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x70, 0x6c, 0x61, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x6c, 0x61, 0x6e, @@ -2686,7 +2684,7 @@ var file_metadata_proto_rawDesc = []byte{ 0x65, 0x67, 0x65, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x67, 0x65, 0x78, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x52, 0x0e, 0x68, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, - 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x1a, 0xc9, 0x83, 0x01, 0x0a, 0x0a, 0x44, 0x65, 0x76, 0x69, + 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x1a, 0xa4, 0x84, 0x01, 0x0a, 0x0a, 0x44, 0x65, 0x76, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x69, 0x70, 0x76, 0x34, 0x5f, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x69, 0x70, 0x76, 0x34, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6e, @@ -3734,47 +3732,53 @@ var file_metadata_proto_rawDesc = []byte{ 0x28, 0x08, 0x52, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x55, 0x6e, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x64, 0x4a, 0x04, 0x08, 0x54, 0x10, 0x55, 0x4a, 0x04, 0x08, 0x09, 0x10, 0x0a, 0x4a, - 0x04, 0x08, 0x1c, 0x10, 0x1d, 0x4a, 0x04, 0x08, 0x14, 0x10, 0x15, 0x4a, 0x04, 0x08, 0x5a, 0x10, - 0x5b, 0x4a, 0x04, 0x08, 0x61, 0x10, 0x62, 0x4a, 0x04, 0x08, 0x37, 0x10, 0x38, 0x4a, 0x04, 0x08, - 0x59, 0x10, 0x5a, 0x4a, 0x04, 0x08, 0x13, 0x10, 0x14, 0x4a, 0x04, 0x08, 0x24, 0x10, 0x25, 0x4a, - 0x04, 0x08, 0x23, 0x10, 0x24, 0x4a, 0x04, 0x08, 0x28, 0x10, 0x29, 0x4a, 0x06, 0x08, 0xad, 0x01, - 0x10, 0xae, 0x01, 0x1a, 0xa0, 0x01, 0x0a, 0x12, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, - 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x41, 0x0a, 0x08, 0x70, 0x6c, - 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6f, + 0x74, 0x65, 0x64, 0x12, 0x59, 0x0a, 0x29, 0x71, 0x6f, 0x73, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, + 0x75, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x65, 0x72, 0x5f, 0x75, 0x6e, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, + 0x18, 0xf8, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x25, 0x71, 0x6f, 0x73, 0x53, 0x63, 0x68, 0x65, + 0x64, 0x75, 0x6c, 0x65, 0x72, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x65, 0x72, 0x55, 0x6e, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x4a, 0x04, + 0x08, 0x54, 0x10, 0x55, 0x4a, 0x04, 0x08, 0x09, 0x10, 0x0a, 0x4a, 0x04, 0x08, 0x1c, 0x10, 0x1d, + 0x4a, 0x04, 0x08, 0x14, 0x10, 0x15, 0x4a, 0x04, 0x08, 0x5a, 0x10, 0x5b, 0x4a, 0x04, 0x08, 0x61, + 0x10, 0x62, 0x4a, 0x04, 0x08, 0x37, 0x10, 0x38, 0x4a, 0x04, 0x08, 0x59, 0x10, 0x5a, 0x4a, 0x04, + 0x08, 0x13, 0x10, 0x14, 0x4a, 0x04, 0x08, 0x24, 0x10, 0x25, 0x4a, 0x04, 0x08, 0x23, 0x10, 0x24, + 0x4a, 0x04, 0x08, 0x28, 0x10, 0x29, 0x4a, 0x06, 0x08, 0xad, 0x01, 0x10, 0xae, 0x01, 0x1a, 0xa0, + 0x01, 0x0a, 0x12, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x45, 0x78, 0x63, 0x65, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x41, 0x0a, 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, + 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x08, + 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x47, 0x0a, 0x0a, 0x64, 0x65, 0x76, 0x69, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, - 0x67, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x6c, 0x61, 0x74, 0x66, - 0x6f, 0x72, 0x6d, 0x52, 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x47, 0x0a, - 0x0a, 0x64, 0x65, 0x76, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x27, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x74, - 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x44, 0x65, 0x76, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0a, 0x64, 0x65, 0x76, 0x69, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x96, 0x02, 0x0a, 0x07, 0x54, 0x65, 0x73, 0x74, 0x62, - 0x65, 0x64, 0x12, 0x17, 0x0a, 0x13, 0x54, 0x45, 0x53, 0x54, 0x42, 0x45, 0x44, 0x5f, 0x55, 0x4e, - 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x54, - 0x45, 0x53, 0x54, 0x42, 0x45, 0x44, 0x5f, 0x44, 0x55, 0x54, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, - 0x54, 0x45, 0x53, 0x54, 0x42, 0x45, 0x44, 0x5f, 0x44, 0x55, 0x54, 0x5f, 0x44, 0x55, 0x54, 0x5f, - 0x34, 0x4c, 0x49, 0x4e, 0x4b, 0x53, 0x10, 0x02, 0x12, 0x1a, 0x0a, 0x16, 0x54, 0x45, 0x53, 0x54, - 0x42, 0x45, 0x44, 0x5f, 0x44, 0x55, 0x54, 0x5f, 0x41, 0x54, 0x45, 0x5f, 0x32, 0x4c, 0x49, 0x4e, - 0x4b, 0x53, 0x10, 0x03, 0x12, 0x1a, 0x0a, 0x16, 0x54, 0x45, 0x53, 0x54, 0x42, 0x45, 0x44, 0x5f, - 0x44, 0x55, 0x54, 0x5f, 0x41, 0x54, 0x45, 0x5f, 0x34, 0x4c, 0x49, 0x4e, 0x4b, 0x53, 0x10, 0x04, - 0x12, 0x1e, 0x0a, 0x1a, 0x54, 0x45, 0x53, 0x54, 0x42, 0x45, 0x44, 0x5f, 0x44, 0x55, 0x54, 0x5f, - 0x41, 0x54, 0x45, 0x5f, 0x39, 0x4c, 0x49, 0x4e, 0x4b, 0x53, 0x5f, 0x4c, 0x41, 0x47, 0x10, 0x05, - 0x12, 0x1e, 0x0a, 0x1a, 0x54, 0x45, 0x53, 0x54, 0x42, 0x45, 0x44, 0x5f, 0x44, 0x55, 0x54, 0x5f, - 0x44, 0x55, 0x54, 0x5f, 0x41, 0x54, 0x45, 0x5f, 0x32, 0x4c, 0x49, 0x4e, 0x4b, 0x53, 0x10, 0x06, - 0x12, 0x1a, 0x0a, 0x16, 0x54, 0x45, 0x53, 0x54, 0x42, 0x45, 0x44, 0x5f, 0x44, 0x55, 0x54, 0x5f, - 0x41, 0x54, 0x45, 0x5f, 0x38, 0x4c, 0x49, 0x4e, 0x4b, 0x53, 0x10, 0x07, 0x12, 0x15, 0x0a, 0x11, - 0x54, 0x45, 0x53, 0x54, 0x42, 0x45, 0x44, 0x5f, 0x44, 0x55, 0x54, 0x5f, 0x34, 0x30, 0x30, 0x5a, - 0x52, 0x10, 0x08, 0x12, 0x1a, 0x0a, 0x16, 0x54, 0x45, 0x53, 0x54, 0x42, 0x45, 0x44, 0x5f, 0x44, - 0x55, 0x54, 0x5f, 0x34, 0x30, 0x30, 0x5a, 0x52, 0x5f, 0x50, 0x4c, 0x55, 0x53, 0x10, 0x09, 0x22, - 0x6d, 0x0a, 0x04, 0x54, 0x61, 0x67, 0x73, 0x12, 0x14, 0x0a, 0x10, 0x54, 0x41, 0x47, 0x53, 0x5f, - 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x14, 0x0a, - 0x10, 0x54, 0x41, 0x47, 0x53, 0x5f, 0x41, 0x47, 0x47, 0x52, 0x45, 0x47, 0x41, 0x54, 0x49, 0x4f, - 0x4e, 0x10, 0x01, 0x12, 0x18, 0x0a, 0x14, 0x54, 0x41, 0x47, 0x53, 0x5f, 0x44, 0x41, 0x54, 0x41, - 0x43, 0x45, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x45, 0x44, 0x47, 0x45, 0x10, 0x02, 0x12, 0x0d, 0x0a, - 0x09, 0x54, 0x41, 0x47, 0x53, 0x5f, 0x45, 0x44, 0x47, 0x45, 0x10, 0x03, 0x12, 0x10, 0x0a, 0x0c, - 0x54, 0x41, 0x47, 0x53, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x49, 0x54, 0x10, 0x04, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x67, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x22, 0x96, 0x02, 0x0a, 0x07, 0x54, 0x65, 0x73, 0x74, 0x62, 0x65, 0x64, 0x12, 0x17, 0x0a, + 0x13, 0x54, 0x45, 0x53, 0x54, 0x42, 0x45, 0x44, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, + 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x45, 0x53, 0x54, 0x42, 0x45, + 0x44, 0x5f, 0x44, 0x55, 0x54, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x54, 0x45, 0x53, 0x54, 0x42, + 0x45, 0x44, 0x5f, 0x44, 0x55, 0x54, 0x5f, 0x44, 0x55, 0x54, 0x5f, 0x34, 0x4c, 0x49, 0x4e, 0x4b, + 0x53, 0x10, 0x02, 0x12, 0x1a, 0x0a, 0x16, 0x54, 0x45, 0x53, 0x54, 0x42, 0x45, 0x44, 0x5f, 0x44, + 0x55, 0x54, 0x5f, 0x41, 0x54, 0x45, 0x5f, 0x32, 0x4c, 0x49, 0x4e, 0x4b, 0x53, 0x10, 0x03, 0x12, + 0x1a, 0x0a, 0x16, 0x54, 0x45, 0x53, 0x54, 0x42, 0x45, 0x44, 0x5f, 0x44, 0x55, 0x54, 0x5f, 0x41, + 0x54, 0x45, 0x5f, 0x34, 0x4c, 0x49, 0x4e, 0x4b, 0x53, 0x10, 0x04, 0x12, 0x1e, 0x0a, 0x1a, 0x54, + 0x45, 0x53, 0x54, 0x42, 0x45, 0x44, 0x5f, 0x44, 0x55, 0x54, 0x5f, 0x41, 0x54, 0x45, 0x5f, 0x39, + 0x4c, 0x49, 0x4e, 0x4b, 0x53, 0x5f, 0x4c, 0x41, 0x47, 0x10, 0x05, 0x12, 0x1e, 0x0a, 0x1a, 0x54, + 0x45, 0x53, 0x54, 0x42, 0x45, 0x44, 0x5f, 0x44, 0x55, 0x54, 0x5f, 0x44, 0x55, 0x54, 0x5f, 0x41, + 0x54, 0x45, 0x5f, 0x32, 0x4c, 0x49, 0x4e, 0x4b, 0x53, 0x10, 0x06, 0x12, 0x1a, 0x0a, 0x16, 0x54, + 0x45, 0x53, 0x54, 0x42, 0x45, 0x44, 0x5f, 0x44, 0x55, 0x54, 0x5f, 0x41, 0x54, 0x45, 0x5f, 0x38, + 0x4c, 0x49, 0x4e, 0x4b, 0x53, 0x10, 0x07, 0x12, 0x15, 0x0a, 0x11, 0x54, 0x45, 0x53, 0x54, 0x42, + 0x45, 0x44, 0x5f, 0x44, 0x55, 0x54, 0x5f, 0x34, 0x30, 0x30, 0x5a, 0x52, 0x10, 0x08, 0x12, 0x1a, + 0x0a, 0x16, 0x54, 0x45, 0x53, 0x54, 0x42, 0x45, 0x44, 0x5f, 0x44, 0x55, 0x54, 0x5f, 0x34, 0x30, + 0x30, 0x5a, 0x52, 0x5f, 0x50, 0x4c, 0x55, 0x53, 0x10, 0x09, 0x22, 0x6d, 0x0a, 0x04, 0x54, 0x61, + 0x67, 0x73, 0x12, 0x14, 0x0a, 0x10, 0x54, 0x41, 0x47, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, + 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x54, 0x41, 0x47, 0x53, + 0x5f, 0x41, 0x47, 0x47, 0x52, 0x45, 0x47, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x01, 0x12, 0x18, + 0x0a, 0x14, 0x54, 0x41, 0x47, 0x53, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x43, 0x45, 0x4e, 0x54, 0x45, + 0x52, 0x5f, 0x45, 0x44, 0x47, 0x45, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x41, 0x47, 0x53, + 0x5f, 0x45, 0x44, 0x47, 0x45, 0x10, 0x03, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x41, 0x47, 0x53, 0x5f, + 0x54, 0x52, 0x41, 0x4e, 0x53, 0x49, 0x54, 0x10, 0x04, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, } var ( @@ -3791,7 +3795,7 @@ func file_metadata_proto_rawDescGZIP() []byte { var file_metadata_proto_enumTypes = make([]protoimpl.EnumInfo, 2) var file_metadata_proto_msgTypes = make([]protoimpl.MessageInfo, 4) -var file_metadata_proto_goTypes = []interface{}{ +var file_metadata_proto_goTypes = []any{ (Metadata_Testbed)(0), // 0: openconfig.testing.Metadata.Testbed (Metadata_Tags)(0), // 1: openconfig.testing.Metadata.Tags (*Metadata)(nil), // 2: openconfig.testing.Metadata @@ -3819,56 +3823,6 @@ func file_metadata_proto_init() { if File_metadata_proto != nil { return } - if !protoimpl.UnsafeEnabled { - file_metadata_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Metadata); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_metadata_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Metadata_Platform); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_metadata_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Metadata_Deviations); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_metadata_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Metadata_PlatformExceptions); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ From 0b5b11ed1d02ca18450e1b320cf041891056aa0c Mon Sep 17 00:00:00 2001 From: dipchauh <159579776+dipchauh@users.noreply.github.com> Date: Thu, 23 Jan 2025 00:43:06 -0500 Subject: [PATCH 9/9] DSCP Transparency with ECN (#3707) "This code is a Contribution to the OpenConfig Feature Profiles project ("Work") made under the Google Software Grant and Corporate Contributor License Agreement ("CLA") and governed by the Apache License 2.0. No other rights or licenses in or to any of Nokia's intellectual property are granted for any other purpose. This code is provided on an "as is" basis without any warranties of any kind." --- .../README.md | 103 ++- .../dscp_transparency_test.go | 860 ++++++++++++++++++ .../dscp_transparency_test/metadata.textproto | 18 + testregistry.textproto | 10 +- 4 files changed, 941 insertions(+), 50 deletions(-) rename feature/qos/ecn/otg_tests/{DSCP_transparency => dscp_transparency_test}/README.md (51%) create mode 100644 feature/qos/ecn/otg_tests/dscp_transparency_test/dscp_transparency_test.go create mode 100644 feature/qos/ecn/otg_tests/dscp_transparency_test/metadata.textproto diff --git a/feature/qos/ecn/otg_tests/DSCP_transparency/README.md b/feature/qos/ecn/otg_tests/dscp_transparency_test/README.md similarity index 51% rename from feature/qos/ecn/otg_tests/DSCP_transparency/README.md rename to feature/qos/ecn/otg_tests/dscp_transparency_test/README.md index 6eec6f86e7a..4c12cf018f9 100644 --- a/feature/qos/ecn/otg_tests/DSCP_transparency/README.md +++ b/feature/qos/ecn/otg_tests/dscp_transparency_test/README.md @@ -1,5 +1,4 @@ - -# DP-1.14: DSCP transperency with ECN +# DP-1.17: DSCP Transparency with ECN ## Summary @@ -28,10 +27,10 @@ This test evaluates if all 64 combination of DSCP bits are transparently handled * 7 queues and 7 corresponding forwarding group * Scheduler policy with * one scheduler of STRICT priority type serving NC1 queue - * one scheduler of WRR type serving 6 queues AF4, AF3, AF2, AF1, BE0, BE1 with equal weights 10:10:10:10:10:10 respectivly + * one scheduler of WRR type serving 6 queues AF4, AF3, AF2, AF1, BE0, BE1 with equal weights 10:10:10:10:10:10 respectively * queue-management profile of WRED type with: - * min-treshold: 80KB - * max-treshold: 3MB + * min-threshold: 80KB + * max-threshold: 3MB * max-drop-percentage: 100 * ecn: enabled * attach queue-management profile to queues NC1, AF4, AF3, AF2, AF1, BE0, BE1; @@ -48,8 +47,9 @@ This test evaluates if all 64 combination of DSCP bits are transparently handled * Verify using DUTPort3 telemetry that: * no drops are seen in any of queues on DUTPort3 * all queues reports non-zero transmit packets, octets. -* Verify on ATEPort3 that all flows are recived w/o DSCP modification -all 64 values are observed -* verify on ATEPort3 that all recived packet has ECT(0) ECN value +* Verify on ATEPort3 that all flows are received w/o DSCP modification -all 64 values are observed +* verify on ATEPort3 that all received packet has ECT(0) ECN value + ### Sub Test #2 - Congestion * Generate 64 flows of traffic form ATEPort1 and 64 flows of traffic form ATEPort2 toward ATEPort3 * each flow form ATEPort1 has distinct DSCP value @@ -64,10 +64,11 @@ This test evaluates if all 64 combination of DSCP bits are transparently handled * Verify using DUTPort3 telemetry that: * Drops are seen in all queues except NC1 on DUTPort3 * all queues reports non-zero transmit packets, octets. -* Verify on ATEPort3 that all flows are recived w/o DSCP modification - all 64 values are observed +* Verify on ATEPort3 that all flows are received w/o DSCP modification - all 64 values are observed * verify on ATEPort3 that: - * all recived packets with DSCP 48-63 has ECT(0) value + * all received packets with DSCP 48-63 has ECT(0) value * vast majority (almost all) packets with DSCP 0-47 has CE ECN value. + ### Sub Test #3 - NC1 congestion * Generate 16 flows of traffic form ATEPort1 and 16 flows of traffic form ATEPort2 toward ATEPort3 * each flow form ATEPort1 has distinct DSCP value from 48-63 range @@ -81,47 +82,53 @@ This test evaluates if all 64 combination of DSCP bits are transparently handled * wait 1 minutes; stop traffic generation. * Verify using DUTPort3 telemetry that: * Drops are seen in NC1 queue on DUTPort3 - * all queues but NC1 reports nzero transmit packets, octets. + * all queues but NC1 reports zero transmit packets, octets. * NC1 queue reports non-zero transmit packets, octets. -* Verify on ATEPort3 that all flows are recived w/o DSCP modification - all 16 values are observed. +* Verify on ATEPort3 that all flows are received w/o DSCP modification - all 16 values are observed. * verify on ATEPort3 that: - * all recived packets with DSCP has CE value - -## Config Parameter Coverage - - * qos/classifiers/classifier/terms/term/conditions/ipv4/config/dscp-set - * qos/classifiers/classifier/terms/term/conditions/ipv6/config/dscp-set - * qos/classifiers/classifier/terms/term/actions/config/target-group - * qos/queues/queue/config/name - * qos/forwarding-groups/forwarding-group/config/name - * qos/forwarding-groups/forwarding-group/config/output-queue - * qos/scheduler-policies/scheduler-policy/schedulers/scheduler/config/priority - * qos/scheduler-policies/scheduler-policy/schedulers/scheduler/config/sequence - * qos/scheduler-policies/scheduler-policy/schedulers/scheduler/inputs/input/config/id - * qos/scheduler-policies/scheduler-policy/schedulers/scheduler/inputs/input/config/input-type - * qos/scheduler-policies/scheduler-policy/schedulers/scheduler/inputs/input/config/queue - * qos/scheduler-policies/scheduler-policy/schedulers/scheduler/inputs/input/config/weight - * qos/queue-management-profiles/queue-management-profile/wred/uniform/config/enable-ecn - * qos/queue-management-profiles/queue-management-profile/wred/uniform/config/max-drop-probability-percent - * qos/queue-management-profiles/queue-management-profile/wred/uniform/config/max-threshold - * qos/queue-management-profiles/queue-management-profile/wred/uniform/config/min-threshold - * qos/interfaces/interface/output/queues/queue/config/name - * qos/interfaces/interface/output/queues/queue/config/queue-management-profile - * qos/interfaces/interface/output/scheduler-policy/config/name - * qos/interfaces/interface/input/classifiers/classifier/config/name - * qos/interfaces/interface/input/classifiers/classifier/config/type - -## Telemetry Parameter Coverage - - * qos/interfaces/interface/output/queues/queue/state/dropped-octets - * qos/interfaces/interface/output/queues/queue/state/dropped-pkts - * qos/interfaces/interface/output/queues/queue/state/name - * qos/interfaces/interface/output/queues/queue/state/transmit-octets - * qos/interfaces/interface/output/queues/queue/state/transmit-pkts - -## Protocol/RPC Parameter Coverage - - * NONE. + * all received packets with DSCP has CE value + +## OpenConfig Path and RPC Coverage + +The below yaml defines the OC paths intended to be covered by this test. OC paths used for test setup are not listed here. + +```yaml +paths: + ## Config Paths ## + /qos/classifiers/classifier/terms/term/conditions/ipv4/config/dscp-set: + /qos/classifiers/classifier/terms/term/conditions/ipv6/config/dscp-set: + /qos/classifiers/classifier/terms/term/actions/config/target-group: + /qos/queues/queue/config/name: + /qos/forwarding-groups/forwarding-group/config/name: + /qos/forwarding-groups/forwarding-group/config/output-queue: + /qos/scheduler-policies/scheduler-policy/schedulers/scheduler/config/priority: + /qos/scheduler-policies/scheduler-policy/schedulers/scheduler/config/sequence: + /qos/scheduler-policies/scheduler-policy/schedulers/scheduler/inputs/input/config/id: + /qos/scheduler-policies/scheduler-policy/schedulers/scheduler/inputs/input/config/input-type: + /qos/scheduler-policies/scheduler-policy/schedulers/scheduler/inputs/input/config/queue: + /qos/scheduler-policies/scheduler-policy/schedulers/scheduler/inputs/input/config/weight: + /qos/queue-management-profiles/queue-management-profile/wred/uniform/config/enable-ecn: + /qos/queue-management-profiles/queue-management-profile/wred/uniform/config/max-drop-probability-percent: + /qos/queue-management-profiles/queue-management-profile/wred/uniform/config/max-threshold: + /qos/queue-management-profiles/queue-management-profile/wred/uniform/config/min-threshold: + /qos/interfaces/interface/output/queues/queue/config/name: + /qos/interfaces/interface/output/queues/queue/config/queue-management-profile: + /qos/interfaces/interface/output/scheduler-policy/config/name: + /qos/interfaces/interface/input/classifiers/classifier/config/name: + /qos/interfaces/interface/input/classifiers/classifier/config/type: + + ## State Paths ## + /qos/interfaces/interface/output/queues/queue/state/dropped-octets: + /qos/interfaces/interface/output/queues/queue/state/dropped-pkts: + /qos/interfaces/interface/output/queues/queue/state/name: + /qos/interfaces/interface/output/queues/queue/state/transmit-octets: + /qos/interfaces/interface/output/queues/queue/state/transmit-pkts: + +rpcs: + gnmi: + gNMI.Set: + gNMI.Subscribe: +``` ## Required DUT platform diff --git a/feature/qos/ecn/otg_tests/dscp_transparency_test/dscp_transparency_test.go b/feature/qos/ecn/otg_tests/dscp_transparency_test/dscp_transparency_test.go new file mode 100644 index 00000000000..921451ad2bb --- /dev/null +++ b/feature/qos/ecn/otg_tests/dscp_transparency_test/dscp_transparency_test.go @@ -0,0 +1,860 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package dscp_transparency_test + +import ( + "encoding/json" + "fmt" + "strconv" + "strings" + "testing" + "time" + + "github.com/open-traffic-generator/snappi/gosnappi" + "github.com/openconfig/entity-naming/entname" + "github.com/openconfig/featureprofiles/internal/attrs" + "github.com/openconfig/featureprofiles/internal/deviations" + "github.com/openconfig/featureprofiles/internal/fptest" + "github.com/openconfig/featureprofiles/internal/otgutils" + "github.com/openconfig/featureprofiles/internal/qoscfg" + "github.com/openconfig/ondatra" + "github.com/openconfig/ondatra/gnmi" + "github.com/openconfig/ondatra/gnmi/oc" + "github.com/openconfig/ygot/ygot" +) + +func TestMain(m *testing.M) { + fptest.RunTests(m) +} + +const ( + ipv4 = "IPv4" + ipv6 = "IPv6" + ipv4PrefixLen = 30 + ipv6PrefixLen = 126 + subInterfaceIndex = 0 + flowFrameSize uint32 = 1_000 + trafficRunDuration = 1 * time.Minute + trafficStopWaitDuration = 30 * time.Second + dutEgressPort = "port1" +) + +var ( + dutPort1 = &attrs.Attributes{ + Name: "dutPort1", + IPv4: "192.0.2.1", + IPv6: "2001:db8::1", + IPv4Len: ipv4PrefixLen, + IPv6Len: ipv6PrefixLen, + } + + dutPort2 = &attrs.Attributes{ + Name: "dutPort2", + IPv4: "192.0.2.5", + IPv6: "2001:db8::5", + IPv4Len: ipv4PrefixLen, + IPv6Len: ipv6PrefixLen, + } + + dutPort3 = &attrs.Attributes{ + Name: "dutPort3", + IPv4: "192.0.2.9", + IPv6: "2001:db8::9", + IPv4Len: ipv4PrefixLen, + IPv6Len: ipv6PrefixLen, + } + + atePort1 = &attrs.Attributes{ + Name: "atePort1", + MAC: "02:00:01:01:01:01", + IPv4: "192.0.2.2", + IPv6: "2001:db8::2", + IPv4Len: ipv4PrefixLen, + IPv6Len: ipv6PrefixLen, + } + + atePort2 = &attrs.Attributes{ + Name: "atePort2", + MAC: "02:00:02:01:01:01", + IPv4: "192.0.2.6", + IPv6: "2001:db8::6", + IPv4Len: ipv4PrefixLen, + IPv6Len: ipv6PrefixLen, + } + + atePort3 = &attrs.Attributes{ + Name: "atePort3", + MAC: "02:00:03:01:01:01", + IPv4: "192.0.2.10", + IPv6: "2001:db8::a", + IPv4Len: ipv4PrefixLen, + IPv6Len: ipv6PrefixLen, + } + + dutPorts = map[string]*attrs.Attributes{ + "port1": dutPort1, + "port2": dutPort2, + "port3": dutPort3, + } + + atePorts = map[string]*attrs.Attributes{ + "port1": atePort1, + "port2": atePort2, + "port3": atePort3, + } + + allQueueNames = []entname.QoSQueue{ + entname.QoSNC1, + entname.QoSAF4, + entname.QoSAF3, + entname.QoSAF2, + entname.QoSAF1, + entname.QoSBE0, + entname.QoSBE1, + } + + testCases = []struct { + name string + createFlowsF func(otgConfig gosnappi.Config, protocol string, atePortSpeed int) + validateFlowsF func(t *testing.T, dut *ondatra.DUTDevice, ate *ondatra.ATEDevice, atePortSpeed int, startingCounters map[entname.QoSQueue]*queueCounters) + }{ + { + name: "TestNoCongestion", + createFlowsF: testNoCongestionCreateFlows, + validateFlowsF: testNoCongestionValidateFlows, + }, + { + name: "TestCongestion", + createFlowsF: testCongestionCreateFlows, + validateFlowsF: testCongestionValidateFlows, + }, + { + name: "TestNC1Congestion", + createFlowsF: testNC1CongestionCreateFlows, + validateFlowsF: testNC1CongestionValidateFlows, + }, + } +) + +type queueCounters struct { + droppedPackets uint64 + transmitPackets uint64 + transmitOctets uint64 +} + +func prettyPrint(i any) string { + s, _ := json.MarshalIndent(i, "", "\t") + return string(s) +} + +func getZeroIshThresholds(dutPortSpeed int) (uint64, uint64) { + // Max allowed "zero" counters -- counters that are supposed to be zero per the test but + // can have a few packets trickling about for random things; basically: a fudge factor, + // proportional to the port speed. + maxAllowedZeroPackets := uint64(5 * dutPortSpeed) + maxAllowedZeroOctets := uint64(40 * dutPortSpeed) + + return maxAllowedZeroPackets, maxAllowedZeroOctets +} + +func configureDUTQoS( + t *testing.T, + dut *ondatra.DUTDevice, +) { + dp1 := dut.Port(t, "port1") + dp2 := dut.Port(t, "port2") + dp3 := dut.Port(t, "port3") + + qosConfig := &oc.Qos{} + + if deviations.QOSQueueRequiresID(dut) { + for i, queueName := range allQueueNames { + q1 := qosConfig.GetOrCreateQueue(string(queueName)) + q1.Name = ygot.String(string(queueName)) + queueID := len(allQueueNames) - i + q1.QueueId = ygot.Uint8(uint8(queueID)) + } + } + + // Forwarding group :: queue config. + for _, queueName := range allQueueNames { + qoscfg.SetForwardingGroup( + t, + dut, + qosConfig, + fmt.Sprintf("target-group-%s", string(queueName)), + string(queueName), + ) + } + + // Queue management profile. + queueManagementProfile := qosConfig.GetOrCreateQueueManagementProfile("queueManagementProfile") + wredUniformProfile := queueManagementProfile.GetOrCreateWred().GetOrCreateUniform() + wredUniformProfile.SetEnableEcn(true) + wredUniformProfile.SetMinThreshold(uint64(80_000)) + wredUniformProfile.SetMaxThreshold(uint64(3_000_000)) + wredUniformProfile.SetMaxDropProbabilityPercent(uint8(100)) + + // Classifier config. + classifiers := []struct { + name string + termID string + targetGroup string + dscpSet []uint8 + }{ + { + name: "dscp_based_classifier_", + termID: "0", + targetGroup: "target-group-BE1", + dscpSet: []uint8{0, 1, 2, 3}, + }, + { + name: "dscp_based_classifier_", + termID: "1", + targetGroup: "target-group-BE0", + dscpSet: []uint8{4, 5, 6, 7}, + }, + { + name: "dscp_based_classifier_", + termID: "2", + targetGroup: "target-group-AF1", + dscpSet: []uint8{8, 9, 10, 11, 12, 13, 14, 15}, + }, + { + name: "dscp_based_classifier_", + termID: "3", + targetGroup: "target-group-AF2", + dscpSet: []uint8{16, 17, 18, 19, 20, 21, 22, 23}, + }, + { + name: "dscp_based_classifier_", + termID: "4", + targetGroup: "target-group-AF3", + dscpSet: []uint8{24, 25, 26, 27, 28, 29, 30, 31}, + }, + { + name: "dscp_based_classifier_", + termID: "5", + targetGroup: "target-group-AF4", + dscpSet: []uint8{32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47}, + }, + { + name: "dscp_based_classifier_", + termID: "6", + targetGroup: "target-group-NC1", + dscpSet: []uint8{48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63}, + }, + } + + for _, tc := range classifiers { + for _, protocol := range []oc.E_Qos_Classifier_Type{ + oc.Qos_Classifier_Type_IPV4, + oc.Qos_Classifier_Type_IPV6, + } { + protocolString := "ipv4" + if protocol == oc.Qos_Classifier_Type_IPV6 { + protocolString = "ipv6" + } + + name := fmt.Sprintf("%s%s", tc.name, protocolString) + classifier := qosConfig.GetOrCreateClassifier(name) + classifier.SetName(name) + classifier.SetType(protocol) + + term, err := classifier.NewTerm(tc.termID) + if err != nil { + t.Fatalf("Failed to create classifier.NewTerm(): %v", err) + } + term.SetId(tc.termID) + action := term.GetOrCreateActions() + action.SetTargetGroup(tc.targetGroup) + condition := term.GetOrCreateConditions() + + switch protocol { + case oc.Qos_Classifier_Type_IPV4: + condition.GetOrCreateIpv4().SetDscpSet(tc.dscpSet) + case oc.Qos_Classifier_Type_IPV6: + condition.GetOrCreateIpv6().SetDscpSet(tc.dscpSet) + } + } + } + + // Ingress classifier config. + for _, inputInterfaceName := range []string{dp2.Name(), dp3.Name()} { + for _, protocol := range []oc.E_Input_Classifier_Type{ + oc.Input_Classifier_Type_IPV4, + oc.Input_Classifier_Type_IPV6, + } { + protocolString := "ipv4" + if protocol == oc.Input_Classifier_Type_IPV6 { + protocolString = "ipv6" + } + + qoscfg.SetInputClassifier( + t, + dut, + qosConfig, + inputInterfaceName, + protocol, + fmt.Sprintf("dscp_based_classifier_%s", protocolString), + ) + } + } + + // Egress scheduler config. + schedulerPolicy := qosConfig.GetOrCreateSchedulerPolicy("schedulerPolicy") + strictScheduler := schedulerPolicy.GetOrCreateScheduler(uint32(0)) + strictScheduler.SetPriority(oc.Scheduler_Priority_STRICT) + strictInput := strictScheduler.GetOrCreateInput(string(entname.QoSNC1)) + strictInput.SetInputType(oc.Input_InputType_QUEUE) + strictInput.SetQueue(string(entname.QoSNC1)) + + wrrScheduler := schedulerPolicy.GetOrCreateScheduler(uint32(1)) + + // WRR queues, equally weighted. + for _, queueName := range allQueueNames { + if queueName == entname.QoSNC1 { + // Skipping NC1 since it's in its own strict scheduler. + continue + } + input := wrrScheduler.GetOrCreateInput(string(queueName)) + input.SetInputType(oc.Input_InputType_QUEUE) + input.SetQueue(string(queueName)) + input.SetWeight(uint64(10)) + } + + // Egress policy config. + for _, queueName := range allQueueNames { + qosInterface := qosConfig.GetOrCreateInterface(dp1.Name()) + qosInterface.GetOrCreateInterfaceRef().Interface = ygot.String(dp1.Name()) + output := qosInterface.GetOrCreateOutput() + outputSchedulerPolicy := output.GetOrCreateSchedulerPolicy() + outputSchedulerPolicy.SetName("schedulerPolicy") + queue := output.GetOrCreateQueue(string(queueName)) + queue.SetQueueManagementProfile("queueManagementProfile") + if deviations.QOSBufferAllocationConfigRequired(dut) { + bufferAllocationProfile := qosConfig.GetOrCreateBufferAllocationProfile("bufferAllocationProfile") + bufferAllocationQueue := bufferAllocationProfile.GetOrCreateQueue(string(queueName)) + bufferAllocationQueue.SetStaticSharedBufferLimit(uint32(268435456)) + output.SetBufferAllocationProfile("bufferAllocationProfile") + } + } + + gnmi.Replace(t, dut, gnmi.OC().Qos().Config(), qosConfig) +} + +func configureDUTPort( + t *testing.T, + dut *ondatra.DUTDevice, + port *ondatra.Port, + portAttrs *attrs.Attributes, +) { + gnmiOCRoot := gnmi.OC() + + gnmi.Replace( + t, + dut, + gnmiOCRoot.Interface(port.Name()).Config(), + portAttrs.NewOCInterface(port.Name(), dut), + ) + + if deviations.ExplicitInterfaceInDefaultVRF(dut) { + fptest.AssignToNetworkInstance( + t, dut, port.Name(), deviations.DefaultNetworkInstance(dut), subInterfaceIndex, + ) + } +} + +func configureDUT(t *testing.T, dut *ondatra.DUTDevice) { + for portName, portAttrs := range dutPorts { + port := dut.Port(t, portName) + configureDUTPort(t, dut, port, portAttrs) + } + configureDUTQoS(t, dut) +} + +func configureATE(t *testing.T, ate *ondatra.ATEDevice) gosnappi.Config { + otgConfig := gosnappi.NewConfig() + for portName, portAttrs := range atePorts { + port := ate.Port(t, portName) + dutPort := dutPorts[portName] + portAttrs.AddToOTG(otgConfig, port, dutPort) + } + return otgConfig +} + +func trafficClassFieldsToDecimal(dscpValue, ecnValue int) uint32 { + dscpByte := byte(dscpValue) + ecnByte := byte(ecnValue) + tosStr := fmt.Sprintf("%06b%02b", dscpByte, ecnByte) + tosDec, _ := strconv.ParseInt(tosStr, 2, 64) + return uint32(tosDec) +} + +func createFlow(otgConfig gosnappi.Config, protocol string, targetTotalFlowRate uint64, dscpValue int, sourceAtePort *attrs.Attributes) gosnappi.Flow { + flow := otgConfig.Flows().Add().SetName(fmt.Sprintf("dscp-%d-%s", dscpValue, sourceAtePort.Name)) + flow.Metrics().SetEnable(true) + + // Flows go from ate port 2 -> dut -> ate port 1 and + // from ate port 3 -> dut -> ate port 1 to be consistent with the previous test which + // can be run with only two ports instead of three. + flow.TxRx().Device(). + SetTxNames([]string{fmt.Sprintf("%s.%s", sourceAtePort.Name, protocol)}). + SetRxNames([]string{fmt.Sprintf("%s.%s", atePort1.Name, protocol)}) + flow.EgressPacket().Add().Ethernet() + + ethHeader := flow.Packet().Add().Ethernet() + ethHeader.Src().SetValue(sourceAtePort.MAC) + + switch protocol { + case ipv4: + v4 := flow.Packet().Add().Ipv4() + v4.Src().SetValue(sourceAtePort.IPv4) + v4.Dst().SetValue(atePort1.IPv4) + v4.Priority().Raw().SetValue(trafficClassFieldsToDecimal(dscpValue, 2)) + + tracking := flow.EgressPacket().Add().Ipv4() + tracking.Priority().Raw().MetricTags().Add().SetName(fmt.Sprintf("dst-dscp-%d-%s", dscpValue, sourceAtePort.Name)).SetOffset(0).SetLength(6) + tracking.Priority().Raw().MetricTags().Add().SetName(fmt.Sprintf("dst-ecn-%d-%s", dscpValue, sourceAtePort.Name)).SetOffset(6).SetLength(2) + case ipv6: + v6 := flow.Packet().Add().Ipv6() + v6.Src().SetValue(sourceAtePort.IPv6) + v6.Dst().SetValue(atePort1.IPv6) + v6.TrafficClass().SetValue(trafficClassFieldsToDecimal(dscpValue, 2)) + + tracking := flow.EgressPacket().Add().Ipv6() + tracking.TrafficClass().MetricTags().Add().SetName(fmt.Sprintf("dst-dscp-%d-%s", dscpValue, sourceAtePort.Name)).SetOffset(0).SetLength(6) + tracking.TrafficClass().MetricTags().Add().SetName(fmt.Sprintf("dst-ecn-%d-%s", dscpValue, sourceAtePort.Name)).SetOffset(6).SetLength(2) + } + + flow.Size().SetFixed(flowFrameSize) + flow.Rate().SetKbps(targetTotalFlowRate) + return flow +} + +func getQueueCounters(t *testing.T, dut *ondatra.DUTDevice) map[entname.QoSQueue]*queueCounters { + t.Helper() + ep := dut.Port(t, dutEgressPort) + qc := map[entname.QoSQueue]*queueCounters{} + + for _, egressQueueName := range allQueueNames { + qc[egressQueueName] = &queueCounters{ + droppedPackets: gnmi.Get(t, dut, gnmi.OC().Qos().Interface(ep.Name()).Output().Queue(string(egressQueueName)).DroppedPkts().State()), + transmitPackets: gnmi.Get(t, dut, gnmi.OC().Qos().Interface(ep.Name()).Output().Queue(string(egressQueueName)).TransmitPkts().State()), + transmitOctets: gnmi.Get(t, dut, gnmi.OC().Qos().Interface(ep.Name()).Output().Queue(string(egressQueueName)).TransmitOctets().State()), + } + } + + return qc +} + +func logAndGetResolvedQueueCounters(t *testing.T, egressQueueName entname.QoSQueue, egressQueueStartingCounters, egressQueueEndingCounters *queueCounters) (uint64, uint64, uint64) { + queueDroppedPackets := egressQueueEndingCounters.droppedPackets - egressQueueStartingCounters.droppedPackets + queueTransmitPackets := egressQueueEndingCounters.transmitPackets - egressQueueStartingCounters.transmitPackets + queueTransmitOctets := egressQueueEndingCounters.transmitOctets - egressQueueStartingCounters.transmitOctets + + t.Logf( + "\nqueue %q pre-test telemetry data:\n\tdropped %d packets\n\ttransmit %d packets\n\ttransmit %d octets\n", + egressQueueName, + egressQueueStartingCounters.droppedPackets, + egressQueueStartingCounters.transmitPackets, + egressQueueStartingCounters.transmitOctets, + ) + + t.Logf( + "\nqueue %q post-test telemetry data:\n\tdropped %d packets\n\ttransmit %d packets\n\ttransmit %d octets\n", + egressQueueName, + egressQueueEndingCounters.droppedPackets, + egressQueueEndingCounters.transmitPackets, + egressQueueEndingCounters.transmitOctets, + ) + + t.Logf( + "\nqueue %q resolved telemetry data:\n\tdropped %d packets\n\ttransmit %d packets\n\ttransmit %d octets\n", + egressQueueName, + queueDroppedPackets, + queueTransmitPackets, + queueTransmitOctets, + ) + + return queueDroppedPackets, queueTransmitPackets, queueTransmitOctets +} + +func testNoCongestionCreateFlows(otgConfig gosnappi.Config, protocol string, dutPortSpeed int) { + // Target flow rate is 60% of the ate port speed spread across 64 flows (do this in kbps so we + // still work w/ round numbers on 1g interfaces). + portSpeedInKbps := dutPortSpeed * 1_000_000 + portSpeedSixtyPercent := float32(portSpeedInKbps) * float32(0.6) + targetTotalFlowRate := uint64(portSpeedSixtyPercent / 64) + + for dscpValue := 0; dscpValue < 64; dscpValue++ { + finalTargetFlowRate := targetTotalFlowRate + if dscpValue <= 7 { + // There are fewer flows in the BE0/BE1 queues so increase those flows to have + // a similar amount of traffic so wred handles things consistently. + finalTargetFlowRate = targetTotalFlowRate * 2 + } + + createFlow( + otgConfig, + protocol, + finalTargetFlowRate, + dscpValue, + atePort2, + ) + } +} + +func testNoCongestionValidateFlows(t *testing.T, dut *ondatra.DUTDevice, ate *ondatra.ATEDevice, dutPortSpeed int, startingCounters map[entname.QoSQueue]*queueCounters) { + maxAllowedZeroPackets, _ := getZeroIshThresholds(dutPortSpeed) + endingCounters := getQueueCounters(t, dut) + + for egressQueueName, egressQueueEndingCounters := range endingCounters { + egressQueueStartingCounters := startingCounters[egressQueueName] + + queueDroppedPackets, queueTransmitPackets, queueTransmitOctets := logAndGetResolvedQueueCounters( + t, + egressQueueName, + egressQueueStartingCounters, + egressQueueEndingCounters, + ) + + if queueDroppedPackets > maxAllowedZeroPackets { + t.Errorf("queue %s indicates %d dropped packets but should show zero or near-zero", egressQueueName, queueDroppedPackets) + } + + if queueTransmitPackets == 0 { + t.Errorf("queue %s indicates 0 transmit packets but should be non-zero", egressQueueName) + } + + if queueTransmitOctets == 0 { + t.Errorf("queue %s indicates 0 transmit octets but should be non-zero", egressQueueName) + } + } + + for dscpValue := 0; dscpValue < 64; dscpValue++ { + etPath := gnmi.OTG().Flow(fmt.Sprintf("dscp-%d-%s", dscpValue, atePort2.Name)).TaggedMetricAny() + ets := gnmi.GetAll(t, ate.OTG(), etPath.State()) + + dscpAsHex := fmt.Sprintf("0x%02x", dscpValue) + + if len(ets) != 1 { + t.Logf("got %d flows, but expected one, this probably indicates that the flow has"+ + " some packets tagged 01 and some tagged 11 (congestion experienced) -- "+ + "this should not happen in this test case, will continue validation...", len(ets)) + } + + for _, et := range ets { + if len(et.Tags) != 2 { + t.Errorf("expected two metric tags (dscp/ecn) but got %d", len(et.Tags)) + } + + for _, tag := range et.Tags { + tagName := tag.GetTagName() + valueAsHex := tag.GetTagValue().GetValueAsHex() + t.Logf("flow with dscp value %d, tag name %q, got value %s", dscpValue, tagName, valueAsHex) + if strings.Contains(tagName, "dscp") { + if valueAsHex != dscpAsHex { + t.Errorf("expected dscp bit to be %x, but got %s", dscpAsHex, valueAsHex) + } + } else { + // ECN should be 10 -- ecn capable but no congestion experienced. + if valueAsHex != "0x2" { + t.Errorf("expected ecn bit to be 0x2, but got %s", valueAsHex) + } + } + } + } + } +} + +func testCongestionCreateFlows(otgConfig gosnappi.Config, protocol string, dutPortSpeed int) { + // Target flow rate is 60% of the ate port speed spread across 64 flows (do this in kbps so we + // still work w/ round numbers on 1g interfaces). + portSpeedInKbps := dutPortSpeed * 1_000_000 + portSpeedSixtyPercent := float32(portSpeedInKbps) * float32(0.6) + targetTotalFlowRate := uint64(portSpeedSixtyPercent / 64) + + for _, sourceAtePort := range []*attrs.Attributes{atePort2, atePort3} { + for dscpValue := 0; dscpValue < 64; dscpValue++ { + finalTargetFlowRate := targetTotalFlowRate + if dscpValue <= 7 { + // There are fewer flows in the be0/be1 queues so increase those flows to have + // a similar amount of traffic so wred handles things consistently. + finalTargetFlowRate = targetTotalFlowRate * 2 + } + + createFlow( + otgConfig, + protocol, + finalTargetFlowRate, + dscpValue, + sourceAtePort, + ) + } + } +} + +func testCongestionValidateFlows(t *testing.T, dut *ondatra.DUTDevice, ate *ondatra.ATEDevice, dutPortSpeed int, startingCounters map[entname.QoSQueue]*queueCounters) { + maxAllowedZeroPackets, _ := getZeroIshThresholds(dutPortSpeed) + endingCounters := getQueueCounters(t, dut) + + for egressQueueName, egressQueueEndingCounters := range endingCounters { + egressQueueStartingCounters := startingCounters[egressQueueName] + + queueDroppedPackets, queueTransmitPackets, queueTransmitOctets := logAndGetResolvedQueueCounters( + t, + egressQueueName, + egressQueueStartingCounters, + egressQueueEndingCounters, + ) + + if queueTransmitPackets == 0 { + t.Errorf("queue %s indicates 0 transmit packets but should be non-zero", egressQueueName) + } + + if queueTransmitOctets == 0 { + t.Errorf("queue %s indicates 0 transmit octets but should be non-zero", egressQueueName) + } + + if egressQueueName == entname.QoSNC1 { + // NC1 should have no drops + if queueDroppedPackets > maxAllowedZeroPackets { + t.Errorf("queue %s indicates %d dropped packets but should show zero or near-zero", egressQueueName, queueDroppedPackets) + } + } else { + // Any other queue should have at least some drops. + if queueDroppedPackets == 0 { + t.Errorf( + "queue %s indicates %d dropped packets but should show some non-zero value as there is congestion in this case", + egressQueueName, queueDroppedPackets) + } + } + } + + var congestedFlowCount int + + // These should have the majority of flows have ecn set. + for _, sourceAtePort := range []*attrs.Attributes{atePort2, atePort3} { + for dscpValue := 0; dscpValue < 48; dscpValue++ { + etPath := gnmi.OTG().Flow(fmt.Sprintf("dscp-%d-%s", dscpValue, sourceAtePort.Name)).TaggedMetricAny() + ets := gnmi.GetAll(t, ate.OTG(), etPath.State()) + + dscpAsHex := fmt.Sprintf("0x%02x", dscpValue) + + if len(ets) != 2 { + // We should always have two sets of metric tags for flows in this test case -- the + // initial packets will not be marked as congestion experienced of course, but all + // the flows should eventually be marked as such. if we get a flow w/ only 1 path + // we know this flow had no congestion. + t.Logf("expected two sets of tags for flow but got %d\n\t%s", len(ets), prettyPrint(ets)) + continue + } + + // We only care about checking the second set of tags as these are the ones that should + // have been marked w/ congestion experienced. + if len(ets[1].Tags) != 2 { + t.Errorf("expected two metric tags (dscp/ecn) but got %d", len(ets[1].Tags)) + } + + for _, tag := range ets[1].Tags { + tagName := tag.GetTagName() + valueAsHex := tag.GetTagValue().GetValueAsHex() + t.Logf("flow with dscp value %d, tag name %q, got value %s", dscpValue, tagName, valueAsHex) + if strings.Contains(tagName, "dscp") { + if valueAsHex != dscpAsHex { + t.Errorf("expected dscp bit to be %x, but got %s", dscpAsHex, valueAsHex) + } + } else if valueAsHex != "0x2" { + // Not dscp tag, and not 0x2, meaning ecn tag and congestion experienced. + congestedFlowCount++ + } + } + } + } + + if float32(congestedFlowCount/96) < 0.9 { + t.Errorf("less than 90 percent of flows (not in nc1 queue) had congestion experienced") + } + + // These flows should all have no ecn set. + for _, sourceAtePort := range []*attrs.Attributes{atePort2, atePort3} { + for dscpValue := 48; dscpValue < 64; dscpValue++ { + etPath := gnmi.OTG().Flow(fmt.Sprintf("dscp-%d-%s", dscpValue, sourceAtePort.Name)).TaggedMetricAny() + ets := gnmi.GetAll(t, ate.OTG(), etPath.State()) + + dscpAsHex := fmt.Sprintf("0x%02x", dscpValue) + + for _, et := range ets { + if len(et.Tags) != 2 { + t.Errorf("expected two metric tags (dscp/ecn) but got %d", len(et.Tags)) + } + + for _, tag := range et.Tags { + tagName := tag.GetTagName() + valueAsHex := tag.GetTagValue().GetValueAsHex() + t.Logf("flow with dscp value %d, tag name %q, got value %s", dscpValue, tagName, valueAsHex) + if strings.Contains(tagName, "dscp") { + if valueAsHex != dscpAsHex { + t.Errorf("expected dscp bit to be %x, but got %s", dscpAsHex, valueAsHex) + } + } else { + if valueAsHex != "0x2" { + t.Errorf("expected ecn bit for dscp value %d to be 0x2, but got %s", dscpValue, valueAsHex) + } + } + } + } + } + } +} + +func testNC1CongestionCreateFlows(otgConfig gosnappi.Config, protocol string, dutPortSpeed int) { + // Target flow rate is 60% of the ate port speed spread across 16 flows (do this in kbps so we + // still work w/ round numbers on 1g interfaces). + portSpeedInKbps := dutPortSpeed * 1_000_000 + portSpeedSixtyPercent := float32(portSpeedInKbps) * float32(0.6) + targetTotalFlowRate := uint64(portSpeedSixtyPercent / 16) + + for _, sourceAtePort := range []*attrs.Attributes{atePort2, atePort3} { + for dscpValue := 48; dscpValue < 64; dscpValue++ { + createFlow( + otgConfig, + protocol, + targetTotalFlowRate, + dscpValue, + sourceAtePort, + ) + } + } +} + +func testNC1CongestionValidateFlows(t *testing.T, dut *ondatra.DUTDevice, ate *ondatra.ATEDevice, dutPortSpeed int, startingCounters map[entname.QoSQueue]*queueCounters) { + maxAllowedZeroPackets, maxAllowedZeroOctets := getZeroIshThresholds(dutPortSpeed) + endingCounters := getQueueCounters(t, dut) + + for egressQueueName, egressQueueEndingCounters := range endingCounters { + egressQueueStartingCounters := startingCounters[egressQueueName] + + queueDroppedPackets, queueTransmitPackets, queueTransmitOctets := logAndGetResolvedQueueCounters( + t, + egressQueueName, + egressQueueStartingCounters, + egressQueueEndingCounters, + ) + + if egressQueueName == entname.QoSNC1 { + if queueTransmitPackets == 0 { + t.Errorf("queue %s indicates 0 transmit packets but should be non-zero", egressQueueName) + } + + if queueTransmitOctets == 0 { + t.Errorf("queue %s indicates 0 transmit octets but should be non-zero", egressQueueName) + } + + if queueDroppedPackets == 0 { + t.Errorf("queue %s indicates %d dropped packets but should show non-zero", egressQueueName, queueDroppedPackets) + } + } else { + if queueTransmitPackets > maxAllowedZeroPackets { + t.Errorf("queue %s indicates non zero transmit packets but should be zero or near zero", egressQueueName) + } + + if queueTransmitOctets > maxAllowedZeroOctets { + t.Errorf("queue %s indicates non zero transmit octets but should be zero or near zero", egressQueueName) + } + } + } + + var congestedFlowCount int + + for _, sourceAtePort := range []*attrs.Attributes{atePort2, atePort3} { + for dscpValue := 48; dscpValue < 64; dscpValue++ { + etPath := gnmi.OTG().Flow(fmt.Sprintf("dscp-%d-%s", dscpValue, sourceAtePort.Name)).TaggedMetricAny() + ets := gnmi.GetAll(t, ate.OTG(), etPath.State()) + + dscpAsHex := fmt.Sprintf("0x%02x", dscpValue) + + if len(ets) != 2 { + // Similar to the congestion (non NC1) test, we expect two sets of metrics -- one for + // the start of the flow where ecn is not yet set, and the second for when it is. + t.Logf("expected two sets of tags for flow but got %d\n\t%s", len(ets), prettyPrint(ets)) + continue + } + + if len(ets[1].Tags) != 2 { + t.Errorf("expected two metric tags (dscp/ecn) but got %d", len(ets[1].Tags)) + } + + for _, tag := range ets[1].Tags { + tagName := tag.GetTagName() + valueAsHex := tag.GetTagValue().GetValueAsHex() + t.Logf("flow with dscp value %d, tag name %q, got value %s", dscpValue, tagName, valueAsHex) + if strings.Contains(tagName, "dscp") { + if valueAsHex != dscpAsHex { + t.Errorf("expected dscp bit to be %x, but got %s", dscpAsHex, valueAsHex) + } + } else if valueAsHex != "0x2" { + // Not dscp tag, and not 0x2, meaning ecn tag and congestion experienced. + congestedFlowCount++ + } + } + } + } + + if float32(congestedFlowCount/32) < 0.9 { + t.Errorf("less than 90 percent of flows (in nc1 queue) had congestion experienced") + } +} + +func TestDSCPTransparency(t *testing.T) { + dut := ondatra.DUT(t, "dut") + ate := ondatra.ATE(t, "ate") + otg := ate.OTG() + + configureDUT(t, dut) + + otgConfig := configureATE(t, ate) + + dutPortSpeed := dut.Ports()[0].Speed() + if dutPortSpeed == 0 { + t.Log("dut port speed was unset, assuming 100G.") + dutPortSpeed = 100 + } + + for _, testCase := range testCases { + for _, flowProto := range []string{ipv4, ipv6} { + t.Run(fmt.Sprintf("%s-%s", testCase.name, flowProto), func(t *testing.T) { + otgConfig.Flows().Clear() + testCase.createFlowsF(otgConfig, flowProto, int(dutPortSpeed)) + + otg.PushConfig(t, otgConfig) + otg.StartProtocols(t) + otgutils.WaitForARP(t, otg, otgConfig, flowProto) + + // Get QoS egress packet counters before the traffic. + startingCounters := getQueueCounters(t, dut) + + otg.StartTraffic(t) + time.Sleep(trafficRunDuration) + otg.StopTraffic(t) + time.Sleep(trafficStopWaitDuration) + + testCase.validateFlowsF(t, dut, ate, int(dutPortSpeed), startingCounters) + otg.StopProtocols(t) + }) + } + } +} diff --git a/feature/qos/ecn/otg_tests/dscp_transparency_test/metadata.textproto b/feature/qos/ecn/otg_tests/dscp_transparency_test/metadata.textproto new file mode 100644 index 00000000000..508963f8fb2 --- /dev/null +++ b/feature/qos/ecn/otg_tests/dscp_transparency_test/metadata.textproto @@ -0,0 +1,18 @@ +# proto-file: github.com/openconfig/featureprofiles/proto/metadata.proto +# proto-message: Metadata + +uuid: "61af8f04-c537-499e-9ac9-dbadccb677a3" +plan_id: "DP-1.17" +description: "DSCP Transparency with ECN" +testbed: TESTBED_DUT_ATE_4LINKS +platform_exceptions: { + platform: { + vendor: NOKIA + } + deviations: { + explicit_interface_in_default_vrf: true + interface_enabled: true + qos_queue_requires_id: true + qos_buffer_allocation_config_required: true + } +} diff --git a/testregistry.textproto b/testregistry.textproto index e40c1f31a9b..6b6f5715a7b 100644 --- a/testregistry.textproto +++ b/testregistry.textproto @@ -219,8 +219,8 @@ test: { } test: { id: "DP-1.14" - description: "DSCP transperency with ECN" - readme: "https://github.com/openconfig/featureprofiles/blob/main/feature/qos/ecn/otg_tests/DSCP-transparency/README.md" + description: "QoS basic test" + readme: "https://github.com/openconfig/featureprofiles/blob/main/feature/qos/otg_tests/qos_basic_test/README.md" exec: " " } test: { @@ -235,6 +235,12 @@ test: { readme: "https://github.com/openconfig/featureprofiles/blob/main/feature/qos/otg_tests/ingress_traffic_classification_and_rewrite_test/README.md" exec: " " } +test: { + id: "DP-1.17" + description: "DSCP transparency with ECN" + readme: "https://github.com/openconfig/featureprofiles/blob/main/feature/qos/ecn/otg_tests/dscp_transparency_test/README.md" + exec: " " +} test: { id: "DP-1.18" description: "Flow matching using ACL and to Port Mirror/Redirect"