diff --git a/feature/qos/ate_tests/bursty_traffic_test/bursty_traffic_test.go b/feature/qos/ate_tests/bursty_traffic_test/bursty_traffic_test.go index c7700e41eb0..1aaa59436db 100644 --- a/feature/qos/ate_tests/bursty_traffic_test/bursty_traffic_test.go +++ b/feature/qos/ate_tests/bursty_traffic_test/bursty_traffic_test.go @@ -423,8 +423,10 @@ func TestBurstyTraffic(t *testing.T) { dutOctetCounterDiff := counters["dutQosOctetsAfterTraffic"][data.queue] - counters["dutQosOctetsBeforeTraffic"][data.queue] ateOctetCounterDiff := counters["ateInPkts"][data.queue] * uint64(data.frameSize) t.Logf("Queue %q: ateOctetCounterDiff: %v dutOctetCounterDiff: %v", data.queue, ateOctetCounterDiff, dutOctetCounterDiff) - if dutOctetCounterDiff < ateOctetCounterDiff { - t.Errorf("Get dutOctetCounterDiff for queue %q: got %v, want >= %v", data.queue, dutOctetCounterDiff, ateOctetCounterDiff) + if !deviations.QOSOctets(dut) { + if dutOctetCounterDiff < ateOctetCounterDiff { + t.Errorf("Get dutOctetCounterDiff for queue %q: got %v, want >= %v", data.queue, dutOctetCounterDiff, ateOctetCounterDiff) + } } if !deviations.QOSDroppedOctets(dut) { diff --git a/feature/qos/ate_tests/bursty_traffic_test/metadata.textproto b/feature/qos/ate_tests/bursty_traffic_test/metadata.textproto index 486e24dc7e4..decad5823f4 100644 --- a/feature/qos/ate_tests/bursty_traffic_test/metadata.textproto +++ b/feature/qos/ate_tests/bursty_traffic_test/metadata.textproto @@ -37,5 +37,6 @@ platform_exceptions: { } deviations: { interface_enabled: true + qos_octets: true } } diff --git a/feature/qos/ate_tests/mixed_sp_wrr_traffic_test/metadata.textproto b/feature/qos/ate_tests/mixed_sp_wrr_traffic_test/metadata.textproto index 1ae7f0f6a00..8cb261e51c8 100644 --- a/feature/qos/ate_tests/mixed_sp_wrr_traffic_test/metadata.textproto +++ b/feature/qos/ate_tests/mixed_sp_wrr_traffic_test/metadata.textproto @@ -39,5 +39,6 @@ platform_exceptions: { deviations: { dequeue_delete_not_counted_as_drops: true interface_enabled: true + qos_octets: true } } diff --git a/feature/qos/ate_tests/mixed_sp_wrr_traffic_test/mixed_sp_wrr_traffic_test.go b/feature/qos/ate_tests/mixed_sp_wrr_traffic_test/mixed_sp_wrr_traffic_test.go index 1d616ea0505..5712385a6e4 100644 --- a/feature/qos/ate_tests/mixed_sp_wrr_traffic_test/mixed_sp_wrr_traffic_test.go +++ b/feature/qos/ate_tests/mixed_sp_wrr_traffic_test/mixed_sp_wrr_traffic_test.go @@ -594,8 +594,10 @@ func TestMixedSPWrrTraffic(t *testing.T) { dutOctetCounterDiff := counters["dutQosOctetsAfterTraffic"][data.queue] - counters["dutQosOctetsBeforeTraffic"][data.queue] ateOctetCounterDiff := counters["ateInPkts"][data.queue] * uint64(data.frameSize) t.Logf("Queue %q: ateOctetCounterDiff: %v dutOctetCounterDiff: %v", data.queue, ateOctetCounterDiff, dutOctetCounterDiff) - if dutOctetCounterDiff < ateOctetCounterDiff { - t.Errorf("Get dutOctetCounterDiff for queue %q: got %v, want >= %v", data.queue, dutOctetCounterDiff, ateOctetCounterDiff) + if !deviations.QOSOctets(dut) { + if dutOctetCounterDiff < ateOctetCounterDiff { + t.Errorf("Get dutOctetCounterDiff for queue %q: got %v, want >= %v", data.queue, dutOctetCounterDiff, ateOctetCounterDiff) + } } if !deviations.QOSDroppedOctets(dut) { diff --git a/feature/qos/ate_tests/qos_basic_test/metadata.textproto b/feature/qos/ate_tests/qos_basic_test/metadata.textproto index 1a550acad68..50aa355399f 100644 --- a/feature/qos/ate_tests/qos_basic_test/metadata.textproto +++ b/feature/qos/ate_tests/qos_basic_test/metadata.textproto @@ -38,5 +38,6 @@ platform_exceptions: { } deviations: { interface_enabled: true + qos_octets: true } } diff --git a/feature/qos/ate_tests/qos_basic_test/qos_basic_test.go b/feature/qos/ate_tests/qos_basic_test/qos_basic_test.go index ecfe195a71e..f2d3b3fd48e 100644 --- a/feature/qos/ate_tests/qos_basic_test/qos_basic_test.go +++ b/feature/qos/ate_tests/qos_basic_test/qos_basic_test.go @@ -449,8 +449,10 @@ func TestBasicConfigWithTraffic(t *testing.T) { dutOctetCounterDiff := counters["dutQosOctetsAfterTraffic"][data.queue] - counters["dutQosOctetsBeforeTraffic"][data.queue] ateOctetCounterDiff := counters["ateInPkts"][data.queue] * uint64(data.frameSize) t.Logf("Queue %q: ateOctetCounterDiff: %v dutOctetCounterDiff: %v", data.queue, ateOctetCounterDiff, dutOctetCounterDiff) - if dutOctetCounterDiff < ateOctetCounterDiff { - t.Errorf("Get dutOctetCounterDiff for queue %q: got %v, want >= %v", data.queue, dutOctetCounterDiff, ateOctetCounterDiff) + if !deviations.QOSOctets(dut) { + if dutOctetCounterDiff < ateOctetCounterDiff { + t.Errorf("Get dutOctetCounterDiff for queue %q: got %v, want >= %v", data.queue, dutOctetCounterDiff, ateOctetCounterDiff) + } } if !deviations.QOSDroppedOctets(dut) { diff --git a/feature/qos/ate_tests/qos_output_queue_counters_test/metadata.textproto b/feature/qos/ate_tests/qos_output_queue_counters_test/metadata.textproto index c0e43e38aa7..dceb9fac219 100644 --- a/feature/qos/ate_tests/qos_output_queue_counters_test/metadata.textproto +++ b/feature/qos/ate_tests/qos_output_queue_counters_test/metadata.textproto @@ -38,5 +38,6 @@ platform_exceptions: { } deviations: { interface_enabled: true + qos_octets: true } } diff --git a/feature/qos/ate_tests/qos_output_queue_counters_test/qos_output_queue_counters_test.go b/feature/qos/ate_tests/qos_output_queue_counters_test/qos_output_queue_counters_test.go index 4609e0dfbeb..dbf216460b8 100644 --- a/feature/qos/ate_tests/qos_output_queue_counters_test/qos_output_queue_counters_test.go +++ b/feature/qos/ate_tests/qos_output_queue_counters_test/qos_output_queue_counters_test.go @@ -227,8 +227,10 @@ func TestQoSCounters(t *testing.T) { dutOctetCounterDiff := counters["dutQosOctetsAfterTraffic"][data.queue] - counters["dutQosOctetsBeforeTraffic"][data.queue] ateOctetCounterDiff := counters["ateInPkts"][data.queue] * uint64(data.frameSize) t.Logf("Queue %q: ateOctetCounterDiff: %v dutOctetCounterDiff: %v", data.queue, ateOctetCounterDiff, dutOctetCounterDiff) - if dutOctetCounterDiff < ateOctetCounterDiff { - t.Errorf("Get dutOctetCounterDiff for queue %q: got %v, want >= %v", data.queue, dutOctetCounterDiff, ateOctetCounterDiff) + if !deviations.QOSOctets(dut) { + if dutOctetCounterDiff < ateOctetCounterDiff { + t.Errorf("Get dutOctetCounterDiff for queue %q: got %v, want >= %v", data.queue, dutOctetCounterDiff, ateOctetCounterDiff) + } } if !deviations.QOSDroppedOctets(dut) { diff --git a/feature/qos/otg_tests/bursty_traffic_test/bursty_traffic_test.go b/feature/qos/otg_tests/bursty_traffic_test/bursty_traffic_test.go index bda8374d875..44caa4cf1f6 100644 --- a/feature/qos/otg_tests/bursty_traffic_test/bursty_traffic_test.go +++ b/feature/qos/otg_tests/bursty_traffic_test/bursty_traffic_test.go @@ -461,8 +461,10 @@ func TestBurstyTraffic(t *testing.T) { dutOctetCounterDiff := counters["dutQosOctetsAfterTraffic"][data.queue] - counters["dutQosOctetsBeforeTraffic"][data.queue] ateOctetCounterDiff := counters["ateInPkts"][data.queue] * uint64(data.frameSize) t.Logf("Queue %q: ateOctetCounterDiff: %v dutOctetCounterDiff: %v", data.queue, ateOctetCounterDiff, dutOctetCounterDiff) - if dutOctetCounterDiff < ateOctetCounterDiff { - t.Errorf("Get dutOctetCounterDiff for queue %q: got %v, want >= %v", data.queue, dutOctetCounterDiff, ateOctetCounterDiff) + if !deviations.QOSOctets(dut) { + if dutOctetCounterDiff < ateOctetCounterDiff { + t.Errorf("Get dutOctetCounterDiff for queue %q: got %v, want >= %v", data.queue, dutOctetCounterDiff, ateOctetCounterDiff) + } } if !deviations.QOSDroppedOctets(dut) { diff --git a/feature/qos/otg_tests/bursty_traffic_test/metadata.textproto b/feature/qos/otg_tests/bursty_traffic_test/metadata.textproto index 486e24dc7e4..decad5823f4 100644 --- a/feature/qos/otg_tests/bursty_traffic_test/metadata.textproto +++ b/feature/qos/otg_tests/bursty_traffic_test/metadata.textproto @@ -37,5 +37,6 @@ platform_exceptions: { } deviations: { interface_enabled: true + qos_octets: true } } diff --git a/feature/qos/otg_tests/mixed_sp_wrr_traffic_test/metadata.textproto b/feature/qos/otg_tests/mixed_sp_wrr_traffic_test/metadata.textproto index 1ae7f0f6a00..8cb261e51c8 100644 --- a/feature/qos/otg_tests/mixed_sp_wrr_traffic_test/metadata.textproto +++ b/feature/qos/otg_tests/mixed_sp_wrr_traffic_test/metadata.textproto @@ -39,5 +39,6 @@ platform_exceptions: { deviations: { dequeue_delete_not_counted_as_drops: true interface_enabled: true + qos_octets: true } } diff --git a/feature/qos/otg_tests/mixed_sp_wrr_traffic_test/mixed_sp_wrr_traffic_test.go b/feature/qos/otg_tests/mixed_sp_wrr_traffic_test/mixed_sp_wrr_traffic_test.go index 2fd901282a8..9f35e6a6284 100644 --- a/feature/qos/otg_tests/mixed_sp_wrr_traffic_test/mixed_sp_wrr_traffic_test.go +++ b/feature/qos/otg_tests/mixed_sp_wrr_traffic_test/mixed_sp_wrr_traffic_test.go @@ -637,8 +637,10 @@ func TestMixedSPWrrTraffic(t *testing.T) { dutOctetCounterDiff := counters["dutQosOctetsAfterTraffic"][data.queue] - counters["dutQosOctetsBeforeTraffic"][data.queue] ateOctetCounterDiff := counters["ateInPkts"][data.queue] * uint64(data.frameSize) t.Logf("Queue %q: ateOctetCounterDiff: %v dutOctetCounterDiff: %v", data.queue, ateOctetCounterDiff, dutOctetCounterDiff) - if dutOctetCounterDiff < ateOctetCounterDiff { - t.Errorf("Get dutOctetCounterDiff for queue %q: got %v, want >= %v", data.queue, dutOctetCounterDiff, ateOctetCounterDiff) + if !deviations.QOSOctets(dut) { + if dutOctetCounterDiff < ateOctetCounterDiff { + t.Errorf("Get dutOctetCounterDiff for queue %q: got %v, want >= %v", data.queue, dutOctetCounterDiff, ateOctetCounterDiff) + } } if !deviations.QOSDroppedOctets(dut) { diff --git a/feature/qos/otg_tests/qos_basic_test/metadata.textproto b/feature/qos/otg_tests/qos_basic_test/metadata.textproto index 1a550acad68..50aa355399f 100644 --- a/feature/qos/otg_tests/qos_basic_test/metadata.textproto +++ b/feature/qos/otg_tests/qos_basic_test/metadata.textproto @@ -38,5 +38,6 @@ platform_exceptions: { } deviations: { interface_enabled: true + qos_octets: true } } diff --git a/feature/qos/otg_tests/qos_basic_test/qos_basic_test.go b/feature/qos/otg_tests/qos_basic_test/qos_basic_test.go index 130c6c349d8..6d8aacf98c1 100644 --- a/feature/qos/otg_tests/qos_basic_test/qos_basic_test.go +++ b/feature/qos/otg_tests/qos_basic_test/qos_basic_test.go @@ -489,8 +489,10 @@ func TestBasicConfigWithTraffic(t *testing.T) { dutOctetCounterDiff := counters["dutQosOctetsAfterTraffic"][data.queue] - counters["dutQosOctetsBeforeTraffic"][data.queue] ateOctetCounterDiff := counters["ateInPkts"][data.queue] * uint64(data.frameSize) t.Logf("Queue %q: ateOctetCounterDiff: %v dutOctetCounterDiff: %v", data.queue, ateOctetCounterDiff, dutOctetCounterDiff) - if dutOctetCounterDiff < ateOctetCounterDiff { - t.Errorf("Get dutOctetCounterDiff for queue %q: got %v, want >= %v", data.queue, dutOctetCounterDiff, ateOctetCounterDiff) + if !deviations.QOSOctets(dut) { + if dutOctetCounterDiff < ateOctetCounterDiff { + t.Errorf("Get dutOctetCounterDiff for queue %q: got %v, want >= %v", data.queue, dutOctetCounterDiff, ateOctetCounterDiff) + } } if !deviations.QOSDroppedOctets(dut) { diff --git a/feature/qos/otg_tests/qos_output_queue_counters_test/metadata.textproto b/feature/qos/otg_tests/qos_output_queue_counters_test/metadata.textproto index c0e43e38aa7..dceb9fac219 100644 --- a/feature/qos/otg_tests/qos_output_queue_counters_test/metadata.textproto +++ b/feature/qos/otg_tests/qos_output_queue_counters_test/metadata.textproto @@ -38,5 +38,6 @@ platform_exceptions: { } deviations: { interface_enabled: true + qos_octets: true } } diff --git a/feature/qos/otg_tests/qos_output_queue_counters_test/qos_output_queue_counters_test.go b/feature/qos/otg_tests/qos_output_queue_counters_test/qos_output_queue_counters_test.go index 5b50db36b3e..9f3ed9d683c 100644 --- a/feature/qos/otg_tests/qos_output_queue_counters_test/qos_output_queue_counters_test.go +++ b/feature/qos/otg_tests/qos_output_queue_counters_test/qos_output_queue_counters_test.go @@ -259,8 +259,10 @@ func TestQoSCounters(t *testing.T) { dutOctetCounterDiff := counters["dutQosOctetsAfterTraffic"][data.queue] - counters["dutQosOctetsBeforeTraffic"][data.queue] ateOctetCounterDiff := counters["ateInPkts"][data.queue] * uint64(data.frameSize) t.Logf("Queue %q: ateOctetCounterDiff: %v dutOctetCounterDiff: %v", data.queue, ateOctetCounterDiff, dutOctetCounterDiff) - if dutOctetCounterDiff < ateOctetCounterDiff { - t.Errorf("Get dutOctetCounterDiff for queue %q: got %v, want >= %v", data.queue, dutOctetCounterDiff, ateOctetCounterDiff) + if !deviations.QOSOctets(dut) { + if dutOctetCounterDiff < ateOctetCounterDiff { + t.Errorf("Get dutOctetCounterDiff for queue %q: got %v, want >= %v", data.queue, dutOctetCounterDiff, ateOctetCounterDiff) + } } if !deviations.QOSDroppedOctets(dut) { diff --git a/internal/deviations/deviations.go b/internal/deviations/deviations.go index 3c09ac064ab..d08298ac563 100644 --- a/internal/deviations/deviations.go +++ b/internal/deviations/deviations.go @@ -588,6 +588,11 @@ func SkipControllerCardPowerAdmin(dut *ondatra.DUTDevice) bool { return lookupDUTDeviations(dut).GetSkipControllerCardPowerAdmin() } +// QOSOctets returns if device should skip checking QOS octet stats for interface. +func QOSOctets(dut *ondatra.DUTDevice) bool { + return lookupDUTDeviations(dut).GetQosOctets() +} + // Vendor deviation flags. // All new flags should not be exported (define them in lowercase) and accessed // from tests through a public accessors like those above. diff --git a/proto/metadata.proto b/proto/metadata.proto index 67efdb37fc6..b581a477aa0 100644 --- a/proto/metadata.proto +++ b/proto/metadata.proto @@ -255,6 +255,9 @@ message Metadata { // Device requires interface enabled leaf booleans to be explicitly set to // true. bool interface_enabled = 75; + // Set to true to skip checking QOS octet stats for interface. + // Arista: partnerissuetracker.corp.google.com/283541442 + bool qos_octets = 76; } message PlatformExceptions { diff --git a/proto/metadata_go_proto/metadata.pb.go b/proto/metadata_go_proto/metadata.pb.go index ed13c5a10ee..851ad9b96d5 100644 --- a/proto/metadata_go_proto/metadata.pb.go +++ b/proto/metadata_go_proto/metadata.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.28.1 // protoc v3.21.12 // source: metadata.proto @@ -24,10 +24,9 @@ import ( reflect "reflect" sync "sync" + proto "github.com/openconfig/ondatra/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" - - proto "github.com/openconfig/ondatra/proto" ) const ( @@ -466,6 +465,9 @@ type Metadata_Deviations struct { // Device requires interface enabled leaf booleans to be explicitly set to // true. InterfaceEnabled bool `protobuf:"varint,75,opt,name=interface_enabled,json=interfaceEnabled,proto3" json:"interface_enabled,omitempty"` + // Set to true to skip checking QOS octet stats for interface. + // Arista: partnerissuetracker.corp.google.com/283541442 + QosOctets bool `protobuf:"varint,76,opt,name=qos_octets,json=qosOctets,proto3" json:"qos_octets,omitempty"` } func (x *Metadata_Deviations) Reset() { @@ -976,6 +978,13 @@ func (x *Metadata_Deviations) GetInterfaceEnabled() bool { return false } +func (x *Metadata_Deviations) GetQosOctets() bool { + if x != nil { + return x.QosOctets + } + return false +} + type Metadata_PlatformExceptions struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1039,7 +1048,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, 0x83, 0x2a, 0x0a, 0x08, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa2, 0x2a, 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, 0x49, @@ -1068,7 +1077,7 @@ var file_metadata_proto_rawDesc = []byte{ 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 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, 0x1a, 0xec, 0x23, 0x0a, 0x0a, 0x44, 0x65, 0x76, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x78, 0x1a, 0x8b, 0x24, 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, 0x67, 0x45, 0x6e, 0x61, 0x62, 0x6c, @@ -1355,28 +1364,30 @@ var file_metadata_proto_rawDesc = []byte{ 0x75, 0x74, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x4b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, - 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, 0x44, 0x65, 0x76, - 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x22, 0xa7, 0x01, 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, 0x62, 0x06, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x12, 0x1d, 0x0a, 0x0a, 0x71, 0x6f, 0x73, 0x5f, 0x6f, 0x63, 0x74, 0x65, 0x74, 0x73, 0x18, 0x4c, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x71, 0x6f, 0x73, 0x4f, 0x63, 0x74, 0x65, 0x74, 0x73, 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, 0x44, 0x65, 0x76, 0x69, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x22, 0xa7, 0x01, 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, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, } var (