From e5654ba4752325462844fe87beaea3e4c3c3cda3 Mon Sep 17 00:00:00 2001 From: Stuart Leeks Date: Wed, 17 May 2023 14:22:01 +0100 Subject: [PATCH 1/6] Fix typo in metric name (#6363) Signed-off-by: Stuart Leeks --- docs/development/dapr-metrics.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/development/dapr-metrics.md b/docs/development/dapr-metrics.md index 23784ea1563..26c8517088f 100644 --- a/docs/development/dapr-metrics.md +++ b/docs/development/dapr-metrics.md @@ -85,7 +85,7 @@ Dapr uses prometheus process and go collectors by default. * dapr_runtime_actor_status_report_total: The number of the successful status reports to placement service. * dapr_runtime_actor_status_report_fail_total: The number of the failed status reports to placement service * dapr_runtime_actor_table_operation_recv_total: The number of the received actor placement table operations. -* dapr_runtime_actor_reblanaced_total: The number of the actor rebalance requests. +* dapr_runtime_actor_rebalanced_total: The number of the actor rebalance requests. * dapr_runtime_actor_activated_total: The number of the actor activation. * dapr_runtime_actor_activated_failed_total: The number of the actor activation failures. * dapr_runtime_actor_deactivated_total: The number of the successful actor deactivation. From ace0dd251d278394644d4aaa56f3ba5560b618be Mon Sep 17 00:00:00 2001 From: halst Date: Fri, 19 May 2023 00:25:48 +0800 Subject: [PATCH 2/6] add outputbinding kitex (#6211) * add outputbinding kitex Signed-off-by: liusong * build tag all_components Signed-off-by: liusong * build tag Signed-off-by: liusong --------- Signed-off-by: liusong Co-authored-by: Mukundan Sundararajan <65565396+mukundansundar@users.noreply.github.com> Co-authored-by: Taction Co-authored-by: Bernd Verst Co-authored-by: Artur Souza --- cmd/daprd/components/binding_kitex.go | 27 ++++++++ go.mod | 15 +++++ go.sum | 89 +++++++++++++++++++++++++++ 3 files changed, 131 insertions(+) create mode 100644 cmd/daprd/components/binding_kitex.go diff --git a/cmd/daprd/components/binding_kitex.go b/cmd/daprd/components/binding_kitex.go new file mode 100644 index 00000000000..4f7f62ddb7e --- /dev/null +++ b/cmd/daprd/components/binding_kitex.go @@ -0,0 +1,27 @@ +//go:build !(linux && arm) && all_components +// +build !linux !arm +// +build all_components + +/* +Copyright 2023 The Dapr Authors +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 components + +import ( + "github.com/dapr/components-contrib/bindings/kitex" + bindingsLoader "github.com/dapr/dapr/pkg/components/bindings" +) + +func init() { + bindingsLoader.DefaultRegistry.RegisterOutputBinding(kitex.NewKitexOutput, "kitex") +} diff --git a/go.mod b/go.mod index 4865edd31f5..43ed2e56503 100644 --- a/go.mod +++ b/go.mod @@ -75,6 +75,21 @@ require ( sigs.k8s.io/yaml v1.3.0 ) +require ( + github.com/apache/thrift v0.13.0 // indirect + github.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f // indirect + github.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762 // indirect + github.com/choleraehyq/pid v0.0.16 // indirect + github.com/cloudwego/fastpb v0.0.4-0.20230131074846-6fc453d58b96 // indirect + github.com/cloudwego/frugal v0.1.6 // indirect + github.com/cloudwego/kitex v0.5.0 // indirect + github.com/cloudwego/netpoll v0.3.2 // indirect + github.com/cloudwego/thriftgo v0.2.8 // indirect + github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 // indirect + github.com/oleiade/lane v1.0.1 // indirect + golang.org/x/arch v0.2.0 // indirect +) + require ( cloud.google.com/go v0.110.0 // indirect cloud.google.com/go/compute v1.19.0 // indirect diff --git a/go.sum b/go.sum index 96099a1b85c..3636ef1fc4d 100644 --- a/go.sum +++ b/go.sum @@ -60,6 +60,8 @@ contrib.go.opencensus.io/exporter/prometheus v0.4.2/go.mod h1:dvEHbiKmgvbr5pjaF9 dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= dubbo.apache.org/dubbo-go/v3 v3.0.3-0.20230118042253-4f159a2b38f3 h1:j08GKvXilDMHuVuGy+X0CMTL+Wxrte5a4XrWGDypZf0= dubbo.apache.org/dubbo-go/v3 v3.0.3-0.20230118042253-4f159a2b38f3/go.mod h1:bxe6StRQ4PVbZa+B5nsREuez4agzmWiELS9NhEoDscI= +gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= +git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc= github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 h1:/vQbFIOMbk2FiG/kXiLl8BRyzTWDw7gX/Hz7Dd5eDMs= github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4/go.mod h1:hN7oaIRCjzsZ2dE+yG5k+rsdt3qcwykqK6HVGcKwsw4= github.com/99designs/keyring v1.2.1 h1:tYLp1ULvO7i3fI5vE21ReQuj99QFSs7lGm0xWyJo87o= @@ -152,7 +154,10 @@ github.com/agiledragon/gomonkey v2.0.2+incompatible/go.mod h1:2NGfXu1a80LLr2cmWX github.com/agnivade/levenshtein v1.1.1 h1:QY8M92nrzkmr798gCo3kmMyqXFzdQVpxLlGPRBij0P8= github.com/agnivade/levenshtein v1.1.1/go.mod h1:veldBMzWxcCG2ZvUTKD2kJNRdCk5hVbJomOvKkmgYbo= github.com/ajg/form v1.5.1 h1:t9c7v8JUKu/XxOGBU0yjNpaMloxGEJhUkqFRq0ibGeU= +github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY= +github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= +github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= @@ -283,6 +288,8 @@ github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dR github.com/bmizerany/perks v0.0.0-20141205001514-d9a9656a3a4b/go.mod h1:ac9efd0D1fsDb3EJvhqgXRbFx7bs2wqZ10HQPeU8U/Q= github.com/boltdb/bolt v1.3.1 h1:JQmyP4ZBrce+ZQu0dY660FMfatumYDLun9hBCUVIkF4= github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= +github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/bradfitz/gomemcache v0.0.0-20230124162541-5f7a7d875746 h1:wAIE/kN63Oig1DdOzN7O+k4AbFh2cCJoKMFXrwRJtzk= github.com/bradfitz/gomemcache v0.0.0-20230124162541-5f7a7d875746/go.mod h1:H0wQNHz2YrLsuXOZozoeDmnHXkNCRmMW0gwFWDfEZDA= github.com/bsm/ginkgo/v2 v2.7.0 h1:ItPMPH90RbmZJt5GtkcNvIRuGEdwlBItdNVoyzaNQao= @@ -292,6 +299,11 @@ github.com/bufbuild/protocompile v0.4.0/go.mod h1:3v93+mbWn/v3xzN+31nwkJfrEpAUwp github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= github.com/bytecodealliance/wasmtime-go/v3 v3.0.2 h1:3uZCA/BLTIu+DqCfguByNMJa2HVHpXvjfy0Dy7g6fuA= +github.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q= +github.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f h1:U3Bk6S9UyqFM5tU3bZ3pwqx5xyypHP7Bm2QCbOUwxSc= +github.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q= +github.com/bytedance/mockey v1.2.0 h1:847+X2fBSM4s/AIN4loO5d16PCgEj53j7Q8YVB+8P6c= +github.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4= github.com/camunda/zeebe/clients/go/v8 v8.1.8 h1:/i3t1PaToPfED+609uNR9kdGo/LPFTE4jK5/SEbwY4Y= github.com/camunda/zeebe/clients/go/v8 v8.1.8/go.mod h1:nQc5qX4lPSxWUW0VuJ+k3b+FdcVLNa29A/nAQG2q9u4= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= @@ -310,9 +322,15 @@ github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chebyrash/promise v0.0.0-20220530143319-1123826567d6 h1:AtcTeZIfucJjiqhIeMoOAR292ti2QOyo2aqN3SoWopo= github.com/chebyrash/promise v0.0.0-20220530143319-1123826567d6/go.mod h1:4DRxP3p0R7/5msq1uKcI1THYmfWgFXxQqr0DutaIAEk= +github.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762 h1:4+00EOUb1t9uxAbgY8VvgfKJKDpim3co4MqsAbelIbs= +github.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog= +github.com/choleraehyq/pid v0.0.16 h1:1/714sMH9IBlE/aK6xM0acTagGKSzpiR0bDt7l0cG7o= +github.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U= github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/clbanning/mxj/v2 v2.5.5/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s= @@ -326,6 +344,17 @@ github.com/cloudevents/sdk-go/v2 v2.13.0 h1:2zxDS8RyY1/wVPULGGbdgniGXSzLaRJVl136 github.com/cloudevents/sdk-go/v2 v2.13.0/go.mod h1:xDmKfzNjM8gBvjaF8ijFjM1VYOVUEeUfapHMUX1T5To= github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58 h1:F1EaeKL/ta07PY/k9Os/UFtwERei2/XzGemhpGnBKNg= github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58/go.mod h1:EOBUe0h4xcZ5GoxqC5SDxFQ8gwyZPKQoEzownBlhI80= +github.com/cloudwego/fastpb v0.0.4-0.20230131074846-6fc453d58b96 h1:61PQT0CXNUuQDiDKv/QQ+pFi9uthExZLQz8b5WfS7Qw= +github.com/cloudwego/fastpb v0.0.4-0.20230131074846-6fc453d58b96/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0= +github.com/cloudwego/frugal v0.1.6 h1:aXJ7W0Omion1WTCe4JHAWinQmjXDYzHt03sabu3Rabo= +github.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs= +github.com/cloudwego/kitex v0.5.0 h1:f/rip2gp8mdeTpi0WQFv7BdDdkdZn/Q0KvBCm9Mi+7c= +github.com/cloudwego/kitex v0.5.0/go.mod h1:yhw7XikNVG4RstmlQAidBuxMlZYpIiCLsDU8eHPGEMo= +github.com/cloudwego/kitex-examples v0.1.1 h1:5uGqbGEobl8pKSVKwaWgltuf/JAa8Fg2MioX4WmlCXw= +github.com/cloudwego/netpoll v0.3.2 h1:/998ICrNMVBo4mlul4j7qcIeY7QnEfuCCPPwck9S3X4= +github.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ= +github.com/cloudwego/thriftgo v0.2.8 h1:swwp+JQDeL8bBbvzJN3D3J5fluWP+chiUqVPbnToV0I= +github.com/cloudwego/thriftgo v0.2.8/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= @@ -472,6 +501,7 @@ github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/flowstack/go-jsonschema v0.1.1/go.mod h1:yL7fNggx1o8rm9RlgXv7hTBWxdBM0rVwpMwimd3F3N0= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= github.com/foxcpp/go-mockdns v0.0.0-20210729171921-fb145fc6f897 h1:E52jfcE64UG42SwLmrW0QByONfGynWuzBvm86BoB9z8= @@ -501,6 +531,11 @@ github.com/go-co-op/gocron v1.9.0/go.mod h1:DbJm9kdgr1sEvWpHCA7dFFs/PGHPMil9/97E github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= +github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= +github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= +github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -512,6 +547,8 @@ github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vb github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= +github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= github.com/go-ldap/ldap v3.0.2+incompatible/go.mod h1:qfd9rJvER9Q0/D/Sqn1DfHRoBp40uXYvFoEVrNEPqRc= github.com/go-ldap/ldap/v3 v3.1.10/go.mod h1:5Zun81jBTabRaI8lzN7E1JjyEl1g6zI6u9pd8luAK4Q= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= @@ -542,6 +579,8 @@ github.com/go-openapi/swag v0.21.1 h1:wm0rhTb5z7qpJRHBdPOMuY4QjVUMbF6/kwoYeRAOrK github.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-ozzo/ozzo-validation/v4 v4.3.0 h1:byhDUpfEwjsVQb1vBunvIjh2BHQ9ead57VkAEY4V+Es= github.com/go-ozzo/ozzo-validation/v4 v4.3.0/go.mod h1:2NKgrcHl3z6cJs+3Oo940FPRiTzuqKbvfrL2RxCj6Ew= +github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= +github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= github.com/go-pkgz/expirable-cache v0.1.0 h1:3bw0m8vlTK8qlwz5KXuygNBTkiKRTPrAGXU0Ej2AC1g= github.com/go-pkgz/expirable-cache v0.1.0/go.mod h1:GTrEl0X+q0mPNqN6dtcQXksACnzCBQ5k/k1SwXJsZKs= github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= @@ -703,7 +742,9 @@ github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk= github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 h1:Xim43kblpZXfIBQsbuBVKCudVG457BR2GZFIz3uw3hQ= +github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26/go.mod h1:dDKJzRmX4S37WGHujM7tX//fmj1uioxKzKxz3lo4HJo= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= @@ -722,6 +763,7 @@ github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORR github.com/gopherjs/gopherjs v0.0.0-20190910122728-9d188e94fb99/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00 h1:l5lAOZEym3oK3SQ2HBHWsJUfbNBiTXJDeW2QDxw9AQ0= github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY= github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= @@ -866,6 +908,7 @@ github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmK github.com/iancoleman/strcase v0.0.0-20191112232945-16388991a334/go.mod h1:SK73tn/9oHe+/Y0h39VT4UCxmurVJkR5NA7kMEAOgSE= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w= github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= github.com/imkira/go-interpol v1.1.0 h1:KIiKr0VSG2CUW1hl1jpiyuzuJeKUUpC8iM1AIE7N1Vk= @@ -905,6 +948,7 @@ github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJk github.com/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869/go.mod h1:cJ6Cj7dQo+O6GJNiMx+Pa94qKj+TG8ONdKHgMNIyyag= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jhump/protoreflect v1.6.0/go.mod h1:eaTn3RZAmMBcV0fifFvlm6VHNz3wSkYyXYWUh7ymB74= +github.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg= github.com/jhump/protoreflect v1.15.1 h1:HUMERORf3I3ZdX05WaQ6MIpd/NJ434hTp5YiKgfCL6c= github.com/jhump/protoreflect v1.15.1/go.mod h1:jD/2GMKKE6OqX8qTjhADU1e6DShO+gavG9e0Q693nKo= github.com/jinzhu/copier v0.3.5 h1:GlvfUwHk62RokgqVNvYsku0TATCF7bAHVwEXoBh3iJg= @@ -937,6 +981,7 @@ github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7 github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 h1:uC1QfSlInpQF+M0ao65imhwqKnz3Q2z/d8PWZRMQvDM= github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= @@ -957,8 +1002,11 @@ github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47e github.com/klauspost/compress v1.14.4/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/compress v1.16.3 h1:XuJt9zzcnaz6a16/OU53ZjWp/v7/42WcR5t2a0PcNQY= github.com/klauspost/compress v1.16.3/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= github.com/knadh/koanf v1.4.1 h1:Z0VGW/uo8NJmjd+L1Dc3S5frq6c62w5xQ9Yf4Mg3wFQ= github.com/knadh/koanf v1.4.1/go.mod h1:1cfH5223ZeZUOs8FU2UdTmaNfHpqgtjV0+NHjRO43gs= +github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= github.com/koding/multiconfig v0.0.0-20171124222453-69c27309b2d7/go.mod h1:Y2SaZf2Rzd0pXkLVhLlCiAXFCLSXAIbTKDivVgff/AM= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -1156,6 +1204,7 @@ github.com/nats-io/stan.go v0.10.4 h1:19GS/eD1SeQJaVkeM9EkvEYattnvnWrZ3wkSWSw4uX github.com/nats-io/stan.go v0.10.4/go.mod h1:3XJXH8GagrGqajoO/9+HgPyKV5MWsv7S5ccdda+pc6k= github.com/niean/gotools v0.0.0-20151221085310-ff3f51fc5c60/go.mod h1:gH2bvE9/eX49hWK7CwwL/+/y+dodduyxs5cTpBzF5v0= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso= github.com/npillmayer/nestext v0.1.3/go.mod h1:h2lrijH8jpicr25dFY+oAJLyzlya6jhnuG+zWp9L0Uk= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= @@ -1163,6 +1212,8 @@ github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+ github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/oleiade/lane v1.0.1 h1:hXofkn7GEOubzTwNpeL9MaNy8WxolCYb9cInAIeqShU= +github.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -1218,6 +1269,9 @@ github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR github.com/phayes/freeport v0.0.0-20220201140144-74d24b5ae9f5 h1:Ii+DKncOVM8Cu1Hc+ETb5K+23HdAMvESYE3ZJ5b5cMI= github.com/phayes/freeport v0.0.0-20220201140144-74d24b5ae9f5/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE= github.com/philhofer/fwd v1.1.1/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= +github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= +github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= +github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pierrec/lz4 v2.5.2+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= @@ -1325,6 +1379,8 @@ github.com/rs/zerolog v1.28.0/go.mod h1:NILgTygv/Uej1ra5XxGf82ZFSLk58MFGAUS2o6us github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= 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= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= @@ -1432,6 +1488,7 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ssm v1.0.608/go.mod h1: github.com/tetratelabs/wazero v1.1.0 h1:EByoAhC+QcYpwSZJSs/aV0uokxPwBgKxfiokSUwAknQ= github.com/tetratelabs/wazero v1.1.0/go.mod h1:wYx2gNRg8/WihJfSDxA1TIL8H+GkfLYm+bIfbblu9VQ= github.com/tevid/gohamcrest v1.1.1/go.mod h1:3UvtWlqm8j5JbwYZh80D/PVBt0mJ1eJiYgZMibh0H/k= +github.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/gjson v1.13.0 h1:3TFY9yxOQShrvmjdM76K+jc66zJeT6D3/VFFYCGQf7M= github.com/tidwall/gjson v1.13.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= @@ -1616,6 +1673,9 @@ go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= goji.io v2.0.2+incompatible h1:uIssv/elbKRLznFUy3Xj4+2Mz/qKhek/9aZQDUMae7c= +golang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4= +golang.org/x/arch v0.2.0 h1:W1sUEHXiJTfjaFJ5SLo0N6lZn+0eO5gWD1MFeTGqQEY= +golang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/crypto v0.0.0-20180820150726-614d502a4dac/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -1653,6 +1713,7 @@ golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= @@ -1665,6 +1726,16 @@ golang.org/x/exp v0.0.0-20230419192730-864b3d6c5c2c/go.mod h1:CxIveKay+FTh1D0yPZ golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1688,6 +1759,7 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= @@ -1870,6 +1942,7 @@ golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210316164454-77fc1eacc6aa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1892,20 +1965,24 @@ golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211106132015-ebca88c72f68/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211117180635-dee7805ff2e1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220111092808-5a964db01320/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220204135822-1c1b9b1eba6a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220224120231-95c6836cb0e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220513210249-45d2b4557a2a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220708085239-5a0f0661e09d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1969,6 +2046,7 @@ golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -1999,8 +2077,10 @@ golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200509030707-2212a7e161a5/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= @@ -2017,6 +2097,7 @@ golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= @@ -2033,8 +2114,12 @@ gomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY gomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY= gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= +gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= +gonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY= gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= +gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= +gonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo= google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= @@ -2115,6 +2200,7 @@ google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/genproto v0.0.0-20211104193956-4c6863e31247/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= @@ -2167,6 +2253,7 @@ google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= @@ -2248,6 +2335,7 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= k8s.io/api v0.26.3 h1:emf74GIQMTik01Aum9dPP0gAypL8JTLl/lHa4V9RFSU= k8s.io/api v0.26.3/go.mod h1:PXsqwPMXBSBcL1lJ9CYDKy7kIReUydukS5JiRlxC3qE= k8s.io/apiextensions-apiserver v0.26.3 h1:5PGMm3oEzdB1W/FTMgGIDmm100vn7IaUP5er36dB+YE= @@ -2300,6 +2388,7 @@ modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= modernc.org/z v1.7.0 h1:xkDw/KepgEjeizO2sNco+hqYkU12taxQFqPEmgm1GWE= nhooyr.io/websocket v1.8.6 h1:s+C3xAMLwGmlI31Nyn/eAehUlZPwfYZu2JXM621Q5/k= +nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= From 6384863f3995638391007bd8c54e78b5696e2e58 Mon Sep 17 00:00:00 2001 From: Josh van Leeuwen Date: Thu, 18 May 2023 23:40:40 +0100 Subject: [PATCH 3/6] Adds js-sdk to sdk test github workflow with corresponding commands (#6310) * Move daprd to dapr-cli path before initing Signed-off-by: joshvanl * Fix order of daprd install and copy Signed-off-by: joshvanl * Fix js parser and event_type/event.action Signed-off-by: joshvanl * Backported fixes from #6342 Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> * Update JS node version to 18.16.0 Signed-off-by: joshvanl --------- Signed-off-by: joshvanl Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> Co-authored-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> --- .github/scripts/dapr_bot.js | 1 + .github/workflows/dapr-test-sdk.yml | 172 +++++++++++++++++++++++++--- 2 files changed, 159 insertions(+), 14 deletions(-) diff --git a/.github/scripts/dapr_bot.js b/.github/scripts/dapr_bot.js index e1aba9e1f39..5dabe753112 100644 --- a/.github/scripts/dapr_bot.js +++ b/.github/scripts/dapr_bot.js @@ -123,6 +123,7 @@ async function handleIssueCommentCreate({ github, context }) { case '/test-sdk-all': case '/test-sdk-java': case '/test-sdk-python': + case '/test-sdk-js': await cmdTestSDK( github, issue, diff --git a/.github/workflows/dapr-test-sdk.yml b/.github/workflows/dapr-test-sdk.yml index b9f30f5e5ff..abd4494fcea 100644 --- a/.github/workflows/dapr-test-sdk.yml +++ b/.github/workflows/dapr-test-sdk.yml @@ -19,11 +19,15 @@ name: dapr-test-sdk on: # Run every 12 hours on weekdays, and every 24 hours on weekends. schedule: - - cron: "0 */12 * * 1-5" - - cron: "30 0 * * 0,6" + - cron: "16 */11 * * 1-5" + - cron: "41 0 * * 0,6" # Dispatch on external events repository_dispatch: - types: [test-sdk-all, test-sdk-python, test-sdk-java] + types: + - test-sdk-all + - test-sdk-python + - test-sdk-java + - test-sdk-js env: GOOS: linux GOARCH: amd64 @@ -33,6 +37,7 @@ env: # /test-sdk-all # /test-sdk-python # /test-sdk-java + # /test-sdk-js jobs: python-sdk: if: | @@ -72,7 +77,7 @@ jobs: if: env.PR_NUMBER != '' uses: artursouza/sticky-pull-request-comment@v2.2.0 with: - header: ${{ github.run_id }} + header: ${{ github.run_id }}-python number: ${{ env.PR_NUMBER }} hide: true hide_classify: OUTDATED @@ -84,7 +89,11 @@ jobs: Commit ref: ${{ env.CHECKOUT_REF }} - - uses: actions/checkout@v3 + - name: Check out code + uses: actions/checkout@v3 + with: + repository: ${{ env.CHECKOUT_REPO }} + ref: ${{ env.CHECKOUT_REF }} - name: Set up Python 3.9 uses: actions/setup-python@v4 with: @@ -127,7 +136,7 @@ jobs: if: ${{ success() }} uses: artursouza/sticky-pull-request-comment@v2.2.0 with: - header: ${{ github.run_id }} + header: ${{ github.run_id }}-python number: ${{ env.PR_NUMBER }} append: true GITHUB_TOKEN: ${{ secrets.DAPR_BOT_TOKEN }} @@ -137,7 +146,7 @@ jobs: if: ${{ failure() }} uses: artursouza/sticky-pull-request-comment@v2.2.0 with: - header: ${{ github.run_id }} + header: ${{ github.run_id }}-python number: ${{ env.PR_NUMBER }} append: true GITHUB_TOKEN: ${{ secrets.DAPR_BOT_TOKEN }} @@ -149,7 +158,7 @@ jobs: if: ${{ cancelled() }} uses: artursouza/sticky-pull-request-comment@v2.2.0 with: - header: ${{ github.run_id }} + header: ${{ github.run_id }}-python number: ${{ env.PR_NUMBER }} append: true GITHUB_TOKEN: ${{ secrets.DAPR_BOT_TOKEN }} @@ -199,7 +208,7 @@ jobs: if: env.PR_NUMBER != '' uses: artursouza/sticky-pull-request-comment@v2.2.0 with: - header: ${{ github.run_id }} + header: ${{ github.run_id }}-java number: ${{ env.PR_NUMBER }} hide: true hide_classify: OUTDATED @@ -210,7 +219,11 @@ jobs: ๐Ÿ”— **[Link to Action run](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }})** Commit ref: ${{ env.CHECKOUT_REF }} - - uses: actions/checkout@v3 + - name: Check out code + uses: actions/checkout@v3 + with: + repository: ${{ env.CHECKOUT_REPO }} + ref: ${{ env.CHECKOUT_REF }} - name: Set up OpenJDK ${{ env.JDK_VER }} uses: actions/setup-java@v3 with: @@ -218,7 +231,7 @@ jobs: java-version: ${{ env.JDK_VER }} - name: "Set up Go" id: setup-go - uses: actions/setup-go@v3 + uses: actions/setup-go@v4 with: go-version-file: "go.mod" - name: Checkout java-sdk repo to run tests. @@ -284,7 +297,7 @@ jobs: if: ${{ success() }} uses: artursouza/sticky-pull-request-comment@v2.2.0 with: - header: ${{ github.run_id }} + header: ${{ github.run_id }}-java number: ${{ env.PR_NUMBER }} append: true GITHUB_TOKEN: ${{ secrets.DAPR_BOT_TOKEN }} @@ -294,7 +307,7 @@ jobs: if: ${{ failure() }} uses: artursouza/sticky-pull-request-comment@v2.2.0 with: - header: ${{ github.run_id }} + header: ${{ github.run_id }}-java number: ${{ env.PR_NUMBER }} append: true GITHUB_TOKEN: ${{ secrets.DAPR_BOT_TOKEN }} @@ -306,7 +319,7 @@ jobs: if: ${{ cancelled() }} uses: artursouza/sticky-pull-request-comment@v2.2.0 with: - header: ${{ github.run_id }} + header: ${{ github.run_id }}-java number: ${{ env.PR_NUMBER }} append: true GITHUB_TOKEN: ${{ secrets.DAPR_BOT_TOKEN }} @@ -314,3 +327,134 @@ jobs: ## โš ๏ธ Java SDK tests cancelled The Action has been canceled + + js-sdk: + if: | + github.event_name == 'schedule' || + ( github.event_name == 'repository_dispatch' && + ( + github.event.action == 'test-sdk-all' || + github.event.action == 'test-sdk-js' + ) + ) + name: "JS SDK verification tests" + runs-on: ubuntu-latest + env: + NODE_VER: 18.16.0 + steps: + - name: Set up for scheduled test + if: github.event_name != 'repository_dispatch' + run: | + echo "CHECKOUT_REPO=${{ github.repository }}" >> $GITHUB_ENV + echo "CHECKOUT_REF=refs/heads/master" >> $GITHUB_ENV + shell: bash + - name: Parse test payload + if: github.event_name == 'repository_dispatch' + uses: actions/github-script@v6.2.0 + with: + github-token: ${{secrets.DAPR_BOT_TOKEN}} + script: | + const testPayload = context.payload.client_payload; + if (testPayload) { + var fs = require('fs'); + // Set environment variables + fs.appendFileSync(process.env.GITHUB_ENV, + `CHECKOUT_REPO=${testPayload.pull_head_repo}\n`+ + `CHECKOUT_REF=${testPayload.pull_head_ref}\n`+ + `PR_NUMBER=${testPayload.issue.number}` + ); + } + - name: Create PR comment + if: env.PR_NUMBER != '' + uses: artursouza/sticky-pull-request-comment@v2.2.0 + with: + header: ${{ github.run_id }}-js + number: ${{ env.PR_NUMBER }} + hide: true + hide_classify: OUTDATED + GITHUB_TOKEN: ${{ secrets.DAPR_BOT_TOKEN }} + message: | + # Dapr SDK JS test + + ๐Ÿ”— **[Link to Action run](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }})** + + Commit ref: ${{ env.CHECKOUT_REF }} + + - name: Check out code + uses: actions/checkout@v3 + with: + repository: ${{ env.CHECKOUT_REPO }} + ref: ${{ env.CHECKOUT_REF }} + - name: NodeJS - Install + uses: actions/setup-node@v2 + with: + node-version: ${{ env.NODE_VER }} + - name: "Set up Go" + id: setup-go + uses: actions/setup-go@v4 + with: + go-version-file: "go.mod" + - name: Checkout js repo to run tests. + uses: actions/checkout@v3 + with: + repository: dapr/js-sdk + path: js-sdk + - name: Set up Dapr CLI + run: wget -q https://raw.githubusercontent.com/dapr/cli/master/install/install.sh -O - | /bin/bash -s + - name: Build and override daprd with HEAD. + run: | + make + mkdir -p $HOME/.dapr/bin/ + cp dist/linux_amd64/release/daprd $HOME/.dapr/bin/daprd + - name: Initialize Dapr runtime + run: | + dapr init + - name: Override placement service. + run: | + docker stop dapr_placement + ./dist/linux_amd64/release/placement --healthz-port 9091 & + - name: Build Package + run: cd js-sdk && npm run build + - name: Run E2E tests + id: tests + run: cd js-sdk && npm run test:e2e:all + - name: Run E2E test to show successful typescript build + id: typescript-build-test + run: | + cd js-sdk test/e2e/typescript-build + npm install + dapr run --app-id typescript-build npm run start + - name: Update PR comment for success + if: ${{ success() }} + uses: artursouza/sticky-pull-request-comment@v2.2.0 + with: + header: ${{ github.run_id }}-js + number: ${{ env.PR_NUMBER }} + append: true + GITHUB_TOKEN: ${{ secrets.DAPR_BOT_TOKEN }} + message: | + ## โœ… JS SDK tests passed + - name: Update PR comment for failure + if: ${{ failure() }} + uses: artursouza/sticky-pull-request-comment@v2.2.0 + with: + header: ${{ github.run_id }}-js + number: ${{ env.PR_NUMBER }} + append: true + GITHUB_TOKEN: ${{ secrets.DAPR_BOT_TOKEN }} + message: | + ## โŒ JS SDK tests failed + + Please check the logs for details on the error. + - name: Update PR comment for cancellation + if: ${{ cancelled() }} + uses: artursouza/sticky-pull-request-comment@v2.2.0 + with: + header: ${{ github.run_id }}-js + number: ${{ env.PR_NUMBER }} + append: true + GITHUB_TOKEN: ${{ secrets.DAPR_BOT_TOKEN }} + message: | + ## โš ๏ธ JS SDK tests cancelled + + The Action has been canceled From 929e1a53038c614d6cd7dab44f5142d548ffccb3 Mon Sep 17 00:00:00 2001 From: "Alessandro (Ale) Segala" <43508+ItalyPaleAle@users.noreply.github.com> Date: Thu, 18 May 2023 16:20:23 -0700 Subject: [PATCH 4/6] Fix JS SDK tests (#6369) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Must run `dapr init`ย before overriding daprd, or the step fails Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> --- .github/workflows/dapr-test-sdk.yml | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/.github/workflows/dapr-test-sdk.yml b/.github/workflows/dapr-test-sdk.yml index abd4494fcea..03f143e968a 100644 --- a/.github/workflows/dapr-test-sdk.yml +++ b/.github/workflows/dapr-test-sdk.yml @@ -114,12 +114,12 @@ jobs: run: | dapr uninstall --all dapr init - - name: Build and override daprd with HEAD. + - name: Build and override daprd run: | make mkdir -p $HOME/.dapr/bin/ cp dist/linux_amd64/release/daprd $HOME/.dapr/bin/daprd - - name: Override placement service. + - name: Override placement service run: | docker stop dapr_placement ./dist/linux_amd64/release/placement --healthz-port 9091 & @@ -245,12 +245,12 @@ jobs: run: | dapr uninstall --all dapr init - - name: Build and override daprd with HEAD. + - name: Build and override daprd run: | make mkdir -p $HOME/.dapr/bin/ cp dist/linux_amd64/release/daprd $HOME/.dapr/bin/daprd - - name: Override placement service. + - name: Override placement service run: | docker stop dapr_placement ./dist/linux_amd64/release/placement & @@ -340,7 +340,7 @@ jobs: name: "JS SDK verification tests" runs-on: ubuntu-latest env: - NODE_VER: 18.16.0 + NODE_VER: 18 steps: - name: Set up for scheduled test if: github.event_name != 'repository_dispatch' @@ -379,14 +379,13 @@ jobs: ๐Ÿ”— **[Link to Action run](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }})** Commit ref: ${{ env.CHECKOUT_REF }} - - name: Check out code uses: actions/checkout@v3 with: repository: ${{ env.CHECKOUT_REPO }} ref: ${{ env.CHECKOUT_REF }} - name: NodeJS - Install - uses: actions/setup-node@v2 + uses: actions/setup-node@v3 with: node-version: ${{ env.NODE_VER }} - name: "Set up Go" @@ -394,22 +393,23 @@ jobs: uses: actions/setup-go@v4 with: go-version-file: "go.mod" - - name: Checkout js repo to run tests. + - name: Checkout js-sdk repo to run tests. uses: actions/checkout@v3 with: repository: dapr/js-sdk path: js-sdk - name: Set up Dapr CLI run: wget -q https://raw.githubusercontent.com/dapr/cli/master/install/install.sh -O - | /bin/bash -s - - name: Build and override daprd with HEAD. + - name: Initialize Dapr runtime + run: | + dapr uninstall --all + dapr init + - name: Build and override daprd run: | make mkdir -p $HOME/.dapr/bin/ cp dist/linux_amd64/release/daprd $HOME/.dapr/bin/daprd - - name: Initialize Dapr runtime - run: | - dapr init - - name: Override placement service. + - name: Override placement service run: | docker stop dapr_placement ./dist/linux_amd64/release/placement --healthz-port 9091 & @@ -418,8 +418,7 @@ jobs: - name: Run E2E tests id: tests run: cd js-sdk && npm run test:e2e:all - - name: Run E2E test to show successful typescript build - id: typescript-build-test + - name: Run E2E test to show successful TypeScript build run: | cd js-sdk test/e2e/typescript-build npm install From f23c727c2a8abc52418f0049e12ba57eb2735f48 Mon Sep 17 00:00:00 2001 From: "Alessandro (Ale) Segala" <43508+ItalyPaleAle@users.noreply.github.com> Date: Thu, 18 May 2023 16:22:36 -0700 Subject: [PATCH 5/6] Convert Metadata and Shutdown APIs to universal (#6226) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Converted shutdown API to universal Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> * Convert Metadata and Shutdown APIs to universal Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> * Make GetActiveActorsCount returns the proto directly Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> * Addressed how this message is actually being used Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> * Fixed test failures Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> * Addressed review feedback Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> * Fixed failing unit tests Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> * Added E2E test for PUT metadata Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> * Changed per review feedback Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> * Reverted change of web server Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> * ๐Ÿงน Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> * Renamed id->appID and actor->actors in pkg/http too Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> * Fixed issues after merging master Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> * Fix conflicts after merge Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> --------- Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> Co-authored-by: Mukundan Sundararajan <65565396+mukundansundar@users.noreply.github.com> Co-authored-by: Artur Souza --- dapr/proto/runtime/v1/dapr.proto | 23 +- pkg/actors/actors.go | 17 +- pkg/actors/actors_mock.go | 9 +- pkg/actors/actors_test.go | 5 +- pkg/grpc/api.go | 208 +- pkg/grpc/api_actor_test.go | 51 +- pkg/grpc/api_daprinternal.go | 2 +- pkg/grpc/api_daprinternal_test.go | 25 +- pkg/grpc/api_test.go | 200 +- pkg/grpc/universalapi/api_metadata.go | 121 + pkg/grpc/universalapi/api_metadata_test.go | 110 + pkg/grpc/universalapi/api_shutdown.go | 29 + pkg/grpc/universalapi/api_shutdown_test.go | 47 + pkg/grpc/universalapi/universalapi.go | 17 +- pkg/http/api.go | 304 +-- pkg/http/api_metadata.go | 124 + pkg/http/api_shutdown.go | 38 + pkg/http/api_test.go | 203 +- pkg/http/universalapi.go | 6 +- pkg/messages/predefined.go | 6 +- pkg/proto/runtime/v1/dapr.pb.go | 2323 +++++++++-------- pkg/runtime/runtime.go | 4 +- pkg/runtime/runtime_test.go | 4 +- tests/apps/actorapp/app.go | 2 +- tests/apps/actorclientapp/app.go | 2 +- tests/apps/actorfeatures/app.go | 2 +- tests/apps/actorinvocationapp/app.go | 2 +- .../cmd/stateactor/service/server.go | 2 +- tests/apps/actorload/go.mod | 2 +- tests/apps/actorload/go.sum | 4 +- tests/apps/actorreentrancy/app.go | 2 +- tests/apps/actorstate/app.go | 2 +- tests/apps/binding_input/app.go | 2 +- tests/apps/binding_output/app.go | 2 +- tests/apps/configurationapp/app.go | 2 +- tests/apps/healthapp/app.go | 4 +- tests/apps/hellodapr/app.go | 2 +- tests/apps/injectorapp/app.go | 4 +- tests/apps/metadata/app.go | 136 +- tests/apps/middleware/app.go | 2 +- tests/apps/perf/actorfeatures/app.go | 2 +- tests/apps/pubsub-bulk-subscriber/app.go | 2 +- tests/apps/pubsub-publisher/app.go | 2 +- tests/apps/pubsub-subscriber-routing/app.go | 2 +- tests/apps/pubsub-subscriber/app.go | 2 +- tests/apps/resiliencyapp/app.go | 2 +- tests/apps/runtime/app.go | 2 +- tests/apps/secretapp/app.go | 2 +- tests/apps/service_invocation/app.go | 2 +- tests/apps/service_invocation_external/app.go | 2 +- .../app.go | 2 +- tests/apps/stateapp/app.go | 2 +- tests/apps/tracingapp/app.go | 2 +- tests/apps/utils/http-server.go | 3 +- tests/apps/utils/logger-middleware.go | 3 +- .../e2e/actor_features/actor_features_test.go | 8 +- tests/e2e/metadata/metadata_test.go | 33 +- tests/e2e/pubsub/pubsub_test.go | 13 +- 58 files changed, 2162 insertions(+), 1974 deletions(-) create mode 100644 pkg/grpc/universalapi/api_metadata.go create mode 100644 pkg/grpc/universalapi/api_metadata_test.go create mode 100644 pkg/grpc/universalapi/api_shutdown.go create mode 100644 pkg/grpc/universalapi/api_shutdown_test.go create mode 100644 pkg/http/api_metadata.go create mode 100644 pkg/http/api_shutdown.go diff --git a/dapr/proto/runtime/v1/dapr.proto b/dapr/proto/runtime/v1/dapr.proto index c6ca4054a5e..a0239dfcb6a 100644 --- a/dapr/proto/runtime/v1/dapr.proto +++ b/dapr/proto/runtime/v1/dapr.proto @@ -580,10 +580,11 @@ message InvokeActorResponse { // GetMetadataResponse is a message that is returned on GetMetadata rpc call message GetMetadataResponse { string id = 1; - repeated ActiveActorsCount active_actors_count = 2; - repeated RegisteredComponents registered_components = 3; - map extended_metadata = 4; - repeated PubsubSubscription subscriptions = 5; + repeated ActiveActorsCount active_actors_count = 2 [json_name = "actors"]; + repeated RegisteredComponents registered_components = 3 [json_name = "components"]; + map extended_metadata = 4 [json_name = "extended"]; + repeated PubsubSubscription subscriptions = 5 [json_name = "subscriptions"]; + repeated MetadataHTTPEndpoint http_endpoints = 6 [json_name = "httpEndpoints"]; } message ActiveActorsCount { @@ -598,12 +599,16 @@ message RegisteredComponents { repeated string capabilities = 4; } +message MetadataHTTPEndpoint { + string name = 1 [json_name = "name"]; +} + message PubsubSubscription { - string pubsub_name = 1; - string topic = 2; - map metadata = 3; - PubsubSubscriptionRules rules = 4; - string dead_letter_topic = 5; + string pubsub_name = 1 [json_name = "pubsubname"]; + string topic = 2 [json_name = "topic"]; + map metadata = 3 [json_name = "metadata"]; + PubsubSubscriptionRules rules = 4 [json_name = "rules"]; + string dead_letter_topic = 5 [json_name = "deadLetterTopic"]; } message PubsubSubscriptionRules { diff --git a/pkg/actors/actors.go b/pkg/actors/actors.go index cf57bd4d675..d3758fae202 100644 --- a/pkg/actors/actors.go +++ b/pkg/actors/actors.go @@ -49,6 +49,7 @@ import ( "github.com/dapr/dapr/pkg/modes" commonv1pb "github.com/dapr/dapr/pkg/proto/common/v1" internalv1pb "github.com/dapr/dapr/pkg/proto/internals/v1" + runtimev1pb "github.com/dapr/dapr/pkg/proto/runtime/v1" "github.com/dapr/dapr/pkg/resiliency" "github.com/dapr/dapr/pkg/retry" "github.com/dapr/dapr/pkg/runtime/compstore" @@ -82,7 +83,7 @@ type Actors interface { CreateTimer(ctx context.Context, req *CreateTimerRequest) error DeleteTimer(ctx context.Context, req *DeleteTimerRequest) error IsActorHosted(ctx context.Context, req *ActorHostedRequest) bool - GetActiveActorsCount(ctx context.Context) []ActiveActorsCount + GetActiveActorsCount(ctx context.Context) []*runtimev1pb.ActiveActorsCount RegisterInternalActor(ctx context.Context, actorType string, actor InternalActor) error } @@ -132,12 +133,6 @@ type actorsRuntime struct { internalActorChannel *internalActorChannel } -// ActiveActorsCount contain actorType and count of actors each type has. -type ActiveActorsCount struct { - Type string `json:"type"` - Count int `json:"count"` -} - // ActorMetadata represents information about the actor type. type ActorMetadata struct { ID string `json:"id"` @@ -1884,8 +1879,8 @@ func (a *actorsRuntime) RegisterInternalActor(ctx context.Context, actorType str return nil } -func (a *actorsRuntime) GetActiveActorsCount(ctx context.Context) []ActiveActorsCount { - actorCountMap := make(map[string]int, len(a.config.HostedActorTypes)) +func (a *actorsRuntime) GetActiveActorsCount(ctx context.Context) []*runtimev1pb.ActiveActorsCount { + actorCountMap := make(map[string]int32, len(a.config.HostedActorTypes)) for _, actorType := range a.config.HostedActorTypes { if !isInternalActor(actorType) { actorCountMap[actorType] = 0 @@ -1899,10 +1894,10 @@ func (a *actorsRuntime) GetActiveActorsCount(ctx context.Context) []ActiveActors return true }) - activeActorsCount := make([]ActiveActorsCount, len(actorCountMap)) + activeActorsCount := make([]*runtimev1pb.ActiveActorsCount, len(actorCountMap)) n := 0 for actorType, count := range actorCountMap { - activeActorsCount[n] = ActiveActorsCount{Type: actorType, Count: count} + activeActorsCount[n] = &runtimev1pb.ActiveActorsCount{Type: actorType, Count: count} n++ } diff --git a/pkg/actors/actors_mock.go b/pkg/actors/actors_mock.go index d3bf3bcc846..1c3c362b4cd 100644 --- a/pkg/actors/actors_mock.go +++ b/pkg/actors/actors_mock.go @@ -26,6 +26,7 @@ import ( "github.com/dapr/dapr/pkg/actors/reminders" invokev1 "github.com/dapr/dapr/pkg/messaging/v1" + runtimev1pb "github.com/dapr/dapr/pkg/proto/runtime/v1" daprt "github.com/dapr/dapr/pkg/testing" ) @@ -225,9 +226,9 @@ func (_m *MockActors) GetReminder(ctx context.Context, req *GetReminderRequest) } // GetActiveActorsCount provides a mock function -func (_m *MockActors) GetActiveActorsCount(ctx context.Context) []ActiveActorsCount { +func (_m *MockActors) GetActiveActorsCount(ctx context.Context) []*runtimev1pb.ActiveActorsCount { _m.Called() - return []ActiveActorsCount{ + return []*runtimev1pb.ActiveActorsCount{ { Type: "abcd", Count: 10, @@ -310,6 +311,6 @@ func (f *FailingActors) IsActorHosted(ctx context.Context, req *ActorHostedReque return true } -func (f *FailingActors) GetActiveActorsCount(ctx context.Context) []ActiveActorsCount { - return []ActiveActorsCount{} +func (f *FailingActors) GetActiveActorsCount(ctx context.Context) []*runtimev1pb.ActiveActorsCount { + return []*runtimev1pb.ActiveActorsCount{} } diff --git a/pkg/actors/actors_test.go b/pkg/actors/actors_test.go index 0369683ee09..15cdfc712e7 100644 --- a/pkg/actors/actors_test.go +++ b/pkg/actors/actors_test.go @@ -46,6 +46,7 @@ import ( "github.com/dapr/dapr/pkg/health" invokev1 "github.com/dapr/dapr/pkg/messaging/v1" "github.com/dapr/dapr/pkg/modes" + runtimev1pb "github.com/dapr/dapr/pkg/proto/runtime/v1" "github.com/dapr/dapr/pkg/resiliency" "github.com/dapr/dapr/pkg/runtime/compstore" daprt "github.com/dapr/dapr/pkg/testing" @@ -2672,7 +2673,7 @@ func TestGetOrCreateActor(t *testing.T) { func TestActiveActorsCount(t *testing.T) { ctx := context.Background() t.Run("Actors Count", func(t *testing.T) { - expectedCounts := []ActiveActorsCount{{Type: "cat", Count: 2}, {Type: "dog", Count: 1}} + expectedCounts := []*runtimev1pb.ActiveActorsCount{{Type: "cat", Count: 2}, {Type: "dog", Count: 1}} testActorsRuntime := newTestActorsRuntime() defer testActorsRuntime.Stop() @@ -2686,7 +2687,7 @@ func TestActiveActorsCount(t *testing.T) { }) t.Run("Actors Count empty", func(t *testing.T) { - expectedCounts := []ActiveActorsCount{} + expectedCounts := []*runtimev1pb.ActiveActorsCount{} testActorsRuntime := newTestActorsRuntime() defer testActorsRuntime.Stop() diff --git a/pkg/grpc/api.go b/pkg/grpc/api.go index 121edb92ece..34a2d13d8a3 100644 --- a/pkg/grpc/api.go +++ b/pkg/grpc/api.go @@ -20,7 +20,6 @@ import ( "fmt" "sort" "strconv" - "sync" "sync/atomic" "time" @@ -37,7 +36,6 @@ import ( "github.com/dapr/components-contrib/pubsub" "github.com/dapr/components-contrib/state" "github.com/dapr/dapr/pkg/actors" - "github.com/dapr/dapr/pkg/buildinfo" "github.com/dapr/dapr/pkg/channel" stateLoader "github.com/dapr/dapr/pkg/components/state" "github.com/dapr/dapr/pkg/config" @@ -59,10 +57,7 @@ import ( "github.com/dapr/dapr/utils" ) -const ( - daprHTTPStatusHeader = "dapr-http-status" - daprRuntimeVersionKey = "daprRuntimeVersion" -) +const daprHTTPStatusHeader = "dapr-http-status" // API is the gRPC interface for the Dapr gRPC API. It implements both the internal and external proto definitions. type API interface { @@ -80,20 +75,14 @@ type API interface { type api struct { *universalapi.UniversalAPI - actor actors.Actors - directMessaging messaging.DirectMessaging - appChannel channel.AppChannel - resiliency resiliency.Provider - pubsubAdapter runtimePubsub.Adapter - id string - sendToOutputBindingFn func(name string, req *bindings.InvokeRequest) (*bindings.InvokeResponse, error) - tracingSpec config.TracingSpec - accessControlList *config.AccessControlList - appProtocolIsHTTP bool - extendedMetadata sync.Map - getComponentsCapabilitesFn func() map[string][]string - shutdown func() - daprRunTimeVersion string + directMessaging messaging.DirectMessaging + appChannel channel.AppChannel + resiliency resiliency.Provider + pubsubAdapter runtimePubsub.Adapter + sendToOutputBindingFn func(name string, req *bindings.InvokeRequest) (*bindings.InvokeResponse, error) + tracingSpec config.TracingSpec + accessControlList *config.AccessControlList + appProtocolIsHTTP bool } // APIOpts contains options for NewAPI. @@ -104,7 +93,7 @@ type APIOpts struct { CompStore *compstore.ComponentStore PubsubAdapter runtimePubsub.Adapter DirectMessaging messaging.DirectMessaging - Actor actors.Actors + Actors actors.Actors SendToOutputBindingFn func(name string, req *bindings.InvokeRequest) (*bindings.InvokeResponse, error) TracingSpec config.TracingSpec AccessControlList *config.AccessControlList @@ -117,24 +106,22 @@ type APIOpts struct { func NewAPI(opts APIOpts) API { return &api{ UniversalAPI: &universalapi.UniversalAPI{ - AppID: opts.AppID, - Logger: apiServerLogger, - Resiliency: opts.Resiliency, - CompStore: opts.CompStore, + AppID: opts.AppID, + Logger: apiServerLogger, + Resiliency: opts.Resiliency, + Actors: opts.Actors, + CompStore: opts.CompStore, + ShutdownFn: opts.Shutdown, + GetComponentsCapabilitesFn: opts.GetComponentsCapabilitiesFn, }, - directMessaging: opts.DirectMessaging, - actor: opts.Actor, - id: opts.AppID, - resiliency: opts.Resiliency, - appChannel: opts.AppChannel, - pubsubAdapter: opts.PubsubAdapter, - sendToOutputBindingFn: opts.SendToOutputBindingFn, - tracingSpec: opts.TracingSpec, - accessControlList: opts.AccessControlList, - appProtocolIsHTTP: opts.AppProtocolIsHTTP, - shutdown: opts.Shutdown, - getComponentsCapabilitesFn: opts.GetComponentsCapabilitiesFn, - daprRunTimeVersion: buildinfo.Version(), + directMessaging: opts.DirectMessaging, + resiliency: opts.Resiliency, + appChannel: opts.AppChannel, + pubsubAdapter: opts.PubsubAdapter, + sendToOutputBindingFn: opts.SendToOutputBindingFn, + tracingSpec: opts.TracingSpec, + accessControlList: opts.AccessControlList, + appProtocolIsHTTP: opts.AppProtocolIsHTTP, } } @@ -160,7 +147,7 @@ func (a *api) validateAndGetPubsubAndTopic(pubsubName, topic string, reqMeta map rawPayload, metaErr := contribMetadata.IsRawPayload(reqMeta) if metaErr != nil { - return nil, "", "", false, status.Errorf(codes.InvalidArgument, messages.ErrMetadataGet, metaErr.Error()) + return nil, "", "", false, messages.ErrPubSubMetadataDeserialize.WithFormat(metaErr) } return thepubsub, pubsubName, topic, rawPayload, nil @@ -188,7 +175,7 @@ func (a *api) PublishEvent(ctx context.Context, in *runtimev1pb.PublishEventRequ if !rawPayload { envelope, err := runtimePubsub.NewCloudEvent(&runtimePubsub.CloudEvent{ - Source: a.id, + Source: a.UniversalAPI.AppID, Topic: in.Topic, DataContentType: in.DataContentType, Data: body, @@ -396,7 +383,7 @@ func (a *api) BulkPublishEventAlpha1(ctx context.Context, in *runtimev1pb.BulkPu spanMap[i] = childSpan envelope, err := runtimePubsub.NewCloudEvent(&runtimePubsub.CloudEvent{ - Source: a.id, + Source: a.UniversalAPI.AppID, Topic: topic, DataContentType: entries[i].ContentType, Data: entries[i].Event, @@ -530,7 +517,7 @@ func (a *api) GetBulkState(ctx context.Context, in *runtimev1pb.GetBulkStateRequ var key string reqs := make([]state.GetRequest, len(in.Keys)) for i, k := range in.Keys { - key, err = stateLoader.GetModifiedStateKey(k, in.StoreName, a.id) + key, err = stateLoader.GetModifiedStateKey(k, in.StoreName, a.UniversalAPI.AppID) if err != nil { return &runtimev1pb.GetBulkStateResponse{}, err } @@ -613,7 +600,7 @@ func (a *api) GetState(ctx context.Context, in *runtimev1pb.GetStateRequest) (*r // Error has already been logged return &runtimev1pb.GetStateResponse{}, err } - key, err := stateLoader.GetModifiedStateKey(in.Key, in.StoreName, a.id) + key, err := stateLoader.GetModifiedStateKey(in.Key, in.StoreName, a.UniversalAPI.AppID) if err != nil { return &runtimev1pb.GetStateResponse{}, err } @@ -682,7 +669,7 @@ func (a *api) SaveState(ctx context.Context, in *runtimev1pb.SaveStateRequest) ( reqs := make([]state.SetRequest, l) for i, s := range in.States { var key string - key, err = stateLoader.GetModifiedStateKey(s.Key, in.StoreName, a.id) + key, err = stateLoader.GetModifiedStateKey(s.Key, in.StoreName, a.UniversalAPI.AppID) if err != nil { return empty, err } @@ -770,7 +757,7 @@ func (a *api) DeleteState(ctx context.Context, in *runtimev1pb.DeleteStateReques return empty, err } - key, err := stateLoader.GetModifiedStateKey(in.Key, in.StoreName, a.id) + key, err := stateLoader.GetModifiedStateKey(in.Key, in.StoreName, a.UniversalAPI.AppID) if err != nil { return empty, err } @@ -818,7 +805,7 @@ func (a *api) DeleteBulkState(ctx context.Context, in *runtimev1pb.DeleteBulkSta reqs := make([]state.DeleteRequest, 0, len(in.States)) for _, item := range in.States { - key, err1 := stateLoader.GetModifiedStateKey(item.Key, in.StoreName, a.id) + key, err1 := stateLoader.GetModifiedStateKey(item.Key, in.StoreName, a.UniversalAPI.AppID) if err1 != nil { return empty, err1 } @@ -882,7 +869,7 @@ func (a *api) ExecuteStateTransaction(ctx context.Context, in *runtimev1pb.Execu req := inputReq.Request hasEtag, etag := extractEtag(req) - key, err := stateLoader.GetModifiedStateKey(req.Key, in.StoreName, a.id) + key, err := stateLoader.GetModifiedStateKey(req.Key, in.StoreName, a.UniversalAPI.AppID) if err != nil { return &emptypb.Empty{}, err } @@ -976,7 +963,7 @@ func (a *api) ExecuteStateTransaction(ctx context.Context, in *runtimev1pb.Execu } func (a *api) RegisterActorTimer(ctx context.Context, in *runtimev1pb.RegisterActorTimerRequest) (*emptypb.Empty, error) { - if a.actor == nil { + if a.UniversalAPI.Actors == nil { err := status.Errorf(codes.Internal, messages.ErrActorRuntimeNotFound) apiServerLogger.Debug(err) return &emptypb.Empty{}, err @@ -999,12 +986,12 @@ func (a *api) RegisterActorTimer(ctx context.Context, in *runtimev1pb.RegisterAc } req.Data = j } - err := a.actor.CreateTimer(ctx, req) + err := a.UniversalAPI.Actors.CreateTimer(ctx, req) return &emptypb.Empty{}, err } func (a *api) UnregisterActorTimer(ctx context.Context, in *runtimev1pb.UnregisterActorTimerRequest) (*emptypb.Empty, error) { - if a.actor == nil { + if a.UniversalAPI.Actors == nil { err := status.Errorf(codes.Internal, messages.ErrActorRuntimeNotFound) apiServerLogger.Debug(err) return &emptypb.Empty{}, err @@ -1016,12 +1003,12 @@ func (a *api) UnregisterActorTimer(ctx context.Context, in *runtimev1pb.Unregist ActorType: in.ActorType, } - err := a.actor.DeleteTimer(ctx, req) + err := a.UniversalAPI.Actors.DeleteTimer(ctx, req) return &emptypb.Empty{}, err } func (a *api) RegisterActorReminder(ctx context.Context, in *runtimev1pb.RegisterActorReminderRequest) (*emptypb.Empty, error) { - if a.actor == nil { + if a.UniversalAPI.Actors == nil { err := status.Errorf(codes.Internal, messages.ErrActorRuntimeNotFound) apiServerLogger.Debug(err) return &emptypb.Empty{}, err @@ -1043,12 +1030,12 @@ func (a *api) RegisterActorReminder(ctx context.Context, in *runtimev1pb.Registe } req.Data = j } - err := a.actor.CreateReminder(ctx, req) + err := a.UniversalAPI.Actors.CreateReminder(ctx, req) return &emptypb.Empty{}, err } func (a *api) UnregisterActorReminder(ctx context.Context, in *runtimev1pb.UnregisterActorReminderRequest) (*emptypb.Empty, error) { - if a.actor == nil { + if a.UniversalAPI.Actors == nil { err := status.Errorf(codes.Internal, messages.ErrActorRuntimeNotFound) apiServerLogger.Debug(err) return &emptypb.Empty{}, err @@ -1060,12 +1047,12 @@ func (a *api) UnregisterActorReminder(ctx context.Context, in *runtimev1pb.Unreg ActorType: in.ActorType, } - err := a.actor.DeleteReminder(ctx, req) + err := a.UniversalAPI.Actors.DeleteReminder(ctx, req) return &emptypb.Empty{}, err } func (a *api) RenameActorReminder(ctx context.Context, in *runtimev1pb.RenameActorReminderRequest) (*emptypb.Empty, error) { - if a.actor == nil { + if a.UniversalAPI.Actors == nil { err := status.Errorf(codes.Internal, messages.ErrActorRuntimeNotFound) apiServerLogger.Debug(err) return &emptypb.Empty{}, err @@ -1078,12 +1065,12 @@ func (a *api) RenameActorReminder(ctx context.Context, in *runtimev1pb.RenameAct NewName: in.NewName, } - err := a.actor.RenameReminder(ctx, req) + err := a.UniversalAPI.Actors.RenameReminder(ctx, req) return &emptypb.Empty{}, err } func (a *api) GetActorState(ctx context.Context, in *runtimev1pb.GetActorStateRequest) (*runtimev1pb.GetActorStateResponse, error) { - if a.actor == nil { + if a.UniversalAPI.Actors == nil { err := status.Errorf(codes.Internal, messages.ErrActorRuntimeNotFound) apiServerLogger.Debug(err) return nil, err @@ -1093,7 +1080,7 @@ func (a *api) GetActorState(ctx context.Context, in *runtimev1pb.GetActorStateRe actorID := in.ActorId key := in.Key - hosted := a.actor.IsActorHosted(ctx, &actors.ActorHostedRequest{ + hosted := a.UniversalAPI.Actors.IsActorHosted(ctx, &actors.ActorHostedRequest{ ActorType: actorType, ActorID: actorID, }) @@ -1110,7 +1097,7 @@ func (a *api) GetActorState(ctx context.Context, in *runtimev1pb.GetActorStateRe Key: key, } - resp, err := a.actor.GetState(ctx, &req) + resp, err := a.UniversalAPI.Actors.GetState(ctx, &req) if err != nil { err = status.Errorf(codes.Internal, fmt.Sprintf(messages.ErrActorStateGet, err)) apiServerLogger.Debug(err) @@ -1123,7 +1110,7 @@ func (a *api) GetActorState(ctx context.Context, in *runtimev1pb.GetActorStateRe } func (a *api) ExecuteActorStateTransaction(ctx context.Context, in *runtimev1pb.ExecuteActorStateTransactionRequest) (*emptypb.Empty, error) { - if a.actor == nil { + if a.UniversalAPI.Actors == nil { err := status.Errorf(codes.Internal, messages.ErrActorRuntimeNotFound) apiServerLogger.Debug(err) return &emptypb.Empty{}, err @@ -1170,7 +1157,7 @@ func (a *api) ExecuteActorStateTransaction(ctx context.Context, in *runtimev1pb. actorOps = append(actorOps, actorOp) } - hosted := a.actor.IsActorHosted(ctx, &actors.ActorHostedRequest{ + hosted := a.UniversalAPI.Actors.IsActorHosted(ctx, &actors.ActorHostedRequest{ ActorType: actorType, ActorID: actorID, }) @@ -1187,7 +1174,7 @@ func (a *api) ExecuteActorStateTransaction(ctx context.Context, in *runtimev1pb. Operations: actorOps, } - err := a.actor.TransactionalStateOperation(ctx, &req) + err := a.UniversalAPI.Actors.TransactionalStateOperation(ctx, &req) if err != nil { err = status.Errorf(codes.Internal, fmt.Sprintf(messages.ErrActorStateTransactionSave, err)) apiServerLogger.Debug(err) @@ -1200,7 +1187,7 @@ func (a *api) ExecuteActorStateTransaction(ctx context.Context, in *runtimev1pb. func (a *api) InvokeActor(ctx context.Context, in *runtimev1pb.InvokeActorRequest) (*runtimev1pb.InvokeActorResponse, error) { response := &runtimev1pb.InvokeActorResponse{} - if a.actor == nil { + if a.UniversalAPI.Actors == nil { err := status.Errorf(codes.Internal, messages.ErrActorRuntimeNotFound) apiServerLogger.Debug(err) return response, err @@ -1234,7 +1221,7 @@ func (a *api) InvokeActor(ctx context.Context, in *runtimev1pb.InvokeActorReques }, ) resp, err := policyRunner(func(ctx context.Context) (*invokev1.InvokeMethodResponse, error) { - return a.actor.Call(ctx, req) + return a.UniversalAPI.Actors.Call(ctx, req) }) if err != nil && !errors.Is(err, actors.ErrDaprResponseHeader) { err = status.Errorf(codes.Internal, messages.ErrActorInvoke, err) @@ -1263,96 +1250,7 @@ func (a *api) SetDirectMessaging(directMessaging messaging.DirectMessaging) { } func (a *api) SetActorRuntime(actor actors.Actors) { - a.actor = actor -} - -func (a *api) GetMetadata(ctx context.Context, in *emptypb.Empty) (*runtimev1pb.GetMetadataResponse, error) { - extendedMetadata := make(map[string]string) - // Copy synchronously so it can be serialized to JSON. - a.extendedMetadata.Range(func(key, value interface{}) bool { - extendedMetadata[key.(string)] = value.(string) - return true - }) - extendedMetadata[daprRuntimeVersionKey] = a.daprRunTimeVersion - - activeActorsCount := []*runtimev1pb.ActiveActorsCount{} - if a.actor != nil { - for _, actorTypeCount := range a.actor.GetActiveActorsCount(ctx) { - activeActorsCount = append(activeActorsCount, &runtimev1pb.ActiveActorsCount{ - Type: actorTypeCount.Type, - Count: int32(actorTypeCount.Count), - }) - } - } - - components := a.CompStore.ListComponents() - registeredComponents := make([]*runtimev1pb.RegisteredComponents, 0, len(components)) - componentsCapabilities := a.getComponentsCapabilitesFn() - for _, comp := range components { - registeredComp := &runtimev1pb.RegisteredComponents{ - Name: comp.Name, - Version: comp.Spec.Version, - Type: comp.Spec.Type, - Capabilities: getOrDefaultCapabilities(componentsCapabilities, comp.Name), - } - registeredComponents = append(registeredComponents, registeredComp) - } - - ps := []*runtimev1pb.PubsubSubscription{} - for _, s := range a.CompStore.ListSubscriptions() { - ps = append(ps, &runtimev1pb.PubsubSubscription{ - PubsubName: s.PubsubName, - Topic: s.Topic, - Metadata: s.Metadata, - DeadLetterTopic: s.DeadLetterTopic, - Rules: convertPubsubSubscriptionRules(s.Rules), - }) - } - - response := &runtimev1pb.GetMetadataResponse{ - Id: a.id, - ExtendedMetadata: extendedMetadata, - RegisteredComponents: registeredComponents, - ActiveActorsCount: activeActorsCount, - Subscriptions: ps, - } - - return response, nil -} - -func getOrDefaultCapabilities(dict map[string][]string, key string) []string { - if val, ok := dict[key]; ok { - return val - } - return make([]string, 0) -} - -func convertPubsubSubscriptionRules(rules []*runtimePubsub.Rule) *runtimev1pb.PubsubSubscriptionRules { - out := &runtimev1pb.PubsubSubscriptionRules{ - Rules: make([]*runtimev1pb.PubsubSubscriptionRule, 0), - } - for _, r := range rules { - out.Rules = append(out.Rules, &runtimev1pb.PubsubSubscriptionRule{ - Match: fmt.Sprintf("%s", r.Match), - Path: r.Path, - }) - } - return out -} - -// SetMetadata Sets value in extended metadata of the sidecar. -func (a *api) SetMetadata(ctx context.Context, in *runtimev1pb.SetMetadataRequest) (*emptypb.Empty, error) { - a.extendedMetadata.Store(in.Key, in.Value) - return &emptypb.Empty{}, nil -} - -// Shutdown the sidecar. -func (a *api) Shutdown(ctx context.Context, in *emptypb.Empty) (*emptypb.Empty, error) { - go func() { - <-ctx.Done() - a.shutdown() - }() - return &emptypb.Empty{}, nil + a.UniversalAPI.Actors = actor } func stringValueOrEmpty(value *string) string { diff --git a/pkg/grpc/api_actor_test.go b/pkg/grpc/api_actor_test.go index be26d18f9ec..b4647cd41cc 100644 --- a/pkg/grpc/api_actor_test.go +++ b/pkg/grpc/api_actor_test.go @@ -24,6 +24,7 @@ import ( "github.com/dapr/dapr/pkg/actors" "github.com/dapr/dapr/pkg/apis/resiliency/v1alpha1" + "github.com/dapr/dapr/pkg/grpc/universalapi" runtimev1pb "github.com/dapr/dapr/pkg/proto/runtime/v1" "github.com/dapr/dapr/pkg/resiliency" daprt "github.com/dapr/dapr/pkg/testing" @@ -56,7 +57,9 @@ var testActorResiliency = &v1alpha1.Resiliency{ func TestRegisterActorReminder(t *testing.T) { t.Run("actors not initialized", func(t *testing.T) { server, lis := startDaprAPIServer(&api{ - id: "fakeAPI", + UniversalAPI: &universalapi.UniversalAPI{ + AppID: "fakeAPI", + }, }, "") defer server.Stop() @@ -72,7 +75,9 @@ func TestRegisterActorReminder(t *testing.T) { func TestUnregisterActorTimer(t *testing.T) { t.Run("actors not initialized", func(t *testing.T) { server, lis := startDaprAPIServer(&api{ - id: "fakeAPI", + UniversalAPI: &universalapi.UniversalAPI{ + AppID: "fakeAPI", + }, }, "") defer server.Stop() @@ -88,7 +93,9 @@ func TestUnregisterActorTimer(t *testing.T) { func TestRegisterActorTimer(t *testing.T) { t.Run("actors not initialized", func(t *testing.T) { server, lis := startDaprAPIServer(&api{ - id: "fakeAPI", + UniversalAPI: &universalapi.UniversalAPI{ + AppID: "fakeAPI", + }, }, "") defer server.Stop() @@ -104,7 +111,9 @@ func TestRegisterActorTimer(t *testing.T) { func TestGetActorState(t *testing.T) { t.Run("actors not initialized", func(t *testing.T) { server, lis := startDaprAPIServer(&api{ - id: "fakeAPI", + UniversalAPI: &universalapi.UniversalAPI{ + AppID: "fakeAPI", + }, }, "") defer server.Stop() @@ -133,8 +142,10 @@ func TestGetActorState(t *testing.T) { }).Return(true) server, lis := startDaprAPIServer(&api{ - id: "fakeAPI", - actor: mockActors, + UniversalAPI: &universalapi.UniversalAPI{ + AppID: "fakeAPI", + Actors: mockActors, + }, }, "") defer server.Stop() @@ -160,7 +171,9 @@ func TestGetActorState(t *testing.T) { func TestExecuteActorStateTransaction(t *testing.T) { t.Run("actors not initialized", func(t *testing.T) { server, lis := startDaprAPIServer(&api{ - id: "fakeAPI", + UniversalAPI: &universalapi.UniversalAPI{ + AppID: "fakeAPI", + }, }, "") defer server.Stop() @@ -204,8 +217,10 @@ func TestExecuteActorStateTransaction(t *testing.T) { }).Return(true) server, lis := startDaprAPIServer(&api{ - id: "fakeAPI", - actor: mockActors, + UniversalAPI: &universalapi.UniversalAPI{ + AppID: "fakeAPI", + Actors: mockActors, + }, }, "") defer server.Stop() @@ -246,7 +261,9 @@ func TestExecuteActorStateTransaction(t *testing.T) { func TestUnregisterActorReminder(t *testing.T) { t.Run("actors not initialized", func(t *testing.T) { server, lis := startDaprAPIServer(&api{ - id: "fakeAPI", + UniversalAPI: &universalapi.UniversalAPI{ + AppID: "fakeAPI", + }, }, "") defer server.Stop() @@ -262,7 +279,9 @@ func TestUnregisterActorReminder(t *testing.T) { func TestInvokeActor(t *testing.T) { t.Run("actors not initialized", func(t *testing.T) { server, lis := startDaprAPIServer(&api{ - id: "fakeAPI", + UniversalAPI: &universalapi.UniversalAPI{ + AppID: "fakeAPI", + }, }, "") defer server.Stop() @@ -286,10 +305,14 @@ func TestInvokeActorWithResiliency(t *testing.T) { ), } + rs := resiliency.FromConfigurations(logger.NewLogger("grpc.api.test"), testActorResiliency) server, lis := startDaprAPIServer(&api{ - id: "fakeAPI", - actor: &failingActors, - resiliency: resiliency.FromConfigurations(logger.NewLogger("grpc.api.test"), testActorResiliency), + UniversalAPI: &universalapi.UniversalAPI{ + AppID: "fakeAPI", + Actors: &failingActors, + Resiliency: rs, + }, + resiliency: rs, }, "") defer server.Stop() diff --git a/pkg/grpc/api_daprinternal.go b/pkg/grpc/api_daprinternal.go index ff7cbedb359..200204122b0 100644 --- a/pkg/grpc/api_daprinternal.go +++ b/pkg/grpc/api_daprinternal.go @@ -246,7 +246,7 @@ func (a *api) CallActor(ctx context.Context, in *internalv1pb.InternalInvokeRequ defer req.Close() // We don't do resiliency here as it is handled in the API layer. See InvokeActor(). - resp, err := a.actor.Call(ctx, req) + resp, err := a.Actors.Call(ctx, req) if err != nil { // We have to remove the error to keep the body, so callers must re-inspect for the header in the actual response. if resp != nil && errors.Is(err, actors.ErrDaprResponseHeader) { diff --git a/pkg/grpc/api_daprinternal_test.go b/pkg/grpc/api_daprinternal_test.go index c3c7cb8c22d..4c1fc94d03c 100644 --- a/pkg/grpc/api_daprinternal_test.go +++ b/pkg/grpc/api_daprinternal_test.go @@ -24,6 +24,7 @@ import ( "google.golang.org/grpc/status" channelt "github.com/dapr/dapr/pkg/channel/testing" + "github.com/dapr/dapr/pkg/grpc/universalapi" invokev1 "github.com/dapr/dapr/pkg/messaging/v1" commonv1pb "github.com/dapr/dapr/pkg/proto/common/v1" internalv1pb "github.com/dapr/dapr/pkg/proto/internals/v1" @@ -32,7 +33,9 @@ import ( func TestCallLocal(t *testing.T) { t.Run("appchannel is not ready", func(t *testing.T) { fakeAPI := &api{ - id: "fakeAPI", + UniversalAPI: &universalapi.UniversalAPI{ + AppID: "fakeAPI", + }, appChannel: nil, } server, lis := startInternalServer(fakeAPI) @@ -51,7 +54,9 @@ func TestCallLocal(t *testing.T) { t.Run("parsing InternalInvokeRequest is failed", func(t *testing.T) { mockAppChannel := new(channelt.MockAppChannel) fakeAPI := &api{ - id: "fakeAPI", + UniversalAPI: &universalapi.UniversalAPI{ + AppID: "fakeAPI", + }, appChannel: mockAppChannel, } server, lis := startInternalServer(fakeAPI) @@ -75,7 +80,9 @@ func TestCallLocal(t *testing.T) { mock.AnythingOfType("*v1.InvokeMethodRequest"), ).Return(nil, status.Error(codes.Unknown, "unknown error")) fakeAPI := &api{ - id: "fakeAPI", + UniversalAPI: &universalapi.UniversalAPI{ + AppID: "fakeAPI", + }, appChannel: mockAppChannel, } server, lis := startInternalServer(fakeAPI) @@ -95,7 +102,9 @@ func TestCallLocal(t *testing.T) { func TestCallLocalStream(t *testing.T) { t.Run("appchannel is not ready", func(t *testing.T) { fakeAPI := &api{ - id: "fakeAPI", + UniversalAPI: &universalapi.UniversalAPI{ + AppID: "fakeAPI", + }, appChannel: nil, } server, lis := startInternalServer(fakeAPI) @@ -123,7 +132,9 @@ func TestCallLocalStream(t *testing.T) { t.Run("parsing InternalInvokeRequest is failed", func(t *testing.T) { mockAppChannel := new(channelt.MockAppChannel) fakeAPI := &api{ - id: "fakeAPI", + UniversalAPI: &universalapi.UniversalAPI{ + AppID: "fakeAPI", + }, appChannel: mockAppChannel, } server, lis := startInternalServer(fakeAPI) @@ -158,7 +169,9 @@ func TestCallLocalStream(t *testing.T) { ). Return(nil, status.Error(codes.Unknown, "unknown error")) fakeAPI := &api{ - id: "fakeAPI", + UniversalAPI: &universalapi.UniversalAPI{ + AppID: "fakeAPI", + }, appChannel: mockAppChannel, } server, lis := startInternalServer(fakeAPI) diff --git a/pkg/grpc/api_test.go b/pkg/grpc/api_test.go index e7eb7c3c661..f378011ace7 100644 --- a/pkg/grpc/api_test.go +++ b/pkg/grpc/api_test.go @@ -46,15 +46,12 @@ import ( "github.com/dapr/components-contrib/pubsub" "github.com/dapr/components-contrib/secretstores" "github.com/dapr/components-contrib/state" - "github.com/dapr/dapr/pkg/actors" - componentsV1alpha "github.com/dapr/dapr/pkg/apis/components/v1alpha1" "github.com/dapr/dapr/pkg/apis/resiliency/v1alpha1" stateLoader "github.com/dapr/dapr/pkg/components/state" "github.com/dapr/dapr/pkg/config" diag "github.com/dapr/dapr/pkg/diagnostics" diagUtils "github.com/dapr/dapr/pkg/diagnostics/utils" "github.com/dapr/dapr/pkg/encryption" - "github.com/dapr/dapr/pkg/expr" "github.com/dapr/dapr/pkg/grpc/metadata" "github.com/dapr/dapr/pkg/grpc/universalapi" "github.com/dapr/dapr/pkg/messages" @@ -360,7 +357,9 @@ func TestAPIToken(t *testing.T) { // Setup Dapr API server fakeAPI := &api{ - id: "fakeAPI", + UniversalAPI: &universalapi.UniversalAPI{ + AppID: "fakeAPI", + }, directMessaging: mockDirectMessaging, resiliency: resiliency.New(nil), } @@ -569,7 +568,9 @@ func TestInvokeServiceFromHTTPResponse(t *testing.T) { // Setup Dapr API server fakeAPI := &api{ - id: "fakeAPI", + UniversalAPI: &universalapi.UniversalAPI{ + AppID: "fakeAPI", + }, directMessaging: mockDirectMessaging, resiliency: resiliency.New(nil), } @@ -674,7 +675,9 @@ func TestInvokeServiceFromGRPCResponse(t *testing.T) { // Setup Dapr API server fakeAPI := &api{ - id: "fakeAPI", + UniversalAPI: &universalapi.UniversalAPI{ + AppID: "fakeAPI", + }, directMessaging: mockDirectMessaging, resiliency: resiliency.New(nil), } @@ -739,9 +742,9 @@ func TestSecretStoreNotConfigured(t *testing.T) { server, lis := startDaprAPIServer(&api{ UniversalAPI: &universalapi.UniversalAPI{ Logger: logger.NewLogger("grpc.api.test"), + AppID: "fakeAPI", CompStore: compstore.New(), }, - id: "fakeAPI", }, "") defer server.Stop() @@ -864,11 +867,11 @@ func TestGetSecret(t *testing.T) { // Setup Dapr API server fakeAPI := &api{ UniversalAPI: &universalapi.UniversalAPI{ + AppID: "fakeAPI", Logger: logger.NewLogger("grpc.api.test"), Resiliency: resiliency.New(nil), CompStore: compStore, }, - id: "fakeAPI", } // Run test server server, lis := startDaprAPIServer(fakeAPI, "") @@ -941,11 +944,11 @@ func TestGetBulkSecret(t *testing.T) { // Setup Dapr API server fakeAPI := &api{ UniversalAPI: &universalapi.UniversalAPI{ + AppID: "fakeAPI", Logger: logger.NewLogger("grpc.api.test"), Resiliency: resiliency.New(nil), CompStore: compStore, }, - id: "fakeAPI", } // Run test server server, lis := startDaprAPIServer(fakeAPI, "") @@ -978,12 +981,11 @@ func TestGetBulkSecret(t *testing.T) { func TestGetStateWhenStoreNotConfigured(t *testing.T) { server, lis := startDaprAPIServer(&api{ - id: "fakeAPI", - resiliency: resiliency.New(nil), UniversalAPI: &universalapi.UniversalAPI{ AppID: "fakeAPI", CompStore: compstore.New(), }, + resiliency: resiliency.New(nil), }, "") defer server.Stop() @@ -1015,8 +1017,8 @@ func TestSaveState(t *testing.T) { // Setup dapr api server fakeAPI := &api{ - id: "fakeAPI", UniversalAPI: &universalapi.UniversalAPI{ + AppID: "fakeAPI", CompStore: compStore, }, resiliency: resiliency.New(nil), @@ -1109,8 +1111,8 @@ func TestGetState(t *testing.T) { // Setup dapr api server fakeAPI := &api{ - id: "fakeAPI", UniversalAPI: &universalapi.UniversalAPI{ + AppID: "fakeAPI", CompStore: compStore, }, resiliency: resiliency.New(nil), @@ -1223,8 +1225,8 @@ func TestGetConfiguration(t *testing.T) { compStore := compstore.New() compStore.AddConfiguration("store1", fakeConfigurationStore) fakeAPI := &api{ - id: "fakeAPI", UniversalAPI: &universalapi.UniversalAPI{ + AppID: "fakeAPI", CompStore: compStore, }, resiliency: resiliency.New(nil), @@ -1387,8 +1389,8 @@ func TestSubscribeConfiguration(t *testing.T) { // Setup dapr api server fakeAPI := &api{ - id: "fakeAPI", UniversalAPI: &universalapi.UniversalAPI{ + AppID: "fakeAPI", CompStore: compStore, }, resiliency: resiliency.New(nil), @@ -1603,8 +1605,8 @@ func TestUnSubscribeConfiguration(t *testing.T) { // Setup dapr api server fakeAPI := &api{ - id: "fakeAPI", UniversalAPI: &universalapi.UniversalAPI{ + AppID: "fakeAPI", CompStore: compStore, }, resiliency: resiliency.New(nil), @@ -1764,11 +1766,11 @@ func TestUnsubscribeConfigurationErrScenario(t *testing.T) { // Setup dapr api server fakeAPI := &api{ - id: "fakeAPI", - resiliency: resiliency.New(nil), UniversalAPI: &universalapi.UniversalAPI{ + AppID: "fakeAPI", CompStore: compStore, }, + resiliency: resiliency.New(nil), } server, lis := startDaprAPIServer(fakeAPI, "") defer server.Stop() @@ -1849,8 +1851,8 @@ func TestGetBulkState(t *testing.T) { // Setup dapr api server fakeAPI := &api{ - id: "fakeAPI", UniversalAPI: &universalapi.UniversalAPI{ + AppID: "fakeAPI", CompStore: compStore, }, resiliency: resiliency.New(nil), @@ -1970,7 +1972,6 @@ func TestDeleteState(t *testing.T) { // Setup dapr api server fakeAPI := &api{ - id: "fakeAPI", UniversalAPI: &universalapi.UniversalAPI{ AppID: "fakeAPI", CompStore: compStore, @@ -2035,6 +2036,9 @@ func TestDeleteState(t *testing.T) { func TestPublishTopic(t *testing.T) { srv := &api{ + UniversalAPI: &universalapi.UniversalAPI{ + AppID: "fakeAPI", + }, pubsubAdapter: &daprt.MockPubSubAdapter{ PublishFn: func(req *pubsub.PublishRequest) error { if req.Topic == "error-topic" { @@ -2229,6 +2233,9 @@ func TestPublishTopic(t *testing.T) { func TestBulkPublish(t *testing.T) { fakeAPI := &api{ + UniversalAPI: &universalapi.UniversalAPI{ + AppID: "fakeAPI", + }, pubsubAdapter: &daprt.MockPubSubAdapter{ GetPubSubFn: func(pubsubName string) pubsub.PubSub { mock := daprt.MockPubSub{} @@ -2329,37 +2336,6 @@ func TestBulkPublish(t *testing.T) { }) } -func TestShutdownEndpoints(t *testing.T) { - shutdownCh := make(chan struct{}) - m := mock.Mock{} - m.On("shutdown", mock.Anything).Return() - srv := &api{ - shutdown: func() { - m.MethodCalled("shutdown") - close(shutdownCh) - }, - } - server, lis := startTestServerAPI(srv) - defer server.Stop() - - clientConn := createTestClient(lis) - defer clientConn.Close() - - client := runtimev1pb.NewDaprClient(clientConn) - - t.Run("Shutdown successfully - 204", func(t *testing.T) { - _, err := client.Shutdown(context.Background(), &emptypb.Empty{}) - assert.NoError(t, err, "Expected no error") - select { - case <-time.After(time.Second): - t.Fatal("Did not shut down within 1 second") - case <-shutdownCh: - // All good - } - m.AssertCalled(t, "shutdown") - }) -} - func TestInvokeBinding(t *testing.T) { srv := &api{ sendToOutputBindingFn: func(name string, req *bindings.InvokeRequest) (*bindings.InvokeResponse, error) { @@ -2393,7 +2369,6 @@ func TestInvokeBinding(t *testing.T) { func TestTransactionStateStoreNotConfigured(t *testing.T) { server, lis := startDaprAPIServer(&api{ - id: "fakeAPI", UniversalAPI: &universalapi.UniversalAPI{ AppID: "fakeAPI", CompStore: compstore.New(), @@ -2413,7 +2388,6 @@ func TestTransactionStateStoreNotImplemented(t *testing.T) { compStore := compstore.New() compStore.AddStateStore("store1", &daprt.MockStateStore{}) server, lis := startDaprAPIServer(&api{ - id: "fakeAPI", UniversalAPI: &universalapi.UniversalAPI{ AppID: "fakeAPI", CompStore: compStore, @@ -2461,8 +2435,8 @@ func TestExecuteStateTransaction(t *testing.T) { // Setup dapr api server fakeAPI := &api{ - id: "fakeAPI", UniversalAPI: &universalapi.UniversalAPI{ + AppID: "fakeAPI", CompStore: compStore, }, resiliency: resiliency.New(nil), @@ -2548,105 +2522,6 @@ func TestExecuteStateTransaction(t *testing.T) { } } -func TestGetMetadata(t *testing.T) { - fakeComponent := componentsV1alpha.Component{} - fakeComponent.Name = "testComponent" - - mockActors := new(actors.MockActors) - mockActors.On("GetActiveActorsCount").Return(actors.ActiveActorsCount{ - Count: 10, - Type: "abcd", - }) - - compStore := compstore.New() - compStore.AddComponent(fakeComponent) - compStore.SetSubscriptions([]runtimePubsub.Subscription{ - { - PubsubName: "test", - Topic: "topic", - DeadLetterTopic: "dead", - Metadata: map[string]string{}, - Rules: []*runtimePubsub.Rule{ - { - Match: &expr.Expr{}, - Path: "path", - }, - }, - }, - }) - - fakeAPI := &api{ - id: "fakeAPI", - actor: mockActors, - UniversalAPI: &universalapi.UniversalAPI{ - CompStore: compStore, - }, - getComponentsCapabilitesFn: func() map[string][]string { - capsMap := make(map[string][]string) - capsMap["testComponent"] = []string{"mock.feat.testComponent"} - return capsMap - }, - } - fakeAPI.extendedMetadata.Store("testKey", "testValue") - server, lis := startDaprAPIServer(fakeAPI, "") - defer server.Stop() - - clientConn := createTestClient(lis) - defer clientConn.Close() - - client := runtimev1pb.NewDaprClient(clientConn) - response, err := client.GetMetadata(context.Background(), &emptypb.Empty{}) - assert.NoError(t, err, "Expected no error") - assert.Equal(t, response.Id, "fakeAPI") - assert.Len(t, response.RegisteredComponents, 1, "One component should be returned") - assert.Equal(t, response.RegisteredComponents[0].Name, "testComponent") - assert.Contains(t, response.ExtendedMetadata, "testKey") - assert.Equal(t, response.ExtendedMetadata["testKey"], "testValue") - assert.Len(t, response.RegisteredComponents[0].Capabilities, 1, "One capabilities should be returned") - assert.Equal(t, response.RegisteredComponents[0].Capabilities[0], "mock.feat.testComponent") - assert.Equal(t, response.GetActiveActorsCount()[0].Type, "abcd") - assert.Equal(t, response.GetActiveActorsCount()[0].Count, int32(10)) - assert.Len(t, response.Subscriptions, 1) - assert.Equal(t, response.Subscriptions[0].PubsubName, "test") - assert.Equal(t, response.Subscriptions[0].Topic, "topic") - assert.Equal(t, response.Subscriptions[0].DeadLetterTopic, "dead") - assert.Equal(t, response.Subscriptions[0].PubsubName, "test") - assert.Len(t, response.Subscriptions[0].Rules.Rules, 1) - assert.Equal(t, fmt.Sprintf("%s", response.Subscriptions[0].Rules.Rules[0].Match), "") - assert.Equal(t, response.Subscriptions[0].Rules.Rules[0].Path, "path") -} - -func TestSetMetadata(t *testing.T) { - fakeComponent := componentsV1alpha.Component{} - fakeComponent.Name = "testComponent" - fakeAPI := &api{ - id: "fakeAPI", - } - server, lis := startDaprAPIServer(fakeAPI, "") - defer server.Stop() - - clientConn := createTestClient(lis) - defer clientConn.Close() - - client := runtimev1pb.NewDaprClient(clientConn) - req := &runtimev1pb.SetMetadataRequest{ - Key: "testKey", - Value: "testValue", - } - _, err := client.SetMetadata(context.Background(), req) - assert.NoError(t, err, "Expected no error") - temp := make(map[string]string) - - // Copy synchronously so it can be serialized to JSON. - fakeAPI.extendedMetadata.Range(func(key, value interface{}) bool { - temp[key.(string)] = value.(string) - return true - }) - - assert.Contains(t, temp, "testKey") - assert.Equal(t, temp["testKey"], "testValue") -} - func TestStateStoreErrors(t *testing.T) { t.Run("save etag mismatch", func(t *testing.T) { a := &api{} @@ -2810,7 +2685,6 @@ func TestQueryState(t *testing.T) { compStore := compstore.New() compStore.AddStateStore("store1", fakeStore) server, lis := startTestServerAPI(&api{ - id: "fakeAPI", UniversalAPI: &universalapi.UniversalAPI{ AppID: "fakeAPI", Logger: logger.NewLogger("grpc.api.test"), @@ -2860,7 +2734,6 @@ func TestStateStoreQuerierNotImplemented(t *testing.T) { compStore.AddStateStore("store1", &daprt.MockStateStore{}) server, lis := startDaprAPIServer(&api{ - id: "fakeAPI", UniversalAPI: &universalapi.UniversalAPI{ Logger: logger.NewLogger("grpc.api.test"), CompStore: compStore, @@ -2885,7 +2758,6 @@ func TestStateStoreQuerierEncrypted(t *testing.T) { compStore := compstore.New() compStore.AddStateStore(storeName, &mockStateStoreQuerier{}) server, lis := startDaprAPIServer(&api{ - id: "fakeAPI", UniversalAPI: &universalapi.UniversalAPI{ AppID: "fakeAPI", Logger: logger.NewLogger("grpc.api.test"), @@ -2910,7 +2782,6 @@ func TestGetConfigurationAPI(t *testing.T) { compStore := compstore.New() compStore.AddConfiguration("store1", &mockConfigStore{}) server, lis := startDaprAPIServer(&api{ - id: "fakeAPI", UniversalAPI: &universalapi.UniversalAPI{ AppID: "fakeAPI", CompStore: compStore, @@ -2939,7 +2810,6 @@ func TestGetConfigurationAPI(t *testing.T) { compStore := compstore.New() compStore.AddConfiguration("store1", &mockConfigStore{}) server, lis := startDaprAPIServer(&api{ - id: "fakeAPI", UniversalAPI: &universalapi.UniversalAPI{ AppID: "fakeAPI", CompStore: compStore, @@ -2972,7 +2842,6 @@ func TestSubscribeConfigurationAPI(t *testing.T) { compStore.AddConfiguration("store1", &mockConfigStore{}) server, lis := startDaprAPIServer(&api{ - id: "fakeAPI", UniversalAPI: &universalapi.UniversalAPI{ AppID: "fakeAPI", CompStore: compStore, @@ -3019,7 +2888,6 @@ func TestSubscribeConfigurationAPI(t *testing.T) { compStore.AddConfiguration("store1", &mockConfigStore{}) server, lis := startDaprAPIServer(&api{ - id: "fakeAPI", UniversalAPI: &universalapi.UniversalAPI{ AppID: "fakeAPI", CompStore: compStore, @@ -3065,7 +2933,6 @@ func TestSubscribeConfigurationAPI(t *testing.T) { compStore := compstore.New() compStore.AddConfiguration("store1", &mockConfigStore{}) server, lis := startDaprAPIServer(&api{ - id: "fakeAPI", UniversalAPI: &universalapi.UniversalAPI{ AppID: "fakeAPI", CompStore: compStore, @@ -3109,7 +2976,6 @@ func TestSubscribeConfigurationAPI(t *testing.T) { compStore := compstore.New() compStore.AddConfiguration("store1", &mockConfigStore{}) server, lis := startDaprAPIServer(&api{ - id: "fakeAPI", UniversalAPI: &universalapi.UniversalAPI{ AppID: "fakeAPI", CompStore: compStore, @@ -3186,8 +3052,8 @@ func TestStateAPIWithResiliency(t *testing.T) { res := resiliency.FromConfigurations(logger.NewLogger("grpc.api.test"), testResiliency) fakeAPI := &api{ - id: "fakeAPI", UniversalAPI: &universalapi.UniversalAPI{ + AppID: "fakeAPI", Logger: logger.NewLogger("grpc.api.test"), CompStore: compStore, Resiliency: res, @@ -3420,8 +3286,8 @@ func TestConfigurationAPIWithResiliency(t *testing.T) { compStore.AddConfiguration("failConfig", &failingConfigStore) fakeAPI := &api{ - id: "fakeAPI", UniversalAPI: &universalapi.UniversalAPI{ + AppID: "fakeAPI", CompStore: compStore, }, resiliency: resiliency.FromConfigurations(logger.NewLogger("grpc.api.test"), testResiliency), @@ -3589,11 +3455,11 @@ func TestSecretAPIWithResiliency(t *testing.T) { // Setup Dapr API server fakeAPI := &api{ UniversalAPI: &universalapi.UniversalAPI{ + AppID: "fakeAPI", Logger: logger.NewLogger("grpc.api.test"), Resiliency: resiliency.FromConfigurations(logger.NewLogger("grpc.api.test"), testResiliency), CompStore: compStore, }, - id: "fakeAPI", } // Run test server server, lis := startDaprAPIServer(fakeAPI, "") @@ -3671,7 +3537,9 @@ func TestServiceInvocationWithResiliency(t *testing.T) { // Setup Dapr API server fakeAPI := &api{ - id: "fakeAPI", + UniversalAPI: &universalapi.UniversalAPI{ + AppID: "fakeAPI", + }, directMessaging: failingDirectMessaging, resiliency: resiliency.FromConfigurations(logger.NewLogger("grpc.api.test"), testResiliency), } diff --git a/pkg/grpc/universalapi/api_metadata.go b/pkg/grpc/universalapi/api_metadata.go new file mode 100644 index 00000000000..9a2d2fbe67c --- /dev/null +++ b/pkg/grpc/universalapi/api_metadata.go @@ -0,0 +1,121 @@ +/* +Copyright 2022 The Dapr Authors +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 universalapi + +import ( + "context" + "fmt" + + "google.golang.org/protobuf/types/known/emptypb" + + "github.com/dapr/dapr/pkg/buildinfo" + runtimev1pb "github.com/dapr/dapr/pkg/proto/runtime/v1" + runtimePubsub "github.com/dapr/dapr/pkg/runtime/pubsub" +) + +const daprRuntimeVersionKey = "daprRuntimeVersion" + +func (a *UniversalAPI) GetMetadata(ctx context.Context, in *emptypb.Empty) (*runtimev1pb.GetMetadataResponse, error) { + // Extended metadata + extendedMetadata := make(map[string]string, len(a.ExtendedMetadata)+1) + a.extendedMetadataLock.RLock() + for k, v := range a.ExtendedMetadata { + extendedMetadata[k] = v + } + a.extendedMetadataLock.RUnlock() + extendedMetadata[daprRuntimeVersionKey] = buildinfo.Version() + + // Active actors count + activeActorsCount := []*runtimev1pb.ActiveActorsCount{} + if a.Actors != nil { + activeActorsCount = a.Actors.GetActiveActorsCount(ctx) + } + + // Components + components := a.CompStore.ListComponents() + registeredComponents := make([]*runtimev1pb.RegisteredComponents, len(components)) + componentsCapabilities := a.GetComponentsCapabilitesFn() + for i, comp := range components { + registeredComponents[i] = &runtimev1pb.RegisteredComponents{ + Name: comp.Name, + Version: comp.Spec.Version, + Type: comp.Spec.Type, + Capabilities: metadataGetOrDefaultCapabilities(componentsCapabilities, comp.Name), + } + } + + // Subscriptions + subscriptions := a.CompStore.ListSubscriptions() + ps := make([]*runtimev1pb.PubsubSubscription, len(subscriptions)) + for i, s := range subscriptions { + ps[i] = &runtimev1pb.PubsubSubscription{ + PubsubName: s.PubsubName, + Topic: s.Topic, + Metadata: s.Metadata, + DeadLetterTopic: s.DeadLetterTopic, + Rules: metadataConvertPubSubSubscriptionRules(s.Rules), + } + } + + // HTTP endpoints + endpoints := a.CompStore.ListHTTPEndpoints() + registeredHTTPEndpoints := make([]*runtimev1pb.MetadataHTTPEndpoint, len(endpoints)) + for i, e := range endpoints { + registeredHTTPEndpoints[i] = &runtimev1pb.MetadataHTTPEndpoint{ + Name: e.Name, + } + } + + return &runtimev1pb.GetMetadataResponse{ + Id: a.AppID, + ExtendedMetadata: extendedMetadata, + RegisteredComponents: registeredComponents, + ActiveActorsCount: activeActorsCount, + Subscriptions: ps, + HttpEndpoints: registeredHTTPEndpoints, + }, nil +} + +// SetMetadata Sets value in extended metadata of the sidecar. +func (a *UniversalAPI) SetMetadata(ctx context.Context, in *runtimev1pb.SetMetadataRequest) (*emptypb.Empty, error) { + a.extendedMetadataLock.Lock() + if a.ExtendedMetadata == nil { + a.ExtendedMetadata = make(map[string]string) + } + a.ExtendedMetadata[in.Key] = in.Value + a.extendedMetadataLock.Unlock() + + return &emptypb.Empty{}, nil +} + +func metadataGetOrDefaultCapabilities(dict map[string][]string, key string) []string { + if val, ok := dict[key]; ok { + return val + } + return make([]string, 0) +} + +func metadataConvertPubSubSubscriptionRules(rules []*runtimePubsub.Rule) *runtimev1pb.PubsubSubscriptionRules { + out := &runtimev1pb.PubsubSubscriptionRules{ + Rules: make([]*runtimev1pb.PubsubSubscriptionRule, 0), + } + for _, r := range rules { + out.Rules = append(out.Rules, &runtimev1pb.PubsubSubscriptionRule{ + // TODO avoid using fmt.Sprintf + Match: fmt.Sprintf("%s", r.Match), + Path: r.Path, + }) + } + return out +} diff --git a/pkg/grpc/universalapi/api_metadata_test.go b/pkg/grpc/universalapi/api_metadata_test.go new file mode 100644 index 00000000000..69e20f9182f --- /dev/null +++ b/pkg/grpc/universalapi/api_metadata_test.go @@ -0,0 +1,110 @@ +/* +Copyright 2023 The Dapr Authors +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 universalapi + +import ( + "context" + "fmt" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "google.golang.org/protobuf/types/known/emptypb" + + "github.com/dapr/dapr/pkg/actors" + componentsV1alpha "github.com/dapr/dapr/pkg/apis/components/v1alpha1" + "github.com/dapr/dapr/pkg/buildinfo" + "github.com/dapr/dapr/pkg/expr" + runtimev1pb "github.com/dapr/dapr/pkg/proto/runtime/v1" + "github.com/dapr/dapr/pkg/runtime/compstore" + runtimePubsub "github.com/dapr/dapr/pkg/runtime/pubsub" +) + +func TestGetMetadata(t *testing.T) { + fakeComponent := componentsV1alpha.Component{} + fakeComponent.Name = "testComponent" + + mockActors := new(actors.MockActors) + mockActors.On("GetActiveActorsCount").Return(&runtimev1pb.ActiveActorsCount{ + Count: 10, + Type: "abcd", + }) + + compStore := compstore.New() + compStore.AddComponent(fakeComponent) + compStore.SetSubscriptions([]runtimePubsub.Subscription{ + { + PubsubName: "test", + Topic: "topic", + DeadLetterTopic: "dead", + Metadata: map[string]string{}, + Rules: []*runtimePubsub.Rule{ + { + Match: &expr.Expr{}, + Path: "path", + }, + }, + }, + }) + + fakeAPI := &UniversalAPI{ + AppID: "fakeAPI", + Actors: mockActors, + CompStore: compStore, + GetComponentsCapabilitesFn: func() map[string][]string { + capsMap := make(map[string][]string) + capsMap["testComponent"] = []string{"mock.feat.testComponent"} + return capsMap + }, + ExtendedMetadata: map[string]string{ + "testKey": "testValue", + }, + } + + response, err := fakeAPI.GetMetadata(context.Background(), &emptypb.Empty{}) + require.NoError(t, err, "Expected no error") + assert.Equal(t, response.Id, "fakeAPI") + assert.Len(t, response.RegisteredComponents, 1, "One component should be returned") + assert.Equal(t, response.RegisteredComponents[0].Name, "testComponent") + assert.Contains(t, response.ExtendedMetadata, "testKey") + assert.Equal(t, response.ExtendedMetadata["testKey"], "testValue") + assert.Equal(t, response.ExtendedMetadata[daprRuntimeVersionKey], buildinfo.Version()) + assert.Len(t, response.RegisteredComponents[0].Capabilities, 1, "One capabilities should be returned") + assert.Equal(t, response.RegisteredComponents[0].Capabilities[0], "mock.feat.testComponent") + assert.Equal(t, response.GetActiveActorsCount()[0].Type, "abcd") + assert.Equal(t, response.GetActiveActorsCount()[0].Count, int32(10)) + assert.Len(t, response.Subscriptions, 1) + assert.Equal(t, response.Subscriptions[0].PubsubName, "test") + assert.Equal(t, response.Subscriptions[0].Topic, "topic") + assert.Equal(t, response.Subscriptions[0].DeadLetterTopic, "dead") + assert.Equal(t, response.Subscriptions[0].PubsubName, "test") + assert.Len(t, response.Subscriptions[0].Rules.Rules, 1) + assert.Equal(t, fmt.Sprintf("%s", response.Subscriptions[0].Rules.Rules[0].Match), "") + assert.Equal(t, response.Subscriptions[0].Rules.Rules[0].Path, "path") +} + +func TestSetMetadata(t *testing.T) { + fakeComponent := componentsV1alpha.Component{} + fakeComponent.Name = "testComponent" + fakeAPI := &UniversalAPI{ + AppID: "fakeAPI", + } + + _, err := fakeAPI.SetMetadata(context.Background(), &runtimev1pb.SetMetadataRequest{ + Key: "testKey", + Value: "testValue", + }) + require.NoError(t, err, "Expected no error") + assert.Equal(t, map[string]string{"testKey": "testValue"}, fakeAPI.ExtendedMetadata) +} diff --git a/pkg/grpc/universalapi/api_shutdown.go b/pkg/grpc/universalapi/api_shutdown.go new file mode 100644 index 00000000000..7cb91b6187a --- /dev/null +++ b/pkg/grpc/universalapi/api_shutdown.go @@ -0,0 +1,29 @@ +/* +Copyright 2022 The Dapr Authors +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 universalapi + +import ( + "context" + + "google.golang.org/protobuf/types/known/emptypb" +) + +// Shutdown the sidecar. +func (a *UniversalAPI) Shutdown(ctx context.Context, in *emptypb.Empty) (*emptypb.Empty, error) { + go func() { + <-ctx.Done() + a.ShutdownFn() + }() + return &emptypb.Empty{}, nil +} diff --git a/pkg/grpc/universalapi/api_shutdown_test.go b/pkg/grpc/universalapi/api_shutdown_test.go new file mode 100644 index 00000000000..fc8363a3aeb --- /dev/null +++ b/pkg/grpc/universalapi/api_shutdown_test.go @@ -0,0 +1,47 @@ +/* +Copyright 2023 The Dapr Authors +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 universalapi + +import ( + "context" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "google.golang.org/protobuf/types/known/emptypb" +) + +func TestShutdownEndpoint(t *testing.T) { + shutdownCh := make(chan struct{}) + + fakeAPI := &UniversalAPI{ + Logger: testLogger, + ShutdownFn: func() { + close(shutdownCh) + }, + } + + t.Run("Shutdown successfully", func(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + _, err := fakeAPI.Shutdown(ctx, &emptypb.Empty{}) + cancel() + assert.NoError(t, err, "Expected no error") + select { + case <-time.After(time.Second): + t.Fatal("Did not shut down within 1 second") + case <-shutdownCh: + // All good + } + }) +} diff --git a/pkg/grpc/universalapi/universalapi.go b/pkg/grpc/universalapi/universalapi.go index 3ba199517d0..0cd00139912 100644 --- a/pkg/grpc/universalapi/universalapi.go +++ b/pkg/grpc/universalapi/universalapi.go @@ -16,6 +16,9 @@ limitations under the License. package universalapi import ( + "sync" + + "github.com/dapr/dapr/pkg/actors" "github.com/dapr/dapr/pkg/resiliency" "github.com/dapr/dapr/pkg/runtime/compstore" "github.com/dapr/kit/logger" @@ -23,8 +26,14 @@ import ( // UniversalAPI contains the implementation of gRPC APIs that are also used by the HTTP server. type UniversalAPI struct { - AppID string - Logger logger.Logger - Resiliency resiliency.Provider - CompStore *compstore.ComponentStore + AppID string + Logger logger.Logger + Resiliency resiliency.Provider + Actors actors.Actors + CompStore *compstore.ComponentStore + ShutdownFn func() + GetComponentsCapabilitesFn func() map[string][]string + ExtendedMetadata map[string]string + + extendedMetadataLock sync.RWMutex } diff --git a/pkg/http/api.go b/pkg/http/api.go index 9f5db60f290..114cd512b14 100644 --- a/pkg/http/api.go +++ b/pkg/http/api.go @@ -23,7 +23,6 @@ import ( nethttp "net/http" "strconv" "strings" - "sync" "time" "github.com/fasthttp/router" @@ -41,7 +40,6 @@ import ( "github.com/dapr/components-contrib/pubsub" "github.com/dapr/components-contrib/state" "github.com/dapr/dapr/pkg/actors" - "github.com/dapr/dapr/pkg/buildinfo" "github.com/dapr/dapr/pkg/channel" "github.com/dapr/dapr/pkg/channel/http" stateLoader "github.com/dapr/dapr/pkg/components/state" @@ -74,59 +72,20 @@ type API interface { } type api struct { - universal *universalapi.UniversalAPI - endpoints []Endpoint - publicEndpoints []Endpoint - directMessaging messaging.DirectMessaging - appChannel channel.AppChannel - httpEndpointsAppChannel channel.HTTPEndpointAppChannel - resiliency resiliency.Provider - actor actors.Actors - pubsubAdapter runtimePubsub.Adapter - sendToOutputBindingFn func(name string, req *bindings.InvokeRequest) (*bindings.InvokeResponse, error) - id string - extendedMetadata sync.Map - readyStatus bool - outboundReadyStatus bool - tracingSpec config.TracingSpec - shutdown func() - getComponentsCapabilitesFn func() map[string][]string - daprRunTimeVersion string - maxRequestBodySize int64 // In bytes - isStreamingEnabled bool -} - -type registeredComponent struct { - Name string `json:"name"` - Type string `json:"type"` - Version string `json:"version"` - Capabilities []string `json:"capabilities"` -} - -type registeredHTTPEndpoint struct { - Name string `json:"name"` -} - -type pubsubSubscription struct { - PubsubName string `json:"pubsubname"` - Topic string `json:"topic"` - DeadLetterTopic string `json:"deadLetterTopic"` - Metadata map[string]string `json:"metadata"` - Rules []*pubsubSubscriptionRule `json:"rules,omitempty"` -} - -type pubsubSubscriptionRule struct { - Match string `json:"match"` - Path string `json:"path"` -} - -type metadata struct { - ID string `json:"id"` - ActiveActorsCount []actors.ActiveActorsCount `json:"actors"` - Extended map[string]string `json:"extended"` - RegisteredComponents []registeredComponent `json:"components"` - RegisteredHTTPEndpoints []registeredHTTPEndpoint `json:"httpEndpoints"` - Subscriptions []pubsubSubscription `json:"subscriptions"` + universal *universalapi.UniversalAPI + endpoints []Endpoint + publicEndpoints []Endpoint + directMessaging messaging.DirectMessaging + appChannel channel.AppChannel + httpEndpointsAppChannel channel.HTTPEndpointAppChannel + resiliency resiliency.Provider + pubsubAdapter runtimePubsub.Adapter + sendToOutputBindingFn func(name string, req *bindings.InvokeRequest) (*bindings.InvokeResponse, error) + readyStatus bool + outboundReadyStatus bool + tracingSpec config.TracingSpec + maxRequestBodySize int64 // In bytes + isStreamingEnabled bool } const ( @@ -166,7 +125,7 @@ type APIOpts struct { Resiliency resiliency.Provider CompStore *compstore.ComponentStore PubsubAdapter runtimePubsub.Adapter - Actor actors.Actors + Actors actors.Actors SendToOutputBindingFn func(name string, req *bindings.InvokeRequest) (*bindings.InvokeResponse, error) TracingSpec config.TracingSpec Shutdown func() @@ -178,25 +137,23 @@ type APIOpts struct { // NewAPI returns a new API. func NewAPI(opts APIOpts) API { api := &api{ - id: opts.AppID, - appChannel: opts.AppChannel, - httpEndpointsAppChannel: opts.HTTPEndpointsAppChannel, - directMessaging: opts.DirectMessaging, - resiliency: opts.Resiliency, - pubsubAdapter: opts.PubsubAdapter, - actor: opts.Actor, - sendToOutputBindingFn: opts.SendToOutputBindingFn, - tracingSpec: opts.TracingSpec, - shutdown: opts.Shutdown, - getComponentsCapabilitesFn: opts.GetComponentsCapabilitiesFn, - maxRequestBodySize: opts.MaxRequestBodySize, - isStreamingEnabled: opts.IsStreamingEnabled, - daprRunTimeVersion: buildinfo.Version(), + appChannel: opts.AppChannel, + httpEndpointsAppChannel: opts.HTTPEndpointsAppChannel, + directMessaging: opts.DirectMessaging, + resiliency: opts.Resiliency, + pubsubAdapter: opts.PubsubAdapter, + sendToOutputBindingFn: opts.SendToOutputBindingFn, + tracingSpec: opts.TracingSpec, + maxRequestBodySize: opts.MaxRequestBodySize, + isStreamingEnabled: opts.IsStreamingEnabled, universal: &universalapi.UniversalAPI{ - AppID: opts.AppID, - Logger: log, - Resiliency: opts.Resiliency, - CompStore: opts.CompStore, + AppID: opts.AppID, + Logger: log, + Resiliency: opts.Resiliency, + Actors: opts.Actors, + CompStore: opts.CompStore, + ShutdownFn: opts.Shutdown, + GetComponentsCapabilitesFn: opts.GetComponentsCapabilitiesFn, }, } @@ -435,34 +392,6 @@ func (a *api) constructActorEndpoints() []Endpoint { } } -func (a *api) constructMetadataEndpoints() []Endpoint { - return []Endpoint{ - { - Methods: []string{fasthttp.MethodGet}, - Route: "metadata", - Version: apiVersionV1, - Handler: a.onGetMetadata, - }, - { - Methods: []string{fasthttp.MethodPut}, - Route: "metadata/{key}", - Version: apiVersionV1, - Handler: a.onPutMetadata, - }, - } -} - -func (a *api) constructShutdownEndpoints() []Endpoint { - return []Endpoint{ - { - Methods: []string{fasthttp.MethodPost}, - Route: "shutdown", - Version: apiVersionV1, - Handler: a.onShutdown, - }, - } -} - func (a *api) constructHealthzEndpoints() []Endpoint { return []Endpoint{ { @@ -621,7 +550,7 @@ func (a *api) onBulkGetState(reqCtx *fasthttp.RequestCtx) { var key string reqs := make([]state.GetRequest, len(req.Keys)) for i, k := range req.Keys { - key, err = stateLoader.GetModifiedStateKey(k, storeName, a.id) + key, err = stateLoader.GetModifiedStateKey(k, storeName, a.universal.AppID) if err != nil { msg := NewErrorResponse("ERR_MALFORMED_REQUEST", fmt.Sprintf(messages.ErrMalformedRequest, err)) respond(reqCtx, withError(fasthttp.StatusBadRequest, msg)) @@ -844,7 +773,7 @@ func (a *api) onGetState(reqCtx *fasthttp.RequestCtx) { key := reqCtx.UserValue(stateKeyParam).(string) consistency := string(reqCtx.QueryArgs().Peek(consistencyParam)) - k, err := stateLoader.GetModifiedStateKey(key, storeName, a.id) + k, err := stateLoader.GetModifiedStateKey(key, storeName, a.universal.AppID) if err != nil { msg := NewErrorResponse("ERR_MALFORMED_REQUEST", fmt.Sprintf(messages.ErrMalformedRequest, err)) respond(reqCtx, withError(fasthttp.StatusBadRequest, msg)) @@ -1146,7 +1075,7 @@ func (a *api) onDeleteState(reqCtx *fasthttp.RequestCtx) { consistency := string(reqCtx.QueryArgs().Peek(consistencyParam)) metadata := getMetadataFromRequest(reqCtx) - k, err := stateLoader.GetModifiedStateKey(key, storeName, a.id) + k, err := stateLoader.GetModifiedStateKey(key, storeName, a.universal.AppID) if err != nil { msg := NewErrorResponse("ERR_MALFORMED_REQUEST", err.Error()) respond(reqCtx, withError(fasthttp.StatusBadRequest, msg)) @@ -1221,7 +1150,7 @@ func (a *api) onPostState(reqCtx *fasthttp.RequestCtx) { } } - reqs[i].Key, err = stateLoader.GetModifiedStateKey(r.Key, storeName, a.id) + reqs[i].Key, err = stateLoader.GetModifiedStateKey(r.Key, storeName, a.universal.AppID) if err != nil { msg := NewErrorResponse("ERR_MALFORMED_REQUEST", err.Error()) respond(reqCtx, withError(fasthttp.StatusBadRequest, msg)) @@ -1571,7 +1500,7 @@ func (a *api) findTargetID(reqCtx *fasthttp.RequestCtx) string { } func (a *api) onCreateActorReminder(reqCtx *fasthttp.RequestCtx) { - if a.actor == nil { + if a.universal.Actors == nil { msg := NewErrorResponse("ERR_ACTOR_RUNTIME_NOT_FOUND", messages.ErrActorRuntimeNotFound) respond(reqCtx, withError(fasthttp.StatusInternalServerError, msg)) return @@ -1594,7 +1523,7 @@ func (a *api) onCreateActorReminder(reqCtx *fasthttp.RequestCtx) { req.ActorType = actorType req.ActorID = actorID - err = a.actor.CreateReminder(reqCtx, &req) + err = a.universal.Actors.CreateReminder(reqCtx, &req) if err != nil { msg := NewErrorResponse("ERR_ACTOR_REMINDER_CREATE", fmt.Sprintf(messages.ErrActorReminderCreate, err)) respond(reqCtx, withError(fasthttp.StatusInternalServerError, msg)) @@ -1605,7 +1534,7 @@ func (a *api) onCreateActorReminder(reqCtx *fasthttp.RequestCtx) { } func (a *api) onRenameActorReminder(reqCtx *fasthttp.RequestCtx) { - if a.actor == nil { + if a.universal.Actors == nil { msg := NewErrorResponse("ERR_ACTOR_RUNTIME_NOT_FOUND", messages.ErrActorRuntimeNotFound) respond(reqCtx, withError(fasthttp.StatusInternalServerError, msg)) return @@ -1628,7 +1557,7 @@ func (a *api) onRenameActorReminder(reqCtx *fasthttp.RequestCtx) { req.ActorType = actorType req.ActorID = actorID - err = a.actor.RenameReminder(reqCtx, &req) + err = a.universal.Actors.RenameReminder(reqCtx, &req) if err != nil { msg := NewErrorResponse("ERR_ACTOR_REMINDER_RENAME", fmt.Sprintf(messages.ErrActorReminderRename, err)) respond(reqCtx, withError(fasthttp.StatusInternalServerError, msg)) @@ -1639,7 +1568,7 @@ func (a *api) onRenameActorReminder(reqCtx *fasthttp.RequestCtx) { } func (a *api) onCreateActorTimer(reqCtx *fasthttp.RequestCtx) { - if a.actor == nil { + if a.universal.Actors == nil { msg := NewErrorResponse("ERR_ACTOR_RUNTIME_NOT_FOUND", messages.ErrActorRuntimeNotFound) respond(reqCtx, withError(fasthttp.StatusInternalServerError, msg)) log.Debug(msg) @@ -1663,7 +1592,7 @@ func (a *api) onCreateActorTimer(reqCtx *fasthttp.RequestCtx) { req.ActorType = actorType req.ActorID = actorID - err = a.actor.CreateTimer(reqCtx, &req) + err = a.universal.Actors.CreateTimer(reqCtx, &req) if err != nil { msg := NewErrorResponse("ERR_ACTOR_TIMER_CREATE", fmt.Sprintf(messages.ErrActorTimerCreate, err)) respond(reqCtx, withError(fasthttp.StatusInternalServerError, msg)) @@ -1674,7 +1603,7 @@ func (a *api) onCreateActorTimer(reqCtx *fasthttp.RequestCtx) { } func (a *api) onDeleteActorReminder(reqCtx *fasthttp.RequestCtx) { - if a.actor == nil { + if a.universal.Actors == nil { msg := NewErrorResponse("ERR_ACTOR_RUNTIME_NOT_FOUND", messages.ErrActorRuntimeNotFound) respond(reqCtx, withError(fasthttp.StatusInternalServerError, msg)) log.Debug(msg) @@ -1691,7 +1620,7 @@ func (a *api) onDeleteActorReminder(reqCtx *fasthttp.RequestCtx) { ActorType: actorType, } - err := a.actor.DeleteReminder(reqCtx, &req) + err := a.universal.Actors.DeleteReminder(reqCtx, &req) if err != nil { msg := NewErrorResponse("ERR_ACTOR_REMINDER_DELETE", fmt.Sprintf(messages.ErrActorReminderDelete, err)) respond(reqCtx, withError(fasthttp.StatusInternalServerError, msg)) @@ -1702,7 +1631,7 @@ func (a *api) onDeleteActorReminder(reqCtx *fasthttp.RequestCtx) { } func (a *api) onActorStateTransaction(reqCtx *fasthttp.RequestCtx) { - if a.actor == nil { + if a.universal.Actors == nil { msg := NewErrorResponse("ERR_ACTOR_RUNTIME_NOT_FOUND", messages.ErrActorRuntimeNotFound) respond(reqCtx, withError(fasthttp.StatusInternalServerError, msg)) log.Debug(msg) @@ -1722,7 +1651,7 @@ func (a *api) onActorStateTransaction(reqCtx *fasthttp.RequestCtx) { return } - hosted := a.actor.IsActorHosted(reqCtx, &actors.ActorHostedRequest{ + hosted := a.universal.Actors.IsActorHosted(reqCtx, &actors.ActorHostedRequest{ ActorType: actorType, ActorID: actorID, }) @@ -1740,7 +1669,7 @@ func (a *api) onActorStateTransaction(reqCtx *fasthttp.RequestCtx) { Operations: ops, } - err = a.actor.TransactionalStateOperation(reqCtx, &req) + err = a.universal.Actors.TransactionalStateOperation(reqCtx, &req) if err != nil { msg := NewErrorResponse("ERR_ACTOR_STATE_TRANSACTION_SAVE", fmt.Sprintf(messages.ErrActorStateTransactionSave, err)) respond(reqCtx, withError(fasthttp.StatusInternalServerError, msg)) @@ -1751,7 +1680,7 @@ func (a *api) onActorStateTransaction(reqCtx *fasthttp.RequestCtx) { } func (a *api) onGetActorReminder(reqCtx *fasthttp.RequestCtx) { - if a.actor == nil { + if a.universal.Actors == nil { msg := NewErrorResponse("ERR_ACTOR_RUNTIME_NOT_FOUND", messages.ErrActorRuntimeNotFound) respond(reqCtx, withError(fasthttp.StatusInternalServerError, msg)) log.Debug(msg) @@ -1762,7 +1691,7 @@ func (a *api) onGetActorReminder(reqCtx *fasthttp.RequestCtx) { actorID := reqCtx.UserValue(actorIDParam).(string) name := reqCtx.UserValue(nameParam).(string) - resp, err := a.actor.GetReminder(reqCtx, &actors.GetReminderRequest{ + resp, err := a.universal.Actors.GetReminder(reqCtx, &actors.GetReminderRequest{ ActorType: actorType, ActorID: actorID, Name: name, @@ -1785,7 +1714,7 @@ func (a *api) onGetActorReminder(reqCtx *fasthttp.RequestCtx) { } func (a *api) onDeleteActorTimer(reqCtx *fasthttp.RequestCtx) { - if a.actor == nil { + if a.universal.Actors == nil { msg := NewErrorResponse("ERR_ACTOR_RUNTIME_NOT_FOUND", messages.ErrActorRuntimeNotFound) respond(reqCtx, withError(fasthttp.StatusInternalServerError, msg)) log.Debug(msg) @@ -1801,7 +1730,7 @@ func (a *api) onDeleteActorTimer(reqCtx *fasthttp.RequestCtx) { ActorID: actorID, ActorType: actorType, } - err := a.actor.DeleteTimer(reqCtx, &req) + err := a.universal.Actors.DeleteTimer(reqCtx, &req) if err != nil { msg := NewErrorResponse("ERR_ACTOR_TIMER_DELETE", fmt.Sprintf(messages.ErrActorTimerDelete, err)) respond(reqCtx, withError(fasthttp.StatusInternalServerError, msg)) @@ -1812,7 +1741,7 @@ func (a *api) onDeleteActorTimer(reqCtx *fasthttp.RequestCtx) { } func (a *api) onDirectActorMessage(reqCtx *fasthttp.RequestCtx) { - if a.actor == nil { + if a.universal.Actors == nil { msg := NewErrorResponse("ERR_ACTOR_RUNTIME_NOT_FOUND", messages.ErrActorRuntimeNotFound) respond(reqCtx, withError(fasthttp.StatusInternalServerError, msg)) log.Debug(msg) @@ -1851,7 +1780,7 @@ func (a *api) onDirectActorMessage(reqCtx *fasthttp.RequestCtx) { }, ) resp, err := policyRunner(func(ctx context.Context) (*invokev1.InvokeMethodResponse, error) { - return a.actor.Call(ctx, req) + return a.universal.Actors.Call(ctx, req) }) if err != nil && !errors.Is(err, actors.ErrDaprResponseHeader) { msg := NewErrorResponse("ERR_ACTOR_INVOKE_METHOD", fmt.Sprintf(messages.ErrActorInvoke, err)) @@ -1888,7 +1817,7 @@ func (a *api) onDirectActorMessage(reqCtx *fasthttp.RequestCtx) { } func (a *api) onGetActorState(reqCtx *fasthttp.RequestCtx) { - if a.actor == nil { + if a.universal.Actors == nil { msg := NewErrorResponse("ERR_ACTOR_RUNTIME_NOT_FOUND", messages.ErrActorRuntimeNotFound) respond(reqCtx, withError(fasthttp.StatusInternalServerError, msg)) log.Debug(msg) @@ -1899,7 +1828,7 @@ func (a *api) onGetActorState(reqCtx *fasthttp.RequestCtx) { actorID := reqCtx.UserValue(actorIDParam).(string) key := reqCtx.UserValue(stateKeyParam).(string) - hosted := a.actor.IsActorHosted(reqCtx, &actors.ActorHostedRequest{ + hosted := a.universal.Actors.IsActorHosted(reqCtx, &actors.ActorHostedRequest{ ActorType: actorType, ActorID: actorID, }) @@ -1917,7 +1846,7 @@ func (a *api) onGetActorState(reqCtx *fasthttp.RequestCtx) { Key: key, } - resp, err := a.actor.GetState(reqCtx, &req) + resp, err := a.universal.Actors.GetState(reqCtx, &req) if err != nil { msg := NewErrorResponse("ERR_ACTOR_STATE_GET", fmt.Sprintf(messages.ErrActorStateGet, err)) respond(reqCtx, withError(fasthttp.StatusInternalServerError, msg)) @@ -1931,109 +1860,6 @@ func (a *api) onGetActorState(reqCtx *fasthttp.RequestCtx) { } } -func (a *api) onGetMetadata(reqCtx *fasthttp.RequestCtx) { - temp := make(map[string]string) - - // Copy synchronously so it can be serialized to JSON. - a.extendedMetadata.Range(func(key, value interface{}) bool { - temp[key.(string)] = value.(string) - - return true - }) - temp[daprRuntimeVersionKey] = a.daprRunTimeVersion - activeActorsCount := []actors.ActiveActorsCount{} - if a.actor != nil { - activeActorsCount = a.actor.GetActiveActorsCount(reqCtx) - } - componentsCapabilties := a.getComponentsCapabilitesFn() - components := a.universal.CompStore.ListComponents() - registeredComponents := make([]registeredComponent, 0, len(components)) - for _, comp := range components { - registeredComp := registeredComponent{ - Name: comp.Name, - Version: comp.Spec.Version, - Type: comp.Spec.Type, - Capabilities: getOrDefaultCapabilites(componentsCapabilties, comp.Name), - } - registeredComponents = append(registeredComponents, registeredComp) - } - - subscriptions := a.universal.CompStore.ListSubscriptions() - ps := []pubsubSubscription{} - for _, s := range subscriptions { - ps = append(ps, pubsubSubscription{ - PubsubName: s.PubsubName, - Topic: s.Topic, - Metadata: s.Metadata, - DeadLetterTopic: s.DeadLetterTopic, - Rules: convertPubsubSubscriptionRules(s.Rules), - }) - } - - endpoints := a.universal.CompStore.ListHTTPEndpoints() - registeredHTTPEndpoints := make([]registeredHTTPEndpoint, 0, len(endpoints)) - for _, e := range endpoints { - registeredE := registeredHTTPEndpoint{ - Name: e.Name, - } - registeredHTTPEndpoints = append(registeredHTTPEndpoints, registeredE) - } - - mtd := metadata{ - ID: a.id, - ActiveActorsCount: activeActorsCount, - Extended: temp, - RegisteredComponents: registeredComponents, - Subscriptions: ps, - RegisteredHTTPEndpoints: registeredHTTPEndpoints, - } - - mtdBytes, err := json.Marshal(mtd) - if err != nil { - msg := NewErrorResponse("ERR_METADATA_GET", fmt.Sprintf(messages.ErrMetadataGet, err)) - respond(reqCtx, withError(fasthttp.StatusInternalServerError, msg)) - log.Debug(msg) - } else { - respond(reqCtx, withJSON(fasthttp.StatusOK, mtdBytes)) - } -} - -func getOrDefaultCapabilites(dict map[string][]string, key string) []string { - if val, ok := dict[key]; ok { - return val - } - return make([]string, 0) -} - -func convertPubsubSubscriptionRules(rules []*runtimePubsub.Rule) []*pubsubSubscriptionRule { - out := make([]*pubsubSubscriptionRule, 0) - for _, r := range rules { - out = append(out, &pubsubSubscriptionRule{ - Match: fmt.Sprintf("%s", r.Match), - Path: r.Path, - }) - } - return out -} - -func (a *api) onPutMetadata(reqCtx *fasthttp.RequestCtx) { - key := fmt.Sprintf("%v", reqCtx.UserValue("key")) - body := reqCtx.PostBody() - a.extendedMetadata.Store(key, string(body)) - respond(reqCtx, withEmpty()) -} - -func (a *api) onShutdown(reqCtx *fasthttp.RequestCtx) { - if !reqCtx.IsPost() { - log.Warn("Please use POST method when invoking shutdown API") - } - - respond(reqCtx, withEmpty()) - go func() { - a.shutdown() - }() -} - func (a *api) onPublish(reqCtx *fasthttp.RequestCtx) { thepubsub, pubsubName, topic, sc, errRes := a.validateAndGetPubsubAndTopic(reqCtx) if errRes != nil { @@ -2047,9 +1873,8 @@ func (a *api) onPublish(reqCtx *fasthttp.RequestCtx) { metadata := getMetadataFromRequest(reqCtx) rawPayload, metaErr := contribMetadata.IsRawPayload(metadata) if metaErr != nil { - msg := NewErrorResponse("ERR_PUBSUB_REQUEST_METADATA", - fmt.Sprintf(messages.ErrMetadataGet, metaErr.Error())) - respond(reqCtx, withError(fasthttp.StatusBadRequest, msg)) + msg := messages.ErrPubSubMetadataDeserialize.WithFormat(metaErr) + universalFastHTTPErrorResponder(reqCtx, msg) log.Debug(msg) return @@ -2066,7 +1891,7 @@ func (a *api) onPublish(reqCtx *fasthttp.RequestCtx) { if !rawPayload { envelope, err := runtimePubsub.NewCloudEvent(&runtimePubsub.CloudEvent{ - Source: a.id, + Source: a.universal.AppID, Topic: topic, DataContentType: contentType, Data: body, @@ -2150,9 +1975,8 @@ func (a *api) onBulkPublish(reqCtx *fasthttp.RequestCtx) { metadata := getMetadataFromRequest(reqCtx) rawPayload, metaErr := contribMetadata.IsRawPayload(metadata) if metaErr != nil { - msg := NewErrorResponse("ERR_PUBSUB_REQUEST_METADATA", - fmt.Sprintf(messages.ErrMetadataGet, metaErr.Error())) - respond(reqCtx, withError(fasthttp.StatusBadRequest, msg)) + msg := messages.ErrPubSubMetadataDeserialize.WithFormat(metaErr) + universalFastHTTPErrorResponder(reqCtx, msg) log.Debug(msg) return @@ -2227,7 +2051,7 @@ func (a *api) onBulkPublish(reqCtx *fasthttp.RequestCtx) { spanMap[i] = childSpan envelope, envelopeErr := runtimePubsub.NewCloudEvent(&runtimePubsub.CloudEvent{ - Source: a.id, + Source: a.universal.AppID, Topic: topic, DataContentType: entries[i].ContentType, Data: entries[i].Event, @@ -2468,7 +2292,7 @@ func (a *api) onPostStateTransaction(reqCtx *fasthttp.RequestCtx) { log.Debug(msg) return } - upsertReq.Key, err = stateLoader.GetModifiedStateKey(upsertReq.Key, storeName, a.id) + upsertReq.Key, err = stateLoader.GetModifiedStateKey(upsertReq.Key, storeName, a.universal.AppID) if err != nil { msg := NewErrorResponse("ERR_MALFORMED_REQUEST", err.Error()) respond(reqCtx, withError(fasthttp.StatusBadRequest, msg)) @@ -2486,7 +2310,7 @@ func (a *api) onPostStateTransaction(reqCtx *fasthttp.RequestCtx) { log.Debug(msg) return } - delReq.Key, err = stateLoader.GetModifiedStateKey(delReq.Key, storeName, a.id) + delReq.Key, err = stateLoader.GetModifiedStateKey(delReq.Key, storeName, a.universal.AppID) if err != nil { msg := NewErrorResponse("ERR_MALFORMED_REQUEST", err.Error()) respond(reqCtx, withError(fasthttp.StatusBadRequest, msg)) @@ -2600,5 +2424,5 @@ func (a *api) SetDirectMessaging(directMessaging messaging.DirectMessaging) { } func (a *api) SetActorRuntime(actor actors.Actors) { - a.actor = actor + a.universal.Actors = actor } diff --git a/pkg/http/api_metadata.go b/pkg/http/api_metadata.go new file mode 100644 index 00000000000..6bea27ee800 --- /dev/null +++ b/pkg/http/api_metadata.go @@ -0,0 +1,124 @@ +/* +Copyright 2022 The Dapr Authors +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 http + +import ( + "github.com/valyala/fasthttp" + "google.golang.org/protobuf/types/known/emptypb" + + runtimev1pb "github.com/dapr/dapr/pkg/proto/runtime/v1" +) + +func (a *api) constructMetadataEndpoints() []Endpoint { + return []Endpoint{ + { + Methods: []string{fasthttp.MethodGet}, + Route: "metadata", + Version: apiVersionV1, + Handler: a.onGetMetadata(), + }, + { + Methods: []string{fasthttp.MethodPut}, + Route: "metadata/{key}", + Version: apiVersionV1, + Handler: a.onPutMetadata(), + }, + } +} + +func (a *api) onGetMetadata() fasthttp.RequestHandler { + return UniversalFastHTTPHandler( + a.universal.GetMetadata, + UniversalFastHTTPHandlerOpts[*emptypb.Empty, *runtimev1pb.GetMetadataResponse]{ + OutModifier: func(out *runtimev1pb.GetMetadataResponse) (any, error) { + // In the protos, the property subscriptions[*].rules is serialized as subscriptions[*].rules.rules + // To maintain backwards-compatibility, we need to copy into a custom struct and marshal that instead + res := &metadataResponse{ + ID: out.Id, + Extended: out.ExtendedMetadata, + // We can embed the proto object directly only for as long as the protojson key is == json key + ActiveActorsCount: out.ActiveActorsCount, + RegisteredComponents: out.RegisteredComponents, + HTTPEndpoints: out.HttpEndpoints, + } + + // Copy the subscriptions into a custom struct + if len(out.Subscriptions) > 0 { + subs := make([]metadataResponsePubsubSubscription, len(out.Subscriptions)) + for i, v := range out.Subscriptions { + subs[i] = metadataResponsePubsubSubscription{ + PubsubName: v.PubsubName, + Topic: v.Topic, + Metadata: v.Metadata, + DeadLetterTopic: v.DeadLetterTopic, + } + + if v.Rules != nil && len(v.Rules.Rules) > 0 { + subs[i].Rules = make([]metadataResponsePubsubSubscriptionRule, len(v.Rules.Rules)) + for j, r := range v.Rules.Rules { + subs[i].Rules[j] = metadataResponsePubsubSubscriptionRule{ + Match: r.Match, + Path: r.Path, + } + } + } + } + res.Subscriptions = subs + } + + return res, nil + }, + }, + ) +} + +func (a *api) onPutMetadata() fasthttp.RequestHandler { + return UniversalFastHTTPHandler( + a.universal.SetMetadata, + UniversalFastHTTPHandlerOpts[*runtimev1pb.SetMetadataRequest, *emptypb.Empty]{ + SkipInputBody: true, + InModifier: func(reqCtx *fasthttp.RequestCtx, in *runtimev1pb.SetMetadataRequest) (*runtimev1pb.SetMetadataRequest, error) { + in.Key = reqCtx.UserValue("key").(string) + in.Value = string(reqCtx.Request.Body()) + return in, nil + }, + OutModifier: func(out *emptypb.Empty) (any, error) { + // Nullify the response so status code is 204 + return nil, nil + }, + }, + ) +} + +type metadataResponse struct { + ID string `json:"id,omitempty"` + ActiveActorsCount []*runtimev1pb.ActiveActorsCount `json:"actors,omitempty"` + RegisteredComponents []*runtimev1pb.RegisteredComponents `json:"components,omitempty"` + Extended map[string]string `json:"extended,omitempty"` + Subscriptions []metadataResponsePubsubSubscription `json:"subscriptions,omitempty"` + HTTPEndpoints []*runtimev1pb.MetadataHTTPEndpoint `json:"httpEndpoints,omitempty"` +} + +type metadataResponsePubsubSubscription struct { + PubsubName string `json:"pubsubname"` + Topic string `json:"topic"` + Metadata map[string]string `json:"metadata,omitempty"` + Rules []metadataResponsePubsubSubscriptionRule `json:"rules,omitempty"` + DeadLetterTopic string `json:"deadLetterTopic"` +} + +type metadataResponsePubsubSubscriptionRule struct { + Match string `json:"match,omitempty"` + Path string `json:"path,omitempty"` +} diff --git a/pkg/http/api_shutdown.go b/pkg/http/api_shutdown.go new file mode 100644 index 00000000000..7dc94223813 --- /dev/null +++ b/pkg/http/api_shutdown.go @@ -0,0 +1,38 @@ +/* +Copyright 2022 The Dapr Authors +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 http + +import ( + "github.com/valyala/fasthttp" + "google.golang.org/protobuf/types/known/emptypb" +) + +func (a *api) constructShutdownEndpoints() []Endpoint { + return []Endpoint{ + { + Methods: []string{fasthttp.MethodPost}, + Route: "shutdown", + Version: apiVersionV1, + Handler: UniversalFastHTTPHandler( + a.universal.Shutdown, + UniversalFastHTTPHandlerOpts[*emptypb.Empty, *emptypb.Empty]{ + OutModifier: func(out *emptypb.Empty) (any, error) { + // Nullify the response so status code is 204 + return nil, nil + }, + }, + ), + }, + } +} diff --git a/pkg/http/api_test.go b/pkg/http/api_test.go index 28d2d1ece40..a1a863ddb08 100644 --- a/pkg/http/api_test.go +++ b/pkg/http/api_test.go @@ -24,7 +24,6 @@ import ( "net" gohttp "net/http" "strings" - "sync" "testing" "time" @@ -32,6 +31,7 @@ import ( "github.com/google/uuid" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" "github.com/valyala/fasthttp" "github.com/valyala/fasthttp/fasthttpadaptor" "github.com/valyala/fasthttp/fasthttputil" @@ -145,6 +145,9 @@ var testResiliency = &v1alpha1.Resiliency{ func TestPubSubEndpoints(t *testing.T) { fakeServer := newFakeHTTPServer() testAPI := &api{ + universal: &universalapi.UniversalAPI{ + AppID: "fakeAPI", + }, pubsubAdapter: &daprt.MockPubSubAdapter{ PublishFn: func(req *pubsub.PublishRequest) error { if req.PubsubName == "errorpubsub" { @@ -308,6 +311,9 @@ func TestPubSubEndpoints(t *testing.T) { func TestBulkPubSubEndpoints(t *testing.T) { fakeServer := newFakeHTTPServer() testAPI := &api{ + universal: &universalapi.UniversalAPI{ + AppID: "fakeAPI", + }, pubsubAdapter: &daprt.MockPubSubAdapter{ BulkPublishFn: func(req *pubsub.BulkPublishRequest) (pubsub.BulkPublishResponse, error) { switch req.PubsubName { @@ -769,31 +775,28 @@ func TestShutdownEndpoints(t *testing.T) { fakeServer := newFakeHTTPServer() shutdownCh := make(chan struct{}) - m := mock.Mock{} - m.On("shutdown", mock.Anything).Return() testAPI := &api{ - shutdown: func() { - m.MethodCalled("shutdown") - close(shutdownCh) + universal: &universalapi.UniversalAPI{ + ShutdownFn: func() { + close(shutdownCh) + }, }, } fakeServer.StartServer(testAPI.constructShutdownEndpoints()) + defer fakeServer.Shutdown() t.Run("Shutdown successfully - 204", func(t *testing.T) { apiPath := fmt.Sprintf("%s/shutdown", apiVersionV1) resp := fakeServer.DoRequest("POST", apiPath, nil, nil) - assert.Equal(t, 204, resp.StatusCode, "success shutdown") + assert.Equal(t, 204, resp.StatusCode) select { case <-time.After(time.Second): t.Fatal("Did not shut down within 1 second") case <-shutdownCh: // All good } - m.AssertCalled(t, "shutdown") }) - - fakeServer.Shutdown() } func TestGetStatusCodeFromMetadata(t *testing.T) { @@ -1877,9 +1880,14 @@ func TestV1DirectMessagingEndpointsWithResiliency(t *testing.T) { func TestV1ActorEndpoints(t *testing.T) { fakeServer := newFakeHTTPServer() + rc := resiliency.FromConfigurations(logger.NewLogger("test.api.http.actors"), testResiliency) testAPI := &api{ - actor: nil, - resiliency: resiliency.FromConfigurations(logger.NewLogger("test.api.http.actors"), testResiliency), + resiliency: rc, + universal: &universalapi.UniversalAPI{ + AppID: "fakeAPI", + Resiliency: rc, + Actors: nil, + }, } fakeServer.StartServer(testAPI.constructActorEndpoints()) @@ -1895,7 +1903,7 @@ func TestV1ActorEndpoints(t *testing.T) { "v1.0/actors/fakeActorType/fakeActorID/method/method1": {"POST", "PUT", "GET", "DELETE"}, "v1.0/actors/fakeActorType/fakeActorID/timers/timer1": {"POST", "PUT", "DELETE"}, } - testAPI.actor = nil + testAPI.universal.Actors = nil for apiPath, testMethods := range apisAndMethods { for _, method := range testMethods { @@ -1910,7 +1918,7 @@ func TestV1ActorEndpoints(t *testing.T) { }) t.Run("All PUT/POST APIs - 400 for invalid JSON", func(t *testing.T) { - testAPI.actor = new(actors.MockActors) + testAPI.universal.Actors = new(actors.MockActors) apiPaths := []string{ "v1.0/actors/fakeActorType/fakeActorID/reminders/reminder1", "v1.0/actors/fakeActorType/fakeActorID/state", @@ -1933,7 +1941,7 @@ func TestV1ActorEndpoints(t *testing.T) { }) t.Run("All PATCH APIs - 400 for invalid JSON", func(t *testing.T) { - testAPI.actor = new(actors.MockActors) + testAPI.universal.Actors = new(actors.MockActors) apiPaths := []string{ "v1.0/actors/fakeActorType/fakeActorID/reminders/reminder1", } @@ -1966,7 +1974,7 @@ func TestV1ActorEndpoints(t *testing.T) { ActorType: "fakeActorType", }).Return(true) - testAPI.actor = mockActors + testAPI.universal.Actors = mockActors // act resp := fakeServer.DoRequest("GET", apiPath, nil, nil) @@ -1991,7 +1999,7 @@ func TestV1ActorEndpoints(t *testing.T) { ActorType: "fakeActorType", }).Return(true) - testAPI.actor = mockActors + testAPI.universal.Actors = mockActors // act resp := fakeServer.DoRequest("GET", apiPath, nil, nil) @@ -2016,7 +2024,7 @@ func TestV1ActorEndpoints(t *testing.T) { ActorType: "fakeActorType", }).Return(true) - testAPI.actor = mockActors + testAPI.universal.Actors = mockActors // act resp := fakeServer.DoRequest("GET", apiPath, nil, nil) @@ -2043,7 +2051,7 @@ func TestV1ActorEndpoints(t *testing.T) { ActorType: "fakeActorType", }).Return(func(*actors.ActorHostedRequest) bool { return false }) - testAPI.actor = mockActors + testAPI.universal.Actors = mockActors // act resp := fakeServer.DoRequest("GET", apiPath, nil, nil) @@ -2085,7 +2093,7 @@ func TestV1ActorEndpoints(t *testing.T) { ActorType: "fakeActorType", }).Return(true) - testAPI.actor = mockActors + testAPI.universal.Actors = mockActors // act inputBodyBytes, err := json.Marshal(testTransactionalOperations) @@ -2125,7 +2133,7 @@ func TestV1ActorEndpoints(t *testing.T) { ActorType: "fakeActorType", }).Return(func(*actors.ActorHostedRequest) bool { return false }) - testAPI.actor = mockActors + testAPI.universal.Actors = mockActors // act inputBodyBytes, err := json.Marshal(testTransactionalOperations) @@ -2170,7 +2178,7 @@ func TestV1ActorEndpoints(t *testing.T) { ActorType: "fakeActorType", }).Return(true) - testAPI.actor = mockActors + testAPI.universal.Actors = mockActors // act inputBodyBytes, err := json.Marshal(testTransactionalOperations) @@ -2200,7 +2208,7 @@ func TestV1ActorEndpoints(t *testing.T) { mockActors.On("CreateReminder", &reminderRequest).Return(nil) - testAPI.actor = mockActors + testAPI.universal.Actors = mockActors // act inputBodyBytes, err := json.Marshal(reminderRequest) @@ -2230,7 +2238,7 @@ func TestV1ActorEndpoints(t *testing.T) { mockActors.On("CreateReminder", &reminderRequest).Return(errors.New("UPSTREAM_ERROR")) - testAPI.actor = mockActors + testAPI.universal.Actors = mockActors // act inputBodyBytes, err := json.Marshal(reminderRequest) @@ -2257,7 +2265,7 @@ func TestV1ActorEndpoints(t *testing.T) { mockActors.On("RenameReminder", &reminderRequest).Return(nil) - testAPI.actor = mockActors + testAPI.universal.Actors = mockActors // act inputBodyBytes, err := json.Marshal(reminderRequest) @@ -2283,7 +2291,7 @@ func TestV1ActorEndpoints(t *testing.T) { mockActors.On("RenameReminder", &reminderRequest).Return(errors.New("UPSTREAM_ERROR")) - testAPI.actor = mockActors + testAPI.universal.Actors = mockActors // act inputBodyBytes, err := json.Marshal(reminderRequest) @@ -2309,7 +2317,7 @@ func TestV1ActorEndpoints(t *testing.T) { mockActors.On("DeleteReminder", &reminderRequest).Return(nil) - testAPI.actor = mockActors + testAPI.universal.Actors = mockActors // act resp := fakeServer.DoRequest("DELETE", apiPath, nil, nil) @@ -2332,7 +2340,7 @@ func TestV1ActorEndpoints(t *testing.T) { mockActors.On("DeleteReminder", &reminderRequest).Return(errors.New("UPSTREAM_ERROR")) - testAPI.actor = mockActors + testAPI.universal.Actors = mockActors // act resp := fakeServer.DoRequest("DELETE", apiPath, nil, nil) @@ -2355,7 +2363,7 @@ func TestV1ActorEndpoints(t *testing.T) { mockActors.On("GetReminder", &reminderRequest).Return(nil, nil) - testAPI.actor = mockActors + testAPI.universal.Actors = mockActors // act resp := fakeServer.DoRequest("GET", apiPath, nil, nil) @@ -2377,7 +2385,7 @@ func TestV1ActorEndpoints(t *testing.T) { mockActors.On("GetReminder", &reminderRequest).Return(nil, errors.New("UPSTREAM_ERROR")) - testAPI.actor = mockActors + testAPI.universal.Actors = mockActors // act resp := fakeServer.DoRequest("GET", apiPath, nil, nil) @@ -2405,7 +2413,7 @@ func TestV1ActorEndpoints(t *testing.T) { mockActors.On("GetReminder", &reminderRequest).Return(&reminderResponse, nil) - testAPI.actor = mockActors + testAPI.universal.Actors = mockActors // act resp := fakeServer.DoRequest("GET", apiPath, nil, nil) @@ -2432,7 +2440,7 @@ func TestV1ActorEndpoints(t *testing.T) { mockActors.On("CreateTimer", &timerRequest).Return(nil) - testAPI.actor = mockActors + testAPI.universal.Actors = mockActors // act inputBodyBytes, err := json.Marshal(timerRequest) @@ -2462,7 +2470,7 @@ func TestV1ActorEndpoints(t *testing.T) { mockActors.On("CreateTimer", &timerRequest).Return(errors.New("UPSTREAM_ERROR")) - testAPI.actor = mockActors + testAPI.universal.Actors = mockActors // act inputBodyBytes, err := json.Marshal(timerRequest) @@ -2488,7 +2496,7 @@ func TestV1ActorEndpoints(t *testing.T) { mockActors.On("DeleteTimer", &timerRequest).Return(nil) - testAPI.actor = mockActors + testAPI.universal.Actors = mockActors // act resp := fakeServer.DoRequest("DELETE", apiPath, nil, nil) @@ -2511,7 +2519,7 @@ func TestV1ActorEndpoints(t *testing.T) { mockActors.On("DeleteTimer", &timerRequest).Return(errors.New("UPSTREAM_ERROR")) - testAPI.actor = mockActors + testAPI.universal.Actors = mockActors // act resp := fakeServer.DoRequest("DELETE", apiPath, nil, nil) @@ -2545,7 +2553,7 @@ func TestV1ActorEndpoints(t *testing.T) { return true })).Return(response, nil) - testAPI.actor = mockActors + testAPI.universal.Actors = mockActors // act resp := fakeServer.DoRequest("POST", apiPath, fakeData, nil) @@ -2574,7 +2582,7 @@ func TestV1ActorEndpoints(t *testing.T) { return true })).Return(nil, errors.New("UPSTREAM_ERROR")) - testAPI.actor = mockActors + testAPI.universal.Actors = mockActors // act resp := fakeServer.DoRequest("POST", apiPath, []byte("fakeData"), nil) @@ -2598,7 +2606,7 @@ func TestV1ActorEndpoints(t *testing.T) { } t.Run("Direct Message - retries with resiliency", func(t *testing.T) { - testAPI.actor = failingActors + testAPI.universal.Actors = failingActors msg := []byte("M'illumino d'immenso.") apiPath := fmt.Sprintf("v1.0/actors/failingActorType/%s/method/method1", "failingId") @@ -2681,88 +2689,48 @@ func TestV1MetadataEndpoint(t *testing.T) { }, }) + mockActors := new(actors.MockActors) + mockActors.On("GetActiveActorsCount") + testAPI := &api{ - actor: nil, universal: &universalapi.UniversalAPI{ + AppID: "xyz", + Actors: mockActors, CompStore: compStore, - }, - extendedMetadata: sync.Map{}, - getComponentsCapabilitesFn: func() map[string][]string { - capsMap := make(map[string][]string) - capsMap["MockComponent1Name"] = []string{"mock.feat.MockComponent1Name"} - capsMap["MockComponent2Name"] = []string{"mock.feat.MockComponent2Name"} - return capsMap - }, - } - // PutMetadata only stroes string(request body) - testAPI.extendedMetadata.Store("test", "value") - - fakeServer.StartServer(testAPI.constructMetadataEndpoints()) - - expectedBody := metadata{ - ID: "xyz", - ActiveActorsCount: []actors.ActiveActorsCount{ - { - Type: "abcd", - Count: 10, - }, - { - Type: "xyz", - Count: 5, + GetComponentsCapabilitesFn: func() map[string][]string { + capsMap := make(map[string][]string) + capsMap["MockComponent1Name"] = []string{"mock.feat.MockComponent1Name"} + capsMap["MockComponent2Name"] = []string{"mock.feat.MockComponent2Name"} + return capsMap }, - }, - Extended: map[string]string{ - "test": "value", - "daprRuntimeVersion": "edge", - }, - RegisteredComponents: []registeredComponent{ - { - Name: "MockComponent1Name", - Type: "mock.component1Type", - Version: "v1.0", - Capabilities: []string{"mock.feat.MockComponent1Name"}, - }, - { - Name: "MockComponent2Name", - Type: "mock.component2Type", - Version: "v1.0", - Capabilities: []string{"mock.feat.MockComponent2Name"}, - }, - }, - RegisteredHTTPEndpoints: []registeredHTTPEndpoint{ - {Name: "MockHTTPEndpoint"}, - }, - Subscriptions: []pubsubSubscription{ - { - PubsubName: "test", - Topic: "topic", - DeadLetterTopic: "dead", - Metadata: map[string]string{}, - Rules: []*pubsubSubscriptionRule{ - { - Match: "", - Path: "path", - }, - }, + ExtendedMetadata: map[string]string{ + "test": "value", }, }, } - expectedBodyBytes, _ := json.Marshal(expectedBody) - t.Run("Metadata - 200 OK", func(t *testing.T) { - apiPath := "v1.0/metadata" - mockActors := new(actors.MockActors) + fakeServer.StartServer(testAPI.constructMetadataEndpoints()) + + t.Run("Set Metadata", func(t *testing.T) { + resp := fakeServer.DoRequest("PUT", "v1.0/metadata/foo", []byte("bar"), nil) + assert.Equal(t, 204, resp.StatusCode) + }) - mockActors.On("GetActiveActorsCount") + expectedBody := `{"id":"xyz","actors":[{"type":"abcd","count":10},{"type":"xyz","count":5}],"components":[{"name":"MockComponent1Name","type":"mock.component1Type","version":"v1.0","capabilities":["mock.feat.MockComponent1Name"]},{"name":"MockComponent2Name","type":"mock.component2Type","version":"v1.0","capabilities":["mock.feat.MockComponent2Name"]}],"extended":{"daprRuntimeVersion":"edge","foo":"bar","test":"value"},"subscriptions":[{"pubsubname":"test","topic":"topic","rules":[{"path":"path"}],"deadLetterTopic":"dead"}],"httpEndpoints":[{"name":"MockHTTPEndpoint"}]}` - testAPI.id = "xyz" - testAPI.actor = mockActors - testAPI.daprRunTimeVersion = "edge" + t.Run("Get Metadata", func(t *testing.T) { + resp := fakeServer.DoRequest("GET", "v1.0/metadata", nil, nil) - resp := fakeServer.DoRequest("GET", apiPath, nil, nil) + // Compact the response JSON to harmonize it + if len(resp.RawBody) > 0 { + compact := &bytes.Buffer{} + err := json.Compact(compact, resp.RawBody) + require.NoError(t, err) + resp.RawBody = compact.Bytes() + } assert.Equal(t, 200, resp.StatusCode) - assert.ElementsMatch(t, expectedBodyBytes, resp.RawBody) + assert.Equal(t, expectedBody, string(resp.RawBody)) mockActors.AssertNumberOfCalls(t, "GetActiveActorsCount", 1) }) @@ -2782,10 +2750,13 @@ func TestV1ActorEndpointsWithTracer(t *testing.T) { createExporters(&buffer) + rc := resiliency.New(nil) testAPI := &api{ - actor: nil, + universal: &universalapi.UniversalAPI{ + Actors: nil, + }, tracingSpec: spec, - resiliency: resiliency.New(nil), + resiliency: rc, } fakeServer.StartServerWithTracing(spec, testAPI.constructActorEndpoints()) @@ -2795,7 +2766,7 @@ func TestV1ActorEndpointsWithTracer(t *testing.T) { t.Run("Actor runtime is not initialized", func(t *testing.T) { apiPath := "v1.0/actors/fakeActorType/fakeActorID/state/key1" - testAPI.actor = nil + testAPI.universal.Actors = nil testMethods := []string{"GET"} @@ -2827,7 +2798,7 @@ func TestV1ActorEndpointsWithTracer(t *testing.T) { ActorType: "fakeActorType", }).Return(true) - testAPI.actor = mockActors + testAPI.universal.Actors = mockActors // act resp := fakeServer.DoRequest("GET", apiPath, nil, nil) @@ -2870,7 +2841,7 @@ func TestV1ActorEndpointsWithTracer(t *testing.T) { ActorType: "fakeActorType", }).Return(true) - testAPI.actor = mockActors + testAPI.universal.Actors = mockActors // act inputBodyBytes, err := json.Marshal(testTransactionalOperations) @@ -4276,7 +4247,9 @@ func (f *fakeHTTPServer) doRequest(basicAuth, method, path string, body []byte, } url = url[:len(url)-1] } - r, _ := gohttp.NewRequest(method, url, bytes.NewBuffer(body)) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + r, _ := gohttp.NewRequestWithContext(ctx, method, url, bytes.NewReader(body)) r.Header.Set("Content-Type", "application/json") for i := 0; i < len(headers); i += 2 { @@ -5412,7 +5385,9 @@ func TestV1HealthzEndpoint(t *testing.T) { fakeServer := newFakeHTTPServer() testAPI := &api{ - actor: nil, + universal: &universalapi.UniversalAPI{ + AppID: "fakeAPI", + }, } fakeServer.StartServer(testAPI.constructHealthzEndpoints()) diff --git a/pkg/http/universalapi.go b/pkg/http/universalapi.go index d99e82a2f8f..b3d00ecf1f9 100644 --- a/pkg/http/universalapi.go +++ b/pkg/http/universalapi.go @@ -94,7 +94,11 @@ func UniversalFastHTTPHandler[T proto.Message, U proto.Message]( } // Invoke the gRPC handler - res, err := handler(reqCtx, in) + // We need to create a context specific for this because fasthttp's reqCtx is tied to the server's lifecycle and not the request's + // See: https://github.com/valyala/fasthttp/issues/1350 + ctx, cancel := context.WithCancel(reqCtx) + res, err := handler(ctx, in) + cancel() if err != nil { // Error is already logged by the handlers, we won't log it again universalFastHTTPErrorResponder(reqCtx, err) diff --git a/pkg/messages/predefined.go b/pkg/messages/predefined.go index 8c63fd24d90..88d851af73e 100644 --- a/pkg/messages/predefined.go +++ b/pkg/messages/predefined.go @@ -78,9 +78,6 @@ const ( ErrDirectInvokeMethod = "invalid method name" ErrDirectInvokeNotReady = "invoke API is not ready" - // Metadata. - ErrMetadataGet = "failed deserializing metadata: %s" - // Healthz. ErrHealthNotReady = "dapr is not ready" ErrOutboundHealthNotReady = "dapr outbound is not ready" @@ -104,6 +101,9 @@ var ( ErrStateQueryFailed = APIError{"failed query in state store %s: %s", "ERR_STATE_QUERY", http.StatusInternalServerError, grpcCodes.Internal} ErrStateQueryUnsupported = APIError{"state store does not support querying", "ERR_STATE_STORE_NOT_SUPPORTED", http.StatusInternalServerError, grpcCodes.Internal} + // PubSub. + ErrPubSubMetadataDeserialize = APIError{"failed deserializing metadata: %v", "ERR_PUBSUB_REQUEST_METADATA", http.StatusBadRequest, grpcCodes.InvalidArgument} + // Secrets. ErrSecretStoreNotConfigured = APIError{"secret store is not configured", "ERR_SECRET_STORES_NOT_CONFIGURED", http.StatusInternalServerError, grpcCodes.FailedPrecondition} ErrSecretStoreNotFound = APIError{"failed finding secret store with key %s", "ERR_SECRET_STORE_NOT_FOUND", http.StatusUnauthorized, grpcCodes.InvalidArgument} diff --git a/pkg/proto/runtime/v1/dapr.pb.go b/pkg/proto/runtime/v1/dapr.pb.go index 51d1908ff9f..ef7766f55c9 100644 --- a/pkg/proto/runtime/v1/dapr.pb.go +++ b/pkg/proto/runtime/v1/dapr.pb.go @@ -85,7 +85,7 @@ func (x UnlockResponse_Status) Number() protoreflect.EnumNumber { // Deprecated: Use UnlockResponse_Status.Descriptor instead. func (UnlockResponse_Status) EnumDescriptor() ([]byte, []int) { - return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{53, 0} + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{54, 0} } type SubtleGetKeyRequest_KeyFormat int32 @@ -133,7 +133,7 @@ func (x SubtleGetKeyRequest_KeyFormat) Number() protoreflect.EnumNumber { // Deprecated: Use SubtleGetKeyRequest_KeyFormat.Descriptor instead. func (SubtleGetKeyRequest_KeyFormat) EnumDescriptor() ([]byte, []int) { - return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{54, 0} + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{55, 0} } // InvokeServiceRequest represents the request message for Service invocation. @@ -2635,10 +2635,11 @@ type GetMetadataResponse struct { unknownFields protoimpl.UnknownFields Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - ActiveActorsCount []*ActiveActorsCount `protobuf:"bytes,2,rep,name=active_actors_count,json=activeActorsCount,proto3" json:"active_actors_count,omitempty"` - RegisteredComponents []*RegisteredComponents `protobuf:"bytes,3,rep,name=registered_components,json=registeredComponents,proto3" json:"registered_components,omitempty"` - ExtendedMetadata map[string]string `protobuf:"bytes,4,rep,name=extended_metadata,json=extendedMetadata,proto3" json:"extended_metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + ActiveActorsCount []*ActiveActorsCount `protobuf:"bytes,2,rep,name=active_actors_count,json=actors,proto3" json:"active_actors_count,omitempty"` + RegisteredComponents []*RegisteredComponents `protobuf:"bytes,3,rep,name=registered_components,json=components,proto3" json:"registered_components,omitempty"` + ExtendedMetadata map[string]string `protobuf:"bytes,4,rep,name=extended_metadata,json=extended,proto3" json:"extended_metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` Subscriptions []*PubsubSubscription `protobuf:"bytes,5,rep,name=subscriptions,proto3" json:"subscriptions,omitempty"` + HttpEndpoints []*MetadataHTTPEndpoint `protobuf:"bytes,6,rep,name=http_endpoints,json=httpEndpoints,proto3" json:"http_endpoints,omitempty"` } func (x *GetMetadataResponse) Reset() { @@ -2708,6 +2709,13 @@ func (x *GetMetadataResponse) GetSubscriptions() []*PubsubSubscription { return nil } +func (x *GetMetadataResponse) GetHttpEndpoints() []*MetadataHTTPEndpoint { + if x != nil { + return x.HttpEndpoints + } + return nil +} + type ActiveActorsCount struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2834,12 +2842,59 @@ func (x *RegisteredComponents) GetCapabilities() []string { return nil } +type MetadataHTTPEndpoint struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` +} + +func (x *MetadataHTTPEndpoint) Reset() { + *x = MetadataHTTPEndpoint{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[40] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MetadataHTTPEndpoint) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MetadataHTTPEndpoint) ProtoMessage() {} + +func (x *MetadataHTTPEndpoint) ProtoReflect() protoreflect.Message { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[40] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MetadataHTTPEndpoint.ProtoReflect.Descriptor instead. +func (*MetadataHTTPEndpoint) Descriptor() ([]byte, []int) { + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{40} +} + +func (x *MetadataHTTPEndpoint) GetName() string { + if x != nil { + return x.Name + } + return "" +} + type PubsubSubscription struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - PubsubName string `protobuf:"bytes,1,opt,name=pubsub_name,json=pubsubName,proto3" json:"pubsub_name,omitempty"` + PubsubName string `protobuf:"bytes,1,opt,name=pubsub_name,json=pubsubname,proto3" json:"pubsub_name,omitempty"` Topic string `protobuf:"bytes,2,opt,name=topic,proto3" json:"topic,omitempty"` Metadata map[string]string `protobuf:"bytes,3,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` Rules *PubsubSubscriptionRules `protobuf:"bytes,4,opt,name=rules,proto3" json:"rules,omitempty"` @@ -2849,7 +2904,7 @@ type PubsubSubscription struct { func (x *PubsubSubscription) Reset() { *x = PubsubSubscription{} if protoimpl.UnsafeEnabled { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[40] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2862,7 +2917,7 @@ func (x *PubsubSubscription) String() string { func (*PubsubSubscription) ProtoMessage() {} func (x *PubsubSubscription) ProtoReflect() protoreflect.Message { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[40] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2875,7 +2930,7 @@ func (x *PubsubSubscription) ProtoReflect() protoreflect.Message { // Deprecated: Use PubsubSubscription.ProtoReflect.Descriptor instead. func (*PubsubSubscription) Descriptor() ([]byte, []int) { - return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{40} + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{41} } func (x *PubsubSubscription) GetPubsubName() string { @@ -2924,7 +2979,7 @@ type PubsubSubscriptionRules struct { func (x *PubsubSubscriptionRules) Reset() { *x = PubsubSubscriptionRules{} if protoimpl.UnsafeEnabled { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[41] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2937,7 +2992,7 @@ func (x *PubsubSubscriptionRules) String() string { func (*PubsubSubscriptionRules) ProtoMessage() {} func (x *PubsubSubscriptionRules) ProtoReflect() protoreflect.Message { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[41] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2950,7 +3005,7 @@ func (x *PubsubSubscriptionRules) ProtoReflect() protoreflect.Message { // Deprecated: Use PubsubSubscriptionRules.ProtoReflect.Descriptor instead. func (*PubsubSubscriptionRules) Descriptor() ([]byte, []int) { - return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{41} + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{42} } func (x *PubsubSubscriptionRules) GetRules() []*PubsubSubscriptionRule { @@ -2972,7 +3027,7 @@ type PubsubSubscriptionRule struct { func (x *PubsubSubscriptionRule) Reset() { *x = PubsubSubscriptionRule{} if protoimpl.UnsafeEnabled { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[42] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2985,7 +3040,7 @@ func (x *PubsubSubscriptionRule) String() string { func (*PubsubSubscriptionRule) ProtoMessage() {} func (x *PubsubSubscriptionRule) ProtoReflect() protoreflect.Message { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[42] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2998,7 +3053,7 @@ func (x *PubsubSubscriptionRule) ProtoReflect() protoreflect.Message { // Deprecated: Use PubsubSubscriptionRule.ProtoReflect.Descriptor instead. func (*PubsubSubscriptionRule) Descriptor() ([]byte, []int) { - return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{42} + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{43} } func (x *PubsubSubscriptionRule) GetMatch() string { @@ -3027,7 +3082,7 @@ type SetMetadataRequest struct { func (x *SetMetadataRequest) Reset() { *x = SetMetadataRequest{} if protoimpl.UnsafeEnabled { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[43] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3040,7 +3095,7 @@ func (x *SetMetadataRequest) String() string { func (*SetMetadataRequest) ProtoMessage() {} func (x *SetMetadataRequest) ProtoReflect() protoreflect.Message { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[43] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3053,7 +3108,7 @@ func (x *SetMetadataRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetMetadataRequest.ProtoReflect.Descriptor instead. func (*SetMetadataRequest) Descriptor() ([]byte, []int) { - return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{43} + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{44} } func (x *SetMetadataRequest) GetKey() string { @@ -3089,7 +3144,7 @@ type GetConfigurationRequest struct { func (x *GetConfigurationRequest) Reset() { *x = GetConfigurationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[44] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3102,7 +3157,7 @@ func (x *GetConfigurationRequest) String() string { func (*GetConfigurationRequest) ProtoMessage() {} func (x *GetConfigurationRequest) ProtoReflect() protoreflect.Message { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[44] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3115,7 +3170,7 @@ func (x *GetConfigurationRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetConfigurationRequest.ProtoReflect.Descriptor instead. func (*GetConfigurationRequest) Descriptor() ([]byte, []int) { - return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{44} + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{45} } func (x *GetConfigurationRequest) GetStoreName() string { @@ -3152,7 +3207,7 @@ type GetConfigurationResponse struct { func (x *GetConfigurationResponse) Reset() { *x = GetConfigurationResponse{} if protoimpl.UnsafeEnabled { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[45] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3165,7 +3220,7 @@ func (x *GetConfigurationResponse) String() string { func (*GetConfigurationResponse) ProtoMessage() {} func (x *GetConfigurationResponse) ProtoReflect() protoreflect.Message { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[45] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3178,7 +3233,7 @@ func (x *GetConfigurationResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetConfigurationResponse.ProtoReflect.Descriptor instead. func (*GetConfigurationResponse) Descriptor() ([]byte, []int) { - return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{45} + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{46} } func (x *GetConfigurationResponse) GetItems() map[string]*v1.ConfigurationItem { @@ -3207,7 +3262,7 @@ type SubscribeConfigurationRequest struct { func (x *SubscribeConfigurationRequest) Reset() { *x = SubscribeConfigurationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[46] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3220,7 +3275,7 @@ func (x *SubscribeConfigurationRequest) String() string { func (*SubscribeConfigurationRequest) ProtoMessage() {} func (x *SubscribeConfigurationRequest) ProtoReflect() protoreflect.Message { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[46] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3233,7 +3288,7 @@ func (x *SubscribeConfigurationRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscribeConfigurationRequest.ProtoReflect.Descriptor instead. func (*SubscribeConfigurationRequest) Descriptor() ([]byte, []int) { - return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{46} + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{47} } func (x *SubscribeConfigurationRequest) GetStoreName() string { @@ -3272,7 +3327,7 @@ type UnsubscribeConfigurationRequest struct { func (x *UnsubscribeConfigurationRequest) Reset() { *x = UnsubscribeConfigurationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[47] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3285,7 +3340,7 @@ func (x *UnsubscribeConfigurationRequest) String() string { func (*UnsubscribeConfigurationRequest) ProtoMessage() {} func (x *UnsubscribeConfigurationRequest) ProtoReflect() protoreflect.Message { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[47] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3298,7 +3353,7 @@ func (x *UnsubscribeConfigurationRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UnsubscribeConfigurationRequest.ProtoReflect.Descriptor instead. func (*UnsubscribeConfigurationRequest) Descriptor() ([]byte, []int) { - return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{47} + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{48} } func (x *UnsubscribeConfigurationRequest) GetStoreName() string { @@ -3329,7 +3384,7 @@ type SubscribeConfigurationResponse struct { func (x *SubscribeConfigurationResponse) Reset() { *x = SubscribeConfigurationResponse{} if protoimpl.UnsafeEnabled { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[48] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3342,7 +3397,7 @@ func (x *SubscribeConfigurationResponse) String() string { func (*SubscribeConfigurationResponse) ProtoMessage() {} func (x *SubscribeConfigurationResponse) ProtoReflect() protoreflect.Message { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[48] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3355,7 +3410,7 @@ func (x *SubscribeConfigurationResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscribeConfigurationResponse.ProtoReflect.Descriptor instead. func (*SubscribeConfigurationResponse) Descriptor() ([]byte, []int) { - return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{48} + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{49} } func (x *SubscribeConfigurationResponse) GetId() string { @@ -3384,7 +3439,7 @@ type UnsubscribeConfigurationResponse struct { func (x *UnsubscribeConfigurationResponse) Reset() { *x = UnsubscribeConfigurationResponse{} if protoimpl.UnsafeEnabled { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[49] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3397,7 +3452,7 @@ func (x *UnsubscribeConfigurationResponse) String() string { func (*UnsubscribeConfigurationResponse) ProtoMessage() {} func (x *UnsubscribeConfigurationResponse) ProtoReflect() protoreflect.Message { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[49] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3410,7 +3465,7 @@ func (x *UnsubscribeConfigurationResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UnsubscribeConfigurationResponse.ProtoReflect.Descriptor instead. func (*UnsubscribeConfigurationResponse) Descriptor() ([]byte, []int) { - return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{49} + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{50} } func (x *UnsubscribeConfigurationResponse) GetOk() bool { @@ -3460,7 +3515,7 @@ type TryLockRequest struct { func (x *TryLockRequest) Reset() { *x = TryLockRequest{} if protoimpl.UnsafeEnabled { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[50] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3473,7 +3528,7 @@ func (x *TryLockRequest) String() string { func (*TryLockRequest) ProtoMessage() {} func (x *TryLockRequest) ProtoReflect() protoreflect.Message { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[50] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3486,7 +3541,7 @@ func (x *TryLockRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use TryLockRequest.ProtoReflect.Descriptor instead. func (*TryLockRequest) Descriptor() ([]byte, []int) { - return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{50} + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{51} } func (x *TryLockRequest) GetStoreName() string { @@ -3528,7 +3583,7 @@ type TryLockResponse struct { func (x *TryLockResponse) Reset() { *x = TryLockResponse{} if protoimpl.UnsafeEnabled { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[51] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3541,7 +3596,7 @@ func (x *TryLockResponse) String() string { func (*TryLockResponse) ProtoMessage() {} func (x *TryLockResponse) ProtoReflect() protoreflect.Message { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[51] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3554,7 +3609,7 @@ func (x *TryLockResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use TryLockResponse.ProtoReflect.Descriptor instead. func (*TryLockResponse) Descriptor() ([]byte, []int) { - return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{51} + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{52} } func (x *TryLockResponse) GetSuccess() bool { @@ -3578,7 +3633,7 @@ type UnlockRequest struct { func (x *UnlockRequest) Reset() { *x = UnlockRequest{} if protoimpl.UnsafeEnabled { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[52] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3591,7 +3646,7 @@ func (x *UnlockRequest) String() string { func (*UnlockRequest) ProtoMessage() {} func (x *UnlockRequest) ProtoReflect() protoreflect.Message { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[52] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3604,7 +3659,7 @@ func (x *UnlockRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UnlockRequest.ProtoReflect.Descriptor instead. func (*UnlockRequest) Descriptor() ([]byte, []int) { - return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{52} + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{53} } func (x *UnlockRequest) GetStoreName() string { @@ -3639,7 +3694,7 @@ type UnlockResponse struct { func (x *UnlockResponse) Reset() { *x = UnlockResponse{} if protoimpl.UnsafeEnabled { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[53] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3652,7 +3707,7 @@ func (x *UnlockResponse) String() string { func (*UnlockResponse) ProtoMessage() {} func (x *UnlockResponse) ProtoReflect() protoreflect.Message { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[53] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3665,7 +3720,7 @@ func (x *UnlockResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UnlockResponse.ProtoReflect.Descriptor instead. func (*UnlockResponse) Descriptor() ([]byte, []int) { - return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{53} + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{54} } func (x *UnlockResponse) GetStatus() UnlockResponse_Status { @@ -3692,7 +3747,7 @@ type SubtleGetKeyRequest struct { func (x *SubtleGetKeyRequest) Reset() { *x = SubtleGetKeyRequest{} if protoimpl.UnsafeEnabled { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[54] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3705,7 +3760,7 @@ func (x *SubtleGetKeyRequest) String() string { func (*SubtleGetKeyRequest) ProtoMessage() {} func (x *SubtleGetKeyRequest) ProtoReflect() protoreflect.Message { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[54] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3718,7 +3773,7 @@ func (x *SubtleGetKeyRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SubtleGetKeyRequest.ProtoReflect.Descriptor instead. func (*SubtleGetKeyRequest) Descriptor() ([]byte, []int) { - return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{54} + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{55} } func (x *SubtleGetKeyRequest) GetComponentName() string { @@ -3758,7 +3813,7 @@ type SubtleGetKeyResponse struct { func (x *SubtleGetKeyResponse) Reset() { *x = SubtleGetKeyResponse{} if protoimpl.UnsafeEnabled { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[55] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3771,7 +3826,7 @@ func (x *SubtleGetKeyResponse) String() string { func (*SubtleGetKeyResponse) ProtoMessage() {} func (x *SubtleGetKeyResponse) ProtoReflect() protoreflect.Message { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[55] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3784,7 +3839,7 @@ func (x *SubtleGetKeyResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SubtleGetKeyResponse.ProtoReflect.Descriptor instead. func (*SubtleGetKeyResponse) Descriptor() ([]byte, []int) { - return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{55} + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{56} } func (x *SubtleGetKeyResponse) GetName() string { @@ -3825,7 +3880,7 @@ type SubtleEncryptRequest struct { func (x *SubtleEncryptRequest) Reset() { *x = SubtleEncryptRequest{} if protoimpl.UnsafeEnabled { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[56] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3838,7 +3893,7 @@ func (x *SubtleEncryptRequest) String() string { func (*SubtleEncryptRequest) ProtoMessage() {} func (x *SubtleEncryptRequest) ProtoReflect() protoreflect.Message { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[56] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3851,7 +3906,7 @@ func (x *SubtleEncryptRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SubtleEncryptRequest.ProtoReflect.Descriptor instead. func (*SubtleEncryptRequest) Descriptor() ([]byte, []int) { - return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{56} + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{57} } func (x *SubtleEncryptRequest) GetComponentName() string { @@ -3912,7 +3967,7 @@ type SubtleEncryptResponse struct { func (x *SubtleEncryptResponse) Reset() { *x = SubtleEncryptResponse{} if protoimpl.UnsafeEnabled { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[57] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3925,7 +3980,7 @@ func (x *SubtleEncryptResponse) String() string { func (*SubtleEncryptResponse) ProtoMessage() {} func (x *SubtleEncryptResponse) ProtoReflect() protoreflect.Message { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[57] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3938,7 +3993,7 @@ func (x *SubtleEncryptResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SubtleEncryptResponse.ProtoReflect.Descriptor instead. func (*SubtleEncryptResponse) Descriptor() ([]byte, []int) { - return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{57} + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{58} } func (x *SubtleEncryptResponse) GetCiphertext() []byte { @@ -3982,7 +4037,7 @@ type SubtleDecryptRequest struct { func (x *SubtleDecryptRequest) Reset() { *x = SubtleDecryptRequest{} if protoimpl.UnsafeEnabled { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[58] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3995,7 +4050,7 @@ func (x *SubtleDecryptRequest) String() string { func (*SubtleDecryptRequest) ProtoMessage() {} func (x *SubtleDecryptRequest) ProtoReflect() protoreflect.Message { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[58] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4008,7 +4063,7 @@ func (x *SubtleDecryptRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SubtleDecryptRequest.ProtoReflect.Descriptor instead. func (*SubtleDecryptRequest) Descriptor() ([]byte, []int) { - return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{58} + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{59} } func (x *SubtleDecryptRequest) GetComponentName() string { @@ -4073,7 +4128,7 @@ type SubtleDecryptResponse struct { func (x *SubtleDecryptResponse) Reset() { *x = SubtleDecryptResponse{} if protoimpl.UnsafeEnabled { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[59] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4086,7 +4141,7 @@ func (x *SubtleDecryptResponse) String() string { func (*SubtleDecryptResponse) ProtoMessage() {} func (x *SubtleDecryptResponse) ProtoReflect() protoreflect.Message { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[59] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4099,7 +4154,7 @@ func (x *SubtleDecryptResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SubtleDecryptResponse.ProtoReflect.Descriptor instead. func (*SubtleDecryptResponse) Descriptor() ([]byte, []int) { - return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{59} + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{60} } func (x *SubtleDecryptResponse) GetPlaintext() []byte { @@ -4133,7 +4188,7 @@ type SubtleWrapKeyRequest struct { func (x *SubtleWrapKeyRequest) Reset() { *x = SubtleWrapKeyRequest{} if protoimpl.UnsafeEnabled { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[60] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4146,7 +4201,7 @@ func (x *SubtleWrapKeyRequest) String() string { func (*SubtleWrapKeyRequest) ProtoMessage() {} func (x *SubtleWrapKeyRequest) ProtoReflect() protoreflect.Message { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[60] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4159,7 +4214,7 @@ func (x *SubtleWrapKeyRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SubtleWrapKeyRequest.ProtoReflect.Descriptor instead. func (*SubtleWrapKeyRequest) Descriptor() ([]byte, []int) { - return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{60} + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{61} } func (x *SubtleWrapKeyRequest) GetComponentName() string { @@ -4220,7 +4275,7 @@ type SubtleWrapKeyResponse struct { func (x *SubtleWrapKeyResponse) Reset() { *x = SubtleWrapKeyResponse{} if protoimpl.UnsafeEnabled { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[61] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4233,7 +4288,7 @@ func (x *SubtleWrapKeyResponse) String() string { func (*SubtleWrapKeyResponse) ProtoMessage() {} func (x *SubtleWrapKeyResponse) ProtoReflect() protoreflect.Message { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[61] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4246,7 +4301,7 @@ func (x *SubtleWrapKeyResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SubtleWrapKeyResponse.ProtoReflect.Descriptor instead. func (*SubtleWrapKeyResponse) Descriptor() ([]byte, []int) { - return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{61} + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{62} } func (x *SubtleWrapKeyResponse) GetWrappedKey() []byte { @@ -4290,7 +4345,7 @@ type SubtleUnwrapKeyRequest struct { func (x *SubtleUnwrapKeyRequest) Reset() { *x = SubtleUnwrapKeyRequest{} if protoimpl.UnsafeEnabled { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[62] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4303,7 +4358,7 @@ func (x *SubtleUnwrapKeyRequest) String() string { func (*SubtleUnwrapKeyRequest) ProtoMessage() {} func (x *SubtleUnwrapKeyRequest) ProtoReflect() protoreflect.Message { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[62] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4316,7 +4371,7 @@ func (x *SubtleUnwrapKeyRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SubtleUnwrapKeyRequest.ProtoReflect.Descriptor instead. func (*SubtleUnwrapKeyRequest) Descriptor() ([]byte, []int) { - return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{62} + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{63} } func (x *SubtleUnwrapKeyRequest) GetComponentName() string { @@ -4381,7 +4436,7 @@ type SubtleUnwrapKeyResponse struct { func (x *SubtleUnwrapKeyResponse) Reset() { *x = SubtleUnwrapKeyResponse{} if protoimpl.UnsafeEnabled { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[63] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4394,7 +4449,7 @@ func (x *SubtleUnwrapKeyResponse) String() string { func (*SubtleUnwrapKeyResponse) ProtoMessage() {} func (x *SubtleUnwrapKeyResponse) ProtoReflect() protoreflect.Message { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[63] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4407,7 +4462,7 @@ func (x *SubtleUnwrapKeyResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SubtleUnwrapKeyResponse.ProtoReflect.Descriptor instead. func (*SubtleUnwrapKeyResponse) Descriptor() ([]byte, []int) { - return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{63} + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{64} } func (x *SubtleUnwrapKeyResponse) GetPlaintextKey() []byte { @@ -4436,7 +4491,7 @@ type SubtleSignRequest struct { func (x *SubtleSignRequest) Reset() { *x = SubtleSignRequest{} if protoimpl.UnsafeEnabled { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[64] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4449,7 +4504,7 @@ func (x *SubtleSignRequest) String() string { func (*SubtleSignRequest) ProtoMessage() {} func (x *SubtleSignRequest) ProtoReflect() protoreflect.Message { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[64] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4462,7 +4517,7 @@ func (x *SubtleSignRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SubtleSignRequest.ProtoReflect.Descriptor instead. func (*SubtleSignRequest) Descriptor() ([]byte, []int) { - return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{64} + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{65} } func (x *SubtleSignRequest) GetComponentName() string { @@ -4506,7 +4561,7 @@ type SubtleSignResponse struct { func (x *SubtleSignResponse) Reset() { *x = SubtleSignResponse{} if protoimpl.UnsafeEnabled { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[65] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4519,7 +4574,7 @@ func (x *SubtleSignResponse) String() string { func (*SubtleSignResponse) ProtoMessage() {} func (x *SubtleSignResponse) ProtoReflect() protoreflect.Message { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[65] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4532,7 +4587,7 @@ func (x *SubtleSignResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SubtleSignResponse.ProtoReflect.Descriptor instead. func (*SubtleSignResponse) Descriptor() ([]byte, []int) { - return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{65} + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{66} } func (x *SubtleSignResponse) GetSignature() []byte { @@ -4563,7 +4618,7 @@ type SubtleVerifyRequest struct { func (x *SubtleVerifyRequest) Reset() { *x = SubtleVerifyRequest{} if protoimpl.UnsafeEnabled { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[66] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4576,7 +4631,7 @@ func (x *SubtleVerifyRequest) String() string { func (*SubtleVerifyRequest) ProtoMessage() {} func (x *SubtleVerifyRequest) ProtoReflect() protoreflect.Message { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[66] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[67] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4589,7 +4644,7 @@ func (x *SubtleVerifyRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SubtleVerifyRequest.ProtoReflect.Descriptor instead. func (*SubtleVerifyRequest) Descriptor() ([]byte, []int) { - return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{66} + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{67} } func (x *SubtleVerifyRequest) GetComponentName() string { @@ -4640,7 +4695,7 @@ type SubtleVerifyResponse struct { func (x *SubtleVerifyResponse) Reset() { *x = SubtleVerifyResponse{} if protoimpl.UnsafeEnabled { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[67] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4653,7 +4708,7 @@ func (x *SubtleVerifyResponse) String() string { func (*SubtleVerifyResponse) ProtoMessage() {} func (x *SubtleVerifyResponse) ProtoReflect() protoreflect.Message { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[67] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[68] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4666,7 +4721,7 @@ func (x *SubtleVerifyResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SubtleVerifyResponse.ProtoReflect.Descriptor instead. func (*SubtleVerifyResponse) Descriptor() ([]byte, []int) { - return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{67} + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{68} } func (x *SubtleVerifyResponse) GetValid() bool { @@ -4691,7 +4746,7 @@ type EncryptRequest struct { func (x *EncryptRequest) Reset() { *x = EncryptRequest{} if protoimpl.UnsafeEnabled { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[68] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4704,7 +4759,7 @@ func (x *EncryptRequest) String() string { func (*EncryptRequest) ProtoMessage() {} func (x *EncryptRequest) ProtoReflect() protoreflect.Message { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[68] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[69] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4717,7 +4772,7 @@ func (x *EncryptRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use EncryptRequest.ProtoReflect.Descriptor instead. func (*EncryptRequest) Descriptor() ([]byte, []int) { - return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{68} + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{69} } func (x *EncryptRequest) GetOptions() *EncryptRequestOptions { @@ -4763,7 +4818,7 @@ type EncryptRequestOptions struct { func (x *EncryptRequestOptions) Reset() { *x = EncryptRequestOptions{} if protoimpl.UnsafeEnabled { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[69] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4776,7 +4831,7 @@ func (x *EncryptRequestOptions) String() string { func (*EncryptRequestOptions) ProtoMessage() {} func (x *EncryptRequestOptions) ProtoReflect() protoreflect.Message { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[69] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[70] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4789,7 +4844,7 @@ func (x *EncryptRequestOptions) ProtoReflect() protoreflect.Message { // Deprecated: Use EncryptRequestOptions.ProtoReflect.Descriptor instead. func (*EncryptRequestOptions) Descriptor() ([]byte, []int) { - return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{69} + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{70} } func (x *EncryptRequestOptions) GetComponentName() string { @@ -4847,7 +4902,7 @@ type EncryptResponse struct { func (x *EncryptResponse) Reset() { *x = EncryptResponse{} if protoimpl.UnsafeEnabled { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[70] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4860,7 +4915,7 @@ func (x *EncryptResponse) String() string { func (*EncryptResponse) ProtoMessage() {} func (x *EncryptResponse) ProtoReflect() protoreflect.Message { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[70] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[71] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4873,7 +4928,7 @@ func (x *EncryptResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use EncryptResponse.ProtoReflect.Descriptor instead. func (*EncryptResponse) Descriptor() ([]byte, []int) { - return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{70} + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{71} } func (x *EncryptResponse) GetPayload() *v1.StreamPayload { @@ -4898,7 +4953,7 @@ type DecryptRequest struct { func (x *DecryptRequest) Reset() { *x = DecryptRequest{} if protoimpl.UnsafeEnabled { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[71] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4911,7 +4966,7 @@ func (x *DecryptRequest) String() string { func (*DecryptRequest) ProtoMessage() {} func (x *DecryptRequest) ProtoReflect() protoreflect.Message { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[71] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[72] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4924,7 +4979,7 @@ func (x *DecryptRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DecryptRequest.ProtoReflect.Descriptor instead. func (*DecryptRequest) Descriptor() ([]byte, []int) { - return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{71} + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{72} } func (x *DecryptRequest) GetOptions() *DecryptRequestOptions { @@ -4958,7 +5013,7 @@ type DecryptRequestOptions struct { func (x *DecryptRequestOptions) Reset() { *x = DecryptRequestOptions{} if protoimpl.UnsafeEnabled { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[72] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4971,7 +5026,7 @@ func (x *DecryptRequestOptions) String() string { func (*DecryptRequestOptions) ProtoMessage() {} func (x *DecryptRequestOptions) ProtoReflect() protoreflect.Message { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[72] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[73] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4984,7 +5039,7 @@ func (x *DecryptRequestOptions) ProtoReflect() protoreflect.Message { // Deprecated: Use DecryptRequestOptions.ProtoReflect.Descriptor instead. func (*DecryptRequestOptions) Descriptor() ([]byte, []int) { - return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{72} + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{73} } func (x *DecryptRequestOptions) GetComponentName() string { @@ -5014,7 +5069,7 @@ type DecryptResponse struct { func (x *DecryptResponse) Reset() { *x = DecryptResponse{} if protoimpl.UnsafeEnabled { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[73] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[74] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5027,7 +5082,7 @@ func (x *DecryptResponse) String() string { func (*DecryptResponse) ProtoMessage() {} func (x *DecryptResponse) ProtoReflect() protoreflect.Message { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[73] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[74] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5040,7 +5095,7 @@ func (x *DecryptResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DecryptResponse.ProtoReflect.Descriptor instead. func (*DecryptResponse) Descriptor() ([]byte, []int) { - return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{73} + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{74} } func (x *DecryptResponse) GetPayload() *v1.StreamPayload { @@ -5065,7 +5120,7 @@ type GetWorkflowRequest struct { func (x *GetWorkflowRequest) Reset() { *x = GetWorkflowRequest{} if protoimpl.UnsafeEnabled { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[74] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[75] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5078,7 +5133,7 @@ func (x *GetWorkflowRequest) String() string { func (*GetWorkflowRequest) ProtoMessage() {} func (x *GetWorkflowRequest) ProtoReflect() protoreflect.Message { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[74] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[75] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5091,7 +5146,7 @@ func (x *GetWorkflowRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetWorkflowRequest.ProtoReflect.Descriptor instead. func (*GetWorkflowRequest) Descriptor() ([]byte, []int) { - return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{74} + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{75} } func (x *GetWorkflowRequest) GetInstanceId() string { @@ -5131,7 +5186,7 @@ type GetWorkflowResponse struct { func (x *GetWorkflowResponse) Reset() { *x = GetWorkflowResponse{} if protoimpl.UnsafeEnabled { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[75] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5144,7 +5199,7 @@ func (x *GetWorkflowResponse) String() string { func (*GetWorkflowResponse) ProtoMessage() {} func (x *GetWorkflowResponse) ProtoReflect() protoreflect.Message { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[75] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[76] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5157,7 +5212,7 @@ func (x *GetWorkflowResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetWorkflowResponse.ProtoReflect.Descriptor instead. func (*GetWorkflowResponse) Descriptor() ([]byte, []int) { - return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{75} + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{76} } func (x *GetWorkflowResponse) GetInstanceId() string { @@ -5223,7 +5278,7 @@ type StartWorkflowRequest struct { func (x *StartWorkflowRequest) Reset() { *x = StartWorkflowRequest{} if protoimpl.UnsafeEnabled { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[76] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5236,7 +5291,7 @@ func (x *StartWorkflowRequest) String() string { func (*StartWorkflowRequest) ProtoMessage() {} func (x *StartWorkflowRequest) ProtoReflect() protoreflect.Message { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[76] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[77] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5249,7 +5304,7 @@ func (x *StartWorkflowRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use StartWorkflowRequest.ProtoReflect.Descriptor instead. func (*StartWorkflowRequest) Descriptor() ([]byte, []int) { - return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{76} + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{77} } func (x *StartWorkflowRequest) GetInstanceId() string { @@ -5300,7 +5355,7 @@ type StartWorkflowResponse struct { func (x *StartWorkflowResponse) Reset() { *x = StartWorkflowResponse{} if protoimpl.UnsafeEnabled { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[77] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5313,7 +5368,7 @@ func (x *StartWorkflowResponse) String() string { func (*StartWorkflowResponse) ProtoMessage() {} func (x *StartWorkflowResponse) ProtoReflect() protoreflect.Message { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[77] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[78] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5326,7 +5381,7 @@ func (x *StartWorkflowResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use StartWorkflowResponse.ProtoReflect.Descriptor instead. func (*StartWorkflowResponse) Descriptor() ([]byte, []int) { - return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{77} + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{78} } func (x *StartWorkflowResponse) GetInstanceId() string { @@ -5351,7 +5406,7 @@ type TerminateWorkflowRequest struct { func (x *TerminateWorkflowRequest) Reset() { *x = TerminateWorkflowRequest{} if protoimpl.UnsafeEnabled { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[78] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5364,7 +5419,7 @@ func (x *TerminateWorkflowRequest) String() string { func (*TerminateWorkflowRequest) ProtoMessage() {} func (x *TerminateWorkflowRequest) ProtoReflect() protoreflect.Message { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[78] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[79] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5377,7 +5432,7 @@ func (x *TerminateWorkflowRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use TerminateWorkflowRequest.ProtoReflect.Descriptor instead. func (*TerminateWorkflowRequest) Descriptor() ([]byte, []int) { - return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{78} + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{79} } func (x *TerminateWorkflowRequest) GetInstanceId() string { @@ -5409,7 +5464,7 @@ type PauseWorkflowRequest struct { func (x *PauseWorkflowRequest) Reset() { *x = PauseWorkflowRequest{} if protoimpl.UnsafeEnabled { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[79] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5422,7 +5477,7 @@ func (x *PauseWorkflowRequest) String() string { func (*PauseWorkflowRequest) ProtoMessage() {} func (x *PauseWorkflowRequest) ProtoReflect() protoreflect.Message { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[79] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[80] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5435,7 +5490,7 @@ func (x *PauseWorkflowRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PauseWorkflowRequest.ProtoReflect.Descriptor instead. func (*PauseWorkflowRequest) Descriptor() ([]byte, []int) { - return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{79} + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{80} } func (x *PauseWorkflowRequest) GetInstanceId() string { @@ -5467,7 +5522,7 @@ type ResumeWorkflowRequest struct { func (x *ResumeWorkflowRequest) Reset() { *x = ResumeWorkflowRequest{} if protoimpl.UnsafeEnabled { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[80] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[81] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5480,7 +5535,7 @@ func (x *ResumeWorkflowRequest) String() string { func (*ResumeWorkflowRequest) ProtoMessage() {} func (x *ResumeWorkflowRequest) ProtoReflect() protoreflect.Message { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[80] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[81] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5493,7 +5548,7 @@ func (x *ResumeWorkflowRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ResumeWorkflowRequest.ProtoReflect.Descriptor instead. func (*ResumeWorkflowRequest) Descriptor() ([]byte, []int) { - return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{80} + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{81} } func (x *ResumeWorkflowRequest) GetInstanceId() string { @@ -5529,7 +5584,7 @@ type RaiseEventWorkflowRequest struct { func (x *RaiseEventWorkflowRequest) Reset() { *x = RaiseEventWorkflowRequest{} if protoimpl.UnsafeEnabled { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[81] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[82] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5542,7 +5597,7 @@ func (x *RaiseEventWorkflowRequest) String() string { func (*RaiseEventWorkflowRequest) ProtoMessage() {} func (x *RaiseEventWorkflowRequest) ProtoReflect() protoreflect.Message { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[81] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[82] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5555,7 +5610,7 @@ func (x *RaiseEventWorkflowRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RaiseEventWorkflowRequest.ProtoReflect.Descriptor instead. func (*RaiseEventWorkflowRequest) Descriptor() ([]byte, []int) { - return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{81} + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{82} } func (x *RaiseEventWorkflowRequest) GetInstanceId() string { @@ -5601,7 +5656,7 @@ type PurgeWorkflowRequest struct { func (x *PurgeWorkflowRequest) Reset() { *x = PurgeWorkflowRequest{} if protoimpl.UnsafeEnabled { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[82] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[83] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5614,7 +5669,7 @@ func (x *PurgeWorkflowRequest) String() string { func (*PurgeWorkflowRequest) ProtoMessage() {} func (x *PurgeWorkflowRequest) ProtoReflect() protoreflect.Message { - mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[82] + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[83] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5627,7 +5682,7 @@ func (x *PurgeWorkflowRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PurgeWorkflowRequest.ProtoReflect.Descriptor instead. func (*PurgeWorkflowRequest) Descriptor() ([]byte, []int) { - return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{82} + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{83} } func (x *PurgeWorkflowRequest) GetInstanceId() string { @@ -6088,772 +6143,778 @@ var file_dapr_proto_runtime_v1_dapr_proto_rawDesc = []byte{ 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x29, 0x0a, 0x13, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x41, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, - 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0xe6, - 0x03, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, + 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x9d, + 0x04, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x58, 0x0a, 0x13, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x4d, 0x0a, 0x13, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, - 0x76, 0x65, 0x41, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x11, 0x61, - 0x63, 0x74, 0x69, 0x76, 0x65, 0x41, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x12, 0x60, 0x0a, 0x15, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x5f, 0x63, - 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x2b, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, - 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x14, 0x72, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, - 0x74, 0x73, 0x12, 0x6d, 0x0a, 0x11, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x6d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, - 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, - 0x65, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x10, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x12, 0x4f, 0x0a, 0x0d, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, + 0x76, 0x65, 0x41, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x06, 0x61, + 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x56, 0x0a, 0x15, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, + 0x72, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x73, 0x52, 0x0a, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x65, 0x0a, + 0x11, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x50, 0x75, 0x62, 0x73, 0x75, 0x62, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x1a, 0x43, 0x0a, 0x15, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3d, 0x0a, 0x11, 0x41, 0x63, 0x74, 0x69, 0x76, - 0x65, 0x41, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x7c, 0x0a, 0x14, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, - 0x65, 0x72, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, - 0x74, 0x69, 0x65, 0x73, 0x22, 0xcf, 0x02, 0x0a, 0x12, 0x50, 0x75, 0x62, 0x73, 0x75, 0x62, 0x53, - 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x70, - 0x75, 0x62, 0x73, 0x75, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x70, 0x75, 0x62, 0x73, 0x75, 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x74, 0x6f, 0x70, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x70, - 0x69, 0x63, 0x12, 0x53, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x62, - 0x73, 0x75, 0x62, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2e, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x44, 0x0a, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, - 0x75, 0x62, 0x73, 0x75, 0x62, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x2a, 0x0a, - 0x11, 0x64, 0x65, 0x61, 0x64, 0x5f, 0x6c, 0x65, 0x74, 0x74, 0x65, 0x72, 0x5f, 0x74, 0x6f, 0x70, - 0x69, 0x63, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x61, 0x64, 0x4c, 0x65, - 0x74, 0x74, 0x65, 0x72, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x5e, 0x0a, 0x17, 0x50, 0x75, 0x62, 0x73, 0x75, 0x62, - 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x75, 0x6c, 0x65, - 0x73, 0x12, 0x43, 0x0a, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x2d, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x62, 0x73, 0x75, 0x62, 0x53, - 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x75, 0x6c, 0x65, 0x52, - 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x22, 0x42, 0x0a, 0x16, 0x50, 0x75, 0x62, 0x73, 0x75, 0x62, - 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x75, 0x6c, 0x65, - 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x22, 0x3c, 0x0a, 0x12, 0x53, 0x65, - 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xe3, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x12, 0x58, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x64, 0x61, 0x70, 0x72, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, + 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x65, 0x78, 0x74, 0x65, + 0x6e, 0x64, 0x65, 0x64, 0x12, 0x4f, 0x0a, 0x0d, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x64, 0x61, + 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x62, 0x73, 0x75, 0x62, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x52, 0x0a, 0x0e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x65, 0x6e, + 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, + 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x48, 0x54, + 0x54, 0x50, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x0d, 0x68, 0x74, 0x74, 0x70, + 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x1a, 0x43, 0x0a, 0x15, 0x45, 0x78, 0x74, + 0x65, 0x6e, 0x64, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xcf, - 0x01, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x50, 0x0a, 0x05, 0x69, - 0x74, 0x65, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x64, 0x61, 0x70, - 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x49, 0x74, 0x65, 0x6d, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x1a, 0x61, 0x0a, - 0x0a, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3d, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x64, - 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0xef, 0x01, 0x0a, 0x1d, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x04, 0x6b, 0x65, 0x79, 0x73, 0x12, 0x5e, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x42, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3d, + 0x0a, 0x11, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x41, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x7c, 0x0a, + 0x14, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, + 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, + 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x63, + 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x22, 0x2a, 0x0a, 0x14, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x48, 0x54, 0x54, 0x50, 0x45, 0x6e, 0x64, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xcf, 0x02, 0x0a, 0x12, 0x50, 0x75, 0x62, 0x73, + 0x75, 0x62, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, + 0x0a, 0x0b, 0x70, 0x75, 0x62, 0x73, 0x75, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x75, 0x62, 0x73, 0x75, 0x62, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x74, 0x6f, 0x70, 0x69, 0x63, 0x12, 0x53, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0x50, 0x0a, 0x1f, 0x55, 0x6e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, + 0x50, 0x75, 0x62, 0x73, 0x75, 0x62, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x44, 0x0a, 0x05, 0x72, 0x75, + 0x6c, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x64, 0x61, 0x70, 0x72, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x50, 0x75, 0x62, 0x73, 0x75, 0x62, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, + 0x12, 0x2a, 0x0a, 0x11, 0x64, 0x65, 0x61, 0x64, 0x5f, 0x6c, 0x65, 0x74, 0x74, 0x65, 0x72, 0x5f, + 0x74, 0x6f, 0x70, 0x69, 0x63, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x61, + 0x64, 0x4c, 0x65, 0x74, 0x74, 0x65, 0x72, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x1a, 0x3b, 0x0a, 0x0d, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x5e, 0x0a, 0x17, 0x50, 0x75, 0x62, + 0x73, 0x75, 0x62, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x75, 0x6c, 0x65, 0x73, 0x12, 0x43, 0x0a, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x62, 0x73, + 0x75, 0x62, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x75, + 0x6c, 0x65, 0x52, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x22, 0x42, 0x0a, 0x16, 0x50, 0x75, 0x62, + 0x73, 0x75, 0x62, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x75, 0x6c, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, + 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x22, 0x3c, 0x0a, + 0x12, 0x53, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xe3, 0x01, 0x0a, 0x17, + 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, + 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x12, 0x58, 0x0a, 0x08, 0x6d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x64, + 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0xcf, 0x01, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x50, + 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, + 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x49, + 0x74, 0x65, 0x6d, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, + 0x1a, 0x61, 0x0a, 0x0a, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x3d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x27, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0xef, 0x01, 0x0a, 0x1d, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x22, 0xeb, 0x01, 0x0a, 0x1e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, - 0x62, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x56, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, - 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x49, 0x74, - 0x65, 0x6d, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x1a, - 0x61, 0x0a, 0x0a, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x3d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, - 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0x4c, 0x0a, 0x20, 0x55, 0x6e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, - 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x22, 0x9b, 0x01, 0x0a, 0x0e, 0x54, 0x72, 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6f, 0x77, 0x6e, 0x65, - 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x6f, 0x63, 0x6b, 0x4f, 0x77, 0x6e, - 0x65, 0x72, 0x12, 0x2a, 0x0a, 0x11, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x5f, 0x69, 0x6e, 0x5f, - 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x65, - 0x78, 0x70, 0x69, 0x72, 0x79, 0x49, 0x6e, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x22, 0x2b, - 0x0a, 0x0f, 0x54, 0x72, 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x6e, 0x0a, 0x0d, 0x55, - 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, - 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x72, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, - 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x6c, 0x6f, 0x63, 0x6b, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x22, 0xb6, 0x01, 0x0a, 0x0e, - 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x44, - 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, - 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x22, 0x5e, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, - 0x0a, 0x07, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x4c, - 0x4f, 0x43, 0x4b, 0x5f, 0x44, 0x4f, 0x45, 0x53, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x45, 0x58, 0x49, - 0x53, 0x54, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x42, 0x45, 0x4c, - 0x4f, 0x4e, 0x47, 0x53, 0x5f, 0x54, 0x4f, 0x5f, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x53, 0x10, 0x02, - 0x12, 0x12, 0x0a, 0x0e, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, - 0x4f, 0x52, 0x10, 0x03, 0x22, 0xbe, 0x01, 0x0a, 0x13, 0x53, 0x75, 0x62, 0x74, 0x6c, 0x65, 0x47, - 0x65, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x12, 0x5e, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x42, 0x2e, 0x64, 0x61, 0x70, + 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x50, 0x0a, 0x1f, 0x55, 0x6e, 0x73, 0x75, 0x62, 0x73, 0x63, + 0x72, 0x69, 0x62, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, + 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, + 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0xeb, 0x01, 0x0a, 0x1e, 0x53, 0x75, 0x62, 0x73, + 0x63, 0x72, 0x69, 0x62, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x56, 0x0a, 0x05, 0x69, 0x74, + 0x65, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x64, 0x61, 0x70, 0x72, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x1a, 0x61, 0x0a, 0x0a, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x3d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x27, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x4c, 0x0a, 0x20, 0x55, 0x6e, 0x73, 0x75, 0x62, 0x73, 0x63, + 0x72, 0x69, 0x62, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x22, 0x9b, 0x01, 0x0a, 0x0e, 0x54, 0x72, 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, + 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6f, + 0x77, 0x6e, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x6f, 0x63, 0x6b, + 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x2a, 0x0a, 0x11, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x5f, + 0x69, 0x6e, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x49, 0x6e, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, + 0x73, 0x22, 0x2b, 0x0a, 0x0f, 0x54, 0x72, 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x6e, + 0x0a, 0x0d, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, + 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x12, + 0x1d, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x6f, 0x63, 0x6b, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x22, 0xb6, + 0x01, 0x0a, 0x0e, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x44, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x2c, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x5e, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x10, 0x00, 0x12, 0x17, + 0x0a, 0x13, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x44, 0x4f, 0x45, 0x53, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, + 0x45, 0x58, 0x49, 0x53, 0x54, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, + 0x42, 0x45, 0x4c, 0x4f, 0x4e, 0x47, 0x53, 0x5f, 0x54, 0x4f, 0x5f, 0x4f, 0x54, 0x48, 0x45, 0x52, + 0x53, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, + 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x03, 0x22, 0xbe, 0x01, 0x0a, 0x13, 0x53, 0x75, 0x62, 0x74, + 0x6c, 0x65, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x4c, 0x0a, 0x06, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x34, 0x2e, 0x64, 0x61, 0x70, + 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x74, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4b, 0x65, 0x79, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x1e, 0x0a, 0x09, 0x4b, 0x65, 0x79, 0x46, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x07, 0x0a, 0x03, 0x50, 0x45, 0x4d, 0x10, 0x00, 0x12, 0x08, + 0x0a, 0x04, 0x4a, 0x53, 0x4f, 0x4e, 0x10, 0x01, 0x22, 0x49, 0x0a, 0x14, 0x53, 0x75, 0x62, 0x74, + 0x6c, 0x65, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, + 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, + 0x4b, 0x65, 0x79, 0x22, 0xd3, 0x01, 0x0a, 0x14, 0x53, 0x75, 0x62, 0x74, 0x6c, 0x65, 0x45, 0x6e, + 0x63, 0x72, 0x79, 0x70, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x4c, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, - 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x34, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x53, 0x75, 0x62, 0x74, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x2e, 0x4b, 0x65, 0x79, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x06, 0x66, - 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x1e, 0x0a, 0x09, 0x4b, 0x65, 0x79, 0x46, 0x6f, 0x72, 0x6d, - 0x61, 0x74, 0x12, 0x07, 0x0a, 0x03, 0x50, 0x45, 0x4d, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x4a, - 0x53, 0x4f, 0x4e, 0x10, 0x01, 0x22, 0x49, 0x0a, 0x14, 0x53, 0x75, 0x62, 0x74, 0x6c, 0x65, 0x47, - 0x65, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, - 0x22, 0xd3, 0x01, 0x0a, 0x14, 0x53, 0x75, 0x62, 0x74, 0x6c, 0x65, 0x45, 0x6e, 0x63, 0x72, 0x79, - 0x70, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, - 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x09, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x1c, - 0x0a, 0x09, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x12, 0x19, 0x0a, 0x08, - 0x6b, 0x65, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x6b, 0x65, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x27, 0x0a, - 0x0f, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x64, 0x61, 0x74, 0x61, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, - 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x22, 0x49, 0x0a, 0x15, 0x53, 0x75, 0x62, 0x74, 0x6c, 0x65, - 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x1e, 0x0a, 0x0a, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x74, 0x65, 0x78, 0x74, 0x12, - 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x74, 0x61, - 0x67, 0x22, 0xe7, 0x01, 0x0a, 0x14, 0x53, 0x75, 0x62, 0x74, 0x6c, 0x65, 0x44, 0x65, 0x63, 0x72, - 0x79, 0x70, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, - 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x74, 0x65, 0x78, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x74, 0x65, 0x78, + 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x12, 0x19, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6b, 0x65, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, - 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x74, - 0x61, 0x67, 0x12, 0x27, 0x0a, 0x0f, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64, - 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x61, 0x73, 0x73, - 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x22, 0x35, 0x0a, 0x15, 0x53, - 0x75, 0x62, 0x74, 0x6c, 0x65, 0x44, 0x65, 0x63, 0x72, 0x79, 0x70, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, - 0x78, 0x74, 0x22, 0xda, 0x01, 0x0a, 0x14, 0x53, 0x75, 0x62, 0x74, 0x6c, 0x65, 0x57, 0x72, 0x61, - 0x70, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x63, - 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x5f, - 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x70, 0x6c, 0x61, 0x69, 0x6e, - 0x74, 0x65, 0x78, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x6c, 0x67, 0x6f, 0x72, - 0x69, 0x74, 0x68, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x6c, 0x67, 0x6f, - 0x72, 0x69, 0x74, 0x68, 0x6d, 0x12, 0x19, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6b, 0x65, 0x79, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, - 0x61, 0x74, 0x65, 0x64, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x0e, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x22, - 0x4a, 0x0a, 0x15, 0x53, 0x75, 0x62, 0x74, 0x6c, 0x65, 0x57, 0x72, 0x61, 0x70, 0x4b, 0x65, 0x79, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x77, 0x72, 0x61, 0x70, - 0x70, 0x65, 0x64, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x77, - 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x74, 0x61, 0x67, 0x22, 0xea, 0x01, 0x0a, 0x16, - 0x53, 0x75, 0x62, 0x74, 0x6c, 0x65, 0x55, 0x6e, 0x77, 0x72, 0x61, 0x70, 0x4b, 0x65, 0x79, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, - 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, - 0x0b, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x0a, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x12, 0x1c, - 0x0a, 0x09, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x12, 0x19, 0x0a, 0x08, - 0x6b, 0x65, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x6b, 0x65, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x10, 0x0a, - 0x03, 0x74, 0x61, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x74, 0x61, 0x67, 0x12, - 0x27, 0x0a, 0x0f, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x64, 0x61, - 0x74, 0x61, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, - 0x61, 0x74, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x22, 0x3e, 0x0a, 0x17, 0x53, 0x75, 0x62, 0x74, - 0x6c, 0x65, 0x55, 0x6e, 0x77, 0x72, 0x61, 0x70, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, - 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x70, 0x6c, 0x61, 0x69, - 0x6e, 0x74, 0x65, 0x78, 0x74, 0x4b, 0x65, 0x79, 0x22, 0x8b, 0x01, 0x0a, 0x11, 0x53, 0x75, 0x62, - 0x74, 0x6c, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, + 0x12, 0x27, 0x0a, 0x0f, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x64, + 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x61, 0x73, 0x73, 0x6f, 0x63, + 0x69, 0x61, 0x74, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x22, 0x49, 0x0a, 0x15, 0x53, 0x75, 0x62, + 0x74, 0x6c, 0x65, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x74, 0x65, 0x78, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x74, 0x65, + 0x78, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x03, 0x74, 0x61, 0x67, 0x22, 0xe7, 0x01, 0x0a, 0x14, 0x53, 0x75, 0x62, 0x74, 0x6c, 0x65, 0x44, + 0x65, 0x63, 0x72, 0x79, 0x70, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, + 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x74, 0x65, + 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, + 0x74, 0x65, 0x78, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, + 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, + 0x68, 0x6d, 0x12, 0x19, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6b, 0x65, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, + 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x6e, 0x6f, + 0x6e, 0x63, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x03, 0x74, 0x61, 0x67, 0x12, 0x27, 0x0a, 0x0f, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, + 0x74, 0x65, 0x64, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, + 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x22, 0x35, + 0x0a, 0x15, 0x53, 0x75, 0x62, 0x74, 0x6c, 0x65, 0x44, 0x65, 0x63, 0x72, 0x79, 0x70, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x6c, 0x61, 0x69, 0x6e, + 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x70, 0x6c, 0x61, 0x69, + 0x6e, 0x74, 0x65, 0x78, 0x74, 0x22, 0xda, 0x01, 0x0a, 0x14, 0x53, 0x75, 0x62, 0x74, 0x6c, 0x65, + 0x57, 0x72, 0x61, 0x70, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, - 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, - 0x09, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x12, 0x19, 0x0a, 0x08, 0x6b, - 0x65, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6b, - 0x65, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x32, 0x0a, 0x12, 0x53, 0x75, 0x62, 0x74, 0x6c, 0x65, - 0x53, 0x69, 0x67, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, - 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0xab, 0x01, 0x0a, 0x13, 0x53, - 0x75, 0x62, 0x74, 0x6c, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x69, 0x67, - 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x64, 0x69, 0x67, 0x65, 0x73, - 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x18, 0x03, + 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, + 0x78, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x70, 0x6c, + 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x6c, + 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, + 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x12, 0x19, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6b, 0x65, 0x79, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x61, 0x73, 0x73, + 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x0e, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64, 0x44, 0x61, + 0x74, 0x61, 0x22, 0x4a, 0x0a, 0x15, 0x53, 0x75, 0x62, 0x74, 0x6c, 0x65, 0x57, 0x72, 0x61, 0x70, + 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x77, + 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x0a, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x74, 0x61, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x74, 0x61, 0x67, 0x22, 0xea, + 0x01, 0x0a, 0x16, 0x53, 0x75, 0x62, 0x74, 0x6c, 0x65, 0x55, 0x6e, 0x77, 0x72, 0x61, 0x70, 0x4b, + 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x1f, 0x0a, 0x0b, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x6b, 0x65, 0x79, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x4b, 0x65, + 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x12, 0x19, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x6b, 0x65, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, - 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, - 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0x2c, 0x0a, 0x14, 0x53, 0x75, 0x62, 0x74, - 0x6c, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x22, 0x97, 0x01, 0x0a, 0x0e, 0x45, 0x6e, 0x63, 0x72, 0x79, - 0x70, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x07, 0x6f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x64, 0x61, 0x70, - 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x3d, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, - 0x22, 0xa6, 0x02, 0x0a, 0x15, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, - 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x6b, 0x65, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2c, 0x0a, 0x12, - 0x6b, 0x65, 0x79, 0x5f, 0x77, 0x72, 0x61, 0x70, 0x5f, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, - 0x68, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6b, 0x65, 0x79, 0x57, 0x72, 0x61, - 0x70, 0x41, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x12, 0x34, 0x0a, 0x16, 0x64, 0x61, - 0x74, 0x61, 0x5f, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x69, - 0x70, 0x68, 0x65, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x64, 0x61, 0x74, 0x61, - 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, - 0x12, 0x37, 0x0a, 0x18, 0x6f, 0x6d, 0x69, 0x74, 0x5f, 0x64, 0x65, 0x63, 0x72, 0x79, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x15, 0x6f, 0x6d, 0x69, 0x74, 0x44, 0x65, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x64, 0x65, 0x63, - 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x64, 0x65, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x50, 0x0a, 0x0f, 0x45, 0x6e, 0x63, - 0x72, 0x79, 0x70, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x07, - 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, - 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x50, 0x61, 0x79, 0x6c, 0x6f, - 0x61, 0x64, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x97, 0x01, 0x0a, 0x0e, - 0x44, 0x65, 0x63, 0x72, 0x79, 0x70, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, - 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x2c, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x63, 0x72, 0x79, 0x70, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3d, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, + 0x09, 0x52, 0x07, 0x6b, 0x65, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, + 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, + 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x74, + 0x61, 0x67, 0x12, 0x27, 0x0a, 0x0f, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64, + 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x61, 0x73, 0x73, + 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x22, 0x3e, 0x0a, 0x17, 0x53, + 0x75, 0x62, 0x74, 0x6c, 0x65, 0x55, 0x6e, 0x77, 0x72, 0x61, 0x70, 0x4b, 0x65, 0x79, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x74, + 0x65, 0x78, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x70, + 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x4b, 0x65, 0x79, 0x22, 0x8b, 0x01, 0x0a, 0x11, + 0x53, 0x75, 0x62, 0x74, 0x6c, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x69, 0x67, 0x65, + 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, + 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x12, 0x19, + 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x6b, 0x65, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x32, 0x0a, 0x12, 0x53, 0x75, 0x62, + 0x74, 0x6c, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0xab, 0x01, + 0x0a, 0x13, 0x53, 0x75, 0x62, 0x74, 0x6c, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, + 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x64, 0x69, + 0x67, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, + 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, + 0x68, 0x6d, 0x12, 0x19, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6b, 0x65, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, + 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0x2c, 0x0a, 0x14, 0x53, + 0x75, 0x62, 0x74, 0x6c, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x22, 0x97, 0x01, 0x0a, 0x0e, 0x45, 0x6e, + 0x63, 0x72, 0x79, 0x70, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x07, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, + 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3d, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, + 0x6f, 0x61, 0x64, 0x22, 0xa6, 0x02, 0x0a, 0x15, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x25, 0x0a, + 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6b, 0x65, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x2c, 0x0a, 0x12, 0x6b, 0x65, 0x79, 0x5f, 0x77, 0x72, 0x61, 0x70, 0x5f, 0x61, 0x6c, 0x67, 0x6f, + 0x72, 0x69, 0x74, 0x68, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6b, 0x65, 0x79, + 0x57, 0x72, 0x61, 0x70, 0x41, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x12, 0x34, 0x0a, + 0x16, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x64, + 0x61, 0x74, 0x61, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x69, 0x70, + 0x68, 0x65, 0x72, 0x12, 0x37, 0x0a, 0x18, 0x6f, 0x6d, 0x69, 0x74, 0x5f, 0x64, 0x65, 0x63, 0x72, + 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x6f, 0x6d, 0x69, 0x74, 0x44, 0x65, 0x63, 0x72, 0x79, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x13, + 0x64, 0x65, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x64, 0x65, 0x63, 0x72, 0x79, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x50, 0x0a, 0x0f, + 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x3d, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x23, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x50, 0x61, + 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x97, + 0x01, 0x0a, 0x0e, 0x44, 0x65, 0x63, 0x72, 0x79, 0x70, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x46, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x63, 0x72, 0x79, + 0x70, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3d, 0x0a, 0x07, 0x70, 0x61, 0x79, + 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x64, 0x61, 0x70, + 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, + 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, + 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x59, 0x0a, 0x15, 0x44, 0x65, 0x63, 0x72, + 0x79, 0x70, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6b, 0x65, 0x79, 0x4e, + 0x61, 0x6d, 0x65, 0x22, 0x50, 0x0a, 0x0f, 0x44, 0x65, 0x63, 0x72, 0x79, 0x70, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x07, 0x70, 0x61, - 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x59, 0x0a, 0x15, 0x44, 0x65, 0x63, 0x72, 0x79, 0x70, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x25, - 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, - 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6b, 0x65, 0x79, 0x4e, 0x61, 0x6d, 0x65, - 0x22, 0x50, 0x0a, 0x0f, 0x44, 0x65, 0x63, 0x72, 0x79, 0x70, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, - 0x61, 0x64, 0x22, 0x64, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x12, 0x2d, 0x0a, 0x12, 0x77, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x43, - 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x22, 0x9c, 0x03, 0x0a, 0x13, 0x47, 0x65, 0x74, - 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, - 0x44, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, - 0x74, 0x12, 0x42, 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x5a, 0x0a, 0x0a, - 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x3a, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x50, 0x72, 0x6f, - 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, - 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, - 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb1, 0x02, 0x0a, 0x14, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, - 0x44, 0x12, 0x2d, 0x0a, 0x12, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x63, 0x6f, - 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x77, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x52, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, + 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x64, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x12, 0x2d, 0x0a, 0x12, + 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x22, 0x9c, 0x03, 0x0a, 0x13, + 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x49, 0x44, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x41, 0x74, 0x12, 0x42, 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0d, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x5a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x06, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb1, 0x02, 0x0a, 0x14, 0x53, 0x74, 0x61, 0x72, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x70, - 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x1a, - 0x3a, 0x0a, 0x0c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x38, 0x0a, 0x15, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x49, 0x44, 0x12, 0x2d, 0x0a, 0x12, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x52, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x64, 0x61, 0x70, 0x72, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x14, 0x0a, 0x05, + 0x69, 0x6e, 0x70, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x69, 0x6e, 0x70, + 0x75, 0x74, 0x1a, 0x3a, 0x0a, 0x0c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x38, + 0x0a, 0x15, 0x53, 0x74, 0x61, 0x72, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x22, 0x6a, 0x0a, 0x18, 0x54, 0x65, 0x72, 0x6d, + 0x69, 0x6e, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x49, 0x44, 0x22, 0x6a, 0x0a, 0x18, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, - 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, - 0x49, 0x44, 0x12, 0x2d, 0x0a, 0x12, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x63, - 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, - 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, - 0x74, 0x22, 0x66, 0x0a, 0x14, 0x50, 0x61, 0x75, 0x73, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6e, 0x63, 0x65, 0x49, 0x44, 0x12, 0x2d, 0x0a, 0x12, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x22, 0x66, 0x0a, 0x14, 0x50, 0x61, 0x75, 0x73, 0x65, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x12, 0x2d, 0x0a, + 0x12, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x22, 0x67, 0x0a, 0x15, + 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x12, 0x2d, 0x0a, 0x12, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x43, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x22, 0xa9, 0x01, 0x0a, 0x19, 0x52, 0x61, 0x69, 0x73, 0x65, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x49, 0x44, 0x12, 0x2d, 0x0a, 0x12, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x44, 0x61, 0x74, + 0x61, 0x22, 0x66, 0x0a, 0x14, 0x50, 0x75, 0x72, 0x67, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x12, 0x2d, 0x0a, 0x12, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x22, 0x67, 0x0a, 0x15, 0x52, 0x65, 0x73, - 0x75, 0x6d, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x49, 0x44, 0x12, 0x2d, 0x0a, 0x12, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, - 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x22, 0xa9, 0x01, 0x0a, 0x19, 0x52, 0x61, 0x69, 0x73, 0x65, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, - 0x44, 0x12, 0x2d, 0x0a, 0x12, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x63, 0x6f, - 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x77, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x1d, 0x0a, 0x0a, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x22, 0x66, - 0x0a, 0x14, 0x50, 0x75, 0x72, 0x67, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x12, 0x2d, 0x0a, 0x12, 0x77, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x43, 0x6f, 0x6d, - 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x32, 0xe9, 0x27, 0x0a, 0x04, 0x44, 0x61, 0x70, 0x72, 0x12, - 0x64, 0x0a, 0x0d, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x12, 0x2b, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, - 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x12, 0x26, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x64, 0x61, 0x70, 0x72, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x69, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x42, 0x75, 0x6c, 0x6b, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x32, 0xe9, 0x27, 0x0a, 0x04, 0x44, 0x61, + 0x70, 0x72, 0x12, 0x64, 0x0a, 0x0d, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x12, 0x2b, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x76, 0x6f, + 0x6b, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x24, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x26, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, - 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2b, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x75, 0x6c, 0x6b, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x4e, 0x0a, 0x09, 0x53, 0x61, 0x76, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x27, 0x2e, 0x64, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x64, + 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x69, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x42, 0x75, + 0x6c, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x47, 0x65, 0x74, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, + 0x75, 0x6c, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x09, 0x53, 0x61, 0x76, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x27, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x61, 0x76, 0x65, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x22, 0x00, 0x12, 0x69, 0x0a, 0x10, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x41, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x12, 0x28, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x29, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, + 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x29, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x61, 0x76, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, + 0x00, 0x12, 0x5a, 0x0a, 0x0f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x6c, 0x6b, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x2d, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6a, 0x0a, + 0x17, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0c, 0x50, 0x75, 0x62, + 0x6c, 0x69, 0x73, 0x68, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x2a, 0x2e, 0x64, 0x61, 0x70, 0x72, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, - 0x69, 0x0a, 0x10, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x41, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x12, 0x28, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, - 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x0b, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x29, 0x2e, 0x64, 0x61, 0x70, 0x72, + 0x71, 0x0a, 0x16, 0x42, 0x75, 0x6c, 0x6b, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x41, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x12, 0x29, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, - 0x0a, 0x0f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x12, 0x2d, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6a, 0x0a, 0x17, 0x45, 0x78, - 0x65, 0x63, 0x75, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, - 0x65, 0x63, 0x75, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0c, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, - 0x68, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x2a, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, - 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x71, 0x0a, 0x16, - 0x42, 0x75, 0x6c, 0x6b, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x41, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x12, 0x29, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x42, - 0x75, 0x6c, 0x6b, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x2a, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x75, 0x6c, 0x6b, 0x50, 0x75, - 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x6c, 0x0a, 0x0d, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, - 0x12, 0x2b, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, + 0x31, 0x2e, 0x42, 0x75, 0x6c, 0x6b, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x75, 0x6c, + 0x6b, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x0d, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x69, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x12, 0x2b, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x76, 0x6f, + 0x6b, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2c, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x42, - 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, + 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x60, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x27, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x69, 0x6e, 0x64, - 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, - 0x09, 0x47, 0x65, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x27, 0x2e, 0x64, 0x61, 0x70, - 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, - 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x6c, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, - 0x12, 0x2b, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, + 0x65, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x65, 0x63, + 0x72, 0x65, 0x74, 0x12, 0x2b, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, + 0x75, 0x6c, 0x6b, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2c, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x75, 0x6c, 0x6b, - 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, - 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x65, 0x63, - 0x72, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, - 0x12, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x41, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x69, - 0x6d, 0x65, 0x72, 0x12, 0x30, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x65, 0x72, 0x41, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, - 0x64, 0x0a, 0x14, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x41, 0x63, 0x74, - 0x6f, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x32, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x41, 0x63, 0x74, 0x6f, 0x72, 0x54, - 0x69, 0x6d, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x15, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, - 0x72, 0x41, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x12, 0x33, - 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x41, - 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6a, 0x0a, - 0x17, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x41, 0x63, 0x74, 0x6f, 0x72, - 0x52, 0x65, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x12, 0x35, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x41, 0x63, 0x74, 0x6f, 0x72, - 0x52, 0x65, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x62, 0x0a, 0x13, 0x52, 0x65, 0x6e, - 0x61, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, - 0x12, 0x31, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x41, - 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, - 0x0d, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2b, - 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x6f, 0x72, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x64, 0x61, - 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x74, 0x0a, 0x1c, 0x45, - 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x41, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x2e, 0x64, 0x61, - 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x41, 0x63, 0x74, 0x6f, 0x72, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, - 0x00, 0x12, 0x66, 0x0a, 0x0b, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x41, 0x63, 0x74, 0x6f, 0x72, - 0x12, 0x29, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x41, - 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x64, 0x61, - 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x41, 0x63, 0x74, 0x6f, 0x72, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7b, 0x0a, 0x16, 0x47, 0x65, 0x74, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x12, 0x2e, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x75, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x2e, 0x64, 0x61, 0x70, - 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x64, 0x61, 0x70, + 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x60, 0x0a, 0x12, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x41, 0x63, 0x74, 0x6f, + 0x72, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x30, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x41, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x69, 0x6d, 0x65, + 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x22, 0x00, 0x12, 0x64, 0x0a, 0x14, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, + 0x41, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x32, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x8f, 0x01, - 0x0a, 0x1c, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x12, 0x34, + 0x76, 0x31, 0x2e, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x41, 0x63, 0x74, + 0x6f, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x15, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x41, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x6d, 0x69, 0x6e, 0x64, 0x65, + 0x72, 0x12, 0x33, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x41, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, + 0x12, 0x6a, 0x0a, 0x17, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x41, 0x63, + 0x74, 0x6f, 0x72, 0x52, 0x65, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x12, 0x35, 0x2e, 0x64, 0x61, + 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x41, 0x63, + 0x74, 0x6f, 0x72, 0x52, 0x65, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x62, 0x0a, 0x13, + 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x6d, 0x69, 0x6e, + 0x64, 0x65, 0x72, 0x12, 0x31, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6e, 0x61, + 0x6d, 0x65, 0x41, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, + 0x12, 0x6c, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x12, 0x2b, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, + 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, - 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, - 0x89, 0x01, 0x0a, 0x16, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x2e, 0x64, 0x61, 0x70, - 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x35, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, - 0x62, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x93, 0x01, 0x0a, 0x1e, - 0x55, 0x6e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x12, 0x36, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x6f, 0x72, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x74, + 0x0a, 0x1c, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x41, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x6e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, - 0x62, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, - 0x6e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x8d, 0x01, 0x0a, 0x18, 0x55, 0x6e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, - 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x36, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x41, 0x63, + 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x0b, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x41, 0x63, + 0x74, 0x6f, 0x72, 0x12, 0x29, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x76, 0x6f, + 0x6b, 0x65, 0x41, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x6e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, - 0x62, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, - 0x6e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x60, 0x0a, 0x0d, 0x54, 0x72, 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x41, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x12, 0x25, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x79, 0x4c, 0x6f, - 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x64, 0x61, 0x70, 0x72, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x41, 0x63, 0x74, + 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7b, 0x0a, 0x16, + 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x41, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x12, 0x2e, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, + 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, + 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x75, 0x0a, 0x10, 0x47, 0x65, 0x74, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x2e, + 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, + 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x8f, 0x01, 0x0a, 0x1c, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x12, 0x34, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, + 0x69, 0x62, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x30, 0x01, 0x12, 0x89, 0x01, 0x0a, 0x16, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x2e, + 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x73, + 0x63, 0x72, 0x69, 0x62, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x93, + 0x01, 0x0a, 0x1e, 0x55, 0x6e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x12, 0x36, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x6e, 0x73, 0x75, 0x62, 0x73, + 0x63, 0x72, 0x69, 0x62, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x54, 0x72, 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x0c, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x41, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x12, 0x24, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, - 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x64, 0x61, 0x70, 0x72, + 0x31, 0x2e, 0x55, 0x6e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x8d, 0x01, 0x0a, 0x18, 0x55, 0x6e, 0x73, 0x75, 0x62, 0x73, 0x63, + 0x72, 0x69, 0x62, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x36, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x6e, 0x73, 0x75, 0x62, 0x73, + 0x63, 0x72, 0x69, 0x62, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x62, 0x0a, 0x0d, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x41, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x12, 0x25, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x63, 0x72, - 0x79, 0x70, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x64, 0x61, 0x70, + 0x31, 0x2e, 0x55, 0x6e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x0d, 0x54, 0x72, 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x41, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x12, 0x25, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, + 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x64, + 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x0c, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, + 0x41, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x12, 0x24, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, + 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x64, + 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x62, 0x0a, 0x0d, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, + 0x41, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x12, 0x25, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, + 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, + 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x28, 0x01, 0x30, 0x01, 0x12, 0x62, 0x0a, 0x0d, 0x44, 0x65, 0x63, + 0x72, 0x79, 0x70, 0x74, 0x41, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x12, 0x25, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x28, 0x01, 0x30, 0x01, 0x12, 0x62, 0x0a, 0x0d, 0x44, 0x65, 0x63, 0x72, 0x79, 0x70, - 0x74, 0x41, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x12, 0x25, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x44, 0x65, 0x63, 0x72, 0x79, 0x70, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, - 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x63, 0x72, 0x79, 0x70, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x28, 0x01, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x0b, 0x47, 0x65, - 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x1a, 0x2a, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x52, 0x0a, 0x0b, 0x53, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x29, - 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x22, 0x00, 0x12, 0x6d, 0x0a, 0x12, 0x53, 0x75, 0x62, 0x74, 0x6c, 0x65, 0x47, 0x65, 0x74, - 0x4b, 0x65, 0x79, 0x41, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x12, 0x2a, 0x2e, 0x64, 0x61, 0x70, 0x72, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x53, 0x75, 0x62, 0x74, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, - 0x62, 0x74, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x70, 0x0a, 0x13, 0x53, 0x75, 0x62, 0x74, 0x6c, 0x65, 0x45, 0x6e, 0x63, 0x72, - 0x79, 0x70, 0x74, 0x41, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x12, 0x2b, 0x2e, 0x64, 0x61, 0x70, 0x72, + 0x76, 0x31, 0x2e, 0x44, 0x65, 0x63, 0x72, 0x79, 0x70, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x26, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x63, 0x72, 0x79, 0x70, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x28, 0x01, 0x30, 0x01, 0x12, 0x53, 0x0a, + 0x0b, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x2a, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x52, 0x0a, 0x0b, 0x53, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x12, 0x29, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6d, 0x0a, 0x12, 0x53, 0x75, 0x62, 0x74, 0x6c, 0x65, + 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x41, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x12, 0x2a, 0x2e, 0x64, + 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x74, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x4b, 0x65, + 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x53, 0x75, 0x62, 0x74, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x70, 0x0a, 0x13, 0x53, 0x75, 0x62, 0x74, 0x6c, 0x65, 0x45, + 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x41, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x12, 0x2b, 0x2e, 0x64, + 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x74, 0x6c, 0x65, 0x45, 0x6e, 0x63, 0x72, 0x79, + 0x70, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x74, 0x6c, 0x65, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, - 0x75, 0x62, 0x74, 0x6c, 0x65, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x70, 0x0a, 0x13, 0x53, 0x75, 0x62, 0x74, 0x6c, 0x65, 0x44, 0x65, - 0x63, 0x72, 0x79, 0x70, 0x74, 0x41, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x12, 0x2b, 0x2e, 0x64, 0x61, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x70, 0x0a, 0x13, 0x53, 0x75, 0x62, 0x74, 0x6c, + 0x65, 0x44, 0x65, 0x63, 0x72, 0x79, 0x70, 0x74, 0x41, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x12, 0x2b, + 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x74, 0x6c, 0x65, 0x44, 0x65, 0x63, + 0x72, 0x79, 0x70, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x74, 0x6c, 0x65, 0x44, 0x65, 0x63, 0x72, 0x79, 0x70, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x53, 0x75, 0x62, 0x74, 0x6c, 0x65, 0x44, 0x65, 0x63, 0x72, 0x79, 0x70, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x70, 0x0a, 0x13, 0x53, 0x75, 0x62, 0x74, 0x6c, 0x65, - 0x57, 0x72, 0x61, 0x70, 0x4b, 0x65, 0x79, 0x41, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x12, 0x2b, 0x2e, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x70, 0x0a, 0x13, 0x53, 0x75, 0x62, + 0x74, 0x6c, 0x65, 0x57, 0x72, 0x61, 0x70, 0x4b, 0x65, 0x79, 0x41, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x12, 0x2b, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x74, 0x6c, 0x65, 0x57, + 0x72, 0x61, 0x70, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x74, 0x6c, 0x65, 0x57, 0x72, 0x61, 0x70, - 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x64, 0x61, 0x70, - 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x74, 0x6c, 0x65, 0x57, 0x72, 0x61, 0x70, 0x4b, 0x65, 0x79, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x76, 0x0a, 0x15, 0x53, 0x75, 0x62, 0x74, - 0x6c, 0x65, 0x55, 0x6e, 0x77, 0x72, 0x61, 0x70, 0x4b, 0x65, 0x79, 0x41, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x12, 0x2d, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x74, 0x6c, 0x65, - 0x55, 0x6e, 0x77, 0x72, 0x61, 0x70, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2e, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x74, 0x6c, 0x65, 0x55, - 0x6e, 0x77, 0x72, 0x61, 0x70, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x67, 0x0a, 0x10, 0x53, 0x75, 0x62, 0x74, 0x6c, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x41, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x12, 0x28, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x76, 0x0a, 0x15, 0x53, + 0x75, 0x62, 0x74, 0x6c, 0x65, 0x55, 0x6e, 0x77, 0x72, 0x61, 0x70, 0x4b, 0x65, 0x79, 0x41, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x12, 0x2d, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, - 0x74, 0x6c, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, + 0x74, 0x6c, 0x65, 0x55, 0x6e, 0x77, 0x72, 0x61, 0x70, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x74, + 0x6c, 0x65, 0x55, 0x6e, 0x77, 0x72, 0x61, 0x70, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x67, 0x0a, 0x10, 0x53, 0x75, 0x62, 0x74, 0x6c, 0x65, 0x53, 0x69, 0x67, + 0x6e, 0x41, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x12, 0x28, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x53, 0x75, 0x62, 0x74, 0x6c, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x29, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x74, 0x6c, 0x65, + 0x53, 0x69, 0x67, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6d, 0x0a, 0x12, + 0x53, 0x75, 0x62, 0x74, 0x6c, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x41, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x12, 0x2a, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x74, 0x6c, + 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x74, 0x6c, 0x65, 0x53, 0x69, 0x67, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6d, 0x0a, 0x12, 0x53, 0x75, 0x62, - 0x74, 0x6c, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x41, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x12, - 0x2a, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x74, 0x6c, 0x65, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x64, 0x61, - 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x74, 0x6c, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x72, 0x0a, 0x13, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x41, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x12, - 0x2b, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x74, 0x6c, 0x65, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x72, 0x0a, 0x13, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x41, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x12, 0x2b, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2c, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x64, - 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x11, - 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x41, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x12, 0x29, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x64, - 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5c, 0x0a, 0x13, 0x50, 0x75, - 0x72, 0x67, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x41, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x12, 0x2b, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x72, 0x67, 0x65, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x64, 0x0a, 0x17, 0x54, 0x65, 0x72, 0x6d, - 0x69, 0x6e, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x41, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x12, 0x2f, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x72, 0x6d, - 0x69, 0x6e, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5c, - 0x0a, 0x13, 0x50, 0x61, 0x75, 0x73, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x41, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x12, 0x2b, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, - 0x75, 0x73, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5e, 0x0a, 0x14, - 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x41, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x12, 0x2c, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, - 0x75, 0x6d, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x18, - 0x52, 0x61, 0x69, 0x73, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x41, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x12, 0x30, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x6c, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x41, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x12, 0x29, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, + 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2a, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5c, 0x0a, + 0x13, 0x50, 0x75, 0x72, 0x67, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x41, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x12, 0x2b, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x72, + 0x67, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x64, 0x0a, 0x17, 0x54, + 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x41, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x12, 0x2f, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, + 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, + 0x00, 0x12, 0x5c, 0x0a, 0x13, 0x50, 0x61, 0x75, 0x73, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x41, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x12, 0x2b, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x52, 0x61, 0x69, 0x73, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x08, 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, - 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x22, 0x00, 0x42, 0x69, 0x0a, 0x0a, 0x69, 0x6f, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x76, 0x31, - 0x42, 0x0a, 0x44, 0x61, 0x70, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x5a, 0x31, 0x67, 0x69, - 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x64, 0x61, 0x70, 0x72, 0x2f, 0x64, 0x61, - 0x70, 0x72, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2f, 0x76, 0x31, 0x3b, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0xaa, - 0x02, 0x1b, 0x44, 0x61, 0x70, 0x72, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x75, - 0x74, 0x6f, 0x67, 0x65, 0x6e, 0x2e, 0x47, 0x72, 0x70, 0x63, 0x2e, 0x76, 0x31, 0x62, 0x06, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x2e, 0x50, 0x61, 0x75, 0x73, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, + 0x5e, 0x0a, 0x14, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x41, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x12, 0x2c, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, + 0x66, 0x0a, 0x18, 0x52, 0x61, 0x69, 0x73, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x41, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x12, 0x30, 0x2e, 0x64, 0x61, + 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x61, 0x69, 0x73, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x08, 0x53, 0x68, 0x75, 0x74, 0x64, + 0x6f, 0x77, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x22, 0x00, 0x42, 0x69, 0x0a, 0x0a, 0x69, 0x6f, 0x2e, 0x64, 0x61, 0x70, 0x72, + 0x2e, 0x76, 0x31, 0x42, 0x0a, 0x44, 0x61, 0x70, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x5a, + 0x31, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x64, 0x61, 0x70, 0x72, + 0x2f, 0x64, 0x61, 0x70, 0x72, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2f, 0x76, 0x31, 0x3b, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0xaa, 0x02, 0x1b, 0x44, 0x61, 0x70, 0x72, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x67, 0x65, 0x6e, 0x2e, 0x47, 0x72, 0x70, 0x63, 0x2e, 0x76, 0x31, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -6869,7 +6930,7 @@ func file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP() []byte { } var file_dapr_proto_runtime_v1_dapr_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_dapr_proto_runtime_v1_dapr_proto_msgTypes = make([]protoimpl.MessageInfo, 111) +var file_dapr_proto_runtime_v1_dapr_proto_msgTypes = make([]protoimpl.MessageInfo, 112) var file_dapr_proto_runtime_v1_dapr_proto_goTypes = []interface{}{ (UnlockResponse_Status)(0), // 0: dapr.proto.runtime.v1.UnlockResponse.Status (SubtleGetKeyRequest_KeyFormat)(0), // 1: dapr.proto.runtime.v1.SubtleGetKeyRequest.KeyFormat @@ -6913,251 +6974,253 @@ var file_dapr_proto_runtime_v1_dapr_proto_goTypes = []interface{}{ (*GetMetadataResponse)(nil), // 39: dapr.proto.runtime.v1.GetMetadataResponse (*ActiveActorsCount)(nil), // 40: dapr.proto.runtime.v1.ActiveActorsCount (*RegisteredComponents)(nil), // 41: dapr.proto.runtime.v1.RegisteredComponents - (*PubsubSubscription)(nil), // 42: dapr.proto.runtime.v1.PubsubSubscription - (*PubsubSubscriptionRules)(nil), // 43: dapr.proto.runtime.v1.PubsubSubscriptionRules - (*PubsubSubscriptionRule)(nil), // 44: dapr.proto.runtime.v1.PubsubSubscriptionRule - (*SetMetadataRequest)(nil), // 45: dapr.proto.runtime.v1.SetMetadataRequest - (*GetConfigurationRequest)(nil), // 46: dapr.proto.runtime.v1.GetConfigurationRequest - (*GetConfigurationResponse)(nil), // 47: dapr.proto.runtime.v1.GetConfigurationResponse - (*SubscribeConfigurationRequest)(nil), // 48: dapr.proto.runtime.v1.SubscribeConfigurationRequest - (*UnsubscribeConfigurationRequest)(nil), // 49: dapr.proto.runtime.v1.UnsubscribeConfigurationRequest - (*SubscribeConfigurationResponse)(nil), // 50: dapr.proto.runtime.v1.SubscribeConfigurationResponse - (*UnsubscribeConfigurationResponse)(nil), // 51: dapr.proto.runtime.v1.UnsubscribeConfigurationResponse - (*TryLockRequest)(nil), // 52: dapr.proto.runtime.v1.TryLockRequest - (*TryLockResponse)(nil), // 53: dapr.proto.runtime.v1.TryLockResponse - (*UnlockRequest)(nil), // 54: dapr.proto.runtime.v1.UnlockRequest - (*UnlockResponse)(nil), // 55: dapr.proto.runtime.v1.UnlockResponse - (*SubtleGetKeyRequest)(nil), // 56: dapr.proto.runtime.v1.SubtleGetKeyRequest - (*SubtleGetKeyResponse)(nil), // 57: dapr.proto.runtime.v1.SubtleGetKeyResponse - (*SubtleEncryptRequest)(nil), // 58: dapr.proto.runtime.v1.SubtleEncryptRequest - (*SubtleEncryptResponse)(nil), // 59: dapr.proto.runtime.v1.SubtleEncryptResponse - (*SubtleDecryptRequest)(nil), // 60: dapr.proto.runtime.v1.SubtleDecryptRequest - (*SubtleDecryptResponse)(nil), // 61: dapr.proto.runtime.v1.SubtleDecryptResponse - (*SubtleWrapKeyRequest)(nil), // 62: dapr.proto.runtime.v1.SubtleWrapKeyRequest - (*SubtleWrapKeyResponse)(nil), // 63: dapr.proto.runtime.v1.SubtleWrapKeyResponse - (*SubtleUnwrapKeyRequest)(nil), // 64: dapr.proto.runtime.v1.SubtleUnwrapKeyRequest - (*SubtleUnwrapKeyResponse)(nil), // 65: dapr.proto.runtime.v1.SubtleUnwrapKeyResponse - (*SubtleSignRequest)(nil), // 66: dapr.proto.runtime.v1.SubtleSignRequest - (*SubtleSignResponse)(nil), // 67: dapr.proto.runtime.v1.SubtleSignResponse - (*SubtleVerifyRequest)(nil), // 68: dapr.proto.runtime.v1.SubtleVerifyRequest - (*SubtleVerifyResponse)(nil), // 69: dapr.proto.runtime.v1.SubtleVerifyResponse - (*EncryptRequest)(nil), // 70: dapr.proto.runtime.v1.EncryptRequest - (*EncryptRequestOptions)(nil), // 71: dapr.proto.runtime.v1.EncryptRequestOptions - (*EncryptResponse)(nil), // 72: dapr.proto.runtime.v1.EncryptResponse - (*DecryptRequest)(nil), // 73: dapr.proto.runtime.v1.DecryptRequest - (*DecryptRequestOptions)(nil), // 74: dapr.proto.runtime.v1.DecryptRequestOptions - (*DecryptResponse)(nil), // 75: dapr.proto.runtime.v1.DecryptResponse - (*GetWorkflowRequest)(nil), // 76: dapr.proto.runtime.v1.GetWorkflowRequest - (*GetWorkflowResponse)(nil), // 77: dapr.proto.runtime.v1.GetWorkflowResponse - (*StartWorkflowRequest)(nil), // 78: dapr.proto.runtime.v1.StartWorkflowRequest - (*StartWorkflowResponse)(nil), // 79: dapr.proto.runtime.v1.StartWorkflowResponse - (*TerminateWorkflowRequest)(nil), // 80: dapr.proto.runtime.v1.TerminateWorkflowRequest - (*PauseWorkflowRequest)(nil), // 81: dapr.proto.runtime.v1.PauseWorkflowRequest - (*ResumeWorkflowRequest)(nil), // 82: dapr.proto.runtime.v1.ResumeWorkflowRequest - (*RaiseEventWorkflowRequest)(nil), // 83: dapr.proto.runtime.v1.RaiseEventWorkflowRequest - (*PurgeWorkflowRequest)(nil), // 84: dapr.proto.runtime.v1.PurgeWorkflowRequest - nil, // 85: dapr.proto.runtime.v1.GetStateRequest.MetadataEntry - nil, // 86: dapr.proto.runtime.v1.GetBulkStateRequest.MetadataEntry - nil, // 87: dapr.proto.runtime.v1.BulkStateItem.MetadataEntry - nil, // 88: dapr.proto.runtime.v1.GetStateResponse.MetadataEntry - nil, // 89: dapr.proto.runtime.v1.DeleteStateRequest.MetadataEntry - nil, // 90: dapr.proto.runtime.v1.QueryStateRequest.MetadataEntry - nil, // 91: dapr.proto.runtime.v1.QueryStateResponse.MetadataEntry - nil, // 92: dapr.proto.runtime.v1.PublishEventRequest.MetadataEntry - nil, // 93: dapr.proto.runtime.v1.BulkPublishRequest.MetadataEntry - nil, // 94: dapr.proto.runtime.v1.BulkPublishRequestEntry.MetadataEntry - nil, // 95: dapr.proto.runtime.v1.InvokeBindingRequest.MetadataEntry - nil, // 96: dapr.proto.runtime.v1.InvokeBindingResponse.MetadataEntry - nil, // 97: dapr.proto.runtime.v1.GetSecretRequest.MetadataEntry - nil, // 98: dapr.proto.runtime.v1.GetSecretResponse.DataEntry - nil, // 99: dapr.proto.runtime.v1.GetBulkSecretRequest.MetadataEntry - nil, // 100: dapr.proto.runtime.v1.SecretResponse.SecretsEntry - nil, // 101: dapr.proto.runtime.v1.GetBulkSecretResponse.DataEntry - nil, // 102: dapr.proto.runtime.v1.ExecuteStateTransactionRequest.MetadataEntry - nil, // 103: dapr.proto.runtime.v1.TransactionalActorStateOperation.MetadataEntry - nil, // 104: dapr.proto.runtime.v1.InvokeActorRequest.MetadataEntry - nil, // 105: dapr.proto.runtime.v1.GetMetadataResponse.ExtendedMetadataEntry - nil, // 106: dapr.proto.runtime.v1.PubsubSubscription.MetadataEntry - nil, // 107: dapr.proto.runtime.v1.GetConfigurationRequest.MetadataEntry - nil, // 108: dapr.proto.runtime.v1.GetConfigurationResponse.ItemsEntry - nil, // 109: dapr.proto.runtime.v1.SubscribeConfigurationRequest.MetadataEntry - nil, // 110: dapr.proto.runtime.v1.SubscribeConfigurationResponse.ItemsEntry - nil, // 111: dapr.proto.runtime.v1.GetWorkflowResponse.PropertiesEntry - nil, // 112: dapr.proto.runtime.v1.StartWorkflowRequest.OptionsEntry - (*v1.InvokeRequest)(nil), // 113: dapr.proto.common.v1.InvokeRequest - (v1.StateOptions_StateConsistency)(0), // 114: dapr.proto.common.v1.StateOptions.StateConsistency - (*v1.Etag)(nil), // 115: dapr.proto.common.v1.Etag - (*v1.StateOptions)(nil), // 116: dapr.proto.common.v1.StateOptions - (*v1.StateItem)(nil), // 117: dapr.proto.common.v1.StateItem - (*anypb.Any)(nil), // 118: google.protobuf.Any - (*v1.StreamPayload)(nil), // 119: dapr.proto.common.v1.StreamPayload - (*timestamppb.Timestamp)(nil), // 120: google.protobuf.Timestamp - (*v1.ConfigurationItem)(nil), // 121: dapr.proto.common.v1.ConfigurationItem - (*emptypb.Empty)(nil), // 122: google.protobuf.Empty - (*v1.InvokeResponse)(nil), // 123: dapr.proto.common.v1.InvokeResponse + (*MetadataHTTPEndpoint)(nil), // 42: dapr.proto.runtime.v1.MetadataHTTPEndpoint + (*PubsubSubscription)(nil), // 43: dapr.proto.runtime.v1.PubsubSubscription + (*PubsubSubscriptionRules)(nil), // 44: dapr.proto.runtime.v1.PubsubSubscriptionRules + (*PubsubSubscriptionRule)(nil), // 45: dapr.proto.runtime.v1.PubsubSubscriptionRule + (*SetMetadataRequest)(nil), // 46: dapr.proto.runtime.v1.SetMetadataRequest + (*GetConfigurationRequest)(nil), // 47: dapr.proto.runtime.v1.GetConfigurationRequest + (*GetConfigurationResponse)(nil), // 48: dapr.proto.runtime.v1.GetConfigurationResponse + (*SubscribeConfigurationRequest)(nil), // 49: dapr.proto.runtime.v1.SubscribeConfigurationRequest + (*UnsubscribeConfigurationRequest)(nil), // 50: dapr.proto.runtime.v1.UnsubscribeConfigurationRequest + (*SubscribeConfigurationResponse)(nil), // 51: dapr.proto.runtime.v1.SubscribeConfigurationResponse + (*UnsubscribeConfigurationResponse)(nil), // 52: dapr.proto.runtime.v1.UnsubscribeConfigurationResponse + (*TryLockRequest)(nil), // 53: dapr.proto.runtime.v1.TryLockRequest + (*TryLockResponse)(nil), // 54: dapr.proto.runtime.v1.TryLockResponse + (*UnlockRequest)(nil), // 55: dapr.proto.runtime.v1.UnlockRequest + (*UnlockResponse)(nil), // 56: dapr.proto.runtime.v1.UnlockResponse + (*SubtleGetKeyRequest)(nil), // 57: dapr.proto.runtime.v1.SubtleGetKeyRequest + (*SubtleGetKeyResponse)(nil), // 58: dapr.proto.runtime.v1.SubtleGetKeyResponse + (*SubtleEncryptRequest)(nil), // 59: dapr.proto.runtime.v1.SubtleEncryptRequest + (*SubtleEncryptResponse)(nil), // 60: dapr.proto.runtime.v1.SubtleEncryptResponse + (*SubtleDecryptRequest)(nil), // 61: dapr.proto.runtime.v1.SubtleDecryptRequest + (*SubtleDecryptResponse)(nil), // 62: dapr.proto.runtime.v1.SubtleDecryptResponse + (*SubtleWrapKeyRequest)(nil), // 63: dapr.proto.runtime.v1.SubtleWrapKeyRequest + (*SubtleWrapKeyResponse)(nil), // 64: dapr.proto.runtime.v1.SubtleWrapKeyResponse + (*SubtleUnwrapKeyRequest)(nil), // 65: dapr.proto.runtime.v1.SubtleUnwrapKeyRequest + (*SubtleUnwrapKeyResponse)(nil), // 66: dapr.proto.runtime.v1.SubtleUnwrapKeyResponse + (*SubtleSignRequest)(nil), // 67: dapr.proto.runtime.v1.SubtleSignRequest + (*SubtleSignResponse)(nil), // 68: dapr.proto.runtime.v1.SubtleSignResponse + (*SubtleVerifyRequest)(nil), // 69: dapr.proto.runtime.v1.SubtleVerifyRequest + (*SubtleVerifyResponse)(nil), // 70: dapr.proto.runtime.v1.SubtleVerifyResponse + (*EncryptRequest)(nil), // 71: dapr.proto.runtime.v1.EncryptRequest + (*EncryptRequestOptions)(nil), // 72: dapr.proto.runtime.v1.EncryptRequestOptions + (*EncryptResponse)(nil), // 73: dapr.proto.runtime.v1.EncryptResponse + (*DecryptRequest)(nil), // 74: dapr.proto.runtime.v1.DecryptRequest + (*DecryptRequestOptions)(nil), // 75: dapr.proto.runtime.v1.DecryptRequestOptions + (*DecryptResponse)(nil), // 76: dapr.proto.runtime.v1.DecryptResponse + (*GetWorkflowRequest)(nil), // 77: dapr.proto.runtime.v1.GetWorkflowRequest + (*GetWorkflowResponse)(nil), // 78: dapr.proto.runtime.v1.GetWorkflowResponse + (*StartWorkflowRequest)(nil), // 79: dapr.proto.runtime.v1.StartWorkflowRequest + (*StartWorkflowResponse)(nil), // 80: dapr.proto.runtime.v1.StartWorkflowResponse + (*TerminateWorkflowRequest)(nil), // 81: dapr.proto.runtime.v1.TerminateWorkflowRequest + (*PauseWorkflowRequest)(nil), // 82: dapr.proto.runtime.v1.PauseWorkflowRequest + (*ResumeWorkflowRequest)(nil), // 83: dapr.proto.runtime.v1.ResumeWorkflowRequest + (*RaiseEventWorkflowRequest)(nil), // 84: dapr.proto.runtime.v1.RaiseEventWorkflowRequest + (*PurgeWorkflowRequest)(nil), // 85: dapr.proto.runtime.v1.PurgeWorkflowRequest + nil, // 86: dapr.proto.runtime.v1.GetStateRequest.MetadataEntry + nil, // 87: dapr.proto.runtime.v1.GetBulkStateRequest.MetadataEntry + nil, // 88: dapr.proto.runtime.v1.BulkStateItem.MetadataEntry + nil, // 89: dapr.proto.runtime.v1.GetStateResponse.MetadataEntry + nil, // 90: dapr.proto.runtime.v1.DeleteStateRequest.MetadataEntry + nil, // 91: dapr.proto.runtime.v1.QueryStateRequest.MetadataEntry + nil, // 92: dapr.proto.runtime.v1.QueryStateResponse.MetadataEntry + nil, // 93: dapr.proto.runtime.v1.PublishEventRequest.MetadataEntry + nil, // 94: dapr.proto.runtime.v1.BulkPublishRequest.MetadataEntry + nil, // 95: dapr.proto.runtime.v1.BulkPublishRequestEntry.MetadataEntry + nil, // 96: dapr.proto.runtime.v1.InvokeBindingRequest.MetadataEntry + nil, // 97: dapr.proto.runtime.v1.InvokeBindingResponse.MetadataEntry + nil, // 98: dapr.proto.runtime.v1.GetSecretRequest.MetadataEntry + nil, // 99: dapr.proto.runtime.v1.GetSecretResponse.DataEntry + nil, // 100: dapr.proto.runtime.v1.GetBulkSecretRequest.MetadataEntry + nil, // 101: dapr.proto.runtime.v1.SecretResponse.SecretsEntry + nil, // 102: dapr.proto.runtime.v1.GetBulkSecretResponse.DataEntry + nil, // 103: dapr.proto.runtime.v1.ExecuteStateTransactionRequest.MetadataEntry + nil, // 104: dapr.proto.runtime.v1.TransactionalActorStateOperation.MetadataEntry + nil, // 105: dapr.proto.runtime.v1.InvokeActorRequest.MetadataEntry + nil, // 106: dapr.proto.runtime.v1.GetMetadataResponse.ExtendedMetadataEntry + nil, // 107: dapr.proto.runtime.v1.PubsubSubscription.MetadataEntry + nil, // 108: dapr.proto.runtime.v1.GetConfigurationRequest.MetadataEntry + nil, // 109: dapr.proto.runtime.v1.GetConfigurationResponse.ItemsEntry + nil, // 110: dapr.proto.runtime.v1.SubscribeConfigurationRequest.MetadataEntry + nil, // 111: dapr.proto.runtime.v1.SubscribeConfigurationResponse.ItemsEntry + nil, // 112: dapr.proto.runtime.v1.GetWorkflowResponse.PropertiesEntry + nil, // 113: dapr.proto.runtime.v1.StartWorkflowRequest.OptionsEntry + (*v1.InvokeRequest)(nil), // 114: dapr.proto.common.v1.InvokeRequest + (v1.StateOptions_StateConsistency)(0), // 115: dapr.proto.common.v1.StateOptions.StateConsistency + (*v1.Etag)(nil), // 116: dapr.proto.common.v1.Etag + (*v1.StateOptions)(nil), // 117: dapr.proto.common.v1.StateOptions + (*v1.StateItem)(nil), // 118: dapr.proto.common.v1.StateItem + (*anypb.Any)(nil), // 119: google.protobuf.Any + (*v1.StreamPayload)(nil), // 120: dapr.proto.common.v1.StreamPayload + (*timestamppb.Timestamp)(nil), // 121: google.protobuf.Timestamp + (*v1.ConfigurationItem)(nil), // 122: dapr.proto.common.v1.ConfigurationItem + (*emptypb.Empty)(nil), // 123: google.protobuf.Empty + (*v1.InvokeResponse)(nil), // 124: dapr.proto.common.v1.InvokeResponse } var file_dapr_proto_runtime_v1_dapr_proto_depIdxs = []int32{ - 113, // 0: dapr.proto.runtime.v1.InvokeServiceRequest.message:type_name -> dapr.proto.common.v1.InvokeRequest - 114, // 1: dapr.proto.runtime.v1.GetStateRequest.consistency:type_name -> dapr.proto.common.v1.StateOptions.StateConsistency - 85, // 2: dapr.proto.runtime.v1.GetStateRequest.metadata:type_name -> dapr.proto.runtime.v1.GetStateRequest.MetadataEntry - 86, // 3: dapr.proto.runtime.v1.GetBulkStateRequest.metadata:type_name -> dapr.proto.runtime.v1.GetBulkStateRequest.MetadataEntry + 114, // 0: dapr.proto.runtime.v1.InvokeServiceRequest.message:type_name -> dapr.proto.common.v1.InvokeRequest + 115, // 1: dapr.proto.runtime.v1.GetStateRequest.consistency:type_name -> dapr.proto.common.v1.StateOptions.StateConsistency + 86, // 2: dapr.proto.runtime.v1.GetStateRequest.metadata:type_name -> dapr.proto.runtime.v1.GetStateRequest.MetadataEntry + 87, // 3: dapr.proto.runtime.v1.GetBulkStateRequest.metadata:type_name -> dapr.proto.runtime.v1.GetBulkStateRequest.MetadataEntry 6, // 4: dapr.proto.runtime.v1.GetBulkStateResponse.items:type_name -> dapr.proto.runtime.v1.BulkStateItem - 87, // 5: dapr.proto.runtime.v1.BulkStateItem.metadata:type_name -> dapr.proto.runtime.v1.BulkStateItem.MetadataEntry - 88, // 6: dapr.proto.runtime.v1.GetStateResponse.metadata:type_name -> dapr.proto.runtime.v1.GetStateResponse.MetadataEntry - 115, // 7: dapr.proto.runtime.v1.DeleteStateRequest.etag:type_name -> dapr.proto.common.v1.Etag - 116, // 8: dapr.proto.runtime.v1.DeleteStateRequest.options:type_name -> dapr.proto.common.v1.StateOptions - 89, // 9: dapr.proto.runtime.v1.DeleteStateRequest.metadata:type_name -> dapr.proto.runtime.v1.DeleteStateRequest.MetadataEntry - 117, // 10: dapr.proto.runtime.v1.DeleteBulkStateRequest.states:type_name -> dapr.proto.common.v1.StateItem - 117, // 11: dapr.proto.runtime.v1.SaveStateRequest.states:type_name -> dapr.proto.common.v1.StateItem - 90, // 12: dapr.proto.runtime.v1.QueryStateRequest.metadata:type_name -> dapr.proto.runtime.v1.QueryStateRequest.MetadataEntry + 88, // 5: dapr.proto.runtime.v1.BulkStateItem.metadata:type_name -> dapr.proto.runtime.v1.BulkStateItem.MetadataEntry + 89, // 6: dapr.proto.runtime.v1.GetStateResponse.metadata:type_name -> dapr.proto.runtime.v1.GetStateResponse.MetadataEntry + 116, // 7: dapr.proto.runtime.v1.DeleteStateRequest.etag:type_name -> dapr.proto.common.v1.Etag + 117, // 8: dapr.proto.runtime.v1.DeleteStateRequest.options:type_name -> dapr.proto.common.v1.StateOptions + 90, // 9: dapr.proto.runtime.v1.DeleteStateRequest.metadata:type_name -> dapr.proto.runtime.v1.DeleteStateRequest.MetadataEntry + 118, // 10: dapr.proto.runtime.v1.DeleteBulkStateRequest.states:type_name -> dapr.proto.common.v1.StateItem + 118, // 11: dapr.proto.runtime.v1.SaveStateRequest.states:type_name -> dapr.proto.common.v1.StateItem + 91, // 12: dapr.proto.runtime.v1.QueryStateRequest.metadata:type_name -> dapr.proto.runtime.v1.QueryStateRequest.MetadataEntry 12, // 13: dapr.proto.runtime.v1.QueryStateResponse.results:type_name -> dapr.proto.runtime.v1.QueryStateItem - 91, // 14: dapr.proto.runtime.v1.QueryStateResponse.metadata:type_name -> dapr.proto.runtime.v1.QueryStateResponse.MetadataEntry - 92, // 15: dapr.proto.runtime.v1.PublishEventRequest.metadata:type_name -> dapr.proto.runtime.v1.PublishEventRequest.MetadataEntry + 92, // 14: dapr.proto.runtime.v1.QueryStateResponse.metadata:type_name -> dapr.proto.runtime.v1.QueryStateResponse.MetadataEntry + 93, // 15: dapr.proto.runtime.v1.PublishEventRequest.metadata:type_name -> dapr.proto.runtime.v1.PublishEventRequest.MetadataEntry 16, // 16: dapr.proto.runtime.v1.BulkPublishRequest.entries:type_name -> dapr.proto.runtime.v1.BulkPublishRequestEntry - 93, // 17: dapr.proto.runtime.v1.BulkPublishRequest.metadata:type_name -> dapr.proto.runtime.v1.BulkPublishRequest.MetadataEntry - 94, // 18: dapr.proto.runtime.v1.BulkPublishRequestEntry.metadata:type_name -> dapr.proto.runtime.v1.BulkPublishRequestEntry.MetadataEntry + 94, // 17: dapr.proto.runtime.v1.BulkPublishRequest.metadata:type_name -> dapr.proto.runtime.v1.BulkPublishRequest.MetadataEntry + 95, // 18: dapr.proto.runtime.v1.BulkPublishRequestEntry.metadata:type_name -> dapr.proto.runtime.v1.BulkPublishRequestEntry.MetadataEntry 18, // 19: dapr.proto.runtime.v1.BulkPublishResponse.failedEntries:type_name -> dapr.proto.runtime.v1.BulkPublishResponseFailedEntry - 95, // 20: dapr.proto.runtime.v1.InvokeBindingRequest.metadata:type_name -> dapr.proto.runtime.v1.InvokeBindingRequest.MetadataEntry - 96, // 21: dapr.proto.runtime.v1.InvokeBindingResponse.metadata:type_name -> dapr.proto.runtime.v1.InvokeBindingResponse.MetadataEntry - 97, // 22: dapr.proto.runtime.v1.GetSecretRequest.metadata:type_name -> dapr.proto.runtime.v1.GetSecretRequest.MetadataEntry - 98, // 23: dapr.proto.runtime.v1.GetSecretResponse.data:type_name -> dapr.proto.runtime.v1.GetSecretResponse.DataEntry - 99, // 24: dapr.proto.runtime.v1.GetBulkSecretRequest.metadata:type_name -> dapr.proto.runtime.v1.GetBulkSecretRequest.MetadataEntry - 100, // 25: dapr.proto.runtime.v1.SecretResponse.secrets:type_name -> dapr.proto.runtime.v1.SecretResponse.SecretsEntry - 101, // 26: dapr.proto.runtime.v1.GetBulkSecretResponse.data:type_name -> dapr.proto.runtime.v1.GetBulkSecretResponse.DataEntry - 117, // 27: dapr.proto.runtime.v1.TransactionalStateOperation.request:type_name -> dapr.proto.common.v1.StateItem + 96, // 20: dapr.proto.runtime.v1.InvokeBindingRequest.metadata:type_name -> dapr.proto.runtime.v1.InvokeBindingRequest.MetadataEntry + 97, // 21: dapr.proto.runtime.v1.InvokeBindingResponse.metadata:type_name -> dapr.proto.runtime.v1.InvokeBindingResponse.MetadataEntry + 98, // 22: dapr.proto.runtime.v1.GetSecretRequest.metadata:type_name -> dapr.proto.runtime.v1.GetSecretRequest.MetadataEntry + 99, // 23: dapr.proto.runtime.v1.GetSecretResponse.data:type_name -> dapr.proto.runtime.v1.GetSecretResponse.DataEntry + 100, // 24: dapr.proto.runtime.v1.GetBulkSecretRequest.metadata:type_name -> dapr.proto.runtime.v1.GetBulkSecretRequest.MetadataEntry + 101, // 25: dapr.proto.runtime.v1.SecretResponse.secrets:type_name -> dapr.proto.runtime.v1.SecretResponse.SecretsEntry + 102, // 26: dapr.proto.runtime.v1.GetBulkSecretResponse.data:type_name -> dapr.proto.runtime.v1.GetBulkSecretResponse.DataEntry + 118, // 27: dapr.proto.runtime.v1.TransactionalStateOperation.request:type_name -> dapr.proto.common.v1.StateItem 26, // 28: dapr.proto.runtime.v1.ExecuteStateTransactionRequest.operations:type_name -> dapr.proto.runtime.v1.TransactionalStateOperation - 102, // 29: dapr.proto.runtime.v1.ExecuteStateTransactionRequest.metadata:type_name -> dapr.proto.runtime.v1.ExecuteStateTransactionRequest.MetadataEntry + 103, // 29: dapr.proto.runtime.v1.ExecuteStateTransactionRequest.metadata:type_name -> dapr.proto.runtime.v1.ExecuteStateTransactionRequest.MetadataEntry 36, // 30: dapr.proto.runtime.v1.ExecuteActorStateTransactionRequest.operations:type_name -> dapr.proto.runtime.v1.TransactionalActorStateOperation - 118, // 31: dapr.proto.runtime.v1.TransactionalActorStateOperation.value:type_name -> google.protobuf.Any - 103, // 32: dapr.proto.runtime.v1.TransactionalActorStateOperation.metadata:type_name -> dapr.proto.runtime.v1.TransactionalActorStateOperation.MetadataEntry - 104, // 33: dapr.proto.runtime.v1.InvokeActorRequest.metadata:type_name -> dapr.proto.runtime.v1.InvokeActorRequest.MetadataEntry + 119, // 31: dapr.proto.runtime.v1.TransactionalActorStateOperation.value:type_name -> google.protobuf.Any + 104, // 32: dapr.proto.runtime.v1.TransactionalActorStateOperation.metadata:type_name -> dapr.proto.runtime.v1.TransactionalActorStateOperation.MetadataEntry + 105, // 33: dapr.proto.runtime.v1.InvokeActorRequest.metadata:type_name -> dapr.proto.runtime.v1.InvokeActorRequest.MetadataEntry 40, // 34: dapr.proto.runtime.v1.GetMetadataResponse.active_actors_count:type_name -> dapr.proto.runtime.v1.ActiveActorsCount 41, // 35: dapr.proto.runtime.v1.GetMetadataResponse.registered_components:type_name -> dapr.proto.runtime.v1.RegisteredComponents - 105, // 36: dapr.proto.runtime.v1.GetMetadataResponse.extended_metadata:type_name -> dapr.proto.runtime.v1.GetMetadataResponse.ExtendedMetadataEntry - 42, // 37: dapr.proto.runtime.v1.GetMetadataResponse.subscriptions:type_name -> dapr.proto.runtime.v1.PubsubSubscription - 106, // 38: dapr.proto.runtime.v1.PubsubSubscription.metadata:type_name -> dapr.proto.runtime.v1.PubsubSubscription.MetadataEntry - 43, // 39: dapr.proto.runtime.v1.PubsubSubscription.rules:type_name -> dapr.proto.runtime.v1.PubsubSubscriptionRules - 44, // 40: dapr.proto.runtime.v1.PubsubSubscriptionRules.rules:type_name -> dapr.proto.runtime.v1.PubsubSubscriptionRule - 107, // 41: dapr.proto.runtime.v1.GetConfigurationRequest.metadata:type_name -> dapr.proto.runtime.v1.GetConfigurationRequest.MetadataEntry - 108, // 42: dapr.proto.runtime.v1.GetConfigurationResponse.items:type_name -> dapr.proto.runtime.v1.GetConfigurationResponse.ItemsEntry - 109, // 43: dapr.proto.runtime.v1.SubscribeConfigurationRequest.metadata:type_name -> dapr.proto.runtime.v1.SubscribeConfigurationRequest.MetadataEntry - 110, // 44: dapr.proto.runtime.v1.SubscribeConfigurationResponse.items:type_name -> dapr.proto.runtime.v1.SubscribeConfigurationResponse.ItemsEntry - 0, // 45: dapr.proto.runtime.v1.UnlockResponse.status:type_name -> dapr.proto.runtime.v1.UnlockResponse.Status - 1, // 46: dapr.proto.runtime.v1.SubtleGetKeyRequest.format:type_name -> dapr.proto.runtime.v1.SubtleGetKeyRequest.KeyFormat - 71, // 47: dapr.proto.runtime.v1.EncryptRequest.options:type_name -> dapr.proto.runtime.v1.EncryptRequestOptions - 119, // 48: dapr.proto.runtime.v1.EncryptRequest.payload:type_name -> dapr.proto.common.v1.StreamPayload - 119, // 49: dapr.proto.runtime.v1.EncryptResponse.payload:type_name -> dapr.proto.common.v1.StreamPayload - 74, // 50: dapr.proto.runtime.v1.DecryptRequest.options:type_name -> dapr.proto.runtime.v1.DecryptRequestOptions - 119, // 51: dapr.proto.runtime.v1.DecryptRequest.payload:type_name -> dapr.proto.common.v1.StreamPayload - 119, // 52: dapr.proto.runtime.v1.DecryptResponse.payload:type_name -> dapr.proto.common.v1.StreamPayload - 120, // 53: dapr.proto.runtime.v1.GetWorkflowResponse.created_at:type_name -> google.protobuf.Timestamp - 120, // 54: dapr.proto.runtime.v1.GetWorkflowResponse.last_updated_at:type_name -> google.protobuf.Timestamp - 111, // 55: dapr.proto.runtime.v1.GetWorkflowResponse.properties:type_name -> dapr.proto.runtime.v1.GetWorkflowResponse.PropertiesEntry - 112, // 56: dapr.proto.runtime.v1.StartWorkflowRequest.options:type_name -> dapr.proto.runtime.v1.StartWorkflowRequest.OptionsEntry - 24, // 57: dapr.proto.runtime.v1.GetBulkSecretResponse.DataEntry.value:type_name -> dapr.proto.runtime.v1.SecretResponse - 121, // 58: dapr.proto.runtime.v1.GetConfigurationResponse.ItemsEntry.value:type_name -> dapr.proto.common.v1.ConfigurationItem - 121, // 59: dapr.proto.runtime.v1.SubscribeConfigurationResponse.ItemsEntry.value:type_name -> dapr.proto.common.v1.ConfigurationItem - 2, // 60: dapr.proto.runtime.v1.Dapr.InvokeService:input_type -> dapr.proto.runtime.v1.InvokeServiceRequest - 3, // 61: dapr.proto.runtime.v1.Dapr.GetState:input_type -> dapr.proto.runtime.v1.GetStateRequest - 4, // 62: dapr.proto.runtime.v1.Dapr.GetBulkState:input_type -> dapr.proto.runtime.v1.GetBulkStateRequest - 10, // 63: dapr.proto.runtime.v1.Dapr.SaveState:input_type -> dapr.proto.runtime.v1.SaveStateRequest - 11, // 64: dapr.proto.runtime.v1.Dapr.QueryStateAlpha1:input_type -> dapr.proto.runtime.v1.QueryStateRequest - 8, // 65: dapr.proto.runtime.v1.Dapr.DeleteState:input_type -> dapr.proto.runtime.v1.DeleteStateRequest - 9, // 66: dapr.proto.runtime.v1.Dapr.DeleteBulkState:input_type -> dapr.proto.runtime.v1.DeleteBulkStateRequest - 27, // 67: dapr.proto.runtime.v1.Dapr.ExecuteStateTransaction:input_type -> dapr.proto.runtime.v1.ExecuteStateTransactionRequest - 14, // 68: dapr.proto.runtime.v1.Dapr.PublishEvent:input_type -> dapr.proto.runtime.v1.PublishEventRequest - 15, // 69: dapr.proto.runtime.v1.Dapr.BulkPublishEventAlpha1:input_type -> dapr.proto.runtime.v1.BulkPublishRequest - 19, // 70: dapr.proto.runtime.v1.Dapr.InvokeBinding:input_type -> dapr.proto.runtime.v1.InvokeBindingRequest - 21, // 71: dapr.proto.runtime.v1.Dapr.GetSecret:input_type -> dapr.proto.runtime.v1.GetSecretRequest - 23, // 72: dapr.proto.runtime.v1.Dapr.GetBulkSecret:input_type -> dapr.proto.runtime.v1.GetBulkSecretRequest - 28, // 73: dapr.proto.runtime.v1.Dapr.RegisterActorTimer:input_type -> dapr.proto.runtime.v1.RegisterActorTimerRequest - 29, // 74: dapr.proto.runtime.v1.Dapr.UnregisterActorTimer:input_type -> dapr.proto.runtime.v1.UnregisterActorTimerRequest - 30, // 75: dapr.proto.runtime.v1.Dapr.RegisterActorReminder:input_type -> dapr.proto.runtime.v1.RegisterActorReminderRequest - 31, // 76: dapr.proto.runtime.v1.Dapr.UnregisterActorReminder:input_type -> dapr.proto.runtime.v1.UnregisterActorReminderRequest - 32, // 77: dapr.proto.runtime.v1.Dapr.RenameActorReminder:input_type -> dapr.proto.runtime.v1.RenameActorReminderRequest - 33, // 78: dapr.proto.runtime.v1.Dapr.GetActorState:input_type -> dapr.proto.runtime.v1.GetActorStateRequest - 35, // 79: dapr.proto.runtime.v1.Dapr.ExecuteActorStateTransaction:input_type -> dapr.proto.runtime.v1.ExecuteActorStateTransactionRequest - 37, // 80: dapr.proto.runtime.v1.Dapr.InvokeActor:input_type -> dapr.proto.runtime.v1.InvokeActorRequest - 46, // 81: dapr.proto.runtime.v1.Dapr.GetConfigurationAlpha1:input_type -> dapr.proto.runtime.v1.GetConfigurationRequest - 46, // 82: dapr.proto.runtime.v1.Dapr.GetConfiguration:input_type -> dapr.proto.runtime.v1.GetConfigurationRequest - 48, // 83: dapr.proto.runtime.v1.Dapr.SubscribeConfigurationAlpha1:input_type -> dapr.proto.runtime.v1.SubscribeConfigurationRequest - 48, // 84: dapr.proto.runtime.v1.Dapr.SubscribeConfiguration:input_type -> dapr.proto.runtime.v1.SubscribeConfigurationRequest - 49, // 85: dapr.proto.runtime.v1.Dapr.UnsubscribeConfigurationAlpha1:input_type -> dapr.proto.runtime.v1.UnsubscribeConfigurationRequest - 49, // 86: dapr.proto.runtime.v1.Dapr.UnsubscribeConfiguration:input_type -> dapr.proto.runtime.v1.UnsubscribeConfigurationRequest - 52, // 87: dapr.proto.runtime.v1.Dapr.TryLockAlpha1:input_type -> dapr.proto.runtime.v1.TryLockRequest - 54, // 88: dapr.proto.runtime.v1.Dapr.UnlockAlpha1:input_type -> dapr.proto.runtime.v1.UnlockRequest - 70, // 89: dapr.proto.runtime.v1.Dapr.EncryptAlpha1:input_type -> dapr.proto.runtime.v1.EncryptRequest - 73, // 90: dapr.proto.runtime.v1.Dapr.DecryptAlpha1:input_type -> dapr.proto.runtime.v1.DecryptRequest - 122, // 91: dapr.proto.runtime.v1.Dapr.GetMetadata:input_type -> google.protobuf.Empty - 45, // 92: dapr.proto.runtime.v1.Dapr.SetMetadata:input_type -> dapr.proto.runtime.v1.SetMetadataRequest - 56, // 93: dapr.proto.runtime.v1.Dapr.SubtleGetKeyAlpha1:input_type -> dapr.proto.runtime.v1.SubtleGetKeyRequest - 58, // 94: dapr.proto.runtime.v1.Dapr.SubtleEncryptAlpha1:input_type -> dapr.proto.runtime.v1.SubtleEncryptRequest - 60, // 95: dapr.proto.runtime.v1.Dapr.SubtleDecryptAlpha1:input_type -> dapr.proto.runtime.v1.SubtleDecryptRequest - 62, // 96: dapr.proto.runtime.v1.Dapr.SubtleWrapKeyAlpha1:input_type -> dapr.proto.runtime.v1.SubtleWrapKeyRequest - 64, // 97: dapr.proto.runtime.v1.Dapr.SubtleUnwrapKeyAlpha1:input_type -> dapr.proto.runtime.v1.SubtleUnwrapKeyRequest - 66, // 98: dapr.proto.runtime.v1.Dapr.SubtleSignAlpha1:input_type -> dapr.proto.runtime.v1.SubtleSignRequest - 68, // 99: dapr.proto.runtime.v1.Dapr.SubtleVerifyAlpha1:input_type -> dapr.proto.runtime.v1.SubtleVerifyRequest - 78, // 100: dapr.proto.runtime.v1.Dapr.StartWorkflowAlpha1:input_type -> dapr.proto.runtime.v1.StartWorkflowRequest - 76, // 101: dapr.proto.runtime.v1.Dapr.GetWorkflowAlpha1:input_type -> dapr.proto.runtime.v1.GetWorkflowRequest - 84, // 102: dapr.proto.runtime.v1.Dapr.PurgeWorkflowAlpha1:input_type -> dapr.proto.runtime.v1.PurgeWorkflowRequest - 80, // 103: dapr.proto.runtime.v1.Dapr.TerminateWorkflowAlpha1:input_type -> dapr.proto.runtime.v1.TerminateWorkflowRequest - 81, // 104: dapr.proto.runtime.v1.Dapr.PauseWorkflowAlpha1:input_type -> dapr.proto.runtime.v1.PauseWorkflowRequest - 82, // 105: dapr.proto.runtime.v1.Dapr.ResumeWorkflowAlpha1:input_type -> dapr.proto.runtime.v1.ResumeWorkflowRequest - 83, // 106: dapr.proto.runtime.v1.Dapr.RaiseEventWorkflowAlpha1:input_type -> dapr.proto.runtime.v1.RaiseEventWorkflowRequest - 122, // 107: dapr.proto.runtime.v1.Dapr.Shutdown:input_type -> google.protobuf.Empty - 123, // 108: dapr.proto.runtime.v1.Dapr.InvokeService:output_type -> dapr.proto.common.v1.InvokeResponse - 7, // 109: dapr.proto.runtime.v1.Dapr.GetState:output_type -> dapr.proto.runtime.v1.GetStateResponse - 5, // 110: dapr.proto.runtime.v1.Dapr.GetBulkState:output_type -> dapr.proto.runtime.v1.GetBulkStateResponse - 122, // 111: dapr.proto.runtime.v1.Dapr.SaveState:output_type -> google.protobuf.Empty - 13, // 112: dapr.proto.runtime.v1.Dapr.QueryStateAlpha1:output_type -> dapr.proto.runtime.v1.QueryStateResponse - 122, // 113: dapr.proto.runtime.v1.Dapr.DeleteState:output_type -> google.protobuf.Empty - 122, // 114: dapr.proto.runtime.v1.Dapr.DeleteBulkState:output_type -> google.protobuf.Empty - 122, // 115: dapr.proto.runtime.v1.Dapr.ExecuteStateTransaction:output_type -> google.protobuf.Empty - 122, // 116: dapr.proto.runtime.v1.Dapr.PublishEvent:output_type -> google.protobuf.Empty - 17, // 117: dapr.proto.runtime.v1.Dapr.BulkPublishEventAlpha1:output_type -> dapr.proto.runtime.v1.BulkPublishResponse - 20, // 118: dapr.proto.runtime.v1.Dapr.InvokeBinding:output_type -> dapr.proto.runtime.v1.InvokeBindingResponse - 22, // 119: dapr.proto.runtime.v1.Dapr.GetSecret:output_type -> dapr.proto.runtime.v1.GetSecretResponse - 25, // 120: dapr.proto.runtime.v1.Dapr.GetBulkSecret:output_type -> dapr.proto.runtime.v1.GetBulkSecretResponse - 122, // 121: dapr.proto.runtime.v1.Dapr.RegisterActorTimer:output_type -> google.protobuf.Empty - 122, // 122: dapr.proto.runtime.v1.Dapr.UnregisterActorTimer:output_type -> google.protobuf.Empty - 122, // 123: dapr.proto.runtime.v1.Dapr.RegisterActorReminder:output_type -> google.protobuf.Empty - 122, // 124: dapr.proto.runtime.v1.Dapr.UnregisterActorReminder:output_type -> google.protobuf.Empty - 122, // 125: dapr.proto.runtime.v1.Dapr.RenameActorReminder:output_type -> google.protobuf.Empty - 34, // 126: dapr.proto.runtime.v1.Dapr.GetActorState:output_type -> dapr.proto.runtime.v1.GetActorStateResponse - 122, // 127: dapr.proto.runtime.v1.Dapr.ExecuteActorStateTransaction:output_type -> google.protobuf.Empty - 38, // 128: dapr.proto.runtime.v1.Dapr.InvokeActor:output_type -> dapr.proto.runtime.v1.InvokeActorResponse - 47, // 129: dapr.proto.runtime.v1.Dapr.GetConfigurationAlpha1:output_type -> dapr.proto.runtime.v1.GetConfigurationResponse - 47, // 130: dapr.proto.runtime.v1.Dapr.GetConfiguration:output_type -> dapr.proto.runtime.v1.GetConfigurationResponse - 50, // 131: dapr.proto.runtime.v1.Dapr.SubscribeConfigurationAlpha1:output_type -> dapr.proto.runtime.v1.SubscribeConfigurationResponse - 50, // 132: dapr.proto.runtime.v1.Dapr.SubscribeConfiguration:output_type -> dapr.proto.runtime.v1.SubscribeConfigurationResponse - 51, // 133: dapr.proto.runtime.v1.Dapr.UnsubscribeConfigurationAlpha1:output_type -> dapr.proto.runtime.v1.UnsubscribeConfigurationResponse - 51, // 134: dapr.proto.runtime.v1.Dapr.UnsubscribeConfiguration:output_type -> dapr.proto.runtime.v1.UnsubscribeConfigurationResponse - 53, // 135: dapr.proto.runtime.v1.Dapr.TryLockAlpha1:output_type -> dapr.proto.runtime.v1.TryLockResponse - 55, // 136: dapr.proto.runtime.v1.Dapr.UnlockAlpha1:output_type -> dapr.proto.runtime.v1.UnlockResponse - 72, // 137: dapr.proto.runtime.v1.Dapr.EncryptAlpha1:output_type -> dapr.proto.runtime.v1.EncryptResponse - 75, // 138: dapr.proto.runtime.v1.Dapr.DecryptAlpha1:output_type -> dapr.proto.runtime.v1.DecryptResponse - 39, // 139: dapr.proto.runtime.v1.Dapr.GetMetadata:output_type -> dapr.proto.runtime.v1.GetMetadataResponse - 122, // 140: dapr.proto.runtime.v1.Dapr.SetMetadata:output_type -> google.protobuf.Empty - 57, // 141: dapr.proto.runtime.v1.Dapr.SubtleGetKeyAlpha1:output_type -> dapr.proto.runtime.v1.SubtleGetKeyResponse - 59, // 142: dapr.proto.runtime.v1.Dapr.SubtleEncryptAlpha1:output_type -> dapr.proto.runtime.v1.SubtleEncryptResponse - 61, // 143: dapr.proto.runtime.v1.Dapr.SubtleDecryptAlpha1:output_type -> dapr.proto.runtime.v1.SubtleDecryptResponse - 63, // 144: dapr.proto.runtime.v1.Dapr.SubtleWrapKeyAlpha1:output_type -> dapr.proto.runtime.v1.SubtleWrapKeyResponse - 65, // 145: dapr.proto.runtime.v1.Dapr.SubtleUnwrapKeyAlpha1:output_type -> dapr.proto.runtime.v1.SubtleUnwrapKeyResponse - 67, // 146: dapr.proto.runtime.v1.Dapr.SubtleSignAlpha1:output_type -> dapr.proto.runtime.v1.SubtleSignResponse - 69, // 147: dapr.proto.runtime.v1.Dapr.SubtleVerifyAlpha1:output_type -> dapr.proto.runtime.v1.SubtleVerifyResponse - 79, // 148: dapr.proto.runtime.v1.Dapr.StartWorkflowAlpha1:output_type -> dapr.proto.runtime.v1.StartWorkflowResponse - 77, // 149: dapr.proto.runtime.v1.Dapr.GetWorkflowAlpha1:output_type -> dapr.proto.runtime.v1.GetWorkflowResponse - 122, // 150: dapr.proto.runtime.v1.Dapr.PurgeWorkflowAlpha1:output_type -> google.protobuf.Empty - 122, // 151: dapr.proto.runtime.v1.Dapr.TerminateWorkflowAlpha1:output_type -> google.protobuf.Empty - 122, // 152: dapr.proto.runtime.v1.Dapr.PauseWorkflowAlpha1:output_type -> google.protobuf.Empty - 122, // 153: dapr.proto.runtime.v1.Dapr.ResumeWorkflowAlpha1:output_type -> google.protobuf.Empty - 122, // 154: dapr.proto.runtime.v1.Dapr.RaiseEventWorkflowAlpha1:output_type -> google.protobuf.Empty - 122, // 155: dapr.proto.runtime.v1.Dapr.Shutdown:output_type -> google.protobuf.Empty - 108, // [108:156] is the sub-list for method output_type - 60, // [60:108] is the sub-list for method input_type - 60, // [60:60] is the sub-list for extension type_name - 60, // [60:60] is the sub-list for extension extendee - 0, // [0:60] is the sub-list for field type_name + 106, // 36: dapr.proto.runtime.v1.GetMetadataResponse.extended_metadata:type_name -> dapr.proto.runtime.v1.GetMetadataResponse.ExtendedMetadataEntry + 43, // 37: dapr.proto.runtime.v1.GetMetadataResponse.subscriptions:type_name -> dapr.proto.runtime.v1.PubsubSubscription + 42, // 38: dapr.proto.runtime.v1.GetMetadataResponse.http_endpoints:type_name -> dapr.proto.runtime.v1.MetadataHTTPEndpoint + 107, // 39: dapr.proto.runtime.v1.PubsubSubscription.metadata:type_name -> dapr.proto.runtime.v1.PubsubSubscription.MetadataEntry + 44, // 40: dapr.proto.runtime.v1.PubsubSubscription.rules:type_name -> dapr.proto.runtime.v1.PubsubSubscriptionRules + 45, // 41: dapr.proto.runtime.v1.PubsubSubscriptionRules.rules:type_name -> dapr.proto.runtime.v1.PubsubSubscriptionRule + 108, // 42: dapr.proto.runtime.v1.GetConfigurationRequest.metadata:type_name -> dapr.proto.runtime.v1.GetConfigurationRequest.MetadataEntry + 109, // 43: dapr.proto.runtime.v1.GetConfigurationResponse.items:type_name -> dapr.proto.runtime.v1.GetConfigurationResponse.ItemsEntry + 110, // 44: dapr.proto.runtime.v1.SubscribeConfigurationRequest.metadata:type_name -> dapr.proto.runtime.v1.SubscribeConfigurationRequest.MetadataEntry + 111, // 45: dapr.proto.runtime.v1.SubscribeConfigurationResponse.items:type_name -> dapr.proto.runtime.v1.SubscribeConfigurationResponse.ItemsEntry + 0, // 46: dapr.proto.runtime.v1.UnlockResponse.status:type_name -> dapr.proto.runtime.v1.UnlockResponse.Status + 1, // 47: dapr.proto.runtime.v1.SubtleGetKeyRequest.format:type_name -> dapr.proto.runtime.v1.SubtleGetKeyRequest.KeyFormat + 72, // 48: dapr.proto.runtime.v1.EncryptRequest.options:type_name -> dapr.proto.runtime.v1.EncryptRequestOptions + 120, // 49: dapr.proto.runtime.v1.EncryptRequest.payload:type_name -> dapr.proto.common.v1.StreamPayload + 120, // 50: dapr.proto.runtime.v1.EncryptResponse.payload:type_name -> dapr.proto.common.v1.StreamPayload + 75, // 51: dapr.proto.runtime.v1.DecryptRequest.options:type_name -> dapr.proto.runtime.v1.DecryptRequestOptions + 120, // 52: dapr.proto.runtime.v1.DecryptRequest.payload:type_name -> dapr.proto.common.v1.StreamPayload + 120, // 53: dapr.proto.runtime.v1.DecryptResponse.payload:type_name -> dapr.proto.common.v1.StreamPayload + 121, // 54: dapr.proto.runtime.v1.GetWorkflowResponse.created_at:type_name -> google.protobuf.Timestamp + 121, // 55: dapr.proto.runtime.v1.GetWorkflowResponse.last_updated_at:type_name -> google.protobuf.Timestamp + 112, // 56: dapr.proto.runtime.v1.GetWorkflowResponse.properties:type_name -> dapr.proto.runtime.v1.GetWorkflowResponse.PropertiesEntry + 113, // 57: dapr.proto.runtime.v1.StartWorkflowRequest.options:type_name -> dapr.proto.runtime.v1.StartWorkflowRequest.OptionsEntry + 24, // 58: dapr.proto.runtime.v1.GetBulkSecretResponse.DataEntry.value:type_name -> dapr.proto.runtime.v1.SecretResponse + 122, // 59: dapr.proto.runtime.v1.GetConfigurationResponse.ItemsEntry.value:type_name -> dapr.proto.common.v1.ConfigurationItem + 122, // 60: dapr.proto.runtime.v1.SubscribeConfigurationResponse.ItemsEntry.value:type_name -> dapr.proto.common.v1.ConfigurationItem + 2, // 61: dapr.proto.runtime.v1.Dapr.InvokeService:input_type -> dapr.proto.runtime.v1.InvokeServiceRequest + 3, // 62: dapr.proto.runtime.v1.Dapr.GetState:input_type -> dapr.proto.runtime.v1.GetStateRequest + 4, // 63: dapr.proto.runtime.v1.Dapr.GetBulkState:input_type -> dapr.proto.runtime.v1.GetBulkStateRequest + 10, // 64: dapr.proto.runtime.v1.Dapr.SaveState:input_type -> dapr.proto.runtime.v1.SaveStateRequest + 11, // 65: dapr.proto.runtime.v1.Dapr.QueryStateAlpha1:input_type -> dapr.proto.runtime.v1.QueryStateRequest + 8, // 66: dapr.proto.runtime.v1.Dapr.DeleteState:input_type -> dapr.proto.runtime.v1.DeleteStateRequest + 9, // 67: dapr.proto.runtime.v1.Dapr.DeleteBulkState:input_type -> dapr.proto.runtime.v1.DeleteBulkStateRequest + 27, // 68: dapr.proto.runtime.v1.Dapr.ExecuteStateTransaction:input_type -> dapr.proto.runtime.v1.ExecuteStateTransactionRequest + 14, // 69: dapr.proto.runtime.v1.Dapr.PublishEvent:input_type -> dapr.proto.runtime.v1.PublishEventRequest + 15, // 70: dapr.proto.runtime.v1.Dapr.BulkPublishEventAlpha1:input_type -> dapr.proto.runtime.v1.BulkPublishRequest + 19, // 71: dapr.proto.runtime.v1.Dapr.InvokeBinding:input_type -> dapr.proto.runtime.v1.InvokeBindingRequest + 21, // 72: dapr.proto.runtime.v1.Dapr.GetSecret:input_type -> dapr.proto.runtime.v1.GetSecretRequest + 23, // 73: dapr.proto.runtime.v1.Dapr.GetBulkSecret:input_type -> dapr.proto.runtime.v1.GetBulkSecretRequest + 28, // 74: dapr.proto.runtime.v1.Dapr.RegisterActorTimer:input_type -> dapr.proto.runtime.v1.RegisterActorTimerRequest + 29, // 75: dapr.proto.runtime.v1.Dapr.UnregisterActorTimer:input_type -> dapr.proto.runtime.v1.UnregisterActorTimerRequest + 30, // 76: dapr.proto.runtime.v1.Dapr.RegisterActorReminder:input_type -> dapr.proto.runtime.v1.RegisterActorReminderRequest + 31, // 77: dapr.proto.runtime.v1.Dapr.UnregisterActorReminder:input_type -> dapr.proto.runtime.v1.UnregisterActorReminderRequest + 32, // 78: dapr.proto.runtime.v1.Dapr.RenameActorReminder:input_type -> dapr.proto.runtime.v1.RenameActorReminderRequest + 33, // 79: dapr.proto.runtime.v1.Dapr.GetActorState:input_type -> dapr.proto.runtime.v1.GetActorStateRequest + 35, // 80: dapr.proto.runtime.v1.Dapr.ExecuteActorStateTransaction:input_type -> dapr.proto.runtime.v1.ExecuteActorStateTransactionRequest + 37, // 81: dapr.proto.runtime.v1.Dapr.InvokeActor:input_type -> dapr.proto.runtime.v1.InvokeActorRequest + 47, // 82: dapr.proto.runtime.v1.Dapr.GetConfigurationAlpha1:input_type -> dapr.proto.runtime.v1.GetConfigurationRequest + 47, // 83: dapr.proto.runtime.v1.Dapr.GetConfiguration:input_type -> dapr.proto.runtime.v1.GetConfigurationRequest + 49, // 84: dapr.proto.runtime.v1.Dapr.SubscribeConfigurationAlpha1:input_type -> dapr.proto.runtime.v1.SubscribeConfigurationRequest + 49, // 85: dapr.proto.runtime.v1.Dapr.SubscribeConfiguration:input_type -> dapr.proto.runtime.v1.SubscribeConfigurationRequest + 50, // 86: dapr.proto.runtime.v1.Dapr.UnsubscribeConfigurationAlpha1:input_type -> dapr.proto.runtime.v1.UnsubscribeConfigurationRequest + 50, // 87: dapr.proto.runtime.v1.Dapr.UnsubscribeConfiguration:input_type -> dapr.proto.runtime.v1.UnsubscribeConfigurationRequest + 53, // 88: dapr.proto.runtime.v1.Dapr.TryLockAlpha1:input_type -> dapr.proto.runtime.v1.TryLockRequest + 55, // 89: dapr.proto.runtime.v1.Dapr.UnlockAlpha1:input_type -> dapr.proto.runtime.v1.UnlockRequest + 71, // 90: dapr.proto.runtime.v1.Dapr.EncryptAlpha1:input_type -> dapr.proto.runtime.v1.EncryptRequest + 74, // 91: dapr.proto.runtime.v1.Dapr.DecryptAlpha1:input_type -> dapr.proto.runtime.v1.DecryptRequest + 123, // 92: dapr.proto.runtime.v1.Dapr.GetMetadata:input_type -> google.protobuf.Empty + 46, // 93: dapr.proto.runtime.v1.Dapr.SetMetadata:input_type -> dapr.proto.runtime.v1.SetMetadataRequest + 57, // 94: dapr.proto.runtime.v1.Dapr.SubtleGetKeyAlpha1:input_type -> dapr.proto.runtime.v1.SubtleGetKeyRequest + 59, // 95: dapr.proto.runtime.v1.Dapr.SubtleEncryptAlpha1:input_type -> dapr.proto.runtime.v1.SubtleEncryptRequest + 61, // 96: dapr.proto.runtime.v1.Dapr.SubtleDecryptAlpha1:input_type -> dapr.proto.runtime.v1.SubtleDecryptRequest + 63, // 97: dapr.proto.runtime.v1.Dapr.SubtleWrapKeyAlpha1:input_type -> dapr.proto.runtime.v1.SubtleWrapKeyRequest + 65, // 98: dapr.proto.runtime.v1.Dapr.SubtleUnwrapKeyAlpha1:input_type -> dapr.proto.runtime.v1.SubtleUnwrapKeyRequest + 67, // 99: dapr.proto.runtime.v1.Dapr.SubtleSignAlpha1:input_type -> dapr.proto.runtime.v1.SubtleSignRequest + 69, // 100: dapr.proto.runtime.v1.Dapr.SubtleVerifyAlpha1:input_type -> dapr.proto.runtime.v1.SubtleVerifyRequest + 79, // 101: dapr.proto.runtime.v1.Dapr.StartWorkflowAlpha1:input_type -> dapr.proto.runtime.v1.StartWorkflowRequest + 77, // 102: dapr.proto.runtime.v1.Dapr.GetWorkflowAlpha1:input_type -> dapr.proto.runtime.v1.GetWorkflowRequest + 85, // 103: dapr.proto.runtime.v1.Dapr.PurgeWorkflowAlpha1:input_type -> dapr.proto.runtime.v1.PurgeWorkflowRequest + 81, // 104: dapr.proto.runtime.v1.Dapr.TerminateWorkflowAlpha1:input_type -> dapr.proto.runtime.v1.TerminateWorkflowRequest + 82, // 105: dapr.proto.runtime.v1.Dapr.PauseWorkflowAlpha1:input_type -> dapr.proto.runtime.v1.PauseWorkflowRequest + 83, // 106: dapr.proto.runtime.v1.Dapr.ResumeWorkflowAlpha1:input_type -> dapr.proto.runtime.v1.ResumeWorkflowRequest + 84, // 107: dapr.proto.runtime.v1.Dapr.RaiseEventWorkflowAlpha1:input_type -> dapr.proto.runtime.v1.RaiseEventWorkflowRequest + 123, // 108: dapr.proto.runtime.v1.Dapr.Shutdown:input_type -> google.protobuf.Empty + 124, // 109: dapr.proto.runtime.v1.Dapr.InvokeService:output_type -> dapr.proto.common.v1.InvokeResponse + 7, // 110: dapr.proto.runtime.v1.Dapr.GetState:output_type -> dapr.proto.runtime.v1.GetStateResponse + 5, // 111: dapr.proto.runtime.v1.Dapr.GetBulkState:output_type -> dapr.proto.runtime.v1.GetBulkStateResponse + 123, // 112: dapr.proto.runtime.v1.Dapr.SaveState:output_type -> google.protobuf.Empty + 13, // 113: dapr.proto.runtime.v1.Dapr.QueryStateAlpha1:output_type -> dapr.proto.runtime.v1.QueryStateResponse + 123, // 114: dapr.proto.runtime.v1.Dapr.DeleteState:output_type -> google.protobuf.Empty + 123, // 115: dapr.proto.runtime.v1.Dapr.DeleteBulkState:output_type -> google.protobuf.Empty + 123, // 116: dapr.proto.runtime.v1.Dapr.ExecuteStateTransaction:output_type -> google.protobuf.Empty + 123, // 117: dapr.proto.runtime.v1.Dapr.PublishEvent:output_type -> google.protobuf.Empty + 17, // 118: dapr.proto.runtime.v1.Dapr.BulkPublishEventAlpha1:output_type -> dapr.proto.runtime.v1.BulkPublishResponse + 20, // 119: dapr.proto.runtime.v1.Dapr.InvokeBinding:output_type -> dapr.proto.runtime.v1.InvokeBindingResponse + 22, // 120: dapr.proto.runtime.v1.Dapr.GetSecret:output_type -> dapr.proto.runtime.v1.GetSecretResponse + 25, // 121: dapr.proto.runtime.v1.Dapr.GetBulkSecret:output_type -> dapr.proto.runtime.v1.GetBulkSecretResponse + 123, // 122: dapr.proto.runtime.v1.Dapr.RegisterActorTimer:output_type -> google.protobuf.Empty + 123, // 123: dapr.proto.runtime.v1.Dapr.UnregisterActorTimer:output_type -> google.protobuf.Empty + 123, // 124: dapr.proto.runtime.v1.Dapr.RegisterActorReminder:output_type -> google.protobuf.Empty + 123, // 125: dapr.proto.runtime.v1.Dapr.UnregisterActorReminder:output_type -> google.protobuf.Empty + 123, // 126: dapr.proto.runtime.v1.Dapr.RenameActorReminder:output_type -> google.protobuf.Empty + 34, // 127: dapr.proto.runtime.v1.Dapr.GetActorState:output_type -> dapr.proto.runtime.v1.GetActorStateResponse + 123, // 128: dapr.proto.runtime.v1.Dapr.ExecuteActorStateTransaction:output_type -> google.protobuf.Empty + 38, // 129: dapr.proto.runtime.v1.Dapr.InvokeActor:output_type -> dapr.proto.runtime.v1.InvokeActorResponse + 48, // 130: dapr.proto.runtime.v1.Dapr.GetConfigurationAlpha1:output_type -> dapr.proto.runtime.v1.GetConfigurationResponse + 48, // 131: dapr.proto.runtime.v1.Dapr.GetConfiguration:output_type -> dapr.proto.runtime.v1.GetConfigurationResponse + 51, // 132: dapr.proto.runtime.v1.Dapr.SubscribeConfigurationAlpha1:output_type -> dapr.proto.runtime.v1.SubscribeConfigurationResponse + 51, // 133: dapr.proto.runtime.v1.Dapr.SubscribeConfiguration:output_type -> dapr.proto.runtime.v1.SubscribeConfigurationResponse + 52, // 134: dapr.proto.runtime.v1.Dapr.UnsubscribeConfigurationAlpha1:output_type -> dapr.proto.runtime.v1.UnsubscribeConfigurationResponse + 52, // 135: dapr.proto.runtime.v1.Dapr.UnsubscribeConfiguration:output_type -> dapr.proto.runtime.v1.UnsubscribeConfigurationResponse + 54, // 136: dapr.proto.runtime.v1.Dapr.TryLockAlpha1:output_type -> dapr.proto.runtime.v1.TryLockResponse + 56, // 137: dapr.proto.runtime.v1.Dapr.UnlockAlpha1:output_type -> dapr.proto.runtime.v1.UnlockResponse + 73, // 138: dapr.proto.runtime.v1.Dapr.EncryptAlpha1:output_type -> dapr.proto.runtime.v1.EncryptResponse + 76, // 139: dapr.proto.runtime.v1.Dapr.DecryptAlpha1:output_type -> dapr.proto.runtime.v1.DecryptResponse + 39, // 140: dapr.proto.runtime.v1.Dapr.GetMetadata:output_type -> dapr.proto.runtime.v1.GetMetadataResponse + 123, // 141: dapr.proto.runtime.v1.Dapr.SetMetadata:output_type -> google.protobuf.Empty + 58, // 142: dapr.proto.runtime.v1.Dapr.SubtleGetKeyAlpha1:output_type -> dapr.proto.runtime.v1.SubtleGetKeyResponse + 60, // 143: dapr.proto.runtime.v1.Dapr.SubtleEncryptAlpha1:output_type -> dapr.proto.runtime.v1.SubtleEncryptResponse + 62, // 144: dapr.proto.runtime.v1.Dapr.SubtleDecryptAlpha1:output_type -> dapr.proto.runtime.v1.SubtleDecryptResponse + 64, // 145: dapr.proto.runtime.v1.Dapr.SubtleWrapKeyAlpha1:output_type -> dapr.proto.runtime.v1.SubtleWrapKeyResponse + 66, // 146: dapr.proto.runtime.v1.Dapr.SubtleUnwrapKeyAlpha1:output_type -> dapr.proto.runtime.v1.SubtleUnwrapKeyResponse + 68, // 147: dapr.proto.runtime.v1.Dapr.SubtleSignAlpha1:output_type -> dapr.proto.runtime.v1.SubtleSignResponse + 70, // 148: dapr.proto.runtime.v1.Dapr.SubtleVerifyAlpha1:output_type -> dapr.proto.runtime.v1.SubtleVerifyResponse + 80, // 149: dapr.proto.runtime.v1.Dapr.StartWorkflowAlpha1:output_type -> dapr.proto.runtime.v1.StartWorkflowResponse + 78, // 150: dapr.proto.runtime.v1.Dapr.GetWorkflowAlpha1:output_type -> dapr.proto.runtime.v1.GetWorkflowResponse + 123, // 151: dapr.proto.runtime.v1.Dapr.PurgeWorkflowAlpha1:output_type -> google.protobuf.Empty + 123, // 152: dapr.proto.runtime.v1.Dapr.TerminateWorkflowAlpha1:output_type -> google.protobuf.Empty + 123, // 153: dapr.proto.runtime.v1.Dapr.PauseWorkflowAlpha1:output_type -> google.protobuf.Empty + 123, // 154: dapr.proto.runtime.v1.Dapr.ResumeWorkflowAlpha1:output_type -> google.protobuf.Empty + 123, // 155: dapr.proto.runtime.v1.Dapr.RaiseEventWorkflowAlpha1:output_type -> google.protobuf.Empty + 123, // 156: dapr.proto.runtime.v1.Dapr.Shutdown:output_type -> google.protobuf.Empty + 109, // [109:157] is the sub-list for method output_type + 61, // [61:109] is the sub-list for method input_type + 61, // [61:61] is the sub-list for extension type_name + 61, // [61:61] is the sub-list for extension extendee + 0, // [0:61] is the sub-list for field type_name } func init() { file_dapr_proto_runtime_v1_dapr_proto_init() } @@ -7647,7 +7710,7 @@ func file_dapr_proto_runtime_v1_dapr_proto_init() { } } file_dapr_proto_runtime_v1_dapr_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PubsubSubscription); i { + switch v := v.(*MetadataHTTPEndpoint); i { case 0: return &v.state case 1: @@ -7659,7 +7722,7 @@ func file_dapr_proto_runtime_v1_dapr_proto_init() { } } file_dapr_proto_runtime_v1_dapr_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PubsubSubscriptionRules); i { + switch v := v.(*PubsubSubscription); i { case 0: return &v.state case 1: @@ -7671,7 +7734,7 @@ func file_dapr_proto_runtime_v1_dapr_proto_init() { } } file_dapr_proto_runtime_v1_dapr_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PubsubSubscriptionRule); i { + switch v := v.(*PubsubSubscriptionRules); i { case 0: return &v.state case 1: @@ -7683,7 +7746,7 @@ func file_dapr_proto_runtime_v1_dapr_proto_init() { } } file_dapr_proto_runtime_v1_dapr_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetMetadataRequest); i { + switch v := v.(*PubsubSubscriptionRule); i { case 0: return &v.state case 1: @@ -7695,7 +7758,7 @@ func file_dapr_proto_runtime_v1_dapr_proto_init() { } } file_dapr_proto_runtime_v1_dapr_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetConfigurationRequest); i { + switch v := v.(*SetMetadataRequest); i { case 0: return &v.state case 1: @@ -7707,7 +7770,7 @@ func file_dapr_proto_runtime_v1_dapr_proto_init() { } } file_dapr_proto_runtime_v1_dapr_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetConfigurationResponse); i { + switch v := v.(*GetConfigurationRequest); i { case 0: return &v.state case 1: @@ -7719,7 +7782,7 @@ func file_dapr_proto_runtime_v1_dapr_proto_init() { } } file_dapr_proto_runtime_v1_dapr_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SubscribeConfigurationRequest); i { + switch v := v.(*GetConfigurationResponse); i { case 0: return &v.state case 1: @@ -7731,7 +7794,7 @@ func file_dapr_proto_runtime_v1_dapr_proto_init() { } } file_dapr_proto_runtime_v1_dapr_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UnsubscribeConfigurationRequest); i { + switch v := v.(*SubscribeConfigurationRequest); i { case 0: return &v.state case 1: @@ -7743,7 +7806,7 @@ func file_dapr_proto_runtime_v1_dapr_proto_init() { } } file_dapr_proto_runtime_v1_dapr_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SubscribeConfigurationResponse); i { + switch v := v.(*UnsubscribeConfigurationRequest); i { case 0: return &v.state case 1: @@ -7755,7 +7818,7 @@ func file_dapr_proto_runtime_v1_dapr_proto_init() { } } file_dapr_proto_runtime_v1_dapr_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UnsubscribeConfigurationResponse); i { + switch v := v.(*SubscribeConfigurationResponse); i { case 0: return &v.state case 1: @@ -7767,7 +7830,7 @@ func file_dapr_proto_runtime_v1_dapr_proto_init() { } } file_dapr_proto_runtime_v1_dapr_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TryLockRequest); i { + switch v := v.(*UnsubscribeConfigurationResponse); i { case 0: return &v.state case 1: @@ -7779,7 +7842,7 @@ func file_dapr_proto_runtime_v1_dapr_proto_init() { } } file_dapr_proto_runtime_v1_dapr_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TryLockResponse); i { + switch v := v.(*TryLockRequest); i { case 0: return &v.state case 1: @@ -7791,7 +7854,7 @@ func file_dapr_proto_runtime_v1_dapr_proto_init() { } } file_dapr_proto_runtime_v1_dapr_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UnlockRequest); i { + switch v := v.(*TryLockResponse); i { case 0: return &v.state case 1: @@ -7803,7 +7866,7 @@ func file_dapr_proto_runtime_v1_dapr_proto_init() { } } file_dapr_proto_runtime_v1_dapr_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UnlockResponse); i { + switch v := v.(*UnlockRequest); i { case 0: return &v.state case 1: @@ -7815,7 +7878,7 @@ func file_dapr_proto_runtime_v1_dapr_proto_init() { } } file_dapr_proto_runtime_v1_dapr_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SubtleGetKeyRequest); i { + switch v := v.(*UnlockResponse); i { case 0: return &v.state case 1: @@ -7827,7 +7890,7 @@ func file_dapr_proto_runtime_v1_dapr_proto_init() { } } file_dapr_proto_runtime_v1_dapr_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SubtleGetKeyResponse); i { + switch v := v.(*SubtleGetKeyRequest); i { case 0: return &v.state case 1: @@ -7839,7 +7902,7 @@ func file_dapr_proto_runtime_v1_dapr_proto_init() { } } file_dapr_proto_runtime_v1_dapr_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SubtleEncryptRequest); i { + switch v := v.(*SubtleGetKeyResponse); i { case 0: return &v.state case 1: @@ -7851,7 +7914,7 @@ func file_dapr_proto_runtime_v1_dapr_proto_init() { } } file_dapr_proto_runtime_v1_dapr_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SubtleEncryptResponse); i { + switch v := v.(*SubtleEncryptRequest); i { case 0: return &v.state case 1: @@ -7863,7 +7926,7 @@ func file_dapr_proto_runtime_v1_dapr_proto_init() { } } file_dapr_proto_runtime_v1_dapr_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SubtleDecryptRequest); i { + switch v := v.(*SubtleEncryptResponse); i { case 0: return &v.state case 1: @@ -7875,7 +7938,7 @@ func file_dapr_proto_runtime_v1_dapr_proto_init() { } } file_dapr_proto_runtime_v1_dapr_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SubtleDecryptResponse); i { + switch v := v.(*SubtleDecryptRequest); i { case 0: return &v.state case 1: @@ -7887,7 +7950,7 @@ func file_dapr_proto_runtime_v1_dapr_proto_init() { } } file_dapr_proto_runtime_v1_dapr_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SubtleWrapKeyRequest); i { + switch v := v.(*SubtleDecryptResponse); i { case 0: return &v.state case 1: @@ -7899,7 +7962,7 @@ func file_dapr_proto_runtime_v1_dapr_proto_init() { } } file_dapr_proto_runtime_v1_dapr_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SubtleWrapKeyResponse); i { + switch v := v.(*SubtleWrapKeyRequest); i { case 0: return &v.state case 1: @@ -7911,7 +7974,7 @@ func file_dapr_proto_runtime_v1_dapr_proto_init() { } } file_dapr_proto_runtime_v1_dapr_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SubtleUnwrapKeyRequest); i { + switch v := v.(*SubtleWrapKeyResponse); i { case 0: return &v.state case 1: @@ -7923,7 +7986,7 @@ func file_dapr_proto_runtime_v1_dapr_proto_init() { } } file_dapr_proto_runtime_v1_dapr_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SubtleUnwrapKeyResponse); i { + switch v := v.(*SubtleUnwrapKeyRequest); i { case 0: return &v.state case 1: @@ -7935,7 +7998,7 @@ func file_dapr_proto_runtime_v1_dapr_proto_init() { } } file_dapr_proto_runtime_v1_dapr_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SubtleSignRequest); i { + switch v := v.(*SubtleUnwrapKeyResponse); i { case 0: return &v.state case 1: @@ -7947,7 +8010,7 @@ func file_dapr_proto_runtime_v1_dapr_proto_init() { } } file_dapr_proto_runtime_v1_dapr_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SubtleSignResponse); i { + switch v := v.(*SubtleSignRequest); i { case 0: return &v.state case 1: @@ -7959,7 +8022,7 @@ func file_dapr_proto_runtime_v1_dapr_proto_init() { } } file_dapr_proto_runtime_v1_dapr_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SubtleVerifyRequest); i { + switch v := v.(*SubtleSignResponse); i { case 0: return &v.state case 1: @@ -7971,7 +8034,7 @@ func file_dapr_proto_runtime_v1_dapr_proto_init() { } } file_dapr_proto_runtime_v1_dapr_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SubtleVerifyResponse); i { + switch v := v.(*SubtleVerifyRequest); i { case 0: return &v.state case 1: @@ -7983,7 +8046,7 @@ func file_dapr_proto_runtime_v1_dapr_proto_init() { } } file_dapr_proto_runtime_v1_dapr_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EncryptRequest); i { + switch v := v.(*SubtleVerifyResponse); i { case 0: return &v.state case 1: @@ -7995,7 +8058,7 @@ func file_dapr_proto_runtime_v1_dapr_proto_init() { } } file_dapr_proto_runtime_v1_dapr_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EncryptRequestOptions); i { + switch v := v.(*EncryptRequest); i { case 0: return &v.state case 1: @@ -8007,7 +8070,7 @@ func file_dapr_proto_runtime_v1_dapr_proto_init() { } } file_dapr_proto_runtime_v1_dapr_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EncryptResponse); i { + switch v := v.(*EncryptRequestOptions); i { case 0: return &v.state case 1: @@ -8019,7 +8082,7 @@ func file_dapr_proto_runtime_v1_dapr_proto_init() { } } file_dapr_proto_runtime_v1_dapr_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DecryptRequest); i { + switch v := v.(*EncryptResponse); i { case 0: return &v.state case 1: @@ -8031,7 +8094,7 @@ func file_dapr_proto_runtime_v1_dapr_proto_init() { } } file_dapr_proto_runtime_v1_dapr_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DecryptRequestOptions); i { + switch v := v.(*DecryptRequest); i { case 0: return &v.state case 1: @@ -8043,7 +8106,7 @@ func file_dapr_proto_runtime_v1_dapr_proto_init() { } } file_dapr_proto_runtime_v1_dapr_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DecryptResponse); i { + switch v := v.(*DecryptRequestOptions); i { case 0: return &v.state case 1: @@ -8055,7 +8118,7 @@ func file_dapr_proto_runtime_v1_dapr_proto_init() { } } file_dapr_proto_runtime_v1_dapr_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkflowRequest); i { + switch v := v.(*DecryptResponse); i { case 0: return &v.state case 1: @@ -8067,7 +8130,7 @@ func file_dapr_proto_runtime_v1_dapr_proto_init() { } } file_dapr_proto_runtime_v1_dapr_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkflowResponse); i { + switch v := v.(*GetWorkflowRequest); i { case 0: return &v.state case 1: @@ -8079,7 +8142,7 @@ func file_dapr_proto_runtime_v1_dapr_proto_init() { } } file_dapr_proto_runtime_v1_dapr_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StartWorkflowRequest); i { + switch v := v.(*GetWorkflowResponse); i { case 0: return &v.state case 1: @@ -8091,7 +8154,7 @@ func file_dapr_proto_runtime_v1_dapr_proto_init() { } } file_dapr_proto_runtime_v1_dapr_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StartWorkflowResponse); i { + switch v := v.(*StartWorkflowRequest); i { case 0: return &v.state case 1: @@ -8103,7 +8166,7 @@ func file_dapr_proto_runtime_v1_dapr_proto_init() { } } file_dapr_proto_runtime_v1_dapr_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TerminateWorkflowRequest); i { + switch v := v.(*StartWorkflowResponse); i { case 0: return &v.state case 1: @@ -8115,7 +8178,7 @@ func file_dapr_proto_runtime_v1_dapr_proto_init() { } } file_dapr_proto_runtime_v1_dapr_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PauseWorkflowRequest); i { + switch v := v.(*TerminateWorkflowRequest); i { case 0: return &v.state case 1: @@ -8127,7 +8190,7 @@ func file_dapr_proto_runtime_v1_dapr_proto_init() { } } file_dapr_proto_runtime_v1_dapr_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ResumeWorkflowRequest); i { + switch v := v.(*PauseWorkflowRequest); i { case 0: return &v.state case 1: @@ -8139,7 +8202,7 @@ func file_dapr_proto_runtime_v1_dapr_proto_init() { } } file_dapr_proto_runtime_v1_dapr_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RaiseEventWorkflowRequest); i { + switch v := v.(*ResumeWorkflowRequest); i { case 0: return &v.state case 1: @@ -8151,6 +8214,18 @@ func file_dapr_proto_runtime_v1_dapr_proto_init() { } } file_dapr_proto_runtime_v1_dapr_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RaiseEventWorkflowRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_dapr_proto_runtime_v1_dapr_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PurgeWorkflowRequest); i { case 0: return &v.state @@ -8169,7 +8244,7 @@ func file_dapr_proto_runtime_v1_dapr_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_dapr_proto_runtime_v1_dapr_proto_rawDesc, NumEnums: 2, - NumMessages: 111, + NumMessages: 112, NumExtensions: 0, NumServices: 1, }, diff --git a/pkg/runtime/runtime.go b/pkg/runtime/runtime.go index 97e0211cf0c..09fb7a87b65 100644 --- a/pkg/runtime/runtime.go +++ b/pkg/runtime/runtime.go @@ -1532,7 +1532,7 @@ func (a *DaprRuntime) startHTTPServer(port int, publicPort *int, profilePort int DirectMessaging: a.directMessaging, Resiliency: a.resiliency, PubsubAdapter: a.getPublishAdapter(), - Actor: a.actor, + Actors: a.actor, SendToOutputBindingFn: a.sendToOutputBinding, TracingSpec: a.globalConfig.Spec.TracingSpec, Shutdown: a.ShutdownWithWait, @@ -1625,7 +1625,7 @@ func (a *DaprRuntime) getGRPCAPI() grpc.API { Resiliency: a.resiliency, PubsubAdapter: a.getPublishAdapter(), DirectMessaging: a.directMessaging, - Actor: a.actor, + Actors: a.actor, SendToOutputBindingFn: a.sendToOutputBinding, TracingSpec: a.globalConfig.Spec.TracingSpec, AccessControlList: a.accessControlList, diff --git a/pkg/runtime/runtime_test.go b/pkg/runtime/runtime_test.go index a1e6698ce31..1e6496654bf 100644 --- a/pkg/runtime/runtime_test.go +++ b/pkg/runtime/runtime_test.go @@ -5955,12 +5955,12 @@ func TestGracefulShutdownActors(t *testing.T) { go sendSigterm(rt) <-time.After(rt.runtimeConfig.GracefulShutdownDuration + 3*time.Second) - var activeActCount int + var activeActCount int32 activeActors := rt.actor.GetActiveActorsCount(rt.ctx) for _, v := range activeActors { activeActCount += v.Count } - assert.Equal(t, activeActCount, 0) + assert.Equal(t, activeActCount, int32(0)) } func initMockStateStoreForRuntime(rt *DaprRuntime, encryptKey string, e error) *daprt.MockStateStore { diff --git a/tests/apps/actorapp/app.go b/tests/apps/actorapp/app.go index ab1a127f172..e66e58efba5 100644 --- a/tests/apps/actorapp/app.go +++ b/tests/apps/actorapp/app.go @@ -216,7 +216,7 @@ func epoch() int { } // appRouter initializes restful api router -func appRouter() *mux.Router { +func appRouter() http.Handler { router := mux.NewRouter().StrictSlash(true) // Log requests and their processing time diff --git a/tests/apps/actorclientapp/app.go b/tests/apps/actorclientapp/app.go index 1f6682f29d5..534aec83877 100644 --- a/tests/apps/actorclientapp/app.go +++ b/tests/apps/actorclientapp/app.go @@ -114,7 +114,7 @@ func httpCall(method string, url string, requestBody interface{}, expectedHTTPSt } // appRouter initializes restful api router -func appRouter() *mux.Router { +func appRouter() http.Handler { router := mux.NewRouter().StrictSlash(true) // Log requests and their processing time diff --git a/tests/apps/actorfeatures/app.go b/tests/apps/actorfeatures/app.go index 2dda686c3b9..805405fc38d 100644 --- a/tests/apps/actorfeatures/app.go +++ b/tests/apps/actorfeatures/app.go @@ -659,7 +659,7 @@ func epoch() int { } // appRouter initializes restful api router -func appRouter() *mux.Router { +func appRouter() http.Handler { router := mux.NewRouter().StrictSlash(true) // Log requests and their processing time diff --git a/tests/apps/actorinvocationapp/app.go b/tests/apps/actorinvocationapp/app.go index 15a22fc4ba4..d89aad3aa5e 100644 --- a/tests/apps/actorinvocationapp/app.go +++ b/tests/apps/actorinvocationapp/app.go @@ -163,7 +163,7 @@ func indexHandler(w http.ResponseWriter, r *http.Request) { } // appRouter initializes restful api router. -func appRouter() *mux.Router { +func appRouter() http.Handler { router := mux.NewRouter().StrictSlash(true) // Log requests and their processing time diff --git a/tests/apps/actorload/cmd/stateactor/service/server.go b/tests/apps/actorload/cmd/stateactor/service/server.go index 03b5476ffc8..0a255f83a00 100644 --- a/tests/apps/actorload/cmd/stateactor/service/server.go +++ b/tests/apps/actorload/cmd/stateactor/service/server.go @@ -28,7 +28,7 @@ import ( httpClient "github.com/dapr/dapr/tests/apps/actorload/pkg/actor/client/http" rt "github.com/dapr/dapr/tests/apps/actorload/pkg/actor/runtime" - "github.com/go-chi/chi" + "github.com/go-chi/chi/v5" ) type ActorActivationHandler func(actorType, actorID string) error diff --git a/tests/apps/actorload/go.mod b/tests/apps/actorload/go.mod index efb3833c66c..803fc8638e9 100644 --- a/tests/apps/actorload/go.mod +++ b/tests/apps/actorload/go.mod @@ -4,7 +4,7 @@ go 1.20 require ( fortio.org/fortio v1.6.8 - github.com/go-chi/chi v4.1.2+incompatible + github.com/go-chi/chi/v5 v5.0.8 github.com/google/uuid v1.2.0 go.opentelemetry.io/otel v1.7.0 go.opentelemetry.io/otel/exporters/prometheus v0.30.0 diff --git a/tests/apps/actorload/go.sum b/tests/apps/actorload/go.sum index c070810bbe9..99e986fe02f 100644 --- a/tests/apps/actorload/go.sum +++ b/tests/apps/actorload/go.sum @@ -63,8 +63,8 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/go-chi/chi v4.1.2+incompatible h1:fGFk2Gmi/YKXk0OmGfBh0WgmN3XB8lVnEyNz34tQRec= -github.com/go-chi/chi v4.1.2+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ= +github.com/go-chi/chi/v5 v5.0.8 h1:lD+NLqFcAi1ovnVZpsnObHGW4xb4J8lNmoYVfECH1Y0= +github.com/go-chi/chi/v5 v5.0.8/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= diff --git a/tests/apps/actorreentrancy/app.go b/tests/apps/actorreentrancy/app.go index cf1287fa15b..f78283ad03e 100644 --- a/tests/apps/actorreentrancy/app.go +++ b/tests/apps/actorreentrancy/app.go @@ -261,7 +261,7 @@ func advanceCallStackForNextRequest(req reentrantRequest) (actorCall, []byte) { } // appRouter initializes restful api router. -func appRouter() *mux.Router { +func appRouter() http.Handler { router := mux.NewRouter().StrictSlash(true) // Log requests and their processing time diff --git a/tests/apps/actorstate/app.go b/tests/apps/actorstate/app.go index caaa7932473..e1cc9cf917d 100644 --- a/tests/apps/actorstate/app.go +++ b/tests/apps/actorstate/app.go @@ -216,7 +216,7 @@ func httpCall(method string, url string, body io.ReadCloser) ([]byte, int, error } // appRouter initializes restful api router -func appRouter() *mux.Router { +func appRouter() http.Handler { router := mux.NewRouter().StrictSlash(true) // Log requests and their processing time diff --git a/tests/apps/binding_input/app.go b/tests/apps/binding_input/app.go index 6a8ca416b39..7402500d1d2 100644 --- a/tests/apps/binding_input/app.go +++ b/tests/apps/binding_input/app.go @@ -192,7 +192,7 @@ func testHandler(w http.ResponseWriter, r *http.Request) { } // appRouter initializes restful api router -func appRouter() *mux.Router { +func appRouter() http.Handler { router := mux.NewRouter().StrictSlash(true) // Log requests and their processing time diff --git a/tests/apps/binding_output/app.go b/tests/apps/binding_output/app.go index 996e825884a..b630bf94bbb 100644 --- a/tests/apps/binding_output/app.go +++ b/tests/apps/binding_output/app.go @@ -172,7 +172,7 @@ func getReceivedTopicsGRPC(w http.ResponseWriter, r *http.Request) { } // appRouter initializes restful api router -func appRouter() *mux.Router { +func appRouter() http.Handler { router := mux.NewRouter().StrictSlash(true) // Log requests and their processing time diff --git a/tests/apps/configurationapp/app.go b/tests/apps/configurationapp/app.go index 5bf0133221f..00b5c707fe2 100644 --- a/tests/apps/configurationapp/app.go +++ b/tests/apps/configurationapp/app.go @@ -471,7 +471,7 @@ func updateKeyValues(w http.ResponseWriter, r *http.Request) { } // appRouter initializes restful api router -func appRouter() *mux.Router { +func appRouter() http.Handler { router := mux.NewRouter().StrictSlash(true) // Log requests and their processing time diff --git a/tests/apps/healthapp/app.go b/tests/apps/healthapp/app.go index af1e296bd81..946cd5d27da 100644 --- a/tests/apps/healthapp/app.go +++ b/tests/apps/healthapp/app.go @@ -178,7 +178,7 @@ func startControlServer() { port, _ := strconv.Atoi(controlPort) log.Printf("Health App control server listening on http://:%d", port) - utils.StartServer(port, func() *mux.Router { + utils.StartServer(port, func() http.Handler { r := mux.NewRouter().StrictSlash(true) // Log requests and their processing time @@ -319,7 +319,7 @@ func startH2C() { log.Println("Server shut down") } -func httpRouter() *mux.Router { +func httpRouter() http.Handler { r := mux.NewRouter().StrictSlash(true) // Log requests and their processing time diff --git a/tests/apps/hellodapr/app.go b/tests/apps/hellodapr/app.go index 301bcb90b93..d3b023db119 100644 --- a/tests/apps/hellodapr/app.go +++ b/tests/apps/hellodapr/app.go @@ -119,7 +119,7 @@ func epoch() int { } // appRouter initializes restful api router -func appRouter() *mux.Router { +func appRouter() http.Handler { router := mux.NewRouter().StrictSlash(true) // Log requests and their processing time diff --git a/tests/apps/injectorapp/app.go b/tests/apps/injectorapp/app.go index 6aa5af36ab8..5f73b6cb47a 100644 --- a/tests/apps/injectorapp/app.go +++ b/tests/apps/injectorapp/app.go @@ -147,7 +147,7 @@ func epoch() int { } // appRouter initializes restful api router -func appRouter() *mux.Router { +func appRouter() http.Handler { router := mux.NewRouter().StrictSlash(true) // Log requests and their processing time @@ -161,7 +161,7 @@ func appRouter() *mux.Router { return router } -func securedAppRouter() *mux.Router { +func securedAppRouter() http.Handler { router := mux.NewRouter().StrictSlash(true) // Log requests and their processing time diff --git a/tests/apps/metadata/app.go b/tests/apps/metadata/app.go index 2ca67b86c3b..f0680a409ed 100644 --- a/tests/apps/metadata/app.go +++ b/tests/apps/metadata/app.go @@ -14,44 +14,50 @@ limitations under the License. package main import ( - "context" "encoding/json" + "errors" "fmt" "io" "log" "net/http" - "os" - "os/signal" - "syscall" + "strings" "time" - "github.com/dapr/dapr/pkg/actors" - "github.com/gorilla/mux" - "golang.org/x/net/http2" - "golang.org/x/net/http2/h2c" -) -const appPort = 3000 + "github.com/dapr/dapr/tests/apps/utils" +) -// kubernetes is the name of the secret store const ( + appPort = 3000 /* #nosec */ metadataURL = "http://localhost:3500/v1.0/metadata" ) +var httpClient = utils.NewHTTPClient() + // requestResponse represents a request or response for the APIs in this app. type requestResponse struct { - StartTime int `json:"start_time,omitempty"` - EndTime int `json:"end_time,omitempty"` - Message string `json:"message,omitempty"` + StartTime time.Time `json:"start_time,omitempty"` + EndTime time.Time `json:"end_time,omitempty"` + Message string `json:"message,omitempty"` +} + +type setMetadataRequest struct { + Key string `json:"key"` + Value string `json:"value"` } type mockMetadata struct { - ID string `json:"id"` - ActiveActorsCount []actors.ActiveActorsCount `json:"actors"` - Extended map[string]string `json:"extended"` - RegisteredComponents []mockRegisteredComponent `json:"components"` + ID string `json:"id"` + ActiveActorsCount []activeActorsCount `json:"actors"` + Extended map[string]string `json:"extended"` + RegisteredComponents []mockRegisteredComponent `json:"components"` +} + +type activeActorsCount struct { + Type string `json:"type"` + Count int `json:"count"` } type mockRegisteredComponent struct { @@ -66,9 +72,41 @@ func indexHandler(w http.ResponseWriter, _ *http.Request) { w.WriteHeader(http.StatusOK) } +func setMetadata(r *http.Request) error { + var data setMetadataRequest + err := json.NewDecoder(r.Body).Decode(&data) + if err != nil { + return err + } + + if data.Key == "" || data.Value == "" { + return errors.New("key or value in request must be set") + } + + req, err := http.NewRequestWithContext(r.Context(), http.MethodPut, + metadataURL+"/"+data.Key, + strings.NewReader(data.Value), + ) + if err != nil { + return err + } + req.Header.Set("content-type", "text/plain") + res, err := httpClient.Do(req) + if err != nil { + return err + } + defer res.Body.Close() + + if res.StatusCode != http.StatusNoContent { + return fmt.Errorf("invalid status code: %d", res.StatusCode) + } + + return nil +} + func getMetadata() (data mockMetadata, err error) { var metadata mockMetadata - res, err := http.Get(metadataURL) + res, err := httpClient.Get(metadataURL) if err != nil { return metadata, fmt.Errorf("could not get sidecar metadata %s", err.Error()) } @@ -97,10 +135,17 @@ func handler(w http.ResponseWriter, r *http.Request) { uri := r.URL.RequestURI() statusCode := http.StatusOK - res.StartTime = epoch() + res.StartTime = time.Now() cmd := mux.Vars(r)["command"] switch cmd { + case "setMetadata": + err = setMetadata(r) + if err != nil { + statusCode = http.StatusInternalServerError + res.Message = err.Error() + } + res.Message = "ok" case "getMetadata": metadata, err = getMetadata() if err != nil { @@ -113,64 +158,35 @@ func handler(w http.ResponseWriter, r *http.Request) { res.Message = err.Error() } - res.EndTime = epoch() + res.EndTime = time.Now() if statusCode != http.StatusOK { log.Printf("Error status code %v: %v", statusCode, res.Message) } w.Header().Set("Content-Type", "application/json") w.WriteHeader(statusCode) - json.NewEncoder(w).Encode(metadata) -} -// epoch returns the current unix epoch timestamp -func epoch() int { - return (int)(time.Now().UTC().UnixNano() / 1000000) + if res.Message == "" { + json.NewEncoder(w).Encode(metadata) + } else { + json.NewEncoder(w).Encode(res) + } } // appRouter initializes restful api router -func appRouter() *mux.Router { +func appRouter() http.Handler { router := mux.NewRouter().StrictSlash(true) + router.Use(utils.LoggerMiddleware) + router.HandleFunc("/", indexHandler).Methods("GET") - router.HandleFunc("/test/{command}", handler).Methods("GET") - router.Use(mux.CORSMethodMiddleware(router)) + router.HandleFunc("/test/{command}", handler) return router } -func startServer() { - // Create a server capable of supporting HTTP2 Cleartext connections - // Also supports HTTP1.1 and upgrades from HTTP1.1 to HTTP2 - h2s := &http2.Server{} - //nolint:gosec - server := &http.Server{ - Addr: fmt.Sprintf(":%d", appPort), - Handler: h2c.NewHandler(appRouter(), h2s), - } - - // Stop the server when we get a termination signal - stopCh := make(chan os.Signal, 1) - signal.Notify(stopCh, syscall.SIGKILL, syscall.SIGTERM, syscall.SIGINT) //nolint:staticcheck - go func() { - // Wait for cancelation signal - <-stopCh - log.Println("Shutdown signal received") - ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) - defer cancel() - server.Shutdown(ctx) - }() - - // Blocking call - err := server.ListenAndServe() - if err != http.ErrServerClosed { - log.Fatalf("Failed to run server: %v", err) - } - log.Println("Server shut down") -} - func main() { log.Printf("Metadata App - listening on http://localhost:%d", appPort) log.Printf("Metadata endpoint - to be served at %s", metadataURL) - startServer() + utils.StartServer(appPort, appRouter, true, false) } diff --git a/tests/apps/middleware/app.go b/tests/apps/middleware/app.go index c9b3566610e..c3caf5c3f2f 100644 --- a/tests/apps/middleware/app.go +++ b/tests/apps/middleware/app.go @@ -97,7 +97,7 @@ func logCall(w http.ResponseWriter, r *http.Request) { } // appRouter initializes restful api router. -func appRouter() *mux.Router { +func appRouter() http.Handler { router := mux.NewRouter().StrictSlash(true) // Log requests and their processing time diff --git a/tests/apps/perf/actorfeatures/app.go b/tests/apps/perf/actorfeatures/app.go index 8ca000b984e..92dff59ec1a 100644 --- a/tests/apps/perf/actorfeatures/app.go +++ b/tests/apps/perf/actorfeatures/app.go @@ -110,7 +110,7 @@ func healthzHandler(w http.ResponseWriter, r *http.Request) { } // appRouter initializes restful api router -func appRouter() *mux.Router { +func appRouter() http.Handler { router := mux.NewRouter().StrictSlash(true) router.HandleFunc("/", indexHandler).Methods("GET") diff --git a/tests/apps/pubsub-bulk-subscriber/app.go b/tests/apps/pubsub-bulk-subscriber/app.go index f094ed96098..1d6f65761eb 100644 --- a/tests/apps/pubsub-bulk-subscriber/app.go +++ b/tests/apps/pubsub-bulk-subscriber/app.go @@ -541,7 +541,7 @@ func initializeSets() { } // appRouter initializes restful api router -func appRouter() *mux.Router { +func appRouter() http.Handler { log.Printf("Called appRouter()") router := mux.NewRouter().StrictSlash(true) diff --git a/tests/apps/pubsub-publisher/app.go b/tests/apps/pubsub-publisher/app.go index d7f7d0476df..ba754c6413c 100644 --- a/tests/apps/pubsub-publisher/app.go +++ b/tests/apps/pubsub-publisher/app.go @@ -623,7 +623,7 @@ func formatDuration(d time.Duration) string { } // appRouter initializes restful api router -func appRouter() *mux.Router { +func appRouter() http.Handler { log.Printf("Enter appRouter()") router := mux.NewRouter().StrictSlash(true) diff --git a/tests/apps/pubsub-subscriber-routing/app.go b/tests/apps/pubsub-subscriber-routing/app.go index 0b98158f34e..fd8ef2fe019 100644 --- a/tests/apps/pubsub-subscriber-routing/app.go +++ b/tests/apps/pubsub-subscriber-routing/app.go @@ -277,7 +277,7 @@ func unique(slice []string) []string { } // appRouter initializes restful api router -func appRouter() *mux.Router { +func appRouter() http.Handler { log.Printf("Called appRouter()") router := mux.NewRouter().StrictSlash(true) diff --git a/tests/apps/pubsub-subscriber/app.go b/tests/apps/pubsub-subscriber/app.go index d132cd7d903..4c53b4448bb 100644 --- a/tests/apps/pubsub-subscriber/app.go +++ b/tests/apps/pubsub-subscriber/app.go @@ -449,7 +449,7 @@ func initializeSets() { } // appRouter initializes restful api router -func appRouter() *mux.Router { +func appRouter() http.Handler { log.Printf("Called appRouter()") router := mux.NewRouter().StrictSlash(true) diff --git a/tests/apps/resiliencyapp/app.go b/tests/apps/resiliencyapp/app.go index 026a8604bdf..98bd6b776c0 100644 --- a/tests/apps/resiliencyapp/app.go +++ b/tests/apps/resiliencyapp/app.go @@ -281,7 +281,7 @@ func resiliencyActorMethodHandler(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) } -func appRouter() *mux.Router { +func appRouter() http.Handler { router := mux.NewRouter().StrictSlash(true) // Log requests and their processing time diff --git a/tests/apps/runtime/app.go b/tests/apps/runtime/app.go index 5b23eb798cc..5c0c13aba8b 100644 --- a/tests/apps/runtime/app.go +++ b/tests/apps/runtime/app.go @@ -210,7 +210,7 @@ func getBindingsDaprAPIResponse(w http.ResponseWriter, r *http.Request) { } // appRouter initializes restful api router. -func appRouter() *mux.Router { +func appRouter() http.Handler { log.Printf("Enter appRouter()") router := mux.NewRouter().StrictSlash(true) diff --git a/tests/apps/secretapp/app.go b/tests/apps/secretapp/app.go index a7bcb51bd50..aa104a3cdf1 100644 --- a/tests/apps/secretapp/app.go +++ b/tests/apps/secretapp/app.go @@ -251,7 +251,7 @@ func epoch() int { } // appRouter initializes restful api router -func appRouter() *mux.Router { +func appRouter() http.Handler { router := mux.NewRouter().StrictSlash(true) // Log requests and their processing time diff --git a/tests/apps/service_invocation/app.go b/tests/apps/service_invocation/app.go index e3c7a327f6c..d4b7bc82404 100644 --- a/tests/apps/service_invocation/app.go +++ b/tests/apps/service_invocation/app.go @@ -347,7 +347,7 @@ func constructRequest(id, method, httpVerb string, body []byte) *runtimev1pb.Inv } // appRouter initializes restful api router -func appRouter() *mux.Router { +func appRouter() http.Handler { router := mux.NewRouter().StrictSlash(true) // Log requests and their processing time diff --git a/tests/apps/service_invocation_external/app.go b/tests/apps/service_invocation_external/app.go index fc97d4aeff1..8c2efdb1cdd 100644 --- a/tests/apps/service_invocation_external/app.go +++ b/tests/apps/service_invocation_external/app.go @@ -107,7 +107,7 @@ func main() { } // appRouter initializes restful api router -func appRouter() *mux.Router { +func appRouter() http.Handler { router := mux.NewRouter().StrictSlash(true) // Log requests and their processing time diff --git a/tests/apps/service_invocation_grpc_proxy_client/app.go b/tests/apps/service_invocation_grpc_proxy_client/app.go index 35876f47a4a..a5f60515b54 100644 --- a/tests/apps/service_invocation_grpc_proxy_client/app.go +++ b/tests/apps/service_invocation_grpc_proxy_client/app.go @@ -98,7 +98,7 @@ func run(w http.ResponseWriter, r *http.Request) { w.Write(b) } -func appRouter() *mux.Router { +func appRouter() http.Handler { router := mux.NewRouter().StrictSlash(true) // Log requests and their processing time diff --git a/tests/apps/stateapp/app.go b/tests/apps/stateapp/app.go index baf3e41d3c0..0142f71ab9c 100644 --- a/tests/apps/stateapp/app.go +++ b/tests/apps/stateapp/app.go @@ -789,7 +789,7 @@ func epoch() int { } // appRouter initializes restful api router -func appRouter() *mux.Router { +func appRouter() http.Handler { router := mux.NewRouter().StrictSlash(true) // Log requests and their processing time diff --git a/tests/apps/tracingapp/app.go b/tests/apps/tracingapp/app.go index cf719830022..bb110765480 100644 --- a/tests/apps/tracingapp/app.go +++ b/tests/apps/tracingapp/app.go @@ -234,7 +234,7 @@ func findUniqueValueFromJSONPath(jsonPath string, v interface{}) (string, error) } // appRouter initializes restful api router -func appRouter() *mux.Router { +func appRouter() http.Handler { router := mux.NewRouter().StrictSlash(true) // Log requests and their processing time diff --git a/tests/apps/utils/http-server.go b/tests/apps/utils/http-server.go index 7d9c4861c2b..821144da5be 100644 --- a/tests/apps/utils/http-server.go +++ b/tests/apps/utils/http-server.go @@ -24,7 +24,6 @@ import ( "syscall" "time" - "github.com/gorilla/mux" "golang.org/x/net/http2" "golang.org/x/net/http2/h2c" ) @@ -35,7 +34,7 @@ const ( ) // StartServer starts a HTTP or HTTP2 server -func StartServer(port int, appRouter func() *mux.Router, allowHTTP2 bool, enableTLS bool) { +func StartServer(port int, appRouter func() http.Handler, allowHTTP2 bool, enableTLS bool) { // HTTP/2 is allowed only if the DAPR_TESTS_HTTP2 env var is set allowHTTP2 = allowHTTP2 && IsTruthy(os.Getenv("DAPR_TESTS_HTTP2")) diff --git a/tests/apps/utils/logger-middleware.go b/tests/apps/utils/logger-middleware.go index 7b2e186b41a..88e1fa55a0f 100644 --- a/tests/apps/utils/logger-middleware.go +++ b/tests/apps/utils/logger-middleware.go @@ -41,7 +41,6 @@ func LoggerMiddleware(next http.Handler) http.Handler { // Process the request start := time.Now() next.ServeHTTP(w, r.WithContext(ctx)) - dur := time.Now().Sub(start) - log.Printf("Request %s: completed in %s", reqID, dur) + log.Printf("Request %s: completed in %s", reqID, time.Since(start)) }) } diff --git a/tests/e2e/actor_features/actor_features_test.go b/tests/e2e/actor_features/actor_features_test.go index 3104a9a62b9..b406df884bd 100644 --- a/tests/e2e/actor_features/actor_features_test.go +++ b/tests/e2e/actor_features/actor_features_test.go @@ -832,9 +832,7 @@ func TestActorFeatures(t *testing.T) { time.Sleep(secondsToCheckGetMetadata * time.Second) res, err = httpGet(fmt.Sprintf(actorMetadataURLFormat, externalURL)) - if err != nil { - log.Printf("failed to get metadata. Error='%v' Response='%s'", err, string(res)) - } + log.Printf("Got metadata: Error='%v' Response='%s'", err, string(res)) require.NoError(t, err, "failed to get metadata") var previousMetadata metadata @@ -857,9 +855,7 @@ func TestActorFeatures(t *testing.T) { time.Sleep(5 * time.Second) res, err = httpGet(fmt.Sprintf(actorMetadataURLFormat, externalURL)) - if err != nil { - log.Printf("failed to get metadata. Error='%v' Response='%s'", err, string(res)) - } + log.Printf("Got metadata: Error='%v' Response='%s'", err, string(res)) require.NoError(t, err, "failed to get metadata") var currentMetadata metadata diff --git a/tests/e2e/metadata/metadata_test.go b/tests/e2e/metadata/metadata_test.go index 3d368dac2c6..77819c00204 100644 --- a/tests/e2e/metadata/metadata_test.go +++ b/tests/e2e/metadata/metadata_test.go @@ -25,7 +25,6 @@ import ( "github.com/stretchr/testify/require" - "github.com/dapr/dapr/pkg/actors" "github.com/dapr/dapr/tests/e2e/utils" kube "github.com/dapr/dapr/tests/platforms/kubernetes" "github.com/dapr/dapr/tests/runner" @@ -40,10 +39,15 @@ const ( ) type mockMetadata struct { - ID string `json:"id"` - ActiveActorsCount []actors.ActiveActorsCount `json:"actors"` - Extended map[string]string `json:"extended"` - RegisteredComponents []mockRegisteredComponent `json:"components"` + ID string `json:"id"` + ActiveActorsCount []activeActorsCount `json:"actors"` + Extended map[string]string `json:"extended"` + RegisteredComponents []mockRegisteredComponent `json:"components"` +} + +type activeActorsCount struct { + Type string `json:"type"` + Count int `json:"count"` } type mockRegisteredComponent struct { @@ -53,6 +57,14 @@ type mockRegisteredComponent struct { Capabilities []string `json:"capabilities"` } +func testSetMetadata(t *testing.T, metadataAppExternalURL string) { + t.Log("Setting sidecar metadata") + url := fmt.Sprintf("%s/test/setMetadata", metadataAppExternalURL) + resp, err := utils.HTTPPost(url, []byte(`{"key":"newkey","value":"newvalue"}`)) + require.NoError(t, err) + require.NotEmpty(t, resp, "response must not be empty!") +} + func testGetMetadata(t *testing.T, metadataAppExternalURL string) { t.Log("Getting sidecar metadata") url := fmt.Sprintf("%s/test/getMetadata", metadataAppExternalURL) @@ -63,10 +75,13 @@ func testGetMetadata(t *testing.T, metadataAppExternalURL string) { err = json.Unmarshal(resp, &metadata) require.NoError(t, err) for _, comp := range metadata.RegisteredComponents { - require.NotEmpty(t, comp.Name, "component name must not be empty!") - require.NotEmpty(t, comp.Type, "component type must not be empty!") + require.NotEmpty(t, comp.Name, "component name must not be empty") + require.NotEmpty(t, comp.Type, "component type must not be empty") require.True(t, len(comp.Capabilities) >= 0, "component capabilities key must be present!") } + require.NotEmpty(t, metadata.Extended) + require.NotEmpty(t, metadata.Extended["daprRuntimeVersion"]) + require.Equal(t, "newvalue", metadata.Extended["newkey"]) } func TestMain(m *testing.M) { @@ -92,7 +107,7 @@ func TestMain(m *testing.M) { os.Exit(tr.Start(m)) } -func TestMetadataapp(t *testing.T) { +func TestMetadata(t *testing.T) { t.Log("Enter TestMetadataHTTP") metadataAppExternalURL := tr.Platform.AcquireAppExternalURL(appName) require.NotEmpty(t, metadataAppExternalURL, "metadataAppExternalURL must not be empty!") @@ -101,5 +116,7 @@ func TestMetadataapp(t *testing.T) { // making this test less flaky due to delays in the deployment. _, err := utils.HTTPGetNTimes(metadataAppExternalURL, numHealthChecks) require.NoError(t, err) + + testSetMetadata(t, metadataAppExternalURL) testGetMetadata(t, metadataAppExternalURL) } diff --git a/tests/e2e/pubsub/pubsub_test.go b/tests/e2e/pubsub/pubsub_test.go index ce34291ce87..067de815f8a 100644 --- a/tests/e2e/pubsub/pubsub_test.go +++ b/tests/e2e/pubsub/pubsub_test.go @@ -313,13 +313,14 @@ func testPublish(t *testing.T, publisherExternalURL string, protocol string) rec func postSingleMessage(url string, data []byte) (int, error) { // HTTPPostWithStatus by default sends with content-type application/json start := time.Now() - _, statusCode, err := utils.HTTPPostWithStatus(url, data) + body, statusCode, err := utils.HTTPPostWithStatus(url, data) if err != nil { - log.Printf("Publish failed with error=%s (body=%s) (duration=%s)", err.Error(), data, utils.FormatDuration(time.Now().Sub(start))) + log.Printf("Publish failed with error=%s (response=%s) (request=%s) (duration=%s)", err.Error(), string(body), string(data), utils.FormatDuration(time.Since(start))) return http.StatusInternalServerError, err } if (statusCode != http.StatusOK) && (statusCode != http.StatusNoContent) { - err = fmt.Errorf("publish failed with StatusCode=%d (body=%s) (duration=%s)", statusCode, data, utils.FormatDuration(time.Now().Sub(start))) + log.Printf("publish failed with StatusCode=%d (response=%s) (request=%s) (duration=%s)", statusCode, string(body), string(data), utils.FormatDuration(time.Since(start))) + err = fmt.Errorf("publish failed with StatusCode=%d (response=%s) (request=%s) (duration=%s)", statusCode, string(body), string(data), utils.FormatDuration(time.Since(start))) } return statusCode, err } @@ -328,7 +329,7 @@ func testBulkPublishSuccessfully(t *testing.T, publisherExternalURL, subscriberE // set to respond with success setDesiredResponse(t, subscriberAppName, "success", publisherExternalURL, protocol) - log.Printf("Test bulkPublish and normal subscribe success flow\n") + log.Printf("Test bulkPublish and normal subscribe success flow") sentMessages := testPublishBulk(t, publisherExternalURL, protocol) time.Sleep(5 * time.Second) @@ -340,7 +341,7 @@ func testPublishSubscribeSuccessfully(t *testing.T, publisherExternalURL, subscr // set to respond with success setDesiredResponse(t, subscriberAppName, "success", publisherExternalURL, protocol) - log.Printf("Test publish subscribe success flow\n") + log.Print("Test publish subscribe success flow") sentMessages := testPublish(t, publisherExternalURL, protocol) time.Sleep(5 * time.Second) @@ -349,7 +350,7 @@ func testPublishSubscribeSuccessfully(t *testing.T, publisherExternalURL, subscr } func testPublishWithoutTopic(t *testing.T, publisherExternalURL, subscriberExternalURL, _, _, protocol string) string { - log.Printf("Test publish without topic\n") + log.Print("Test publish without topic") commandBody := publishCommand{ ReqID: "c-" + uuid.New().String(), Protocol: protocol, From 89a93c9516da56e03b74316ecfcf95ae4c23f488 Mon Sep 17 00:00:00 2001 From: "Alessandro (Ale) Segala" <43508+ItalyPaleAle@users.noreply.github.com> Date: Thu, 18 May 2023 16:37:40 -0700 Subject: [PATCH 6/6] State store: make BulkSet/BulkDelete not transactional (#6342) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Updated interfaces Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> * Add bulk routines for state stores Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> * Support passing BulkStoreOpts Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> * Updated gRPC APIs Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> * ๐Ÿ’„ Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> * Updated HTTP APIs Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> * Added replacement to go.mod Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> * Updated BulkSet in runtime too Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> * Updated pinned contrib Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> * Updated test app Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> * ๐Ÿ’„ Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> * Working on etag test Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> * More tests Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> * Completed E2E test for HTTP API Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> * Bulk*WithOptions->Bulk* Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> * Added E2E tests for gRPC Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> * Simplified code Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> * Enabled E2E test Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> * BulkStoreError contains key and not sequence Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> * Updated pinned contrib Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> * Pin contrib v1.11.0-rc.4 Signed-off-by: Bernd Verst * ๐Ÿ’„ Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> * Fixed SDK test workflow Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> * Removed unnecessary go.od Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> * Fixed SDK workflow Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> * Fix lint. Signed-off-by: Artur Souza --------- Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> Signed-off-by: Bernd Verst Signed-off-by: Artur Souza Co-authored-by: Yaron Schneider Co-authored-by: Bernd Verst Co-authored-by: Artur Souza --- .github/workflows/dapr-test-sdk.yml | 2 +- dapr/proto/components/v1/state.proto | 10 + go.mod | 81 ++- go.sum | 122 ++-- pkg/components/state/bulk.go | 146 +++++ pkg/components/state/bulk_test.go | 326 ++++++++++ pkg/components/state/pluggable.go | 10 +- pkg/components/state/pluggable_test.go | 12 +- pkg/grpc/api.go | 96 ++- pkg/grpc/api_test.go | 433 ++++++++++--- pkg/grpc/universalapi/api_state_query.go | 4 +- pkg/http/api.go | 37 +- pkg/http/api_test.go | 65 +- pkg/messages/predefined.go | 7 +- pkg/proto/components/v1/state.pb.go | 587 +++++++++++------- pkg/runtime/pubsub/bulkpublish_resiliency.go | 18 +- pkg/runtime/runtime.go | 14 +- pkg/testing/fake_state_store.go | 4 +- pkg/testing/state_mock.go | 10 +- tests/apps/perf/configuration/app.go | 6 +- tests/apps/perf/configuration/go.mod | 22 - tests/apps/perf/configuration/go.sum | 34 - tests/apps/resiliencyapp/go.mod | 4 +- tests/apps/resiliencyapp/go.sum | 8 +- tests/apps/resiliencyapp_grpc/go.mod | 4 +- tests/apps/resiliencyapp_grpc/go.sum | 8 +- tests/apps/secretapp/app.go | 2 +- .../go.mod | 4 +- .../go.sum | 8 +- tests/apps/stateapp/app.go | 568 +++++++++++++++-- tests/e2e/stateapp/stateapp_test.go | 47 +- tests/e2e/utils/helpers.go | 4 +- 32 files changed, 2019 insertions(+), 684 deletions(-) create mode 100644 pkg/components/state/bulk.go create mode 100644 pkg/components/state/bulk_test.go delete mode 100644 tests/apps/perf/configuration/go.mod delete mode 100644 tests/apps/perf/configuration/go.sum diff --git a/.github/workflows/dapr-test-sdk.yml b/.github/workflows/dapr-test-sdk.yml index 03f143e968a..e9a0b8cc597 100644 --- a/.github/workflows/dapr-test-sdk.yml +++ b/.github/workflows/dapr-test-sdk.yml @@ -103,7 +103,7 @@ jobs: uses: actions/setup-go@v4 with: go-version-file: "go.mod" - - name: Checkout p repo to run tests. + - name: Checkout python-sdk repo to run tests. uses: actions/checkout@v3 with: repository: dapr/python-sdk diff --git a/dapr/proto/components/v1/state.proto b/dapr/proto/components/v1/state.proto index 232d42dc281..ffedd990c29 100644 --- a/dapr/proto/components/v1/state.proto +++ b/dapr/proto/components/v1/state.proto @@ -236,8 +236,13 @@ message SetRequest { // reserved for future-proof extensibility message SetResponse {} +message BulkDeleteRequestOptions { + int64 parallelism = 1; +} + message BulkDeleteRequest { repeated DeleteRequest items = 1; + BulkDeleteRequestOptions options = 2; } // reserved for future-proof extensibility @@ -271,8 +276,13 @@ message BulkGetResponse { repeated BulkStateItem items = 1; } +message BulkSetRequestOptions { + int64 parallelism = 1; +} + message BulkSetRequest { repeated SetRequest items = 1; + BulkSetRequestOptions options = 2; } // reserved for future-proof extensibility diff --git a/go.mod b/go.mod index 43ed2e56503..4cf993c4cdb 100644 --- a/go.mod +++ b/go.mod @@ -9,8 +9,8 @@ require ( github.com/PuerkitoBio/purell v1.2.0 github.com/argoproj/argo-rollouts v1.4.1 github.com/cenkalti/backoff/v4 v4.2.1 - github.com/dapr/components-contrib v1.11.0-rc.1 - github.com/dapr/kit v0.0.5-0.20230418193628-15a7040dec41 + github.com/dapr/components-contrib v1.11.0-rc.4 + github.com/dapr/kit v0.0.5 github.com/evanphx/json-patch/v5 v5.6.0 github.com/fasthttp/router v1.4.18 github.com/go-logr/logr v1.2.4 @@ -39,12 +39,12 @@ require ( github.com/prometheus/client_golang v1.14.0 github.com/prometheus/client_model v0.3.0 github.com/prometheus/common v0.42.0 - github.com/redis/go-redis/v9 v9.0.3 + github.com/redis/go-redis/v9 v9.0.4 github.com/sony/gobreaker v0.5.0 - github.com/spf13/cast v1.5.0 + github.com/spf13/cast v1.5.1 github.com/stretchr/testify v1.8.2 github.com/tidwall/transform v0.0.0-20201103190739-32f242e2dbde - github.com/valyala/fasthttp v1.45.0 + github.com/valyala/fasthttp v1.47.0 go.opencensus.io v0.24.0 go.opentelemetry.io/otel v1.14.0 go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.14.0 @@ -55,9 +55,9 @@ require ( go.opentelemetry.io/otel/trace v1.14.0 go.uber.org/automaxprocs v1.5.2 go.uber.org/ratelimit v0.2.0 - golang.org/x/exp v0.0.0-20230419192730-864b3d6c5c2c - golang.org/x/net v0.9.0 - golang.org/x/sync v0.1.0 + golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc + golang.org/x/net v0.10.0 + golang.org/x/sync v0.2.0 google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 google.golang.org/grpc v1.54.0 google.golang.org/protobuf v1.30.0 @@ -75,21 +75,6 @@ require ( sigs.k8s.io/yaml v1.3.0 ) -require ( - github.com/apache/thrift v0.13.0 // indirect - github.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f // indirect - github.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762 // indirect - github.com/choleraehyq/pid v0.0.16 // indirect - github.com/cloudwego/fastpb v0.0.4-0.20230131074846-6fc453d58b96 // indirect - github.com/cloudwego/frugal v0.1.6 // indirect - github.com/cloudwego/kitex v0.5.0 // indirect - github.com/cloudwego/netpoll v0.3.2 // indirect - github.com/cloudwego/thriftgo v0.2.8 // indirect - github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 // indirect - github.com/oleiade/lane v1.0.1 // indirect - golang.org/x/arch v0.2.0 // indirect -) - require ( cloud.google.com/go v0.110.0 // indirect cloud.google.com/go/compute v1.19.0 // indirect @@ -104,22 +89,22 @@ require ( github.com/99designs/keyring v1.2.1 // indirect github.com/AthenZ/athenz v1.10.39 // indirect github.com/Azure/azure-sdk-for-go v68.0.0+incompatible // indirect - github.com/Azure/azure-sdk-for-go/sdk/azcore v1.5.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0-beta.5 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azcore v1.6.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/data/azappconfig v0.5.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/data/azcosmos v0.3.5-0.20230428192423-86627ae445bc // indirect + github.com/Azure/azure-sdk-for-go/sdk/data/azcosmos v0.3.5 // indirect github.com/Azure/azure-sdk-for-go/sdk/data/aztables v1.0.1 // indirect github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/messaging/azeventhubs v0.5.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/messaging/azservicebus v1.2.1 // indirect - github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/eventgrid/armeventgrid/v2 v2.0.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/eventhub/armeventhub v1.0.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/messaging/azeventhubs v1.0.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/messaging/azservicebus v1.3.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/eventgrid/armeventgrid/v2 v2.1.1 // indirect + github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/eventhub/armeventhub v1.1.1 // indirect github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v0.11.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azsecrets v0.13.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v0.8.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.0.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/storage/azqueue v0.1.0 // indirect - github.com/Azure/go-amqp v0.18.1 // indirect + github.com/Azure/azure-sdk-for-go/sdk/storage/azqueue v1.0.0 // indirect + github.com/Azure/go-amqp v1.0.0 // indirect github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0 // indirect github.com/DataDog/zstd v1.5.2 // indirect github.com/OneOfOne/xxhash v1.2.8 // indirect @@ -151,25 +136,34 @@ require ( github.com/apache/dubbo-go-hessian2 v1.11.5 // indirect github.com/apache/pulsar-client-go v0.9.0 // indirect github.com/apache/rocketmq-client-go/v2 v2.1.2-0.20230412142645-25003f6f083d // indirect + github.com/apache/thrift v0.13.0 // indirect github.com/ardielle/ardielle-go v1.5.2 // indirect github.com/armon/go-metrics v0.4.1 // indirect github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496 // indirect github.com/aws/aws-sdk-go v1.44.214 // indirect github.com/awslabs/kinesis-aggregation/go v0.0.0-20210630091500-54e17340d32f // indirect github.com/aymerick/douceur v0.2.0 // indirect - github.com/benbjohnson/clock v1.3.0 // indirect + github.com/benbjohnson/clock v1.3.4 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bits-and-blooms/bitset v1.2.0 // indirect github.com/boltdb/bolt v1.3.1 // indirect github.com/bradfitz/gomemcache v0.0.0-20230124162541-5f7a7d875746 // indirect github.com/bufbuild/protocompile v0.4.0 // indirect + github.com/bytedance/gopkg v0.0.0-20220817015305-b879a72dc90f // indirect github.com/camunda/zeebe/clients/go/v8 v8.1.8 // indirect github.com/cenkalti/backoff v2.2.1+incompatible // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/chebyrash/promise v0.0.0-20220530143319-1123826567d6 // indirect + github.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762 // indirect + github.com/choleraehyq/pid v0.0.16 // indirect github.com/clbanning/mxj/v2 v2.5.6 // indirect github.com/cloudevents/sdk-go/binding/format/protobuf/v2 v2.13.0 // indirect github.com/cloudevents/sdk-go/v2 v2.13.0 // indirect + github.com/cloudwego/fastpb v0.0.4-0.20230131074846-6fc453d58b96 // indirect + github.com/cloudwego/frugal v0.1.6 // indirect + github.com/cloudwego/kitex v0.5.0 // indirect + github.com/cloudwego/netpoll v0.3.2 // indirect + github.com/cloudwego/thriftgo v0.2.8 // indirect github.com/coreos/go-semver v0.3.0 // indirect github.com/coreos/go-systemd/v22 v22.3.3-0.20220203105225-a9a7ef127534 // indirect github.com/creasty/defaults v1.5.2 // indirect @@ -212,7 +206,7 @@ require ( github.com/go-playground/validator/v10 v10.11.0 // indirect github.com/go-redis/redis/v8 v8.11.5 // indirect github.com/go-resty/resty/v2 v2.7.0 // indirect - github.com/go-sql-driver/mysql v1.7.0 // indirect + github.com/go-sql-driver/mysql v1.7.1 // indirect github.com/go-zookeeper/zk v1.0.3 // indirect github.com/gobwas/glob v0.2.3 // indirect github.com/goccy/go-json v0.10.2 // indirect @@ -230,6 +224,7 @@ require ( github.com/google/flatbuffers v2.0.8+incompatible // indirect github.com/google/gnostic v0.6.9 // indirect github.com/google/gofuzz v1.2.0 // indirect + github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect github.com/googleapis/gax-go/v2 v2.8.0 // indirect @@ -315,6 +310,7 @@ require ( github.com/nats-io/nkeys v0.3.0 // indirect github.com/nats-io/nuid v1.0.1 // indirect github.com/nats-io/stan.go v0.10.4 // indirect + github.com/oleiade/lane v1.0.1 // indirect github.com/open-policy-agent/opa v0.49.2 // indirect github.com/opentracing/opentracing-go v1.2.0 // indirect github.com/openzipkin/zipkin-go v0.4.1 // indirect @@ -338,7 +334,7 @@ require ( github.com/sendgrid/rest v2.6.9+incompatible // indirect github.com/sendgrid/sendgrid-go v3.12.0+incompatible // indirect github.com/shirou/gopsutil/v3 v3.22.2 // indirect - github.com/sijms/go-ora/v2 v2.6.11 // indirect + github.com/sijms/go-ora/v2 v2.7.6 // indirect github.com/sirupsen/logrus v1.9.0 // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect github.com/spf13/cobra v1.6.1 // indirect @@ -379,14 +375,15 @@ require ( go.uber.org/atomic v1.10.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.24.0 // indirect - golang.org/x/crypto v0.8.0 // indirect + golang.org/x/arch v0.3.0 // indirect + golang.org/x/crypto v0.9.0 // indirect golang.org/x/mod v0.10.0 // indirect - golang.org/x/oauth2 v0.7.0 // indirect - golang.org/x/sys v0.7.0 // indirect - golang.org/x/term v0.7.0 // indirect + golang.org/x/oauth2 v0.8.0 // indirect + golang.org/x/sys v0.8.0 // indirect + golang.org/x/term v0.8.0 // indirect golang.org/x/text v0.9.0 // indirect golang.org/x/time v0.3.0 // indirect - golang.org/x/tools v0.7.0 // indirect + golang.org/x/tools v0.9.1 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect google.golang.org/api v0.115.0 // indirect @@ -410,11 +407,11 @@ require ( lukechampine.com/uint128 v1.3.0 // indirect modernc.org/cc/v3 v3.40.0 // indirect modernc.org/ccgo/v3 v3.16.13 // indirect - modernc.org/libc v1.22.3 // indirect + modernc.org/libc v1.22.6 // indirect modernc.org/mathutil v1.5.0 // indirect modernc.org/memory v1.5.0 // indirect modernc.org/opt v0.1.3 // indirect - modernc.org/sqlite v1.21.1 // indirect + modernc.org/sqlite v1.22.1 // indirect modernc.org/strutil v1.1.3 // indirect modernc.org/token v1.1.0 // indirect sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect diff --git a/go.sum b/go.sum index 3636ef1fc4d..b9c80963467 100644 --- a/go.sum +++ b/go.sum @@ -74,28 +74,30 @@ github.com/Azure/azure-sdk-for-go v68.0.0+incompatible h1:fcYLmCpyNYRnvJbPerq7U0 github.com/Azure/azure-sdk-for-go v68.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.0.0/go.mod h1:uGG2W01BaETf0Ozp+QxxKJdMBNRWPdstHG0Fmdwn1/U= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.1.2/go.mod h1:uGG2W01BaETf0Ozp+QxxKJdMBNRWPdstHG0Fmdwn1/U= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.5.0 h1:xGLAFFd9D3iLGxYiUGPdITSzsFmU1K8VtfuUHWAoN7M= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.5.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.6.0 h1:8kDqDngH+DmVBiCtIjCFTGa7MBnsIOkF9IccInFEbjk= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.6.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.2.1/go.mod h1:gLa1CL2RNE4s7M3yopJ/p0iq5DdY6Yv5ZUt9MTRZOQM= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0-beta.5 h1:F8ii3ek6K2tnf9gmv/YFktyOci9DuJboh/rKXMS2FaQ= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0-beta.5/go.mod h1:ZJteiLBLt8CmYc6yJFe5YErRHQ4FpTEwgXomR1ikcy8= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0 h1:vcYCAze6p19qBW7MhZybIsqD8sMV8js0NyQM8JDnVtg= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0/go.mod h1:OQeznEEkTZ9OrhHJoDD8ZDq51FHgXjqtP9z6bEwBq9U= github.com/Azure/azure-sdk-for-go/sdk/data/azappconfig v0.5.0 h1:OrKZybbyagpgJiREiIVzH5mV/z9oS4rXqdX7i31DSF0= github.com/Azure/azure-sdk-for-go/sdk/data/azappconfig v0.5.0/go.mod h1:p74+tP95m8830ypJk53L93+BEsjTKY4SKQ75J2NmS5U= -github.com/Azure/azure-sdk-for-go/sdk/data/azcosmos v0.3.5-0.20230428192423-86627ae445bc h1:DKHf95u7GvzAM8D+n+/R3saFpnA5ldUwMmen+eI9acQ= -github.com/Azure/azure-sdk-for-go/sdk/data/azcosmos v0.3.5-0.20230428192423-86627ae445bc/go.mod h1:Beh5cHIXJ0oWEDWk9lNFtuklCojLLQ5hl+LqSNTTs0I= +github.com/Azure/azure-sdk-for-go/sdk/data/azcosmos v0.3.5 h1:qS0Bp4do0cIvnuQgSGeO6ZCu/q/HlRKl4NPfv1eJ2p0= +github.com/Azure/azure-sdk-for-go/sdk/data/azcosmos v0.3.5/go.mod h1:Beh5cHIXJ0oWEDWk9lNFtuklCojLLQ5hl+LqSNTTs0I= github.com/Azure/azure-sdk-for-go/sdk/data/aztables v1.0.1 h1:bFa9IcjvrCber6gGgDAUZ+I2bO8J7s8JxXmu9fhi2ss= github.com/Azure/azure-sdk-for-go/sdk/data/aztables v1.0.1/go.mod h1:l3wvZkG9oW07GLBW5Cd0WwG5asOfJ8aqE8raUvNzLpk= github.com/Azure/azure-sdk-for-go/sdk/internal v1.0.0/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w= github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 h1:sXr+ck84g/ZlZUOZiNELInmMgOsuGwdjjVkEIde0OtY= github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= -github.com/Azure/azure-sdk-for-go/sdk/messaging/azeventhubs v0.5.0 h1:v4v4ccQInOrQ1dT6Z1jhmSfv/Vo+Gj6TiH4agar4+9c= -github.com/Azure/azure-sdk-for-go/sdk/messaging/azeventhubs v0.5.0/go.mod h1:N1KaFfTg2o6ltJ2djIz5oOFE9tgHOHqQR+dIOiAdyUc= -github.com/Azure/azure-sdk-for-go/sdk/messaging/azservicebus v1.2.1 h1:ryVRjO3SrGrSM8PNlLuMbMYFz9vexPzvenNUEBfsgCo= -github.com/Azure/azure-sdk-for-go/sdk/messaging/azservicebus v1.2.1/go.mod h1:R6+0udeRV8iYSTVuT5RT7If4sc46K5Bz3ZKrmvZQF7U= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/eventgrid/armeventgrid/v2 v2.0.0 h1:PcP4TC+0dC85A3i1p7CbD0FyrjnTvzQ3ipgSkJTIb7Y= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/eventgrid/armeventgrid/v2 v2.0.0/go.mod h1:rUn3oBeYkTxIsUzKxtXUPOt1ZO+bVHuZ3m5wauIfUHw= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/eventhub/armeventhub v1.0.0 h1:BWeAAEzkCnL0ABVJqs+4mYudNch7oFGPtTlSmIWL8ms= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/eventhub/armeventhub v1.0.0/go.mod h1:Y3gnVwfaz8h6L1YHar+NfWORtBoVUSB5h4GlGkdeF7Q= +github.com/Azure/azure-sdk-for-go/sdk/messaging/azeventhubs v1.0.0 h1:IQPFvZDfowjuv77a987bsErW+RjE1YbR3mpcYD5K2to= +github.com/Azure/azure-sdk-for-go/sdk/messaging/azeventhubs v1.0.0/go.mod h1:fswVBSaYFoW4XXp3oXG0vuDVdToLr3kRzgp5oePMq5g= +github.com/Azure/azure-sdk-for-go/sdk/messaging/azservicebus v1.3.0 h1:eLqmA+3GXbOOLJVTSqkrFudTbHkfOp5HIy+iShCNM7A= +github.com/Azure/azure-sdk-for-go/sdk/messaging/azservicebus v1.3.0/go.mod h1:pXDkeh10bAqElvd+S5Ppncj+DCKvJGXNa8rRT2R7rIw= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/eventgrid/armeventgrid/v2 v2.1.1 h1:q8d6Cw16DrwJ+o82GMEQ+xt65q7w4m7VcI4C+gK/7Jk= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/eventgrid/armeventgrid/v2 v2.1.1/go.mod h1:ZHJdpjiGjZBBILAyAUTP93YSLF/Foo1J72HSx30gMeQ= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/eventhub/armeventhub v1.1.1 h1:gZ1ZZvrVUhDNsGNpbo2N87Y0CJB8p3IS5UH9Z4Ui97g= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/eventhub/armeventhub v1.1.1/go.mod h1:7fQVOnRA11ScLE8dOCWanXHQa2NMFOM2i0u/1VRICXA= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal v1.1.2 h1:mLY+pNLjCUeKhgnAJWAKhEUQM+RJQo2H1fuGSw1Ky1E= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.0.0 h1:ECsQtyERDVz3NP3kvDOTLvbQhqWp/x9EsGKtb4ogUr8= github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v0.11.0 h1:efdSCWUBtk2FUUIlEfZhRQyVIM3Ts8lA3vaF18amnwo= github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v0.11.0/go.mod h1:LLJYu/UhJ8GpH5PtJc06RmJ1gJ5mPCSc1PiDMW17MHM= github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azsecrets v0.13.0 h1:XY0plaTx8oeipK+XogAck2Qzv39KdnJNBwrxC4A0GL4= @@ -104,10 +106,10 @@ github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v0.8.0 h1:T028g github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v0.8.0/go.mod h1:cw4zVQgBby0Z5f2v0itn6se2dDP17nTjbZFXW5uPyHA= github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.0.0 h1:u/LLAOFgsMv7HmNL4Qufg58y+qElGOt5qv0z1mURkRY= github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.0.0/go.mod h1:2e8rMJtl2+2j+HXbTBwnyGpm5Nou7KhvSfxOq8JpTag= -github.com/Azure/azure-sdk-for-go/sdk/storage/azqueue v0.1.0 h1:TOtQFiO403wClfrZId/EKvlKOfUhL0mWgvWgZ0FNn8I= -github.com/Azure/azure-sdk-for-go/sdk/storage/azqueue v0.1.0/go.mod h1:U0IH4deB/maBcagR9SiNeIfgZ1BY/zYCq8SOiQ4vfRc= -github.com/Azure/go-amqp v0.18.1 h1:D5Ca+uijuTcj5g76sF+zT4OQZcFFY397+IGf/5Ip5Sc= -github.com/Azure/go-amqp v0.18.1/go.mod h1:+bg0x3ce5+Q3ahCEXnCsGG3ETpDQe3MEVnOuT2ywPwc= +github.com/Azure/azure-sdk-for-go/sdk/storage/azqueue v1.0.0 h1:lJwNFV+xYjHREUTHJKx/ZF6CJSt9znxmLw9DqSTvyRU= +github.com/Azure/azure-sdk-for-go/sdk/storage/azqueue v1.0.0/go.mod h1:GfT0aGew8Qj5yiQVqOO5v7N8fanbJGyUoHqXg56qcVY= +github.com/Azure/go-amqp v1.0.0 h1:QfCugi1M+4F2JDTRgVnRw7PYXLXZ9hmqk3+9+oJh3OA= +github.com/Azure/go-amqp v1.0.0/go.mod h1:+bg0x3ce5+Q3ahCEXnCsGG3ETpDQe3MEVnOuT2ywPwc= github.com/AzureAD/microsoft-authentication-library-for-go v0.8.1/go.mod h1:4qFor3D/HDsvBME35Xy9rwW9DecL+M2sNw1ybjPtwA0= github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0 h1:OBhqkivkhkMqLPymWEppkm7vgPQY2XsHoEkaMQ0AdZY= github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0/go.mod h1:kgDmCTgBzIEPFElEF+FK0SdjAor06dRq2Go927dnQ6o= @@ -270,8 +272,8 @@ github.com/awslabs/kinesis-aggregation/go v0.0.0-20210630091500-54e17340d32f/go. github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= -github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/benbjohnson/clock v1.3.4 h1:wj3BFPrTw8yYgA1OlMqvUk95nc8OMv3cvBSF5erT2W4= +github.com/benbjohnson/clock v1.3.4/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -399,10 +401,10 @@ github.com/dancannon/gorethink v4.0.0+incompatible h1:KFV7Gha3AuqT+gr0B/eKvGhbjm github.com/dancannon/gorethink v4.0.0+incompatible/go.mod h1:BLvkat9KmZc1efyYwhz3WnybhRZtgF1K929FD8z1avU= github.com/danieljoos/wincred v1.1.2 h1:QLdCxFs1/Yl4zduvBdcHB8goaYk9RARS2SgLLRuAyr0= github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnGqR5Vl2tAx0= -github.com/dapr/components-contrib v1.11.0-rc.1 h1:hvezI22Vn2YWUpV2qjCc9GAIhUdxnZzTY/6exWdALNU= -github.com/dapr/components-contrib v1.11.0-rc.1/go.mod h1:cyzQOooKBS11WMGAtnIw1uNn6FbImC7ndwvyZa993Gc= -github.com/dapr/kit v0.0.5-0.20230418193628-15a7040dec41 h1:G55KmJAn2UsJm2+T0Vyz8gPcbphDe1PvjrES18JxfHQ= -github.com/dapr/kit v0.0.5-0.20230418193628-15a7040dec41/go.mod h1:VTWiX6nk5RWZ/kqEJD/EGjJU8hdwHZ73r75K510OHBY= +github.com/dapr/components-contrib v1.11.0-rc.4 h1:+MexV5pqeBxqCWcmAMwHCENl8DosAZhND9UDiLBK15A= +github.com/dapr/components-contrib v1.11.0-rc.4/go.mod h1:AwbfpZkJttIxPGGtg4tDyXz7izzjca0xfHbzixazLmw= +github.com/dapr/kit v0.0.5 h1:BbjO6LksdXAv6iuTVZiHJNkXj9Ii1gS2wA1u785Ypsg= +github.com/dapr/kit v0.0.5/go.mod h1:VTWiX6nk5RWZ/kqEJD/EGjJU8hdwHZ73r75K510OHBY= github.com/dave/jennifer v1.4.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -509,7 +511,7 @@ github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVB github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/frankban/quicktest v1.10.0/go.mod h1:ui7WezCLWMWxVWr1GETZY3smRy0G4KWq9vcPtJmFl7Y= github.com/frankban/quicktest v1.10.2/go.mod h1:K+q6oSqb0W0Ininfk863uOk1lMy69l/P6txr3mVT54s= -github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= +github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= @@ -600,8 +602,8 @@ github.com/go-resty/resty/v2 v2.7.0 h1:me+K9p3uhSmXtrBZ4k9jcEAfJmuC8IivWHwaLZwPr github.com/go-resty/resty/v2 v2.7.0/go.mod h1:9PWDzw47qPphMRFfhsyk0NnSgvluHcljSMVIq3w7q0I= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc= -github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= +github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI= +github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= @@ -1015,8 +1017,8 @@ github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFB github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -1360,8 +1362,8 @@ github.com/rabbitmq/amqp091-go v1.7.0/go.mod h1:wfClAtY0C7bOHxd3GjmF26jEHn+rR/0B github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/redis/go-redis/v9 v9.0.3 h1:+7mmR26M0IvyLxGZUHxu4GiBkJkVDid0Un+j4ScYu4k= -github.com/redis/go-redis/v9 v9.0.3/go.mod h1:WqMKv5vnQbRuZstUwxQI195wHy+t4PuXDOjzMvcuQHk= +github.com/redis/go-redis/v9 v9.0.4 h1:FC82T+CHJ/Q/PdyLW++GeCO+Ol59Y4T7R4jbgjvktgc= +github.com/redis/go-redis/v9 v9.0.4/go.mod h1:WqMKv5vnQbRuZstUwxQI195wHy+t4PuXDOjzMvcuQHk= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= @@ -1400,8 +1402,8 @@ github.com/shirou/gopsutil/v3 v3.21.6/go.mod h1:JfVbDpIBLVzT8oKbvMg9P3wEIMDDpVn+ github.com/shirou/gopsutil/v3 v3.22.2 h1:wCrArWFkHYIdDxx/FSfF5RB4dpJYW6t7rcp3+zL8uks= github.com/shirou/gopsutil/v3 v3.22.2/go.mod h1:WapW1AOOPlHyXr+yOyw3uYx36enocrtSoSBy0L5vUHY= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sijms/go-ora/v2 v2.6.11 h1:inBa/Tp0/kEl2prd3p5VabDXvmgVEelg328RYwsOCiE= -github.com/sijms/go-ora/v2 v2.6.11/go.mod h1:EHxlY6x7y9HAsdfumurRfTd+v8NrEOTR3Xl4FWlH6xk= +github.com/sijms/go-ora/v2 v2.7.6 h1:QyR1CKFxG+VVk2+LdHoHF4NxDSvcQ3deBXtZCrahSq4= +github.com/sijms/go-ora/v2 v2.7.6/go.mod h1:EHxlY6x7y9HAsdfumurRfTd+v8NrEOTR3Xl4FWlH6xk= github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= @@ -1431,8 +1433,8 @@ github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z github.com/spf13/afero v1.9.2 h1:j49Hj62F0n+DaZ1dDCvhABaPNSGNkt32oRFxI33IEMw= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= -github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= +github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= +github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= @@ -1528,8 +1530,8 @@ github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijb github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasthttp v1.45.0 h1:zPkkzpIn8tdHZUrVa6PzYd0i5verqiPSkgTd3bSUcpA= -github.com/valyala/fasthttp v1.45.0/go.mod h1:k2zXd82h/7UZc3VOdJ2WaUqt1uZ/XpXAfE9i+HBC3lA= +github.com/valyala/fasthttp v1.47.0 h1:y7moDoxYzMooFpT5aHgNgVOQDrS3qlkfiP9mDtGGK9c= +github.com/valyala/fasthttp v1.47.0/go.mod h1:k2zXd82h/7UZc3VOdJ2WaUqt1uZ/XpXAfE9i+HBC3lA= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/valyala/fasttemplate v1.1.0/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= @@ -1674,8 +1676,9 @@ go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= goji.io v2.0.2+incompatible h1:uIssv/elbKRLznFUy3Xj4+2Mz/qKhek/9aZQDUMae7c= golang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4= -golang.org/x/arch v0.2.0 h1:W1sUEHXiJTfjaFJ5SLo0N6lZn+0eO5gWD1MFeTGqQEY= golang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= +golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k= +golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/crypto v0.0.0-20180820150726-614d502a4dac/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -1704,8 +1707,8 @@ golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0 golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.8.0 h1:pd9TJtTueMTVQXzk8E2XESSMQDj/U7OUu0PqJqPXQjQ= -golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= +golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g= +golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= 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= @@ -1721,8 +1724,8 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= -golang.org/x/exp v0.0.0-20230419192730-864b3d6c5c2c h1:HDdYQYKOkvJT/Plb5HwJJywTVyUnIctjQm6XSnZ/0CY= -golang.org/x/exp v0.0.0-20230419192730-864b3d6c5c2c/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= +golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc h1:mCRnTeVUjcrhlRmO0VK8a6k6Rrf6TF9htwo2pJVSjIU= +golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= @@ -1836,8 +1839,8 @@ golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM= -golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= +golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= 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= @@ -1853,8 +1856,8 @@ golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.7.0 h1:qe6s0zUXlPX80/dITx3440hWZ7GwMwgDDyrSGTPJG/g= -golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= +golang.org/x/oauth2 v0.8.0 h1:6dkIjl3j3LtZ/O3sTgZTMsLKSftL/B8Zgq4huOIIUu8= +golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= 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= @@ -1868,8 +1871,9 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI= +golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180828065106-d99a578cf41b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1988,16 +1992,16 @@ golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= -golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 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= golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.7.0 h1:BEvjmm5fURWqcfbSKTdpkDXYBrUS1c0m8agp14W48vQ= -golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= +golang.org/x/term v0.8.0 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= 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= @@ -2101,8 +2105,8 @@ golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= -golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= +golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo= +golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -2371,23 +2375,23 @@ modernc.org/ccgo/v3 v3.16.13 h1:Mkgdzl46i5F/CNR/Kj80Ri59hC8TKAhZrYSaqvkwzUw= modernc.org/ccgo/v3 v3.16.13/go.mod h1:2Quk+5YgpImhPjv2Qsob1DnZ/4som1lJTodubIcoUkY= modernc.org/ccorpus v1.11.6 h1:J16RXiiqiCgua6+ZvQot4yUuUy8zxgqbqEEUuGPlISk= modernc.org/httpfs v1.0.6 h1:AAgIpFZRXuYnkjftxTAZwMIiwEqAfk8aVB2/oA6nAeM= -modernc.org/libc v1.22.3 h1:D/g6O5ftAfavceqlLOFwaZuA5KYafKwmr30A6iSqoyY= -modernc.org/libc v1.22.3/go.mod h1:MQrloYP209xa2zHome2a8HLiLm6k0UT8CoHpV74tOFw= +modernc.org/libc v1.22.6 h1:cbXU8R+A6aOjRuhsFh3nbDWXO/Hs4ClJRXYB11KmPDo= +modernc.org/libc v1.22.6/go.mod h1:jj+Z7dTNX8fBScMVNRAYZ/jF91K8fdT2hYMThc3YjBY= modernc.org/mathutil v1.5.0 h1:rV0Ko/6SfM+8G+yKiyI830l3Wuz1zRutdslNoQ0kfiQ= modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= modernc.org/memory v1.5.0 h1:N+/8c5rE6EqugZwHii4IFsaJ7MUhoWX07J5tC/iI5Ds= modernc.org/memory v1.5.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4= modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= -modernc.org/sqlite v1.21.1 h1:GyDFqNnESLOhwwDRaHGdp2jKLDzpyT/rNLglX3ZkMSU= -modernc.org/sqlite v1.21.1/go.mod h1:XwQ0wZPIh1iKb5mkvCJ3szzbhk+tykC8ZWqTRTgYRwI= +modernc.org/sqlite v1.22.1 h1:P2+Dhp5FR1RlVRkQ3dDfCiv3Ok8XPxqpe70IjYVA9oE= +modernc.org/sqlite v1.22.1/go.mod h1:OrDj17Mggn6MhE+iPbBNf7RGKODDE9NFT0f3EwDzJqk= modernc.org/strutil v1.1.3 h1:fNMm+oJklMGYfU9Ylcywl0CO5O6nTfaowNsh2wpPjzY= modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= -modernc.org/tcl v1.15.1 h1:mOQwiEK4p7HruMZcwKTZPw/aqtGM4aY00uzWhlKKYws= +modernc.org/tcl v1.15.2 h1:C4ybAYCGJw968e+Me18oW55kD/FexcHbqH2xak1ROSY= modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= -modernc.org/z v1.7.0 h1:xkDw/KepgEjeizO2sNco+hqYkU12taxQFqPEmgm1GWE= -nhooyr.io/websocket v1.8.6 h1:s+C3xAMLwGmlI31Nyn/eAehUlZPwfYZu2JXM621Q5/k= +modernc.org/z v1.7.3 h1:zDJf6iHjrnB+WRD88stbXokugjyc0/pB91ri1gO6LZY= +nhooyr.io/websocket v1.8.7 h1:usjR2uOr/zjjkVMy0lW+PPohFok7PCow5sDjLgX4P4g= nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= diff --git a/pkg/components/state/bulk.go b/pkg/components/state/bulk.go new file mode 100644 index 00000000000..3b4aab04f13 --- /dev/null +++ b/pkg/components/state/bulk.go @@ -0,0 +1,146 @@ +/* +Copyright 2023 The Dapr Authors +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 state + +import ( + "context" + "errors" + "sync/atomic" + + "github.com/cenkalti/backoff/v4" + + "github.com/dapr/components-contrib/state" + "github.com/dapr/dapr/pkg/resiliency" +) + +type stateRequestConstraint interface { + state.SetRequest | state.DeleteRequest + state.StateRequest +} + +func requestWithKey[T stateRequestConstraint](reqs []T, key string) int { + for i, r := range reqs { + if r.GetKey() == key { + return i + } + } + + // Should never happenโ€ฆ + return -1 +} + +// PerformBulkStoreOperation performs a bulk set or delete using resiliency, retrying operations that fail only when they can be retried. +func PerformBulkStoreOperation[T stateRequestConstraint]( + ctx context.Context, reqs []T, policyDef *resiliency.PolicyDefinition, opts state.BulkStoreOpts, + execSingle func(ctx context.Context, req *T) error, + execMulti func(ctx context.Context, reqs []T, opts state.BulkStoreOpts) error, +) error { + var reqsAtomic atomic.Pointer[[]T] + reqsAtomic.Store(&reqs) + policyRunner := resiliency.NewRunnerWithOptions(ctx, + policyDef, + resiliency.RunnerOpts[[]string]{ + // In case of errors, the policy runner function returns a list of items that are to be retried. + // Items that can NOT be retried are the items that either succeeded (when at least one other item failed) or which failed with an etag error (which can't be retried) + Accumulator: func(retry []string) { + rReqs := *reqsAtomic.Load() + newReqs := make([]T, len(retry)) + var n int + for _, retryKey := range retry { + i := requestWithKey(reqs, retryKey) + if i >= 0 { + newReqs[n] = rReqs[i] + n++ + } + } + newReqs = newReqs[:n] + reqsAtomic.Store(&newReqs) + }, + }, + ) + _, err := policyRunner(func(ctx context.Context) ([]string, error) { + var rErr error + rReqs := *reqsAtomic.Load() + + // If there's a single request, perform it in non-bulk + // In this case, we never need to filter out operations + if len(rReqs) == 1 { + rErr = execSingle(ctx, &rReqs[0]) + if rErr != nil { + // Check if it's an etag error, which is not retriable + // In that case, wrap inside a permanent backoff error + var etagErr *state.ETagError + if errors.As(rErr, &etagErr) { + rErr = backoff.Permanent(rErr) + } + } + return nil, rErr + } + + // Perform the request in bulk + rErr = execMulti(ctx, rReqs, opts) + + // If there's no error, short-circuit + if rErr == nil { + return nil, nil + } + + // Check if we have a multi-error; if not, return the error as-is + mErr, ok := rErr.(interface{ Unwrap() []error }) + if !ok { + return nil, rErr + } + errs := mErr.Unwrap() + if len(errs) == 0 { + // Should never happenโ€ฆ + return nil, rErr + } + + // Check which operation(s) failed + // We can retry if at least one error is not an etag error + var canRetry, etagInvalid bool + retry := make([]string, 0, len(errs)) + for _, e := range errs { + // Check if it's a BulkStoreError + // If not, we will cause all operations to be retried, because the error was not a multi BulkStoreError + var bse state.BulkStoreError + if !errors.As(e, &bse) { + return nil, rErr + } + + // If it's not an etag error, the operation can retry this failed item + if etagErr := bse.ETagError(); etagErr == nil { + canRetry = true + retry = append(retry, bse.Key()) + } else if etagErr.Kind() == state.ETagInvalid { + // If at least one etag error is due to an etag invalid, record that + etagInvalid = true + } + } + + // If canRetry is false, it means that all errors are etag errors, which are permanent + if !canRetry { + var etagErr *state.ETagError + if etagInvalid { + etagErr = state.NewETagError(state.ETagInvalid, rErr) + } else { + etagErr = state.NewETagError(state.ETagMismatch, rErr) + } + rErr = backoff.Permanent(etagErr) + } + return retry, rErr + }) + + return err +} diff --git a/pkg/components/state/bulk_test.go b/pkg/components/state/bulk_test.go new file mode 100644 index 00000000000..6882887312e --- /dev/null +++ b/pkg/components/state/bulk_test.go @@ -0,0 +1,326 @@ +/* +Copyright 2023 The Dapr Authors +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 state + +import ( + "context" + "errors" + "sync/atomic" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/dapr/components-contrib/state" + resiliencyV1alpha1 "github.com/dapr/dapr/pkg/apis/resiliency/v1alpha1" + "github.com/dapr/dapr/pkg/resiliency" + "github.com/dapr/kit/logger" + "github.com/dapr/kit/ptr" +) + +func TestPerformBulkStoreOperation(t *testing.T) { + simulatedErr := errors.New("simulated") + etagMismatchErr := state.NewETagError(state.ETagMismatch, simulatedErr) + etagInvalidErr := state.NewETagError(state.ETagInvalid, simulatedErr) + + res := resiliency.FromConfigurations(logger.NewLogger("test"), &resiliencyV1alpha1.Resiliency{ + Spec: resiliencyV1alpha1.ResiliencySpec{ + Policies: resiliencyV1alpha1.Policies{ + Retries: map[string]resiliencyV1alpha1.Retry{ + "singleRetry": { + MaxRetries: ptr.Of(1), + MaxInterval: "100ms", + Policy: "constant", + Duration: "10ms", + }, + }, + Timeouts: map[string]string{ + "fast": "100ms", + }, + }, + Targets: resiliencyV1alpha1.Targets{ + Components: map[string]resiliencyV1alpha1.ComponentPolicyNames{ + "mystate": { + Outbound: resiliencyV1alpha1.PolicyNames{ + Retry: "singleRetry", + Timeout: "fast", + }, + }, + }, + }, + }, + }) + policyDef := res.ComponentOutboundPolicy("mystate", resiliency.Statestore) + + t.Run("single request", func(t *testing.T) { + reqs := []state.SetRequest{ + {Key: "key1"}, + } + + t.Run("no error", func(t *testing.T) { + count := atomic.Uint32{} + err := PerformBulkStoreOperation(context.Background(), reqs, policyDef, state.BulkStoreOpts{}, + func(ctx context.Context, req *state.SetRequest) error { + count.Add(1) + return nil + }, + nil, // The multi method should not be invoked, so this will panic if it happens + ) + require.NoError(t, err) + require.Equal(t, uint32(1), count.Load()) + }) + + t.Run("does not retry on etag error", func(t *testing.T) { + count := atomic.Uint32{} + err := PerformBulkStoreOperation(context.Background(), reqs, policyDef, state.BulkStoreOpts{}, + func(ctx context.Context, req *state.SetRequest) error { + count.Add(1) + return etagInvalidErr + }, + nil, // The multi method should not be invoked, so this will panic if it happens + ) + var etagErr *state.ETagError + require.Error(t, err) + require.ErrorAs(t, err, &etagErr) + require.Equal(t, uint32(1), count.Load()) + }) + + t.Run("retries on other errors", func(t *testing.T) { + count := atomic.Uint32{} + err := PerformBulkStoreOperation(context.Background(), reqs, policyDef, state.BulkStoreOpts{}, + func(ctx context.Context, req *state.SetRequest) error { + count.Add(1) + return simulatedErr + }, + nil, // The multi method should not be invoked, so this will panic if it happens + ) + require.Error(t, err) + require.Equal(t, uint32(2), count.Load()) + }) + + t.Run("success on second attempt", func(t *testing.T) { + count := atomic.Uint32{} + err := PerformBulkStoreOperation(context.Background(), reqs, policyDef, state.BulkStoreOpts{}, + func(ctx context.Context, req *state.SetRequest) error { + if count.Add(1) == 1 { + return simulatedErr + } + return nil + }, + nil, // The multi method should not be invoked, so this will panic if it happens + ) + require.NoError(t, err) + require.Equal(t, uint32(2), count.Load()) + }) + }) + + t.Run("multiple requests", func(t *testing.T) { + reqs := []state.SetRequest{ + {Key: "key1"}, + {Key: "key2"}, + } + + t.Run("all successful", func(t *testing.T) { + count := atomic.Uint32{} + err := PerformBulkStoreOperation(context.Background(), reqs, policyDef, state.BulkStoreOpts{}, + nil, // The single method should not be invoked, so this will panic if it happens + func(ctx context.Context, req []state.SetRequest, opts state.BulkStoreOpts) error { + count.Add(1) + return nil + }, + ) + require.NoError(t, err) + require.Equal(t, uint32(1), count.Load()) + }) + + t.Run("key1 successful, key2 etag mismatch", func(t *testing.T) { + count := atomic.Uint32{} + err := PerformBulkStoreOperation(context.Background(), reqs, policyDef, state.BulkStoreOpts{}, + nil, // The single method should not be invoked, so this will panic if it happens + func(ctx context.Context, req []state.SetRequest, opts state.BulkStoreOpts) error { + count.Add(1) + return errors.Join( + state.NewBulkStoreError("key2", etagMismatchErr), + ) + }, + ) + require.Error(t, err) + var etagErr *state.ETagError + require.ErrorAs(t, err, &etagErr) + require.Equal(t, state.ETagMismatch, etagErr.Kind()) + require.Equal(t, uint32(1), count.Load()) + }) + + t.Run("key1 etag invalid, key2 etag mismatch", func(t *testing.T) { + count := atomic.Uint32{} + err := PerformBulkStoreOperation(context.Background(), reqs, policyDef, state.BulkStoreOpts{}, + nil, // The single method should not be invoked, so this will panic if it happens + func(ctx context.Context, req []state.SetRequest, opts state.BulkStoreOpts) error { + count.Add(1) + return errors.Join( + state.NewBulkStoreError("key1", etagInvalidErr), + state.NewBulkStoreError("key2", etagMismatchErr), + ) + }, + ) + require.Error(t, err) + var etagErr *state.ETagError + require.ErrorAs(t, err, &etagErr) + require.Equal(t, state.ETagInvalid, etagErr.Kind()) + require.Equal(t, uint32(1), count.Load()) + }) + + t.Run("key1 successful, key2 fails and is retried", func(t *testing.T) { + count := atomic.Uint32{} + // This should retry, but the second time only key2 should be requested + err := PerformBulkStoreOperation(context.Background(), reqs, policyDef, state.BulkStoreOpts{}, + func(ctx context.Context, req *state.SetRequest) error { + require.Equal(t, "key2", req.Key) + count.Add(1) + return simulatedErr + }, + func(ctx context.Context, req []state.SetRequest, opts state.BulkStoreOpts) error { + count.Add(1) + return errors.Join( + state.NewBulkStoreError("key2", simulatedErr), + ) + }, + ) + require.Error(t, err) + require.Equal(t, simulatedErr, err) + require.Equal(t, uint32(2), count.Load()) + }) + + t.Run("key1 fails and is retried, key2 has etag error", func(t *testing.T) { + count := atomic.Uint32{} + // This should retry, but the second time only key1 should be requested + err := PerformBulkStoreOperation(context.Background(), reqs, policyDef, state.BulkStoreOpts{}, + func(ctx context.Context, req *state.SetRequest) error { + require.Equal(t, "key1", req.Key) + count.Add(1) + return simulatedErr + }, + func(ctx context.Context, req []state.SetRequest, opts state.BulkStoreOpts) error { + count.Add(1) + return errors.Join( + state.NewBulkStoreError("key1", simulatedErr), + state.NewBulkStoreError("key2", etagMismatchErr), + ) + }, + ) + require.Error(t, err) + require.Equal(t, simulatedErr, err) + require.Equal(t, uint32(2), count.Load()) + }) + + t.Run("key1 fails and is retried, key2 has etag error, key3 succeeds", func(t *testing.T) { + reqs2 := []state.SetRequest{ + {Key: "key1"}, + {Key: "key2"}, + {Key: "key3"}, + } + + count := atomic.Uint32{} + // This should retry, but the second time only key1 should be requested + err := PerformBulkStoreOperation(context.Background(), reqs2, policyDef, state.BulkStoreOpts{}, + func(ctx context.Context, req *state.SetRequest) error { + require.Equal(t, "key1", req.Key) + count.Add(1) + return simulatedErr + }, + func(ctx context.Context, req []state.SetRequest, opts state.BulkStoreOpts) error { + count.Add(1) + return errors.Join( + state.NewBulkStoreError("key1", simulatedErr), + state.NewBulkStoreError("key2", etagMismatchErr), + ) + }, + ) + require.Error(t, err) + require.Equal(t, simulatedErr, err) + require.Equal(t, uint32(2), count.Load()) + }) + + t.Run("key1 succeeds on 2nd attempt, key2 succeeds, key3 has etag error on 2nd attempt", func(t *testing.T) { + reqs2 := []state.SetRequest{ + {Key: "key1"}, + {Key: "key2"}, + {Key: "key3"}, + } + + count := atomic.Uint32{} + err := PerformBulkStoreOperation(context.Background(), reqs2, policyDef, state.BulkStoreOpts{}, + nil, // The single method should not be invoked, so this will panic if it happens + func(ctx context.Context, req []state.SetRequest, opts state.BulkStoreOpts) error { + if count.Add(1) == 1 { + // On first attempt, key1 and key3 fail with non-etag errors + return errors.Join( + state.NewBulkStoreError("key1", simulatedErr), + state.NewBulkStoreError("key3", simulatedErr), + ) + } + + // On the second attempt, key3 fails with etag error + require.Len(t, req, 2) + for i := 0; i < 2; i++ { + switch req[i].Key { + case "key3", "key1": + // All good + default: + t.Fatalf("Found unexpected key: %s", req[i].Key) + } + } + return errors.Join( + state.NewBulkStoreError("key3", etagMismatchErr), + ) + }, + ) + require.Error(t, err) + var etagErr *state.ETagError + require.ErrorAs(t, err, &etagErr) + require.Equal(t, state.ETagMismatch, etagErr.Kind()) + require.Equal(t, uint32(2), count.Load()) + }) + + t.Run("retries when error is not a multierror", func(t *testing.T) { + count := atomic.Uint32{} + err := PerformBulkStoreOperation(context.Background(), reqs, policyDef, state.BulkStoreOpts{}, + nil, // The single method should not be invoked, so this will panic if it happens + func(ctx context.Context, req []state.SetRequest, opts state.BulkStoreOpts) error { + count.Add(1) + return simulatedErr + }, + ) + require.Error(t, err) + require.Equal(t, simulatedErr, err) + require.Equal(t, uint32(2), count.Load()) + }) + + t.Run("retries when multierror contains a non-BulkStoreError error", func(t *testing.T) { + count := atomic.Uint32{} + err := PerformBulkStoreOperation(context.Background(), reqs, policyDef, state.BulkStoreOpts{}, + nil, // The single method should not be invoked, so this will panic if it happens + func(ctx context.Context, req []state.SetRequest, opts state.BulkStoreOpts) error { + count.Add(1) + return errors.Join(simulatedErr) + }, + ) + require.Error(t, err) + merr, ok := err.(interface{ Unwrap() []error }) + require.True(t, ok) + require.Len(t, merr.Unwrap(), 1) + require.Equal(t, merr.Unwrap()[0], simulatedErr) + require.Equal(t, uint32(2), count.Load()) + }) + }) +} diff --git a/pkg/components/state/pluggable.go b/pkg/components/state/pluggable.go index 836e7bbbf67..de7fe88f781 100644 --- a/pkg/components/state/pluggable.go +++ b/pkg/components/state/pluggable.go @@ -223,7 +223,7 @@ func (ss *grpcStateStore) Set(ctx context.Context, req *state.SetRequest) error } // BulkDelete performs a delete operation for many keys at once. -func (ss *grpcStateStore) BulkDelete(ctx context.Context, reqs []state.DeleteRequest) error { +func (ss *grpcStateStore) BulkDelete(ctx context.Context, reqs []state.DeleteRequest, opts state.BulkStoreOpts) error { protoRequests := make([]*proto.DeleteRequest, len(reqs)) for idx := range reqs { @@ -232,6 +232,9 @@ func (ss *grpcStateStore) BulkDelete(ctx context.Context, reqs []state.DeleteReq bulkDeleteRequest := &proto.BulkDeleteRequest{ Items: protoRequests, + Options: &proto.BulkDeleteRequestOptions{ + Parallelism: int64(opts.Parallelism), + }, } _, err := ss.Client.BulkDelete(ctx, bulkDeleteRequest) @@ -272,7 +275,7 @@ func (ss *grpcStateStore) BulkGet(ctx context.Context, req []state.GetRequest, o } // BulkSet performs a set operation for many keys at once. -func (ss *grpcStateStore) BulkSet(ctx context.Context, req []state.SetRequest) error { +func (ss *grpcStateStore) BulkSet(ctx context.Context, req []state.SetRequest, opts state.BulkStoreOpts) error { requests := []*proto.SetRequest{} for idx := range req { protoRequest, err := toSetRequest(&req[idx]) @@ -283,6 +286,9 @@ func (ss *grpcStateStore) BulkSet(ctx context.Context, req []state.SetRequest) e } _, err := ss.Client.BulkSet(ctx, &proto.BulkSetRequest{ Items: requests, + Options: &proto.BulkSetRequestOptions{ + Parallelism: int64(opts.Parallelism), + }, }) return mapBulkSetErrs(err) } diff --git a/pkg/components/state/pluggable_test.go b/pkg/components/state/pluggable_test.go index d9236a434ea..ef38a169453 100644 --- a/pkg/components/state/pluggable_test.go +++ b/pkg/components/state/pluggable_test.go @@ -483,7 +483,7 @@ func TestComponentCalls(t *testing.T) { require.NoError(t, err) defer cleanup() - err = stStore.BulkSet(context.Background(), []state.SetRequest{}) + err = stStore.BulkSet(context.Background(), []state.SetRequest{}, state.BulkStoreOpts{}) assert.NotNil(t, err) assert.Equal(t, int64(1), svc.bulkSetCalled.Load()) @@ -504,7 +504,7 @@ func TestComponentCalls(t *testing.T) { require.NoError(t, err) defer cleanup() - err = stStore.BulkSet(context.Background(), requests) + err = stStore.BulkSet(context.Background(), requests, state.BulkStoreOpts{}) assert.ErrorIs(t, ErrNilSetValue, err) assert.Equal(t, int64(0), svc.bulkSetCalled.Load()) @@ -531,7 +531,7 @@ func TestComponentCalls(t *testing.T) { require.NoError(t, err) defer cleanup() - err = stStore.BulkSet(context.Background(), requests) + err = stStore.BulkSet(context.Background(), requests, state.BulkStoreOpts{}) require.NoError(t, err) assert.Equal(t, int64(1), svc.bulkSetCalled.Load()) @@ -556,7 +556,7 @@ func TestComponentCalls(t *testing.T) { require.NoError(t, err) defer cleanup() - err = stStore.BulkDelete(context.Background(), requests) + err = stStore.BulkDelete(context.Background(), requests, state.BulkStoreOpts{}) require.NoError(t, err) assert.Equal(t, int64(1), svc.bulkDeleteCalled.Load()) @@ -578,7 +578,7 @@ func TestComponentCalls(t *testing.T) { require.NoError(t, err) defer cleanup() - err = stStore.BulkDelete(context.Background(), requests) + err = stStore.BulkDelete(context.Background(), requests, state.BulkStoreOpts{}) assert.NotNil(t, err) assert.Equal(t, int64(1), svc.bulkDeleteCalled.Load()) @@ -610,7 +610,7 @@ func TestComponentCalls(t *testing.T) { require.NoError(t, err) defer cleanup() - err = stStore.BulkDelete(context.Background(), requests) + err = stStore.BulkDelete(context.Background(), requests, state.BulkStoreOpts{}) assert.NotNil(t, err) _, ok := err.(*state.BulkDeleteRowMismatchError) diff --git a/pkg/grpc/api.go b/pkg/grpc/api.go index 34a2d13d8a3..0388cf8b4bc 100644 --- a/pkg/grpc/api.go +++ b/pkg/grpc/api.go @@ -503,7 +503,7 @@ func (a *api) InvokeBinding(ctx context.Context, in *runtimev1pb.InvokeBindingRe func (a *api) GetBulkState(ctx context.Context, in *runtimev1pb.GetBulkStateRequest) (*runtimev1pb.GetBulkStateResponse, error) { bulkResp := &runtimev1pb.GetBulkStateResponse{} - store, err := a.getStateStore(in.StoreName) + store, err := a.UniversalAPI.GetStateStore(in.StoreName) if err != nil { // Error has already been logged return bulkResp, err @@ -513,7 +513,6 @@ func (a *api) GetBulkState(ctx context.Context, in *runtimev1pb.GetBulkStateRequ return bulkResp, nil } - // try bulk get first var key string reqs := make([]state.GetRequest, len(in.Keys)) for i, k := range in.Keys { @@ -529,7 +528,7 @@ func (a *api) GetBulkState(ctx context.Context, in *runtimev1pb.GetBulkStateRequ } start := time.Now() - policyDef := a.resiliency.ComponentOutboundPolicy(in.StoreName, resiliency.Statestore) + policyDef := a.UniversalAPI.Resiliency.ComponentOutboundPolicy(in.StoreName, resiliency.Statestore) bgrPolicyRunner := resiliency.NewRunner[[]state.BulkGetResponse](ctx, policyDef) responses, err := bgrPolicyRunner(func(ctx context.Context) ([]state.BulkGetResponse, error) { return store.BulkGet(ctx, reqs, state.BulkGetOpts{ @@ -578,24 +577,8 @@ func (a *api) GetBulkState(ctx context.Context, in *runtimev1pb.GetBulkStateRequ return bulkResp, nil } -func (a *api) getStateStore(name string) (state.Store, error) { - if a.CompStore.StateStoresLen() == 0 { - err := messages.ErrStateStoresNotConfigured - apiServerLogger.Debug(err) - return nil, err - } - - state, ok := a.CompStore.GetStateStore(name) - if !ok { - err := messages.ErrStateStoreNotFound.WithFormat(name) - apiServerLogger.Debug(err) - return nil, err - } - return state, nil -} - func (a *api) GetState(ctx context.Context, in *runtimev1pb.GetStateRequest) (*runtimev1pb.GetStateResponse, error) { - store, err := a.getStateStore(in.StoreName) + store, err := a.UniversalAPI.GetStateStore(in.StoreName) if err != nil { // Error has already been logged return &runtimev1pb.GetStateResponse{}, err @@ -614,7 +597,7 @@ func (a *api) GetState(ctx context.Context, in *runtimev1pb.GetStateRequest) (*r start := time.Now() policyRunner := resiliency.NewRunner[*state.GetResponse](ctx, - a.resiliency.ComponentOutboundPolicy(in.StoreName, resiliency.Statestore), + a.UniversalAPI.Resiliency.ComponentOutboundPolicy(in.StoreName, resiliency.Statestore), ) getResponse, err := policyRunner(func(ctx context.Context) (*state.GetResponse, error) { return store.Get(ctx, req) @@ -625,7 +608,7 @@ func (a *api) GetState(ctx context.Context, in *runtimev1pb.GetStateRequest) (*r if err != nil { err = status.Errorf(codes.Internal, messages.ErrStateGet, in.Key, in.StoreName, err.Error()) - apiServerLogger.Debug(err) + a.UniversalAPI.Logger.Debug(err) return &runtimev1pb.GetStateResponse{}, err } @@ -636,7 +619,7 @@ func (a *api) GetState(ctx context.Context, in *runtimev1pb.GetStateRequest) (*r val, err := encryption.TryDecryptValue(in.StoreName, getResponse.Data) if err != nil { err = status.Errorf(codes.Internal, messages.ErrStateGet, in.Key, in.StoreName, err.Error()) - apiServerLogger.Debug(err) + a.UniversalAPI.Logger.Debug(err) return &runtimev1pb.GetStateResponse{}, err } @@ -655,7 +638,7 @@ func (a *api) GetState(ctx context.Context, in *runtimev1pb.GetStateRequest) (*r func (a *api) SaveState(ctx context.Context, in *runtimev1pb.SaveStateRequest) (*emptypb.Empty, error) { empty := &emptypb.Empty{} - store, err := a.getStateStore(in.StoreName) + store, err := a.UniversalAPI.GetStateStore(in.StoreName) if err != nil { // Error has already been logged return empty, err @@ -699,7 +682,7 @@ func (a *api) SaveState(ctx context.Context, in *runtimev1pb.SaveStateRequest) ( if encryption.EncryptedStateStore(in.StoreName) { val, encErr := encryption.TryEncryptValue(in.StoreName, s.Value) if encErr != nil { - apiServerLogger.Debug(encErr) + a.UniversalAPI.Logger.Debug(encErr) return empty, encErr } @@ -710,23 +693,19 @@ func (a *api) SaveState(ctx context.Context, in *runtimev1pb.SaveStateRequest) ( } start := time.Now() - policyRunner := resiliency.NewRunner[struct{}](ctx, - a.resiliency.ComponentOutboundPolicy(in.StoreName, resiliency.Statestore), + err = stateLoader.PerformBulkStoreOperation(ctx, reqs, + a.UniversalAPI.Resiliency.ComponentOutboundPolicy(in.StoreName, resiliency.Statestore), + state.BulkStoreOpts{}, + store.Set, + store.BulkSet, ) - _, err = policyRunner(func(ctx context.Context) (struct{}, error) { - // If there's a single request, perform it in non-bulk - if len(reqs) == 1 { - return struct{}{}, store.Set(ctx, &reqs[0]) - } - return struct{}{}, store.BulkSet(ctx, reqs) - }) elapsed := diag.ElapsedSince(start) diag.DefaultComponentMonitoring.StateInvoked(ctx, in.StoreName, diag.Set, err == nil, elapsed) if err != nil { err = a.stateErrorResponse(err, messages.ErrStateSave, in.StoreName, err.Error()) - apiServerLogger.Debug(err) + a.UniversalAPI.Logger.Debug(err) return empty, err } return empty, nil @@ -734,15 +713,14 @@ func (a *api) SaveState(ctx context.Context, in *runtimev1pb.SaveStateRequest) ( // stateErrorResponse takes a state store error, format and args and returns a status code encoded gRPC error. func (a *api) stateErrorResponse(err error, format string, args ...interface{}) error { - e, ok := err.(*state.ETagError) - if !ok { - return status.Errorf(codes.Internal, format, args...) - } - switch e.Kind() { - case state.ETagMismatch: - return status.Errorf(codes.Aborted, format, args...) - case state.ETagInvalid: - return status.Errorf(codes.InvalidArgument, format, args...) + var etagErr *state.ETagError + if errors.As(err, &etagErr) { + switch etagErr.Kind() { + case state.ETagMismatch: + return status.Errorf(codes.Aborted, format, args...) + case state.ETagInvalid: + return status.Errorf(codes.InvalidArgument, format, args...) + } } return status.Errorf(codes.Internal, format, args...) @@ -751,7 +729,7 @@ func (a *api) stateErrorResponse(err error, format string, args ...interface{}) func (a *api) DeleteState(ctx context.Context, in *runtimev1pb.DeleteStateRequest) (*emptypb.Empty, error) { empty := &emptypb.Empty{} - store, err := a.getStateStore(in.StoreName) + store, err := a.UniversalAPI.GetStateStore(in.StoreName) if err != nil { // Error has already been logged return empty, err @@ -777,7 +755,7 @@ func (a *api) DeleteState(ctx context.Context, in *runtimev1pb.DeleteStateReques start := time.Now() policyRunner := resiliency.NewRunner[any](ctx, - a.resiliency.ComponentOutboundPolicy(in.StoreName, resiliency.Statestore), + a.UniversalAPI.Resiliency.ComponentOutboundPolicy(in.StoreName, resiliency.Statestore), ) _, err = policyRunner(func(ctx context.Context) (any, error) { return nil, store.Delete(ctx, &req) @@ -788,7 +766,7 @@ func (a *api) DeleteState(ctx context.Context, in *runtimev1pb.DeleteStateReques if err != nil { err = a.stateErrorResponse(err, messages.ErrStateDelete, in.Key, err.Error()) - apiServerLogger.Debug(err) + a.UniversalAPI.Logger.Debug(err) return empty, err } return empty, nil @@ -797,14 +775,14 @@ func (a *api) DeleteState(ctx context.Context, in *runtimev1pb.DeleteStateReques func (a *api) DeleteBulkState(ctx context.Context, in *runtimev1pb.DeleteBulkStateRequest) (*emptypb.Empty, error) { empty := &emptypb.Empty{} - store, err := a.getStateStore(in.StoreName) + store, err := a.UniversalAPI.GetStateStore(in.StoreName) if err != nil { // Error has already been logged return empty, err } - reqs := make([]state.DeleteRequest, 0, len(in.States)) - for _, item := range in.States { + reqs := make([]state.DeleteRequest, len(in.States)) + for i, item := range in.States { key, err1 := stateLoader.GetModifiedStateKey(item.Key, in.StoreName, a.UniversalAPI.AppID) if err1 != nil { return empty, err1 @@ -822,24 +800,26 @@ func (a *api) DeleteBulkState(ctx context.Context, in *runtimev1pb.DeleteBulkSta Consistency: stateConsistencyToString(item.Options.Consistency), } } - reqs = append(reqs, req) + reqs[i] = req } start := time.Now() - policyRunner := resiliency.NewRunner[any](ctx, - a.resiliency.ComponentOutboundPolicy(in.StoreName, resiliency.Statestore), + err = stateLoader.PerformBulkStoreOperation(ctx, reqs, + a.UniversalAPI.Resiliency.ComponentOutboundPolicy(in.StoreName, resiliency.Statestore), + state.BulkStoreOpts{}, + store.Delete, + store.BulkDelete, ) - _, err = policyRunner(func(ctx context.Context) (any, error) { - return nil, store.BulkDelete(ctx, reqs) - }) elapsed := diag.ElapsedSince(start) diag.DefaultComponentMonitoring.StateInvoked(ctx, in.StoreName, diag.BulkDelete, err == nil, elapsed) if err != nil { - apiServerLogger.Debug(err) + err = a.stateErrorResponse(err, messages.ErrStateDeleteBulk, in.StoreName, err.Error()) + a.UniversalAPI.Logger.Debug(err) return empty, err } + return empty, nil } @@ -851,7 +831,7 @@ func extractEtag(req *commonv1pb.StateItem) (bool, string) { } func (a *api) ExecuteStateTransaction(ctx context.Context, in *runtimev1pb.ExecuteStateTransactionRequest) (*emptypb.Empty, error) { - store, storeErr := a.getStateStore(in.StoreName) + store, storeErr := a.UniversalAPI.GetStateStore(in.StoreName) if storeErr != nil { // Error has already been logged return &emptypb.Empty{}, storeErr diff --git a/pkg/grpc/api_test.go b/pkg/grpc/api_test.go index f378011ace7..2a7deeba51c 100644 --- a/pkg/grpc/api_test.go +++ b/pkg/grpc/api_test.go @@ -71,6 +71,8 @@ import ( const ( goodStoreKey = "fakeAPI||good-key" errorStoreKey = "fakeAPI||error-key" + etagMismatchKey = "fakeAPI||etag-mismatch" + etagInvalidKey = "fakeAPI||etag-invalid" goodKey = "good-key" goodKey2 = "good-key2" mockSubscribeID = "mockId" @@ -982,8 +984,10 @@ func TestGetBulkSecret(t *testing.T) { func TestGetStateWhenStoreNotConfigured(t *testing.T) { server, lis := startDaprAPIServer(&api{ UniversalAPI: &universalapi.UniversalAPI{ - AppID: "fakeAPI", - CompStore: compstore.New(), + AppID: "fakeAPI", + Logger: logger.NewLogger("grpc.api.test"), + CompStore: compstore.New(), + Resiliency: resiliency.New(nil), }, resiliency: resiliency.New(nil), }, "") @@ -998,6 +1002,9 @@ func TestGetStateWhenStoreNotConfigured(t *testing.T) { } func TestSaveState(t *testing.T) { + etagMismatchErr := state.NewETagError(state.ETagMismatch, errors.New("simulated")) + etagInvalidErr := state.NewETagError(state.ETagInvalid, errors.New("simulated")) + fakeStore := &daprt.MockStateStore{} fakeStore.On("Set", mock.MatchedBy(matchContextInterface), @@ -1011,6 +1018,49 @@ func TestSaveState(t *testing.T) { return req.Key == errorStoreKey }), ).Return(errors.New("failed to save state with error-key")) + fakeStore.On("Set", + mock.MatchedBy(matchContextInterface), + mock.MatchedBy(func(req *state.SetRequest) bool { + return req.Key == etagMismatchKey + }), + ).Return(etagMismatchErr) + fakeStore.On("Set", + mock.MatchedBy(matchContextInterface), + mock.MatchedBy(func(req *state.SetRequest) bool { + return req.Key == etagInvalidKey + }), + ).Return(etagInvalidErr) + fakeStore.On("BulkSet", + mock.MatchedBy(matchContextInterface), + mock.MatchedBy(func(req []state.SetRequest) bool { + return len(req) == 2 && + req[0].Key == goodStoreKey && + req[1].Key == goodStoreKey+"2" + }), + mock.Anything, + ).Return(nil) + fakeStore.On("BulkSet", + mock.MatchedBy(matchContextInterface), + mock.MatchedBy(func(req []state.SetRequest) bool { + return len(req) == 2 && + req[0].Key == goodStoreKey && + req[1].Key == etagMismatchKey + }), + mock.Anything, + ).Return(errors.Join(state.NewBulkStoreError(etagMismatchKey, etagMismatchErr))) + fakeStore.On("BulkSet", + mock.MatchedBy(matchContextInterface), + mock.MatchedBy(func(req []state.SetRequest) bool { + return len(req) == 3 && + req[0].Key == goodStoreKey && + req[1].Key == etagMismatchKey && + req[2].Key == etagInvalidKey + }), + mock.Anything, + ).Return(errors.Join( + state.NewBulkStoreError(etagMismatchKey, etagMismatchErr), + state.NewBulkStoreError(etagInvalidKey, etagInvalidErr), + )) compStore := compstore.New() compStore.AddStateStore("store1", fakeStore) @@ -1018,10 +1068,11 @@ func TestSaveState(t *testing.T) { // Setup dapr api server fakeAPI := &api{ UniversalAPI: &universalapi.UniversalAPI{ - AppID: "fakeAPI", - CompStore: compStore, + AppID: "fakeAPI", + Logger: logger.NewLogger("grpc.api.test"), + CompStore: compStore, + Resiliency: resiliency.New(nil), }, - resiliency: resiliency.New(nil), } server, lis := startDaprAPIServer(fakeAPI, "") defer server.Stop() @@ -1033,58 +1084,123 @@ func TestSaveState(t *testing.T) { client := runtimev1pb.NewDaprClient(clientConn) testCases := []struct { - testName string - storeName string - key string - value string - errorExcepted bool - expectedError codes.Code + testName string + storeName string + states []*commonv1pb.StateItem + expectedCode codes.Code }{ { - testName: "save state", - storeName: "store1", - key: goodKey, - value: "value", - errorExcepted: false, - expectedError: codes.OK, + testName: "save state with non-existing store", + storeName: "store2", + expectedCode: codes.InvalidArgument, }, { - testName: "save state with non-existing store", - storeName: "store2", - key: goodKey, - value: "value", - errorExcepted: true, - expectedError: codes.InvalidArgument, + testName: "single - save state", + storeName: "store1", + states: []*commonv1pb.StateItem{ + { + Key: goodKey, + Value: []byte("value"), + }, + }, + expectedCode: codes.OK, }, { - testName: "save state but error occurs", - storeName: "store1", - key: "error-key", - value: "value", - errorExcepted: true, - expectedError: codes.Internal, + testName: "single - save state but error occurs", + storeName: "store1", + states: []*commonv1pb.StateItem{ + { + Key: "error-key", + Value: []byte("value"), + }, + }, + expectedCode: codes.Internal, + }, + { + testName: "single - save state with etag mismatch", + storeName: "store1", + states: []*commonv1pb.StateItem{ + { + Key: "etag-mismatch", + Value: []byte("value"), + }, + }, + expectedCode: codes.Aborted, + }, + { + testName: "single - save state with etag invalid", + storeName: "store1", + states: []*commonv1pb.StateItem{ + { + Key: "etag-invalid", + Value: []byte("value"), + }, + }, + expectedCode: codes.InvalidArgument, + }, + { + testName: "multi - save state", + storeName: "store1", + states: []*commonv1pb.StateItem{ + { + Key: goodKey, + Value: []byte("value"), + }, + { + Key: goodKey + "2", + Value: []byte("value"), + }, + }, + expectedCode: codes.OK, + }, + { + testName: "multi - save state with etag mismatch", + storeName: "store1", + states: []*commonv1pb.StateItem{ + { + Key: goodKey, + Value: []byte("value"), + }, + { + Key: "etag-mismatch", + Value: []byte("value"), + }, + }, + expectedCode: codes.Aborted, + }, + { + testName: "multi - save state with etag mismatch and etag invalid", + storeName: "store1", + states: []*commonv1pb.StateItem{ + { + Key: goodKey, + Value: []byte("value"), + }, + { + Key: "etag-mismatch", + Value: []byte("value"), + }, + { + Key: "etag-invalid", + Value: []byte("value"), + }, + }, + expectedCode: codes.InvalidArgument, }, } // test and assert for _, tt := range testCases { t.Run(tt.testName, func(t *testing.T) { - req := &runtimev1pb.SaveStateRequest{ + _, err := client.SaveState(context.Background(), &runtimev1pb.SaveStateRequest{ StoreName: tt.storeName, - States: []*commonv1pb.StateItem{ - { - Key: tt.key, - Value: []byte(tt.value), - }, - }, - } - - _, err := client.SaveState(context.Background(), req) - if !tt.errorExcepted { - assert.NoError(t, err, "Expected no error") + States: tt.states, + }) + if tt.expectedCode == codes.OK { + require.NoError(t, err) } else { - assert.Error(t, err, "Expected error") - assert.Equal(t, tt.expectedError, status.Code(err)) + require.Error(t, err) + assert.Equal(t, tt.expectedCode, status.Code(err)) } }) } @@ -1112,10 +1228,11 @@ func TestGetState(t *testing.T) { // Setup dapr api server fakeAPI := &api{ UniversalAPI: &universalapi.UniversalAPI{ - AppID: "fakeAPI", - CompStore: compStore, + AppID: "fakeAPI", + Logger: logger.NewLogger("grpc.api.test"), + CompStore: compStore, + Resiliency: resiliency.New(nil), }, - resiliency: resiliency.New(nil), } server, lis := startDaprAPIServer(fakeAPI, "") defer server.Stop() @@ -1852,10 +1969,11 @@ func TestGetBulkState(t *testing.T) { // Setup dapr api server fakeAPI := &api{ UniversalAPI: &universalapi.UniversalAPI{ - AppID: "fakeAPI", - CompStore: compStore, + AppID: "fakeAPI", + Logger: logger.NewLogger("grpc.api.test"), + CompStore: compStore, + Resiliency: resiliency.New(nil), }, - resiliency: resiliency.New(nil), } server, lis := startDaprAPIServer(fakeAPI, "") defer server.Stop() @@ -1955,17 +2073,34 @@ func TestGetBulkState(t *testing.T) { } func TestDeleteState(t *testing.T) { + etagMismatchErr := state.NewETagError(state.ETagMismatch, errors.New("simulated")) + etagInvalidErr := state.NewETagError(state.ETagInvalid, errors.New("simulated")) + fakeStore := &daprt.MockStateStore{} fakeStore.On("Delete", mock.MatchedBy(matchContextInterface), mock.MatchedBy(func(req *state.DeleteRequest) bool { return req.Key == goodStoreKey - })).Return(nil) + }), + ).Return(nil) fakeStore.On("Delete", mock.MatchedBy(matchContextInterface), mock.MatchedBy(func(req *state.DeleteRequest) bool { return req.Key == errorStoreKey - })).Return(errors.New("failed to delete state with key2")) + }), + ).Return(errors.New("failed to delete state with key2")) + fakeStore.On("Delete", + mock.MatchedBy(matchContextInterface), + mock.MatchedBy(func(req *state.DeleteRequest) bool { + return req.Key == etagMismatchKey + }), + ).Return(etagMismatchErr) + fakeStore.On("Delete", + mock.MatchedBy(matchContextInterface), + mock.MatchedBy(func(req *state.DeleteRequest) bool { + return req.Key == etagInvalidKey + }), + ).Return(etagInvalidErr) compStore := compstore.New() compStore.AddStateStore("store1", fakeStore) @@ -1973,10 +2108,11 @@ func TestDeleteState(t *testing.T) { // Setup dapr api server fakeAPI := &api{ UniversalAPI: &universalapi.UniversalAPI{ - AppID: "fakeAPI", - CompStore: compStore, + AppID: "fakeAPI", + Logger: logger.NewLogger("grpc.api.test"), + CompStore: compStore, + Resiliency: resiliency.New(nil), }, - resiliency: resiliency.New(nil), } server, lis := startDaprAPIServer(fakeAPI, "") defer server.Stop() @@ -1987,48 +2123,182 @@ func TestDeleteState(t *testing.T) { client := runtimev1pb.NewDaprClient(clientConn) testCases := []struct { - testName string - storeName string - key string - errorExcepted bool - expectedError codes.Code + testName string + storeName string + key string + expectedCode codes.Code }{ { - testName: "delete state", - storeName: "store1", - key: goodKey, - errorExcepted: false, - expectedError: codes.OK, + testName: "delete state", + storeName: "store1", + key: goodKey, + expectedCode: codes.OK, }, { - testName: "delete store with non-existing store", - storeName: "no-store", - key: goodKey, - errorExcepted: true, - expectedError: codes.InvalidArgument, + testName: "delete state with non-existing store", + storeName: "no-store", + key: goodKey, + expectedCode: codes.InvalidArgument, }, { - testName: "delete store with key but error occurs", - storeName: "store1", - key: "error-key", - errorExcepted: true, - expectedError: codes.Internal, + testName: "delete state with key but error occurs", + storeName: "store1", + key: "error-key", + expectedCode: codes.Internal, + }, + { + testName: "delete state with etag mismatch", + storeName: "store1", + key: "etag-mismatch", + expectedCode: codes.Aborted, + }, + { + testName: "delete state with etag invalid", + storeName: "store1", + key: "etag-invalid", + expectedCode: codes.InvalidArgument, }, } for _, tt := range testCases { t.Run(tt.testName, func(t *testing.T) { - req := &runtimev1pb.DeleteStateRequest{ + _, err := client.DeleteState(context.Background(), &runtimev1pb.DeleteStateRequest{ StoreName: tt.storeName, Key: tt.key, + }) + if tt.expectedCode == codes.OK { + require.NoError(t, err) + } else { + require.Error(t, err) + assert.Equal(t, tt.expectedCode, status.Code(err)) } + }) + } +} - _, err := client.DeleteState(context.Background(), req) - if !tt.errorExcepted { - assert.NoError(t, err, "Expected no error") +func TestDeleteBulkState(t *testing.T) { + etagMismatchErr := state.NewETagError(state.ETagMismatch, errors.New("simulated")) + etagInvalidErr := state.NewETagError(state.ETagInvalid, errors.New("simulated")) + + fakeStore := &daprt.MockStateStore{} + fakeStore.On("BulkDelete", + mock.MatchedBy(matchContextInterface), + mock.MatchedBy(func(req []state.DeleteRequest) bool { + return len(req) == 2 && + req[0].Key == goodStoreKey && + req[1].Key == goodStoreKey+"2" + }), + mock.Anything, + ).Return(nil) + fakeStore.On("BulkDelete", + mock.MatchedBy(matchContextInterface), + mock.MatchedBy(func(req []state.DeleteRequest) bool { + return len(req) == 2 && + req[0].Key == goodStoreKey && + req[1].Key == etagMismatchKey + }), + mock.Anything, + ).Return(errors.Join(state.NewBulkStoreError(etagMismatchKey, etagMismatchErr))) + fakeStore.On("BulkDelete", + mock.MatchedBy(matchContextInterface), + mock.MatchedBy(func(req []state.DeleteRequest) bool { + return len(req) == 3 && + req[0].Key == goodStoreKey && + req[1].Key == etagMismatchKey && + req[2].Key == etagInvalidKey + }), + mock.Anything, + ).Return(errors.Join( + state.NewBulkStoreError(etagMismatchKey, etagMismatchErr), + state.NewBulkStoreError(etagInvalidKey, etagInvalidErr), + )) + + compStore := compstore.New() + compStore.AddStateStore("store1", fakeStore) + + // Setup dapr api server + fakeAPI := &api{ + UniversalAPI: &universalapi.UniversalAPI{ + AppID: "fakeAPI", + Logger: logger.NewLogger("grpc.api.test"), + CompStore: compStore, + Resiliency: resiliency.New(nil), + }, + } + server, lis := startDaprAPIServer(fakeAPI, "") + defer server.Stop() + + clientConn := createTestClient(lis) + defer clientConn.Close() + + client := runtimev1pb.NewDaprClient(clientConn) + + testCases := []struct { + testName string + storeName string + states []*commonv1pb.StateItem + expectedCode codes.Code + }{ + { + testName: "delete state with non-existing store", + storeName: "store2", + expectedCode: codes.InvalidArgument, + }, + { + testName: "delete state", + storeName: "store1", + states: []*commonv1pb.StateItem{ + { + Key: goodKey, + }, + { + Key: goodKey + "2", + }, + }, + expectedCode: codes.OK, + }, + { + testName: "delete state with etag mismatch", + storeName: "store1", + states: []*commonv1pb.StateItem{ + { + Key: goodKey, + }, + { + Key: "etag-mismatch", + }, + }, + expectedCode: codes.Aborted, + }, + { + testName: "delete state with etag mismatch and etag invalid", + storeName: "store1", + states: []*commonv1pb.StateItem{ + { + Key: goodKey, + }, + { + Key: "etag-mismatch", + }, + { + Key: "etag-invalid", + }, + }, + expectedCode: codes.InvalidArgument, + }, + } + + for _, tt := range testCases { + t.Run(tt.testName, func(t *testing.T) { + _, err := client.DeleteBulkState(context.Background(), &runtimev1pb.DeleteBulkStateRequest{ + StoreName: tt.storeName, + States: tt.states, + }) + if tt.expectedCode == codes.OK { + require.NoError(t, err) } else { - assert.Error(t, err, "Expected error") - assert.Equal(t, tt.expectedError, status.Code(err)) + require.Error(t, err) + assert.Equal(t, tt.expectedCode, status.Code(err)) } }) } @@ -2371,6 +2641,7 @@ func TestTransactionStateStoreNotConfigured(t *testing.T) { server, lis := startDaprAPIServer(&api{ UniversalAPI: &universalapi.UniversalAPI{ AppID: "fakeAPI", + Logger: logger.NewLogger("grpc.api.test"), CompStore: compstore.New(), }, }, "") @@ -2390,6 +2661,7 @@ func TestTransactionStateStoreNotImplemented(t *testing.T) { server, lis := startDaprAPIServer(&api{ UniversalAPI: &universalapi.UniversalAPI{ AppID: "fakeAPI", + Logger: logger.NewLogger("grpc.api.test"), CompStore: compStore, }, }, "") @@ -2436,6 +2708,7 @@ func TestExecuteStateTransaction(t *testing.T) { // Setup dapr api server fakeAPI := &api{ UniversalAPI: &universalapi.UniversalAPI{ + Logger: logger.NewLogger("grpc.api.test"), AppID: "fakeAPI", CompStore: compStore, }, diff --git a/pkg/grpc/universalapi/api_state_query.go b/pkg/grpc/universalapi/api_state_query.go index d662f4d2f58..f3d786f6a48 100644 --- a/pkg/grpc/universalapi/api_state_query.go +++ b/pkg/grpc/universalapi/api_state_query.go @@ -27,7 +27,7 @@ import ( "github.com/dapr/dapr/pkg/resiliency" ) -func (a *UniversalAPI) getStateStore(name string) (state.Store, error) { +func (a *UniversalAPI) GetStateStore(name string) (state.Store, error) { if a.CompStore.StateStoresLen() == 0 { err := messages.ErrStateStoresNotConfigured a.Logger.Debug(err) @@ -45,7 +45,7 @@ func (a *UniversalAPI) getStateStore(name string) (state.Store, error) { } func (a *UniversalAPI) QueryStateAlpha1(ctx context.Context, in *runtimev1pb.QueryStateRequest) (*runtimev1pb.QueryStateResponse, error) { - store, err := a.getStateStore(in.StoreName) + store, err := a.GetStateStore(in.StoreName) if err != nil { // Error has already been logged return nil, err diff --git a/pkg/http/api.go b/pkg/http/api.go index 114cd512b14..63db766f579 100644 --- a/pkg/http/api.go +++ b/pkg/http/api.go @@ -1175,23 +1175,17 @@ func (a *api) onPostState(reqCtx *fasthttp.RequestCtx) { } start := time.Now() - policyRunner := resiliency.NewRunner[struct{}](reqCtx, + err = stateLoader.PerformBulkStoreOperation(reqCtx, reqs, a.resiliency.ComponentOutboundPolicy(storeName, resiliency.Statestore), + state.BulkStoreOpts{}, + store.Set, + store.BulkSet, ) - _, err = policyRunner(func(ctx context.Context) (struct{}, error) { - // If there's a single request, perform it in non-bulk - if len(reqs) == 1 { - return struct{}{}, store.Set(ctx, &reqs[0]) - } - return struct{}{}, store.BulkSet(ctx, reqs) - }) elapsed := diag.ElapsedSince(start) diag.DefaultComponentMonitoring.StateInvoked(reqCtx, storeName, diag.Set, err == nil, elapsed) if err != nil { - storeName := a.getStateStoreName(reqCtx) - statusCode, errMsg, resp := a.stateErrorResponse(err, "ERR_STATE_SAVE") resp.Message = fmt.Sprintf(messages.ErrStateSave, storeName, errMsg) @@ -1205,10 +1199,7 @@ func (a *api) onPostState(reqCtx *fasthttp.RequestCtx) { // stateErrorResponse takes a state store error and returns a corresponding status code, error message and modified user error. func (a *api) stateErrorResponse(err error, errorCode string) (int, string, ErrorResponse) { - var message string - var code int - var etag bool - etag, code, message = a.etagError(err) + etag, code, message := a.etagError(err) r := ErrorResponse{ ErrorCode: errorCode, @@ -1224,17 +1215,15 @@ func (a *api) stateErrorResponse(err error, errorCode string) (int, string, Erro // etagError checks if the error from the state store is an etag error and returns a bool for indication, // an status code and an error message. func (a *api) etagError(err error) (bool, int, string) { - e, ok := err.(*state.ETagError) - if !ok { - return false, -1, "" - } - switch e.Kind() { - case state.ETagMismatch: - return true, fasthttp.StatusConflict, e.Error() - case state.ETagInvalid: - return true, fasthttp.StatusBadRequest, e.Error() + var etagErr *state.ETagError + if errors.As(err, &etagErr) { + switch etagErr.Kind() { + case state.ETagMismatch: + return true, fasthttp.StatusConflict, etagErr.Error() + case state.ETagInvalid: + return true, fasthttp.StatusBadRequest, etagErr.Error() + } } - return false, -1, "" } diff --git a/pkg/http/api_test.go b/pkg/http/api_test.go index a1a863ddb08..46313c2e52f 100644 --- a/pkg/http/api_test.go +++ b/pkg/http/api_test.go @@ -4475,7 +4475,62 @@ func TestV1StateEndpoints(t *testing.T) { // act resp := fakeServer.DoRequest("POST", apiPath, b, nil) // assert - assert.Equal(t, 500, resp.StatusCode, "updating existing key with wrong etag should fail") + assert.Equal(t, 409, resp.StatusCode, "updating existing key with wrong etag should fail") + }) + + t.Run("Update bulk state - No ETag", func(t *testing.T) { + apiPath := fmt.Sprintf("v1.0/state/%s", storeName) + request := []state.SetRequest{ + {Key: "good-key"}, + {Key: "good-key2"}, + } + b, _ := json.Marshal(request) + // act + resp := fakeServer.DoRequest("POST", apiPath, b, nil) + // assert + assert.Equal(t, 204, resp.StatusCode) + assert.Equal(t, "", string(resp.RawBody)) + }) + + t.Run("Update bulk state - State Error", func(t *testing.T) { + apiPath := fmt.Sprintf("v1.0/state/%s", storeName) + request := []state.SetRequest{ + {Key: "good-key"}, + {Key: "error-key"}, + } + b, _ := json.Marshal(request) + // act + resp := fakeServer.DoRequest("POST", apiPath, b, nil) + // assert + assert.Equal(t, 500, resp.StatusCode) + assert.Equal(t, "ERR_STATE_SAVE", resp.ErrorBody["errorCode"]) + }) + + t.Run("Update bulk state - Matching ETag", func(t *testing.T) { + apiPath := fmt.Sprintf("v1.0/state/%s", storeName) + request := []state.SetRequest{ + {Key: "good-key", ETag: &etag}, + {Key: "good-key2", ETag: &etag}, + } + b, _ := json.Marshal(request) + // act + resp := fakeServer.DoRequest("POST", apiPath, b, nil) + // assert + assert.Equal(t, 204, resp.StatusCode) + assert.Equal(t, "", string(resp.RawBody)) + }) + + t.Run("Update bulk state - One has invalid ETag", func(t *testing.T) { + apiPath := fmt.Sprintf("v1.0/state/%s", storeName) + request := []state.SetRequest{ + {Key: "good-key", ETag: &etag}, + {Key: "good-key2", ETag: ptr.Of("BAD ETAG")}, + } + b, _ := json.Marshal(request) + // act + resp := fakeServer.DoRequest("POST", apiPath, b, nil) + // assert + assert.Equal(t, 409, resp.StatusCode) }) t.Run("Delete state - No ETag", func(t *testing.T) { @@ -4501,7 +4556,7 @@ func TestV1StateEndpoints(t *testing.T) { // act resp := fakeServer.DoRequest("DELETE", apiPath, nil, nil, "If-Match", "BAD ETAG") // assert - assert.Equal(t, 500, resp.StatusCode, "updating existing key with wrong etag should fail") + assert.Equal(t, 409, resp.StatusCode, "updating existing key with wrong etag should fail") }) t.Run("Bulk state get - Empty request", func(t *testing.T) { @@ -4925,7 +4980,7 @@ func (c fakeStateStore) Ping() error { func (c fakeStateStore) Delete(ctx context.Context, req *state.DeleteRequest) error { if req.Key == "good-key" { if req.ETag != nil && *req.ETag != "`~!@#$%^&*()_+-={}[]|\\:\";'<>?,./'" { - return errors.New("ETag mismatch") + return state.NewETagError(state.ETagMismatch, errors.New("ETag mismatch")) } return nil } @@ -4957,9 +5012,9 @@ func (c fakeStateStore) Features() []state.Feature { } func (c fakeStateStore) Set(ctx context.Context, req *state.SetRequest) error { - if req.Key == "good-key" { + if req.Key == "good-key" || req.Key == "good-key2" { if req.ETag != nil && *req.ETag != "`~!@#$%^&*()_+-={}[]|\\:\";'<>?,./'" { - return errors.New("ETag mismatch") + return state.NewETagError(state.ETagMismatch, errors.New("ETag mismatch")) } return nil } diff --git a/pkg/messages/predefined.go b/pkg/messages/predefined.go index 88d851af73e..c7fc9da2408 100644 --- a/pkg/messages/predefined.go +++ b/pkg/messages/predefined.go @@ -26,9 +26,10 @@ const ( ErrMalformedRequestData = "can't serialize request data field: %s" // State. - ErrStateGet = "fail to get %s from state store %s: %s" - ErrStateDelete = "failed deleting state with key %s: %s" - ErrStateSave = "failed saving state in state store %s: %s" + ErrStateGet = "fail to get %s from state store %s: %s" + ErrStateDelete = "failed deleting state with key %s: %s" + ErrStateSave = "failed saving state in state store %s: %s" + ErrStateDeleteBulk = "failed deleting state in state store %s: %s" // StateTransaction. ErrStateStoreNotSupported = "state store %s doesn't support transaction" diff --git a/pkg/proto/components/v1/state.pb.go b/pkg/proto/components/v1/state.pb.go index 55f5a10ddd5..032d1616d95 100644 --- a/pkg/proto/components/v1/state.pb.go +++ b/pkg/proto/components/v1/state.pb.go @@ -1333,18 +1333,66 @@ func (*SetResponse) Descriptor() ([]byte, []int) { return file_dapr_proto_components_v1_state_proto_rawDescGZIP(), []int{18} } +type BulkDeleteRequestOptions struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Parallelism int64 `protobuf:"varint,1,opt,name=parallelism,proto3" json:"parallelism,omitempty"` +} + +func (x *BulkDeleteRequestOptions) Reset() { + *x = BulkDeleteRequestOptions{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_components_v1_state_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BulkDeleteRequestOptions) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BulkDeleteRequestOptions) ProtoMessage() {} + +func (x *BulkDeleteRequestOptions) ProtoReflect() protoreflect.Message { + mi := &file_dapr_proto_components_v1_state_proto_msgTypes[19] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use BulkDeleteRequestOptions.ProtoReflect.Descriptor instead. +func (*BulkDeleteRequestOptions) Descriptor() ([]byte, []int) { + return file_dapr_proto_components_v1_state_proto_rawDescGZIP(), []int{19} +} + +func (x *BulkDeleteRequestOptions) GetParallelism() int64 { + if x != nil { + return x.Parallelism + } + return 0 +} + type BulkDeleteRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Items []*DeleteRequest `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"` + Items []*DeleteRequest `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"` + Options *BulkDeleteRequestOptions `protobuf:"bytes,2,opt,name=options,proto3" json:"options,omitempty"` } func (x *BulkDeleteRequest) Reset() { *x = BulkDeleteRequest{} if protoimpl.UnsafeEnabled { - mi := &file_dapr_proto_components_v1_state_proto_msgTypes[19] + mi := &file_dapr_proto_components_v1_state_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1357,7 +1405,7 @@ func (x *BulkDeleteRequest) String() string { func (*BulkDeleteRequest) ProtoMessage() {} func (x *BulkDeleteRequest) ProtoReflect() protoreflect.Message { - mi := &file_dapr_proto_components_v1_state_proto_msgTypes[19] + mi := &file_dapr_proto_components_v1_state_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1370,7 +1418,7 @@ func (x *BulkDeleteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use BulkDeleteRequest.ProtoReflect.Descriptor instead. func (*BulkDeleteRequest) Descriptor() ([]byte, []int) { - return file_dapr_proto_components_v1_state_proto_rawDescGZIP(), []int{19} + return file_dapr_proto_components_v1_state_proto_rawDescGZIP(), []int{20} } func (x *BulkDeleteRequest) GetItems() []*DeleteRequest { @@ -1380,6 +1428,13 @@ func (x *BulkDeleteRequest) GetItems() []*DeleteRequest { return nil } +func (x *BulkDeleteRequest) GetOptions() *BulkDeleteRequestOptions { + if x != nil { + return x.Options + } + return nil +} + // reserved for future-proof extensibility type BulkDeleteResponse struct { state protoimpl.MessageState @@ -1390,7 +1445,7 @@ type BulkDeleteResponse struct { func (x *BulkDeleteResponse) Reset() { *x = BulkDeleteResponse{} if protoimpl.UnsafeEnabled { - mi := &file_dapr_proto_components_v1_state_proto_msgTypes[20] + mi := &file_dapr_proto_components_v1_state_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1403,7 +1458,7 @@ func (x *BulkDeleteResponse) String() string { func (*BulkDeleteResponse) ProtoMessage() {} func (x *BulkDeleteResponse) ProtoReflect() protoreflect.Message { - mi := &file_dapr_proto_components_v1_state_proto_msgTypes[20] + mi := &file_dapr_proto_components_v1_state_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1416,7 +1471,7 @@ func (x *BulkDeleteResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use BulkDeleteResponse.ProtoReflect.Descriptor instead. func (*BulkDeleteResponse) Descriptor() ([]byte, []int) { - return file_dapr_proto_components_v1_state_proto_rawDescGZIP(), []int{20} + return file_dapr_proto_components_v1_state_proto_rawDescGZIP(), []int{21} } type BulkGetRequestOptions struct { @@ -1430,7 +1485,7 @@ type BulkGetRequestOptions struct { func (x *BulkGetRequestOptions) Reset() { *x = BulkGetRequestOptions{} if protoimpl.UnsafeEnabled { - mi := &file_dapr_proto_components_v1_state_proto_msgTypes[21] + mi := &file_dapr_proto_components_v1_state_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1443,7 +1498,7 @@ func (x *BulkGetRequestOptions) String() string { func (*BulkGetRequestOptions) ProtoMessage() {} func (x *BulkGetRequestOptions) ProtoReflect() protoreflect.Message { - mi := &file_dapr_proto_components_v1_state_proto_msgTypes[21] + mi := &file_dapr_proto_components_v1_state_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1456,7 +1511,7 @@ func (x *BulkGetRequestOptions) ProtoReflect() protoreflect.Message { // Deprecated: Use BulkGetRequestOptions.ProtoReflect.Descriptor instead. func (*BulkGetRequestOptions) Descriptor() ([]byte, []int) { - return file_dapr_proto_components_v1_state_proto_rawDescGZIP(), []int{21} + return file_dapr_proto_components_v1_state_proto_rawDescGZIP(), []int{22} } func (x *BulkGetRequestOptions) GetParallelism() int64 { @@ -1478,7 +1533,7 @@ type BulkGetRequest struct { func (x *BulkGetRequest) Reset() { *x = BulkGetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_dapr_proto_components_v1_state_proto_msgTypes[22] + mi := &file_dapr_proto_components_v1_state_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1491,7 +1546,7 @@ func (x *BulkGetRequest) String() string { func (*BulkGetRequest) ProtoMessage() {} func (x *BulkGetRequest) ProtoReflect() protoreflect.Message { - mi := &file_dapr_proto_components_v1_state_proto_msgTypes[22] + mi := &file_dapr_proto_components_v1_state_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1504,7 +1559,7 @@ func (x *BulkGetRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use BulkGetRequest.ProtoReflect.Descriptor instead. func (*BulkGetRequest) Descriptor() ([]byte, []int) { - return file_dapr_proto_components_v1_state_proto_rawDescGZIP(), []int{22} + return file_dapr_proto_components_v1_state_proto_rawDescGZIP(), []int{23} } func (x *BulkGetRequest) GetItems() []*GetRequest { @@ -1543,7 +1598,7 @@ type BulkStateItem struct { func (x *BulkStateItem) Reset() { *x = BulkStateItem{} if protoimpl.UnsafeEnabled { - mi := &file_dapr_proto_components_v1_state_proto_msgTypes[23] + mi := &file_dapr_proto_components_v1_state_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1556,7 +1611,7 @@ func (x *BulkStateItem) String() string { func (*BulkStateItem) ProtoMessage() {} func (x *BulkStateItem) ProtoReflect() protoreflect.Message { - mi := &file_dapr_proto_components_v1_state_proto_msgTypes[23] + mi := &file_dapr_proto_components_v1_state_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1569,7 +1624,7 @@ func (x *BulkStateItem) ProtoReflect() protoreflect.Message { // Deprecated: Use BulkStateItem.ProtoReflect.Descriptor instead. func (*BulkStateItem) Descriptor() ([]byte, []int) { - return file_dapr_proto_components_v1_state_proto_rawDescGZIP(), []int{23} + return file_dapr_proto_components_v1_state_proto_rawDescGZIP(), []int{24} } func (x *BulkStateItem) GetKey() string { @@ -1625,7 +1680,7 @@ type BulkGetResponse struct { func (x *BulkGetResponse) Reset() { *x = BulkGetResponse{} if protoimpl.UnsafeEnabled { - mi := &file_dapr_proto_components_v1_state_proto_msgTypes[24] + mi := &file_dapr_proto_components_v1_state_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1638,7 +1693,7 @@ func (x *BulkGetResponse) String() string { func (*BulkGetResponse) ProtoMessage() {} func (x *BulkGetResponse) ProtoReflect() protoreflect.Message { - mi := &file_dapr_proto_components_v1_state_proto_msgTypes[24] + mi := &file_dapr_proto_components_v1_state_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1651,7 +1706,7 @@ func (x *BulkGetResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use BulkGetResponse.ProtoReflect.Descriptor instead. func (*BulkGetResponse) Descriptor() ([]byte, []int) { - return file_dapr_proto_components_v1_state_proto_rawDescGZIP(), []int{24} + return file_dapr_proto_components_v1_state_proto_rawDescGZIP(), []int{25} } func (x *BulkGetResponse) GetItems() []*BulkStateItem { @@ -1661,18 +1716,66 @@ func (x *BulkGetResponse) GetItems() []*BulkStateItem { return nil } +type BulkSetRequestOptions struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Parallelism int64 `protobuf:"varint,1,opt,name=parallelism,proto3" json:"parallelism,omitempty"` +} + +func (x *BulkSetRequestOptions) Reset() { + *x = BulkSetRequestOptions{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_components_v1_state_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BulkSetRequestOptions) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BulkSetRequestOptions) ProtoMessage() {} + +func (x *BulkSetRequestOptions) ProtoReflect() protoreflect.Message { + mi := &file_dapr_proto_components_v1_state_proto_msgTypes[26] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use BulkSetRequestOptions.ProtoReflect.Descriptor instead. +func (*BulkSetRequestOptions) Descriptor() ([]byte, []int) { + return file_dapr_proto_components_v1_state_proto_rawDescGZIP(), []int{26} +} + +func (x *BulkSetRequestOptions) GetParallelism() int64 { + if x != nil { + return x.Parallelism + } + return 0 +} + type BulkSetRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Items []*SetRequest `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"` + Items []*SetRequest `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"` + Options *BulkSetRequestOptions `protobuf:"bytes,2,opt,name=options,proto3" json:"options,omitempty"` } func (x *BulkSetRequest) Reset() { *x = BulkSetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_dapr_proto_components_v1_state_proto_msgTypes[25] + mi := &file_dapr_proto_components_v1_state_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1685,7 +1788,7 @@ func (x *BulkSetRequest) String() string { func (*BulkSetRequest) ProtoMessage() {} func (x *BulkSetRequest) ProtoReflect() protoreflect.Message { - mi := &file_dapr_proto_components_v1_state_proto_msgTypes[25] + mi := &file_dapr_proto_components_v1_state_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1698,7 +1801,7 @@ func (x *BulkSetRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use BulkSetRequest.ProtoReflect.Descriptor instead. func (*BulkSetRequest) Descriptor() ([]byte, []int) { - return file_dapr_proto_components_v1_state_proto_rawDescGZIP(), []int{25} + return file_dapr_proto_components_v1_state_proto_rawDescGZIP(), []int{27} } func (x *BulkSetRequest) GetItems() []*SetRequest { @@ -1708,6 +1811,13 @@ func (x *BulkSetRequest) GetItems() []*SetRequest { return nil } +func (x *BulkSetRequest) GetOptions() *BulkSetRequestOptions { + if x != nil { + return x.Options + } + return nil +} + // reserved for future-proof extensibility type BulkSetResponse struct { state protoimpl.MessageState @@ -1718,7 +1828,7 @@ type BulkSetResponse struct { func (x *BulkSetResponse) Reset() { *x = BulkSetResponse{} if protoimpl.UnsafeEnabled { - mi := &file_dapr_proto_components_v1_state_proto_msgTypes[26] + mi := &file_dapr_proto_components_v1_state_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1731,7 +1841,7 @@ func (x *BulkSetResponse) String() string { func (*BulkSetResponse) ProtoMessage() {} func (x *BulkSetResponse) ProtoReflect() protoreflect.Message { - mi := &file_dapr_proto_components_v1_state_proto_msgTypes[26] + mi := &file_dapr_proto_components_v1_state_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1744,7 +1854,7 @@ func (x *BulkSetResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use BulkSetResponse.ProtoReflect.Descriptor instead. func (*BulkSetResponse) Descriptor() ([]byte, []int) { - return file_dapr_proto_components_v1_state_proto_rawDescGZIP(), []int{26} + return file_dapr_proto_components_v1_state_proto_rawDescGZIP(), []int{28} } var File_dapr_proto_components_v1_state_proto protoreflect.FileDescriptor @@ -1964,132 +2074,149 @@ var file_dapr_proto_components_v1_state_proto_rawDesc = []byte{ 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x0d, 0x0a, 0x0b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x52, 0x0a, 0x11, 0x42, 0x75, 0x6c, 0x6b, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3d, 0x0a, 0x05, 0x69, 0x74, - 0x65, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x64, 0x61, 0x70, 0x72, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3c, 0x0a, 0x18, 0x42, 0x75, 0x6c, 0x6b, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, + 0x69, 0x73, 0x6d, 0x22, 0xa0, 0x01, 0x0a, 0x11, 0x42, 0x75, 0x6c, 0x6b, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3d, 0x0a, 0x05, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, + 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x4c, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x14, 0x0a, 0x12, 0x42, 0x75, 0x6c, - 0x6b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x39, 0x0a, 0x15, 0x42, 0x75, 0x6c, 0x6b, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x61, - 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x70, - 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x22, 0x97, 0x01, 0x0a, 0x0e, 0x42, - 0x75, 0x6c, 0x6b, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3a, 0x0a, - 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x64, - 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x49, 0x0a, 0x07, 0x6f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x64, 0x61, 0x70, - 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, - 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x75, 0x6c, 0x6b, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xb2, 0x02, 0x0a, 0x0d, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x32, 0x0a, 0x04, - 0x65, 0x74, 0x61, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x64, 0x61, 0x70, - 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, - 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x74, 0x61, 0x67, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, - 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x51, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, + 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x75, 0x6c, 0x6b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x14, 0x0a, 0x12, 0x42, 0x75, 0x6c, 0x6b, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x39, 0x0a, 0x15, + 0x42, 0x75, 0x6c, 0x6b, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, + 0x6c, 0x69, 0x73, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x61, + 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x22, 0x97, 0x01, 0x0a, 0x0e, 0x42, 0x75, 0x6c, 0x6b, + 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3a, 0x0a, 0x05, 0x69, 0x74, + 0x65, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x64, 0x61, 0x70, 0x72, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, + 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x49, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, + 0x76, 0x31, 0x2e, 0x42, 0x75, 0x6c, 0x6b, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x22, 0xb2, 0x02, 0x0a, 0x0d, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x49, + 0x74, 0x65, 0x6d, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x32, 0x0a, 0x04, 0x65, 0x74, 0x61, + 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, + 0x76, 0x31, 0x2e, 0x45, 0x74, 0x61, 0x67, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x12, 0x14, 0x0a, + 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x12, 0x51, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, + 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, + 0x2e, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x2e, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x50, 0x0a, 0x0f, 0x42, 0x75, 0x6c, 0x6b, 0x47, 0x65, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x05, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x49, 0x74, 0x65, - 0x6d, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x1a, 0x3b, 0x0a, 0x0d, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x50, 0x0a, 0x0f, 0x42, 0x75, 0x6c, - 0x6b, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x05, - 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x64, 0x61, + 0x6d, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x39, 0x0a, 0x15, 0x42, 0x75, 0x6c, 0x6b, + 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, + 0x69, 0x73, 0x6d, 0x22, 0x97, 0x01, 0x0a, 0x0e, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x65, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3a, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, + 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x05, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x12, 0x49, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x42, + 0x75, 0x6c, 0x6b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x11, 0x0a, + 0x0f, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x32, 0x71, 0x0a, 0x13, 0x51, 0x75, 0x65, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x5a, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x12, 0x26, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, + 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x32, 0x92, 0x01, 0x0a, 0x17, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x12, + 0x77, 0x0a, 0x08, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x12, 0x33, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x49, 0x74, 0x65, 0x6d, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x4c, 0x0a, 0x0e, 0x42, - 0x75, 0x6c, 0x6b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3a, 0x0a, - 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x64, - 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x11, 0x0a, 0x0f, 0x42, 0x75, 0x6c, - 0x6b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x71, 0x0a, 0x13, - 0x51, 0x75, 0x65, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x53, 0x74, - 0x6f, 0x72, 0x65, 0x12, 0x5a, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x26, 0x2e, 0x64, + 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x34, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x32, 0xdd, 0x06, 0x0a, 0x0a, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x57, 0x0a, 0x04, 0x49, 0x6e, 0x69, 0x74, 0x12, + 0x25, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, + 0x31, 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x63, 0x0a, 0x08, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x29, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x32, - 0x92, 0x01, 0x0a, 0x17, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, - 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x77, 0x0a, 0x08, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x12, 0x33, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, + 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, - 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x64, - 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x32, 0xdd, 0x06, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x65, 0x53, 0x74, - 0x6f, 0x72, 0x65, 0x12, 0x57, 0x0a, 0x04, 0x49, 0x6e, 0x69, 0x74, 0x12, 0x25, 0x2e, 0x64, 0x61, - 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, - 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x63, 0x0a, 0x08, - 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x29, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, + 0x76, 0x31, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, + 0x27, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, - 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x46, - 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x5d, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x27, 0x2e, 0x64, 0x61, + 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x24, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x54, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x24, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, + 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x25, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x03, 0x53, 0x65, + 0x74, 0x12, 0x24, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, + 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x57, 0x0a, 0x04, 0x50, 0x69, 0x6e, 0x67, 0x12, 0x25, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x26, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x69, 0x0a, 0x0a, 0x42, 0x75, 0x6c, + 0x6b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x2b, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, - 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x03, 0x53, 0x65, 0x74, 0x12, 0x24, 0x2e, - 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x53, - 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x04, - 0x50, 0x69, 0x6e, 0x67, 0x12, 0x25, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x76, 0x31, 0x2e, 0x42, 0x75, 0x6c, 0x6b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, - 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x64, 0x61, - 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x69, 0x0a, 0x0a, 0x42, 0x75, 0x6c, 0x6b, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x12, 0x2b, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x42, - 0x75, 0x6c, 0x6b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2c, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, - 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x75, 0x6c, 0x6b, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x60, 0x0a, 0x07, 0x42, 0x75, 0x6c, 0x6b, 0x47, 0x65, 0x74, 0x12, 0x28, 0x2e, 0x64, 0x61, + 0x42, 0x75, 0x6c, 0x6b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x07, 0x42, 0x75, 0x6c, 0x6b, 0x47, 0x65, 0x74, 0x12, + 0x28, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x75, 0x6c, 0x6b, 0x47, + 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x64, 0x61, 0x70, 0x72, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x75, 0x6c, 0x6b, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x07, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x65, + 0x74, 0x12, 0x28, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x75, 0x6c, + 0x6b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x75, 0x6c, 0x6b, 0x47, 0x65, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, - 0x2e, 0x42, 0x75, 0x6c, 0x6b, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x60, 0x0a, 0x07, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x65, 0x74, 0x12, 0x28, 0x2e, - 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x65, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, - 0x76, 0x31, 0x2e, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x42, 0x39, 0x5a, 0x37, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x64, 0x61, 0x70, 0x72, 0x2f, 0x64, 0x61, 0x70, 0x72, 0x2f, 0x70, 0x6b, 0x67, - 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x73, 0x2f, 0x76, 0x31, 0x3b, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x65, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x39, 0x5a, 0x37, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x64, 0x61, 0x70, 0x72, 0x2f, 0x64, 0x61, 0x70, 0x72, + 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x76, 0x31, 0x3b, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2105,7 +2232,7 @@ func file_dapr_proto_components_v1_state_proto_rawDescGZIP() []byte { } var file_dapr_proto_components_v1_state_proto_enumTypes = make([]protoimpl.EnumInfo, 3) -var file_dapr_proto_components_v1_state_proto_msgTypes = make([]protoimpl.MessageInfo, 36) +var file_dapr_proto_components_v1_state_proto_msgTypes = make([]protoimpl.MessageInfo, 38) var file_dapr_proto_components_v1_state_proto_goTypes = []interface{}{ (Sorting_Order)(0), // 0: dapr.proto.components.v1.Sorting.Order (StateOptions_StateConcurrency)(0), // 1: dapr.proto.components.v1.StateOptions.StateConcurrency @@ -2129,92 +2256,96 @@ var file_dapr_proto_components_v1_state_proto_goTypes = []interface{}{ (*DeleteResponse)(nil), // 19: dapr.proto.components.v1.DeleteResponse (*SetRequest)(nil), // 20: dapr.proto.components.v1.SetRequest (*SetResponse)(nil), // 21: dapr.proto.components.v1.SetResponse - (*BulkDeleteRequest)(nil), // 22: dapr.proto.components.v1.BulkDeleteRequest - (*BulkDeleteResponse)(nil), // 23: dapr.proto.components.v1.BulkDeleteResponse - (*BulkGetRequestOptions)(nil), // 24: dapr.proto.components.v1.BulkGetRequestOptions - (*BulkGetRequest)(nil), // 25: dapr.proto.components.v1.BulkGetRequest - (*BulkStateItem)(nil), // 26: dapr.proto.components.v1.BulkStateItem - (*BulkGetResponse)(nil), // 27: dapr.proto.components.v1.BulkGetResponse - (*BulkSetRequest)(nil), // 28: dapr.proto.components.v1.BulkSetRequest - (*BulkSetResponse)(nil), // 29: dapr.proto.components.v1.BulkSetResponse - nil, // 30: dapr.proto.components.v1.Query.FilterEntry - nil, // 31: dapr.proto.components.v1.QueryRequest.MetadataEntry - nil, // 32: dapr.proto.components.v1.QueryResponse.MetadataEntry - nil, // 33: dapr.proto.components.v1.TransactionalStateRequest.MetadataEntry - nil, // 34: dapr.proto.components.v1.GetRequest.MetadataEntry - nil, // 35: dapr.proto.components.v1.GetResponse.MetadataEntry - nil, // 36: dapr.proto.components.v1.DeleteRequest.MetadataEntry - nil, // 37: dapr.proto.components.v1.SetRequest.MetadataEntry - nil, // 38: dapr.proto.components.v1.BulkStateItem.MetadataEntry - (*MetadataRequest)(nil), // 39: dapr.proto.components.v1.MetadataRequest - (*anypb.Any)(nil), // 40: google.protobuf.Any - (*FeaturesRequest)(nil), // 41: dapr.proto.components.v1.FeaturesRequest - (*PingRequest)(nil), // 42: dapr.proto.components.v1.PingRequest - (*FeaturesResponse)(nil), // 43: dapr.proto.components.v1.FeaturesResponse - (*PingResponse)(nil), // 44: dapr.proto.components.v1.PingResponse + (*BulkDeleteRequestOptions)(nil), // 22: dapr.proto.components.v1.BulkDeleteRequestOptions + (*BulkDeleteRequest)(nil), // 23: dapr.proto.components.v1.BulkDeleteRequest + (*BulkDeleteResponse)(nil), // 24: dapr.proto.components.v1.BulkDeleteResponse + (*BulkGetRequestOptions)(nil), // 25: dapr.proto.components.v1.BulkGetRequestOptions + (*BulkGetRequest)(nil), // 26: dapr.proto.components.v1.BulkGetRequest + (*BulkStateItem)(nil), // 27: dapr.proto.components.v1.BulkStateItem + (*BulkGetResponse)(nil), // 28: dapr.proto.components.v1.BulkGetResponse + (*BulkSetRequestOptions)(nil), // 29: dapr.proto.components.v1.BulkSetRequestOptions + (*BulkSetRequest)(nil), // 30: dapr.proto.components.v1.BulkSetRequest + (*BulkSetResponse)(nil), // 31: dapr.proto.components.v1.BulkSetResponse + nil, // 32: dapr.proto.components.v1.Query.FilterEntry + nil, // 33: dapr.proto.components.v1.QueryRequest.MetadataEntry + nil, // 34: dapr.proto.components.v1.QueryResponse.MetadataEntry + nil, // 35: dapr.proto.components.v1.TransactionalStateRequest.MetadataEntry + nil, // 36: dapr.proto.components.v1.GetRequest.MetadataEntry + nil, // 37: dapr.proto.components.v1.GetResponse.MetadataEntry + nil, // 38: dapr.proto.components.v1.DeleteRequest.MetadataEntry + nil, // 39: dapr.proto.components.v1.SetRequest.MetadataEntry + nil, // 40: dapr.proto.components.v1.BulkStateItem.MetadataEntry + (*MetadataRequest)(nil), // 41: dapr.proto.components.v1.MetadataRequest + (*anypb.Any)(nil), // 42: google.protobuf.Any + (*FeaturesRequest)(nil), // 43: dapr.proto.components.v1.FeaturesRequest + (*PingRequest)(nil), // 44: dapr.proto.components.v1.PingRequest + (*FeaturesResponse)(nil), // 45: dapr.proto.components.v1.FeaturesResponse + (*PingResponse)(nil), // 46: dapr.proto.components.v1.PingResponse } var file_dapr_proto_components_v1_state_proto_depIdxs = []int32{ 0, // 0: dapr.proto.components.v1.Sorting.order:type_name -> dapr.proto.components.v1.Sorting.Order - 30, // 1: dapr.proto.components.v1.Query.filter:type_name -> dapr.proto.components.v1.Query.FilterEntry + 32, // 1: dapr.proto.components.v1.Query.filter:type_name -> dapr.proto.components.v1.Query.FilterEntry 3, // 2: dapr.proto.components.v1.Query.sort:type_name -> dapr.proto.components.v1.Sorting 4, // 3: dapr.proto.components.v1.Query.pagination:type_name -> dapr.proto.components.v1.Pagination 5, // 4: dapr.proto.components.v1.QueryRequest.query:type_name -> dapr.proto.components.v1.Query - 31, // 5: dapr.proto.components.v1.QueryRequest.metadata:type_name -> dapr.proto.components.v1.QueryRequest.MetadataEntry + 33, // 5: dapr.proto.components.v1.QueryRequest.metadata:type_name -> dapr.proto.components.v1.QueryRequest.MetadataEntry 12, // 6: dapr.proto.components.v1.QueryItem.etag:type_name -> dapr.proto.components.v1.Etag 7, // 7: dapr.proto.components.v1.QueryResponse.items:type_name -> dapr.proto.components.v1.QueryItem - 32, // 8: dapr.proto.components.v1.QueryResponse.metadata:type_name -> dapr.proto.components.v1.QueryResponse.MetadataEntry + 34, // 8: dapr.proto.components.v1.QueryResponse.metadata:type_name -> dapr.proto.components.v1.QueryResponse.MetadataEntry 18, // 9: dapr.proto.components.v1.TransactionalStateOperation.delete:type_name -> dapr.proto.components.v1.DeleteRequest 20, // 10: dapr.proto.components.v1.TransactionalStateOperation.set:type_name -> dapr.proto.components.v1.SetRequest 9, // 11: dapr.proto.components.v1.TransactionalStateRequest.operations:type_name -> dapr.proto.components.v1.TransactionalStateOperation - 33, // 12: dapr.proto.components.v1.TransactionalStateRequest.metadata:type_name -> dapr.proto.components.v1.TransactionalStateRequest.MetadataEntry + 35, // 12: dapr.proto.components.v1.TransactionalStateRequest.metadata:type_name -> dapr.proto.components.v1.TransactionalStateRequest.MetadataEntry 1, // 13: dapr.proto.components.v1.StateOptions.concurrency:type_name -> dapr.proto.components.v1.StateOptions.StateConcurrency 2, // 14: dapr.proto.components.v1.StateOptions.consistency:type_name -> dapr.proto.components.v1.StateOptions.StateConsistency - 39, // 15: dapr.proto.components.v1.InitRequest.metadata:type_name -> dapr.proto.components.v1.MetadataRequest - 34, // 16: dapr.proto.components.v1.GetRequest.metadata:type_name -> dapr.proto.components.v1.GetRequest.MetadataEntry + 41, // 15: dapr.proto.components.v1.InitRequest.metadata:type_name -> dapr.proto.components.v1.MetadataRequest + 36, // 16: dapr.proto.components.v1.GetRequest.metadata:type_name -> dapr.proto.components.v1.GetRequest.MetadataEntry 2, // 17: dapr.proto.components.v1.GetRequest.consistency:type_name -> dapr.proto.components.v1.StateOptions.StateConsistency 12, // 18: dapr.proto.components.v1.GetResponse.etag:type_name -> dapr.proto.components.v1.Etag - 35, // 19: dapr.proto.components.v1.GetResponse.metadata:type_name -> dapr.proto.components.v1.GetResponse.MetadataEntry + 37, // 19: dapr.proto.components.v1.GetResponse.metadata:type_name -> dapr.proto.components.v1.GetResponse.MetadataEntry 12, // 20: dapr.proto.components.v1.DeleteRequest.etag:type_name -> dapr.proto.components.v1.Etag - 36, // 21: dapr.proto.components.v1.DeleteRequest.metadata:type_name -> dapr.proto.components.v1.DeleteRequest.MetadataEntry + 38, // 21: dapr.proto.components.v1.DeleteRequest.metadata:type_name -> dapr.proto.components.v1.DeleteRequest.MetadataEntry 13, // 22: dapr.proto.components.v1.DeleteRequest.options:type_name -> dapr.proto.components.v1.StateOptions 12, // 23: dapr.proto.components.v1.SetRequest.etag:type_name -> dapr.proto.components.v1.Etag - 37, // 24: dapr.proto.components.v1.SetRequest.metadata:type_name -> dapr.proto.components.v1.SetRequest.MetadataEntry + 39, // 24: dapr.proto.components.v1.SetRequest.metadata:type_name -> dapr.proto.components.v1.SetRequest.MetadataEntry 13, // 25: dapr.proto.components.v1.SetRequest.options:type_name -> dapr.proto.components.v1.StateOptions 18, // 26: dapr.proto.components.v1.BulkDeleteRequest.items:type_name -> dapr.proto.components.v1.DeleteRequest - 16, // 27: dapr.proto.components.v1.BulkGetRequest.items:type_name -> dapr.proto.components.v1.GetRequest - 24, // 28: dapr.proto.components.v1.BulkGetRequest.options:type_name -> dapr.proto.components.v1.BulkGetRequestOptions - 12, // 29: dapr.proto.components.v1.BulkStateItem.etag:type_name -> dapr.proto.components.v1.Etag - 38, // 30: dapr.proto.components.v1.BulkStateItem.metadata:type_name -> dapr.proto.components.v1.BulkStateItem.MetadataEntry - 26, // 31: dapr.proto.components.v1.BulkGetResponse.items:type_name -> dapr.proto.components.v1.BulkStateItem - 20, // 32: dapr.proto.components.v1.BulkSetRequest.items:type_name -> dapr.proto.components.v1.SetRequest - 40, // 33: dapr.proto.components.v1.Query.FilterEntry.value:type_name -> google.protobuf.Any - 6, // 34: dapr.proto.components.v1.QueriableStateStore.Query:input_type -> dapr.proto.components.v1.QueryRequest - 10, // 35: dapr.proto.components.v1.TransactionalStateStore.Transact:input_type -> dapr.proto.components.v1.TransactionalStateRequest - 14, // 36: dapr.proto.components.v1.StateStore.Init:input_type -> dapr.proto.components.v1.InitRequest - 41, // 37: dapr.proto.components.v1.StateStore.Features:input_type -> dapr.proto.components.v1.FeaturesRequest - 18, // 38: dapr.proto.components.v1.StateStore.Delete:input_type -> dapr.proto.components.v1.DeleteRequest - 16, // 39: dapr.proto.components.v1.StateStore.Get:input_type -> dapr.proto.components.v1.GetRequest - 20, // 40: dapr.proto.components.v1.StateStore.Set:input_type -> dapr.proto.components.v1.SetRequest - 42, // 41: dapr.proto.components.v1.StateStore.Ping:input_type -> dapr.proto.components.v1.PingRequest - 22, // 42: dapr.proto.components.v1.StateStore.BulkDelete:input_type -> dapr.proto.components.v1.BulkDeleteRequest - 25, // 43: dapr.proto.components.v1.StateStore.BulkGet:input_type -> dapr.proto.components.v1.BulkGetRequest - 28, // 44: dapr.proto.components.v1.StateStore.BulkSet:input_type -> dapr.proto.components.v1.BulkSetRequest - 8, // 45: dapr.proto.components.v1.QueriableStateStore.Query:output_type -> dapr.proto.components.v1.QueryResponse - 11, // 46: dapr.proto.components.v1.TransactionalStateStore.Transact:output_type -> dapr.proto.components.v1.TransactionalStateResponse - 15, // 47: dapr.proto.components.v1.StateStore.Init:output_type -> dapr.proto.components.v1.InitResponse - 43, // 48: dapr.proto.components.v1.StateStore.Features:output_type -> dapr.proto.components.v1.FeaturesResponse - 19, // 49: dapr.proto.components.v1.StateStore.Delete:output_type -> dapr.proto.components.v1.DeleteResponse - 17, // 50: dapr.proto.components.v1.StateStore.Get:output_type -> dapr.proto.components.v1.GetResponse - 21, // 51: dapr.proto.components.v1.StateStore.Set:output_type -> dapr.proto.components.v1.SetResponse - 44, // 52: dapr.proto.components.v1.StateStore.Ping:output_type -> dapr.proto.components.v1.PingResponse - 23, // 53: dapr.proto.components.v1.StateStore.BulkDelete:output_type -> dapr.proto.components.v1.BulkDeleteResponse - 27, // 54: dapr.proto.components.v1.StateStore.BulkGet:output_type -> dapr.proto.components.v1.BulkGetResponse - 29, // 55: dapr.proto.components.v1.StateStore.BulkSet:output_type -> dapr.proto.components.v1.BulkSetResponse - 45, // [45:56] is the sub-list for method output_type - 34, // [34:45] is the sub-list for method input_type - 34, // [34:34] is the sub-list for extension type_name - 34, // [34:34] is the sub-list for extension extendee - 0, // [0:34] is the sub-list for field type_name + 22, // 27: dapr.proto.components.v1.BulkDeleteRequest.options:type_name -> dapr.proto.components.v1.BulkDeleteRequestOptions + 16, // 28: dapr.proto.components.v1.BulkGetRequest.items:type_name -> dapr.proto.components.v1.GetRequest + 25, // 29: dapr.proto.components.v1.BulkGetRequest.options:type_name -> dapr.proto.components.v1.BulkGetRequestOptions + 12, // 30: dapr.proto.components.v1.BulkStateItem.etag:type_name -> dapr.proto.components.v1.Etag + 40, // 31: dapr.proto.components.v1.BulkStateItem.metadata:type_name -> dapr.proto.components.v1.BulkStateItem.MetadataEntry + 27, // 32: dapr.proto.components.v1.BulkGetResponse.items:type_name -> dapr.proto.components.v1.BulkStateItem + 20, // 33: dapr.proto.components.v1.BulkSetRequest.items:type_name -> dapr.proto.components.v1.SetRequest + 29, // 34: dapr.proto.components.v1.BulkSetRequest.options:type_name -> dapr.proto.components.v1.BulkSetRequestOptions + 42, // 35: dapr.proto.components.v1.Query.FilterEntry.value:type_name -> google.protobuf.Any + 6, // 36: dapr.proto.components.v1.QueriableStateStore.Query:input_type -> dapr.proto.components.v1.QueryRequest + 10, // 37: dapr.proto.components.v1.TransactionalStateStore.Transact:input_type -> dapr.proto.components.v1.TransactionalStateRequest + 14, // 38: dapr.proto.components.v1.StateStore.Init:input_type -> dapr.proto.components.v1.InitRequest + 43, // 39: dapr.proto.components.v1.StateStore.Features:input_type -> dapr.proto.components.v1.FeaturesRequest + 18, // 40: dapr.proto.components.v1.StateStore.Delete:input_type -> dapr.proto.components.v1.DeleteRequest + 16, // 41: dapr.proto.components.v1.StateStore.Get:input_type -> dapr.proto.components.v1.GetRequest + 20, // 42: dapr.proto.components.v1.StateStore.Set:input_type -> dapr.proto.components.v1.SetRequest + 44, // 43: dapr.proto.components.v1.StateStore.Ping:input_type -> dapr.proto.components.v1.PingRequest + 23, // 44: dapr.proto.components.v1.StateStore.BulkDelete:input_type -> dapr.proto.components.v1.BulkDeleteRequest + 26, // 45: dapr.proto.components.v1.StateStore.BulkGet:input_type -> dapr.proto.components.v1.BulkGetRequest + 30, // 46: dapr.proto.components.v1.StateStore.BulkSet:input_type -> dapr.proto.components.v1.BulkSetRequest + 8, // 47: dapr.proto.components.v1.QueriableStateStore.Query:output_type -> dapr.proto.components.v1.QueryResponse + 11, // 48: dapr.proto.components.v1.TransactionalStateStore.Transact:output_type -> dapr.proto.components.v1.TransactionalStateResponse + 15, // 49: dapr.proto.components.v1.StateStore.Init:output_type -> dapr.proto.components.v1.InitResponse + 45, // 50: dapr.proto.components.v1.StateStore.Features:output_type -> dapr.proto.components.v1.FeaturesResponse + 19, // 51: dapr.proto.components.v1.StateStore.Delete:output_type -> dapr.proto.components.v1.DeleteResponse + 17, // 52: dapr.proto.components.v1.StateStore.Get:output_type -> dapr.proto.components.v1.GetResponse + 21, // 53: dapr.proto.components.v1.StateStore.Set:output_type -> dapr.proto.components.v1.SetResponse + 46, // 54: dapr.proto.components.v1.StateStore.Ping:output_type -> dapr.proto.components.v1.PingResponse + 24, // 55: dapr.proto.components.v1.StateStore.BulkDelete:output_type -> dapr.proto.components.v1.BulkDeleteResponse + 28, // 56: dapr.proto.components.v1.StateStore.BulkGet:output_type -> dapr.proto.components.v1.BulkGetResponse + 31, // 57: dapr.proto.components.v1.StateStore.BulkSet:output_type -> dapr.proto.components.v1.BulkSetResponse + 47, // [47:58] is the sub-list for method output_type + 36, // [36:47] is the sub-list for method input_type + 36, // [36:36] is the sub-list for extension type_name + 36, // [36:36] is the sub-list for extension extendee + 0, // [0:36] is the sub-list for field type_name } func init() { file_dapr_proto_components_v1_state_proto_init() } @@ -2453,7 +2584,7 @@ func file_dapr_proto_components_v1_state_proto_init() { } } file_dapr_proto_components_v1_state_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BulkDeleteRequest); i { + switch v := v.(*BulkDeleteRequestOptions); i { case 0: return &v.state case 1: @@ -2465,7 +2596,7 @@ func file_dapr_proto_components_v1_state_proto_init() { } } file_dapr_proto_components_v1_state_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BulkDeleteResponse); i { + switch v := v.(*BulkDeleteRequest); i { case 0: return &v.state case 1: @@ -2477,7 +2608,7 @@ func file_dapr_proto_components_v1_state_proto_init() { } } file_dapr_proto_components_v1_state_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BulkGetRequestOptions); i { + switch v := v.(*BulkDeleteResponse); i { case 0: return &v.state case 1: @@ -2489,7 +2620,7 @@ func file_dapr_proto_components_v1_state_proto_init() { } } file_dapr_proto_components_v1_state_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BulkGetRequest); i { + switch v := v.(*BulkGetRequestOptions); i { case 0: return &v.state case 1: @@ -2501,7 +2632,7 @@ func file_dapr_proto_components_v1_state_proto_init() { } } file_dapr_proto_components_v1_state_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BulkStateItem); i { + switch v := v.(*BulkGetRequest); i { case 0: return &v.state case 1: @@ -2513,7 +2644,7 @@ func file_dapr_proto_components_v1_state_proto_init() { } } file_dapr_proto_components_v1_state_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BulkGetResponse); i { + switch v := v.(*BulkStateItem); i { case 0: return &v.state case 1: @@ -2525,7 +2656,7 @@ func file_dapr_proto_components_v1_state_proto_init() { } } file_dapr_proto_components_v1_state_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BulkSetRequest); i { + switch v := v.(*BulkGetResponse); i { case 0: return &v.state case 1: @@ -2537,6 +2668,30 @@ func file_dapr_proto_components_v1_state_proto_init() { } } file_dapr_proto_components_v1_state_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BulkSetRequestOptions); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_dapr_proto_components_v1_state_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BulkSetRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_dapr_proto_components_v1_state_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*BulkSetResponse); i { case 0: return &v.state @@ -2559,7 +2714,7 @@ func file_dapr_proto_components_v1_state_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_dapr_proto_components_v1_state_proto_rawDesc, NumEnums: 3, - NumMessages: 36, + NumMessages: 38, NumExtensions: 0, NumServices: 3, }, diff --git a/pkg/runtime/pubsub/bulkpublish_resiliency.go b/pkg/runtime/pubsub/bulkpublish_resiliency.go index e21c528023b..7ff4732a639 100644 --- a/pkg/runtime/pubsub/bulkpublish_resiliency.go +++ b/pkg/runtime/pubsub/bulkpublish_resiliency.go @@ -32,15 +32,17 @@ func ApplyBulkPublishResiliency(ctx context.Context, req *contribPubsub.BulkPubl policyRunner := resiliency.NewRunnerWithOptions(ctx, policyDef, resiliency.RunnerOpts[contribPubsub.BulkPublishResponse]{ Accumulator: func(res contribPubsub.BulkPublishResponse) { - if len(res.FailedEntries) > 0 { - // requestEntries can be modified here as Accumulator is executed synchronously - failedEntryIds := extractEntryIds(res.FailedEntries) - filteredEntries := utils.Filter(*requestEntries.Load(), func(item contribPubsub.BulkMessageEntry) bool { - _, ok := failedEntryIds[item.EntryId] - return ok - }) - requestEntries.Store(&filteredEntries) + if len(res.FailedEntries) == 0 { + return } + + // requestEntries can be modified here as Accumulator is executed synchronously + failedEntryIds := extractEntryIds(res.FailedEntries) + filteredEntries := utils.Filter(*requestEntries.Load(), func(item contribPubsub.BulkMessageEntry) bool { + _, ok := failedEntryIds[item.EntryId] + return ok + }) + requestEntries.Store(&filteredEntries) }, }) res, err := policyRunner(func(ctx context.Context) (contribPubsub.BulkPublishResponse, error) { diff --git a/pkg/runtime/runtime.go b/pkg/runtime/runtime.go index 09fb7a87b65..fd1afb61c33 100644 --- a/pkg/runtime/runtime.go +++ b/pkg/runtime/runtime.go @@ -1291,19 +1291,19 @@ func (a *DaprRuntime) sendToOutputBinding(name string, req *bindings.InvokeReque func (a *DaprRuntime) onAppResponse(response *bindings.AppResponse) error { if len(response.State) > 0 { go func(reqs []state.SetRequest) { - state, ok := a.compStore.GetStateStore(response.StoreName) + store, ok := a.compStore.GetStateStore(response.StoreName) if !ok { return } - policyRunner := resiliency.NewRunner[any](a.ctx, + err := stateLoader.PerformBulkStoreOperation(a.ctx, reqs, a.resiliency.ComponentOutboundPolicy(response.StoreName, resiliency.Statestore), + state.BulkStoreOpts{}, + store.Set, + store.BulkSet, ) - _, err := policyRunner(func(ctx context.Context) (any, error) { - return nil, state.BulkSet(ctx, reqs) - }) if err != nil { - log.Errorf("error saving state from app response: %s", err) + log.Errorf("error saving state from app response: %v", err) } }(response.State) } @@ -1326,7 +1326,7 @@ func (a *DaprRuntime) onAppResponse(response *bindings.AppResponse) error { func (a *DaprRuntime) sendBindingEventToApp(bindingName string, data []byte, metadata map[string]string) ([]byte, error) { var response bindings.AppResponse - spanName := fmt.Sprintf("bindings/%s", bindingName) + spanName := "bindings/" + bindingName spanContext := trace.SpanContext{} // Check the grpc-trace-bin with fallback to traceparent. diff --git a/pkg/testing/fake_state_store.go b/pkg/testing/fake_state_store.go index 04810a3bfc6..8d31556cb79 100644 --- a/pkg/testing/fake_state_store.go +++ b/pkg/testing/fake_state_store.go @@ -74,7 +74,7 @@ func (f *FakeStateStore) Delete(ctx context.Context, req *state.DeleteRequest) e return nil } -func (f *FakeStateStore) BulkDelete(ctx context.Context, req []state.DeleteRequest) error { +func (f *FakeStateStore) BulkDelete(ctx context.Context, req []state.DeleteRequest, opts state.BulkStoreOpts) error { return nil } @@ -130,7 +130,7 @@ func (f *FakeStateStore) GetComponentMetadata() map[string]string { return map[string]string{} } -func (f *FakeStateStore) BulkSet(ctx context.Context, req []state.SetRequest) error { +func (f *FakeStateStore) BulkSet(ctx context.Context, req []state.SetRequest, opts state.BulkStoreOpts) error { return nil } diff --git a/pkg/testing/state_mock.go b/pkg/testing/state_mock.go index 2a64738f04e..055654db2c7 100644 --- a/pkg/testing/state_mock.go +++ b/pkg/testing/state_mock.go @@ -26,8 +26,7 @@ type MockStateStore struct { mock.Mock } -// BulkDelete provides a mock function with given fields: req -func (_m *MockStateStore) BulkDelete(ctx context.Context, req []state.DeleteRequest) error { +func (_m *MockStateStore) BulkDelete(ctx context.Context, req []state.DeleteRequest, opts state.BulkStoreOpts) error { ret := _m.Called(ctx, req) var r0 error @@ -40,8 +39,7 @@ func (_m *MockStateStore) BulkDelete(ctx context.Context, req []state.DeleteRequ return r0 } -// BulkSet provides a mock function with given fields: req -func (_m *MockStateStore) BulkSet(ctx context.Context, req []state.SetRequest) error { +func (_m *MockStateStore) BulkSet(ctx context.Context, req []state.SetRequest, opts state.BulkStoreOpts) error { ret := _m.Called(ctx, req) var r0 error @@ -148,7 +146,7 @@ func (f *FailingStatestore) GetComponentMetadata() map[string]string { return map[string]string{} } -func (f *FailingStatestore) BulkDelete(ctx context.Context, req []state.DeleteRequest) error { +func (f *FailingStatestore) BulkDelete(ctx context.Context, req []state.DeleteRequest, opts state.BulkStoreOpts) error { for _, val := range req { err := f.Failure.PerformFailure(val.Key) if err != nil { @@ -158,7 +156,7 @@ func (f *FailingStatestore) BulkDelete(ctx context.Context, req []state.DeleteRe return nil } -func (f *FailingStatestore) BulkSet(ctx context.Context, req []state.SetRequest) error { +func (f *FailingStatestore) BulkSet(ctx context.Context, req []state.SetRequest, opts state.BulkStoreOpts) error { for _, val := range req { err := f.Failure.PerformFailure(val.Key) if err != nil { diff --git a/tests/apps/perf/configuration/app.go b/tests/apps/perf/configuration/app.go index 24aa02fd624..622aa9550c1 100644 --- a/tests/apps/perf/configuration/app.go +++ b/tests/apps/perf/configuration/app.go @@ -58,10 +58,6 @@ type appResponse struct { EndTime int `json:"end_time,omitempty"` } -type receivedMessagesResponse struct { - ReceivedUpdates []string `json:"received-messages"` -} - type Item struct { Value string `json:"value,omitempty"` Version string `json:"version,omitempty"` @@ -498,7 +494,7 @@ func updateKeyValues(w http.ResponseWriter, r *http.Request) { } // appRouter initializes restful api router -func appRouter() *mux.Router { +func appRouter() http.Handler { router := mux.NewRouter().StrictSlash(true) // Log requests and their processing time diff --git a/tests/apps/perf/configuration/go.mod b/tests/apps/perf/configuration/go.mod deleted file mode 100644 index 8e079d50a68..00000000000 --- a/tests/apps/perf/configuration/go.mod +++ /dev/null @@ -1,22 +0,0 @@ -module github.com/dapr/dapr/tests/apps/perf/configuration - -go 1.20 - -require ( - github.com/dapr/dapr v1.10.5-rc.1.0.20230419110032-3fb850d12c53 - github.com/google/uuid v1.3.0 - github.com/gorilla/mux v1.8.0 - github.com/redis/go-redis/v9 v9.0.3 -) - -require ( - github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect - github.com/golang/protobuf v1.5.3 // indirect - golang.org/x/net v0.9.0 // indirect - golang.org/x/sys v0.7.0 // indirect - golang.org/x/text v0.9.0 // indirect - google.golang.org/genproto v0.0.0-20230403163135-c38d8f061ccd // indirect - google.golang.org/grpc v1.54.0 // indirect - google.golang.org/protobuf v1.30.0 // indirect -) diff --git a/tests/apps/perf/configuration/go.sum b/tests/apps/perf/configuration/go.sum deleted file mode 100644 index 7d50f328952..00000000000 --- a/tests/apps/perf/configuration/go.sum +++ /dev/null @@ -1,34 +0,0 @@ -github.com/bsm/ginkgo/v2 v2.7.0 h1:ItPMPH90RbmZJt5GtkcNvIRuGEdwlBItdNVoyzaNQao= -github.com/bsm/gomega v1.26.0 h1:LhQm+AFcgV2M0WyKroMASzAzCAJVpAxQXv4SaI9a69Y= -github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= -github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/dapr/dapr v1.10.5-rc.1.0.20230419110032-3fb850d12c53 h1:8NtcXbBr//IWknO/X5clpWx7QJ77w5ZHq8lq+7E2MzY= -github.com/dapr/dapr v1.10.5-rc.1.0.20230419110032-3fb850d12c53/go.mod h1:45XQnrUKbBq/yRbmc/eS/hCKjo4gx7SQYsHUoB9bydg= -github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= -github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/redis/go-redis/v9 v9.0.3 h1:+7mmR26M0IvyLxGZUHxu4GiBkJkVDid0Un+j4ScYu4k= -github.com/redis/go-redis/v9 v9.0.3/go.mod h1:WqMKv5vnQbRuZstUwxQI195wHy+t4PuXDOjzMvcuQHk= -golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM= -golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= -golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= -golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto v0.0.0-20230403163135-c38d8f061ccd h1:sLpv7bNL1AsX3fdnWh9WVh7ejIzXdOc1RRHGeAmeStU= -google.golang.org/genproto v0.0.0-20230403163135-c38d8f061ccd/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= -google.golang.org/grpc v1.54.0 h1:EhTqbhiYeixwWQtAEZAxmV9MGqcjEU2mFx52xCzNyag= -google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= diff --git a/tests/apps/resiliencyapp/go.mod b/tests/apps/resiliencyapp/go.mod index 296cd553adc..7dd1497e164 100644 --- a/tests/apps/resiliencyapp/go.mod +++ b/tests/apps/resiliencyapp/go.mod @@ -13,8 +13,8 @@ require ( require ( github.com/golang/protobuf v1.5.3 // indirect github.com/google/uuid v1.3.0 // indirect - golang.org/x/net v0.9.0 // indirect - golang.org/x/sys v0.7.0 // indirect + golang.org/x/net v0.10.0 // indirect + golang.org/x/sys v0.8.0 // indirect golang.org/x/text v0.9.0 // indirect google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect ) diff --git a/tests/apps/resiliencyapp/go.sum b/tests/apps/resiliencyapp/go.sum index 9fce6a70905..16b3c27a8ce 100644 --- a/tests/apps/resiliencyapp/go.sum +++ b/tests/apps/resiliencyapp/go.sum @@ -50,8 +50,8 @@ golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM= -golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= +golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -60,8 +60,8 @@ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= -golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= diff --git a/tests/apps/resiliencyapp_grpc/go.mod b/tests/apps/resiliencyapp_grpc/go.mod index 321ef59cc01..39d887638e4 100644 --- a/tests/apps/resiliencyapp_grpc/go.mod +++ b/tests/apps/resiliencyapp_grpc/go.mod @@ -11,8 +11,8 @@ require ( require ( github.com/golang/protobuf v1.5.3 // indirect - golang.org/x/net v0.9.0 // indirect - golang.org/x/sys v0.7.0 // indirect + golang.org/x/net v0.10.0 // indirect + golang.org/x/sys v0.8.0 // indirect golang.org/x/text v0.9.0 // indirect google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect ) diff --git a/tests/apps/resiliencyapp_grpc/go.sum b/tests/apps/resiliencyapp_grpc/go.sum index 01422f5dada..4e0497b5f57 100644 --- a/tests/apps/resiliencyapp_grpc/go.sum +++ b/tests/apps/resiliencyapp_grpc/go.sum @@ -46,8 +46,8 @@ golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM= -golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= +golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -56,8 +56,8 @@ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= -golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= diff --git a/tests/apps/secretapp/app.go b/tests/apps/secretapp/app.go index aa104a3cdf1..d082339aa87 100644 --- a/tests/apps/secretapp/app.go +++ b/tests/apps/secretapp/app.go @@ -247,7 +247,7 @@ func createSecretURL(key, store string) (string, error) { // epoch returns the current unix epoch timestamp func epoch() int { - return (int)(time.Now().UTC().UnixNano() / 1000000) + return int(time.Now().UnixMilli()) } // appRouter initializes restful api router diff --git a/tests/apps/service_invocation_grpc_proxy_client/go.mod b/tests/apps/service_invocation_grpc_proxy_client/go.mod index cdd03b07f54..050931ed625 100644 --- a/tests/apps/service_invocation_grpc_proxy_client/go.mod +++ b/tests/apps/service_invocation_grpc_proxy_client/go.mod @@ -12,8 +12,8 @@ require ( require ( github.com/golang/protobuf v1.5.3 // indirect github.com/google/uuid v1.3.0 // indirect - golang.org/x/net v0.9.0 // indirect - golang.org/x/sys v0.7.0 // indirect + golang.org/x/net v0.10.0 // indirect + golang.org/x/sys v0.8.0 // indirect golang.org/x/text v0.9.0 // indirect google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect google.golang.org/protobuf v1.30.0 // indirect diff --git a/tests/apps/service_invocation_grpc_proxy_client/go.sum b/tests/apps/service_invocation_grpc_proxy_client/go.sum index 9ce926fc305..1cb45bec0cd 100644 --- a/tests/apps/service_invocation_grpc_proxy_client/go.sum +++ b/tests/apps/service_invocation_grpc_proxy_client/go.sum @@ -50,8 +50,8 @@ golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM= -golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= +golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -60,8 +60,8 @@ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= -golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= diff --git a/tests/apps/stateapp/app.go b/tests/apps/stateapp/app.go index 0142f71ab9c..b23a826c25f 100644 --- a/tests/apps/stateapp/app.go +++ b/tests/apps/stateapp/app.go @@ -26,9 +26,11 @@ import ( "path" "strconv" "strings" - "time" + "github.com/google/uuid" "github.com/gorilla/mux" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" daprhttp "github.com/dapr/dapr/pkg/http" commonv1pb "github.com/dapr/dapr/pkg/proto/common/v1" @@ -45,6 +47,7 @@ const ( metadataPartitionKey = "partitionKey" partitionKey = "e2etest" + badEtag = "99999" // Must be numeric because of Redis ) var ( @@ -80,6 +83,7 @@ type appState struct { type daprState struct { Key string `json:"key,omitempty"` Value *appState `json:"value,omitempty"` + Etag string `json:"etag,omitempty"` Metadata map[string]string `json:"metadata,omitempty"` OperationType string `json:"operationType,omitempty"` } @@ -93,17 +97,15 @@ type bulkGetRequest struct { // bulkGetResponse is the response object from Dapr for a bulk get operation. type bulkGetResponse struct { - Key string `json:"key"` - Data interface{} `json:"data"` - ETag string `json:"etag"` + Key string `json:"key"` + Data any `json:"data"` + ETag string `json:"etag"` } // requestResponse represents a request or response for the APIs in this app. type requestResponse struct { - StartTime int `json:"start_time,omitempty"` - EndTime int `json:"end_time,omitempty"` - States []daprState `json:"states,omitempty"` - Message string `json:"message,omitempty"` + States []daprState `json:"states,omitempty"` + Message string `json:"message,omitempty"` } // indexHandler is the handler for root path @@ -131,7 +133,7 @@ func load(data []byte, statestore string, meta map[string]string) (int, error) { stateURL += "?" + metadata2RawQuery(meta) } log.Printf("Posting %d bytes of state to %s", len(data), stateURL) - res, err := httpClient.Post(stateURL, "application/json", bytes.NewBuffer(data)) + res, err := httpClient.Post(stateURL, "application/json", bytes.NewReader(data)) if err != nil { return http.StatusInternalServerError, err } @@ -139,16 +141,21 @@ func load(data []byte, statestore string, meta map[string]string) (int, error) { // Save must return 204 if res.StatusCode != http.StatusNoContent { - err = fmt.Errorf("expected status code 204, got %d", res.StatusCode) + body, _ := io.ReadAll(res.Body) + err = fmt.Errorf("expected status code 204, got %d; response: %s", res.StatusCode, string(body)) } + + // Drain before closing + _, _ = io.Copy(io.Discard, res.Body) + return res.StatusCode, err } -func get(key, statestore string, meta map[string]string) (*appState, error) { +func get(key string, statestore string, meta map[string]string) (*appState, string, error) { log.Printf("Processing get request for %s.", key) url, err := createStateURL(key, statestore, meta) if err != nil { - return nil, err + return nil, "", err } log.Printf("Fetching state from %s", url) @@ -156,27 +163,27 @@ func get(key, statestore string, meta map[string]string) (*appState, error) { /* #nosec */ res, err := httpClient.Get(url) if err != nil { - return nil, fmt.Errorf("could not get value for key %s from Dapr: %s", key, err.Error()) + return nil, "", fmt.Errorf("could not get value for key %s from Dapr: %s", key, err.Error()) } defer res.Body.Close() body, err := io.ReadAll(res.Body) if err != nil { - return nil, fmt.Errorf("could not load value for key %s from Dapr: %s", key, err.Error()) + return nil, "", fmt.Errorf("could not load value for key %s from Dapr: %s", key, err.Error()) } if res.StatusCode < 200 || res.StatusCode > 299 { - return nil, fmt.Errorf("failed to get value for key %s from Dapr: %s", key, body) + return nil, "", fmt.Errorf("failed to get value for key %s from Dapr: %s", key, body) } log.Printf("Found state for key %s: %s", key, body) state, err := parseState(key, body) if err != nil { - return nil, err + return nil, "", err } - return state, nil + return state, res.Header.Get("etag"), nil } func parseState(key string, body []byte) (*appState, error) { @@ -203,7 +210,7 @@ func getAll(states []daprState, statestore string, meta map[string]string) ([]da output := make([]daprState, 0, len(states)) for _, state := range states { - value, err := get(state.Key, statestore, meta) + value, etag, err := get(state.Key, statestore, meta) if err != nil { return nil, err } @@ -212,6 +219,7 @@ func getAll(states []daprState, statestore string, meta map[string]string) ([]da output = append(output, daprState{ Key: state.Key, Value: value, + Etag: etag, }) } @@ -240,7 +248,7 @@ func getBulk(states []daprState, statestore string) ([]daprState, error) { return nil, err } - res, err := httpClient.Post(url, "application/json", bytes.NewBuffer(b)) + res, err := httpClient.Post(url, "application/json", bytes.NewReader(b)) if err != nil { return nil, err } @@ -260,17 +268,18 @@ func getBulk(states []daprState, statestore string) ([]daprState, error) { return nil, fmt.Errorf("could not unmarshal bulk get response from Dapr: %s", err.Error()) } - for _, i := range resp { + for _, state := range resp { var as appState - b, err := json.Marshal(i.Data) + b, err := json.Marshal(state.Data) if err != nil { return nil, fmt.Errorf("could not marshal return data: %s", err) } json.Unmarshal(b, &as) output = append(output, daprState{ - Key: i.Key, + Key: state.Key, Value: &as, + Etag: state.ETag, }) } @@ -278,37 +287,44 @@ func getBulk(states []daprState, statestore string) ([]daprState, error) { return output, nil } -func delete(key, statestore string, meta map[string]string) error { - log.Printf("Processing delete request for %s.", key) +func delete(key, statestore string, meta map[string]string, etag string) (int, error) { + log.Printf("Processing delete request for %s", key) url, err := createStateURL(key, statestore, meta) if err != nil { - return err + return 0, err } req, err := http.NewRequest(http.MethodDelete, url, nil) if err != nil { - return fmt.Errorf("could not create delete request for key %s in Dapr: %s", key, err.Error()) + return 0, fmt.Errorf("could not create delete request for key %s in Dapr: %s", key, err.Error()) + } + if etag != "" { + req.Header.Set("If-Match", etag) } log.Printf("Deleting state for %s", url) res, err := httpClient.Do(req) if err != nil { - return fmt.Errorf("could not delete key %s in Dapr: %s", key, err.Error()) + return 0, fmt.Errorf("could not delete key %s in Dapr: %s", key, err.Error()) } defer res.Body.Close() if res.StatusCode < 200 || res.StatusCode > 299 { - return fmt.Errorf("failed to delete key %s in Dapr: %s", key, err.Error()) + body, _ := io.ReadAll(res.Body) + return res.StatusCode, fmt.Errorf("failed to delete key %s in Dapr: %s", key, string(body)) } - return nil + // Drain before closing + _, _ = io.Copy(io.Discard, res.Body) + + return res.StatusCode, nil } func deleteAll(states []daprState, statestore string, meta map[string]string) error { log.Printf("Processing delete request for %d states.", len(states)) for _, state := range states { - err := delete(state.Key, statestore, meta) + _, err := delete(state.Key, statestore, meta, "") if err != nil { return err } @@ -340,7 +356,7 @@ func executeTransaction(states []daprState, statestore string) error { } log.Printf("Posting state to %s with '%s'", stateTransactionURL, jsonValue) - res, err := httpClient.Post(stateTransactionURL, "application/json", bytes.NewBuffer(jsonValue)) + res, err := httpClient.Post(stateTransactionURL, "application/json", bytes.NewReader(jsonValue)) if err != nil { return err } @@ -358,7 +374,7 @@ func executeQuery(query []byte, statestore string, meta map[string]string) ([]da queryURL += "?" + metadata2RawQuery(meta) } log.Printf("Posting %d bytes of state to %s", len(query), queryURL) - resp, err := httpClient.Post(queryURL, "application/json", bytes.NewBuffer(query)) + resp, err := httpClient.Post(queryURL, "application/json", bytes.NewReader(query)) if err != nil { return nil, err } @@ -395,7 +411,8 @@ func executeQuery(query []byte, statestore string, meta map[string]string) ([]da func parseRequestBody(w http.ResponseWriter, r *http.Request) (*requestResponse, error) { req := &requestResponse{} - if err := json.NewDecoder(r.Body).Decode(req); err != nil { + err := json.NewDecoder(r.Body).Decode(req) + if err != nil { log.Printf("Could not parse request body: %s", err.Error()) w.WriteHeader(http.StatusBadRequest) json.NewEncoder(w).Encode(requestResponse{ @@ -411,7 +428,8 @@ func parseRequestBody(w http.ResponseWriter, r *http.Request) (*requestResponse, } func getRequestBody(w http.ResponseWriter, r *http.Request) (data []byte, err error) { - if data, err = io.ReadAll(r.Body); err != nil { + data, err = io.ReadAll(r.Body) + if err != nil { log.Printf("Could not read request body: %s", err.Error()) w.WriteHeader(http.StatusBadRequest) json.NewEncoder(w).Encode(requestResponse{ @@ -453,14 +471,13 @@ func httpHandler(w http.ResponseWriter, r *http.Request) { uri := r.URL.RequestURI() statusCode := http.StatusOK - res.StartTime = epoch() - cmd := mux.Vars(r)["command"] statestore := mux.Vars(r)["statestore"] meta := getMetadata(r.URL.Query()) switch cmd { case "save": - if req, err = parseRequestBody(w, r); err != nil { + req, err = parseRequestBody(w, r) + if err != nil { return } _, err = save(req.States, statestore, meta) @@ -470,33 +487,39 @@ func httpHandler(w http.ResponseWriter, r *http.Request) { statusCode = http.StatusNoContent } case "load": - if data, err = getRequestBody(w, r); err != nil { + data, err = getRequestBody(w, r) + if err != nil { return } statusCode, err = load(data, statestore, meta) case "get": - if req, err = parseRequestBody(w, r); err != nil { + req, err = parseRequestBody(w, r) + if err != nil { return } res.States, err = getAll(req.States, statestore, meta) case "getbulk": - if req, err = parseRequestBody(w, r); err != nil { + req, err = parseRequestBody(w, r) + if err != nil { return } res.States, err = getBulk(req.States, statestore) case "delete": - if req, err = parseRequestBody(w, r); err != nil { + req, err = parseRequestBody(w, r) + if err != nil { return } err = deleteAll(req.States, statestore, meta) statusCode = http.StatusNoContent case "transact": - if req, err = parseRequestBody(w, r); err != nil { + req, err = parseRequestBody(w, r) + if err != nil { return } err = executeTransaction(req.States, statestore) case "query": - if data, err = getRequestBody(w, r); err != nil { + data, err = getRequestBody(w, r) + if err != nil { return } res.States, err = executeQuery(data, statestore, meta) @@ -512,8 +535,6 @@ func httpHandler(w http.ResponseWriter, r *http.Request) { res.Message = err.Error() } - res.EndTime = epoch() - if !statusCheck { log.Printf("Error status code %v: %v", statusCode, res.Message) } @@ -532,7 +553,6 @@ func grpcHandler(w http.ResponseWriter, r *http.Request) { var err error var res requestResponse var response *runtimev1pb.GetBulkStateResponse - res.StartTime = epoch() statusCode := http.StatusOK cmd := mux.Vars(r)["command"] @@ -571,7 +591,8 @@ func grpcHandler(w http.ResponseWriter, r *http.Request) { } res.States = states case "get": - if req, err = parseRequestBody(w, r); err != nil { + req, err = parseRequestBody(w, r) + if err != nil { return } states, err = getAllGRPC(req.States, statestore, meta) @@ -580,7 +601,8 @@ func grpcHandler(w http.ResponseWriter, r *http.Request) { } res.States = states case "delete": - if req, err = parseRequestBody(w, r); err != nil { + req, err = parseRequestBody(w, r) + if err != nil { return } statusCode = http.StatusNoContent @@ -589,7 +611,8 @@ func grpcHandler(w http.ResponseWriter, r *http.Request) { statusCode, res.Message = setErrorMessage("DeleteState", err.Error()) } case "transact": - if req, err = parseRequestBody(w, r); err != nil { + req, err = parseRequestBody(w, r) + if err != nil { return } _, err = grpcClient.ExecuteStateTransaction(context.Background(), &runtimev1pb.ExecuteStateTransactionRequest{ @@ -601,7 +624,8 @@ func grpcHandler(w http.ResponseWriter, r *http.Request) { statusCode, res.Message = setErrorMessage("ExecuteStateTransaction", err.Error()) } case "query": - if data, err = getRequestBody(w, r); err != nil { + data, err = getRequestBody(w, r) + if err != nil { return } resp, err := grpcClient.QueryStateAlpha1(context.Background(), &runtimev1pb.QueryStateRequest{ @@ -628,7 +652,6 @@ func grpcHandler(w http.ResponseWriter, r *http.Request) { res.Message = unsupportedCommandMessage } - res.EndTime = epoch() if statusCode != http.StatusOK && statusCode != http.StatusNoContent { log.Printf("Error status code %v: %v", statusCode, res.Message) } @@ -659,30 +682,42 @@ func toDaprStates(response *runtimev1pb.GetBulkStateResponse) ([]daprState, erro result[i] = daprState{ Key: state.Key, Value: daprStateItem, + Etag: state.Etag, } } return result, nil } -func deleteAllGRPC(states []daprState, statestore string, meta map[string]string) error { - m := map[string]string{metadataPartitionKey: partitionKey} - for k, v := range meta { - m[k] = v +func deleteAllGRPC(states []daprState, statestore string, meta map[string]string) (err error) { + if len(states) == 0 { + return nil } - for _, state := range states { - log.Printf("deleting sate for key %s\n", state.Key) - _, err := grpcClient.DeleteState(context.Background(), &runtimev1pb.DeleteStateRequest{ + + if len(states) == 1 { + log.Print("deleting sate for key", states[0].Key) + m := map[string]string{metadataPartitionKey: partitionKey} + for k, v := range meta { + m[k] = v + } + _, err = grpcClient.DeleteState(context.Background(), &runtimev1pb.DeleteStateRequest{ StoreName: statestore, - Key: state.Key, + Key: states[0].Key, Metadata: m, }) - if err != nil { - return err - } + return err } - return nil + keys := make([]string, len(states)) + for i, state := range states { + keys[i] = state.Key + } + log.Print("deleting bulk sates for keys", keys) + _, err = grpcClient.DeleteBulkState(context.Background(), &runtimev1pb.DeleteBulkStateRequest{ + StoreName: statestore, + States: daprState2StateItems(states, meta), + }) + return err } func getAllGRPC(states []daprState, statestore string, meta map[string]string) ([]daprState, error) { @@ -716,8 +751,7 @@ func getAllGRPC(states []daprState, statestore string, meta map[string]string) ( } func setErrorMessage(method, errorString string) (int, string) { - log.Printf("GRPC %s had error %s\n", method, errorString) - + log.Printf("GRPC %s had error %s", method, errorString) return http.StatusInternalServerError, errorString } @@ -734,6 +768,11 @@ func daprState2StateItems(daprStates []daprState, meta map[string]string) []*com Value: val, Metadata: m, } + if daprState.Etag != "" { + stateItems[i].Etag = &commonv1pb.Etag{ + Value: daprState.Etag, + } + } } return stateItems @@ -783,9 +822,400 @@ func createBulkStateURL(statestore string) (string, error) { return url.String(), nil } -// epoch returns the current unix epoch timestamp -func epoch() int { - return (int)(time.Now().UTC().UnixNano() / 1000000) +// Etag test for HTTP +func etagTestHTTP(statestore string) error { + pkMetadata := map[string]string{metadataPartitionKey: partitionKey} + + // Use two random keys for testing + var etags [2]string + keys := [2]string{ + uuid.NewString(), + uuid.NewString(), + } + + type retrieveStateOpts struct { + expectNotFound bool + expectValue string + expectEtagEqual string + expectEtagNotEqual string + } + retrieveState := func(stateId int, opts retrieveStateOpts) (string, error) { + value, etag, err := get(keys[stateId], statestore, pkMetadata) + if err != nil { + return "", fmt.Errorf("failed to retrieve value %d: %w", stateId, err) + } + + if opts.expectNotFound { + if value != nil && len(value.Data) != 0 { + return "", fmt.Errorf("invalid value for state %d: %#v (expected empty)", stateId, value) + } + return "", nil + } + if value == nil || string(value.Data) != opts.expectValue { + return "", fmt.Errorf("invalid value for state %d: %#v (expected: %q)", stateId, value, opts.expectValue) + } + if etag == "" { + return "", fmt.Errorf("etag is empty for state %d", stateId) + } + if opts.expectEtagEqual != "" && etag != opts.expectEtagEqual { + return "", fmt.Errorf("etag is invalid for state %d: %q (expected: %q)", stateId, etag, opts.expectEtagEqual) + } + if opts.expectEtagNotEqual != "" && etag == opts.expectEtagNotEqual { + return "", fmt.Errorf("etag is invalid for state %d: %q (expected different value)", stateId, etag) + } + return etag, nil + } + + // First, write two values + _, err := save([]daprState{ + {Key: keys[0], Value: &appState{Data: []byte("1")}, Metadata: pkMetadata}, + {Key: keys[1], Value: &appState{Data: []byte("1")}, Metadata: pkMetadata}, + }, statestore, pkMetadata) + if err != nil { + return fmt.Errorf("failed to store initial values: %w", err) + } + + // Retrieve the two values to get the etag + etags[0], err = retrieveState(0, retrieveStateOpts{expectValue: "1"}) + if err != nil { + return fmt.Errorf("failed to check initial value for state 0: %w", err) + } + etags[1], err = retrieveState(1, retrieveStateOpts{expectValue: "1"}) + if err != nil { + return fmt.Errorf("failed to check initial value for state 1: %w", err) + } + + // Update the first state using the correct etag + _, err = save([]daprState{ + {Key: keys[0], Value: &appState{Data: []byte("2")}, Metadata: pkMetadata, Etag: etags[0]}, + }, statestore, pkMetadata) + if err != nil { + return fmt.Errorf("failed to update value 0: %w", err) + } + + // Check the first state + etags[0], err = retrieveState(0, retrieveStateOpts{expectValue: "2", expectEtagNotEqual: etags[0]}) + if err != nil { + return fmt.Errorf("failed to check initial value for state 0: %w", err) + } + + // Updating with wrong etag should fail with 409 status code + statusCode, _ := save([]daprState{ + {Key: keys[1], Value: &appState{Data: []byte("2")}, Metadata: pkMetadata, Etag: badEtag}, + }, statestore, pkMetadata) + if statusCode != http.StatusConflict { + return fmt.Errorf("expected update with invalid etag to fail with status code 409, but got: %d", statusCode) + } + + // Value should not have changed + _, err = retrieveState(1, retrieveStateOpts{expectValue: "1", expectEtagEqual: etags[1]}) + if err != nil { + return fmt.Errorf("failed to check updated value for state 1: %w", err) + } + + // Bulk update with all valid etags + _, err = save([]daprState{ + {Key: keys[0], Value: &appState{Data: []byte("3")}, Metadata: pkMetadata, Etag: etags[0]}, + {Key: keys[1], Value: &appState{Data: []byte("3")}, Metadata: pkMetadata, Etag: etags[1]}, + }, statestore, pkMetadata) + if err != nil { + return fmt.Errorf("failed to update bulk values: %w", err) + } + + // Retrieve the two values to confirm they're updated + etags[0], err = retrieveState(0, retrieveStateOpts{expectValue: "3", expectEtagNotEqual: etags[0]}) + if err != nil { + return fmt.Errorf("failed to check updated value for state 0: %w", err) + } + etags[1], err = retrieveState(1, retrieveStateOpts{expectValue: "3", expectEtagNotEqual: etags[1]}) + if err != nil { + return fmt.Errorf("failed to check updated value for state 1: %w", err) + } + + // Bulk update with one etag incorrect + statusCode, _ = save([]daprState{ + {Key: keys[0], Value: &appState{Data: []byte("4")}, Metadata: pkMetadata, Etag: badEtag}, + {Key: keys[1], Value: &appState{Data: []byte("4")}, Metadata: pkMetadata, Etag: etags[1]}, + }, statestore, pkMetadata) + if statusCode != http.StatusConflict { + return fmt.Errorf("expected update with invalid etag to fail with status code 409, but got: %d", statusCode) + } + + // Retrieve the two values to confirm only the second is updated + _, err = retrieveState(0, retrieveStateOpts{expectValue: "3", expectEtagEqual: etags[0]}) + if err != nil { + return fmt.Errorf("failed to check updated value for state 0: %w", err) + } + etags[1], err = retrieveState(1, retrieveStateOpts{expectValue: "4", expectEtagNotEqual: etags[1]}) + if err != nil { + return fmt.Errorf("failed to check updated value for state 1: %w", err) + } + + // Delete single item with incorrect etag + statusCode, _ = delete(keys[0], statestore, pkMetadata, badEtag) + if statusCode != http.StatusConflict { + return fmt.Errorf("expected delete with invalid etag to fail with status code 409, but got: %d", statusCode) + } + + // Value should not have changed + _, err = retrieveState(0, retrieveStateOpts{expectValue: "3", expectEtagEqual: etags[0]}) + if err != nil { + return fmt.Errorf("failed to check updated value for state 0: %w", err) + } + + // TODO: There's no "Bulk Delete" API in HTTP right now, so we can't test that + // Create a test here when the API is implemented + err = deleteAll([]daprState{ + {Key: keys[0], Metadata: pkMetadata}, + {Key: keys[1], Metadata: pkMetadata}, + }, statestore, pkMetadata) + if err != nil { + return fmt.Errorf("failed to delete all data at the end of the test: %w", err) + } + + return nil +} + +// Etag test for gRPC +func etagTestGRPC(statestore string) error { + pkMetadata := map[string]string{metadataPartitionKey: partitionKey} + + // Use three random keys for testing + var etags [3]string + keys := [3]string{ + uuid.NewString(), + uuid.NewString(), + uuid.NewString(), + } + + type retrieveStateOpts struct { + expectNotFound bool + expectValue string + expectEtagEqual string + expectEtagNotEqual string + } + retrieveState := func(stateId int, opts retrieveStateOpts) (string, error) { + res, err := grpcClient.GetState(context.Background(), &runtimev1pb.GetStateRequest{ + StoreName: statestore, + Key: keys[stateId], + Metadata: pkMetadata, + }) + if err != nil { + return "", fmt.Errorf("failed to retrieve value %d: %w", stateId, err) + } + + if opts.expectNotFound { + if len(res.Data) != 0 { + return "", fmt.Errorf("invalid value for state %d: %q (expected empty)", stateId, string(res.Data)) + } + return "", nil + } + if len(res.Data) == 0 || string(res.Data) != opts.expectValue { + return "", fmt.Errorf("invalid value for state %d: %q (expected: %q)", stateId, string(res.Data), opts.expectValue) + } + if res.Etag == "" { + return "", fmt.Errorf("etag is empty for state %d", stateId) + } + if opts.expectEtagEqual != "" && res.Etag != opts.expectEtagEqual { + return "", fmt.Errorf("etag is invalid for state %d: %q (expected: %q)", stateId, res.Etag, opts.expectEtagEqual) + } + if opts.expectEtagNotEqual != "" && res.Etag == opts.expectEtagNotEqual { + return "", fmt.Errorf("etag is invalid for state %d: %q (expected different value)", stateId, res.Etag) + } + return res.Etag, nil + } + + // First, write three values + _, err := grpcClient.SaveState(context.Background(), &runtimev1pb.SaveStateRequest{ + StoreName: statestore, + States: []*commonv1pb.StateItem{ + {Key: keys[0], Value: []byte("1"), Metadata: pkMetadata}, + {Key: keys[1], Value: []byte("1"), Metadata: pkMetadata}, + {Key: keys[2], Value: []byte("1"), Metadata: pkMetadata}, + }, + }) + if err != nil { + return fmt.Errorf("failed to store initial values: %w", err) + } + + // Retrieve the two values to get the etag + etags[0], err = retrieveState(0, retrieveStateOpts{expectValue: "1"}) + if err != nil { + return fmt.Errorf("failed to check initial value for state 0: %w", err) + } + etags[1], err = retrieveState(1, retrieveStateOpts{expectValue: "1"}) + if err != nil { + return fmt.Errorf("failed to check initial value for state 1: %w", err) + } + etags[2], err = retrieveState(2, retrieveStateOpts{expectValue: "1"}) + if err != nil { + return fmt.Errorf("failed to check initial value for state 2: %w", err) + } + + // Update the first state using the correct etag + _, err = grpcClient.SaveState(context.Background(), &runtimev1pb.SaveStateRequest{ + StoreName: statestore, + States: []*commonv1pb.StateItem{ + {Key: keys[0], Value: []byte("2"), Metadata: pkMetadata, Etag: &commonv1pb.Etag{Value: etags[0]}}, + }, + }) + if err != nil { + return fmt.Errorf("failed to update value 0: %w", err) + } + + // Check the first state + etags[0], err = retrieveState(0, retrieveStateOpts{expectValue: "2", expectEtagNotEqual: etags[0]}) + if err != nil { + return fmt.Errorf("failed to check updated value for state 0: %w", err) + } + + // Updating with wrong etag should fail with 409 status code + _, err = grpcClient.SaveState(context.Background(), &runtimev1pb.SaveStateRequest{ + StoreName: statestore, + States: []*commonv1pb.StateItem{ + {Key: keys[1], Value: []byte("2"), Metadata: pkMetadata, Etag: &commonv1pb.Etag{Value: badEtag}}, + }, + }) + if status.Code(err) != codes.Aborted { + return fmt.Errorf("expected gRPC error with code Aborted, but got err: %v", err) + } + + // Value should not have changed + _, err = retrieveState(1, retrieveStateOpts{expectValue: "1", expectEtagEqual: etags[1]}) + if err != nil { + return fmt.Errorf("failed to check updated value for state 1: %w", err) + } + + // Bulk update with all valid etags + _, err = grpcClient.SaveState(context.Background(), &runtimev1pb.SaveStateRequest{ + StoreName: statestore, + States: []*commonv1pb.StateItem{ + {Key: keys[0], Value: []byte("3"), Metadata: pkMetadata, Etag: &commonv1pb.Etag{Value: etags[0]}}, + {Key: keys[1], Value: []byte("3"), Metadata: pkMetadata, Etag: &commonv1pb.Etag{Value: etags[1]}}, + {Key: keys[2], Value: []byte("3"), Metadata: pkMetadata, Etag: &commonv1pb.Etag{Value: etags[2]}}, + }, + }) + if err != nil { + return fmt.Errorf("failed to update bulk values: %w", err) + } + + // Retrieve the three values to confirm they're updated + etags[0], err = retrieveState(0, retrieveStateOpts{expectValue: "3", expectEtagNotEqual: etags[0]}) + if err != nil { + return fmt.Errorf("failed to check updated value for state 0: %w", err) + } + etags[1], err = retrieveState(1, retrieveStateOpts{expectValue: "3", expectEtagNotEqual: etags[1]}) + if err != nil { + return fmt.Errorf("failed to check updated value for state 1: %w", err) + } + etags[2], err = retrieveState(2, retrieveStateOpts{expectValue: "3", expectEtagNotEqual: etags[2]}) + if err != nil { + return fmt.Errorf("failed to check updated value for state 2: %w", err) + } + + // Bulk update with one etag incorrect + _, err = grpcClient.SaveState(context.Background(), &runtimev1pb.SaveStateRequest{ + StoreName: statestore, + States: []*commonv1pb.StateItem{ + {Key: keys[0], Value: []byte("4"), Metadata: pkMetadata, Etag: &commonv1pb.Etag{Value: badEtag}}, + {Key: keys[1], Value: []byte("4"), Metadata: pkMetadata, Etag: &commonv1pb.Etag{Value: etags[1]}}, + {Key: keys[2], Value: []byte("4"), Metadata: pkMetadata, Etag: &commonv1pb.Etag{Value: etags[2]}}, + }, + }) + if status.Code(err) != codes.Aborted { + return fmt.Errorf("expected gRPC error with code Aborted, but got err: %v", err) + } + + // Retrieve the three values to confirm only the last two are updated + _, err = retrieveState(0, retrieveStateOpts{expectValue: "3", expectEtagEqual: etags[0]}) + if err != nil { + return fmt.Errorf("failed to check updated value for state 0: %w", err) + } + etags[1], err = retrieveState(1, retrieveStateOpts{expectValue: "4", expectEtagNotEqual: etags[1]}) + if err != nil { + return fmt.Errorf("failed to check updated value for state 1: %w", err) + } + etags[2], err = retrieveState(2, retrieveStateOpts{expectValue: "4", expectEtagNotEqual: etags[2]}) + if err != nil { + return fmt.Errorf("failed to check updated value for state 2: %w", err) + } + + // Delete single item with incorrect etag + _, err = grpcClient.DeleteState(context.Background(), &runtimev1pb.DeleteStateRequest{ + StoreName: statestore, + Key: keys[0], + Metadata: pkMetadata, + Etag: &commonv1pb.Etag{Value: badEtag}, + }) + if status.Code(err) != codes.Aborted { + return fmt.Errorf("expected gRPC error with code Aborted, but got err: %v", err) + } + + // Value should not have changed + _, err = retrieveState(0, retrieveStateOpts{expectValue: "3", expectEtagEqual: etags[0]}) + if err != nil { + return fmt.Errorf("failed to check updated value for state 0: %w", err) + } + + // Bulk delete with two etags incorrect + _, err = grpcClient.DeleteBulkState(context.Background(), &runtimev1pb.DeleteBulkStateRequest{ + StoreName: statestore, + States: []*commonv1pb.StateItem{ + {Key: keys[0], Metadata: pkMetadata, Etag: &commonv1pb.Etag{Value: badEtag}}, + {Key: keys[1], Metadata: pkMetadata, Etag: &commonv1pb.Etag{Value: badEtag}}, + {Key: keys[2], Metadata: pkMetadata, Etag: &commonv1pb.Etag{Value: etags[2]}}, + }, + }) + if status.Code(err) != codes.Aborted { + return fmt.Errorf("expected gRPC error with code Aborted, but got err: %v", err) + } + + // Validate items 0 and 1 are the only ones still existing + _, err = retrieveState(0, retrieveStateOpts{expectValue: "3", expectEtagEqual: etags[0]}) + if err != nil { + return fmt.Errorf("failed to check value for state 0 after not deleting it: %w", err) + } + _, err = retrieveState(1, retrieveStateOpts{expectValue: "4", expectEtagEqual: etags[1]}) + if err != nil { + return fmt.Errorf("failed to check value for state 1 after not deleting it: %w", err) + } + _, err = retrieveState(2, retrieveStateOpts{expectNotFound: true}) + if err != nil { + return fmt.Errorf("failed to check value for state 2 after deleting it: %w", err) + } + + // Delete the remaining items + _, err = grpcClient.DeleteBulkState(context.Background(), &runtimev1pb.DeleteBulkStateRequest{ + StoreName: statestore, + States: []*commonv1pb.StateItem{ + {Key: keys[0], Metadata: pkMetadata, Etag: &commonv1pb.Etag{Value: etags[0]}}, + {Key: keys[1], Metadata: pkMetadata, Etag: &commonv1pb.Etag{Value: etags[1]}}, + }, + }) + if err != nil { + return fmt.Errorf("failed to delete bulk values: %w", err) + } + + return nil +} + +// Returns a HTTP handler for functions that return an error +func testFnHandler(testFn func(statestore string) error) func(w http.ResponseWriter, r *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { + log.Printf("Processing request for %s", r.URL.RequestURI()) + + err := testFn(mux.Vars(r)["statestore"]) + if err != nil { + w.Header().Add("content-type", "application/json") + w.WriteHeader(http.StatusInternalServerError) + json.NewEncoder(w).Encode(map[string]any{ + "error": err.Error(), + }) + return + } + + w.WriteHeader(http.StatusNoContent) + } } // appRouter initializes restful api router @@ -798,6 +1228,8 @@ func appRouter() http.Handler { router.HandleFunc("/", indexHandler).Methods("GET") router.HandleFunc("/test/http/{command}/{statestore}", httpHandler).Methods("POST") router.HandleFunc("/test/grpc/{command}/{statestore}", grpcHandler).Methods("POST") + router.HandleFunc("/test-etag/http/{statestore}", testFnHandler(etagTestHTTP)).Methods("POST") + router.HandleFunc("/test-etag/grpc/{statestore}", testFnHandler(etagTestGRPC)).Methods("POST") router.Use(mux.CORSMethodMiddleware(router)) return router diff --git a/tests/e2e/stateapp/stateapp_test.go b/tests/e2e/stateapp/stateapp_test.go index 8bcaa123ac2..959c1d2c116 100644 --- a/tests/e2e/stateapp/stateapp_test.go +++ b/tests/e2e/stateapp/stateapp_test.go @@ -19,17 +19,20 @@ package stateapp_e2e import ( "encoding/json" "fmt" + "net/http" "os" "reflect" "strings" "testing" - "github.com/dapr/dapr/tests/e2e/utils" - kube "github.com/dapr/dapr/tests/platforms/kubernetes" - "github.com/dapr/dapr/tests/runner" guuid "github.com/google/uuid" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" apiv1 "k8s.io/api/core/v1" + + "github.com/dapr/dapr/tests/e2e/utils" + kube "github.com/dapr/dapr/tests/platforms/kubernetes" + "github.com/dapr/dapr/tests/runner" ) const ( @@ -153,15 +156,10 @@ func generateTestCases(isHTTP bool) []testCase { if isHTTP { protocol = "http" } - // Just for readability - emptyRequest := requestResponse{ - nil, - } // Just for readability - emptyResponse := requestResponse{ - nil, - } + emptyRequest := requestResponse{} + emptyResponse := requestResponse{} testCase1Key := guuid.New().String() testCase1Value := "The best song ever is 'Highwayman' by 'The Highwaymen'." @@ -307,10 +305,9 @@ func generateStateTransactionCases(protocolType string) testStateTransactionCase testCase1Key, testCase2Key := guuid.New().String()+protocolType, guuid.New().String()+protocolType testCase1Value := "The best song ever is 'Highwayman' by 'The Highwaymen'." testCase2Value := "Hello World" + // Just for readability - emptyResponse := requestResponse{ - nil, - } + emptyResponse := requestResponse{} testStateTransactionCase := testStateTransactionCase{ []stateTransactionTestStep{ @@ -692,3 +689,27 @@ func TestQueryStateStore(t *testing.T) { } } } + +func TestEtags(t *testing.T) { + externalURL := tr.Platform.AcquireAppExternalURL(appName) + require.NotEmpty(t, externalURL, "external URL must not be empty!") + + testCases := []struct { + protocol string + }{ + {protocol: "http"}, + {protocol: "grpc"}, + } + + // Now we are ready to run the actual tests + for _, tt := range testCases { + t.Run(fmt.Sprintf("Test Etags using %s protocol", tt.protocol), func(t *testing.T) { + url := strings.TrimSpace(fmt.Sprintf("%s/test-etag/%s/statestore", externalURL, tt.protocol)) + resp, status, err := utils.HTTPPostWithStatus(url, nil) + require.NoError(t, err) + + // The test passes with 204 if there's no error + assert.Equalf(t, http.StatusNoContent, status, "Test failed. Body is: %q", string(resp)) + }) + } +} diff --git a/tests/e2e/utils/helpers.go b/tests/e2e/utils/helpers.go index 9008bf837cd..7f4d3371fff 100644 --- a/tests/e2e/utils/helpers.go +++ b/tests/e2e/utils/helpers.go @@ -30,8 +30,8 @@ const ( // SimpleKeyValue can be used to simplify code, providing simple key-value pairs. type SimpleKeyValue struct { - Key interface{} - Value interface{} + Key any + Value any } // StateTransactionKeyValue is a key-value pair with an operation type.